
    iO                     (   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKJr  S SKrS SKJr  S SKJr  S SKJr   S SKJr  SrCS	 rS
rSrS rS rS rS r S r!S r"S\#S\$4S jr%S r&S r'S r(S r)S r*S r+S r,S r-S r.S r/ " S S 5      r0 " S! S"5      r1 " S# S$\15      r2 " S% S&\25      r3 " S' S(\25      r40 r5S) r6\Rn                  " SS*9S+ 5       r8S, r9S- r:S. r;S/ r<\Rn                  " SS09S1 5       r=g! \ a    Sr Nf = f)2    N)suppress)fail)runtestprotocol)parse)pytest_handlecrashitemTFc                       [         R                  R                  S5      n [        U R                  5      [        S5      :  $ ! [         R                  R
                   a     gf = f)aG  Return compatibility with installed pytest-xdist version.

When running tests in parallel using pytest-xdist < 1.20.0, the first
report that is logged will finish and terminate the current node rather
rerunning the test. Thus we must skip logging of intermediate results under
these circumstances, otherwise no test is rerun.

zpytest-xdistz1.20N)	importlibmetadatadistributionparse_versionversionPackageNotFoundError)ds    S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/pytest_rerunfailures.pyworks_with_current_xdistr      sY    A++N; QYY'=+@@@ 22 s   A A#"A#z6number of times to re-run failed tests. defaults to 0.(add time (seconds) delay between reruns.c           	      h   U R                  SS5      nUR                  SSS[        S SS9  UR                  SS	S
[        [        S9  UR                  SS	S[
        SS9  UR                  SSS[        S SS9  UR                  SSSSS9  SnU R                  S
[        US9  U R                  S[        US9  g )Nrerunfailuresz0re-run failing tests to eliminate flaky failuresz--only-rerunappend
only_rerunzIf passed, only rerun errors matching the regex provided. Pass this flag multiple times to accumulate a list of regexes to match)actiondesttypedefaulthelpz--rerunsstorereruns)r   r   r   r   z--reruns-delayreruns_delayr   z--rerun-exceptrerun_exceptzIf passed, only rerun errors other than matching the regex provided. Pass this flag multiple times to accumulate a list of regexes to matchz--fail-on-flaky
store_truefail_on_flakyzEFail the test run with exit code 7 if a flaky test passes on a rerun.)r   r   r   string)r   )getgroup
_addoptionstrintRERUNS_DESCfloataddiniRERUNS_DELAY_DESC)parsergrouparg_types      r   pytest_addoptionr.   2   s    OOKE 
  	 
   
7   
  	 
T	   H
MM(KhM7
MM."3(MC    c                     U R                   nU" S5      (       dM  U R                  R                  S:w  a2  U R                  R                  (       a  [        R
                  " S5      eg g g )Ncollectonlyr   z --reruns incompatible with --pdb)getvalueoptionr   usepdbpytest
UsageError)configvals     r   check_optionsr9   f   sV    
//C}==1$}}##''(JKK $ % r/   c                 $    U R                  S5      $ )Nflaky)get_closest_marker)items    r   _get_markerr>   n   s    ""7++r/   c                    [        U 5      nUbH  SUR                  ;   a  UR                  S   $ [        UR                  5      S:  a  UR                  S   $ gU R                  R
                  R                  S5      nUb  U$ [        [        [        5         [        U R                  R
                  R                  S5      5      nS S S 5        U$ ! , (       d  f       U$ = f)Nr   r      )r>   kwargslenargssessionr7   r2   r   	TypeError
ValueErrorr&   getini)r=   rerun_markerr   s      r   get_reruns_countrI   r   s    t$L|***&&x00""#a'$$Q''\\  ))(3F	)Z	(T\\((//9: 
) M 
)	( Ms   /C
Cc                    [        U 5      nUbL  SUR                  ;   a  UR                  S   nO[        UR                  5      S:  a  UR                  S   nOZSnOWU R                  R
                  R                  S5      nUc/   [        U R                  R
                  R                  S5      5      nUS:  a  Sn[        R                  " S5        U$ ! [        [        4 a    Sn N4f = f)Nr   r@   r   z@Delay time between re-runs cannot be < 0. Using default value: 0)r>   rA   rB   rC   rD   r7   r2   r(   rG   rE   rF   warningswarn)r=   rH   delays      r   get_reruns_delayrN      s    t$L\000 ''7E""#a' %%a(EE##,,^<=dll1188HI qyN	
 L z* s   .C C'&C'c                 x    [        U 5      nSnUb)  SUR                  ;   a  [        XUR                  S   5      nU$ )NT	condition)r>   rA   evaluate_condition)r=   rH   rP   s      r   get_reruns_conditionrR      sF    t$LIK<3F3F$F& 3 3K @
	 r/   rP   returnc                    Sn[        U[        5      (       a}  [        [        [        U R
                  S.n[        U S5      (       a%  UR                  U R                  R                  5         SUR                   S3n[        X%S5      n[        Xd5      nU$  [+        U5      nU$ ! [         aV  nSUR                  -  SU-   SS	UR                  =(       d    S
-  -   S-   S/n[        SR!                  U5      SS9   S nAU$ S nAf["         aX  nSUR                  -  SU-   /[$        R&                  " [)        U5      U5      Qn[        SR!                  U5      SS9   S nAU$ S nAff = f! ["         aT  nSUR                  -  /[$        R&                  " [)        U5      U5      Qn[        SR!                  U5      SS9   S nAU$ S nAff = f)NF)ossysplatformr7   obj<z condition>evalzError evaluating %r conditionz     r   ^zSyntaxError: invalid syntax
)pytracez*Error evaluating %r condition as a boolean)
isinstancer%   rU   rV   rW   r7   hasattrupdaterX   __globals__namecompilerZ   SyntaxErroroffsetr   join	Exception	tracebackformat_exception_onlyr   bool)	r=   markrP   resultglobals_filenamecondition_codeexcmsgliness	            r   rQ   rQ      s    F)S!! kk	
 4OODHH001	5499+[1H$Y&AN.3F6 M	5)_F M5  	5/$));"

a0036-	H 8$e4& M%  	5/$));" 00cC@H
 8$e4 M%	5  	5<tyyH00cC@H 8$e4M	5s?   ,'B# E& #
E#-AC>>E#AEE#&
G0A	F??Gc                     Sn[        U SS5      n[        USS5       HM  nUR                  U   nU H5  n[        XQS5      c  M  [        XQ5      u  pgnU(       d  M)  [        XQS5        M7     MO     g)z<Note: remove all cached_result attribute from every fixture.cached_result_fixtureinfoNname2fixturedefs )getattrrv   setattr)	r=   rt   fixture_infofixture_def_strfixture_defsfixture_defrm   _errs	            r   +_remove_cached_results_from_failed_fixturesr      sn    #M46L"<1CRH#44_E'K{48D!(!D33K=	 ( Ir/   c                 >    U R                   R                  n0 Ul        g)zx
Clean up setup state.

Note: remove all failures from every node in _setupstate stack
      and clean the stack itself
N)rD   _setupstatestack)r=   setup_states     r   '_remove_failed_setup_state_from_sessionr      s     ,,**KKr/   c                     [        U 5      nUb8  XR                  ;   a)  UR                  U   n[        U[        5      (       a  U/nU$ [	        U R
                  R                  R                  U5      nU$ N)r>   rA   r_   r%   rx   rD   r7   r3   )r=   
regex_namerH   regexs       r   _get_rerun_filter_regexr      sk    t$LJ2E2E$E##J/eS!!GE L ++22J?Lr/   c                     [        X5      $ r   _try_match_error)rerun_errorsexcinfos     r   _matches_any_rerun_errorr     s    L22r/   c                     [        X5      $ r   r   )rerun_except_errorsr   s     r   _matches_any_rerun_except_errorr   	  s    /99r/   c                     U(       aK  UR                   R                   SUR                   3nU  H   n[        R                  " X25      (       d  M     g   g)Nz: TF)r   __name__valueresearch)r   r   r   rerun_regexs       r   r   r     sE    &&'r'--9'Kyy** ( r/   c                 ,   UR                   S:w  a  g[        U S5      n[        U S5      nU(       d  U(       d  gU(       a  U(       d  [        X25      (       + $ U(       d  U(       a  [        XB5      $ [        X25      n[        XB5      nU(       + =(       d    U$ )NfailedFr   r   )outcomer   r   r   )r=   reportr   r   r   matches_rerun_onlymatches_rerun_excepts          r   _should_hard_fail_on_errorr     s    ~~!*4>L1$G#6	2+LBBB 3./BLL 6lL> 
 '&?+??r/   c                     [        US5      nU R                  UR                     n[        U 5      nU R                  U:  =(       d1    UR
                  (       + =(       d    U=(       d    U=(       d    U(       + $ )Nwasxfail)r`   _terminal_errorswhenrR   execution_countr   )r=   r   r   xfailis_terminal_errorrP   s         r   _should_not_rerunr   2  sm    FJ'E--fkk:$T*Iv% 	}}		 	 =r/   c                 J    [        U S5      =(       d    [        U S5      (       + $ )Nworkerinput
slaveinput)r`   r7   s    r   	is_masterr   ?  s    .O'&,2OPPr/   c                 ^   U R                  SS5        U R                  R                  S5      (       al  [        (       aa  U R                  R	                  [        5       5        [        U 5      (       a  [        5       U l        g [        U R                  S   5      U l        g [        5       U l        g )Nmarkerszflaky(reruns=1, reruns_delay=0): mark test to re-run up to 'reruns' times. Add a delay of 'reruns_delay' seconds between re-runs.xdist	sock_port)addinivalue_linepluginmanager	haspluginHAS_PYTEST_HANDLECRASHITEMregister
XDistHooksr   ServerStatusDBfailures_dbClientStatusDBr   StatusDBr   s    r   pytest_configurer   C  s    
	 %%g..3M3M%%jl3V!/!1F!/0B0B;0O!PF%Zr/   c                        \ rS rSrS rS rSrg)r   iV  c                 ^    UR                   R                  R                  UR                  S'   g)z(Configure xdist hook for node sock_port.r   N)r7   r   r   r   )selfnodes     r   pytest_configure_node XDistHooks.pytest_configure_nodeW  s"    (,(?(?(I(I%r/   c                     UR                   R                  nUR                  U5      nUR                  U5      U:  a  UR	                  U5        SUl        UR                  U5        g)z1Return the crashitem from pending and collection.rerunN)r7   r   get_test_rerunsget_test_failuresmark_test_pendingr   add_test_failure)r   	crashitemr   scheddbr   s         r   r   !XDistHooks.pytest_handlecrashitem[  sW    \\%%##I.	*V3##I.$FN
I&r/   rw   N)r   
__module____qualname____firstlineno__r   r   __static_attributes__rw   r/   r   r   r   V  s    J'r/   r   c                   p    \ rS rSrS rS\S\4S jrS rS rS r	S	 r
S
\S\S\4S jrS
\S\S\4S jrSrg)r   ij  c                      SU l         0 U l        g )N   
delimhmapr   s    r   __init__StatusDB.__init__k  s    
	r/   r   rS   c                     XR                   ;  aB  [        R                  " UR                  5       5      R	                  5       S S U R                   U'   U R                   U   $ )N
   )r   hashlibsha1encode	hexdigest)r   r   s     r   _hashStatusDB._hasho  sM    II%#*<<	0@0@0B#C#M#M#OPSQS#TDIIi yy##r/   c                 z    U R                  U5      nU R                  US5      nUS-  nU R                  USU5        g )Nfr@   )r   _get_set)r   r   hashfailuress       r   r   StatusDB.add_test_failureu  s9    zz)$99T3'A		$X&r/   c                 H    U R                  U5      nU R                  US5      $ )Nr   r   r   r   r   r   s      r   r   StatusDB.get_test_failures{  !    zz)$yys##r/   c                 L    U R                  U5      nU R                  USU5        g Nr)r   r   )r   r   r   r   s       r   set_test_rerunsStatusDB.set_test_reruns  s     zz)$		$V$r/   c                 H    U R                  U5      nU R                  US5      $ r   r   r   s      r   r   StatusDB.get_test_reruns  r   r/   ikvc                     g r   rw   r   r   r   r   s       r   r   StatusDB._set  s    r/   c                     gNr   rw   r   r   r   s      r   r   StatusDB._get  s    r/   r   N)r   r   r   r   r   r%   r   r   r   r   r   r&   r   r   r   rw   r/   r   r   r   j  sb    $s $s $'$%$c c c c c c r/   r   c                   D   ^  \ rS rSrU 4S jrS\4S jrS\4S jrSrU =r	$ )SocketDBi  c                    > [         TU ]  5         [        R                  " [        R                  [        R                  5      U l        U R
                  R                  S5        g Nr@   )superr   socketAF_INETSOCK_STREAMsocksetblocking)r   	__class__s    r   r   SocketDB.__init__  s<    MM&..&2D2DE			a r/   rS   c                 v    Sn UR                  S5      nX0R                  :X  a   UR                  5       $ X#-  nM7  )Nr/   r@   )recvr   decode)r   connbufbs       r   
_sock_recvSocketDB._sock_recv  s?    		!AJJ zz| HC	 r/   msgc                 \    UR                  UR                  5       U R                  -   5        g r   )sendr   r   )r   r  r  s      r   
_sock_sendSocketDB._sock_send  s    		#**,+,r/   )r  )
r   r   r   r   r   r%   r  r  r   __classcell__r	  s   @r   r   r     s%    !
# -C - -r/   r   c                   p   ^  \ rS rSrU 4S jr\S 5       rS rS rS\	S\	S\
4S	 jrS\	S\	S
\
4S jrSrU =r$ )r   i  c                 6  > [         TU ]  5         U R                  R                  S5        U R                  R	                  [
        R                  [
        R                  S5        0 U l        [        R                  " U R                  SS9nUR                  5         g )N)	localhostr   r@   T)targetdaemon)r  r   r  bind
setsockoptr  
SOL_SOCKETSO_REUSEADDRrerunfailures_db	threadingThread
run_serverstart)r   tr	  s     r   r   ServerStatusDB.__init__  sh    		'(		V..0C0CQG "DOODA		r/   c                 <    U R                   R                  5       S   $ r  )r  getsocknamer   s    r   r   ServerStatusDB.sock_port  s    yy$$&q))r/   c                     U R                   R                  5          U R                   R                  5       u  p[        R                  " U R
                  U4SS9nUR                  5         MO  )NT)r  rC   r  )r  listenacceptr$  r%  run_connectionr'  )r   r  r~   r(  s       r   r&  ServerStatusDB.run_server  sT    		ii&&(GD  (;(;4'RVWAGGI r/   c           
      4   [        [        5          U R                  U5      R                  S5      u  p#pEUS:X  a  U R	                  X4[        U5      5        O0US:X  a*  U R                  U[        U R                  X45      5      5        Mw  ! , (       d  f       g = f)N|setget)	r   ConnectionErrorr  splitr   r&   r  r%   r   )r   r  opr   r   r   s         r   r0  ServerStatusDB.run_connection  ss    o&"ood399#>q;IIaCF+5[OOD#diio*>?  '&s   A9B		
Br   r   r   c                 b    XR                   ;  a  0 U R                   U'   X0R                   U   U'   g r   r#  r   s       r   r   ServerStatusDB._set  s1    )))')D!!!$&'a #r/   rS   c                 H     U R                   U   U   $ ! [         a     gf = fr   )r#  KeyErrorr   s      r   r   ServerStatusDB._get  s/    	((+A.. 		s    
!!r;  )r   r   r   r   r   propertyr   r&  r0  r%   r&   r   r   r   r  r  s   @r   r   r     s`     * *@(c (c (c (
c c c  r/   r   c                   T   ^  \ rS rSrU 4S jrS\S\S\4S jrS\S\S\4S jrS	r	U =r
$ )
r   i  c                 \   > [         TU ]  5         U R                  R                  SU45        g )Nr  )r  r   r  connect)r   r   r	  s     r   r   ClientStatusDB.__init__  s%    		;	23r/   r   r   r   c                 r    U R                  U R                  SR                  SX[        U5      45      5        g )Nr3  r4  )r  r  rg   r%   r   s       r   r   ClientStatusDB._set  s(    		388UA#a&,A#BCr/   rS   c           	          U R                  U R                  SR                  SXS45      5        [        U R	                  U R                  5      5      $ )Nr3  r5   )r  r  rg   r&   r  r   s      r   r   ClientStatusDB._get  s<    		388UA",=#>?4??499-..r/   rw   )r   r   r   r   r   r%   r&   r   r   r   r  r  s   @r   r   r     sE    4Dc Dc Dc D/c /c /c / /r/   r   c                 0   [        U 5      nUc  g [        U S5      (       d  g [        U S0 5      nU R                  U::  Ga  [	        UR                  5       5      (       a  [	        U R                  R                  5       5      (       d  [        U 5        X R                  R                  R                  ;   a  [        U R                  R                  R                  R                  5       5       H_  nX@:w  d  M
  U[        ;  a*  U R                  R                  R                  U   [        U'   U R                  R                  R                  U	 Ma     g g U R                  R                  R                  R                  [        5        [        R                  5         g )Nr   _test_failed_statuses)rI   r`   rx   r   anyvaluesr   r   rD   r   r   listkeyssuspended_finalizersra   clear)r=   nextitemr   rK  keys        r   pytest_runtest_teardownrT    s:   d#F~ 	4*++ 	#D*A2F 	&%,,.//D))00233 	4D9<<++111DLL44::??AB;"6648LL4L4L4R4RSV4W,S10066s; C 2 	  &&--.BC""$r/   )hookwrapperc              #   8  #    S v nUR                  5       nUR                  S:X  a  [        U S0 5        [        U S0 5        [        U S0 5      nUR                  XCR                  '   X@l        [        XUR                  5      U R                  UR                  '   g 7f)NsetuprK  r   )	
get_resultr   ry   rx   r   rK  r   r   r   )r=   callr   rm   rK  s        r   pytest_runtest_makereportrZ    s     G!F{{g-r2 	("-#D*A2F)/++&!6)Cdll*D&++&s   BBc                    [        U 5      nUc  g[        U R                  R                  5        [	        U 5      n[        U R                  5      (       + nU R                  R                  R                  nUR                  U R                  5      U l	        UR                  U R                  U5        U R                  U:  a  gSnU(       Ga2  U =R                  S-  sl	        U R                  R                  U R                  U R                  S9  [        XSS9nU H  nU R                  S-
  Ul        [!        XU5      (       a  U R                  R#                  US9  MC  SUl        [&        R(                  " U5        U(       a  [+        5       (       a  U R                  R#                  US9  [-        U 5        [/        U 5          O   SnU R                  R1                  U R                  U R                  S9  U(       a  GM2  g)	z
Run the test protocol.

Note: when teardown fails, two reports are generated for the case, one for
the test case and the other for the teardown error.
NTr@   )nodeidlocationF)rR  logr   r   )rI   r9   rD   r7   rN   r   r   r   r\  r   r   ihookpytest_runtest_logstartr]  r   r   r   pytest_runtest_logreportr   timesleepr   r   r   pytest_runtest_logfinish)	r=   rR  r   rM   parallelr   need_to_runreportsr   s	            r   pytest_runtest_protocolri    s    d#F~ 	 $,,%%&T"ET[[))H				(	(B//<Dt{{F+f$K
!

**$++*V!$uEF//!3FL v66

3363B ")

5!#;#=#=JJ77v7F <DA7=% (  K

++4;;+W7 +: r/   c                 6    U R                   S:X  a	  SSSSS044$ g )Nr   RRERUNyellowT)r   r_  s    r   pytest_report_teststatusrn  R  s*    ~~ g$'7888 !r/   c                    U nUR                   (       d  g / nUR                    H  nUS;   d  M  [        X5        M     U(       aA  UR                  R                  SS5        U H  nUR                  R	                  U5        M      g g )NrR=zrerun test summary info)reportchars
show_rerun_twsepline)terminalreportertrlinescharrv  s        r   pytest_terminal_summaryr{  X  sk    	B>>E4<'/  


312DFFKK  r/   c                     U R                   R                  S5      nU(       a*  U H#  nUR                  nUR                  SU 35        M%     g g )Nr   zRERUN )statsr5  r\  r   )rw  ry  r   repposs        r   rs  rs  i  sE    ""&&w/EC**CLL6#(  r/   )trylastc                     US:w  a  g U R                   R                  R                  (       a@  U R                   H/  n[	        US5      (       d  M  UR
                  S:  d  M(  SU l          g    g g )Nr   r   r@      )r7   r3   r!   itemsr`   r   
exitstatus)rD   r  r=   s      r   pytest_sessionfinishr  q  s\    Q~~**MMD4!233##a'%&" " +r/   )>r   importlib.metadatar	   rU   rW   r   r  rV   r$  rc  ri   rK   
contextlibr   r5   _pytest.outcomesr   _pytest.runnerr   packaging.versionr   r   xdist.newhooksr   r   ImportErrorr   r'   r*   r.   r9   r>   rI   rN   rR   objectrk   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rP  rT  hookimplrZ  ri  rn  r{  rs  r  rw   r/   r   <module>r     sr     	  	  
       ! * 4'5!%
A" G> /DhL,.8	,f , ,^
>
3:@8
Q(&' '($ $N-x -('X 'T
/X 
/  #%L T" #$7t9")  u  '!&'s   
	D DD