o
    i!                     @   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 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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))_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 N/var/www/edux/Edux_v2/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   )r5   r   r   r&   E   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funcr5   r   r   r   5   s    z&infer_anonymous_param.<locals>.wrapperr   rE   r   r   rD   r   infer_anonymous_param   s   rG   c                    r   )Nc                    s4   t | \}}|rt|  | j|d}|r|S  | S Nr6   )r;   r=   r<   r>   )r?   r@   rA   namesrE   r   r   r   O   s   z%goto_anonymous_param.<locals>.wrapperr   rF   r   rJ   r   goto_anonymous_paramN   s   rK   c                    r   )Nc                    sH   |   }t||rg }t|D ]
}|t| 7 }q|r|S  | ||S r8   )r<   _is_pytest_func_iter_pytest_modulesFixtureFiltervalues)context	func_namedecorator_nodesmodule_contextrI   rJ   r   r   r   _   s   
z%complete_param_names.<locals>.wrapperr   rF   r   rJ   r   complete_param_names^   s   	rT   c                 C   s0   t | |dD ]} t| |}|r|  S qd S rH   )rM   rN   get)rS   r!   r7   rI   r   r   r   r=   k   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_decoratorsrL   r!   r   r>   )r?   rV   
decoratorsr   r   r   r;   r   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-   )rQ   rR   r   r   r   rL      s   
rL   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>pytest11)group)pkg_resourcesr`   r_   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 r8   )pathr^   )r$   pfolderr   r   r&      r]   z'_iter_pytest_modules.<locals>.<genexpr>zconftest.py)	get_valuefile_ioget_parent_folderinference_stateget_sys_pathr-   get_file_ior   rj   
py__file__r   r/   FileNotFoundError_PYTEST_FIXTURE_MODULESri   import_module)rS   r7   ro   sys_pathlast_foldermrI   module_valuer   rl   r   rM      s6   


rM   c                       s$   e Zd Z fddZdd Z  ZS )rN   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 r8   )rW   _is_fixturer   )r$   inameselfr   r   r&      s    
z(FixtureFilter._filter.<locals>.<genexpr>)super_filterparenttyper   r   r-   r}   )r   rI   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 )NrV   F	decoratedr   rY      r   	atom_expr)T)cut_own_trailerr   )r   rC   r   )	r   r   childrenr[   get_last_leafr
   
infer_noder!   r"   )r   rP   r!   rV   r   rY   	decoratordotted_namelast_trailer	last_leafrO   r   r   r   r   r}      s<   







zFixtureFilter._is_fixture)__name__
__module____qualname__r   r}   __classcell__r   r   r   r   rN      s    rN   N)F)pathlibr   
parso.treer   jedi.inference.cacher   jedi.inference.importsr   r   jedi.inference.filtersr   jedi.inference.base_valuer   r	   jedi.inference.helpersr
   rv   r   rG   rK   rT   r=   r;   rL   ri   rM   rN   r   r   r   r   <module>   s&    	/ 