B
    ؐ<[-                 @   s^   d 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m	Z	 e
eZG dd deZdS )a  If you have Ned Batchelder's coverage_ module installed, you may activate a
coverage report with the ``--with-coverage`` switch or NOSE_WITH_COVERAGE
environment variable. The coverage report will cover any python source module
imported after the start of the test run, excluding modules that match
testMatch. If you want to include those modules too, use the ``--cover-tests``
switch, or set the NOSE_COVER_TESTS environment variable to a true value. To
restrict the coverage report to modules from a particular package or packages,
use the ``--cover-package`` switch or the NOSE_COVER_PACKAGE environment
variable.

.. _coverage: http://www.nedbatchelder.com/code/modules/coverage.html
    N)Plugin)srctolistc                   sr   e Zd ZdZdZdZdZdZdZdZ	i Z
 fddZ fddZd	d
 Zdd Zdd Zdd ZdddZ  ZS )CoveragezL
    Activate a coverage report using Ned Batchelder's coverage module.
    FN   c                s$  t t| || |jdd|ddddd |jdd	|d
ddd |jdd	d|ddd |jddd|ddd |jdd	d|ddd |jdd	|dddd |jd d|d!d"d#d$d%d& |jd'd	|d(d)d*d |jd+d	|d,d-d.d |jd/d|d0d1d2d3d4d& d5S )6z.
        Add options to command line.
        z--cover-packageappendZNOSE_COVER_PACKAGEZPACKAGEcover_packageszBRestrict coverage output to selected packages [NOSE_COVER_PACKAGE])actiondefaultmetavardesthelpz--cover-erase
store_trueZNOSE_COVER_ERASEcover_erasez9Erase previously collected coverage statistics before run)r	   r
   r   r   z--cover-testscover_testsZNOSE_COVER_TESTSz:Include test modules in coverage report [NOSE_COVER_TESTS])r	   r   r
   r   z--cover-min-percentageZstorecover_min_percentageZNOSE_COVER_MIN_PERCENTAGEzLMinimum percentage of coverage for tests to pass [NOSE_COVER_MIN_PERCENTAGE]z--cover-inclusivecover_inclusiveZNOSE_COVER_INCLUSIVEzInclude all python files under working directory in coverage report.  Useful for discovering holes in test coverage if not all files are imported by the test suite. [NOSE_COVER_INCLUSIVE]z--cover-htmlZNOSE_COVER_HTML
cover_htmlz!Produce HTML coverage informationz--cover-html-dirZNOSE_COVER_HTML_DIRZcovercover_html_dirZDIRz(Produce HTML coverage information in dir)r	   r
   r   r   r   z--cover-branchesZNOSE_COVER_BRANCHEScover_branchesz@Include branch coverage in coverage report [NOSE_COVER_BRANCHES]z--cover-xmlZNOSE_COVER_XML	cover_xmlz Produce XML coverage informationz--cover-xml-fileZNOSE_COVER_XML_FILEzcoverage.xmlcover_xml_fileZFILEz(Produce XML coverage information in fileN)superr   optionsZ
add_optionget)selfparserenv)	__class__ 1lib/python3.7/site-packages/nose/plugins/cover.pyr   #   sX    

zCoverage.optionsc                s$  y| j d W n tk
r$   Y nX tt| || | jryddl}t|dsZt	dW n$ t	k
r   t
d d| _dS X || _|j| _|j| _g | _|jrt|jttfr|j}n|jg}x"dd	 |D D ]}| j| qW |j| _| jrt
d
| j d| _|jr*|j| _t
d| j |j| _d| _ |j!rRt"|j!#d| _$|j%rp|j&| _ t
d| j  | jr d| j d< |jd| j|j'| jd| _(d| j(_)|j'| j(_*| j(+d t
d tt,j-. dd | _/| jrt
d | j(0  | j(1  | j(j*s | j(2  | j(3  dS )z#
        Configure plugin.
        Zactiver   Ncoveragez Unable to import coverage modulez8Coverage not available: unable to import coverage moduleFc             S   s   g | ]}t |qS r   )r   ).0xr   r   r    
<listcomp>y   s    z&Coverage.configure.<locals>.<listcomp>z.Coverage report will include only packages: %sz#Will put HTML coverage report in %s%z"Will put XML coverage report in %sT)Z	auto_databranchZdata_suffixsourcez)#pragma[: ]+[nN][oO] [cC][oO][vV][eE][rR]zCoverage beginz1Clearing previously collected coverage statistics)4statuspopKeyErrorr   r   	configureZenabledr!   hasattrImportErrorlogerrorconfr   
coverEraser   
coverTestscoverPackagesr   
isinstancelisttupleextendr   coverInclusiveinfocoverHtmlDirr   r   debugr   ZcoverBranchescoverXmlFiler   intrstripcoverMinPercentager   r   ZworkercoverInstanceZ_warn_no_data	is_workerZexcludesysmoduleskeysskipModulescombineZeraseloadstart)r   r   r0   r!   r   Zpkgs)r   r   r    r+   ]   sp    









zCoverage.configurec             O   s    | j jr| j   | j   dS )z7
        Begin recording coverage information.
        N)r@   rA   rG   rH   )r   argskwargsr   r   r    
beforeTest   s    
zCoverage.beforeTestc             O   s    | j jr| j   | j   dS )z6
        Stop recording coverage information.
        N)r@   rA   stopsave)r   rI   rJ   r   r   r    	afterTest   s    
zCoverage.afterTestc       
   
      s  t d  j   j   j   fddttj	 D }t d|  jj
||d ddl} jrt d y j| j W n8 |jjk
r } zt d	t|  W dd}~X Y nX  jr(t d
 y j| j W n: |jjk
r& } zt dt|  W dd}~X Y nX  jrt } jj
||d d}d}t|| }|dkrzt|| }|rt| d }	|	 jk rt d j  td n
t d dS )z.
        Output code coverage report.
        zCoverage reportc                s    g | ]\}}  ||r|qS r   )wantModuleCoverage)r"   namemodule)r   r   r    r$      s   z#Coverage.report.<locals>.<listcomp>z&Coverage report will cover modules: %s)filer   NzGenerating HTML coverage reportz"Failed to generate HTML report: %szGenerating XML coverage reportz!Failed to generate XML report: %sz@-------\s\w+\s+\d+\s+\d+(?:\s+\d+\s+\d+)?\s+(\d+)%\s+\d*\s{0,1}$zM-------\s[\w./]+\s+\d+\s+\d+(?:\s+\d+\s+\d+)?\s+(\d+)%(?:\s+[-\d, ]+)\s{0,1}$z3TOTAL Coverage did not reach minimum required: %d%%   zGNo total percentage was found in coverage output, something went wrong.)r.   r;   r@   rL   rF   rM   r5   rB   rC   itemsreportr!   r:   Zhtml_reportZmiscZCoverageExceptionZwarningstrr<   Z
xml_reportr?   ioStringIOresearchgetvaluer=   groupsr/   exit)
r   streamrC   r!   efZmultiPackageReZsinglePackageRemZ
percentager   )r   r    rU      sH    





$
$

zCoverage.reportc             C   s   t |dstd| dS t|j}|r2|dsBtd| dS | jrxH| jD ]>}tdt	| |rP| j
s~| jj|sPtd| dS qPW || jkrtd	| dS | jj|r| j
std
| dS | j S )N__file__zno coverage of %s: no __file__Fz.pyz$no coverage of %s: not a python filez^%s\bzcoverage for %sTz0no coverage for %s: loaded before coverage startzno coverage for %s: is a test)r,   r.   r;   r   rb   endswithr3   rY   findallescaper2   r0   Z	testMatchrZ   rE   )r   rP   rQ   Zmodule_filepackager   r   r    rO      s,    


zCoverage.wantModuleCoveragec             C   sB   | j r>|dr>|r:| jr:x"| jD ]}||r"dS q"W ndS dS )zdIf inclusive coverage enabled, return true for all source files
        in wanted packages.
        z.pyTN)r8   rc   r3   
startswith)r   rR   rf   Zwantr   r   r    wantFile  s    



zCoverage.wantFile)N)__name__
__module____qualname____doc__r2   r3   r@   r1   r?   Zscorer(   r   r+   rK   rN   rU   rO   rh   __classcell__r   r   )r   r    r      s   :B	
6r   )rl   ZloggingrY   rB   rW   Znose.plugins.baser   Z	nose.utilr   r   Z	getLoggerri   r.   r   r   r   r   r    <module>   s   
