o
    ii1                     @  s(  U d dl mZ d dl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mZ d dlm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 r~d dl)m*Z* da+de,d< da-de,d< d a.dXddZ/edYd!d"Z0dZd&d'Z1d[d*d+Z2ej3d,d-d\d2d3Z4ej3d,d4d]d9d:Z5d^d=d>Z6ej3d,d4d_dAdBZ7ej8dCe dDd`dEdFZ9ej8dadGdHZ:ej8dbdIdJZ;G dKdL dLZ<ej8d;dMdcdNdOZ=ej8d;dMdcdPdQZ>ej8dddTdUZ?ej8dedVdWZ@dS )f    )annotationsN)Callable	GeneratorIterator)	ExitStackcontextmanager)isasyncgenfunctioniscoroutinefunctionismethod)Anycast)FuncFixtureInfo
SubRequest)Exit)	CallSpec2)Scope   )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*   [/var/www/scraper.webshop2u.hu/html/venv/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_contextcreate_test_runner_runner_leasesclose)r-   r.   asynclibtokenr*   r*   r+   
get_runner-   s2   

r9   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)addini)r:   r*   r*   r+   pytest_addoptionK   s
   
rB   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.r=   autoasyncioasyncio_modezlAnyIO auto mode has been enabled together with pytest-asyncio auto mode. This may cause unexpected behavior.r   )addinivalue_linegetinipluginmanager
has_pluginissue_config_time_warningpytestPytestConfigWarning)rC   r*   r*   r+   pytest_configureS   s    
rP   T)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   rS   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 )NrU   rS   )instancer
   type__self____func____get__r,   r9   r   run_asyncgen_fixturerun_fixture)rU   rS   rV   
local_funcr-   r.   runnerfunchas_backend_arghas_request_argr*   r+   wrapperh   s(   "z%pytest_fixture_setup.<locals>.wrapperrU   rS   )rU   r   rS   r   rV   r   r!   r   )ra   r   r	   fixturenamesargnames)rR   rS   rd   original_argnamer*   r`   r+   pytest_fixture_setupf   s$   
rj   )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
hypothesisr=   rF   anyio
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>rU   )istestfunctionhasattrrp   
inner_testr	   rC   rJ   get_closest_markergetattranyrN   markusefixtures)rl   rn   ro   
inner_funcanyio_auto_moderu   own_markersr*   r*   r+   pytest_pycollect_makeitem   s    
r   sessionpytest.Sessionc                 C  sl  t tt| jD ]\}}t|tjrt|jr|	dd urd|j
vrg }zdd ttD }W n ty>   t }Y nw tt D ]e\}}d|v r^td|id|idtji|gg d}nti d|id|idtji|gg d}|j}t|j}	d|	vr|	d t|j|j|	|jd}
tjj|j|j d	| d
||j|
|j|jd}|| qD|| j||d < q	d S )Nrq   rU   c                 S  s   h | ]}|j qS r*   rs   )rt   fr*   r*   r+   	<setcomp>   s    z+pytest_collection_finish.<locals>.<setcomp>
_arg2scope)paramsindicesr   _idlistmarks)funcargsr   r   	arg2scopeidlistr   )rh   initialnamesnames_closurename2fixturedefs[])rn   callspeccallobjfixtureinfokeywordsoriginalnamer   )reversedlist	enumerateitemsr$   rN   Functionr	   functionrz   rg   dataclassesfieldsr   r)   setr   r   Module_fixtureinfor   appendr   rh   r   r   from_parentparentr   ro   r   )r   iitem	new_items	cs_fieldsparam_indexr   r   finew_names_closurenew_fixtureinfonew_itemr*   r*   r+   pytest_collection_finish   sj   


	

	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 )NrV   r   r!   r<   c                    s<   t  }||  W d    d S 1 sw   Y  d S N)r9   run_test)rV   r_   )r-   r.   original_funcr*   r+   run_with_hypothesis   s   "z/pytest_pyfunc_call.<locals>.run_with_hypothesisrU   rp   c                   s   i | ]}| | qS r*   r*   )rt   arg)r   r*   r+   
<dictcomp>   s    z&pytest_pyfunc_call.<locals>.<dictcomp>T)rV   r   r!   r<   )r   getr,   rx   ro   rp   ry   __qualname__r	   r   rh   r9   r   r   r   r$   r   KeyboardInterrupt
SystemExit)r   r   r   testargsr_   excgrpexcr*   )r-   r.   r   r   r+   pytest_pyfunc_call   s<   





r   module)scoper   c                 C     | j S r   )paramrf   r*   r*   r+   rU        rU   c                 C  s   t | tr| S | d S )Nr   r$   r%   re   r*   r*   r+   anyio_backend_name     
r   c                 C  s   t | tri S | d S r1   r   re   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!   r<   c                 C  s   || _ tt  | _d S r   )_kindr   int
_generated)selfr   r*   r*   r+   __init__+  s   zFreePortFactory.__init__c                 C  r   )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_ipv6r   AF_INET6r   r3   r   bindOSErrorgetsocknamer   add)r   r   familiesportstacksockaddrr*   r*   r+   __call__8  s4   
 zFreePortFactory.__call__)r   r   r!   r<   )r!   r   r   )r   r   r!   r   )__name__
__module__r   __doc__r   propertyr   r   r*   r*   r*   r+   r     s    
r   )r   c                   C  
   t tjS r   )r   r   SOCK_STREAMr*   r*   r*   r+   free_tcp_port_factoryZ     
r   c                   C  r   r   )r   r   
SOCK_DGRAMr*   r*   r*   r+   free_udp_port_factory_  r   r   Callable[[], int]r   c                 C     |  S r   r*   )r   r*   r*   r+   free_tcp_portd  r   r   c                 C  r   r   r*   )r   r*   r*   r+   free_udp_porti  r   r   )r   r    r!   r"   )r-   r%   r.   r/   r!   r0   )r:   r;   r!   r<   )rC   rD   r!   r<   )rR   r   rS   r   r!   rT   )rl   rm   rn   r%   ro   r    r!   r<   )r   r   r!   r<   )r   r   r!   r   )rS   r   r!   r   )rU   r   r!   r%   )rU   r   r!   r/   )r!   r   )r   r   r!   r   )r   r   r!   r   )A
__future__r   r   r   syscollections.abcr   r   r   
contextlibr   r   inspectr   r	   r
   typingr   r   rN   _pytest.fixturesr   r   _pytest.outcomesr   _pytest.pythonr   _pytest.scoper    r   _core._eventloopr   r   r   r   _core._exceptionsr   abcr   version_infoexceptiongroupr   r   __annotations__r   r5   r,   r9   rB   rP   hookimplrj   r   r   r   fixturerU   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sb    






0

:$
=
