B
    ”Ü‡\e  ã               @   s8  d Z ddlmZ ddlm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ZddlZddl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 ddlmZ ddlmZ G dd„ dejƒZdd„ Zdd„ Zdd„ Zdd„ Ze
jG dd„ de ƒƒZ!G dd„ de ƒZ"dd„ Z#dd„ Z$dS )zt terminal reporting of the full testing process.

This is a good source for looking at the various reporting hooks.
é    )Úabsolute_import)Údivision)Úprint_functionN)Úcollapse)Únodes)ÚEXIT_INTERRUPTED)ÚEXIT_NOTESTSCOLLECTED)ÚEXIT_OK)ÚEXIT_TESTSFAILED)ÚEXIT_USAGEERRORc                   s,   e Zd ZdZd‡ fdd„	Zd	dd„Z‡  ZS )
ÚMoreQuietActionzª
    a modified copy of the argparse count action which counts down and updates
    the legacy quiet attribute at the same time

    used to unify verbosity handling
    NFc                s    t t| ƒj||d|||d d S )Nr   )Úoption_stringsÚdestÚnargsÚdefaultÚrequiredÚhelp)Úsuperr   Ú__init__)Úselfr   r   r   r   r   )Ú	__class__© ú/lib/python3.7/site-packages/_pytest/terminal.pyr   &   s    
zMoreQuietAction.__init__c             C   s6   t || jdƒd }t|| j|ƒ t |ddƒd |_d S )Nr   é   Úquiet)Úgetattrr   Úsetattrr   )r   ÚparserÚ	namespaceÚvaluesZoption_stringZ	new_countr   r   r   Ú__call__0   s    zMoreQuietAction.__call__)NFN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    Ú__classcell__r   r   )r   r   r      s   
r   c             C   s   | j dddd}|jddddd	d
df |jddtdd	ddf |jdd	tddd |jddddddd |jddddddd |jd d!dd"dd#d$ |jd%d&dd'd(d(d)d*d+d,d-gd.d/ |jd0dd1d+d2d3d4d5gd5d6d7 |jd8d9ddd:d; |jd<d=dd=d(d>d+d(gd?d/ | jd@dAdBdC d S )DNzterminal reportingZ	reportingZgeneral)Zafterz-vz	--verboseÚcountr   Úverbosezincrease verbosity.)Úactionr   r   r   z-qz--quietzdecrease verbosity.z--verbosityzset verbosity)r   Útyper   r   z-rZstoreÚreportcharsÚ Úcharszæshow extra test summary info as specified by chars (f)ailed, (E)error, (s)skipped, (x)failed, (X)passed, (p)passed, (P)passed with output, (a)all except pP. Warnings are displayed at all times except when --disable-warnings is set)r(   r   r   Úmetavarr   z--disable-warningsz--disable-pytest-warningsFÚdisable_warningsÚ
store_truezdisable warnings summary)r   r   r(   r   z-lz--showlocalsZ
showlocalsz0show locals in tracebacks (disabled by default).)r(   r   r   r   z--tbZstyleÚtbstyleÚautoZlongZshortÚnoÚlineZnativez6traceback print mode (auto/long/short/line/native/no).)r-   r(   r   r   Úchoicesr   z--show-captureÚshowcaptureÚstdoutÚstderrÚlogÚallzSControls how captured stdout/stderr/log is shown on failed tests. Default is 'all'.)r(   r   r4   r   r   z--fulltracez--full-tracez-don't cut any tracebacks (default is to cut).)r(   r   r   z--colorÚcolorZyesz$color terminal output (yes/no/auto).Úconsole_output_stylezSconsole output: classic or with additional progress information (classic|progress).Úprogress)r   r   )ZgetgroupZ
_addoptionr   ÚintZaddini)r   Úgroupr   r   r   Úpytest_addoption7   sŽ    

r?   c                sJ   t | tjƒ‰ | j ˆ d¡ | jjs*| jjrF‡ fdd„}| jj	 
d|¡ d S )NÚterminalreporterc                s"   d  tt|ƒ¡}ˆ  d| ¡ d S )Nú z[traceconfig] )ÚjoinÚmapÚstrÚ
write_line)ZtagsÚargsÚmsg)Úreporterr   r   Úmywriter—   s    z"pytest_configure.<locals>.mywriterzpytest:config)ÚTerminalReporterÚsysr6   ÚpluginmanagerÚregisterÚoptionÚdebugÚtraceconfigZtraceÚrootZsetprocessor)ÚconfigrI   r   )rH   r   Úpytest_configure’   s
    rS   c             C   s~   d}| j j}| j js&d|kr&|d7 }n| j jrBd|krB| dd¡}|rzx2|D ]*}||krj|dkrj||7 }qL|dkrLd}qLW |S )Nr+   ÚwÚaZsxXwEf)rN   r*   r.   Úreplace)rR   Z
reportoptsr*   Úcharr   r   r   Úgetreportoptž   s    


rX   c             C   sB   | j rd}n$| jrd}n| jr0d}| jdkr0d}| j|| j ¡ fS )NÚ.ÚsÚFZcallÚf)ÚpassedÚskippedÚfailedÚwhenÚoutcomeÚupper)ÚreportÚletterr   r   r   Úpytest_report_teststatus®   s    
re   c               @   s8   e Zd ZdZe ¡ ZejddZejddZdd„ Z	dS )ÚWarningReportar  
    Simple structure to hold warnings information captured by ``pytest_warning_captured``.

    :ivar str message: user friendly message about the warning
    :ivar str|None nodeid: node id that generated the warning (see ``get_location``).
    :ivar tuple|py.path.local fslocation:
        file system location of the source of the warning (see ``get_location``).
    N)r   c             C   sx   | j r| j S | jrtt| jtƒrjt| jƒdkrj| jdd… \}}tj |¡ |j	¡}|s^t
|ƒ}d||f S t
| jƒS dS )zn
        Returns the more user-friendly information about the location
        of a warning, or None.
        é   Nz%s:%s)ÚnodeidÚ
fslocationÚ
isinstanceÚtupleÚlenÚpyÚpathÚlocalZreltoZinvocation_dirrD   )r   rR   ÚfilenameZlinenumÚrelpathr   r   r   Úget_locationÉ   s    
zWarningReport.get_location)
r!   r"   r#   r$   ÚattrZibÚmessagerh   ri   rr   r   r   r   r   rf   º   s
   	rf   c               @   s   e Zd Zdodd„Zdd„ Zedd„ ƒZedd	„ ƒZed
d„ ƒZej	dd„ ƒZedd„ ƒZ
dd„ Zdd„ Zdpdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdqdd„Zdrd!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zed7d8„ ƒZd9d:„ Zd;d<„ Z dsd>d?„Z!e"j#d@dAdBdC„ ƒZ$e"j#d@dAdDdE„ ƒZ%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)e"j#d@dNdOdP„ ƒZ*e"j#d@dNdQdR„ ƒZ+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dS )trJ   Nc             C   s¢   dd l }|| _d| _d | _d | _i | _tj ¡ | _	|d kr@t
j}|j ||¡| _| j| _| jj| _d | _t|ƒ| _| jj| _| ¡ | _tƒ | _|  ¡ | _d | _d S )Nr   )Z_pytest.configrR   Ú_numcollectedÚ_sessionÚ_showfspathÚstatsrm   rn   ro   ÚstartdirrK   r6   Zcreate_terminal_writerÚ_twÚwriterÚ	fullwidthÚ_screen_widthÚcurrentfspathrX   r*   Z	hasmarkupÚisattyÚsetÚ_progress_nodeids_reportedÚ_determine_show_progress_infoÚ_show_progress_infoÚ_collect_report_last_write)r   rR   ÚfileÚ_pytestr   r   r   r   Ý   s&    




zTerminalReporter.__init__c             C   s4   | j  d¡dkrdS | j  d¡r$dS | j  d¡dkS )zQReturn True if we should display progress information based on the current configÚcapturer2   FZ	setupshowr;   )r<   r&   )rR   Ú	getoptionÚgetini)r   r   r   r   r‚   õ   s
    z.TerminalReporter._determine_show_progress_infoc             C   s
   | j jjS )N)rR   rN   r'   )r   r   r   r   Ú	verbosityÿ   s    zTerminalReporter.verbosityc             C   s
   | j dkS )Nr   )rŠ   )r   r   r   r   Ú
showheader  s    zTerminalReporter.showheaderc             C   s   | j d kr| jdkS | j S )Nr   )rw   rŠ   )r   r   r   r   Ú
showfspath  s    

zTerminalReporter.showfspathc             C   s
   || _ d S )N)rw   )r   Úvaluer   r   r   rŒ     s    c             C   s
   | j dkS )Nr   )rŠ   )r   r   r   r   Úshowlongtestinfo  s    z!TerminalReporter.showlongtestinfoc             C   s   dddœ  ||¡}|| jkS )NÚxrZ   )Zxfailedr^   )Úgetr*   )r   rW   r   r   r   Úhasopt  s    zTerminalReporter.hasoptc             K   s„   | j j | d¡d ¡}| jd ks,|| jkrp| jd k	rD| jrD|  ¡  || _| j |¡}| j	 
¡  | j	 |d ¡ | j	j|f|Ž d S )Nz::r   rA   )rR   ÚrootdirrB   Úsplitr~   rƒ   Ú)_write_progress_information_filling_spacery   Úbestrelpathrz   r3   Úwrite)r   rh   ÚresÚmarkupÚfspathr   r   r   Úwrite_fspath_result  s    
z$TerminalReporter.write_fspath_resultr+   c             K   sD   | j |kr&| j ¡  || _ | j |¡ |r@| jj|f|Ž d| _ d S )Néþÿÿÿ)r~   rz   r3   r–   )r   ÚprefixZextraÚkwargsr   r   r   Úwrite_ensure_prefix&  s    

z$TerminalReporter.write_ensure_prefixc             C   s   | j r| j ¡  d | _ d S )N)r~   rz   r3   )r   r   r   r   Úensure_newline/  s    
zTerminalReporter.ensure_newlinec             K   s   | j j|f|Ž d S )N)rz   r–   )r   Úcontentr˜   r   r   r   r–   4  s    zTerminalReporter.writec             K   s6   t |tjƒstj|dd}|  ¡  | jj|f|Ž d S )NrV   )Úerrors)rj   ÚsixÚ	text_typerŸ   rz   r3   )r   r3   r˜   r   r   r   rE   7  s    zTerminalReporter.write_linec             K   sV   |  dd¡}|r.| jjt|ƒ d }d| }nd}t|ƒ}| jjd| | f|Ž dS )a*  
        Rewinds the terminal cursor to the beginning and writes the given line.

        :kwarg erase: if True, will also add spaces until the full terminal width to ensure
            previous lines are properly erased.

        The rest of the keyword arguments are markup instructions.
        ÚeraseFr   rA   r+   úN)Úpoprz   r|   rl   rD   r–   )r   r3   r˜   r¤   Z
fill_countÚfillr   r   r   Úrewrite=  s    	
zTerminalReporter.rewritec             K   s   |   ¡  | jj||f|Ž d S )N)rŸ   rz   Úsep)r   r©   Útitler˜   r   r   r   Ú	write_sepO  s    zTerminalReporter.write_sepú=c             K   s   | j j||f|Ž d S )N)rz   r©   )r   rª   r©   Úkwr   r   r   ÚsectionS  s    zTerminalReporter.sectionc             K   s   | j j|f|Ž d S )N)rz   r3   )r   rG   r­   r   r   r   r3   V  s    zTerminalReporter.linec             C   s,   x&t  |¡ d¡D ]}|  d| ¡ qW dS )NÚ
zINTERNALERROR> r   )r¢   r£   r“   rE   )r   Úexcreprr3   r   r   r   Úpytest_internalerrorY  s    z%TerminalReporter.pytest_internalerrorc       	      C   s\   ddl m} | j dg ¡}|j|jf}||ƒ}|d k	r<|jnd}t|||d}| |¡ d S )Nr   )Úwarning_record_to_strÚwarningsr+   )ri   rt   rh   )	Z_pytest.warningsr²   rx   Ú
setdefaultrp   Úlinenorh   rf   Úappend)	r   Zwarning_messageÚitemr²   r³   ri   rt   rh   Zwarning_reportr   r   r   Úpytest_warning_captured^  s    z(TerminalReporter.pytest_warning_capturedc             C   s"   | j jjrd|f }|  |¡ d S )NzPLUGIN registered: %s)rR   rN   rP   rE   )r   ÚpluginrG   r   r   r   Úpytest_plugin_registeredl  s    

z)TerminalReporter.pytest_plugin_registeredc             C   s   | j  dg ¡ |¡ d S )NÚ
deselected)rx   r´   Úextend)r   Úitemsr   r   r   Úpytest_deselectedt  s    z"TerminalReporter.pytest_deselectedc             C   sH   | j r$| j|f|žŽ }|  |d¡ n | jrD| d¡d }|  |d¡ d S )Nr+   z::r   )rŽ   Ú_locationlinerž   rŒ   r“   rš   )r   rh   Úlocationr3   Zfsidr   r   r   Úpytest_runtest_logstartw  s    z(TerminalReporter.pytest_runtest_logstartc             C   sÄ  |}| j jj|| j d}|\}}}t|tƒr6|\}}nd }| j |g ¡ |¡ d| _|s`|s`d S t	|dƒ}|d krÈt	|dƒ}	|j
r|	sddi}n8|j
r¤|	r¤ddi}n$|jr´ddi}n|jrÄddi}ni }| jdkr|sò| jrò| j|j|f|Ž n| jj|f|Ž n¼| j |j¡ | j|jf|jžŽ }
|sN| j|
|f|Ž | jrÀ|  ¡  nr|  ¡  | j d	|jjj ¡ | jrŽ| jj|  ¡ d
 dd n| j d
¡ | jj|f|Ž | j d
|
 ¡ d| _d S )N)rc   rR   TÚnodeZwasxfailÚgreenÚyellowÚredr   z[%s]rA   )Úcyanr›   ) rR   Úhookre   rj   rk   rx   r´   r¶   Z
_tests_ranÚhasattrr]   r_   r^   rŠ   rŒ   rš   rh   rz   r–   r   Úaddr¿   rÀ   rž   rƒ   r”   rŸ   rÂ   ZgatewayÚidÚ!_get_progress_information_messager~   )r   rc   Úrepr—   Úcategoryrd   Zwordr˜   Zrunning_xdistZ	was_xfailr3   r   r   r   Úpytest_runtest_logreport  sR    












z)TerminalReporter.pytest_runtest_logreportc             C   s²   | j  d¡dkr2| jj}td t|ƒt|ƒ¡ƒ}ntdƒ}| jdkr®| jr®| j	 
|¡ t| j	ƒ| jjk}|rv|  ¡  n8| j}|| d | jk}|r®|  ¡ }| jj|d dd	 d S )
Nr;   r&   z [{}/{}]z [100%]r   r   r¯   T)rÆ   )rR   r‰   rv   Útestscollectedrl   ÚformatrD   rŠ   rƒ   r   rÉ   r”   Ú_width_of_current_liner}   rË   rz   r–   )r   rh   Z	num_testsZprogress_lengthZ	last_itemrT   Z	past_edgerG   r   r   r   Úpytest_runtest_logfinish´  s    
z)TerminalReporter.pytest_runtest_logfinishc             C   s–   | j  d¡dkrdS | jj}| j  d¡dkrn|rb| j}d tt|ƒƒ¡}d |¡}| t|ƒ|¡S d ||¡S |rŽt| jƒd	 | }d
 |¡S dS d S )Nr‡   r2   r+   r;   r&   z{{:{}d}}z
 [{}/{{}}]z [ {} / {} ]éd   z	 [{:3d}%]z [100%])	rR   rˆ   rv   rÏ   r‰   r   rÐ   rl   rD   )r   Z	collectedr<   Zcounter_formatÚformat_stringr   r   r   rË   É  s    

z2TerminalReporter._get_progress_information_messagec             C   s6   |   ¡ }| j}| jj| d }| j| |¡dd d S )Nr   T)rÆ   )rË   rÑ   rz   r|   r–   Úrjust)r   rG   rT   r§   r   r   r   r”   Ú  s    z:TerminalReporter._write_progress_information_filling_spacec             C   s&   y| j jS  tk
r    | j jS X dS )z\Return the width of current line, using the superior implementation of py-1.6 when availableN)rz   Zwidth_of_current_lineÚAttributeErrorZchars_on_current_line)r   r   r   r   rÑ   à  s    z'TerminalReporter._width_of_current_linec             C   sN   | j r.| jjjdkrJ| jddd t ¡ | _n| jjjdkrJ| jddd d S )Nr   zcollecting ... T)Úboldr   )r   rR   rN   r'   r–   Útimer„   )r   r   r   r   Úpytest_collectioné  s    z"TerminalReporter.pytest_collectionc             C   sj   |j r| j dg ¡ |¡ n|jr6| j dg ¡ |¡ dd„ |jD ƒ}|  jt|ƒ7  _| jrf|  	¡  d S )NÚerrorr^   c             S   s   g | ]}t |tjƒr|‘qS r   )rj   ÚpytestZItem)Ú.0r   r   r   r   ú
<listcomp>ö  s    z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)
r_   rx   r´   r¶   r^   Úresultru   rl   r   Úreport_collect)r   rc   r½   r   r   r   Úpytest_collectreportñ  s    z%TerminalReporter.pytest_collectreportFc             C   sL  | j jjdk rd S |s@t ¡ }| jd k	r:| j|d kr:d S || _t| j dg ¡ƒ}t| j dg ¡ƒ}t| j dg ¡ƒ}| j| | | }|r’d}nd}|t	| jƒd | jd	kr²d
nd 7 }|rÊ|d| 7 }|rÚ|d| 7 }|rê|d| 7 }| j|  krdkrn n|d| 7 }| j
r>| j|ddd |rH|  d¡ n
|  |¡ d S )Nr   g      à?rÚ   r^   r»   z
collected zcollecting z itemr   r+   rZ   z / %d errorsz / %d deselectedz / %d skippedz / %d selectedT)r×   r¤   r¯   )rR   rN   r'   rØ   r„   rl   rx   r   ru   rD   r   r¨   r–   rE   )r   ÚfinalÚtr¡   r^   r»   Zselectedr3   r   r   r   rß   û  s<    
"zTerminalReporter.report_collectT)Ztrylastc             C   s   |   d¡ d S )NT)rß   )r   r   r   r   Úpytest_collection_modifyitems#  s    z.TerminalReporter.pytest_collection_modifyitemsc             C   sö   || _ t ¡ | _| jsd S | jdddd t ¡ }dtj|f }ttdƒrzd 	t
ttjd d… ƒ¡}|d	|tjd f 7 }|d
tjtjtjf 7 }| jdks¶| jjjs¶t| jjdd ƒrÈ|dttjƒ 7 }|  |¡ | jjj| j| jd}|  |¡ d S )Nr¬   ztest session startsT)r×   zplatform %s -- Python %sÚpypy_version_inforY   é   z[pypy-%s-%s]z, pytest-%s, py-%s, pluggy-%sr   Zpastebinz -- )rR   ry   )rv   rØ   Ú_sessionstarttimer‹   r«   ÚplatformZpython_versionrK   rÈ   rB   rC   rD   rä   rÛ   Ú__version__rm   ÚpluggyrŠ   rR   rN   rO   r   Ú
executablerE   rÇ   Úpytest_report_headerry   Ú_write_report_lines_from_hooks)r   ÚsessionZverinforG   Úlinesr   r   r   Úpytest_sessionstart'  s,    




z$TerminalReporter.pytest_sessionstartc             C   s(   |  ¡  xt|ƒD ]}|  |¡ qW d S )N)Úreverser   rE   )r   rî   r3   r   r   r   rì   D  s    z/TerminalReporter._write_report_lines_from_hooksc             C   sV   d}|j rd|j |j ¡ }d|j|f g}|j ¡ }|rR| dd t|ƒ¡ ¡ |S )Nr+   rA   zrootdir: %s, inifile:%szplugins: %sz, )Úinifiler’   r•   rL   Zlist_plugin_distinfor¶   rB   Ú_plugin_nameversions)r   rR   rñ   rî   Ú
plugininfor   r   r   rë   I  s    
z%TerminalReporter.pytest_report_headerc             C   sˆ   | j  d¡r|  |j¡ | j jj| j | j|jd}|  |¡ | j  d¡r„| j 	d¡r„| j
 dd¡ x | j 	d¡D ]}| | j
¡ qpW d S )NZcollectonly)rR   ry   r½   r_   ú!zcollection failures)rR   rˆ   Ú_printcollecteditemsr½   rÇ   Zpytest_report_collectionfinishry   rì   rx   r   rz   r©   Ú
toterminal)r   rí   rî   rÌ   r   r   r   Úpytest_collection_finishU  s    
z)TerminalReporter.pytest_collection_finishc          	   C   s®  | j jjdk r¤| j jjdk r„i }x2|D ]*}|j dd¡d }| |d¡d ||< q&W xJt| ¡ ƒD ]\}}| j 	d||f ¡ qbW nx|D ]}| j 	|j¡ qŠW d S g }d}xü|D ]ô}| 
¡ dd … }x&|rì||d t|ƒ… krâP | ¡  qÈW x¶|t|ƒd … D ]¢}	| |	¡ |	jdkrq t|ƒd d }| j 	d	||	f ¡ | j jjdkr t|	d
ƒr |	jjr x6|	jj ¡  ¡ D ]"}
| j 	d	|d |
 ¡ f ¡ qzW q W q²W d S )Nr   éÿÿÿÿz::r   z%s: %dr+   z()z  z%s%sÚ_obj)rR   rN   r'   rh   r“   r   Úsortedr½   rz   r3   Z	listchainrl   r¦   r¶   ÚnamerÈ   rù   r$   ÚstripÚ
splitlines)r   r½   Zcountsr·   rû   r&   ÚstackÚindentZneeded_collectorsÚcolr3   r   r   r   rõ   d  s:    



z%TerminalReporter._printcollecteditems)Zhookwrapperc             c   sf   d V }|  ¡  | j d¡ tttttf}||krF| jj	j
| || jd |tkrZ|  ¡  | `|  ¡  d S )Nr+   )r@   Ú
exitstatusrR   )Z
get_resultrz   r3   r	   r
   r   r   r   rR   rÇ   Úpytest_terminal_summaryÚ_report_keyboardinterruptÚ_keyboardinterrupt_memoÚsummary_stats)r   r  ra   Zsummary_exit_codesr   r   r   Úpytest_sessionfinish‡  s    z%TerminalReporter.pytest_sessionfinishc             c   s2   |   ¡  |  ¡  |  ¡  d V  |  ¡  |  ¡  d S )N)Úsummary_errorsÚsummary_failuresÚsummary_warningsÚsummary_passes)r   r   r   r   r  œ  s    z(TerminalReporter.pytest_terminal_summaryc             C   s   |j dd| _d S )NT)Zfuncargs)Zgetreprr  )r   Úexcinfor   r   r   Úpytest_keyboard_interrupt¦  s    z*TerminalReporter.pytest_keyboard_interruptc             C   s   t | dƒr|  ¡  d S )Nr  )rÈ   r  )r   r   r   r   Úpytest_unconfigure©  s    
z#TerminalReporter.pytest_unconfigurec             C   s\   | j }|jj}|  d|¡ d|krX| jjjr:| | j¡ n|j | j¡ | jj	ddd d S )Nrô   ÚKeyboardInterruptz?(to show a full traceback on KeyboardInterrupt use --fulltrace)T)rÄ   )
r  Ú	reprcrashrt   r«   rR   rN   Z	fulltracerö   rz   r3   )r   r°   rG   r   r   r   r  ­  s    
z*TerminalReporter._report_keyboardinterruptc                sb   ‡ ‡fdd„}|rV||ƒ}ˆj dkrZ| d¡d | dtj¡krZ|dˆj |¡ 7 }nd}|d	 S )
Nc                s\   ˆj  | ¡}ˆ rX| ˆ ¡rX|d tˆ ƒ … }ˆ  d¡}|d  dd¡|d< |d |¡7 }|S )Nú[r   rY   z::)rR   Zcwd_relative_nodeidÚendswithrl   r“   rV   rB   )rh   r3   r   )Údomainr   r   r   Úmkrel¼  s    
z-TerminalReporter._locationline.<locals>.mkrelrg   z::r   ú\z <- z
[location]rA   )rŠ   r“   rV   r   ZSEPry   r•   )r   rh   r™   rµ   r  r  r—   r   )r  r   r   r¿   »  s    zTerminalReporter._locationlinec             C   s"   t |dƒr|j\}}}|S dS d S )NrÀ   ztest session)rÈ   rÀ   )r   rÌ   r™   rµ   r  r   r   r   Ú_getfailureheadlineÑ  s    
z$TerminalReporter._getfailureheadlinec             C   sN   yt |jjƒS  tk
rH   yt |jƒd d… S  tk
rB   dS X Y nX d S )Né2   r+   )rD   Zlongreprr  rÖ   )r   rÌ   r   r   r   Ú_getcrashlineØ  s    zTerminalReporter._getcrashlinec             C   s4   g }x*| j  |g ¡D ]}t|dƒs| |¡ qW |S )NZ	_pdbshown)rx   r   rÈ   r¶   )r   rû   r   r   r   r   r   Ú
getreportsä  s
    
zTerminalReporter.getreportsc             C   sB  |   d¡r>| j d¡}|s d S t| dƒ}|r>|| jd … }n|}t|ƒ| _|sTd S t ¡ }x |D ]}| |j	g ¡ 
|¡ qbW |r†dnd}| jd|ddd	 x”| ¡ D ]ˆ\}}d}x0|D ](}	|	 | j¡}
|
r¸| j t|
ƒ¡ d}q¸W |r| ¡ }d
 dd„ |D ƒ¡}| ¡ }n| ¡ }| j |¡ | j ¡  q¦W | j d¡ d S )NrT   r³   Ú_already_displayed_warningszwarnings summary (final)zwarnings summaryr¬   TF)rÄ   r×   r¯   c             s   s   | ]}d | V  qdS )z  Nr   )rÜ   r   r   r   r   ú	<genexpr>	  s    z4TerminalReporter.summary_warnings.<locals>.<genexpr>z8-- Docs: https://docs.pytest.org/en/latest/warnings.html)r‘   rx   r   rÈ   r  rl   ÚcollectionsÚOrderedDictr´   rt   r¶   r«   r½   rr   rR   rz   r3   rD   rý   rB   Úrstrip)r   Zall_warningsrá   Zwarning_reportsZreports_grouped_by_messageÚwrrª   rt   Zhas_any_locationrT   rÀ   rî   Zindentedr   r   r   r	  ë  s>    




z!TerminalReporter.summary_warningsc             C   sn   | j jjdkrj|  d¡rj|  d¡}|s*d S |  dd¡ x2|D ]*}|jr<|  |¡}|  d|¡ |  |¡ q<W d S )Nr2   ÚPr]   r¬   ZPASSESÚ_)	rR   rN   r0   r‘   r  r«   Úsectionsr  Ú_outrep_summary)r   ÚreportsrÌ   rG   r   r   r   r
    s    



zTerminalReporter.summary_passesc             C   s~   | j jj}|dkrd S xb|jD ]X\}}|dkr8||kr8qd|kr| j d|¡ |dd … dkrj|d d… }| j |¡ qW d S )Nr2   r9   Úteardownú-rø   r¯   )rR   rN   r5   r!  rz   r©   r3   )r   rÌ   r5   Úsecnamer    r   r   r   Úprint_teardown_sections  s    
z(TerminalReporter.print_teardown_sectionsc             C   s¼   | j jjdkr¸|  d¡}|s d S |  dd¡ xŠ|D ]‚}| j jjdkrZ|  |¡}|  |¡ q2|  |¡}| jd|ddd |  |¡ x2|  d	¡D ]$}|j	|j	krŒ|j
d
krŒ|  |¡ qŒW q2W d S )Nr2   r_   r¬   ZFAILURESr3   r   T)rÅ   r×   r+   r$  )rR   rN   r0   r  r«   r  rE   r  r"  rh   r`   r'  )r   r#  rÌ   r3   rG   rc   r   r   r   r  +  s    




z!TerminalReporter.summary_failuresc             C   s¤   | j jjdkr |  d¡}|s d S |  dd¡ xr| jd D ]d}|  |¡}|jdkrZd| }n&|jdkrnd| }n|jd	kr€d
| }| jd|ddd |  |¡ q8W d S )Nr2   rÚ   r¬   ZERRORSZcollectzERROR collecting ZsetupzERROR at setup of r$  zERROR at teardown of r   T)rÅ   r×   )	rR   rN   r0   r  r«   rx   r  r`   r"  )r   r#  rÌ   rG   r   r   r   r  =  s    






zTerminalReporter.summary_errorsc             C   s‚   |  | j¡ | jjj}|dkr"d S xZ|jD ]P\}}|dkrD||krDq*| j d|¡ |dd … dkrn|d d… }| j |¡ q*W d S )Nr2   r9   r%  rø   r¯   )rö   rz   rR   rN   r5   r!  r©   r3   )r   rÌ   r5   r&  r    r   r   r   r"  N  s    
z TerminalReporter._outrep_summaryc             C   sj   t   ¡ | j }t| jƒ\}}d||f }|dddi}| jdkrN| jd|f|Ž | jdkrf| j|f|Ž d S )Nz%s in %.2f secondsTr×   r   r¬   rø   )rØ   ræ   Úbuild_summary_stats_linerx   rŠ   r«   rE   )r   Zsession_durationr3   r:   rG   r˜   r   r   r   r  [  s    

zTerminalReporter.summary_stats)N)r+   )N)r¬   )F):r!   r"   r#   r   r‚   ÚpropertyrŠ   r‹   rŒ   ÚsetterrŽ   r‘   rš   rž   rŸ   r–   rE   r¨   r«   r®   r3   r±   r¸   rº   r¾   rÁ   rÎ   rÒ   rË   r”   rÑ   rÙ   rà   rß   rÛ   Zhookimplrã   rï   rì   rë   r÷   rõ   r  r  r  r  r  r¿   r  r  r  r	  r
  r'  r  r  r"  r  r   r   r   r   rJ   Ü   sh   


	


3	

(#
&rJ   c             C   sÆ   d  ¡ }d}x*|  ¡ D ]}||kr|r| |¡ d}qW g }x2|D ]*}|  |d ¡}|rB| dt|ƒ|f ¡ qBW |r€d |¡}nd}d| ks”d| kršd	}n$d
| ks¦|r¬d}nd| krºd}nd}||fS )Nz?failed passed skipped deselected xfailed xpassed warnings errorFTz%d %sz, zno tests ranr_   rÚ   rÅ   r³   rÄ   r]   rÃ   )r“   Úkeysr¶   r   rl   rB   )rx   r+  Zunknown_key_seenÚkeyÚpartsÚvalr3   r:   r   r   r   r(  g  s.    

r(  c             C   sN   g }xD| D ]<\}}dj |d}| d¡r4|dd … }||kr
| |¡ q
W |S )Nz"{dist.project_name}-{dist.version})Údistzpytest-é   )rÐ   Ú
startswithr¶   )ró   r   r¹   r/  rû   r   r   r   rò   †  s    
rò   )%r$   Z
__future__r   r   r   Úargparser  rç   rK   rØ   rs   ré   rm   r¢   Zmore_itertoolsr   rÛ   r†   r   Z_pytest.mainr   r   r	   r
   r   ZActionr   r?   rS   rX   re   rZ   Úobjectrf   rJ   r(  rò   r   r   r   r   Ú<module>   sF   [!     