o
    v&iO                     @  s   d 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ZddlZddl	m
Z
 ddlmZ dZejjZejZG dd deZG d	d
 d
ZdddZdS )z>Monkey-patching to add multiprocessing support for coverage.py    )annotationsN)Any)DebugControlz_coverage$patchedc                   @  s   e Zd ZdZdd ZdS )ProcessWithCoveragez<A replacement for multiprocess.Process that starts coverage.c                 O  sp  d}z,ddl m} |ddd}d|_|  |j}|dusJ |dr&|}|r-|d W n tyI   td	t	j
d
 tjt	j
d
 t	j
   w z<t| g|R i |W |r]|d z
|  |  W n ty} } z
|rx|jd|d  d}~ww |r|d S S |r|d z
|  |  W n ty } z
|r|jd|d  d}~ww |r|d w w )z,Wrapper around _bootstrap to start coverage.Nr   )CoverageT)data_suffix	auto_dataF	multiprocz!Calling multiprocessing bootstrapz0Exception during multiprocessing bootstrap init:)filez"Finished multiprocessing bootstrapz2Exception during multiprocessing bootstrap cleanup)exczSaved multiprocessing data)coverager   _warn_preimported_sourcestart_debugshouldwrite	Exceptionprintsysstderr	traceback	print_excflushoriginal_bootstrapstopsave)selfargskwargsdebugr   covr   r    r!   X/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/coverage/multiproc.py
_bootstrap   sb   




zProcessWithCoverage._bootstrapN)__name__
__module____qualname____doc__r#   r!   r!   r!   r"   r      s    r   c                   @  s.   e Zd ZdZdddZdd	d
ZdddZdS )StowawayzLAn object to pickle, so when it is unpickled, it can apply the monkey-patch.rcfilestrreturnNonec                 C  s
   || _ d S )Nr)   )r   r)   r!   r!   r"   __init__E      
zStowaway.__init__dict[str, str]c                 C  s
   d| j iS Nr)   r-   )r   r!   r!   r"   __getstate__H   r/   zStowaway.__getstate__statec                 C  s   t |d  d S r1   )patch_multiprocessing)r   r3   r!   r!   r"   __setstate__K   s   zStowaway.__setstate__Nr)   r*   r+   r,   )r+   r0   )r3   r0   r+   r,   )r$   r%   r&   r'   r.   r2   r5   r!   r!   r!   r"   r(   B   s
    

r(   r)   r*   r+   r,   c              	     s|   t ttrdS tjt_tjtj	d< zddlm
} |j W n ttfy*   Y nw d fd	d
}||_tttd dS )zMonkey-patch the multiprocessing module.

    This enables coverage measurement of processes started by multiprocessing.
    This involves aggressive monkey-patching.

    `rcfile` is the path to the rcfile being used.

    NCOVERAGE_RCFILEr   )spawnnamer*   r+   dict[str, Any]c                   s    | }t |d< |S )z@Get the original preparation data, and also insert our stowaway.stowaway)r(   )r9   doriginal_get_preparation_datar)   r!   r"   "get_preparation_data_with_stowawayp   s   zApatch_multiprocessing.<locals>.get_preparation_data_with_stowawayT)r9   r*   r+   r:   )hasattrmultiprocessingPATCHED_MARKERr   r#   OriginalProcessospathabspathenvironr8   get_preparation_dataImportErrorAttributeErrorsetattr)r)   r8   r?   r!   r=   r"   r4   O   s   


r4   r6   )r'   
__future__r   rA   multiprocessing.processrD   os.pathr   r   typingr   coverage.debugr   rB   processBaseProcessrC   r#   r   r   r(   r4   r!   r!   r!   r"   <module>   s    '