o
    tdf%                     @   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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))_pytestZmonkeypatch)r   capture)r   logging)r   Ztmpdir)r   Zpytesterc                        fdd}|S )Nc                    s(   |   dkr| j  dkrtS  | |S )Nfixturez_pytest.fixtures)Z
py__name__parent_contextr	   )value	argumentscallback \/var/www/html/software/conda/envs/catlas/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Z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)Zpy__getattribute__Zexecute_annotationr   r   r   r   r"   (   s
    
)
Z	tree_node
annotationZexecute_with_valuesanyr
   	from_sets
as_contextZis_generatorZmerge_yield_valuesZget_return_values)r   resultZ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)Zinfer)r    r   r   )r)   r   r   r"   G   s    z9infer_anonymous_param.<locals>.wrapper.<locals>.<genexpr>)Z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funcr)   r   r   r   7   s    z&infer_anonymous_param.<locals>.wrapperr   r7   r   r   r6   r   infer_anonymous_param!   s   r9   c                    r   )Nc                    s4   t | \}}|rt|  | j|d}|r|S  | S Nr*   )r-   r/   r.   r0   )r1   r2   r3   namesr7   r   r   r   Q   s   z%goto_anonymous_param.<locals>.wrapperr   r8   r   r<   r   goto_anonymous_paramP   s   r=   c                    r   )Nc                    sH   |   }t||rg }t|D ]
}|t| 7 }q|r|S  | ||S r,   )r.   _is_pytest_func_iter_pytest_modulesFixtureFiltervalues)context	func_namedecorator_nodesmodule_contextr;   r<   r   r   r   a   s   
z%complete_param_names.<locals>.wrapperr   r8   r   r<   r   complete_param_names`   s   	rF   c                 C   s0   t | |dD ]} t| |}|r|  S qd S r:   )r?   r@   get)rE   r   r+   r;   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_nameZget_decoratorsr>   r   r   r0   )r1   rH   
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%   )rC   rD   r   r   r   r>      s   
r>   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)rQ   
   Zpytest11)groupr   )rQ   	   c                 S      g | ]}|j d qS .)r4   splitr    epr   r   r   
<listcomp>       z/_find_pytest_plugin_modules.<locals>.<listcomp>c                 S   s   g | ]	}|j |jqS r   )patternmatchr   r[   r   r   r   r]      s    c                 S   s    g | ]}|r| d dqS )r4   rY   )rU   rZ   )r    xr   r   r   r]      s     )iter_entry_pointsc                 S   rW   rX   )module_namerZ   r[   r   r   r   r]      r^   )sysversion_infoimportlib.metadatarS   rG   pkg_resourcesrb   )rS   Zpytest_entry_pointsmatchesrb   r   r   r   _find_pytest_plugin_modules   s   


ri   Fc                 #   s    |s| V  |   j}|d urf|  | j }d }t fdd|D rf d}t|j| 	 krJzt
| j|}| V  W n	 tyI   Y nw    |d urY j|jkrYn }t fdd|D s%tt  D ]}| j|D ]}| V  qsqkd S )Nc                 3   s    | ]	} j |V  qd S r,   )pathrO   )r    pfolderr   r   r"      rN   z'_iter_pytest_modules.<locals>.<genexpr>zconftest.py)	get_valuefile_ioZget_parent_folderZinference_stateZget_sys_pathr%   Zget_file_ior   rj   Z
py__file__r   r'   FileNotFoundError_PYTEST_FIXTURE_MODULESri   import_module)rE   r+   ro   sys_pathZlast_foldermr;   Zmodule_valuer   rl   r   r?      s6   


r?   c                       s$   e Zd Z fddZdd Z  ZS )r@   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 )NZimport_fromc                 3   s&    | ]}|j r |j|j V  qd S r,   )rI   _is_fixturer   )r    Zinameselfr   r   r"      s    
z(FixtureFilter._filter.<locals>.<genexpr>)super_filterparenttyper   r   r%   ru   )rw   r;   r   Zimported_names	__class__rv   r   ry      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 )NrH   F	decoratedr   rJ      r   Z	atom_expr)T)Zcut_own_trailerr   )r   r5   r   )	rz   r{   childrenrL   Zget_last_leafr   Z
infer_noder   r   )rw   rB   r   rH   r~   rJ   	decoratorZdotted_nameZlast_trailerZ	last_leafrA   r   r   r   r   ru      s<   







zFixtureFilter._is_fixture)__name__
__module____qualname__ry   ru   __classcell__r   r   r|   r   r@      s    r@   )F)rd   r   r   pathlibr   Z
parso.treer   Zjedi.inference.cacher   Zjedi.inference.importsr   r   Zjedi.inference.filtersr   Zjedi.inference.base_valuer	   r
   Zjedi.inference.helpersr   rq   r   r9   r=   rF   r/   r-   r>   strri   r?   r@   r   r   r   r   <module>   s*    	/ 