B
    ë¹`½9  ã               @   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	m
Z
 ddlmZ ddlmZ G dd„ deƒZejd	d
„ ƒZdd„ ZG dd„ deƒ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)ÚCoverageDataé   )ÚStringIO)Úcleanupc               @   s   e Zd Zedd„ ƒZdS )Ú	_NullFilec             C   s   d S )N© )Úvr   r   úY/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/pytest_cov/engine.pyÚwrite   s    z_NullFile.writeN)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr
   r   r   r   r	   r      s   r   c          
   c   s:   t | |ƒ}zt| |t |¡ƒ d V  W d t| ||ƒ X d S )N)ÚgetattrÚsetattrÚcopy)ÚobjÚattrÚbackupr   r   r	   Ú_backup   s
    

r   c                s   t  ˆ ¡‡ fdd„ƒ}|S )Nc          	      s\   yt  ¡ }W n tk
r$   d }Y nX t  | j¡ zˆ | f|ž|ŽS |d k	rVt  |¡ X d S )N)ÚosÚgetcwdÚOSErrorÚ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dd„Zejdd„ ƒZedd„ ƒZ	ed	d
„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS )ÚCovControllerz0Base class for different plugin implementations.Nc             C   s^   || _ || _|| _|| _|| _|| _|| _d| _d| _d| _	t
ƒ | _g | _t ¡ | _d| _dS )z8Get some common config used by multiple derived classes.N)Ú
cov_sourceÚ
cov_reportÚ
cov_configÚ
cov_appendÚ
cov_branchÚconfigÚnodeidÚcovÚcombining_covÚ	data_fileÚsetÚ
node_descsÚfailed_workersr   r   r   Úis_collocated)r   r%   r&   r'   r(   r)   r*   r+   r   r   r	   Ú__init__7   s    
zCovController.__init__c             c   s(   t  ¡ }t  | j¡ d V  t  |¡ d S )N)r   r   r   r   )r   r   r   r   r	   Úensure_topdirI   s    zCovController.ensure_topdirc             C   s   | j  ¡  |  ¡  d S )N)r,   ÚstopÚ	unset_env)r   r   r   r	   ÚpauseP   s    
zCovController.pausec             C   s   | j  ¡  |  ¡  d S )N)r,   ÚstartÚset_env)r   r   r   r	   ÚresumeU   s    
zCovController.resumec             C   sŠ   | j dkrtjtjd< ntj | j ¡tjd< tj | j¡}tj |¡rR|tjd< ntjtjd< tj | j	j
j¡tjd< | jr†dtjd< dS )zPPut info about coverage into the env so that subprocesses can activate coverage.NÚCOV_CORE_SOURCEÚCOV_CORE_CONFIGÚCOV_CORE_DATAFILEÚenabledÚCOV_CORE_BRANCH)r%   r   ÚpathsepÚenvironÚjoinÚpathÚabspathr'   Úexistsr,   r*   r.   r)   )r   Úconfig_filer   r   r	   r9   Z   s    
zCovController.set_envc               C   sJ   t j dd¡ t j dd¡ t j dd¡ t j dd¡ t j dd¡ dS )zRemove coverage info from env.r;   Nr<   r=   r?   ZCOV_CORE_CONTEXT)r   rA   Úpopr   r   r   r	   r6   j   s
    zCovController.unset_envc             C   s   d| d|dd…  f S )z"Return a description of this node.zplatform %s, python %sz%s.%s.%s-%s-%sNé   r   )ÚplatformÚversion_infor   r   r	   Úget_node_descs   s    zCovController.get_node_descc             C   sb   t | dƒr|  ||¡ nFtdt|ƒ dƒ}|d }|d }d|| ||||  f }|  |¡ d S )NÚsepéD   é   z	%s %s %s
)ÚhasattrrL   ÚmaxÚlenr
   )ÚstreamÚsÚtxtZ	sep_totalZsep_lenZ	sep_extraÚoutr   r   r	   rL   y   s    
zCovController.sepc       	   	      sœ  d}ˆ j s0tˆ jdƒ ˆ jjddtdS Q R X tˆ jƒdkrZˆ  |ddd ˆ j¡ ¡ n4ˆ  |dd	¡ x$t	ˆ jƒD ]}ˆ  |d
d| ¡ qtW ˆ j
rÎˆ  |dd¡ | d¡ x ˆ j
D ]}| d|jj ¡ q´W t‡ fdd„dD ƒƒrRdˆ j kpòdd|dœ}tˆ j tƒodˆ j  ¡ k}| d|p&di¡ tˆ jdƒ ˆ jjf |Ž}W dQ R X dˆ j krØˆ j d }tˆ jdƒ ˆ jjd|d W dQ R X tˆ jdƒ ˆ jjdtd}W dQ R X |rÎ| d| ¡ n
| d¡ dˆ j kr8ˆ j d }tˆ jdƒ ˆ jjd|d}W dQ R X | d|dkr0ˆ jjjn| ¡ dˆ j kr˜ˆ j d }tˆ jdƒ ˆ jjd|d}W dQ R X | d|dkrˆ jjjn| ¡ |S )zProduce coverage reports.Nr*   T)Zshow_missingÚignore_errorsÚfiler   ú-zcoverage: %sÚ Úcoverageú z%szcoverage: failed workerszlThe following workers failed to return coverage data, ensure that pytest-cov is installed on these workers.
z%s
c             3   s   | ]}|ˆ j kV  qd S )N)r&   )Ú.0Úx)r   r   r	   ú	<genexpr>ž   s    z(CovController.summary.<locals>.<genexpr>)Ztermzterm-missingzterm-missingzskip-coveredÚskip_coveredÚannotate)rV   Ú	directory)rV   rW   z,Coverage annotated source written to dir %s
z1Coverage annotated source written next to source
Úhtmlz Coverage HTML written to dir %s
Úxml)rV   Úoutfilez Coverage XML written to file %s
)r&   r   r,   Úreportr   rQ   r0   rL   rB   Úsortedr1   r
   ÚgatewayÚidÚanyÚ
isinstanceÚdictÚvaluesÚupdater`   Zhtml_reportr*   Zhtml_dirZ
xml_reportZ
xml_output)	r   rR   ÚtotalÚ	node_descÚnodeÚoptionsr_   Zannotate_dirÚoutputr   )r   r	   Úsummary„   sT    



"
"zCovController.summary)NN)r   r   r   Ú__doc__r3   Ú
contextlibÚcontextmanagerr4   r#   r7   r:   r9   r   r6   rK   rL   rs   r   r   r   r	   r$   4   s   
	r$   c               @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚCentralz)Implementation for centralised operation.c             C   sp   t ƒ  tj| j| jd| jd| _tj| j| jdtj 	| jj
j¡| jd| _| jsZ| j ¡  | j ¡  |  ¡  d S )NT)ÚsourceÚbranchÚdata_suffixrF   )rx   ry   rz   r.   rF   )r   rZ   ÚCoverager%   r)   r'   r,   r   rC   rD   r*   r.   r-   r(   Úeraser8   r9   )r   r   r   r	   r8   Í   s    

zCentral.startc             C   sb   |   ¡  | 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)r6   r,   r5   Úsaver-   ÚloadÚcombinerK   ÚsysrI   rJ   r0   Úadd)r   ro   r   r   r	   Úfinishá   s    




zCentral.finishN)r   r   r   rt   r#   r8   r‚   r   r   r   r	   rw   Ê   s   rw   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r,tj | j¡r,| jjj | j¡ t	j
| j| jd| jd| _d| j_d| j_d| j_t	j
| j| jdtj | jjj¡| jd| _| js˜| j ¡  | j ¡  | jg| jjjd< d S )NT)rx   ry   rz   rF   F)rx   ry   rz   r.   rF   rx   )r   r'   r   rC   rE   r*   ÚoptionZrsyncdirÚappendrZ   r{   r%   r)   r,   Z_warn_no_dataZ_warn_unimported_sourceZ_warn_preimported_sourcerD   r.   r-   r(   r|   r8   r   Úpaths)r   r   r   r	   r8   õ   s&    

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   )Ústr)r\   Úrootr   r   r	   ú
<listcomp>  s    z-DistMaster.configure_node.<locals>.<listcomp>)Úcov_master_hostÚcov_master_topdirZcov_master_rsync_rootsN)Úworkerinputrm   ÚsocketÚgethostnamer   ZnodemanagerÚroots)r   rp   r   r   r	   Úconfigure_node  s    zDistMaster.configure_nodec       
      C   s  t |di ƒ}d|kr$| j |¡ dS d|kròdt ¡ t ¡ t dd¡|d f }t	j
| j| j|| jd}| ¡  t	jd	k r tƒ }| t|d ƒ¡ |j |¡ n&td
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 )rx   ry   rz   rF   )rH   r   T)Zno_diskÚcov_worker_pathrx   )"r   r1   r…   r   rŽ   r   ÚgetpidÚrandomÚrandintrZ   r{   r%   r)   r'   r8   rJ   r   Zread_fileobjr   Údatarm   ÚloadsÚget_datar5   r}   r,   r*   r†   rg   Z_rinforK   rI   r0   r   )
r   rp   Úerrorrr   rz   r,   r˜   rC   Zrinforo   r   r   r	   Útestnodedown  s8    




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)r,   r5   r}   r-   r~   r   )r   r   r   r	   r‚   A  s    



zDistMaster.finishN)	r   r   r   rt   r#   r8   r   rœ   r‚   r   r   r   r	   rƒ   ò   s
   	*rƒ   c               @   s0   e Zd ZdZedd„ ƒZedd„ ƒZdd„ ZdS )	Ú
DistWorkerz'Implementation for distributed workers.c                s¨   t ƒ  t ¡ | jjd ko*| j| jjd k| _| jsx| jjd ‰ | j‰| jd k	rh‡ ‡fdd„| jD ƒ| _| j 	ˆ ˆ¡| _t
j| j| jd| jd| _| j ¡  |  ¡  d S )NrŠ   r‹   c                s   g | ]}|  ˆ ˆ¡‘qS r   )Úreplace)r\   rx   )Úmaster_topdirÚworker_topdirr   r	   r‰   _  s   z$DistWorker.start.<locals>.<listcomp>T)rx   ry   rz   rF   )r   r   rŽ   r*   rŒ   r   r2   r%   r'   rž   rZ   r{   r)   r,   r8   r9   )r   r   )rŸ   r    r	   r8   Q  s     

zDistWorker.startc             C   sš   |   ¡  | j ¡  | jr2| j ¡  | j| jjd< nd| j ¡  | j ¡  t	j
dk rntƒ }| jj |¡ | ¡ }n| j ¡  ¡ }| jj | j| j|dœ¡ dS )z8Stop coverage and send relevant info back to the master.r’   )rH   r   )r”   r’   r“   N)r6   r,   r5   r2   r}   r+   r*   r‘   r   rZ   rJ   r   r˜   Zwrite_fileobjÚgetvaluerš   Údumpsrm   r   )r   Zbuffr˜   r   r   r	   r‚   k  s     





zDistWorker.finishc             C   s   dS )z&Only the master reports so do nothing.Nr   )r   rR   r   r   r	   rs     s    zDistWorker.summaryN)r   r   r   rt   r#   r8   r‚   rs   r   r   r   r	   r   N  s   $r   )rt   ru   r   r!   r   r–   r   r€   rZ   Zcoverage.datar   Úcompatr   Úembedr   Úobjectr   rv   r   r#   r$   rw   rƒ   r   r   r   r   r	   Ú<module>   s&   
 (\