o
    MThc(                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZ d d	lmZ g d
Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdeee  fddZe d#ddZdd  ZG d!d" d"eZdS )$    N)List)Path)search_ancestor)inference_state_method_cache)goto_importload_module_from_path)ParserTreeFilter)	NO_VALUESValueSet)infer_call_of_leaf))_pytestmonkeypatch)r   capture)r   logging)r   tmpdir)r   pytesterc                        fdd}|S )Nc                    s(   |   dkr| j  dkrtS  | |S )Nfixturez_pytest.fixtures)
py__name__parent_contextr	   )value	argumentscallback V/home/air/segue/gemini/backup/venv/lib/python3.10/site-packages/jedi/plugins/pytest.pywrapper   s   
zexecute.<locals>.wrapperr   )r   r   r   r   r   execute   s   r   c                    s   dd  fdd}|S )Nc                 S   s^   | j jd ur|  }tdd |D rtdd |D S |S |  }| r+| S |	 S )Nc                 s   s"    | ]}|j jd ddkV  qdS )Tinclude_module_names)typing	GeneratorN)nameget_qualified_names.0vr   r   r   	<genexpr>%   s    z=infer_anonymous_param.<locals>.get_returns.<locals>.<genexpr>c                 s   s    | ]
}| d  V  qdS )__next__N)py__getattribute__execute_annotationr$   r   r   r   r'   (   s
    
)
	tree_node
annotationexecute_with_valuesanyr
   	from_sets
as_contextis_generatormerge_yield_valuesget_return_values)r   resultfunction_contextr   r   r   get_returns"   s   
z*infer_anonymous_param.<locals>.get_returnsc                    sZ   | j r | S t| \}}|r)|  }t|| j|d}|r)tfdd|D S  | S )Nskip_own_modulec                 3   s&    | ]}|  D ]} |V  qqd S N)infer)r%   r   r   )r6   r   r   r'   G   s    z9infer_anonymous_param.<locals>.wrapper.<locals>.<genexpr>)annotation_node _is_a_pytest_param_and_inheritedget_root_context_goto_pytest_fixturestring_namer
   r/   )
param_nameis_pytest_paramparam_name_is_function_namemodulefixturesfuncr6   r   r   r   7   s    z&infer_anonymous_param.<locals>.wrapperr   rF   r   r   rE   r   infer_anonymous_param!   s   rH   c                    r   )Nc                    s4   t | \}}|rt|  | j|d}|r|S  | S Nr7   )r<   r>   r=   r?   )r@   rA   rB   namesrF   r   r   r   Q   s   z%goto_anonymous_param.<locals>.wrapperr   rG   r   rK   r   goto_anonymous_paramP   s   rL   c                    r   )Nc                    sH   |   }t||rg }t|D ]
}|t| 7 }q|r|S  | ||S r9   )r=   _is_pytest_func_iter_pytest_modulesFixtureFiltervalues)context	func_namedecorator_nodesmodule_contextrJ   rK   r   r   r   a   s   
z%complete_param_names.<locals>.wrapperr   rG   r   rK   r   complete_param_names`   s   	rU   c                 C   s0   t | |dD ]} t| |}|r|  S qd S rI   )rN   rO   get)rT   r"   r8   rJ   r   r   r   r>   m   s   r>   c                 C   s<   t | jd}|du rdS | }t|jj||jj| jkfS )z
    Pytest params are either in a `test_*` function or have a pytest fixture
    with the decorator @pytest.fixture.

    This is a heuristic and will work in most cases.
    funcdefN)FF)r   	tree_nameget_decoratorsrM   r"   r   r?   )r@   rW   
decoratorsr   r   r   r<   t   s   r<   c                 C   s   |  dptdd |D S )Ntestc                 s   s    | ]	}d |  v V  qdS )r   N)get_code)r%   nr   r   r   r'          z"_is_pytest_func.<locals>.<genexpr>)
startswithr.   )rR   rS   r   r   r   rM      s   
rM   returnc                  C   s   t jdkr7ddlm}  t jdkr| dd}n|  dd}t jdkr)d	d
 |D S dd
 |D }dd
 |D S ddlm} dd
 |ddD S )z
    Finds pytest plugin modules hooked by setuptools entry points

    See https://docs.pytest.org/en/stable/how-to/writing_plugins.html#setuptools-entry-points
    )      r   )entry_points)ra   
   pytest11)groupr   )ra   	   c                 S      g | ]}|j d qS .)rC   splitr%   epr   r   r   
<listcomp>       z/_find_pytest_plugin_modules.<locals>.<listcomp>c                 S   s   g | ]	}|j |jqS r   )patternmatchr   rl   r   r   r   rn      s    c                 S   s    g | ]}|r| d dqS )rC   rj   )rf   rk   )r%   xr   r   r   rn      s     )iter_entry_pointsc                 S   rh   ri   )module_namerk   rl   r   r   r   rn      ro   )sysversion_infoimportlib.metadatarc   rV   pkg_resourcesrs   )rc   pytest_entry_pointsmatchesrs   r   r   r   _find_pytest_plugin_modules   s   


r{   Fc                 #   s2   |s| V  |   j}|d ur|  | j }d }t fdd|D r d}t|j| 	 krez(t
| j|}| }|V  |j d}|rZ||d }t| |E d H  W n	 tyd   Y nw    |d urt j|jkrtn }t fdd|D s%tt  D ]}	| j|	D ]}
|
 V  qqd S )Nc                 3   s    | ]	} j |V  qd S r9   )pathr_   )r%   pfolderr   r   r'      r^   z'_iter_pytest_modules.<locals>.<genexpr>zconftest.pypytest_pluginsr   )	get_valuefile_ioget_parent_folderinference_stateget_sys_pathr.   get_file_ior   r|   
py__file__r   r0   r+   get_used_namesrV   create_name_load_pytest_pluginsFileNotFoundError_PYTEST_FIXTURE_MODULESr{   import_module)rT   r8   r   sys_pathlast_foldermconftest_moduleplugins_listr"   rJ   module_valuer   r~   r   rN      sB   


rN   c           	      c   sn    ddl m} | D ])}| D ]"}| D ]}||}|r2|d}| j|D ]}| V  q*qqqd S )Nr   )get_str_or_nonerj   )jedi.inference.helpersr   r:   
py__iter__rk   r   r   r0   )	rT   r"   r   inferred	seq_valuer   fq_namerJ   r   r   r   r   r      s   
r   c                       s$   e Zd Z fddZdd Z  ZS )rO   c                 #   sb    t  |D ]'}|jjdkr$t j|}t fdd|D r#|V  q  j|r.|V  qd S )Nimport_fromc                 3   s&    | ]}|j r |j|j V  qd S r9   )rX   _is_fixturer   )r%   inameselfr   r   r'      s    
z(FixtureFilter._filter.<locals>.<genexpr>)super_filterparenttyper   r   r.   r   )r   rJ   r"   imported_names	__class__r   r   r      s   zFixtureFilter._filterc                 C   s   |j }|jdkr
dS |j }|jdkrdS |jd }|jdkr"|j}n|g}|D ]D}|jd }d| v rk|jdkrT|jd	 }| }	|	d
krNt||	dd}
n||}
n||}
|
D ]}|jjdddkrj  dS q[q'dS )NrW   F	decoratedr   rZ      r   	atom_expr)T)cut_own_trailerr   )r   rD   r   )	r   r   childrenr\   get_last_leafr   
infer_noder"   r#   )r   rQ   r"   rW   r   rZ   	decoratordotted_namelast_trailer	last_leafrP   r   r   r   r   r      s<   







zFixtureFilter._is_fixture)__name__
__module____qualname__r   r   __classcell__r   r   r   r   rO      s    rO   )F) ru   r    r   pathlibr   
parso.treer   jedi.inference.cacher   jedi.inference.importsr   r   jedi.inference.filtersr   jedi.inference.base_valuer	   r
   r   r   r   r   rH   rL   rU   r>   r<   rM   strr{   rN   r   rO   r   r   r   r   <module>   s,    	/&