o
    Á¿i  ã                   @   sþ   d 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 e
eƒZej d¡Zd	Zd
ZdZdedejeef fdd„Zdee deejeef ef fdd„Zdedejeedf dejedf defdd„ZG dd„ dƒZdS )z»
xdist-related functionality for pytest CI Visibility plugin.

This module contains all logic related to pytest-xdist parallelization mode detection
for ITR skipping level configuration.
é    N)Úpytest_Config)ÚITR_SKIPPING_LEVEL)Ú
get_logger)ÚInternalTestSession)ÚasboolÚPYTEST_XDIST_WORKERÚUNSETÚautoÚlogicalÚvalÚreturnc                 C   s2   | t tfv r| S zt| ƒW S  ty   t Y S w )z<Parse worker count value, handling auto/logical or integers.)Ú
XDIST_AUTOÚXDIST_LOGICALÚintÚ
ValueErrorÚXDIST_UNSET©r   © r   úZ/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/pytest/_xdist.pyÚparse_worker_value   s   
ÿr   Úargsc                    sH  dt ddf‡ ‡fdd„}t‰t‰ d}|t| ƒk r | | }|dkr5|d t| ƒk r5|| |d  ƒ |d7 }na| d¡rIt|ƒd	krI||d	d… ƒ nM|d
krb|d t| ƒk rb|| |d  ƒ |d7 }n4| d¡rr|| dd¡d ƒ n$|dkr‰|d t| ƒk r‰| |d  ‰ |d7 }n| d¡r–| dd¡d ‰ |d7 }|t| ƒk sˆˆ fS )zã
    Parse xdist-related arguments from command line args.

    Returns:
        tuple: (num_workers, dist_mode)
               num_workers can be int, "auto", "logical", or None
               dist_mode can be str or None
    r   r   Nc                    s>   t | ƒ‰ˆrtˆtƒsˆttfv rˆ tkrd‰ dS dS dS dS )z8Set num_workers and ensure dist_mode defaults to 'load'.ÚloadN)r   Ú
isinstancer   r   r   r   r   ©Ú	dist_modeÚnum_workersr   r   Úset_workers_and_dist1   s   ÿþûÿz8_parse_xdist_args_from_cmd.<locals>.set_workers_and_distr   z-né   é   z--numprocessesz--numprocesses=ú=z--distz--dist=)Ústrr   ÚlenÚ
startswithÚsplit)r   r   ÚiÚargr   r   r   Ú_parse_xdist_args_from_cmd'   s0   





är&   Úconfigr   r   c                 C   s:  t  d¡}|durt|ƒrtjntj}t d|¡ |S | r+| j 	d¡s+t d¡ tjS |t
krL| rLzt| jddƒ}t d|¡ W n tyK   d}Y nw |t
krm| rmzt| jddƒ}t d	|¡ W n tyl   d}Y nw |d
dt
fv r|t d¡ tjS |dkr‡d}t d¡ |dv r”t d|¡ tjS t d|¡ tjS )a  
    Detect pytest-xdist parallelization mode and return the appropriate ITR skipping level.

    Priority order:
    1. If _DD_CIVISIBILITY_ITR_SUITE_MODE is explicitly set -> honor it regardless of xdist
    2. If xdist is used -> automatic detection based on distribution mode
    3. Fallback -> default to suite mode

    Returns:
        ITR_SKIPPING_LEVEL.SUITE for suite-level parallelization modes (loadscope, loadfile, loadgroup)
        ITR_SKIPPING_LEVEL.TEST for test-level parallelization modes (default, worksteal)
    Ú_DD_CIVISIBILITY_ITR_SUITE_MODENzCExplicit ITR skipping level from _DD_CIVISIBILITY_ITR_SUITE_MODE=%sÚxdistz;xdist not available, using default ITR suite-level skippingÚnumprocessesz'DEBUG: num_workers read from config: %rÚdistz%DEBUG: dist_mode read from config: %rr   zSxdist not being used (no workers specified), using default ITR suite-level skippingÚnor   zAxdist being used without explicit --dist, defaulting to load mode)Ú	loadscopeÚloadfilezTDetected xdist suite-level parallelization mode (%s), using ITR suite-level skippingzRDetected xdist test-level parallelization mode (%s), using ITR test-level skipping)ÚosÚgetenvr   r   ÚSUITEÚTESTÚlogÚdebugÚpluginmanagerÚ	haspluginr   ÚgetattrÚoptionÚAttributeError)r'   r   r   Úexplicit_suite_modeÚresultr   r   r   Ú._skipping_level_for_xdist_parallelization_modea   sH   
þ
ÿÿ	

r<   c                   @   s(   e Zd Zejdd„ ƒZejdd„ ƒZdS )Ú
XdistHooksc                 C   s&   t  ¡ }|r
|j}nd}||jd< d S )Nr   Ú	root_span)r   Úget_spanÚspan_idÚworkerinput)ÚselfÚnodeÚmain_session_spanr>   r   r   r   Úpytest_configure_nodeª   s
   z XdistHooks.pytest_configure_nodec                 C   sD   t |dƒrd|jv r t tdƒsdt_t j|jd 7  _d S d S d S )NÚworkeroutputÚitr_skipped_countÚglobal_worker_itr_resultsr   )ÚhasattrrF   ÚpytestrH   )rB   rC   Úerrorr   r   r   Úpytest_testnodedown´   s
   
ýzXdistHooks.pytest_testnodedownN)Ú__name__Ú
__module__Ú__qualname__rJ   ÚhookimplrE   rL   r   r   r   r   r=   ©   s
    
	r=   ) Ú__doc__r/   ÚtypingÚtrJ   Ú&ddtrace.contrib.internal.pytest._typesr   Úddtrace.ext.test_visibilityr   Úddtrace.internal.loggerr   Ú$ddtrace.internal.test_visibility.apir   Úddtrace.internal.utils.formatsr   rM   r3   ÚenvironÚgetÚPYTEST_XDIST_WORKER_VALUEr   r   r   r    ÚUnionr   r   ÚlistÚtupler&   r<   r=   r   r   r   r   Ú<module>   s4    (
:ÿþý
üH