o
    hH                  
   @   s  d Z ddlZddlZddl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	 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 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 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 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$ 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* ej+dd! d"k rdd#l,m-Z- erdd$l.m/Z/ dd%l0m1Z1 dd&l2m3Z3 d'ed(dfd)d*Z4dbd-d.Z5dcd1d2Z6dcd3d4Z7d5e$d6ee$ d(e8fd7d8Z9	ddd5e$d:e8d6ee$ d(e
e fd;d<Z:d5e$d(dfd=d>Z;d5e$d(dfd?d@Z<d5e$d(dfdAdBZ=d5e$d6ee$ d(dfdCdDZ>d5e$dEedF d(dfdGdHZ?dIed(eee@e@e@f  fdJdKZA	9ded5e$dEdFd:e8d(efdLdMZBdNdOdIed(e8fdPdQZCd5e$dEdFd(dRfdSdTZDedUd9dVZEeejFG dWdX dXe	eE ZGd5e$dNeGd d(efdYdZZHd[e#d(efd\d]ZIG d^d_ d_ZJd[e#d(efd`daZKdS )fz3Basic collect and runtest protocol implementations.    N)Callable)cast)Dict)Generic)List)Optional)Tuple)Type)TYPE_CHECKING)TypeVar)Union   )
BaseReport)CollectErrorRepr)CollectReport)
TestReport)timing)ExceptionChainRepr)ExceptionInfo)TerminalRepr)final)Parser)check_ispytest)	Collector)Item)Node)Exit)OutcomeException)Skipped)TEST_OUTCOME   )      )BaseExceptionGroup)Literal)Session)TerminalReporterparserreturnc                 C   s@   | j dddd}|jddtd ddd	 |jd
dtdddd	 d S )Nzterminal reporting	Reportinggeneral)afterz--durationsstoreNz1Show N slowest setup/test durations (N=0 for all))actiontypedefaultmetavarhelpz--durations-ming{Gzt?zJMinimal duration in seconds for inclusion in slowest list. Default: 0.005.)getgroup	addoptionintfloat)r'   group r8   D/var/www/html/ai/venv/lib/python3.10/site-packages/_pytest/runner.pypytest_addoption2   s"   
r:   terminalreporterr&   c           	      C   s   | j jj}| j jj}| j d}|d u rd S | }g }|j D ]}|D ]}t|dr/|| q#q|s5d S |j	dd dd |sG|
dd n|
dd	|  |d | }t|D ]4\}}|d
k r{|j|k r{|d |dt|| |f   d S ||jdd|jdd|j  qYd S )Nverbosedurationc                 S   s   | j S N)r=   )xr8   r8   r9   <lambda>U   s    z)pytest_terminal_summary.<locals>.<lambda>T)keyreverse=zslowest durationszslowest %s durationsr     z>(%s durations < %gs hidden.  Use -vv to show these durations.)z02.2fzs z<8 )configoption	durationsdurations_mingetvaluestatsvalueshasattrappendsort	write_sep	enumerater=   
write_linelenwhennodeid)	r;   rH   rI   r<   trdlistreplistrepir8   r8   r9   pytest_terminal_summaryG   s>   




&r[   sessionr%   c                 C   s   t  | _d S r>   )
SetupState_setupstater\   r8   r8   r9   pytest_sessionstartg      r`   c                 C   s   | j d  d S r>   )r^   teardown_exactr_   r8   r8   r9   pytest_sessionfinishk   s   rc   itemnextitemc                 C   s:   | j }|j| j| jd t| |d |j| j| jd dS )N)rU   locationre   T)ihookpytest_runtest_logstartrU   rf   runtestprotocolpytest_runtest_logfinish)rd   re   rh   r8   r8   r9   pytest_runtest_protocolo   s
   rl   Tlogc                 C   s   t | d}|r| js|   t| d|}|g}|jr5| jddr%t|  | jdds5|t| d| |t| d||d |rHd| _d | _	|S )	N_requestsetup	setupshowF	setuponlycallteardownrg   )
rM   rn   _initrequestcall_and_reportpassedrF   	getoptionshow_test_itemrN   funcargs)rd   rm   re   
hasrequestrY   reportsr8   r8   r9   rj   w   s   

rj   c                 C   s^   | j  }|  |d || j tt| dg }|r)|dd| |	  dS )zAShow test function, parameters and the fixtures of the test item.z        fixturenamesz (fixtures used: {})z, N)
rF   get_terminal_writerlinewriterU   sortedgetattrformatjoinflush)rd   twused_fixturesr8   r8   r9   rx      s   

rx   c                 C   s   t | d | jj|  d S )Nro   )_update_current_test_varr\   r^   ro   )rd   r8   r8   r9   pytest_runtest_setup   s   
r   c              
   C   s   t | d zt`t`t`W n	 ty   Y nw z|   W d S  ty@ } zt|t_|t_|j	d us5J |j	j
t_|d }~ww )Nrr   )r   sys	last_type
last_valuelast_tracebackAttributeErrorruntest	Exceptionr/   __traceback__tb_next)rd   er8   r8   r9   pytest_runtest_call   s$   


r   c                 C   s&   t | d | jj| t | d  d S )Nrs   )r   r\   r^   rb   )rd   re   r8   r8   r9   pytest_runtest_teardown   s   
r   rT   z$Literal['setup', 'call', 'teardown']c                 C   sD   d}|r| j  d| d}|dd}|tj|< dS tj| dS )zUpdate :envvar:`PYTEST_CURRENT_TEST` to reflect the current item and stage.

    If ``when`` is None, delete ``PYTEST_CURRENT_TEST`` from the environment.
    PYTEST_CURRENT_TESTz () z(null)N)rU   replaceosenvironpop)rd   rT   var_namevaluer8   r8   r9   r      s   r   reportc                 C   s&   | j dv r| jr
dS | jrdS dS d S )N)ro   rs   )errorEERROR)skippedsSKIPPED)rD   rD   rD   )rT   failedr   r   r8   r8   r9   pytest_report_teststatus   s   
r   c                 K   sT   t | |fi |}| j}|j| |d}|r|j|d t||r(|j| ||d |S )Nrd   rr   r   noderr   r   )call_runtest_hookrh   pytest_runtest_makereportpytest_runtest_logreportcheck_interactive_exceptionpytest_exception_interact)rd   rT   rm   kwdsrr   hookr   r8   r8   r9   ru      s   
ru   rr   zCallInfo[object]c                 C   s8   | j du rdS t|drdS t| j jttjfrdS dS )zVCheck whether the call raised an exception that should be reported as
    interactive.NFwasxfailT)excinforM   
isinstancer   r   bdbBdbQuit)rr   r   r8   r8   r9   r      s   

r   zCallInfo[None]c                    s~   |dkr	j j n|dkrj j n|dkrj j nJ d| tf}jdds1|tf7 }tj	 fdd||d	S )
Nro   rr   rs   FzUnhandled runtest hook case: usepdbc                      s    ddiS )Nrd   r8   r8   r8   rh   rd   r   r8   r9   r@     s    z#call_runtest_hook.<locals>.<lambda>)rT   reraise)
rh   r   r   r   r   rF   rw   KeyboardInterruptCallInfo	from_call)rd   rT   r   r   r8   r   r9   r      s   



r   TResult)	covariantc                   @   s   e Zd ZU dZee ed< eee  ed< e	ed< e	ed< e	ed< ded< d	d
dee deee  de	de	de	ddde
ddfddZedefddZe	ddddddeeee eee df f  ddfddZdefddZdS )r   z/Result/Exception info of a function invocation._resultr   startstopr=   z/Literal['collect', 'setup', 'call', 'teardown']rT   F)	_ispytestresultr   r(   Nc                C   s0   t | || _|| _|| _|| _|| _|| _d S r>   )r   r   r   r   r   r=   rT   )selfr   r   r   r   r=   rT   r   r8   r8   r9   __init__  s   
zCallInfo.__init__c                 C   s$   | j durt| dtt| jS )zlThe return value of the call, if it didn't raise.

        Can only be accessed if excinfo is None.
        Nz has no valid result)r   r   r   r   r   r   r8   r8   r9   r   1  s   
zCallInfo.resultfunczCallable[[], TResult]r   .zCallInfo[TResult]c              	   C   s   d}t  }t  }z| }W n ty)   t }|dur%t|j|r% d}Y nw t  }|| }	t  }
| ||
|	|||ddS )av  Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        NT)r   r   r=   rT   r   r   r   )r   timeperf_counterBaseExceptionr   from_currentr   r   )clsr   rT   r   r   r   precise_startr   precise_stopr=   r   r8   r8   r9   r   >  s.   
zCallInfo.from_callc                 C   s6   | j d u rd| jd| jdS d| jd| j dS )Nz<CallInfo when=z	 result: >z	 excinfo=)r   rT   r   r   r8   r8   r9   __repr__i  s   
zCallInfo.__repr__r>   )__name__
__module____qualname____doc__r   r   __annotations__r   r   r6   boolr   propertyr   classmethodr   r	   r   r   strr   r8   r8   r8   r9   r     sT   
 
	

*r   c                 C   s   t | |S r>   )r   from_item_and_callr   r8   r8   r9   r   o  ra   r   	collectorc                    s  t  fddd}d }|jsd}n\tg}tjd}|d ur%||j t	|jj
t|rTd} |jd}t	|tsBJ t||j}|sIJ t|j|j|jf}nd} |j}t|d	slt	|tshJ t|}|}|jst|jnd }	t j|||	}
||
_|
S )
Nc                      s   t   S r>   )listcollectr8   r   r8   r9   r@   t  s    z,pytest_make_collect_report.<locals>.<lambda>r   rv   unittestr   r~   r   
toterminal)r   r   r   r   r   modulesgetrN   SkipTestr   r   tuple_repr_failure_pyr   repr	reprcrashr   pathlinenomessagerepr_failurerM   r   r   r   rU   rr   )r   rr   longreproutcomeskip_exceptionsr   r_r	errorinfor   rY   r8   r   r9   pytest_make_collect_reports  s2   
r   c                   @   s`   e Zd ZdZdddZdeddfddZd	eg ef d
e	ddfddZ
dee ddfddZdS )r]   aE  Shared state for setting up/tearing down test items or collectors
    in a session.

    Suppose we have a collection tree as follows:

    <Session session>
        <Module mod1>
            <Function item1>
        <Module mod2>
            <Function item2>

    The SetupState maintains a stack. The stack starts out empty:

        []

    During the setup phase of item1, setup(item1) is called. What it does
    is:

        push session to stack, run session.setup()
        push mod1 to stack, run mod1.setup()
        push item1 to stack, run item1.setup()

    The stack is:

        [session, mod1, item1]

    While the stack is in this shape, it is allowed to add finalizers to
    each of session, mod1, item1 using addfinalizer().

    During the teardown phase of item1, teardown_exact(item2) is called,
    where item2 is the next item to item1. What it does is:

        pop item1 from stack, run its teardowns
        pop mod1 from stack, run its teardowns

    mod1 was popped because it ended its purpose with item1. The stack is:

        [session]

    During the setup phase of item2, setup(item2) is called. What it does
    is:

        push mod2 to stack, run mod2.setup()
        push item2 to stack, run item2.setup()

    Stack:

        [session, mod2, item2]

    During the teardown phase of item2, teardown_exact(None) is called,
    because item2 is the last item. What it does is:

        pop item2 from stack, run its teardowns
        pop mod2 from stack, run its teardowns
        pop session from stack, run its teardowns

    Stack:

        []

    The end!
    r(   Nc                 C   s
   i | _ d S r>   )stackr   r8   r8   r9   r     s   
zSetupState.__init__rd   c                 C   s   |  }| j D ]\}\}}||v sJ d|r|q	|t| jd D ]2}|| jvs.J |jgdf| j|< z|  W q% tyW } z| j| d |f| j|< |d}~ww dS )z4Setup objects along the collector chain to the item.z(previous item was not torn down properlyNr   )	listchainr   itemsrS   rs   ro   r   )r   rd   needed_collectorscol
finalizersexcr8   r8   r9   ro     s"   zSetupState.setup	finalizerr   c                 C   sN   |rt |tr	J t|sJ || jv sJ || jf| j| d | dS )zgAttach a finalizer to the given node.

        The node must be currently active in the stack.
        r   N)r   r   callabler   rN   )r   r   r   r8   r8   r9   addfinalizer  s   zSetupState.addfinalizerre   c              
   C   s(  |r|  pg }g }| jrqt| j |dt| j krnS| j \}\}}g }|rN| }z|  W n tyK }	 z||	 W Y d}	~	nd}	~	ww |s+t|dkrZ|	| n|rnd|}
|t
|
|ddd  | jst|dkr{|d |rt
d|ddd |du r| jrJ dS dS )zTeardown the current stack up until reaching nodes that nextitem
        also descends from.

        When nextitem is None (meaning we're at the last item), the entire
        stack is torn down.
        Nr   zerrors while tearing down r   zerrors during test teardown)r   r   r   keysrS   popitemr   r   rN   extendr#   )r   re   r   
exceptionsr   r   _these_exceptionsfinr   msgr8   r8   r9   rb     s<    


zSetupState.teardown_exact)r(   N)r   r   r   r   r   r   ro   r   objectr   r   r   rb   r8   r8   r8   r9   r]     s    
?
r]   c                 C   sN   | j }|j| d |j| d}|jdd }|r%t||r%|j| ||d |S )Nr   rr   r   )rh   pytest_collectstartr   __dict__r   r   r   )r   rh   rY   rr   r8   r8   r9   collect_one_node   s   r	  )r;   r&   r(   N)r\   r%   r(   N)TN)T)Lr   r   dataclassesr   r   typingr   r   r   r   r   r   r   r	   r
   r   r   r{   r   r   r   r   _pytestr   _pytest._code.coder   r   r   _pytest.compatr   _pytest.config.argparsingr   _pytest.deprecatedr   _pytest.nodesr   r   r   _pytest.outcomesr   r   r   r   version_infoexceptiongroupr#   typing_extensionsr$   _pytest.mainr%   _pytest.terminalr&   r:   r[   r`   rc   r   rl   rj   rx   r   r   r   r   r   r   ru   r   r   r   	dataclassr   r   r   r]   r	  r8   r8   r8   r9   <module>   s    

 
	

 

` 