U
    gE                     @  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 rd 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-3u0cc9gf/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std k	st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 rd|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


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