o
    %if(G                     @  s*  d dl mZ d dlZd dlZd dlZd dlm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Zd dlZd dlZd dlZd d	lmZ d dlZd d
lmZ d dlmZ d$ddZG dd dZG dd dejZd%ddZG dd dejZG dd dZ d&d"d#Z!dS )'    )annotationsN)Path)Any)Callable)Literal)Sequence)Union)	_sys_path)Producer)
WorkerInfoconfigpytest.Configreturn	list[str]c              	   C  s   g }|  d}|D ].}|d}z
t|d | }W n ty(   || Y q	w |||d d  g|  q	|s?td|S )Ntx*   z6MISSING test execution (tx) nodes: please specify --tx)getvaluefindint
ValueErrorappendextendpytest
UsageError)r   	xspeclistr   xspecinum r   K/var/www/html/corbot_env/lib/python3.10/site-packages/xdist/workermanage.pyparse_spec_config   s   

r!   c                   @  s   e Zd ZdZg dZ		d3d4ddZd5ddZd6ddZd7ddZd8ddZ	d9d d!Z
d:d#d$Zd;d&d'Z		(	d<d=d1d2ZdS )>NodeManager
   )z.*z*.pycz*.pyoz*~Npyexecnetcacher   r   specs$Sequence[execnet.XSpec | str] | Nonedefaultchdirstrr   Nonec                 C  s   || _ | j jd| _| j d| _| jd u rt j| _tj	dd| _
|d u r,|  }g | _|D ]2}t|tjs>t|}t|dd dkrNtd| }|jsW|jsW||_| j
| | j| q1|  | _|  | _t | _d S )Nnodemanager
testrunuidmain_thread_only)	execmodelr-   execmodel=main_thread_only//)r   traceget	getoptionr+   uuiduuid4hexexecnetGroupgroup
_getxspecsr%   
isinstanceXSpecgetattrchdirpopenallocate_idr   _getrsyncdirsroots_getrsyncoptionsrsyncoptionsset_rsynced_specs)selfr   r%   r'   specr   r   r    __init__0   s*   



zNodeManager.__init__gatewayexecnet.Gatewayc                 C  s0   | j r| j D ]}| j||fi | j qdS dS )z1Rsync the set of roots to the node's gateway cwd.N)r@   rsyncrB   )rE   rH   rootr   r   r    rsync_rootsL   s
   
zNodeManager.rsync_rootsputevent,Callable[[tuple[str, dict[str, Any]]], None]list[WorkerController]c                   s6   j jjj jd d  fddjD S )N)r   r%   zsetting up nodesc                   s   g | ]} | qS r   )
setup_node).0rF   rM   rE   r   r    
<listcomp>X   s    z+NodeManager.setup_nodes.<locals>.<listcomp>)r   hookpytest_xdist_setupnodesr%   r/   )rE   rM   r   rR   r    setup_nodesR   s   
zNodeManager.setup_nodesrF   execnet.XSpecWorkerControllerc                 C  sv   t |dd dkrtd| }| j|}| jjj|d | | t	| || j|}||_
|  | d|  |S )Nr-   r,   r.   )rH   zstarted node %r)r;   r5   r:   r7   makegatewayr   rT   pytest_xdist_newgatewayrL   rX   nodesetupr/   )rE   rF   rM   gwr[   r   r   r    rP   Z   s   
zNodeManager.setup_nodec                 C  s   | j | j d S N)r7   	terminateEXIT_TIMEOUTrE   r   r   r    teardown_nodesk      zNodeManager.teardown_nodeslist[execnet.XSpec]c                 C  s   dd t | jD S )Nc                 S  s   g | ]}t |qS r   )r5   r:   rQ   xr   r   r    rS   o   s    z*NodeManager._getxspecs.<locals>.<listcomp>)r!   r   ra   r   r   r    r8   n   s   zNodeManager._getxspecs
list[Path]c                 C  s   | j D ]
}|jr|jr nqg S dd l}dd l}d	dd}||j}||j}| j}||g}||jj7 }|	d}	|	r@|
|	 g }
|D ]}t| }| sX|d|||
vra|
| qD|
S )
Nr   pr(   r   c                 S  s*   |  d}tj|dkrtj| S |S )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)rh   strippedr   r   r    get_dirz   s   
z*NodeManager._getrsyncdirs.<locals>.get_dir	rsyncdirszrsyncdir doesn't exist: )rh   r(   r   r(   )r%   r=   r<   _pytestr   __file__r   optionrsyncdirgetinir   r   resolveexistsr   r   )rE   rF   rr   r   rp   
pytestpath	pytestdirr   
candidates
rsyncrootsr@   rK   	root_pathr   r   r    r?   q   s2   






zNodeManager._getrsyncdirsdict[str, Any]c                 C  sR   t | j}|dd | jjjD 7 }|dd | jdD 7 }|t| jjdddS )z#Get options to be passed for rsync.c                 S     g | ]}t |qS r   r(   rQ   rl   r   r   r    rS          z0NodeManager._getrsyncoptions.<locals>.<listcomp>c                 S  r   r   r   r   r   r   r    rS      r   rsyncignoreverboser   ignoresr   )listDEFAULT_IGNORESr   rt   r   rv   r;   )rE   r   r   r   r    rA      s   
zNodeManager._getrsyncoptionsFsourcestr | os.PathLike[str]notifyBCallable[[str, execnet.XSpec, str | os.PathLike[str]], Any] | Noner   r   r   Sequence[str] | Nonec                   s   t |dk|d}|jjr#js#|dtjt 	  dS f| j
v r,dS d fdd}|j||d	 | j
f | jjj|gd
 |  | jjj|gd
 dS )z'Perform rsync to remote hosts for node.r   )r   r   zA
                import sys ; sys.path.insert(0, %r)
            Nr   r)   c                     s    r
 d d S d S )Nrsyncrootreadyr   r   r   r   rF   r   r    finished   s   z#NodeManager.rsync.<locals>.finished)r   )r   gatewaysr   r)   )	HostRSyncrF   r=   r<   remote_execrk   rl   rn   r(   	waitcloserD   add_target_hostaddr   rT   pytest_xdist_rsyncstartsendpytest_xdist_rsyncfinish)rE   rH   r   r   r   r   rJ   r   r   r   r    rJ      s$   zNodeManager.rsync)Nr$   )r   r   r%   r&   r'   r(   r   r)   )rH   rI   r   r)   )rM   rN   r   rO   )rF   rW   rM   rN   r   rX   r   )r   rd   )r   rg   )r   r~   )NFN)rH   rI   r   r   r   r   r   r   r   r   r   r)   )__name__
__module____qualname__r`   r   rG   rL   rV   rP   rb   r8   r?   rA   rJ   r   r   r   r    r"   ,   s"    






"r"   c                      s\   e Zd ZdZeedf Zdddd fddZdddZ	dd  fddZ	d!ddZ
  ZS )"r   z&RSyncer that filters out common files.zos.PathLike[str]NTr   	sourcedirPathLiker   Sequence[PathLike] | Noner   boolr   r)   c                  s4   |d u rg }dd |D | _ t jt||d d S )Nc              	   S  s"   g | ]}t tt|qS r   )recompilefnmatch	translaterk   fspathre   r   r   r    rS      s   " z&HostRSync.__init__.<locals>.<listcomp>)r   r   )_ignoressuperrG   r   )rE   r   r   r   	__class__r   r    rG      s   zHostRSync.__init__rl   c                 C  s8   t |}| jD ]}||js|t|r dS qdS )NFT)r   r   matchnamer(   )rE   rl   crer   r   r    filter   s   
zHostRSync.filterrH   rI   r   Callable[[], None] | Nonec                   s&   t j| j}t j|||dd d S )NT)finishedcallbackdelete)rk   rl   rm   
_sourcedirr   
add_target)rE   rH   r   
remotepathr   r   r    r      s   zHostRSync.add_target_hostmodified_rel_pathr(   c                 C  sJ   | j dkr#tj| jd | }|jj}t|j d| d|  d S d S )Nr   /:z <= )_verboserk   rl   rm   r   rF   r<   print)rE   rH   r   rl   r   r   r   r    _report_send_file   s
   
zHostRSync._report_send_file)r   r   r   r   r   r   r   r)   )rl   r   r   r   r^   )rH   rI   r   r   r   r)   )rH   rI   r   r(   r   r)   )r   r   r   __doc__r   r(   r   rG   r   r   r   __classcell__r   r   r   r    r      s    
r   r@   Sequence[Path]argsc           
   
   C  s   d}g }|D ]b}| |}t|d }z| }W n ty$   d}Y nw |s-|| q| D ](}z||}	W n tyC   d }	Y nw |	sJ||krW|jd t|	 |d<  n	q/td| d||	| q|S )Nz::r   Fr   zarg z not relative to an rsync root)
splitr   rx   OSErrorr   relative_tor   r   r(   join)
r@   r   	splitcoderesultargpartsr   rx   rK   rf   r   r   r    make_reltoroot   s4   

r   c                   @  s   e Zd ZdZdS )MarkerN)r   r   r   ENDr   r   r   r    r     s    r   c                   @  s   e Zd ZU ded< G dd dZd2ddZd3ddZed4ddZd5ddZ	d5ddZ
d6ddZd5dd Zd6d!d"Zd5d#d$Zd7d(d)Zd8d+d,Zd9d/d0Zd1S ):rX   r   
workerinfoc                   @  s"   e Zd ZejdddddZdS )	zWorkerController.RemoteHookT)trylastr   r   c                 C  s   t jS r^   )xdistremotera   r   r   r    pytest_xdist_getremotemodule  s   z8WorkerController.RemoteHook.pytest_xdist_getremotemoduleN)r   r   )r   r   r   r   hookimplr   r   r   r   r    
RemoteHook  s    
r   r*   r"   rH   rI   r   r   rM   rN   r   r)   c                 C  sn   |j |   || _|| _|| _|| _|jt|j	|j
tjd| _d| _d| _td|j |jjd| _d S )N)workeridworkercountr+   mainargvFz
workerctl-)enabled)pluginmanagerregisterr   r*   rM   rH   r   idlenr%   r+   sysargvworkerinput_down_shutdown_sentr
   rt   debuglog)rE   r*   rH   r   rM   r   r   r    rG     s   zWorkerController.__init__r(   c                 C  s   d| j j d| jj dS )N< >)r   r   rH   r   ra   r   r   r    __repr__2  s   zWorkerController.__repr__r   c                 C  s   | j p| jS r^   )r   r   ra   r   r   r    shutting_down5  s   zWorkerController.shutting_downc                 C  s   |  d | j  | jj}dd | jjjpdD }i }|jr"|jr)t	| j
j|}|jrFd| jj }t| jdrF| jj }t|| |d< | jjj| d | jj }| j|| _| jjjrbtnd }| j| j|||f | jr~| jj| jtjd	 d S d S )
Nzsetting up worker sessionc                 S  r   r   r   re   r   r   r    rS   A  r   z*WorkerController.setup.<locals>.<listcomp>r   zpopen-%s_tmp_path_factorybasetempr[   )	endmarker)r   rH   _rinforF   r   invocation_paramsr   r=   r<   r   r*   r@   r   hasattrr   getbasetempr(   rT   pytest_configure_noder   r   channelr	   r   r   rM   setcallbackprocess_from_remoter   r   )rE   rF   r   option_dictr   r   remote_modulechange_sys_pathr   r   r    r\   9  s(   

zWorkerController.setupc                 C  sV   t | dr| j s| d| j | j  t | dr)| d| j | j  d S d S )Nr   closingrH   exiting)r   r   isclosedr   closerH   exitra   r   r   r    ensure_teardownW  s   



z WorkerController.ensure_teardownindicesSequence[int]c                 C     | j d|d d S )Nruntestsr   sendcommandrE   r   r   r   r    send_runtest_someb  rc   z"WorkerController.send_runtest_somec                 C  s   |  d d S )Nruntests_allr   ra   r   r   r    send_runtest_alle  s   z!WorkerController.send_runtest_allc                 C  r   )Nstealr   r   r  r   r   r    
send_stealh  rc   zWorkerController.send_stealc                 C  s6   | j sz| d W n	 ty   Y nw d| _d S d S )NshutdownT)r   r  r   r   ra   r   r   r    r  k  s   
zWorkerController.shutdownr   kwargsobjectc                 K  s,   |  d| d| d | j||f dS )z4Send a named parametrized command to the other side.zsending command (**)N)r   r   r   )rE   r   r	  r   r   r    r  s  s   zWorkerController.sendcommand	eventnamec                 K  s*   |  d| d| d | ||f d S )Nzqueuing r  r  )r   rM   )rE   r  r	  r   r   r    notify_inprocx  s   zWorkerController.notify_inproc	eventcall0tuple[str, dict[str, Any]] | Literal[Marker.END]c           	      C  s  z"|t ju r&| j }| js#|rt|trd}| jd| |d d| _W dS |\}}|dv r=| d| d| d	 W dS |d
krO| j|fd| i| W dS |dkra| j|fd| i| W dS |dkrwd| _|d | _	| jd| d W dS |dv r| j|fd| i| W dS |dv r|
dd}| jjj| j|d d}|dur||_| j|| |d W dS |dkr| j|| |d d W dS |dkr| j|fd| i| W dS |dkr| j|fd| i| W dS |dkr| j||d |d |d |d d W dS |d krt|d! }| j|||d" |d |d# d$ W dS td%|  ty,     tyR   tj }td&| | j| |   | jd| |d Y dS w )'a
  This 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 (r  workerreadyr[   internal_errorworkerfinishedworkeroutputr   )logstart	logfinish)
testreportcollectreportteardownreport
item_indexdata)r   r  )r[   repcollectionfinishids)r[   r"  runtest_protocol_completeunscheduled
logwarningmessagecodenodeid)r&  r'  r(  
fslocationwarning_recordedwarning_message_datawhenlocation)warning_messager,  r(  r-  zunknown event: z!!!!!!!!!!!!!!!!!!!!)r   r   r   _getremoteerrorr   r9   EOFErrorr  r   r  popr   rT   pytest_report_from_serializabler  unserialize_warning_messager   KeyboardInterruptBaseExceptionr   ExceptionInfofrom_currentr   notify_exceptionr  )	rE   r  errr  r	  r  r   r.  excinfor   r   r    r   |  s   







z$WorkerController.process_from_remoteN)
r*   r"   rH   rI   r   r   rM   rN   r   r)   )r   r(   )r   r   r   )r   r   r   r)   )r   r(   r	  r
  r   r)   )r  r(   r	  r
  r   r)   )r  r  r   r)   )r   r   r   __annotations__r   rG   r   propertyr   r\   r   r  r  r  r  r  r  r   r   r   r   r    rX     s    
 









rX   r  r~   warnings.WarningMessagec           	      C  s   dd l }| d rG|| d }t|| d }d }| d d ur0z|| d  }W n	 ty/   Y nw |d u rFdj| d | d | d d}t|}n| d }| d r^|| d }t|| d	 }nd }||d
}tjjD ]}|d
v rpqi| | ||< qitjdi |S )Nr   message_modulemessage_class_namemessage_argsz{mod}.{cls}: {msg}message_str)modclsmsgcategory_modulecategory_class_name)r&  categoryr   )		importlibimport_moduler;   	TypeErrorformatWarningwarningsWarningMessage_WARNING_DETAILS)	r  rH  rB  rC  r&  message_textrG  r	  	attr_namer   r   r    r3    s<   
r3  )r   r   r   r   )r@   r   r   r   r   r   )r  r~   r   r=  )"
__future__r   enumr   rk   pathlibr   r   r   typingr   r   r   r   r   r2   rM  r5   r   xdist.pluginr	   xdist.remoter   r
   r   r!   r"   RSyncr   r   Enumr   rX   r3  r   r   r   r    <module>   s:    
 
, 8