U
    42i1                     @  s@  d Z ddlmZ ddlZddlm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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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)Zddl*m+Z+ ddl,m-Z- ddl,m.Z. ddl,m/Z/ ddl,m0Z0 ddl1m2Z2 ddl3m4Z4 ddl3m5Z5 dd l6m7Z7 dd!l6m8Z8 dd"l9m:Z: dd#l9m;Z; dd$l9m<Z< erdd%l=m>Z> d&Z?d'Z@d(ZAG d)d* d*ejBZCG d+d, d,eZDd-d.d/d0d1ZEd2d.d3d4d5ZFd2d6d3d7d8ZGe0d9d:d;d<d=d>d?ZHejIG d@dA dAZJeG dBdC dCZKdDd2d;dEdFdGZLd6d6dHdIdJdKdLZMd2d;dDdMd6dNdOdPZNdQdRdSdTdUdVZOdWdWdXdYdZZPdXZQdHd6d[d\d]d^ZRd_d`dadbZSdcd6dddedfZTdgd6d=dhdiZUdS )jzsTerminal reporting of the full testing process.

This is a good source for looking at the various reporting hooks.
    )annotationsN)Counter)partial)Path)Any)Callable)ClassVar)final)	Generator)Literal)Mapping)
NamedTuple)Sequence)TextIO)TYPE_CHECKING)nodes)timing)ExceptionInfo)ExceptionRepr)TerminalWriter)wcswidth)running_on_ci)_PluggyPlugin)Config)ExitCode)hookimpl)Parser)Item)Node)absolutepath)bestrelpath)
BaseReport)CollectReport)
TestReport)Sessiong      ?)failedpassedskipped
deselectedxfailedxpassedwarningserrorZfEc                      sJ   e Zd ZdZddddddd	d
 fddZddddd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.
    NFzSequence[str]strobjectbool
str | NoneNone)option_stringsdestdefaultrequiredhelpreturnc                   s   t  j||d|||d d S )Nr   )r3   r4   nargsr5   r6   r7   )super__init__)selfr3   r4   r5   r6   r7   	__class__ 4/tmp/pip-unpacked-wheel-7n2p7kht/_pytest/terminal.pyr;   S   s    zMoreQuietAction.__init__zargparse.ArgumentParserzargparse.Namespacezstr | Sequence[object] | None)parser	namespacevaluesoption_stringr8   c                 C  s6   t || jdd }t|| j| t |ddd |_d S )Nr      quiet)getattrr4   setattrrF   )r<   rA   rB   rC   rD   Z	new_countr?   r?   r@   __call__d   s    zMoreQuietAction.__call__)NFN)N)__name__
__module____qualname____doc__r;   rI   __classcell__r?   r?   r=   r@   r-   L   s   
    r-   c                   @  s*   e Zd ZU dZded< ded< ded< dS )TestShortLogReportuG  Used to store the test status result category, shortletter and verbose word.
    For example ``"rerun", "R", ("RERUN", {"yellow": True})``.

    :ivar category:
        The class of result, for example ``“passed”``, ``“skipped”``, ``“error”``, or the empty string.

    :ivar letter:
        The short letter shown as testing progresses, for example ``"."``, ``"s"``, ``"E"``, or the empty string.

    :ivar word:
        Verbose word is shown as testing progresses in verbose mode, for example ``"PASSED"``, ``"SKIPPED"``,
        ``"ERROR"``, or the empty string.
    r.   categoryletterz$str | tuple[str, Mapping[str, bool]]wordN)rJ   rK   rL   rM   __annotations__r?   r?   r?   r@   rO   q   s   
rO   r   r2   )rA   r8   c                 C  s  | 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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-d0d1 |jd2d3d!d4d5d5d6d7d8d9d:gd;d< |jd=dd>dd?d |jd@d!dAd8dBdCdDdEgdEdFdG |jdHdIdddJdK |jdLdMd!dMd5dNd8d5gdOd< |jdPdNdNd8gdQdR | jdSdTdUdV tj| tjdWdX d S )YNzterminal reportingZ	ReportingZgeneral)afterz-vz	--verbosecountr   verbosezIncrease verbosity)actionr5   r4   r7   z--no-header
store_trueF	no_headerzDisable headerz--no-summary
no_summaryzDisable summaryz--no-fold-skippedstore_falsefold_skippedTz+Do not fold skipped tests in short summary.)rW   r4   r5   r7   z-qz--quietzDecrease verbosityz--verbosityzSet verbosity. Default: 0.)r4   typer5   r7   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').)rW   r4   r5   metavarr7   z--disable-warningsz--disable-pytest-warningsdisable_warningszDisable warnings summary)r5   r4   rW   r7   z-lz--showlocalsZ
showlocalsz/Show locals in tracebacks (disabled by default)z--no-showlocalszFHide locals in tracebacks (negate --showlocals passed through addopts))rW   r4   r7   z--tbstyletbstyleautolongshortnolineZnativez5Traceback print mode (auto/long/short/line/native/no))ra   rW   r4   r5   choicesr7   z
--xfail-tbxfail_tbz1Show tracebacks for xfail (as long as --tb != no)z--show-captureshowcapturestdoutstderrlogallzOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)rW   r4   rj   r5   r7   z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))rW   r5   r7   z--colorcoloryesz#Color terminal output (yes/no/auto)z--code-highlightzSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r5   rj   r7   console_output_stylezConsole output: "classic", or with additional progress information ("progress" (percentage) | "count" | "progress-even-when-capture-no" (forces progress even when capture=no)progress)r7   r5   zSpecify a verbosity level for test case execution, overriding the main level. Higher levels will provide more detailed information about each test case executed.)r7   )	ZgetgroupZ
_addoptionr-   int_REPORTCHARS_DEFAULTZaddinir   Z_add_verbosity_iniVERBOSITY_TEST_CASES)rA   groupr?   r?   r@   pytest_addoption   s   			ry   r   configr8   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mapr.   
write_line)tagsargsmsgZreporterr?   r@   mywriter  s    z"pytest_configure.<locals>.mywriterzpytest:config)TerminalReportersysrm   pluginmanagerregisteroptiondebugtraceconfigtracerootZsetprocessor)r{   r   r?   r   r@   pytest_configure  s
    r   r.   c                 C  s   | j j}ddh}d}|D ]N}||kr,| }|dkr:d}q|dkrHd}q|dkrVd}q||kr||7 }q| j jsd	|krd	| }n| j jrd	|kr|d	d}|S )
NFS aZsxXEfAZPpsxXEfNw)r   r_   lowerrb   replace)r{   r_   Zold_aliasesZ
reportoptscharr?   r?   r@   getreportopt#  s&    

r   TZtrylastr!   ztuple[str, str, str]reportr8   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   rQ   r   r?   r?   r@   pytest_report_teststatus<  s    r   c                   @  sN   e Zd ZU dZded< dZded< dZded< d	Zd
ed< dddddZdS )WarningReportao  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 fslocation:
        File system location of the source of the warning (see ``get_location``).
    r.   messageNr1   nodeidztuple[str, int] | None
fslocationTr   count_towards_summaryr   rz   c                 C  s@   | j r| j S | jr<| j\}}t|jjt|}| d| S dS )zSReturn the more user-friendly information about the location of a warning, or None.:N)r   r   r    invocation_paramsdirr   )r<   r{   filenamelinenumrelpathr?   r?   r@   get_location^  s    
zWarningReport.get_location)	rJ   rK   rL   rM   rS   r   r   r   r   r?   r?   r?   r@   r   L  s   

r   c                   @  s  e Zd ZdddddddZdd	d
dZedd	ddZedd	ddZedd	ddZedd	ddZ	edd	ddZ
e
jdddddZ
edd	ddZddddd Zddddd!d"d#Zddddd%d&d'Zdd	d(d)Zd*d+d,d-ddddddd.d/d0Zd*d1ddddd2d3d4Zdd	d5d6Zd7ddd8d9d:Zdddd8d;d<Zddd=d>ddd?d@dAZddddddCdDdEZddddFdGdHZddIddJdKdLZdMddNdOdPZdQdddRdSdTZdUddVdWdXZdYddZd[d\Zdd]dd^d_d`ZdaddbdcddZedd	dedfZ e!dgdhdid	djdkZ"dd	dldmZ#dd	dndoZ$dd	dpdqZ%edd	drdsZ&dd	dtduZ'dvddbdwdxZ(ddddydzd{Z)e!dgd|d}dd~ddZ*dddddZ+dddddZ,d}dd~ddZ-dYddZddZ.e!dgdhd}dddddZ/e!dgdhdd	ddZ0dddddZ1dd	ddZ2dd	ddZ3ddd>dddddZ4dd Z5dd Z6ddddZ7dd	ddZ8dd	ddZ9dd	ddZ:dddddddZ;dddddZ<dddddZ=daddddZ>dd	ddZ?dd	ddZ@dddddd=ddddZAdd	ddZBdddddĄZCdd	ddƄZDdd	ddȄZEdd	dd˄ZFddd̜dd΄ZGdd	ddЄZHdd	ddӄZIddd՜ddׄZJdd	ddلZKdd	ddۄZLdS )r   Nr   zTextIO | Noner2   )r{   filer8   c                 C  s   dd l }|| _d| _d | _d | _i | _d | _d | _|jj	| _
|d krJtj}|j||| _| jj| _d | _t|| _|jj| _| jj| _| | _t | _|  | _d | _d | _d | _d S Nr   ) _pytest.configr{   _numcollected_session_showfspathstats_main_color_known_typesr   r   	startpathr   rm   Zcreate_terminal_writer_tw	fullwidth_screen_widthcurrentfspathr   r_   r   r\   foldskippedZ	hasmarkupisattyset_progress_nodeids_reported_determine_show_progress_info_show_progress_info_collect_report_last_write_already_displayed_warnings_keyboardinterrupt_memo)r<   r{   r   _pytestr?   r?   r@   r;   k  s.    






zTerminalReporter.__init__z%Literal[('progress', 'count', False)]r8   c                 C  sd   | j dddkr&| j ddkr&dS | j ddr8dS | j d}|dkrPdS |d	kr\d	S dS d
S )zRReturn whether we should display progress information based on the current config.capturerh   rs   progress-even-when-capture-noFZ	setupshow>   r   rt   rt   rU   N)r{   	getoptiongetini)r<   cfgr?   r?   r@   r     s    
z.TerminalReporter._determine_show_progress_inforu   c                 C  s   | j jj}|S N)r{   r   rV   )r<   	verbosityr?   r?   r@   r     s    
zTerminalReporter.verbosityr0   c                 C  s
   | j dkS r   )r   r<   r?   r?   r@   
showheader  s    zTerminalReporter.showheaderc                 C  s   t | jjjS r   )r0   r{   r   rY   r   r?   r?   r@   rY     s    zTerminalReporter.no_headerc                 C  s   t | jjjS r   )r0   r{   r   rZ   r   r?   r?   r@   rZ     s    zTerminalReporter.no_summaryc                 C  s"   | j d kr| jtjdkS | j S r   )r   r{   get_verbosityr   rw   r   r?   r?   r@   
showfspath  s    
zTerminalReporter.showfspathzbool | None)valuer8   c                 C  s
   || _ d S r   )r   )r<   r   r?   r?   r@   r     s    c                 C  s   | j tjdkS r   )r{   r   r   rw   r   r?   r?   r@   showlongtestinfo  s    z!TerminalReporter.showlongtestinfor.   )r   r8   c                 C  s   ddd ||}|| jkS )Nxr   )r)   r'   )getr_   )r<   r   r?   r?   r@   hasopt  s    zTerminalReporter.hasopt)r   resmarkupr8   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 )N::r   r}   flushT)r{   rootpathsplitr   r   )_write_progress_information_filling_spacer    r   r   ri   write)r<   r   r   r   fspathZ	relfspathr?   r?   r@   write_fspath_result  s    
z$TerminalReporter.write_fspath_resultr   )prefixextrar8   c                 K  sD   | j |kr&| j  || _ | j| |r@| jj|f| d| _ d S )N)r   r   ri   r   )r<   r   r   kwargsr?   r?   r@   write_ensure_prefix  s    

z$TerminalReporter.write_ensure_prefixc                 C  s   | j r| j  d | _ d S r   )r   r   ri   r   r?   r?   r@   ensure_newline  s    
zTerminalReporter.ensure_newlineF   
)r   marginline_sep)contentr   r   r   r   r8   c                K  sV   | j j}|tjd| | | j| ddd}||d }| j j|fd|i| dS )z+Wrap message with margin for progress info.r}   TF)widthdrop_whitespacereplace_whitespaceNr   )r   width_of_current_liner~   textwrapwrapr   r   )r<   r   r   r   r   r   r   wrappedr?   r?   r@   
wrap_write  s    

zTerminalReporter.wrap_write)r   )r   r   r   r8   c                K  s   | j j|fd|i| d S )Nr   )r   r   )r<   r   r   r   r?   r?   r@   r     s    zTerminalReporter.writec                 C  s   | j   d S r   )r   r   r   r?   r?   r@   r     s    zTerminalReporter.flushzstr | bytes)ri   r   r8   c                 K  s2   t |tst|dd}|   | jj|f| d S )Nr   )errors)
isinstancer.   r   r   ri   )r<   ri   r   r?   r?   r@   r     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.
        eraseFrE   r}   r   N)popr   r   lenr.   r   )r<   ri   r   r   Z
fill_countfillr?   r?   r@   rewrite  s    	
zTerminalReporter.rewriter1   z
int | None)septitler   r   r8   c                 K  s    |    | jj|||f| d S r   )r   r   r  )r<   r  r  r   r   r?   r?   r@   	write_sep  s    zTerminalReporter.write_sep=)r  r  kwr8   c                 K  s   | j j||f| d S r   )r   r  )r<   r  r  r  r?   r?   r@   section  s    zTerminalReporter.section)r   r  r8   c                 K  s   | j j|f| d S r   )r   ri   )r<   r   r  r?   r?   r@   ri     s    zTerminalReporter.linezSequence[Any])rP   itemsr8   c                 C  s.   || j k}| j |g | |r*|   d S r   )r   
setdefaultextend_set_main_color)r<   rP   r  Zset_main_colorr?   r?   r@   
_add_stats  s    
zTerminalReporter._add_statsr   )excreprr8   c                 C  s&   t |dD ]}| d|  qdS )Nr   zINTERNALERROR> T)r.   r   r   )r<   r  ri   r?   r?   r@   pytest_internalerror!  s    z%TerminalReporter.pytest_internalerrorzwarnings.WarningMessage)warning_messager   r8   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  )r<   r  r   r  r   r   Zwarning_reportr?   r?   r@   pytest_warning_recorded&  s      z(TerminalReporter.pytest_warning_recordedr   )pluginr8   c                 C  s"   | j jjrd| }| | d S )NzPLUGIN registered: )r{   r   r   r   )r<   r  r   r?   r?   r@   pytest_plugin_registered5  s    

z)TerminalReporter.pytest_plugin_registeredzSequence[Item])r  r8   c                 C  s   |  d| d S )Nr(   )r  )r<   r  r?   r?   r@   pytest_deselected=  s    z"TerminalReporter.pytest_deselectedztuple[str, int | None, str])r   locationr8   c                 C  sT   |\}}}| j r6| ||||}| |d |   n| jrP| |d |   d S )Nr   )r   _locationliner   r   r   r   )r<   r   r  r   r  domainri   r?   r?   r@   pytest_runtest_logstart@  s    

z(TerminalReporter.pytest_runtest_logstartr#   r   c                 C  s^  d| _ |}t| jjj|| jd }|j|j|j  }}}t|t	sHd }n|\}}| 
||g |sj|sjd S |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|j | jtjdkr| jj|f| | jrR| jsR|   n<| j|jf|j }	t|d}
|
s| j|	|f| |js^t|drt|}| jtjd	k r| jj| jj t d
 d }t!d||}nd| d}|r|d k	r| "| | jrR| #  nv| $  | jd|j%j&j' d | jr | jj| ( d dd n| jd | jj|f| | jd|	  d| _)| *  d S )NT)r   r{   wasxfailgreenyellowredr   node    [100%]rE   z ({})z ()[]r}   )cyanr   )+Z
_tests_ranrO   r{   hookr   rP   rQ   rR   r   tupler  hasattrr&   r%   r'   r   addr   r   r   rw   r   r   r   _is_last_item(_write_progress_information_if_past_edger  r  r   _get_raw_skip_reasonr   r   r   _format_trimmedr   r   r   r  Zgatewayid!_get_progress_information_messager   r   )r<   r   repr   rP   rQ   rR   r   Z	was_xfailri   Zrunning_xdistreasonavailable_widthZformatted_reasonr?   r?   r@   pytest_runtest_logreportN  s~    








  


 z)TerminalReporter.pytest_runtest_logreportc                 C  s    | j d k	stt| j| j jkS r   )r   AssertionErrorr   r   testscollectedr   r?   r?   r@   r)    s    zTerminalReporter._is_last_itemT)wrapperzGenerator[None, object, object]c                 c  s0   d V }| j tjdkr,| jr,| jr,|   |S r   )r{   r   r   rw   r   r   r   )r<   resultr?   r?   r@   pytest_runtestloop  s    z#TerminalReporter.pytest_runtestloopc                 C  s   | j s
t| j j}| jdkrh|rVt| j}dtt| d}d| d}|||S d| d| dS |rdt| jd	 | d
dS dS d S )NrU   z{:zd} [z/{}]z [ z / z ]d   Z3dz%]r   )r   r3  r4  r   r   r   r.   format)r<   Z	collectedrt   Zcounter_formatformat_stringr?   r?   r@   r.    s    


z2TerminalReporter._get_progress_information_messagec                 C  s   | j }| jdkr:| jst| jj}td| d| d}ntd}|| d | jk}|r|  \}}|  }| j	j
|d f|di d S )	NrU   r8  /r#  r   rE   r   T)_width_of_current_liner   r   r3  r4  r   r   _get_main_colorr.  r   r   )r<   r   Z	num_testsZprogress_lengthZ	past_edge
main_color_r   r?   r?   r@   r*    s    

z9TerminalReporter._write_progress_information_if_past_edgec                 C  sN   |   \}}|  }| j}| jj| d }| j||fddi|di d S )NrE   r   T)r>  r.  r=  r   r   r   rjust)r<   rq   r@  r   r   r   r?   r?   r@   r     s
    z:TerminalReporter._write_progress_information_filling_spacec                 C  s   | j jS )z%Return the width of the current line.)r   r   r   r?   r?   r@   r=    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   boldrE   )r   r{   r   rV   r   r   timer   r   r?   r?   r@   pytest_collection  s    z"TerminalReporter.pytest_collectionr"   c                 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'   r6  r   r   r   report_collect)r<   r   r  r?   r?   r@   pytest_collectreport  s    z%TerminalReporter.pytest_collectreport)r	   r8   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| 7 }| jr2| j|ddd |r<| d n
| | d S )Nr   r,   r'   r(   z
collected zcollecting z itemrE   r   r   z / %d error%sz / %d deselectedz / %d skippedz / %d selectedT)rB  r   r   )r{   r   rV   r   rC  r   REPORT_COLLECTING_RESOLUTIONr   r   r   r   r.   r   r  r   r   )r<   r	   tr   r'   r(   selectedri   r?   r?   r@   rH    s>    
zTerminalReporter.report_collectr   r$   )sessionr8   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|d	  d7 }|dtjj d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rB  z	platform z -- Python pypy_version_infor      z[pypy--r#  z	, pytest-z	, pluggy-r   Zpastebinz -- )r{   
start_path)r   r   rC  _sessionstarttimer   r  platformpython_versionrY   r   rG   r~   r   r.   r   _versionversionpluggy__version__r   r{   r   r   
executabler   r%  pytest_report_headerr   _write_report_lines_from_hooks)r<   rM  Zverinfor   rO  linesr?   r?   r@   pytest_sessionstart  s4    

 z$TerminalReporter.pytest_sessionstartzSequence[str | Sequence[str]]r]  r8   c                 C  s<   t |D ].}t|tr"| | q|D ]}| | q&qd S r   )reversedr   r.   r   )r<   r]  Zline_or_linesri   r?   r?   r@   r\  *  s
    
z/TerminalReporter._write_report_lines_from_hooks	list[str]rz   c                 C  s   d|j  g}|jr,|dt|j |j  |jtjjkrZ|d}|d	d
| |j }|r|d	d
t| |S )Nz	rootdir: zconfigfile: 	testpathsztestpaths: {}, zplugins: {})r   Zinipathappendr    Zargs_sourcer   Z
ArgsSourceZ	TESTPATHSr   r:  r~   r   Zlist_plugin_distinfo_plugin_nameversions)r<   r{   r6  rb  
plugininfor?   r?   r@   r[  4  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 |D ]}|| j
 qd S )	NT)r{   rR  r  collectonlyr   r%   !zcollection failures)rH  r{   r%  Zpytest_report_collectionfinishr   r  r\  r   r   rV   r   ri   _printcollecteditemsr   r   r  
toterminal)r<   rM  r]  r%   r/  r?   r?   r@   pytest_collection_finishE  s"    

z)TerminalReporter.pytest_collection_finishc              	   C  sZ  | j tj}|dk rx|dk r\tdd |D }t| D ]\}}| jd||f  q<n|D ]}| j|j	 q`d S g }d}|D ]}|
 dd  }	|r||	d t| krq|  q|	t|d  D ]}
||
 t|d d }| j| |
  |dkrt|
d	d }|r"t|nd }|r| D ]}| jd
|d | q2qqd S )Nr   rh  c                 s  s    | ]}|j d dd V  qdS r   rE   r   N)r   r   )rF  itemr?   r?   r@   	<genexpr>_  s     z8TerminalReporter._printcollecteditems.<locals>.<genexpr>z%s: %dr   rE     objz{}{})r{   r   r   rw   r   sortedr  r   ri   r   Z	listchainr   r   rd  rG   inspectgetdoc
splitlinesr:  )r<   r  Ztest_cases_verbositycountsnamerU   rn  stackindentZneeded_collectorscolrq  docri   r?   r?   r@   rj  [  s6    

z%TerminalReporter._printcollecteditemszint | ExitCodezGenerator[None])rM  
exitstatusr8   c                 c  s   d V }| j d tjtjtjtjtjf}||krN| jsN| j	j
j| || j	d |jrj| jdt|jdd |tjkr|   d | _n|jr| jdt|jdd |   |S )Nr   )r|   r|  r{   ri  T)r  )r   ri   r   OKZTESTS_FAILEDZINTERRUPTEDZUSAGE_ERRORZNO_TESTS_COLLECTEDrZ   r{   r%  pytest_terminal_summaryZ
shouldfailr  r.   _report_keyboardinterruptr   Z
shouldstopsummary_stats)r<   rM  r|  r6  Zsummary_exit_codesr?   r?   r@   pytest_sessionfinishy  s.      
z%TerminalReporter.pytest_sessionfinishc                 c  sR   |    |   |   |   |   |   z
d V W S |   |   X d S r   )summary_errorssummary_failuressummary_xfailuressummary_warningssummary_passessummary_xpassesshort_test_summaryr   r?   r?   r@   r~    s    
z(TerminalReporter.pytest_terminal_summaryzExceptionInfo[BaseException])excinfor8   c                 C  s   |j dd| _d S )NT)Zfuncargs)Zgetreprr   )r<   r  r?   r?   r@   pytest_keyboard_interrupt  s    z*TerminalReporter.pytest_keyboard_interruptc                 C  s   | j d k	r|   d S r   )r   r  r   r?   r?   r@   pytest_unconfigure  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 )Nri  KeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)r  )r   r3  	reprcrashr   r  r{   r   Z	fulltracerk  r   ri   )r<   r  r   r?   r?   r@   r    s    
z*TerminalReporter._report_keyboardinterrupt)r   r   r  r  r8   c                   sn   ddd fdd}|rb||}j dkrf|dd |dtjkrf|d	tjt| 7 }nd
}|d S )Nr.   r   r8   c                   s\   j | } rX| rX|d t   } d}|d dd|d< |d|7 }|S )Nr"  r   r   r   )r{   cwd_relative_nodeidendswithr   r   r   r~   )r   ri   rC   r  r<   r?   r@   mkrel  s    
z-TerminalReporter._locationline.<locals>.mkrelr  r   r   \z <- z
[location]r}   )r   r   r   r   ZSEPr    r   r   )r<   r   r   r  r  r  r   r?   r  r@   r    s    
 zTerminalReporter._locationlinec                 C  s   |j }|r|S dS )Nztest session)	head_line)r<   r/  r  r?   r?   r@   _getfailureheadline  s    z$TerminalReporter._getfailureheadlinec                 C  sZ   zt |jjW S  tk
rT   zt |jd d W  Y S  tk
rN   Y Y dS X Y nX d S )N2   r   )r.   longreprr  AttributeError)r<   r/  r?   r?   r@   _getcrashline  s    zTerminalReporter._getcrashline)rw  c                 C  s   dd | j |dD S )Nc                 S  s   g | ]}t |d s|qS )Z	_pdbshown)r'  rE  r?   r?   r@   rG    s     
 z/TerminalReporter.getreports.<locals>.<listcomp>r?   r   r   )r<   rw  r?   r?   r@   
getreports  s    zTerminalReporter.getreportsc                   s&    dr" jd}|s d S  jd k	}|r>| jd  }n|}t| _|sTd S i }|D ]}||jg | q\ddd fdd}|rdnd	} jd
|ddd |	 D ]d\}}	||	}
|
r j
|
 | }ddd |D }| }n| } j
|  j
  q j
d d S )Nr   r+   zlist[WarningReport]r.   )reportsr8   c                   sn   g }| D ]}|  j}|r|| qt|dk rDd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 rm  )r.   r   )rF  locr?   r?   r@   ro    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{}rE   r   r   N)r:  )rF  kvr?   r?   r@   ro    s   )	r   r{   rd  r   r~   r   r.   r   r  )r  	locationsr   r  Zcounts_by_filenamer   r?   r@   collapsed_location_report  s    
zDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportzwarnings summary (final)zwarnings summaryr  TF)r  rB  r   c                 s  s   | ]}d | V  qdS )rp  Nr?   rE  r?   r?   r@   ro    s     z4TerminalReporter.summary_warnings.<locals>.<genexpr>zG-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html)r   r   r   r   r   r	  r   rd  r  r  r   ri   ru  r~   rstrip)r<   Zall_warningsr	   Zwarning_reportsZreports_grouped_by_messagewrr  r  r   Zmessage_reportsZmaybe_locationr]  Zindentedr?   r   r@   r    s<    


z!TerminalReporter.summary_warningsc                 C  s   |  ddd d S )Nr&   ZPASSESPsummary_passes_combinedr   r?   r?   r@   r    s    zTerminalReporter.summary_passesc                 C  s   |  ddd d S )Nr*   ZXPASSESXr  r   r?   r?   r@   r    s    z TerminalReporter.summary_xpasses)which_reports	sep_title
needed_optr8   c                 C  s|   | j jjdkrx| |rx| |}|s*d S | d| |D ]<}|jrj| |}| jd|ddd | | | 	|j
 q:d S )Nrh   r  r@  T)r  rB  )r{   r   rd   r   r  r  sectionsr  _outrep_summary_handle_teardown_sectionsr   )r<   r  r  r  r  r/  r   r?   r?   r@   r  "  s    



z(TerminalReporter.summary_passes_combinedzlist[TestReport]r  c                   s   |  d} fdd|D S )Nr   c                   s$   g | ]}|j d kr|j kr|qS )r   )r   r   )rF  r   r   r?   r@   rG  4  s   
 
z:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r  )r<   r   r  r?   r  r@   _get_teardown_reports2  s    

z&TerminalReporter._get_teardown_reportsc                 C  s   |  |D ]}| | q
d S r   )r  print_teardown_sections)r<   r   r   r?   r?   r@   r  :  s    z*TerminalReporter._handle_teardown_sections)r/  r8   c                 C  sz   | j jj}|dkrd S |jD ]X\}}|dkr6||kr6qd|kr| jd| |dd  dkrh|d d }| j| qd S )Nrh   rp   r   rQ  rh  r   )r{   r   rl   r  r   r  ri   r<   r/  rl   Zsecnamer   r?   r?   r@   r  >  s    
z(TerminalReporter.print_teardown_sectionsc                 C  s   | j jj}| jdd|d d S )Nr%   ZFAILURESrc   )r{   r   rd   summary_failures_combined)r<   rc   r?   r?   r@   r  K  s    
z!TerminalReporter.summary_failuresc                 C  s0   | j jj}|r| j jjnd}| jdd|d d S )Nrh   r)   Z	XFAILURESr  )r{   r   rk   rd   r  )r<   Zshow_tbrc   r?   r?   r@   r  O  s    
z"TerminalReporter.summary_xfailures)r  )r  r  rc   r  r8   c          	      C  s   |dkr|r|  |r| |}|s(d S | d| |dkr\|D ]}| |}| | q@n<|D ]6}| |}| jd|ddd | | | |j q`d S )Nrh   r  ri   r@  Tr  rB  )	r   r  r  r  r   r  r  r  r   )	r<   r  r  rc   r  r  r/  ri   r   r?   r?   r@   r  T  s    



z*TerminalReporter.summary_failures_combinedc                 C  s   | j jjdkr| d}|s d S | dd | jd D ]P}| |}|jdkrXd| }nd|j d| }| jd	|d
d
d | | q6d S )Nrh   r,   r  ZERRORSr   zERROR collecting z	ERROR at z of r@  Tr  )	r{   r   rd   r  r  r   r  r   r  )r<   r  r/  r   r?   r?   r@   r  m  s    



zTerminalReporter.summary_errorsr!   c                 C  s~   | | j | jjj}|dkr"d S |jD ]P\}}|dkrB||krBq(| jd| |dd  dkrl|d d }| j| q(d S )Nrh   rp   rQ  rh  r   )rk  r   r{   r   rl   r  r  ri   r  r?   r?   r@   r  |  s    
z TerminalReporter._outrep_summaryc                 C  sB  | j dk rd S t | j }|  \}}g }| j dk}|rB| jj}|D ]:\}}| jj|f|}	|rv|t|	t| 7 }|	|	 qFd
|}
|di}dt| }| jj|f|}|r|t|t| 7 }|
|7 }
|r| jjd|}|dr|d d }|t|7 }|
|7 }
|r0| jd	|
fd
|i| n| j|
f| d S )Nrh  r   rc  Tz in r   z[0mr  r   )r   )r   r   rC  rS  build_summary_stats_liner   r   r   r   rd  r~   format_session_durationr  r  r   )r<   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 dddd fdd}ddd fdd	}ddd fd
d}ddd fddddd fddddd fdd}||t|dd|t|ddt|ddd}g } j D ]}||}|r|| q|r jddddd |D ]}	 |	 qd S )Nra  r.   r2   )r]  statr8   c                  sT    j |g }|sd S  j}|D ].}t|t}t|| j|di}| | q d S )NT)r   r   r{   _color_for_type_color_for_type_default _get_line_with_reprcrash_messager   rd  )r]  r  r%   r{   r/  rq   ri   r   r?   r@   show_simple  s       z8TerminalReporter.short_test_summary.<locals>.show_simpler_  c           	        s    j dg }|D ]p}| jtd di\}} jj|f|}t j j|}| d| }|j}|rx|dt	| 7 }| 
| qd S )Nr)   r+   Tr}    - r   r   _get_verbose_word_with_markupr{   r  r   r   _get_node_id_with_markupr  r.   rd  )	r]  r)   r/  verbose_wordverbose_markupmarkup_wordr   ri   r0  r   r?   r@   show_xfailed  s     
z9TerminalReporter.short_test_summary.<locals>.show_xfailedc           	        s    j dg }|D ]p}| jtd di\}} jj|f|}t j j|}| d| }|j}|rx|dt	| 7 }| 
| qd S )Nr*   r+   Tr}   r  r  )	r]  r*   r/  r  r  r  r   ri   r0  r   r?   r@   show_xpassed  s     
z9TerminalReporter.short_test_summary.<locals>.show_xpassedc              	     s    j dg }|rt j|ng }|s*d S |d  jtd di\}} jj|f|}d}|D ]^\}}}	}
|
	|r|
t
|d  }
|	d k	r| d||||	|
f  q`| d||||
f  q`d S )Nr'   r   r+   T	Skipped: z%s [%d] %s:%d: %sz%s [%d] %s: %s)r   r   _folded_skipsr   r  r{   r  r   r   
startswithr   rd  )r]  r'   Zfskipsr  r  r  r   numr   r  r0  r   r?   r@   show_skipped_folded  s$     

z@TerminalReporter.short_test_summary.<locals>.show_skipped_foldedc           	        s    j dg }|D ]}|jd k	s$tt|jts>t||jft|jdksZt||jf| jt	d di\}} j
j|f|}t j
 j|}| d| }|jd }|r|dt| 7 }| | qd S )Nr'   rP  r+   Tr}   r  r  )r   r   r  r3  r   r&  r   r  r{   r  r   r   r  r.   rd  )	r]  r'   r/  r  r  r  r   ri   r0  r   r?   r@   show_skipped_unfolded  s      

zBTerminalReporter.short_test_summary.<locals>.show_skipped_unfoldedc                   s    j r|  n|  d S r   )r   )r]  r<   r  r  r?   r@   show_skipped  s    
z9TerminalReporter.short_test_summary.<locals>.show_skippedr%   )r  r&   r,   )r   r  fr   pr   r  zshort test summary infoT)r$  rB  )r_   r   r   r  r   )
r<   r  r  r  r  ZREPORTCHAR_ACTIONSr]  r   rW   ri   r?   r  r@   r    s0    


	


z#TerminalReporter.short_test_summaryztuple[str, list[str]]c                 C  sB   | j d ks| jd ks| jr6|   | j s,t| js6t| j | jfS r   )r   r   r)  r  r3  r   r?   r?   r@   r>    s
    

z TerminalReporter._get_main_color)unknown_type_seenr8   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)  )r<   r  r   r?  r?   r?   r@   _determine_main_color#  s    z&TerminalReporter._determine_main_colorc                 C  sP   g }| j D ]"}|r
|tkr
||kr
|| q
tt| | _| t|| _d S r   )r   KNOWN_TYPESrd  listr   r  r0   r   )r<   Zunknown_typesZ
found_typer?   r?   r@   r  /  s    
z TerminalReporter._set_main_colorz-tuple[list[tuple[str, dict[str, bool]]], str]c                 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.
        rg  N)r{   r   &_build_collect_only_summary_stats_line _build_normal_summary_stats_liner   r?   r?   r@   r  8  s    z)TerminalReporter.build_summary_stats_linez	list[Any])keyr8   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)rG   rE  r?   r?   r@   rG  T  s      z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>r  )r<   r  r  r?   r?   r@   _get_reports_to_displayQ  s    z(TerminalReporter._get_reports_to_displayc           	      C  s~   |   \}}g }|D ]N}| |}|rt|}t|t}|dd||ki}|dt|| |f q|svdtdifg}||fS )NTrB  %d %szno tests ran)r>  r  r   r  r   r  rd  	pluralize)	r<   r?  Zknown_typesr  r  r  rU   rq   r   r?   r?   r@   r  V  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)r<  z tests collected (r  )r   r  r   r  r  )r<   r(   r   r  r?  Zcollected_outputZall_tests_were_deselectedrL  r?   r?   r@   r  i  s*    


z7TerminalReporter._build_collect_only_summary_stats_line)N)r   )NN)r  )F)MrJ   rK   rL   r;   r   propertyr   r   rY   rZ   r   setterr   r   r   r   r   r   r   r   r   r  r  r  ri   r  r  r  r  r  r  r2  r)  r   r7  r.  r*  r   r=  rD  rI  rH  r^  r\  r[  rl  rj  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  r  r  r  r  r  r?   r?   r?   r@   r   i  s   		  
L
%
6%n	r   r   )twr{   r/  c                 C  sF   | |j}|d^}}|r>| jd|dd}|d | S |S d S )Nr   TrN  )r  r   r   r   r~   )r  r{   r/  r   pathr  Zparts_markupr?   r?   r@   r    s    r  ru   r1   )r:  r   r1  r8   c                 C  s   | d}|dkr|d| }d}t| d}|t| |krDdS |t| |kr|t|8 }|d| }|t| |kr|dd }ql||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   rh  Nz...r   )findr   r:  r   )r:  r   r1  iZellipsisZformat_widthr?   r?   r@   r,    s    
r,  zdict[str, bool])r{   r/  r  word_markupr8   c                 C  s   | | |\}}|j|f|}t|| |}| d| }t|}	z|jjj}
W n tk
rb   Y nFX t sv| j	j
dkrd|
 }
n|j|	 }td|
|}
|
dk	r||
7 }|S )z?Get summary line for a report, trying to add reprcrash message.r}   r  r  z - {}N)r  r   r  r   r  r  r   r  r   r   rV   r   r,  )r{   r/  r  r  r  r  rR   r  ri   
line_widthr   r1  r?   r?   r@   r    s&     
r  r   zSequence[CollectReport]z&list[tuple[int, str, int | None, str]])r   r'   r8   c                 C  s   i }|D ]}|j d k	stt|j ts4t||j ft|j dksPt||j f|j \}}}t| t|}t|di }|jdkrd|krd|kr|d |f}n
|||f}|	|g 
| qg }	| D ]\}}
|	
t|
f| q|	S )NrP  keywordsr   skipZ
pytestmark)r  r3  r   r&  r   r    r   rG   r   r	  rd  r  )r   r'   deventr   r  r0  r  r  rC   eventsr?   r?   r@   r    s*    
r  r  r  r  )r%   r,   r+   r&   ztuple[int, str])rU   nounr8   c                 C  s4   |dkr| |fS | dd}| | dkr.|d n|fS )N)r,   r+   r  r+   warningrE   r   )r   )rU   r  r?   r?   r@   r    s    r  ra  r   c                 C  sP   g }| D ]B\}}|j  d|j }|dr8|dd  }||kr|| q|S )NrQ  zpytest-   )project_namerW  r  rd  )rf  rC   r  distrw  r?   r?   r@   re     s    
re  float)secondsr8   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 (r!  N)datetime	timedeltaru   )r  dtr?   r?   r@   r    s    r  r#   c                 C  s   t | dr.| j}|dr*|tdd }|S | js8tt| jtsHt| j\}}}|drp|tdd }n|dkr|d}|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: Nr  ZSkippedr   )	r'  r  r  r   r'   r3  r   r  r&  )r   r0  r@  r?   r?   r@   r+    s    



r+  )VrM   
__future__r   argparsecollectionsr   Zdataclassesr  	functoolsr   rs  pathlibr   rT  r   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r+   rX  r   r   r   Z_pytest._coder   Z_pytest._code.coder   Z_pytest._ior   Z_pytest._io.wcwidthr   Z_pytest._versionZ_pytest.assertion.utilr   r   r   r   r   r   Z_pytest.config.argparsingr   Z_pytest.nodesr   r   Z_pytest.pathlibr   r    Z_pytest.reportsr!   r"   r#   Z_pytest.mainr$   rJ  r  rv   Actionr-   rO   ry   r   r   r   Z	dataclassr   r   r  r,  r  r  r  r  r  re  r  r+  r?   r?   r?   r@   <module>   s   %         (
 	