U
    nËjE  ã                   @  sÄ  U d dl mZ d dlZd dlmZmZ d dlmZmZ d dl	m
Z
mZmZ d dlmZmZmZmZ d dlZd dl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 ejdk rÈd dl m!Z! da"de#d< da$de#d< d a%dddœdd„Z&eddddœdd„ƒZ'ddd œd!d"„Z(ej)d#d$�ddd%d&œd'd(„ƒZ*ej)d#d)�ddddd*œd+d,„ƒZ+ej)d#d)�dd-d.œd/d0„ƒZ,ej-d1eƒ d2�ddd3œd4d5„ƒZ.ej-ddd6œd7d8„ƒZ/ej-ddd6œd9d:„ƒZ0dS );é    )ÚannotationsN)Ú	GeneratorÚIterator)Ú	ExitStackÚcontextmanager)ÚisasyncgenfunctionÚiscoroutinefunctionÚismethod)ÚAnyÚDictÚTupleÚcast)Ú
SubRequest)ÚExité   )Úget_all_backendsÚget_async_backend)Úiterate_exceptions)Ú
TestRunner)é   é   )ÚExceptionGroupzTestRunner | NoneÚ_current_runnerzExitStack | NoneÚ_runner_stackÚobjectztuple[str, dict[str, Any]])ÚbackendÚreturnc                 C  sj   t | tƒr| i fS t | tƒr^t| ƒdkr^t | d tƒr^t | d tƒr^ttttttf f | ƒS t	dƒ‚d S )Né   r   r   z@anyio_backend must be either a string or tuple of (string, dict))
Ú
isinstanceÚstrÚtupleÚlenÚdictr   r   r   r
   Ú	TypeError)r   © r$   ú7/tmp/pip-unpacked-wheel-k8mofgf9/anyio/pytest_plugin.pyÚextract_backend_and_options   s    
r&   r   zdict[str, Any]zIterator[TestRunner])Úbackend_nameÚbackend_optionsr   c                 c  sœ   t d krZt| ƒ}tƒ atj d ¡d krBtj | ¡}t tjj	|¡ |pHi }t 
| |¡¡a td7 az
t V  W 5 td8 ats–td k	s†t‚t ¡  d  aa X d S ©Nr   )r   r   r   r   ÚsniffioZcurrent_async_library_cvarÚgetÚsetÚcallbackÚresetÚenter_contextZcreate_test_runnerÚ_runner_leasesÚAssertionErrorÚclose)r'   r(   ZasynclibÚtokenr$   r$   r%   Ú
get_runner$   s$    ÿ
r4   r
   ÚNone)Úconfigr   c                 C  s   |   dd¡ d S )NÚmarkerszManyio: mark the (coroutine function) test to be run asynchronously via anyio.)Zaddinivalue_line)r6   r$   r$   r%   Úpytest_configureB   s    þr8   T)ZhookwrapperzGenerator[Any])Ú
fixturedefÚrequestr   c                 #  s¢   ddddddœ‡ ‡‡fdd„}| j ‰ tˆ ƒs4tˆ ƒrœd|jkrœ|| _ | j}d| jk ‰sf|  jd7  _d| jk ‰s‚|  jd	7  _z
d V W ¢S ˆ | _ || _X d V S )
Nr
   r   )ÚargsÚanyio_backendr:   Úkwargsr   c              	   ?  sž   |j r2tˆ ƒr2tˆ jƒt|j ƒkr2ˆ j |j ¡}nˆ }t| ƒ\}}ˆrN| |d< ˆrZ||d< t||ƒ�0}t|ƒr‚| 	||¡E d H  n| 
||¡V  W 5 Q R X d S )Nr<   r:   )Úinstancer	   ÚtypeÚ__self__Ú__func__Ú__get__r&   r4   r   Zrun_asyncgen_fixtureZrun_fixture)r<   r:   r;   r=   Z
local_funcr'   r(   Úrunner©ÚfuncZhas_backend_argZhas_request_argr$   r%   ÚwrapperL   s"    ÿþýz%pytest_fixture_setup.<locals>.wrapperr<   ©r<   r:   ©r:   )rE   r   r   ZfixturenamesÚargnames)r9   r:   rF   Zoriginal_argnamer$   rD   r%   Úpytest_fixture_setupJ   s    

rJ   )Ztryfirst)Ú	collectorÚnameÚobjr   c                 C  sj   |   ||¡rft|dƒr|jjn|}t|ƒrf|  d¡}t|ddƒ}|sVtdd„ |D ƒƒrftj	 
d¡|ƒ d S )NÚ
hypothesisÚanyioZ
pytestmarkr$   c                 s  s   | ]}|j d kV  qdS )rO   N)rL   )Ú.0Úmarkerr$   r$   r%   Ú	<genexpr>„   s     z,pytest_pycollect_makeitem.<locals>.<genexpr>r<   )ZistestfunctionÚhasattrrN   Ú
inner_testr   Zget_closest_markerÚgetattrÚanyÚpytestÚmarkZusefixtures)rK   rL   rM   Z
inner_funcrQ   Zown_markersr$   r$   r%   Úpytest_pycollect_makeitem}   s    
rY   zbool | None)Ú
pyfuncitemr   c                   s  dddœ‡ ‡‡fdd„}| j  d¡}|�rt|ƒ\‰ ‰t| jdƒrn| jjj‰ˆj|jkrjtˆƒrj|| jj_d S t| jƒ�r| j ‰‡fdd	„| j	j
D ƒ}tˆ ˆƒ�b}z| | j|¡ W nH tk
rü } z*t|ƒD ]}t|tttfƒrÎ||‚qÎ‚ W 5 d }~X Y nX W 5 Q R X d
S d S )Nr
   r5   )r=   r   c               	     s&   t ˆ ˆƒ�}| ˆ| ¡ W 5 Q R X d S ©N)r4   Úrun_test)r=   rC   )r'   r(   Úoriginal_funcr$   r%   Úrun_with_hypothesisŠ   s    z/pytest_pyfunc_call.<locals>.run_with_hypothesisr<   rN   c                   s   i | ]}|ˆ | “qS r$   r$   )rP   Úarg)Úfuncargsr$   r%   Ú
<dictcomp>�   s      z&pytest_pyfunc_call.<locals>.<dictcomp>T)r`   r+   r&   rS   rM   rN   rT   Ú__qualname__r   Z_fixtureinforI   r4   r\   r   r   r   r   ÚKeyboardInterruptÚ
SystemExit)rZ   r^   r   ZtestargsrC   ZexcgrpÚexcr$   )r'   r(   r`   r]   r%   Úpytest_pyfunc_callˆ   s.    

rf   Úmodule)ZscopeÚparams)r:   r   c                 C  s   | j S r[   )ÚparamrH   r$   r$   r%   r<   ­   s    r<   )r<   r   c                 C  s   t | tƒr| S | d S d S )Nr   ©r   r   rG   r$   r$   r%   Úanyio_backend_name²   s    
rk   c                 C  s   t | tƒri S | d S d S r)   rj   rG   r$   r$   r%   Úanyio_backend_optionsº   s    
rl   )1Ú
__future__r   ÚsysÚcollections.abcr   r   Ú
contextlibr   r   Úinspectr   r   r	   Útypingr
   r   r   r   rW   r*   Z_pytest.fixturesr   Z_pytest.outcomesr   Z_core._eventloopr   r   Z_core._exceptionsr   Úabcr   Úversion_infoZexceptiongroupr   r   Ú__annotations__r   r0   r&   r4   r8   ZhookimplrJ   rY   rf   Zfixturer<   rk   rl   r$   r$   r$   r%   Ú<module>   sD    


2


$