B
    `z                 @   sv  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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 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 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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$ 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. ddl+m/Z/ ddl0m1Z1 ddl2m3Z3 dd l2m4Z4 dd!l5m6Z6 dd"l5m7Z7 dd#l8m9Z9 dd$l8m:Z: dd%l8m;Z; erdd&l<m=Z= dd'l>m?Z? d(Z@d)ZAd*ZBG d+d, d,ejCZDe1dd-d.d/ZEe-dd0d1d2ZFe-eGd0d3d4ZHe/d5d6e9eeGeGeGf d7d8d9ZIejJG d:d; d;ZKe*G d<d= d=ZLe-e9d>d?d@ZMeGeGeNeeG dAdBdCZOe-e9eNeGdDdEdFZPeee: eeeNeGeeN eGf  dGdHdIZQdJdJdKdLdMZRdKZSeNeGeeNeGf dNdOdPZTeeG dQdRdSZUeVeGdTdUdVZWe;eGd7dWdXZXdS )YzsTerminal reporting of the full testing process.

This is a good source for looking at the various reporting hooks.
    N)Counter)partial)Path)Any)Callable)cast)Dict)	Generator)List)Mapping)Optional)Sequence)Set)TextIO)Tuple)TYPE_CHECKING)Union)nodes)timing)ExceptionInfo)ExceptionRepr)wcswidth)final)_PluggyPlugin)Config)ExitCode)hookimpl)Parser)Item)Node)absolutepath)bestrelpath)
BaseReport)CollectReport)
TestReport)Literal)Sessiong      ?)failedpassedskipped
deselectedxfailedxpassedwarningserrorZfEc                   sh   e Zd ZdZd
ee eeeee dd fddZ	de
je
jeeee df ee dddd	Z  ZS )MoreQuietActionzA 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.
    NF)option_stringsdestdefaultrequiredhelpreturnc                s   t  j||d|||d d S )Nr   )r0   r1   nargsr2   r3   r4   )super__init__)selfr0   r1   r2   r3   r4   )	__class__ X/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/_pytest/terminal.pyr8   R   s    zMoreQuietAction.__init__)parser	namespacevaluesoption_stringr5   c             C   s6   t || jdd }t|| j| t |ddd |_d S )Nr      quiet)getattrr1   setattrrB   )r9   r=   r>   r?   r@   Z	new_countr;   r;   r<   __call__c   s    zMoreQuietAction.__call__)NFN)N)__name__
__module____qualname____doc__r   strobjectboolr   r8   argparseArgumentParser	Namespacer   rE   __classcell__r;   r;   )r:   r<   r/   K   s      r/   )r=   r5   c             C   sZ  | j dddd}|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tdd	dd |jdd	tddd |jd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.d/d0d1d2gd3d4 |jd5dd6d0d7d8d9d:gd:d;d< |jd=d>ddd?d@ |jdAdBddBd-dCd0d-gdDd4 |jdEdCdCd0gdFdG | jdHdIdJdK d S )LNzterminal reportingZ	reportingZgeneral)afterz-vz	--verbosecountr   verbosezincrease verbosity.)actionr2   r1   r4   z--no-header
store_trueF	no_headerzdisable headerz--no-summary
no_summaryzdisable summaryz-qz--quietzdecrease verbosity.z--verbosityzset verbosity. Default is 0.)r1   typer2   r4   z-rstorereportcharscharsa  show extra test summary info as specified by chars: (f)ailed, (E)rror, (s)kipped, (x)failed, (X)passed, (p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll. (w)arnings are enabled by default (see --disable-warnings), 'N' can be used to reset the list. (default: 'fE').)rT   r1   r2   metavarr4   z--disable-warningsz--disable-pytest-warningsdisable_warningszdisable warnings summary)r2   r1   rT   r4   z-lz--showlocalsZ
showlocalsz0show locals in tracebacks (disabled by default).)rT   r1   r2   r4   z--tbstyletbstyleautolongshortnolineZnativez6traceback print mode (auto/long/short/line/native/no).)r\   rT   r1   r2   choicesr4   z--show-captureshowcapturestdoutstderrlogallzSControls how captured stdout/stderr/log is shown on failed tests. Default is 'all'.)rT   r1   re   r2   r4   z--fulltracez--full-tracez-don't cut any tracebacks (default is to cut).)rT   r2   r4   z--colorcoloryesz$color terminal output (yes/no/auto).z--code-highlightzDWhether code should be highlighted (only if --color is also enabled))r2   re   r4   console_output_stylezgconsole output: "classic", or with additional progress information ("progress" (percentage) | "count").progress)r4   r2   )ZgetgroupZ
_addoptionr/   int_REPORTCHARS_DEFAULTZaddini)r=   groupr;   r;   r<   pytest_addoptionp   s    rr   )configr5   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maprJ   
write_line)tagsargsmsg)reporterr;   r<   mywriter   s    z"pytest_configure.<locals>.mywriterzpytest:config)TerminalReportersysrg   pluginmanagerregisteroptiondebugtraceconfigtracerootZsetprocessor)rs   r}   r;   )r|   r<   pytest_configure   s
    r   c             C   s   | j j}ddh}d}xV|D ]N}||kr.| }|dkr<d}q|dkrJd}q|dkrXd}q||kr||7 }qW | j jsd	|krd	| }n| j jrd	|kr|d	d}|S )
NFS aZsxXEfAZPpsxXEfNw)r   rZ   lowerr]   replace)rs   rZ   Zold_aliasesZ
reportoptscharr;   r;   r<   getreportopt   s&    

r   T)trylast)reportr5   c             C   sH   d}| j rd}n
| jrd}| j}| jdkr:|dkr:d}d}||| fS )Nr   .s)collectsetupteardownr'   r.   E)r(   r)   outcomewhenupper)r   letterr   r;   r;   r<   pytest_report_teststatus  s    r   c               @   sl   e Zd ZdZejedZejee ddZ	ejee
eeef ejjf  ddZdZeee dddZdS )	WarningReporta}  Simple structure to hold warnings information captured by ``pytest_warning_recorded``.

    :ivar str message:
        User friendly message about the warning.
    :ivar str|None nodeid:
        nodeid 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``).
    )rX   N)rX   r2   T)rs   r5   c             C   sl   | j r| j S | jrht| jtr^t| jdkr^| jdd \}}t|jjt|}| d| S t	| jS dS )zSReturn the more user-friendly information about the location of a warning, or None.   N:)
nodeid
fslocation
isinstancetuplelenr!   invocation_paramsdirr    rJ   )r9   rs   filenamelinenumrelpathr;   r;   r<   get_location+  s    
zWarningReport.get_location)rF   rG   rH   rI   attribrJ   messager   r   r   r   ro   pypathlocalr   count_towards_summaryr   r   r;   r;   r;   r<   r     s   
"r   c               @   s  e Zd Zdeee ddddZddddZee	dd	d
Z
eedddZeedddZeedddZeedddZejee ddddZeedddZeedddZeeddddZdeedddd Zddd!d"Zd#d$eeedd%d&d'Zddd(d)Zeeef edd*d+d,Zeedd*d-d.Zdeee ee	 edd/d0d1Zdeeedd3d4d5Zeedd6d7d8Zee e! dd9d:d;Z"e#ed<d=d>Z$e%j&edd?d@dAZ'e(ddBdCdDZ)e e* ddEdFdGZ+ee,eee	 ef ddHdIdJZ-e.ddKdLdMZ/eeddNdOZ0eddPdQdRZ1eddSdTZ2dddUdVZ3ee	ddWdXZ4dddYdZZ5e6ddKd[d\Z7dedd]d^d_Z8e9d`dadbddcdddeZ:e eee e f  ddfdgdhZ;ee<e didjdkZ=dbddcdldmZ>e e* ddEdndoZ?e9d`dpdbee	e@f dqdrdsZAe9d`dpeBdt ddudvZCeDeE ddwdxdyZFdddzd{ZGddd|d}ZHd~d ZIdd ZJdd ZKedddZLddddZMddddZNee<e. dPddZOeddPddZPe.ddddZQddddZRddddZSeTddddZUddddZVddddZWe,ee<e f dddZXeedddZYddddZZe,e<e,ee[eef f  ef dddZ\ee<e! dddZ]e,e<e,ee[eef f  ef dddZ^e,e<e,ee[eef f  ef dddZ_dS )r~   N)rs   filer5   c             C   s   dd l }|| _d| _d | _d | _i | _d | _d | _|j| _	|j
j| _|d krRtj}|j||| _| jj| _d | _t|| _| jj| _| | _t | _|  | _d | _d | _d | _d S )Nr   )_pytest.configrs   _numcollected_session_showfspathstats_main_color_known_typesZinvocation_dirstartdirr   r   	startpathr   rg   Zcreate_terminal_writer_tw	fullwidth_screen_widthcurrentfspathr   rZ   Z	hasmarkupisattyset_progress_nodeids_reported_determine_show_progress_info_show_progress_info_collect_report_last_write_already_displayed_warnings_keyboardinterrupt_memo)r9   rs   r   _pytestr;   r;   r<   r8   =  s.    





zTerminalReporter.__init__z#Literal['progress', 'count', False])r5   c             C   sT   | j dddkrdS | j ddr(dS | j d}|dkr@dS |dkrLdS dS dS )	zRReturn whether we should display progress information based on the current config.capturerc   FZ	setupshowrm   rn   rR   N)rs   	getoptiongetini)r9   cfgr;   r;   r<   r   X  s    z.TerminalReporter._determine_show_progress_infoc             C   s   | j jj}|S )N)rs   r   rS   )r9   	verbosityr;   r;   r<   r   h  s    
zTerminalReporter.verbosityc             C   s
   | j dkS )Nr   )r   )r9   r;   r;   r<   
showheaderm  s    zTerminalReporter.showheaderc             C   s   t | jjjS )N)rL   rs   r   rV   )r9   r;   r;   r<   rV   q  s    zTerminalReporter.no_headerc             C   s   t | jjjS )N)rL   rs   r   rW   )r9   r;   r;   r<   rW   u  s    zTerminalReporter.no_summaryc             C   s   | j d kr| jdkS | j S )Nr   )r   r   )r9   r;   r;   r<   
showfspathy  s    

zTerminalReporter.showfspath)valuer5   c             C   s
   || _ d S )N)r   )r9   r   r;   r;   r<   r     s    c             C   s
   | j dkS )Nr   )r   )r9   r;   r;   r<   showlongtestinfo  s    z!TerminalReporter.showlongtestinfo)r   r5   c             C   s   ddd ||}|| jkS )Nxr   )r+   r)   )getrZ   )r9   r   r;   r;   r<   hasopt  s    zTerminalReporter.hasopt)r   markupr5   c             K   s   | j j|dd  }| jd ks*|| jkrn| jd k	rB| jrB|   || _t| j|}| j	  | j
|d  | jj
|fddi| d S )Nz::r   ru   flushT)rs   rootpathsplitr   r   )_write_progress_information_filling_spacer!   r   r   rd   write)r9   r   resr   fspathZ	relfspathr;   r;   r<   write_fspath_result  s    
z$TerminalReporter.write_fspath_resultr   )prefixextrar5   c             K   sD   | j |kr&| j  || _ | j| |r@| jj|f| d| _ d S )N)r   r   rd   r   )r9   r   r   kwargsr;   r;   r<   write_ensure_prefix  s    

z$TerminalReporter.write_ensure_prefixc             C   s   | j r| j  d | _ d S )N)r   r   rd   )r9   r;   r;   r<   ensure_newline  s    
zTerminalReporter.ensure_newlineF)r   )contentr   r   r5   c            K   s   | j j|fd|i| d S )Nr   )r   r   )r9   r   r   r   r;   r;   r<   r     s    zTerminalReporter.writec             C   s   | j   d S )N)r   r   )r9   r;   r;   r<   r     s    zTerminalReporter.flush)rd   r   r5   c             K   s2   t |tst|dd}|   | jj|f| d S )Nr   )errors)r   rJ   r   r   rd   )r9   rd   r   r;   r;   r<   rx     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.

        :param 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.
        eraseFrA   ru   r   N)popr   r   r   rJ   r   )r9   rd   r   r   Z
fill_countfillr;   r;   r<   rewrite  s    	
zTerminalReporter.rewrite)septitler   r   r5   c             K   s    |    | jj|||f| d S )N)r   r   r   )r9   r   r   r   r   r;   r;   r<   	write_sep  s    zTerminalReporter.write_sep=)r   r   kwr5   c             K   s   | j j||f| d S )N)r   r   )r9   r   r   r   r;   r;   r<   section  s    zTerminalReporter.section)r{   r   r5   c             K   s   | j j|f| d S )N)r   rd   )r9   r{   r   r;   r;   r<   rd     s    zTerminalReporter.line)categoryitemsr5   c             C   s.   || j k}| j |g | |r*|   d S )N)r   
setdefaultextend_set_main_color)r9   r   r   Zset_main_colorr;   r;   r<   
_add_stats  s    
zTerminalReporter._add_stats)excreprr5   c             C   s*   x$t |dD ]}| d|  qW dS )N
zINTERNALERROR> T)rJ   r   rx   )r9   r   rd   r;   r;   r<   pytest_internalerror  s    z%TerminalReporter.pytest_internalerror)warning_messager   r5   c             C   s@   ddl m} |j|jf}||}t|||d}| d|g d S )Nr   )warning_record_to_str)r   r   r   r-   )Z_pytest.warningsr   r   linenor   r   )r9   r   r   r   r   r   Zwarning_reportr;   r;   r<   pytest_warning_recorded  s    z(TerminalReporter.pytest_warning_recorded)pluginr5   c             C   s"   | j jjrd| }| | d S )NzPLUGIN registered: )rs   r   r   rx   )r9   r  r{   r;   r;   r<   pytest_plugin_registered  s    

z)TerminalReporter.pytest_plugin_registered)r   r5   c             C   s   |  d| d S )Nr*   )r   )r9   r   r;   r;   r<   pytest_deselected  s    z"TerminalReporter.pytest_deselected)r   locationr5   c             C   sJ   | j r,| j|f| }| |d |   n| jrF| |d |   d S )Nr   )r   _locationliner   r   r   r   )r9   r   r  rd   r;   r;   r<   pytest_runtest_logstart  s    
z(TerminalReporter.pytest_runtest_logstart)r   r5   c             C   s  d| _ |}| jjj|| jd}|\}}}t|ts8d }n|\}}| ||g |sZ|sZd S t|d}|d krt|d}	|jr|	sddi}n8|jr|	rddi}n$|j	rddi}n|j
rddi}ni }| jdkr| jj|f| n| j|j | j|jf|j }
|s| j|
|f| |j
s,t|drx| jj| jj td	 d
 }t|}td||}|rx|d k	rx| j| | 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 )NT)r   rs   nodewasxfailgreenyellowredr   z [100%]rA   z ({})z[%s]ru   )Zcyanr   )"Z
_tests_ranrs   hookr   r   r   r   hasattrr(   r'   r)   r   r   r   r   addr   r  r  r   r   width_of_current_liner   _get_raw_skip_reason_format_trimmedr   r   r   r  Zgatewayid!_get_progress_information_messager   r   )r9   r   repr   r   r   wordr   Zrunning_xdistZ	was_xfailrd   available_widthreasonZreason_r;   r;   r<   pytest_runtest_logreport  s\    











z)TerminalReporter.pytest_runtest_logreportc             C   s    | j d k	stt| j| j jkS )N)r   AssertionErrorr   r   testscollected)r9   r;   r;   r<   _is_last_item?  s    zTerminalReporter._is_last_item)r   r5   c       	      C   s   | j s
t| jdkr| jr| jdkrF| j j}tdt|t|}ntd}| j	| | j
rj|   nH|  \}}| j}|| d | jk}|r|  }| jj|d f|di d S )Nr   rR   z [{}/{}]z [100%]rA   r   T)r   r  r   r   r  r   formatrJ   r   r  r  r   _get_main_color_width_of_current_liner   r  r   r   )	r9   r   Z	num_testsZprogress_length
main_color_r   Z	past_edger{   r;   r;   r<   pytest_runtest_logfinishD  s    


z)TerminalReporter.pytest_runtest_logfinishc             C   s   | j s
t| j j}| jdkrf|rT| j}dtt|}d| d}|t||S d| d| dS |rdt| jd	 | S d
S d S )NrR   z{{:{}d}}z [z/{}]z [ z / z ]z	 [{:3d}%]d   z [100%])r   r  r  r   r   r  r   rJ   )r9   Z	collectedrn   Zcounter_formatformat_stringr;   r;   r<   r  Y  s    

z2TerminalReporter._get_progress_information_messagec             C   sN   |   \}}|  }| j}| jj| d }| j||fddi|di d S )NrA   r   T)r  r  r  r   r   r   rjust)r9   rk   r   r{   r   r   r;   r;   r<   r   j  s
    z:TerminalReporter._write_progress_information_filling_spacec             C   s   | j jS )z%Return the width of the current line.)r   r  )r9   r;   r;   r<   r  q  s    z'TerminalReporter._width_of_current_linec             C   sR   | j r0| jjjdkrN| jdddd t | _n| jjjdkrN| jdddd d S )Nr   zcollecting ... T)r   boldrA   )r   rs   r   rS   r   r   timer   )r9   r;   r;   r<   pytest_collectionv  s    z"TerminalReporter.pytest_collectionc             C   s^   |j r| d|g n|jr*| d|g dd |jD }|  jt|7  _| jrZ|   d S )Nr.   r)   c             S   s   g | ]}t |tr|qS r;   )r   r   ).0r   r;   r;   r<   
<listcomp>  s    z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)r'   r   r)   resultr   r   r   report_collect)r9   r   r   r;   r;   r<   pytest_collectreport~  s    z%TerminalReporter.pytest_collectreport)r   r5   c             C   s\  | j jjdk rd S |s@t }| jd k	r:| j|t kr:d S || _t| j	dg }t| j	dg }t| j	dg }| j
| | | }|rd}nd}|t| j
d | j
dkrd	nd
 7 }|r|d||dkrd
nd	f 7 }|r|d| 7 }|r|d| 7 }| j
|  krdkr$n n|d| 7 }| jrN| j|ddd |rX| d n
| | d S )Nr   r.   r)   r*   z
collected zcollecting z itemrA   r   r   z / %d error%sz / %d deselectedz / %d skippedz / %d selectedT)r%  r   r   )rs   r   rS   r   r&  r   REPORT_COLLECTING_RESOLUTIONr   r   r   r   rJ   r   r   r   rx   )r9   r   tr   r)   r*   selectedrd   r;   r;   r<   r+    s<    
"zTerminalReporter.report_collectT)r   r&   )sessionr5   c             C   s  || _ t | _| jsd S | jdddd t }| jsdt	j d| }t
t	dd }|rdtt|d d	 }|d
||d	 7 }|dtjjtjtj7 }| jdks| jjjst
| 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 z -- Python pypy_version_infor      z[pypy-{}-{}]z, pytest-{}, py-{}, pluggy-{}r   Zpastebinz -- )rs   r   )r   r   r&  _sessionstarttimer   r   platformpython_versionrV   r   rC   rv   rw   rJ   r  r   _versionversionr   __version__pluggyr   rs   r   r   
executablerx   r  pytest_report_headerr   _write_report_lines_from_hooks)r9   r0  Zverinfor{   r1  linesr;   r;   r<   pytest_sessionstart  s,    



z$TerminalReporter.pytest_sessionstart)r=  r5   c             C   sD   x>t |D ]2}t|tr$| | q
x|D ]}| | q*W q
W d S )N)reversedr   rJ   rx   )r9   r=  Zline_or_linesrd   r;   r;   r<   r<    s
    

z/TerminalReporter._write_report_lines_from_hooks)rs   r5   c             C   s   d|j  }|jr&|dt|j |j 7 }|d}|jj|j kr\|j|kr\|dd|7 }|g}|j	
 }|r|ddt|  |S )Nzrootdir: %sz, configfile: 	testpathsz, testpaths: {}z, zplugins: %s)r   Zinipathr!   r   r   r   rz   r  rv   r   Zlist_plugin_distinfoappend_plugin_nameversions)r9   rs   rd   r@  r*  
plugininfor;   r;   r<   r;    s    


z%TerminalReporter.pytest_report_headerc             C   s   |  d | jjj| j| j|jd}| | | jdr|jrf| jjj	dkrZ| j
d | |j | jd}|r| j
dd x|D ]}|| j
 qW d S )	NT)rs   r   r   collectonlyr   r'   !zcollection failures)r+  rs   r  Zpytest_report_collectionfinishr   r   r<  r   r   rS   r   rd   _printcollecteditemsr   r   r   
toterminal)r9   r0  r=  r'   r  r;   r;   r<   pytest_collection_finish  s    


z)TerminalReporter.pytest_collection_finishc          	   C   s  | j jjdk r~| j jjdk r^tdd |D }xJt| D ]\}}| jd||f  q<W nx|D ]}| j|j qdW d S g }d}x|D ]}|	 dd  }x&|r||d t
| krP |  qW x|t
|d  D ]}	||	 |	jdkrqt
|d d	 }| j| |	  | j jjdkrt|	d
d }
|
rBt|
nd }|rx*| D ]}| jd|d	 | qTW qW qW d S )Nr   rE  c             s   s    | ]}|j d dd V  qdS )z::rA   r   N)r   r   )r(  itemr;   r;   r<   	<genexpr>  s    z8TerminalReporter._printcollecteditems.<locals>.<genexpr>z%s: %dr   rA   z()z  objz{}{})rs   r   rS   r   sortedr   r   rd   r   Z	listchainr   r   rA  namerC   inspectgetdoc
splitlinesr  )r9   r   countsrN  rR   rJ  stackindentZneeded_collectorscolrL  docrd   r;   r;   r<   rG    s8    



z%TerminalReporter._printcollecteditems)Zhookwrapper)r0  
exitstatusc             c   s   d V }|   | jd tjtjtjtjtjf}||krV| j	sV| j
jj| || j
d |jrr| jdt|jdd |tjkr|   d | _n|jr| jdt|jdd |   d S )Nr   )rt   rW  rs   rF  T)r  )Z
get_resultr   rd   r   OKZTESTS_FAILEDZINTERRUPTEDZUSAGE_ERRORZNO_TESTS_COLLECTEDrW   rs   r  pytest_terminal_summaryZ
shouldfailr   rJ   _report_keyboardinterruptr   Z
shouldstopsummary_stats)r9   r0  rW  r   Zsummary_exit_codesr;   r;   r<   pytest_sessionfinish  s&    
z%TerminalReporter.pytest_sessionfinish)NNNc             c   s:   |    |   |   |   d V  |   |   d S )N)summary_errorssummary_failuressummary_warningssummary_passesshort_test_summary)r9   r;   r;   r<   rY  9  s    z(TerminalReporter.pytest_terminal_summary)excinfor5   c             C   s   |j dd| _d S )NT)Zfuncargs)Zgetreprr   )r9   rb  r;   r;   r<   pytest_keyboard_interruptD  s    z*TerminalReporter.pytest_keyboard_interruptc             C   s   | j d k	r|   d S )N)r   rZ  )r9   r;   r;   r<   pytest_unconfigureG  s    
z#TerminalReporter.pytest_unconfigurec             C   sv   | j }|d k	st|jd k	s t|jj}| d| d|krr| jjjrT|| j	 n|j| j	 | j	j
ddd d S )NrF  KeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)r
  )r   r  	reprcrashr   r   rs   r   Z	fulltracerH  r   rd   )r9   r   r{   r;   r;   r<   rZ  K  s    
z*TerminalReporter._report_keyboardinterruptc                sb    fdd}|rV||}j dkrZ|dd |dtjkrZ|dtj| 7 }nd}|d	 S )
Nc                s\   j | } rX| rX|d t   } d}|d dd|d< |d|7 }|S )N[r   r   z::)rs   cwd_relative_nodeidendswithr   r   r   rv   )r   rd   r?   )domainr9   r;   r<   mkrel\  s    
z-TerminalReporter._locationline.<locals>.mkrelr   z::r   \z <- z
[location]ru   )r   r   r   r   ZSEPr!   r   )r9   r   r   r   rj  rk  r   r;   )rj  r9   r<   r  [  s    zTerminalReporter._locationlinec             C   s   |j }|r|S dS )Nztest session)	head_line)r9   r  rm  r;   r;   r<   _getfailureheadlineq  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 )N2   r   )rJ   longreprrf  AttributeError)r9   r  r;   r;   r<   _getcrashlinew  s    zTerminalReporter._getcrashline)rN  c             C   s4   g }x*| j |g D ]}t|ds|| qW |S )NZ	_pdbshown)r   r   r  rA  )r9   rN  r?   r   r;   r;   r<   
getreports  s
    
zTerminalReporter.getreportsc                s4    dr0 jd}|s d S  jd k	}|r>| jd  }n|}t| _|sTd S i }x |D ]}||jg | q^W tt	 t
d fdd}|rdnd} jd|d	d
d xr| D ]f\}}	||	}
|
r j|
 | }ddd |D }| }n| } j|  j  qW  jd d S )Nr   r-   )reportsr5   c                sr   g }x&| D ]}|  j}|r
|| q
W t|dk rHdtt|S tdd |D }ddd | D S )N
   r   c             s   s"   | ]}t |d dd V  qdS )z::rA   r   N)rJ   r   )r(  locr;   r;   r<   rK    s    zWTerminalReporter.summary_warnings.<locals>.collapsed_location_report.<locals>.<genexpr>c             s   s,   | ]$\}}d  |||dkrdndV  qdS )z{}: {} warning{}rA   r   r   N)r  )r(  kvr;   r;   r<   rK    s   )	r   rs   rA  r   rv   rw   rJ   r   r   )rt  	locationsr   r  Zcounts_by_filename)r9   r;   r<   collapsed_location_report  s    
zDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportz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<   rK    s    z4TerminalReporter.summary_warnings.<locals>.<genexpr>z8-- Docs: https://docs.pytest.org/en/stable/warnings.html)r   r   r   r   r   r   r   rA  r
   r   rJ   r   r   r   rd   rQ  rv   rstrip)r9   Zall_warningsr   Zwarning_reportsZreports_grouped_by_messagewrrz  r   r   Zmessage_reportsZmaybe_locationr=  Zindentedr;   )r9   r<   r_    s8    



z!TerminalReporter.summary_warningsc             C   s   | j jjdkr|| dr|| d}|s*d S | dd xD|D ]<}|jrl| |}| jd|ddd | | | 	|j
 q<W d S )	Nrc   Pr(   r   ZPASSESr   T)r	  r%  )rs   r   r_   r   rs  r   sectionsrn  _outrep_summary_handle_teardown_sectionsr   )r9   rt  r  r{   r;   r;   r<   r`    s    




zTerminalReporter.summary_passesc                s   |  d} fdd|D S )Nr   c                s$   g | ]}|j d kr|j kr|qS )r   )r   r   )r(  r   )r   r;   r<   r)    s   z:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)rs  )r9   r   rt  r;   )r   r<   _get_teardown_reports  s    

z&TerminalReporter._get_teardown_reportsc             C   s"   x|  |D ]}| | qW d S )N)r  print_teardown_sections)r9   r   r   r;   r;   r<   r    s    z*TerminalReporter._handle_teardown_sections)r  r5   c             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 )Nrc   rj   r   -rE  r   )rs   r   rf   r~  r   r   rd   )r9   r  rf   secnamer   r;   r;   r<   r    s    
z(TerminalReporter.print_teardown_sectionsc             C   s   | j jjdkr| d}|s d S | dd | j jjdkr^xb|D ]}| |}| | q@W n@x>|D ]6}| |}| jd|ddd | | | 	|j
 qdW d S )	Nrc   r'   r   ZFAILURESrd   r   T)r  r%  )rs   r   r_   rs  r   rr  rx   rn  r  r  r   )r9   rt  r  rd   r{   r;   r;   r<   r^    s    





z!TerminalReporter.summary_failuresc             C   s   | j jjdkr| d}|s d S | dd x^| jd D ]P}| |}|jdkrZd| }nd|j d| }| jd	|d
d
d | | q8W d S )Nrc   r.   r   ZERRORSr   zERROR collecting z	ERROR at z of r   T)r  r%  )	rs   r   r_   rs  r   r   rn  r   r  )r9   rt  r  r{   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 )Nrc   rj   r  rE  r   )rH  r   rs   r   rf   r~  r   rd   )r9   r  rf   r  r   r;   r;   r<   r    s    
z TerminalReporter._outrep_summaryc             C   sH  | j dk rd S t | j }|  \}}g }| j dk}|rB| jj}xB|D ]:\}}| jj|f|}	|rx|t|	t| 7 }|	|	 qHW d
|}
|di}dt|}| jj|f|}|r|t|t| 7 }|
|7 }
|r| jjd|}|dr|d d }|t|7 }|
|7 }
|r6| jd	|
fd
|i| n| j|
f| d S )NrE  r   z, Tz in {}r   z[0mr   r   )r   )r   r   r&  r3  build_summary_stats_liner   r   r   r   rA  rv   r  format_session_durationri  r   rx   )r9   Zsession_durationpartsr  Z
line_partsZdisplay_sepr   textr   Zwith_markupr{   Zmain_markupdurationZduration_with_markupZmarkup_for_end_sepr;   r;   r<   r[    s:    


zTerminalReporter.summary_statsc       
         s    j s
d S tt d d fdd}tt d d fdd}tt d d fdd}tt d d fdd	}||t|d
|t|dt|dd}g }x$ j D ]}||}|r|| qW |r dd x|D ]}	 |	 qW d S )N)r=  r5   c                sL    j | g }|sd S  jj} j}x"|D ]}t|||}|| q*W d S )N)r   r   r   r   rs    _get_line_with_reprcrash_messagerA  )statr=  r'   	termwidthrs   r  rd   )r9   r;   r<   show_simple;  s    
z8TerminalReporter.short_test_summary.<locals>.show_simplec                sh    j dg }xT|D ]L}| j}t j|}| | d|  |j}|r| dt|  qW d S )Nr+   ru   z  )r   r   _get_verbose_wordrs   _get_posrA  r  rJ   )r=  r+   r  verbose_wordposr  )r9   r;   r<   show_xfailedE  s    
z9TerminalReporter.short_test_summary.<locals>.show_xfailedc                sX    j dg }xD|D ]<}| j}t j|}|j}| | d| d|  qW d S )Nr,   ru   )r   r   r  rs   r  r  rA  )r=  r,   r  r  r  r  )r9   r;   r<   show_xpassedO  s    
z9TerminalReporter.short_test_summary.<locals>.show_xpassedc          	      s    j dg }|rt j|ng }|s*d S |d  j}xb|D ]Z\}}}}|drb|dd  }|d k	r| d|||||f  q@| d||||f  q@W d S )Nr)   r   z	Skipped: 	   z%s [%d] %s:%d: %sz%s [%d] %s: %s)r   r   _folded_skipsr   r  rs   
startswithrA  )r=  r)   Zfskipsr  numr   r   r  )r9   r;   r<   show_skippedW  s    
z9TerminalReporter.short_test_summary.<locals>.show_skippedr'   r(   r.   )r   Xfr   pr   r   zshort test summary info)rZ   r
   rJ   r   r   r   rx   )
r9   r  r  r  r  ZREPORTCHAR_ACTIONSr=  r   rT   rd   r;   )r9   r<   ra  7  s*    



z#TerminalReporter.short_test_summaryc             C   sB   | j d ks| jd ks| jr6|   | j s,t| js6t| j | jfS )N)r   r   r  r   r  )r9   r;   r;   r<   r  |  s
    

z TerminalReporter._get_main_color)unknown_type_seenr5   c             C   sR   | j }d|ksd|krd}n2d|ks0d|ks0|r6d}nd|ksD| jsJd}nd}|S )	Nr'   r.   r  r-   r,   r
  r(   r	  )r   r  )r9   r  r   r  r;   r;   r<   _determine_main_color  s    z&TerminalReporter._determine_main_colorc             C   sX   g }x0| j  D ]"}|r|tkr||kr|| qW tt| | _| t|| _d S )N)	r   keysKNOWN_TYPESrA  listr   r  rL   r   )r9   Zunknown_typesZ
found_typer;   r;   r<   r     s    z TerminalReporter._set_main_colorc             C   s    | j dr|  S |  S dS )a  
        Build the parts used in the last summary stats line.

        The summary stats line is the line shown at the end, "=== 12 passed, 2 errors in Xs===".

        This function builds a list of the "parts" that make up for the text in that line, in
        the example above it would be:

            [
                ("12 passed", {"green": True}),
                ("2 errors", {"red": True}
            ]

        That last dict for each line is a "markup dictionary", used by TerminalWriter to
        color output.

        The final color of the line is also determined by this function, and is the second
        element of the returned tuple.
        rD  N)rs   r   &_build_collect_only_summary_stats_line _build_normal_summary_stats_line)r9   r;   r;   r<   r    s    z)TerminalReporter.build_summary_stats_line)keyr5   c             C   s   | j |g }dd |D S )zRGet test/collection reports for the given status key, such as `passed` or `error`.c             S   s   g | ]}t |d dr|qS )r   T)rC   )r(  r   r;   r;   r<   r)    s    z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>)r   r   )r9   r  rt  r;   r;   r<   _get_reports_to_display  s    z(TerminalReporter._get_reports_to_displayc       	      C   s   |   \}}g }xV|D ]N}| |}|rt|}t|t}|dd||ki}|dt|| |f qW |szdtdifg}||fS )NTr%  z%d %szno tests ran)r  r  r   _color_for_typer   _color_for_type_defaultrA  	pluralize)	r9   r  Zknown_typesr  r  rt  rR   rk   r   r;   r;   r<   r    s    

z1TerminalReporter._build_normal_summary_stats_linec             C   s   t | d}t | d}| jdkr:dddifg}d}n|dkrfd}dt| jd	 }||difg}nT| j|k}|rd}d
| d}n&d}| j| }| d| j d| d}||difg}|rtd }|dt|d |difg7 }||fS )Nr*   r.   r   zno tests collectedr
  Tr	  z%d %s collectedtestzno tests collected (z deselected)/z tests collected (z%d %s)r   r  r   r  r  )r9   r*   r   r  r  Zcollected_outputZall_tests_were_deselectedr/  r;   r;   r<   r    s*    


z7TerminalReporter._build_collect_only_summary_stats_line)N)r   )NN)r   )F)`rF   rG   rH   r   r   r   r8   r   propertyro   r   rL   r   rV   rW   r   setterr   rJ   r   r   r   r   r   r   r   bytesrx   r   r   r   rd   r   r   r   r   r   r-   WarningMessager   r   r  r   r  r   r  r$   r  r  r!  r  r   r  r'  r#   r,  r+  r   r>  r<  r
   r;  rI  rG  r   r\  r	   rY  r   BaseExceptionrc  rd  rZ  r  rn  rr  rs  r_  r`  r  r  r  r^  r]  r"   r  r[  ra  r  r  r   r   r  r  r  r  r;   r;   r;   r<   r~   ;  s   	 =
("
4%E	**r~   )rs   r  c             C   s   |  |j}|S )N)rh  r   )rs   r  r   r;   r;   r<   r    s    r  )r  r{   r  r5   c             C   s   | d}|dkr|d| }d}t| d}|t| |krDdS |t| |kr|t|8 }|d| }x |t| |kr|dd }qnW ||7 }| |S )zFormat msg into format, ellipsizing it if doesn't fit in available_width.

    Returns None if even the ellipsis can't fit.
    r   rE  Nz...r   )findr   r  r   )r  r{   r  iZellipsisZformat_widthr;   r;   r<   r    s    
r  )rs   r  r  r5   c       	      C   sv   | | }t| |}| d| }t|}y|jjj}W n tk
rL   Y n&X || }td||}|dk	rr||7 }|S )z?Get summary line for a report, trying to add reprcrash message.ru   z - {}N)r  r  r   rp  rf  r   rq  r  )	rs   r  r  r  r  rd   
line_widthr{   r  r;   r;   r<   r    s    

r  )r   r)   r5   c             C   s   i }x|D ]}|j d k	stt|j ts6t||j ft|j dksRt||j f|j \}}}t| t|}t|di }|jdkrd|krd|kr|d |f}n
|||f}|	|g 
| q
W g }	x(| D ]\}}
|	
t|
f| qW |	S )Nr2  keywordsr   skipZ
pytestmark)rp  r  r   r   r   r!   r   rC   r   r   rA  r   )r   r)   deventr   r   r  r  r  r?   eventsr;   r;   r<   r     s$    


r  r  r
  r	  )r'   r.   r-   r(   )rR   nounr5   c             C   s4   |dkr| |fS | dd}| | dkr.|d n|fS )N)r.   r-   r  r-   warningrA   r   )r   )rR   r  r;   r;   r<   r  G  s    r  )r5   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  r  rA  )rC  r?   r  r  rN  r;   r;   r<   rB  T  s    
rB  )secondsr5   c             C   s:   | dk r| ddS t jt| d}| dd| dS dS )zQFormat the given seconds in a human readable manner to show in the final summary.<   z.2fr   )r  zs ()N)datetime	timedeltaro   )r  dtr;   r;   r<   r  b  s    r  c             C   s   t | dr4tt| j}|dr0|tdd }|S | js>tt| j	t
sNt| j	\}}}|drv|tdd }n|dkrd}|S dS )zqGet the reason string of a skip/xfail/xpass test report.

    The string is just the part given by the user.
    r  zreason: Nz	Skipped: ZSkippedr   )r  r   rJ   r  r  r   r)   r  r   rp  r   )r   r  r   r;   r;   r<   r  k  s    



r  )YrI   rM   r  rO  r4  r   r-   collectionsr   	functoolsr   pathlibr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r9  r   Z_pytest._versionr   r   r   Z_pytest._coder   Z_pytest._code.coder   Z_pytest._io.wcwidthr   Z_pytest.compatr   r   r   r   r   r   Z_pytest.config.argparsingr   Z_pytest.nodesr   r   Z_pytest.pathlibr    r!   Z_pytest.reportsr"   r#   r$   Ztyping_extensionsr%   Z_pytest.mainr&   r-  r  rp   Actionr/   rr   r   rJ   r   r   r   r   r~   r  ro   r  r  r  r  r  r  rB  floatr  r  r;   r;   r;   r<   <module>   s   
%s#       6"	