B
    /d!                 @   s   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 dd	d
ddgZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Ze d#ddZG d d! d!e
Zd"S )$    )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                s    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 `/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/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   sb   | j jd k	r>|  }tdd |D r:tdd |D S |S |  }| rV| S |	 S d 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)Zpy__getattribute__Zexecute_annotation)r   r   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| \}}|rR|  }t|| j|d}|rRt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   F   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   5   s    

z&infer_anonymous_param.<locals>.wrapperr   )r0   r   r   )r0   r%   r   infer_anonymous_param   s    r1   c                s    fdd}|S )Nc                s4   t | \}}|r,t|  | j|d}|r,|S  | S )N)r&   )r'   r)   r(   r*   )r+   r,   r-   names)r0   r   r   r   O   s    z%goto_anonymous_param.<locals>.wrapperr   )r0   r   r   )r0   r   goto_anonymous_paramN   s    r3   c                s    fdd}|S )Nc                sL   |   }t||r@g }x t|D ]}|t| 7 }q W |r@|S  | ||S )N)r(   _is_pytest_func_iter_pytest_modulesFixtureFiltervalues)context	func_namedecorator_nodesmodule_contextr2   )r0   r   r   r   _   s    
z%complete_param_names.<locals>.wrapperr   )r0   r   r   )r0   r   complete_param_names^   s    	r<   c             C   s0   x*t | |dD ]} t| |}|r|S qW d S )N)r&   )r5   r6   get)r;   r   r&   r2   r   r   r   r)   k   s    r)   c             C   s<   t | jd}|dk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_decoratorsr4   r   r   r*   )r+   r>   
decoratorsr   r   r   r'   r   s    r'   c             C   s   |  dptdd |D S )Ntestc             s   s   | ]}d |  kV  qdS )r   N)get_code)r   nr   r   r   r      s    z"_is_pytest_func.<locals>.<genexpr>)
startswithr!   )r9   r:   r   r   r   r4      s    
r4   c              C   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   )iter_entry_pointsc             S   s   g | ]}|j d qS ).)module_namesplit)r   epr   r   r   
<listcomp>   s    z/_find_pytest_plugin_modules.<locals>.<listcomp>Zpytest11)group)pkg_resourcesrE   )rE   r   r   r   _find_pytest_plugin_modules   s    rM   Fc             #   s   |s
| V  |   j}|d k	r|  | j }d }xt fdd|D r d}t|j| 	 kryt
| j|}| V  W n tk
r   Y nX    |d k	r j|jkrP  }q4W x2tt  D ]$}x| j|D ]}| V  qW qW d S )Nc             3   s   | ]} j |V  qd S )N)pathrD   )r   p)folderr   r   r      s    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   rN   Z
py__file__r   r#   FileNotFoundError_PYTEST_FIXTURE_MODULESrM   import_module)r;   r&   rR   sys_pathZlast_foldermr2   Zmodule_valuer   )rP   r   r5      s,    


r5   c                   s$   e Zd Z fddZdd Z  ZS )r6   c             #   sd   x^t  |D ]N}|jjdkrHt j|}t fdd|D r\|V  q  j|r|V  qW d S )NZimport_fromc             3   s$   | ]}|j r |j|j V  qd S )N)r?   _is_fixturer   )r   Ziname)selfr   r   r      s   z(FixtureFilter._filter.<locals>.<genexpr>)super_filterparenttyper   r   r!   rX   )rY   r2   r   Zimported_names)	__class__)rY   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rD|j}n|g}x|D ]}|jd }d| krP|jdkr|jd	 }| }	|	d
krt||	dd}
q||}
n
||}
x"|
D ]}|jjdddkrdS qW qPW dS )Nr>   F	decoratedr   r@      r   Z	atom_expr)T)Zcut_own_trailer)r   )r   r/   r   )	r\   r]   childrenrB   Zget_last_leafr
   Z
infer_noder   r   )rY   r8   r   r>   r_   r@   	decoratorZdotted_nameZlast_trailerZ	last_leafr7   r   r   r   r   rX      s4    









zFixtureFilter._is_fixture)__name__
__module____qualname__r[   rX   __classcell__r   r   )r^   r   r6      s   r6   N)F)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
   rT   r   r1   r3   r<   r)   r'   r4   rM   r5   r6   r   r   r   r   <module>   s,   / 