o
    Xi(                     @  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mZ d dlmZ d	d
lmZ d	dlmZmZmZmZ d	dlmZ d	dl m!Z! ej"dk rld dl#m$Z$ da%de&d< da'de&d< d a(dSddZ)e
dTdd Z*dUd$d%Z+dVd(d)Z,ej-d*d+dWd0d1Z.ej-d*d2dXd7d8Z/ej-d*d2dYd;d<Z0ej1d=e d>dZd?d@Z2ej1d[dAdBZ3ej1d\dCdDZ4G dEdF dFZ5ej1dGdHd]dIdJZ6ej1dGdHd]dKdLZ7ej1d^dOdPZ8ej1d_dQdRZ9dS )`    )annotationsN)Callable	GeneratorIterator)	ExitStackcontextmanager)isasyncgenfunctioniscoroutinefunctionismethod)Anycast)
SubRequest)Exit   )get_available_backends)current_async_libraryget_async_backendreset_current_async_libraryset_current_async_library)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/home/app/Keep/.python/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 d u rt| }tt| |pi }t|	|a t
d7 a
zt V  W t
d8 a
t
sFtd us<J t  d  aa d S d S t
d8 a
t
s\td usTJ t  d  aa w Nr   )r   r   r   r   r   r   callbackr   enter_contextZcreate_test_runner_runner_leasesclose)r*   r+   Zasynclibtokenr'   r'   r(   
get_runner*   s2   

r4   parserpytest.ParserNonec                 C  s   | j dddd d S )N
anyio_modestrictz-AnyIO plugin mode (either "strict" or "auto"))defaulthelp)Zaddini)r5   r'   r'   r(   pytest_addoptionH   s
   
r<   configpytest.Configc                 C  sV   |  dd | ddkr%| jdr'| ddkr)| tdd d S d S d S d S )	NmarkerszManyio: mark the (coroutine function) test to be run asynchronously via anyio.r8   autoasyncioZasyncio_modezlAnyIO auto mode has been enabled together with pytest-asyncio auto mode. This may cause unexpected behavior.r   )Zaddinivalue_linegetiniZpluginmanagerZ
has_pluginZissue_config_time_warningpytestZPytestConfigWarning)r=   r'   r'   r(   pytest_configureP   s    
rD   T)Zhookwrapper
fixturedefr   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anyio_backendr   rF   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 )NrH   rF   )instancer
   type__self____func____get__r)   r4   r   Zrun_asyncgen_fixtureZrun_fixture)rH   rF   rI   Z
local_funcr*   r+   runnerfuncZhas_backend_argZhas_request_argr'   r(   wrappere   s(   "z%pytest_fixture_setup.<locals>.wrapperrH   rF   )rH   r   rF   r   rI   r   r   r   )rQ   r   r	   Zfixturenamesargnames)rE   rF   rR   Zoriginal_argnamer'   rP   r(   pytest_fixture_setupc   s$   
rV   )Ztryfirst	collectorpytest.Module | pytest.Classnameobjc                 C  s   |  ||r?t|dr|jjn|}t|rA| jddk}| d}t|dd}|s5|s5t	dd |D rCt
jd	| d S d S d S d S )
N
hypothesisr8   r@   anyioZ
pytestmarkr'   c                 s  s    | ]}|j d kV  qdS )r\   N)rY   ).0markerr'   r'   r(   	<genexpr>   s    z,pytest_pycollect_makeitem.<locals>.<genexpr>rH   )Zistestfunctionhasattrr[   
inner_testr	   r=   rB   Zget_closest_markergetattranyrC   markZusefixtures)rW   rY   rZ   Z
inner_funcZanyio_auto_moder^   Zown_markersr'   r'   r(   pytest_pycollect_makeitem   s    
re   
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 )NrI   r   r   r7   c                    s<   t  }||  W d    d S 1 sw   Y  d S N)r4   run_test)rI   rO   )r*   r+   original_funcr'   r(   run_with_hypothesis   s   "z/pytest_pyfunc_call.<locals>.run_with_hypothesisrH   r[   c                   s   i | ]}| | qS r'   r'   )r]   arg)funcargsr'   r(   
<dictcomp>   s    z&pytest_pyfunc_call.<locals>.<dictcomp>T)rI   r   r   r7   )rm   getr)   r`   rZ   r[   ra   __qualname__r	   Z_fixtureinforU   r4   ri   r   r   r!   r   KeyboardInterrupt
SystemExit)rf   rk   r   ZtestargsrO   Zexcgrpexcr'   )r*   r+   rm   rj   r(   pytest_pyfunc_call   s<   





rt   module)scopeparamsc                 C     | j S rh   )paramrT   r'   r'   r(   rH         rH   c                 C  s   t | tr| S | d S )Nr   r!   r"   rS   r'   r'   r(   anyio_backend_name      
r|   c                 C  s   t | tri S | d S r.   r{   rS   r'   r'   r(   anyio_backend_options   r}   r~   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 rh   )_kindsetint
_generated)selfr   r'   r'   r(   __init__   s   zFreePortFactory.__init__c                 C  rx   )z
        The type of socket connection (e.g., :data:`~socket.SOCK_STREAM` or
        :data:`~socket.SOCK_DGRAM`) used to bind for checking port availability

        )r   )r   r'   r'   r(   r      s   zFreePortFactory.kindNfamilysocket.AddressFamily | Noner   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   r0   r   bindOSErrorgetsocknamer   add)r   r   Zfamiliesportstacksockaddrr'   r'   r(   __call__   s4   
 zFreePortFactory.__call__)r   r   r   r7   )r   r   rh   )r   r   r   r   )__name__
__module__rp   __doc__r   propertyr   r   r'   r'   r'   r(   r      s    
r   session)rv   c                   C  
   t tjS rh   )r   r   SOCK_STREAMr'   r'   r'   r(   free_tcp_port_factory     
r   c                   C  r   rh   )r   r   
SOCK_DGRAMr'   r'   r'   r(   free_udp_port_factory"  r   r   Callable[[], int]r   c                 C     |  S rh   r'   )r   r'   r'   r(   free_tcp_port'  rz   r   c                 C  r   rh   r'   )r   r'   r'   r(   free_udp_port,  rz   r   )r   r   r   r   )r*   r"   r+   r,   r   r-   )r5   r6   r   r7   )r=   r>   r   r7   )rE   r   rF   r   r   rG   )rW   rX   rY   r"   rZ   r   r   r7   )rf   r   r   rg   )rF   r   r   r   )rH   r   r   r"   )rH   r   r   r,   )r   r   )r   r   r   r   )r   r   r   r   ):
__future__r   r   syscollections.abcr   r   r   
contextlibr   r   inspectr   r	   r
   typingr   r   rC   Z_pytest.fixturesr   Z_pytest.outcomesr    r   Z_core._eventloopr   r   r   r   Z_core._exceptionsr   abcr   version_infoZexceptiongroupr   r   __annotations__r   r1   r)   r4   r<   rD   ZhookimplrV   re   rt   ZfixturerH   r|   r~   r   r   r   r   r   r'   r'   r'   r(   <module>   sZ    






0
$
=
