o
    ~Zh$                     @  s  U d dl mZ d dlZd dlZd dlmZ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 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 rfd dl m!Z! da"de#d< da$de#d< d a%dLddZ&e
dMddZ'dNd#d$Z(ej)d%d&dOd*d+Z*ej)d%d,dPd0d1Z+ej)d%d,dQd4d5Z,ej-d6e d7dRd8d9Z.ej-dSd:d;Z/ej-dTd<d=Z0G d>d? d?Z1ej-d@dAdUdBdCZ2ej-d@dAdUdDdEZ3ej-dVdHdIZ4ej-dWdJdKZ5dS )X    )annotationsN)Callable	GeneratorIterator)	ExitStackcontextmanager)isasyncgenfunctioniscoroutinefunctionismethod)Anycast)
SubRequest)Exit   )get_all_backendsget_async_backend)iterate_exceptions)
TestRunner)      )ExceptionGroupzTestRunner | None_current_runnerzExitStack | None_runner_stackbackendobjectreturntuple[str, dict[str, Any]]c                 C  sf   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)N   r   r   z@anyio_backend must be either a string or tuple of (string, dict))
isinstancestrtuplelendictr   r   	TypeError)r    r$   J/var/www/html/lang_env/lib/python3.10/site-packages/anyio/pytest_plugin.pyextract_backend_and_options   s   
r&   backend_namer   backend_optionsdict[str, Any]Iterator[TestRunner]c                 c  s    t d u r.t| }t atjd d u r"tj| }ttjj	| |p%i }t
||a td7 azt V  W td8 atsMtd usCJ t  d  aa d S d S td8 atsctd us[J t  d  aa w Nr   )r   r   r   r   sniffioZcurrent_async_library_cvargetsetcallbackresetenter_contextZcreate_test_runner_runner_leasesclose)r'   r(   Zasynclibtokenr$   r$   r%   
get_runner%   s2   
r5   configr   Nonec                 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_configureC   s   r9   T)Zhookwrapper
fixturedefrequestGenerator[Any]c                 #  s    d fdd	}| j  t st rNd|jv rN|| _ | j}d| jv  s.|  jd
7  _d| jv  s<|  jd7  _z
d V W  | _ || _S  | _ || _w d V S )Nargsr   anyio_backendr;   r   kwargsr   c                 ?  s    |j rt rt jt|j u r j|j }n }t| \}}r(| |d< r.||d< t||&}t|rB|	||E d H  n|
||V  W d    d S W d    d S 1 s\w   Y  d S )Nr>   r;   )instancer
   type__self____func____get__r&   r5   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>.wrapperr>   r;   )
r=   r   r>   r   r;   r   r?   r   r   r   )rG   r   r	   Zfixturenamesargnames)r:   r;   rH   Zoriginal_argnamer$   rF   r%   pytest_fixture_setupJ   s$   
rL   )Ztryfirst	collectornameobjc                 C  sv   |  ||r5t|dr|jjn|}t|r7| d}t|dd}|s+tdd |D r9tj	
d| d S d S d S d S )N
hypothesisanyioZ
pytestmarkr$   c                 s  s    | ]}|j d kV  qdS )rQ   N)rN   ).0markerr$   r$   r%   	<genexpr>   s    z,pytest_pycollect_makeitem.<locals>.<genexpr>r>   )ZistestfunctionhasattrrP   
inner_testr	   Zget_closest_markergetattranypytestmarkZusefixtures)rM   rN   rO   Z
inner_funcrS   Zown_markersr$   r$   r%   pytest_pycollect_makeitem}   s   
r[   
pyfuncitembool | Nonec                   s  d fdd}| j d}|rt|\ t| jdr3| jjjj|jkr1tr1|| jj_d S t| jr| j fd	d
| j	j
D }t 2}z	|| j| W n tyt } zt|D ]}t|tttfrn||qa d }~ww W d    dS 1 sw   Y  dS d S )Nr?   r   r   r7   c                    s<   t  }||  W d    d S 1 sw   Y  d S N)r5   run_test)r?   rE   )r'   r(   original_funcr$   r%   run_with_hypothesis   s   "z/pytest_pyfunc_call.<locals>.run_with_hypothesisr>   rP   c                   s   i | ]}| | qS r$   r$   )rR   arg)funcargsr$   r%   
<dictcomp>   s    z&pytest_pyfunc_call.<locals>.<dictcomp>T)r?   r   r   r7   )rc   r-   r&   rU   rO   rP   rV   __qualname__r	   Z_fixtureinforK   r5   r_   r   r   r   r   KeyboardInterrupt
SystemExit)r\   ra   r   ZtestargsrE   Zexcgrpexcr$   )r'   r(   rc   r`   r%   pytest_pyfunc_call   s<   





ri   module)scopeparamsc                 C     | j S r^   )paramrJ   r$   r$   r%   r>         r>   c                 C  s   t | tr| S | d S )Nr   r   r   rI   r$   r$   r%   anyio_backend_name      
rq   c                 C  s   t | tri S | d S r+   rp   rI   r$   r$   r%   anyio_backend_options   rr   rs   c                   @  s4   e Zd ZdZdddZeddd	ZddddZd
S )FreePortFactoryaO  
    Manages port generation based on specified socket kind, ensuring no duplicate
    ports are generated.

    This class provides functionality for generating available free ports on the
    system. It is initialized with a specific socket kind and can generate ports
    for given address families while avoiding reuse of previously generated ports.

    Users should not instantiate this class directly, but use the
    ``free_tcp_port_factory`` and ``free_udp_port_factory`` fixtures instead. For simple
    uses cases, ``free_tcp_port`` and ``free_udp_port`` can be used instead.
    kindsocket.SocketKindr   r7   c                 C  s   || _ tt  | _d S r^   )_kindr.   int
_generated)selfru   r$   r$   r%   __init__   s   zFreePortFactory.__init__c                 C  rm   )z
        The type of socket connection (e.g., :data:`~socket.SOCK_STREAM` or
        :data:`~socket.SOCK_DGRAM`) used to bind for checking port availability

        )rw   )rz   r$   r$   r%   ru      s   zFreePortFactory.kindNfamilysocket.AddressFamily | Nonerx   c              
   C  s   |dur|g}nt jg}t jr|t j 	 d}t P}|D ]1}|t  || j}|t jkr1dnd}z	|||f W n
 t	yF   Y  nw |sO|
 d }q|| jvrd| j| |W  d   S W d   n1 snw   Y  q)z
        Return an unbound port for the given address family.

        :param family: if omitted, both IPv4 and IPv6 addresses will be tried
        :return: a port number

        NTr   z::1z	127.0.0.1r   )socketAF_INEThas_ipv6appendAF_INET6r   r1   rw   bindOSErrorgetsocknamery   add)rz   r|   Zfamiliesportstacksockaddrr$   r$   r%   __call__   s4   
 zFreePortFactory.__call__)ru   rv   r   r7   )r   rv   r^   )r|   r}   r   rx   )__name__
__module__re   __doc__r{   propertyru   r   r$   r$   r$   r%   rt      s    
rt   session)rk   c                   C  
   t tjS r^   )rt   r~   SOCK_STREAMr$   r$   r$   r%   free_tcp_port_factory      
r   c                   C  r   r^   )rt   r~   
SOCK_DGRAMr$   r$   r$   r%   free_udp_port_factory  r   r   Callable[[], int]rx   c                 C     |  S r^   r$   )r   r$   r$   r%   free_tcp_port	  ro   r   c                 C  r   r^   r$   )r   r$   r$   r%   free_udp_port  ro   r   )r   r   r   r   )r'   r   r(   r)   r   r*   )r6   r   r   r7   )r:   r   r;   r   r   r<   )rM   r   rN   r   rO   r   r   r7   )r\   r   r   r]   )r;   r   r   r   )r>   r   r   r   )r>   r   r   r)   )r   rt   )r   r   r   rx   )r   r   r   rx   )6
__future__r   r~   syscollections.abcr   r   r   
contextlibr   r   inspectr   r	   r
   typingr   r   rY   r,   Z_pytest.fixturesr   Z_pytest.outcomesr   Z_core._eventloopr   r   Z_core._exceptionsr   abcr   version_infoZexceptiongroupr   r   __annotations__r   r2   r&   r5   r9   ZhookimplrL   r[   ri   Zfixturer>   rq   rs   rt   r   r   r   r   r$   r$   r$   r%   <module>   sX    





2

$
=
