B
    ë¹`©6  ã               @   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mZ ddlmZ G dd„ de	ƒZ
dd	„ Zd
d„ Zdd„ ZG dd„ dejƒZdd„ Zdd„ Zejjdd„ ƒZG dd„ deƒZG dd„ deƒZejdd„ ƒZejdd„ ƒZdd„ ZdS ) zCoverage plugin for pytest.é    Né   )Úcompat)Úembedc               @   s   e Zd ZdZdS )ÚCoverageErrorz&Indicates that our coverage is too lowN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r
   r
   úY/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/pytest_cov/plugin.pyr      s   r   c       	      C   s®   dddg}ddg}dg}|| }|   dd¡}|d	 }||d
g krXd | |¡}t |¡‚t|ƒdkrl|d fS |d }||krŒ||krŒ||fS ||krªd | |¡}t |¡‚|S )NZannotateÚhtmlÚxmlÚtermzterm-missingzskip-coveredú:r   r   Ú z'invalid choice: "{}" (choose from "{}")z;output specifier not supported for: "{}" (choose from "{}"))ÚsplitÚformatÚargparseÚArgumentTypeErrorÚlen)	ÚargZfile_choicesZterm_choicesZterm_modifier_choicesZall_choicesÚvaluesÚreport_typeÚmsgZreport_modifierr
   r
   r   Úvalidate_report   s&    


r   c             C   s&   yt | ƒS  tk
r    t| ƒS X d S )N)ÚintÚ
ValueErrorÚfloat)Znum_strr
   r
   r   Úvalidate_fail_under+   s    r   c             C   s*   t jdkrt d¡‚| dkr&t d¡‚| S )N)é   r   z3Contexts are only supported with coverage.py >= 5.xÚtestz.--cov-context=test is the only supported value)ÚcoverageÚversion_infor   r   )r   r
   r
   r   Úvalidate_context2   s
    


r#   c               @   s   e Zd Zddd„ZdS )ÚStoreReportNc             C   s   |\}}||j |< d S )N)Ú
cov_report)ÚselfÚparserÚ	namespacer   Úoption_stringr   Úfiler
   r
   r   Ú__call__;   s    zStoreReport.__call__)N)r   r   r   r+   r
   r
   r
   r   r$   :   s   r$   c          
   C   sÄ   |   dd¡}|jddg ddddd	d
 |jdti dtdd |jdddddd |jddddd |jddddd |jdddtdd |jd ddd!d |jd"dd#d$d |jd%dd&td'd d#S )(z Add options to control coverage.Úcovz3coverage reporting with distributed testing supportz--covÚappendZSOURCEú?TÚ
cov_sourcez‚Path or package name to measure during execution (multi-allowed). Use --cov= to not do any source filtering and record everything.)ÚactionÚdefaultÚmetavarÚnargsÚconstÚdestÚhelpz--cov-reportZTYPEa  Type of report to generate: term, term-missing, annotate, html, xml (multi-allowed). term, term-missing may be followed by ":skip-covered". annotate, html and xml may be followed by ":DEST" where DEST specifies the output location. Use --cov-report= to not generate any output.)r0   r1   r2   Útyper6   z--cov-configÚstorez.coveragercÚPATHz.Config file for coverage. Default: .coveragerc)r0   r1   r2   r6   z--no-cov-on-failÚ
store_trueFz8Do not report coverage if test run fails. Default: False)r0   r1   r6   z--no-covzIDisable coverage report completely (useful for debuggers). Default: Falsez--cov-fail-underZMINz,Fail if the total coverage is less than MIN.)r0   r2   r7   r6   z--cov-appendz<Do not delete coverage but append to current. Default: Falsez--cov-branchNzEnable branch coverage.z--cov-contextZCONTEXTz(Dynamic contexts to use. "test" for now.)ZgetgroupZ	addoptionr$   r   r   r#   )r'   Úgroupr
   r
   r   Úpytest_addoption@   s2    







r<   c             C   s   d| krdS dd„ | D ƒS )z«
    Prepare cov_source so that:

     --cov --cov=foobar is equivalent to --cov (cov_source=None)
     --cov=foo --cov=bar is equivalent to cov_source=['foo', 'bar']
    TNc             S   s   g | ]}|d k	r|‘qS )Tr
   )Ú.0Úpathr
   r
   r   ú
<listcomp>n   s    z'_prepare_cov_source.<locals>.<listcomp>r
   )r/   r
   r
   r   Ú_prepare_cov_sourceg   s    r@   c             C   sp   | j }d }|_x8|D ]0}t|ƒ}|dkr0d}q| d¡r|rd|_P qW | j jrlt|| jƒ}| j |d¡ d S )NFz--no-covTz--covÚ_cov)Zknown_args_namespaceÚno_cov_should_warnÚstrÚ
startswithr/   Ú	CovPluginÚpluginmanagerÚregister)Zearly_configr'   ÚargsÚoptionsÚno_covr   Úpluginr
   r
   r   Úpytest_load_initial_conftestsq   s    

rL   c               @   s”   e Zd ZdZddd„Zd dd„Zd	d
„ Zdd„ Zdd„ Zde_	dd„ Z
de
_	dd„ Zdd„ Zejdd„ ƒZdd„ Zdd„ Zdd„ Zejdd„ ƒZdS )!rE   zÛUse coverage package to produce code coverage reports.

    Delegates all work to a particular implementation based on whether
    this test process is centralised, a distributed master or a
    distributed worker.
    TFc             C   sö   d| _ d| _t ¡ | _d| _d| _d| _d| _d| _	|| _
t|ddƒp`t|ddƒp`t|ddƒdk}t|ddƒrxd| _	dS | j
jsŒd	g| j
_n$t| j
jƒd
kr°d| j
jkr°i | j
_t| j
jƒ| j
_d
dlm} |râ|râ|  |j¡ n|rò|  |j¡ dS )zÑCreates a coverage pytest plugin.

        We read the rc file that coverage uses to get the data file
        name.  This is needed since we give coverage through it's API
        the data file name.
        NFZnumprocessesZdistloadÚdistÚnorJ   Tr   r   r   )Úengine)ÚpidÚcov_controllerr   ÚStringIOr%   Ú	cov_totalÚfailedÚ_startedÚ_start_pathÚ	_disabledrI   Úgetattrr   r@   r/   r   rO   ÚstartZ
DistMasterÚCentral)r&   rI   rF   rY   rB   Zis_distrO   r
   r
   r   Ú__init__Š   s2    	
zCovPlugin.__init__Nc                s”   |d kr"G ‡ fdd„dt ƒ}|ƒ }|ˆ jjˆ jjˆ jjˆ jjˆ jj||ƒˆ _ˆ j ¡  dˆ _	t
 ¡ ˆ _ˆ jjj}ˆ jjd krt|dƒr|jˆ j_d S )Nc                   s   e Zd Z” jZdS )zCovPlugin.start.<locals>.ConfigN)r   r   r   rI   Úoptionr
   )r&   r
   r   ÚConfig¹   s   r]   TÚ
fail_under)ÚobjectrI   r/   r%   Ú
cov_configZ
cov_appendZ
cov_branchrQ   rY   rU   ÚosÚgetcwdrV   r,   ÚconfigÚcov_fail_underÚhasattrr^   )r&   Zcontroller_clsrc   Únodeidr]   r`   r
   )r&   r   rY   µ   s"    


zCovPlugin.startc             C   s   t |jdd ƒd k	S )NÚworkerinput)rX   rc   )r&   Úsessionr
   r
   r   Ú
_is_workerÎ   s    zCovPlugin._is_workerc             C   s–   | j jrd| _dS ddlm} t ¡ | _|  |¡r\|j	j
 dt|dƒ¡}|  |j|j	|¡ n| jsn|  |j¡ | j jdkr’|j	j t| jjƒd¡ dS )	zAAt session start determine our implementation and delegate to it.TNr   )rO   Zworkeridrf   r    Z_cov_contexts)rI   rJ   rW   r   rO   ra   ÚgetpidrP   ri   rc   rg   ÚgetrX   rY   Z
DistWorkerrU   rZ   Zcov_contextrF   rG   ÚTestContextPluginrQ   r,   )r&   rh   rO   rf   r
   r
   r   Úpytest_sessionstartÑ   s    

zCovPlugin.pytest_sessionstartc             C   s   | j s| j |¡ dS )zlDelegate to our implementation.

        Mark this hook as optional in case xdist is not installed.
        N)rW   rQ   Zconfigure_node)r&   Únoder
   r
   r   Úpytest_configure_nodeé   s    zCovPlugin.pytest_configure_nodec             C   s   | j s| j ||¡ dS )zlDelegate to our implementation.

        Mark this hook as optional in case xdist is not installed.
        N)rW   rQ   Ztestnodedown)r&   rn   Úerrorr
   r
   r   Úpytest_testnodedownò   s    zCovPlugin.pytest_testnodedownc             C   s   | j o| jj S )N)rT   rI   Zno_cov_on_fail)r&   r
   r
   r   Ú_should_reportû   s    zCovPlugin._should_reportc             C   s   | j j}|d k	o| j|k S )N)rI   rd   rS   )r&   rd   r
   r
   r   Ú_failed_cov_totalþ   s    zCovPlugin._failed_cov_totalc          
   c   sø   d V  | j rd S t |¡}t|jƒ| _| jd k	r:| j ¡  |  |¡sô|  	¡ rôddl
m} y| j | j¡| _W n^ |k
rÊ } z@d| }|jj d¡jd| ddd t t |¡¡ d| _W d d }~X Y nX | jd k	sÞtdƒ‚|  ¡ rô| jd	7  _d S )
Nr   )ÚCoverageExceptionzFailed to generate report: %s
ÚterminalreporterzWARNING: %s
T)ÚredÚboldz$Test coverage should never be `None`r   )rW   r   ZSessionWrapperÚboolZtestsfailedrT   rQ   Úfinishri   rr   Zcoverage.miscrt   Úsummaryr%   rS   rc   rF   Ú	getpluginÚwriteÚwarningsÚwarnÚpytestÚPytestWarningÚAssertionErrorrs   )r&   rh   Zcompat_sessionrt   ÚexcÚmessager
   r
   r   Úpytest_runtestloop  s(    


zCovPlugin.pytest_runtestloopc             C   sä   | j r:| jjr6d}|jd| ddd t t |¡¡ d S | jd krHd S | j	d krVd S | d| j
 ¡  d ¡ | jjd k	rà| jjdkrà| j	| jjk }|r¢dddœnddi}dj| jj| j	|rÀd	nd
|rÊdndd}|j|f|Ž d S )Nz&Coverage disabled via --no-cov switch!zWARNING: %s
T)rv   rw   Ú
r   ZgreenzU{fail}Required test coverage of {required}% {reached}. Total coverage: {actual:.2f}%
zFAIL r   znot reachedÚreached)ÚrequiredÚactualZfailr†   )rW   rI   rB   r|   r}   r~   r   r€   rQ   rS   r%   Úgetvaluerd   r   )r&   ru   rƒ   rT   Zmarkupr
   r
   r   Úpytest_terminal_summary$  s(    


z!CovPlugin.pytest_terminal_summaryc             C   s   t  ¡ | jkrt ¡  d S )N)ra   rj   rP   r   Úinit)r&   Úitemr
   r
   r   Úpytest_runtest_setupC  s    zCovPlugin.pytest_runtest_setupc             C   s   t  ¡  d S )N)r   Úcleanup)r&   rŒ   r
   r
   r   Úpytest_runtest_teardownI  s    z!CovPlugin.pytest_runtest_teardownc             c   s@   |  d¡sdt|ddƒkr6| j ¡  d V  | j ¡  nd V  d S )NÚno_coverZfixturenamesr
   )Zget_closest_markerrX   rQ   ÚpauseÚresume)r&   rŒ   r
   r
   r   Úpytest_runtest_callL  s    

zCovPlugin.pytest_runtest_call)TF)NN)r   r   r   r	   r[   rY   ri   rm   ro   Zoptionalhookrq   rr   rs   r   Zhookwrapperr„   rŠ   r   r   r“   r
   r
   r
   r   rE   ‚   s    
+
 rE   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )rl   c             C   s
   || _ d S )N)r,   )r&   r,   r
   r
   r   r[   X  s    zTestContextPlugin.__init__c             C   s   |   |d¡ d S )NÚsetup)Úswitch_context)r&   rŒ   r
   r
   r   r   [  s    z&TestContextPlugin.pytest_runtest_setupc             C   s   |   |d¡ d S )NZteardown)r•   )r&   rŒ   r
   r
   r   r   ^  s    z)TestContextPlugin.pytest_runtest_teardownc             C   s   |   |d¡ d S )NÚrun)r•   )r&   rŒ   r
   r
   r   r“   a  s    z%TestContextPlugin.pytest_runtest_callc             C   s(   dj ||d}| j |¡ |tjd< d S )Nz{item.nodeid}|{when})rŒ   ÚwhenZCOV_CORE_CONTEXT)r   r,   r•   ra   Úenviron)r&   rŒ   r—   Úcontextr
   r
   r   r•   d  s    z TestContextPlugin.switch_contextN)r   r   r   r[   r   r   r“   r•   r
   r
   r
   r   rl   W  s
   rl   c               C   s   dS )z%A pytest fixture to disable coverage.Nr
   r
   r
   r
   r   r   j  s    r   c             C   s.   | j j d¡r*| j j d¡}|jr*|jjS dS )zEA pytest fixture to provide access to the underlying coverage object.rA   N)rc   rF   Z	haspluginr{   rQ   r,   )ÚrequestrK   r
   r
   r   r,   p  s
    r,   c             C   s   |   dd¡ d S )NÚmarkersz)no_cover: disable coverage for this test.)Zaddinivalue_line)rc   r
   r
   r   Úpytest_configure|  s    rœ   )r	   r   ra   r}   r!   r   r   r   r   Ú	Exceptionr   r   r   r#   ÚActionr$   r<   r@   ÚmarkZtryfirstrL   r_   rE   rl   Zfixturer   r,   rœ   r
   r
   r
   r   Ú<module>   s*   '
 V