o
    v&i	C                     @   s  d 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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ZddlmZ ddlmZ ddlmZ dd	lmZ G d
d deZG dd dZejdd Zdd ZG dd dZG dd deZG dd deZG dd deZ dS )z8Coverage controllers for use by pytest-cov and nose-cov.    N)Path)Union)CoverageData)filename_suffix   )CentralCovContextWarning)DistCovErrorc                   @   s   e Zd ZdS )BrokenCovConfigErrorN)__name__
__module____qualname__ r   r   W/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pytest_cov/engine.pyr	      s    r	   c                   @   s   e Zd Zedd ZdS )	_NullFilec                 C   s   d S Nr   )vr   r   r   write   s   z_NullFile.writeN)r
   r   r   staticmethodr   r   r   r   r   r      s    r   c              
   c   sF    t | |}zt| |t| d V  W t| || d S t| || w r   )getattrsetattrcopy)objattrbackupr   r   r   _backup"   s   
r   c                    s   t   fdd}|S )Nc              	      st   zt  }W n ty   d }Y nw t| j z | g|R i |W |d ur.t| S S |d ur9t| w w r   )r   cwdOSErroroschdirtopdir)selfargskwargsoriginal_cwdmethr   r   ensure_topdir_wrapper-   s   
z-_ensure_topdir.<locals>.ensure_topdir_wrapper)	functoolswraps)r%   r&   r   r$   r   _ensure_topdir,   s   r)   c                   @   s   e Zd ZdZdejdedef dedef fddZ	e
jdd	 Zed
d Zedd Zdd Zdd Zedd Zedd Zdd Zedd ZdS )CovControllerz0Base class for different plugin implementations.optionsconfigNnodeidc                 C   s|   |j | _ |j| _|j| _|j| _|j| _|j| _|| _|| _d| _d| _	d| _
t | _g | _tt | _d| _d| _dS )z8Get some common config used by multiple derived classes.NF)
cov_source
cov_report
cov_config
cov_append
cov_branchcov_precisionr,   r-   covcombining_cov	data_fileset
node_descsfailed_workersr   fspathr   r   r   is_collocatedstarted)r    r+   r,   r-   r   r   r   __init__B   s    
zCovController.__init__c                 c   s*    t  }t| j d V  t| d S r   )r   r   r   r   r   )r    r#   r   r   r   ensure_topdirV   s
   zCovController.ensure_topdirc                 C   s   d| _ | j  d S NF)r<   r4   stopr    r   r   r   pause]   s   zCovController.pausec                 C   s   | j   d| _d S NT)r4   startr<   rA   r   r   r   resumeb   s   

zCovController.resumec                 C   
   d| _ d S rC   r<   rA   r   r   r   rD   g      
zCovController.startc                 C   rF   r?   rG   rA   r   r   r   finishj   rH   zCovController.finishc                 C   s   d | dj |dd  S )z"Return a description of this node.zplatform {}, python {}z{}.{}.{}-{}-{}N   )format)platformversion_infor   r   r   get_node_descm   s   zCovController.get_node_descc                  C   s    t jdd\} }| dk rd} | S )N)P      )fallback(   rO   )shutilget_terminal_size)width_r   r   r   	get_widths   s   zCovController.get_widthc                 C   s   t |dr||| d S |  }tjdkr|d8 }t|t| d dt|  d}|| }| d| d| }t|t|  |krK|| 7 }|d7 }|| d S )Nsepwin32r       z

)	hasattrrX   rW   sysrL   maxlenrstripr   )r    streamstxt	fullwidthNfillliner   r   r   rX   |   s   

"zCovController.sepc           
   	      sT  d} j s$t jd  jjddtdW  d   S 1 sw   Y  t jdkr: |ddd j  n |dd	 t	 jD ]
} |d
|  qF j
rp |dd |d  j
D ]}||jj d qct fdddD rd j v pdd| jd}t j tod j  v }|d|pdi t jd  jjd*i |}W d   n1 sw   Y  d j v r j d }t jd  jjd|d W d   n1 sw   Y  t jd  jjdtd}W d   n1 sw   Y  |r|d| d n|d d j v rS j d }t jd  jjd|d}W d   n	1 s;w   Y  |d|du rM jjjn| d d j v r j d }t jd  jjd|d}W d   n	1 sxw   Y  |d|du r jjjn| d d j v rˈ j d }t jd  jjd|d}W d   n	1 sw   Y  |d |du rǈ jjjn|  d! j v r j d! }t jd) t|d"}	 jjd|	d!d#}W d   n	1 sw   Y  W d   n	1 s	w   Y  |d$| d d% j v rc j d% }t jd) t|d&}	 jjd|	d!d#}W d   n	1 sEw   Y  W d   n	1 sUw   Y  |d'| d d( j v r j d( }t jd  jjd|d  jjdtd}W d   n	1 sw   Y  |d)|du r jjjn| d |S )+zProduce coverage reports.Nr,   T)show_missingignore_errorsfiler   rV   z
coverage:  coverager[   zcoverage: failed workerszlThe following workers failed to return coverage data, ensure that pytest-cov is installed on these workers.

c                 3   s    | ]}| j v V  qd S r   )r/   ).0xrA   r   r   	<genexpr>   s    z(CovController.summary.<locals>.<genexpr>)termterm-missingrr   )rh   ri   rj   	precisionzskip-coveredskip_coveredannotate)ri   	directory)ri   rj   z)Coverage annotated source written to dir z1Coverage annotated source written next to source
htmlzCoverage HTML written to dir xml)ri   outfilezCoverage XML written to file jsonz!Coverage JSON written to file %s
markdownw)ri   rj   output_formatz.Coverage Markdown information written to file zmarkdown-appendaz/Coverage Markdown information appended to file lcovzCoverage LCOV written to file r   ) r/   r   r4   reportr   r_   r8   rX   joinsortedr9   r   gatewayidanyr3   
isinstancedictvaluesupdateru   html_reportr,   html_dir
xml_report
xml_outputjson_reportjson_outputr   openlcov_reportlcov_output)
r    ra   total	node_descnoder+   rt   annotate_diroutputoutput_filer   rA   r   summary   s    




&
&
"


&zCovController.summary)r
   r   r   __doc__argparse	Namespacer   objectstrr=   
contextlibcontextmanagerr>   r)   rB   rE   rD   rI   r   rN   rW   rX   r   r   r   r   r   r*   ?   s$    (




r*   c                       s4   e Zd ZdZe fddZe fddZ  ZS )Centralz)Implementation for centralised operation.c                    s   t j| j| jd| jd| _| jjjdkrd}tj	t
|dd t j| j| jtd dtj| jjj| jd| _| jsA| j  | j  t   d S )	NTsourcebranchdata_suffixconfig_filetest_functionzDetected dynamic_context=test_function in coverage configuration. This is unnecessary as this plugin provides the more complete --cov-context option.r   )
stacklevel.combiner   r   r   r6   r   )rl   Coverager.   r2   r0   r4   r,   dynamic_contextwarningswarnr   r   r   pathabspathr6   r5   r1   eraserD   super)r    message	__class__r   r   rD     s*   	

zCentral.startc                    sd   t    | j  | j  | j| _| j  | j  | j  | t	j
t	j}| j| dS )zSStop coverage, save data to file and set the list of coverage objects to report on.N)r   rI   r4   r@   saver5   loadcombinerN   r]   rL   rM   r8   add)r    r   r   r   r   rI      s   





zCentral.finish)r
   r   r   r   r)   rD   rI   __classcell__r   r   r   r   r      s    r   c                   @   s8   e Zd ZdZedd Zdd Zdd Zedd	 Zd
S )
DistMasterz&Implementation for distributed master.c                 C   s   t j| j| jd| jd| _| jjjdkrtdd| j_	d| j_
d| j_t j| j| jtd dtj| jjj| jd| _| jsF| j  | j  | jg| jjjd< d S )	NTr   r   zDetected dynamic_context=test_function in coverage configuration. This is known to cause issues when using xdist, see: https://github.com/pytest-dev/pytest-cov/issues/604
It is recommended to use --cov-context instead.Fr   r   r   )rl   r   r.   r2   r0   r4   r,   r   r   _warn_no_data_warn_unimported_source_warn_preimported_sourcer   r   r   r   r6   r5   r1   r   rD   r   pathsrA   r   r   r   rD   4  s0   

zDistMaster.startc                 C   s,   |j t | jdd |jjD d dS )zFWorkers need to know if they are collocated and what files have moved.c                 S   s   g | ]}t |qS r   )r   )rn   rootr   r   r   
<listcomp>X  s    z-DistMaster.configure_node.<locals>.<listcomp>)cov_master_hostcov_master_topdircov_master_rsync_rootsN)workerinputr   socketgethostnamer   nodemanagerroots)r    r   r   r   r   configure_nodeQ  s   zDistMaster.configure_nodec           	      C   s   t |di }d|vr| j| dS d|v rBdt t tdd|d f }t	|d}|
|d  |d	 }| jjjd
 | |j }| |j|j}| j| dS )z#Collect data file name from worker.workeroutputcov_worker_node_idNcov_worker_dataz%s.%s.%06d.%sr   i?B )suffixcov_worker_pathr   )r   r9   appendr   r   r   getpidrandomrandintr   loadsr4   r,   r   r   _rinforN   rL   rM   r8   r   )	r    r   errorr   r   cov_datar   rinfor   r   r   r   testnodedown\  s(   

zDistMaster.testnodedownc                 C   s>   | j   | j   | j| _ | j   | j   | j   dS )zJCombines coverage data and sets the list of coverage objects to report on.N)r4   r@   r   r5   r   r   rA   r   r   r   rI   |  s   



zDistMaster.finishN)	r
   r   r   r   r)   rD   r   r   rI   r   r   r   r   r   1  s    
 r   c                       s<   e Zd ZdZe fddZe fddZdd Z  ZS )
DistWorkerz'Implementation for distributed workers.c                    s   t  | jjd ko| j| jjd k| _| js9| jjd  | j| jd ur1 fdd| jD | _| j | _t	j
| j| jd| jd| _d| j_| j  t   d S )Nr   r   c                    s   g | ]}|  qS r   )replace)rn   r   master_topdirworker_topdirr   r   r     s    z$DistWorker.start.<locals>.<listcomp>Tr   F)r   r   r,   r   r   r;   r.   r0   r   rl   r   r2   r4   r   rD   r   rA   r   r   r   rD     s$   

zDistWorker.startc                    sv   t    | j  | jr| j  | j| jjd< dS | j	  | j  | j
  }| jj| j| j|d dS )z8Stop coverage and send relevant info back to the master.r   )r   r   r   N)r   rI   r4   r@   r;   r   r-   r,   r   r   get_datadumpsr   r   )r    datar   r   r   rI     s   




zDistWorker.finishc                 C   s   dS )z&Only the master reports so do nothing.Nr   )r    ra   r   r   r   r     s    zDistWorker.summary)	r
   r   r   r   r)   rD   rI   r   r   r   r   r   r   r     s    !r   )!r   r   r   r   r'   r   r   rS   r   r]   r   pathlibr   typingr   rl   coverage.datar   coverage.sqldatar   rk   r   r   	Exceptionr	   r   r   r   r)   r*   r   r   r   r   r   r   r   <module>   s8    
	 A2X