
    iI                    f   S SK Jr  S SKJ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
r
S SKJr  S SKJr  S SKJr  S SKJ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 jr " S S5      r " S S\R8                  5      rSS jr " S S\R>                  5      r  " S S5      r!SS jr"g)    )annotations)SequenceN)Path)Any)Callable)Literal)Union)	_sys_path)Producer)
WorkerInfoc                0   / nU R                  S5      nU H=  nUR                  S5      n [        US U 5      nUR                  X4S-   S  /U-  5        M?     U(       d  [        R                  " S5      eU$ ! [         a    UR                  U5         M~  f = f)Ntx*   z6MISSING test execution (tx) nodes: please specify --tx)getvaluefindintextend
ValueErrorappendpytest
UsageError)config	xspeclistr   xspecinums         Q/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/xdist/workermanage.pyparse_tx_spec_configr      s    IOOD)BJJsO	5eBQi.C eEGn-34  D
 	
   	$U#	$s   A66BBc                      \ rS rSrSr/ SQr  S       SS jjrSS jr    SS jr      SS jr	SS	 jr
SS
 jrSS jrSS jrSS jr   S           SS jjrSrg)NodeManager,   
   )z.*z*.pycz*.pyoz*~Nc                   Xl         U R                   R                  R                  S5      U l        U R                   R                  S5      U l        U R                  c$  [
        R                  " 5       R                  U l        [        R                  " SS9U l
        U R                  5        HF  n[        USS 5      c  [        R                  " SU S35      eU R                  R                  U5        MH     Uc  U R!                  5       n/ U l        U H  n[%        U[        R&                  5      (       d  [        R&                  " U5      n[        USS 5      S:w  a  [        R&                  " S	U 35      nUR(                  (       d  UR*                  (       d  X5l        U R                  R-                  U5        U R"                  R/                  U5        M     U R1                  5       U l        U R5                  5       U l        [9        5       U l        g )
Nnodemanager
testrunuidmain_thread_only)	execmodelidzProxy gateway z must include an idr(   execmodel=main_thread_only//)r   traceget	getoptionr&   uuiduuid4hexexecnetGroupgroup_getpxspecsgetattrr   r   makegateway_gettxspecsspecs
isinstanceXSpecchdirpopenallocate_idr   _getrsyncdirsroots_getrsyncoptionsrsyncoptionsset_rsynced_specs)selfr   r8   defaultchdir
proxy_specspecs         r   __init__NodeManager.__init__0   s    [[&&**=9
++//=??""jjl..DO]]-?@
**,J z4.6''$ZL0CD  JJ"":. - =$$&E*,
DdGMM22}}T*t[$/3EE}}'CD6%JK::djj)
JJ""4(JJd#  '')
 11347E    c                    U R                   (       a1  U R                    H   nU R                  " X40 U R                  D6  M"     gg)z1Rsync the set of roots to the node's gateway cwd.N)r?   rsyncrA   )rD   gatewayroots      r   rsync_rootsNodeManager.rsync_rootsU   s3    ::



7>D,=,=> # rJ   c                    U R                   R                  R                  U R                   U R                  S9  U R	                  S5        U R                   Vs/ s H  o R                  X!5      PM     sn$ s  snf )N)r   r8   zsetting up nodes)r   hookpytest_xdist_setupnodesr8   r+   
setup_node)rD   puteventrG   s      r   setup_nodesNodeManager.setup_nodes[   sY     	004::0V

%&<@JJGJD/JGGGs   A5c                z   [        USS 5      S:w  a  [        R                  " SU 35      nU R                  R	                  U5      nU R
                  R                  R                  US9  U R                  U5        [        XU R
                  U5      nXCl
        UR                  5         U R                  SU-  5        U$ )Nr(   r'   r*   )rM   zstarted node %r)r5   r1   r:   r3   r6   r   rR   pytest_xdist_newgatewayrO   WorkerControllernodesetupr+   )rD   rG   rU   gwr[   s        r   rT   NodeManager.setup_nodec   s    
 4d+/AA==#?v!FGDZZ##D)000<$++x@



$t+,rJ   c                N    U R                   R                  U R                  5        g N)r3   	terminateEXIT_TIMEOUTrD   s    r   teardown_nodesNodeManager.teardown_nodest   s    

T../rJ   c                    [        U R                  5       Vs/ s H  n[        R                  " U5      PM     sn$ s  snf r`   )r   r   r1   r:   rD   xs     r   r7   NodeManager._gettxspecsw   s.    *>t{{*KL*KQa *KLLLs    ;c                    U R                   R                  S5       Vs/ s H  n[        R                  " U5      PM     sn$ s  snf )Npx)r   r-   r1   r:   rg   s     r   r4   NodeManager._getpxspecsz   s4    *.++*?*?*EF*EQa *EFFFs    Ac                H   U R                    H'  nUR                  (       a  UR                  (       d  M'    O   / $ SS KnSS KnSS jnU" UR
                  5      nU" UR
                  5      nU R                  nXV/nXR                  R                  -  nUR                  S5      n	U	(       a  UR                  U	5        / n
U H_  n[        U5      R                  5       nUR                  5       (       d  UR                  " SU< 35      eX;  d  MN  U
R                  U5        Ma     U
$ )Nr   c                    U R                  S5      n[        R                  R                  U5      S:X  a  [        R                  R	                  U 5      $ U$ )zRReturn the directory path if p is a package or the path to the .py file otherwise.coz__init__.py)rstripospathbasenamedirname)pstrippeds     r   get_dir*NodeManager._getrsyncdirs.<locals>.get_dir   s>    xx~Hww)]:wwq))rJ   	rsyncdirszrsyncdir doesn't exist: )ru   strreturnrz   )r8   r<   r;   _pytestr   __file__r   optionrsyncdirgetinir   r   resolveexistsr   r   )rD   rG   r|   r   rw   
pytestpath	pytestdirr   
candidates
rsyncrootsr?   rN   	root_paths                r   r>   NodeManager._getrsyncdirs}   s    JJD::  I	  V__-
G,,-	 ,
mm,,,
]];/
j)DT
**,I##%%''*B4((KLL%Y'  rJ   c                n   [        U R                  5      nXR                  R                  R                   Vs/ s H  n[        U5      PM     sn-  nXR                  R                  S5       Vs/ s H  n[        U5      PM     sn-  nU[        U R                  R                  SS5      S.$ s  snf s  snf )z#Get options to be passed for rsync.rsyncignoreverboser   ignoresr   )listDEFAULT_IGNORESr   r~   r   rz   r   r5   )rD   r   rr   s      r   r@   NodeManager._getrsyncoptions   s    t++,++*<*<*H*HI*H$CI*HII++*<*<]*KL*K$CI*KLL t{{119a@
 	
 JLs   B-/B2c                Z  ^^^ [        TUS:  US9nUR                  mTR                  (       aZ  TR                  (       dI  UR	                  S[
        R                  R                  [        T5      5      -  5      R                  5         gTT4U R                  ;   a  gSUUU4S jjnUR                  XS9  U R                  R                  TT45        U R                  R                  R                  TU/S9  UR!                  5         U R                  R                  R#                  TU/S9  g)	z'Perform rsync to remote hosts for node.r   )r   r   zA
                import sys ; sys.path.insert(0, %r)
            Nc                 *   > T (       a  T " STT5        g g )Nrsyncrootready )notifysourcerG   s   r   finished#NodeManager.rsync.<locals>.finished   s    'v6 rJ   )r   )r   gatewaysr{   None)	HostRSyncrG   r<   r;   remote_execrq   rr   rt   rz   	waitcloserC   add_target_hostaddr   rR   pytest_xdist_rsyncstartsendpytest_xdist_rsyncfinish)	rD   rM   r   r   r   r   rL   r   rG   s	     ``    @r   rL   NodeManager.rsync   s     &'A+wG||::djj  ''//#f+./
 ik&>T000	7 	7 	g9v/00'0S

117)1TrJ   )rC   r   r3   r?   rA   r8   r&   r+   )Npyexecnetcache)r   pytest.Configr8   z$Sequence[execnet.XSpec | str] | NonerE   rz   r{   r   )rM   execnet.Gatewayr{   r   )rU   ,Callable[[tuple[str, dict[str, Any]]], None]r{   zlist[WorkerController])rG   zexecnet.XSpecrU   r   r{   rZ   r   )r{   zlist[execnet.XSpec])r{   z
list[Path])r{   dict[str, Any])NFN)rM   r   r   zstr | os.PathLike[str]r   zBCallable[[str, execnet.XSpec, str | os.PathLike[str]], Any] | Noner   r   r   zSequence[str] | Noner{   r   )__name__
__module____qualname____firstlineno__rb   r   rH   rO   rV   rT   rd   r7   r4   r>   r@   rL   __static_attributes__r   rJ   r   r!   r!   ,   s    L4O
 7;,	#:#: 4#: 	#:
 
#:J?H>H 
 H ? 
	"0MG D	
" (,%U %U '%U
 O%U %U &%U 
%U %UrJ   r!   c                     ^  \ rS rSrSr\\S4   rSSS.       SU 4S jjjrSS jr	 S     SU 4S	 jjjr
      SS
 jrSrU =r$ )r      z&RSyncer that filters out common files.zos.PathLike[str]NTr   c          
        > Uc  / nU Vs/ s HA  n[         R                  " [        R                  " [        R
                  " U5      5      5      PMC     snU l        [        TU ]!  [        U5      US9  g s  snf )N)	sourcedirr   )
recompilefnmatch	translaterq   fspath_ignoressuperrH   r   )rD   r   r   r   rh   	__class__s        r   rH   HostRSync.__init__   s]     ?GNUVgG$5$5biil$CDgV4	?GD Ws   AA3c                    [        U5      nU R                   HD  nUR                  UR                  5      (       d!  UR                  [	        U5      5      (       d  MD    g   g)NFT)r   r   matchnamerz   )rD   rr   cres      r   filterHostRSync.filter   sF    Dz==Cyy##syyT';'; ! rJ   c                v   > [         R                  R                  U R                  5      n[        TU ]  XUSS9  g )NT)finishedcallbackdelete)rq   rr   rs   
_sourcedirr   
add_target)rD   rM   r   
remotepathr   s       r   r   HostRSync.add_target_host   s2    
 WW%%doo6
7RVWrJ   c                    U R                   S:  ac  [        R                  R                  U R                  5      S-   U-   nUR
                  R                  n[        UR
                   SU SU 35        g g )Nr   /:z <= )_verboserq   rr   rs   r   rG   r;   print)rD   rM   modified_rel_pathrr   r   s        r   _report_send_fileHostRSync._report_send_file   sd    
 ==177##DOO4s:=NND ++JW\\N!J<tD6:; rJ   )r   )r   PathLiker   zSequence[PathLike] | Noner   boolr{   r   )rr   r   r{   r   r`   )rM   r   r   zCallable[[], None] | Noner{   r   )rM   r   r   rz   r{   r   )r   r   r   r   __doc__r	   rz   r   rH   r   r   r   r   __classcell__)r   s   @r   r   r      s    0S,,-H .2
E
E +	
E
 
E 

E 
E /3X X ,X 
	X X< < < 
	< <rJ   r   c                   Sn/ nU H  nUR                  U5      n[        US   5      n UR                  5       nU(       d  UR	                  U5        MM  U  HA  n UR                  U5      n	U	(       d  Xh:X  d  M#  UR                  S-   [        U	5      -   US'     O   [        SU S35      eUR	                  UR                  U5      5        M     U$ ! [         a    Sn Nf = f! [         a    S n	 Nf = f)Nz::r   Fr   zarg z not relative to an rsync root)
splitr   r   OSErrorr   relative_tor   r   rz   join)
r?   args	splitcoderesultargpartsr   r   rN   rh   s
             r   make_reltorootr      s    IF		)$eAh	]]_F MM#D&&t, FN99s?SV3a  tC5(FGHHinnU+,+ , M#  	F	  s#   CC"CC"C10C1c                      \ rS rSrSrSrg)Markeri  r   N)r   r   r   r   ENDr   r   rJ   r   r   r     s    
CrJ   r   c                      \ rS rSr% S\S'    " S S5      r          SS jrSS jr\SS j5       r	SS	 jr
SS
 jrSS jrSS jrSS jrSS jrSS jrSS jr    SS jrSrg)rZ   i  r   
workerinfoc                  D    \ rS rSr\R
                  " SS9SS j5       rSrg)WorkerController.RemoteHooki#  T)trylastc                "    [         R                  $ r`   )xdistremoterc   s    r   pytest_xdist_getremotemodule8WorkerController.RemoteHook.pytest_xdist_getremotemodule$  s    <<rJ   r   N)r{   r   )r   r   r   r   r   hookimplr   r   r   rJ   r   
RemoteHookr   #  s    		&	  
'	 rJ   r   c                   UR                   R                  U R                  5       5        Xl        X@l        X l        X0l        UR                  [        UR                  5      UR                  [        R                  S.U l        SU l        SU l        [!        SUR                   3UR"                  R$                  S9U l        g )N)workeridworkercountr&   mainargvFz
workerctl-)enabled)pluginmanagerregisterr   r%   rU   rM   r   r)   lenr8   r&   sysargvworkerinput_down_shutdown_sentr   r~   debuglog)rD   r%   rM   r   rU   s        r   rH   WorkerController.__init__(  s     	%%doo&78& 

{001%00	
 
#j5v}}?R?RSrJ   c                d    SU R                   R                   SU R                  R                   S3$ )N< >)r   r   rM   r)   rc   s    r   __repr__WorkerController.__repr__>  s+    4>>**+1T\\__,=Q??rJ   c                @    U R                   =(       d    U R                  $ r`   )r   r   rc   s    r   shutting_downWorkerController.shutting_downA  s    zz0T000rJ   c                   U R                  S5        U R                  R                  5         U R                  R                  nU R                  R
                  R                  =(       d    S Vs/ s H  n[        U5      PM     nn0 nUR                  (       a  UR                  (       a   [        U R                  R                  U5      nUR                  (       ah  SU R                  R                  -  n[        U R                  S5      (       a4  U R                  R                  R!                  5       n[        Xe-  5      US'   U R                  R"                  R%                  U S9  U R                  R"                  R'                  5       nU R                  R)                  U5      U l        U R                  R                  R                  (       a  [,        OS nU R*                  R/                  U R0                  X4U45        U R2                  (       a3  U R*                  R5                  U R6                  [8        R:                  S9  g g s  snf )Nzsetting up worker sessionr   zpopen-%s_tmp_path_factorybasetempr[   )	endmarker)r   rM   _rinforG   r   invocation_paramsr   rz   r<   r;   r   r%   r?   r)   hasattrr
  getbasetemprR   pytest_configure_noder   r   channelr
   r   r   rU   setcallbackprocess_from_remoter   r   )	rD   rG   rh   r   option_dictr   r  remote_modulechange_sys_paths	            r   r\   WorkerController.setupE  s   ,-
 	||   $ = = B B Hb HI H1A HIzzTZZ!$"2"2"8"8$?D::/Dt{{$788;;88DDF*-ho*>J'..D.9((EEG||//> (,||'8'8'>'>)D4++TPQ ==LL$$T%=%=$T ' Js   -Ic                `   [        U S5      (       aU  U R                  R                  5       (       d6  U R                  SU R                  5        U R                  R	                  5         [        U S5      (       a7  U R                  SU R
                  5        U R
                  R                  5         g g )Nr  closingrM   exiting)r  r  isclosedr   closerM   exitrc   s    r   ensure_teardown WorkerController.ensure_teardownc  sx    4##<<((**DLL1""$4##HHY-LL $rJ   c                $    U R                  SUS9  g )NruntestsindicessendcommandrD   r%  s     r   send_runtest_some"WorkerController.send_runtest_somen  s    W5rJ   c                &    U R                  S5        g )Nruntests_allr&  rc   s    r   send_runtest_all!WorkerController.send_runtest_allq  s    (rJ   c                $    U R                  SUS9  g )Nstealr$  r&  r(  s     r   
send_stealWorkerController.send_stealt  s    '2rJ   c                z    U R                   (       d   U R                  S5        SU l        g g ! [         a     Nf = f)NshutdownT)r   r'  r   r   rc   s    r   r4  WorkerController.shutdownw  s?    zz  , #'D   s   - 
::c                l    U R                  SU SU S35        U R                  R                  X45        g)z4Send a named parametrized command to the other side.zsending command (**)N)r   r  r   )rD   r   kwargss      r   r'  WorkerController.sendcommand  s2    #D6VHA674.)rJ   c                X    U R                  SU SU S35        U R                  X45        g )Nzqueuing r7  r8  )r   rU   )rD   	eventnamer9  s      r   notify_inprocWorkerController.notify_inproc  s,    8I;c&34y)*rJ   c                \    U[         R                  L aa  U R                  R                  5       nU R                  (       d5  U(       a  [        U[        5      (       a  SnU R                  SXS9  SU l        gUu  p4US;   a  U R                  SU SU S	35        gUS
:X  a  U R                  " U4SU 0UD6  gUS:X  a  U R                  " U4SU 0UD6  gUS:X  a"  SU l        US   U l	        U R                  SU S9  gUS;   a  U R                  " U4SU 0UD6  gUS;   a]  UR                  SS5      nU R                  R                  R                  U R                  US   S9nUb  XVl        U R                  X0US9  gUS:X  a  U R                  X0US   S9  gUS:X  a  U R                  " U4SU 0UD6  gUS:X  a  U R                  " U4SU 0UD6  gUS:X  a   U R                  UUS   US   US   US   S9  gUS :X  a+  [        US!   5      nU R                  UUUS"   US   US#   S$9  g[!        S%U 35      e! ["         a    e [$         ah    [&        R(                  R+                  5       n[-        S&U5        U R                  R/                  U5        U R1                  5         U R                  SXS9   gf = f)'zThis gets called for each object we receive from
the other side and if the channel closes.

Note that channel callbacks run in the receiver
thread of execnet gateways - we need to
avoid raising exceptions or doing heavy work.
zNot properly terminated	errordown)r[   errorTN)collectionstartz	ignoring (r8  workerreadyr[   internal_errorworkerfinishedworkeroutputr  )logstart	logfinish)
testreportcollectreportteardownreport
item_indexdata)r   rN  )r[   repcollectionfinishids)r[   rQ  runtest_protocol_completeunscheduled
logwarningmessagecodenodeid)rU  rV  rW  
fslocationwarning_recordedwarning_message_datawhenlocation)warning_messager[  rW  r\  zunknown event: z!!!!!!!!!!!!!!!!!!!!)r   r   r  _getremoteerrorr   r9   EOFErrorr=  r   rG  popr   rR   pytest_report_from_serializablerM  unserialize_warning_messager   KeyboardInterruptBaseExceptionr   ExceptionInfofrom_currentr   notify_exceptionr4  )	rD   	eventcallerrr<  r9  rM  rO  r]  excinfos	            r   r  $WorkerController.process_from_remote  s   A	FFJJ&%)\\%A%A%Czz*S(";";7&&{&I!%DJ )I009YKq:;m+""9B4B6B..""9B4B6B..!
$*>$:!""#3$"?77""9B4B6BOO#ZZd;
kk&&FF;;VF^ G  )%/N""9S"A00""9VE]"K99""9B4B6Bm+""9B4B6Bl*"""9-!(+%h/ #  00"=12# ""$3!(+#J/ #  !?9+!>??  	 	F**779G(G$KK((1MMO{E	Fs\   A3H/ 6"H/ H/ 5H/ 'H/ 9H/ A"H/ 8H/ H/ .H/ 
%H/ 00H/ !H/ /A9J+*J+)
r   r   r  r   rM   r   r%   rU   r   rG  N)
r%   r!   rM   r   r   r   rU   r   r{   r   )r{   rz   )r{   r   r   )r%  zSequence[int]r{   r   )r   rz   r9  objectr{   r   )r<  rz   r9  rl  r{   r   )rh  z0tuple[str, dict[str, Any]] | Literal[Marker.END]r{   r   )r   r   r   r   __annotations__r   rH   r  propertyr  r\   r   r)  r-  r1  r4  r'  r=  r  r   r   rJ   r   rZ   rZ     s       
T T !T 	T
 ?T 
T,@ 1 1U< 6)3'*
+KFIKF	KFrJ   rZ   c                   SS K nU S   (       a\  UR                  U S   5      n[        X S   5      nS nU S   b	   U" U S   6 nUc%  SR	                  U S   U S   U S   S9n[        U5      nOU S   nU S   (       a#  UR                  U S   5      n[        X S	   5      nOS nXFS
.n[        R                  R                   H  nUS
;   a  M  X   Xx'   M     [        R                  " S0 UD6$ ! [         a     Nf = f)Nr   message_modulemessage_class_namemessage_argsz{mod}.{cls}: {msg}message_str)modclsmsgcategory_modulecategory_class_name)rU  categoryr   )		importlibimport_moduler5   	TypeErrorformatWarningwarningsWarningMessage_WARNING_DETAILS)	rN  rz  rt  ru  rU  message_textry  r9  	attr_names	            r   rb  rb    s9   %%d+;&<=c 456+tN34 ? 066)*-.' 7 L
 l+G}%%%d+<&=>3%: ;< 7F,,==	// O >
 "",V,,9  s   C( (
C54C5)r   r   r{   	list[str])r?   zSequence[Path]r   r  r{   r  )rN  r   r{   zwarnings.WarningMessage)#
__future__r   collections.abcr   enumr   rq   pathlibr   r   r   typingr   r   r   r	   r.   r  r1   r   xdist.pluginr
   xdist.remoter   r   r   r   r!   RSyncr   r   Enumr   rZ   rb  r   rJ   r   <module>r     s    " $   	  	 
         "  ! #$cU cUL)< )<X:TYY tF tFn&-rJ   