HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/env/lib/python3.10/site-packages/_pytest/__pycache__/terminal.cpython-310.pyc
o

%we��@s�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZddl
mZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl Z ddl!Z"ddl"m#Z#ddl"m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddl1m3Z3dd l1m4Z4dd!l1m5Z5dd"l6m7Z7dd#l8m9Z9dd$l8m:Z:dd%l;m<Z<dd&l;m=Z=dd'l>m?Z?dd(l>m@Z@dd)l>mAZAe�r#dd*lBmCZCdd+lDmEZEd,ZFd-ZGd.ZHGd/d0�d0ejI�ZJGd1d2�d2e�ZKd3e7d4dfd5d6�ZLd7e3d4dfd8d9�ZMd7e3d4eNfd:d;�ZOe5d<d=�d>e?d4eeNeNeNffd?d@��ZPejQGdAdB�dB��ZRe0GdCdD�dD��ZSdEe*d7e3dFe?fdGdH�ZTdIeNdJeNdKeUd4eeNfdLdM�ZVd7e3dFe?dEe*dNeeNeWfd4eNf
dOdP�ZXdQedRee@d4eeeUeNeeUeNffdSdT�ZYdUdUdVdWdX�ZZdVZ[dYeUdZeNd4eeUeNffd[d\�Z\d4eeNfd]d^�Z]d_e^d4eNfd`da�Z_d>eAd4eNfdbdc�Z`dS)dzsTerminal 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)�ClassVar)�Dict)�	Generator)�List)�Mapping)�
NamedTuple)�Optional)�Sequence)�Set)�TextIO)�Tuple)�
TYPE_CHECKING)�Union)�nodes)�timing)�
ExceptionInfo)�
ExceptionRepr)�TerminalWriter)�wcswidth)�
running_on_ci)�final)�
_PluggyPlugin)�Config)�ExitCode)�hookimpl)�Parser)�Item)�Node)�absolutepath)�bestrelpath)�
BaseReport)�
CollectReport)�
TestReport)�Literal)�Sessiong�?)�failed�passed�skipped�
deselected�xfailed�xpassed�warnings�error�fEc
s�eZdZdZ			ddeededededeed	df�fd
d�
Z		dde
jd
e
jde
eeedfdeed	df
dd�Z�ZS)�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.
    NF�option_strings�dest�default�required�help�returncst�j||d|||d�dS)Nr)r5r6�nargsr7r8r9)�super�__init__)�selfr5r6r7r8r9��	__class__��I/home/arjun/projects/env/lib/python3.10/site-packages/_pytest/terminal.pyr=Vs
�zMoreQuietAction.__init__�parser�	namespace�values�
option_stringcCs6t||jd�d}t||j|�t|dd�d|_dS)Nr��quiet)�getattrr6�setattrrH)r>rCrDrErF�	new_countrArArB�__call__gszMoreQuietAction.__call__)NFN�N)�__name__�
__module__�__qualname__�__doc__r�str�object�boolrr=�argparse�ArgumentParser�	NamespacerrL�
__classcell__rArAr?rBr4Os<
�������������r4c@sBeZdZUdZeed<eed<eeeeeee	fffed<dS)�TestShortLogReportuGUsed 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.
    �category�letter�wordN)
rNrOrPrQrR�__annotations__rrrrTrArArArBrYts

$rYrCr:c	Cs\|jdddd�}|jddddd	d
d�|jdd
dddd�|jdd
dddd�|jddtdd	dd�|jdd	tddd�|jdddtddd�|jd d!dd"d
d#d$�|jd%d&d
d'dd(d)�|jd*d+d'd,d-�|jd.d/dd0d1gd2�d3d4�|jd5dd6gd7�d8d9d:�|jd;d<d
dd=d>�|jd?d@dd@d1gdA�dBd4�|jdCdDdDdEgdFdG�|jdHdIdJdK�dS)LNzterminal reporting�	Reporting�general)�afterz-vz	--verbose�countr�verbosezIncrease verbosity)�actionr7r6r9z--no-header�
store_trueF�	no_headerzDisable headerz--no-summary�
no_summaryzDisable summaryz-qz--quietzDecrease verbosityz--verbosityzSet verbosity. Default: 0.)r6�typer7r9z-r�store�reportchars�charsaShow 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').)rcr6r7�metavarr9z--disable-warningsz--disable-pytest-warnings�disable_warningszDisable warnings summary)r7r6rcr9z-lz--showlocals�
showlocalsz/Show locals in tracebacks (disabled by default))rcr6r7r9z--no-showlocals�store_falsezFHide locals in tracebacks (negate --showlocals passed through addopts))rcr6r9z--tb�style�tbstyle�auto)rq�long�short�no�line�nativez5Traceback print mode (auto/long/short/line/native/no))rkrcr6r7�choicesr9z--show-capture�showcapture)rt�stdout�stderr�log�allr|zOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)rcr6rwr7r9z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))rcr7r9z--color�color)�yesrtrqz#Color terminal output (yes/no/auto)z--code-highlightr~rtzSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r7rwr9�console_output_stylez�Console output: "classic", or with additional progress information ("progress" (percentage) | "count" | "progress-even-when-capture-no" (forces progress even when capture=no)�progress)r9r7)�getgroup�
_addoptionr4�int�_REPORTCHARS_DEFAULT�addini)rC�grouprArArB�pytest_addoption�s�����������	�	��	�
�r��configcsNt|tj��|j��d�|jjs|jjr%�fdd�}|jj	�
d|�dSdS)N�terminalreportercs"d�tt|��}��d|�dS)N� z[traceconfig] )�join�maprR�
write_line)�tags�args�msg��reporterrArB�mywriter	sz"pytest_configure.<locals>.mywriterz
pytest:config)�TerminalReporter�sysry�
pluginmanager�register�option�debug�traceconfig�trace�root�setprocessor)r�r�rAr�rB�pytest_configures�r�cCs�|jj}ddh}d}|D]'}||vr|��}|dkrd}q|dkr$d}q|dkr+d}q||vr3||7}q|jjsBd	|vrBd	|}|S|jjrPd	|vrP|�d	d�}|S)
N�F�S��a�sxXEf�A�PpsxXEf�N�w)r�ri�lowerrl�replace)r�ri�old_aliases�
reportopts�charrArArB�getreportopts*��r�T��trylast�reportcCsHd}|jrd}n|jr
d}|j}|jdvr|dkrd}d}|||��fS)Nr��.�s)�collect�setup�teardownr+r2�E)r,r-�outcome�when�upper)r�r[r�rArArB�pytest_report_teststatus)sr�c@sdeZdZUdZeed<dZeeed<dZee	ee
fed<dZeed<de
d	eefd
d�ZdS)�
WarningReportaoSimple 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``).
    �messageN�nodeid�
fslocationT�count_towards_summaryr�r:cCs@|jr|jS|jr|j\}}t|jjt|��}|�d|��SdS)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�relpathrArArB�get_locationKs
zWarningReport.get_location)rNrOrPrQrRr]r�rr�rr�r�rrr�rArArArBr�9s

r�c
@steZdZd�dedeeddfdd�Zd�dd	�Zede	fd
d��Z
edefdd
��Zedefdd��Z
edefdd��Zedefdd��Zejdeeddfdd��Zedefdd��Zdedefdd�Zdededdfdd�Zd�d ed!eddfd"d#�Zd�d$d%�Zd&d'd(d)�d*ed+ed,e	d-ededdfd.d/�Zd&d0�d*ed+ededdfd1d2�Zd�d3d4�Zd5eeefdeddfd6d7�Zd5ededdfd8d9�Z		d�d:ed;eed<ee	deddf
d=d>�Zd�d;ed:ed@eddfdAdB�ZdCed@eddfdDdE�Z dFedGe!e"ddfdHdI�Z#dJe$defdKdL�Z%dMe&j'deddfdNdO�Z(dPe)ddfdQdR�Z*dGe!e+ddfdSdT�Z,dedUe-eee	efddfdVdW�Z.dXe/ddfdYdZ�Z0edefd[d\��Z1deddfd]d^�Z2defd_d`�Z3d�dadb�Z4ede	fdcdd��Z5d�dedf�Z6dXe7ddfdgdh�Z8d�dieddfdjdk�Z9e:dldm�d�dpdq��Z;dre!eee!efddfdsdt�Z<dede=efdudv�Z>d�dwdx�Z?dGe!e+ddfdydz�Z@e:dld{�dndod|ee	eAffd}d~��ZBe:dld{�deCdfd�d���ZDd�eEeFddfd�d��ZGd�d�d��ZHd�d�d��ZIded�ed�ee	d�edef
d�d��ZJd�d��ZKd�d��ZLd�efd�d��ZMd�d�d��ZNd�d�d��ZOdede=e/fd�d��ZPdeddfd�d��ZQd�e/ddfd�d��ZRd�d�d��ZSd�d�d��ZTd�eUddfd�d��ZVd�d�d��ZWd�d�d��ZXde-ee=effd�d��ZYd�edefd�d��ZZd�d�d��Z[de-e=e-ee\eeffeffd�d��Z]d�ede=e"fd�d��Z^de-e=e-ee\eeffeffd�d��Z_de-e=e-ee\eeffeffd�d��Z`dS)�r�Nr��filer:cCs�ddl}||_d|_d|_d|_i|_d|_d|_|jj	|_
|dur%tj}|j�
||�|_|jj|_d|_t|�|_|jj|_|��|_t�|_|��|_d|_d|_d|_dS�Nr)�_pytest.configr��
_numcollected�_session�_showfspath�stats�_main_color�_known_typesr�r��	startpathr�ry�create_terminal_writer�_tw�	fullwidth�
_screen_width�
currentfspathr�ri�	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��_pytestrArArBr=Xs,






zTerminalReporter.__init__�#Literal['progress', 'count', False]cCsh|j�dd�dkr|j�d�dkrdS|j�dd�rdS|j�d�}|dks*|dkr,dS|dkr2dSdS)	zRReturn whether we should display progress information based on the current config.�capturertrzprogress-even-when-capture-noF�	setupshowr�ra)r��	getoption�getini)r>�cfgrArArBr�rs
�z.TerminalReporter._determine_show_progress_infocCs|jjj}|SrM)r�r�rb)r>�	verbosityrArArBr��s
zTerminalReporter.verbositycCs
|jdkSr��r��r>rArArB�
showheader��
zTerminalReporter.showheadercC�t|jjj�SrM)rTr�r�rer�rArArBre��zTerminalReporter.no_headercCr�rM)rTr�r�rfr�rArArBrf�r�zTerminalReporter.no_summarycCs|jdur
|jdkS|jSr�)r�r�r�rArArB�
showfspath�s

zTerminalReporter.showfspath�valuecCs
||_dSrM)r�)r>r�rArArBr��r�cCs
|jdkSr�r�r�rArArB�showlongtestinfo�r�z!TerminalReporter.showlongtestinfor�cCsddd��||�}||jvS)N�xr�)r/r-)�getri)r>r�rArArB�hasopt�s
zTerminalReporter.hasoptr��markupcKs�|jj|�d�d}|jdus||jkr7|jdur!|jr!|��||_t|j|�}|j�	�|j�
|d�|jj
|fddi|��dS)N�::rr��flushT)r��rootpath�splitr�r��)_write_progress_information_filling_spacer%r�r�ru�write)r>r��resr��fspath�	relfspathrArArB�write_fspath_result�s
z$TerminalReporter.write_fspath_resultr��prefix�extracKsL|j|kr|j��||_|j�|�|r$|jj|fi|��d|_dSdS)N���)r�r�rur�)r>r�r��kwargsrArArB�write_ensure_prefix�s


�z$TerminalReporter.write_ensure_prefixcCs|jr
|j��d|_dSdSrM)r�r�rur�rArArB�ensure_newline�s

�zTerminalReporter.ensure_newlineF��
)r��margin�line_sep�contentr�rrcKsV|jj}|�tjd|||j|ddd��}||d�}|jj|fd|i|��dS)z+Wrap message with margin for progress info.r�TF)�width�drop_whitespace�replace_whitespaceNr�)r��width_of_current_liner��textwrap�wrapr�r�)r>rr�rrr�r�wrappedrArArB�
wrap_write�s

��zTerminalReporter.wrap_write)r�cKs|jj|fd|i|��dS)Nr�)r�r�)r>rr�r�rArArBr��szTerminalReporter.writecCs|j��dSrM)r�r�r�rArArBr��szTerminalReporter.flushrucKs6t|t�st|dd�}|��|jj|fi|��dS)Nr�)�errors)�
isinstancerRrr�ru)r>rur�rArArBr��s
zTerminalReporter.write_linecKsZ|�dd�}|r|jjt|�d}d|}nd}t|�}|jjd||fi|��dS)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.
        �eraseFrGr�r��
N)�popr�r��lenrRr�)r>rur�r�
fill_count�fillrArArB�rewrite�s	
 zTerminalReporter.rewrite�sep�titler�cKs$|��|jj|||fi|��dSrM)rr�r)r>rrr�r�rArArB�	write_sep�szTerminalReporter.write_sep�=�kwcKs|jj||fi|��dSrM)r�r)r>rrrrArArB�sectionszTerminalReporter.sectionr�cKs|jj|fi|��dSrM)r�ru)r>r�rrArArBru�zTerminalReporter.linerZ�itemscCs2||jv}|j�|g��|�|r|��dSdSrM)r��
setdefault�extend�_set_main_color)r>rZr!�set_main_colorrArArB�
_add_statss

�zTerminalReporter._add_stats�excreprcCs&t|��d�D]	}|�d|�qdS)NrzINTERNALERROR> T)rRr�r�)r>r'rurArArB�pytest_internalerror
sz%TerminalReporter.pytest_internalerror�warning_messagecCs@ddlm}|j|jf}||�}t|||d�}|�d|g�dS)Nr)�warning_record_to_str)r�r�r�r1)�_pytest.warningsr*r��linenor�r&)r>r)r�r*r�r��warning_reportrArArB�pytest_warning_recordeds�z(TerminalReporter.pytest_warning_recorded�plugincCs&|jjjrd|��}|�|�dSdS)NzPLUGIN registered: )r�r�r�r�)r>r/r�rArArB�pytest_plugin_registered!s

�z)TerminalReporter.pytest_plugin_registeredcCs|�d|�dS)Nr.)r&)r>r!rArArB�pytest_deselected)sz"TerminalReporter.pytest_deselected�locationcCsR|jr|j|g|�R�}|�|d�|��dS|jr'|�|d�|��dSdS)Nr�)r��
_locationlinerr�r�r�)r>r�r2rurArArB�pytest_runtest_logstart,s�z(TerminalReporter.pytest_runtest_logstartr�cCs0d|_|}t|jjj||jd��}|j|j|j}}}t|t	�s$d}n|\}}|�
||g�|s5|s5dSt|d�}|durit|d�}	|jrM|	sMddi}n|jrW|	rWddi}n|j
r_ddi}n
|jrgddi}ni}|jdkry|jj|fi|��n�|j�|j�|j|jg|j�R�}
|s�|j|
|fi|��|js�t|d�r�t|�}|jjjd	kr�|jj|jjtd
�d}td||�}
nd
|�d�}
|r�|
dur�|�|
�|j r�|�!�n:|�"�|j�d|j#j$j%�|j r�|jj|�&�ddd�n|j�d�|jj|fi|��|j�d|
�d|_'|�(�dS)NT)r�r��node�wasxfail�green�yellow�redr�� [100%]rGz ({})z (�)z[%s]r�)�cyanr))�
_tests_ranrYr��hookr�rZr[r\r�tupler&�hasattrr,r+r-r�r�r�r��addr�r3r2r�_get_raw_skip_reasonr�rbr�rr�_format_trimmedrr�r�rr5�gateway�id�!_get_progress_information_messager�r�)r>r��repr�rZr[r\r��
running_xdist�	was_xfailru�reason�available_width�formatted_reasonrArArB�pytest_runtest_logreport9sv�









����
��z)TerminalReporter.pytest_runtest_logreportcCs |jdusJ�t|j�|jjkSrM)r�rr��testscollectedr�rArArB�
_is_last_item}szTerminalReporter._is_last_itemc	Cs�|jsJ�|jdkr]|jr_|jdkr"|jj}td|�d|�d��}ntd�}|j�|�|jr5|��dS|�	�\}}|j
}||d|jk}|ra|��}|j
j|dfi|d	i��dSdSdSdS)
Nrra� [�/�]r;rGrT)r�r�r�rOrr�rBrPr��_get_main_color�_width_of_current_liner�rGr�r�)	r>r��	num_tests�progress_length�
main_color�_r��	past_edger�rArArB�pytest_runtest_logfinish�s"

 �z)TerminalReporter.pytest_runtest_logfinishcCs�|jsJ�|jj}|jdkr4|r+|j}dtt|���d�}d|�d�}|�t|�|�Sd|�d|�d�S|rBd	�t|j�d
|�SdS)Nraz{:zd}rQz/{}]z [ z / z ]z	 [{:3d}%]�dr;)r�rOr�r�rrR�format)r>�	collectedr��counter_format�
format_stringrArArBrG�s

�z2TerminalReporter._get_progress_information_messagecCsN|��\}}|��}|j}|jj|d}|j|�|�fddi|di��dS)NrGr�T)rTrGrUr�r�r��rjust)r>r}rYr�r�rrArArBr��s
$z:TerminalReporter._write_progress_information_filling_spacecCs|jjS)z%Return the width of the current line.)r�rr�rArArBrU�sz'TerminalReporter._width_of_current_linecCs\|jr|jjjdkr|jdddd�t��|_dSdS|jjjdkr,|jdddd�dSdS)Nrzcollecting ... T)r��boldrG)r�r�r�rbr�r�timer�r�rArArB�pytest_collection�s��z"TerminalReporter.pytest_collectioncCsb|jr|�d|g�n
|jr|�d|g�dd�|jD�}|jt|�7_|jr/|��dSdS)Nr2r-cSsg|]	}t|t�r|�qSrA)rr"��.0r�rArArB�
<listcomp>��z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)r+r&r-�resultr�rr��report_collect)r>r�r!rArArB�pytest_collectreport�s�z%TerminalReporter.pytest_collectreportrcCs@|jjjdkr	dS|s t��}|jdur|j|tkrdS||_t|j�	dg��}t|j�	dg��}t|j�	dg��}|j
|}|rDdnd}|t|j
�d|j
dkrTd	nd
7}|rh|d||dkrcd
nd	f7}|rp|d|7}|rx|d
|7}|j
|kr�|d|7}|jr�|j
|ddd�|r�|�d�dSdS|�|�dS)Nrr2r-r.z
collected zcollecting z itemrGr�r�z
 / %d error%sz / %d deselectedz
 / %d skippedz / %d selectedT)rbrr)r�r�rbrrcr��REPORT_COLLECTING_RESOLUTIONrr�r�r�rRr�rr�r�)r>r�trr-r.�selectedrurArArBrj�s<

�
�zTerminalReporter.report_collectTr��sessionr*cCs
||_t��|_|js
dS|jdddd�t��}|js�dt	j�d|��}t
t	dd�}|rFd�tt
|dd	���}|d
|�d|d	�d�7}|d
�tjjtj�7}|jdksc|jjjsct
|jjdd�rl|dt
t	j�7}|�|�|jjj|j|jd�}|�|�dSdS)Nrztest session startsT�rbz	platform z -- Python �pypy_version_infor��z[pypy-�-rSz, pytest-{}, pluggy-{}r�pastebinz -- )r��
start_path)r�rrc�_sessionstarttimer�r�platform�python_versionrer�rIr�r�rRr]r��_version�version�pluggy�__version__r�r�r�r��
executabler�r?�pytest_report_headerr��_write_report_lines_from_hooks)r>ro�verinfor�rq�linesrArArB�pytest_sessionstart�s6

�
��
��z$TerminalReporter.pytest_sessionstartr�cCs<t|�D]}t|t�r|�|�q|D]}|�|�qqdSrM)�reversedrrRr�)r>r��
line_or_linesrurArArBrs
��z/TerminalReporter._write_report_lines_from_hookscCs�d|j��g}|jr|�dt|j|j��|jtjjkr-|�d�}|�d�	d�
|���|j��}|r@|�dd�
t
|���|S)Nz	rootdir: zconfigfile: �	testpathsz
testpaths: {}�, zplugins: %s)r��inipath�appendr%�args_sourcer�
ArgsSource�	TESTPATHSr�r]r�r��list_plugin_distinfo�_plugin_nameversions)r>r�rir��
plugininforArArBr~s

z%TerminalReporter.pytest_report_headercCs�|�d�|jjj|j|j|jd�}|�|�|j�d�rM|jr3|jjj	dkr-|j
�d�|�|j�|j
�d�}|rO|j
�dd�|D]}|�|j
�qDdSdSdS)	NT)r�rur!�collectonly���r�r+�!zcollection failures)rjr�r?�pytest_report_collectionfinishr�r!rr�r�rbr�ru�_printcollecteditemsr�r�r�
toterminal)r>ror�r+rHrArArB�pytest_collection_finish!s(
�
�z)TerminalReporter.pytest_collection_finishc
	Cs^|jjjdkr<|jjjdkr.tdd�|D��}t|���D]\}}|j�d||f�qdS|D]	}|j�|j�q0dSg}d}|D]j}|�	�dd�}|r_||dt
|��krYn|��|sN|t
|�d�D]D}	|�|	�t
|�dd}|j�|�|	���|jjjdkr�t
|	d	d�}
|
r�t�|
�nd}|r�|��D]}|j�d
�|d|��q�qgqBdS)Nrr�css"�|]}|j�dd�dVqdS�r�rGrN)r�r�)rf�itemrArArB�	<genexpr>:s� z8TerminalReporter._printcollecteditems.<locals>.<genexpr>z%s: %dr�rG�  �objz{}{})r�r�rbr�sortedr!r�rur��	listchainrrr�rI�inspect�getdoc�
splitlinesr])
r>r!�counts�namerar��stack�indent�needed_collectors�colr��docrurArArBr�7s>��
���z%TerminalReporter._printcollecteditems)�hookwrapper�
exitstatusccs��dV}|��|j�d�tjtjtjtjtjf}||vr,|j	s,|j
jj|||j
d�|j
r:|jdt|j
�dd�|tjkrG|��d|_n|jrU|jdt|j�dd�|��dS)Nr�)r�r�r�r�T)r9)�
get_resultr�rur�OK�TESTS_FAILED�INTERRUPTED�USAGE_ERROR�NO_TESTS_COLLECTEDrfr�r?�pytest_terminal_summary�
shouldfailrrR�_report_keyboardinterruptr��
shouldstop�
summary_stats)r>ror�r��summary_exit_codesrArArB�pytest_sessionfinishTs,���
z%TerminalReporter.pytest_sessionfinish)NNNccs<�|��|��|��|��dV|��|��dSrM)�summary_errors�summary_failures�summary_warnings�summary_passes�short_test_summaryr�rArArBr�os�z(TerminalReporter.pytest_terminal_summary�excinfocCs|jdd�|_dS)NT)�funcargs)�getreprr�)r>r�rArArB�pytest_keyboard_interruptzsz*TerminalReporter.pytest_keyboard_interruptcCs|jdur|��dSdSrM)r�r�r�rArArB�pytest_unconfigure}s
�z#TerminalReporter.pytest_unconfigurecCs||j}|dus	J�|jdusJ�|jj}|�d|�d|vr<|jjjr+|�|j�dS|j�|j�|jj	ddd�dSdS)Nr��KeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)r8)
r��	reprcrashr�rr�r��	fulltracer�r�ru)r>r'r�rArArBr��s

��z*TerminalReporter._report_keyboardinterruptr�r,�domaincsvdtdtf��fdd�}|r5||�}�jdkr1|�d�d|�dtj�kr1|d	t�jt|��7}|dSd
}|dS)Nr�r:cs\�j�|�}�r,|���r,|dt���}��d�}|d�dd�|d<|d�|�7}|S)N�[rr�r�)r��cwd_relative_nodeid�endswithrr�r�r�)r�rurE�r�r>rArB�mkrel�s
z-TerminalReporter._locationline.<locals>.mkrelr:r�r�\z <- z
[location]r�)	rRr�r�r�r�SEPr%r�r)r>r�r�r,r�r�r�rAr�rBr3�s
��zTerminalReporter._locationlinecCs|j}|r|SdS)Nztest session)�	head_line)r>rHr�rArArB�_getfailureheadline�sz$TerminalReporter._getfailureheadlinecCsNzt|jj�WSty&zt|j�dd�WYSty%YYdSww)N�2r�)rR�longreprr��AttributeError)r>rHrArArB�
_getcrashline�s��zTerminalReporter._getcrashliner�cCsdd�|j�|d�D�S)NcSsg|]	}t|d�s|�qS)�	_pdbshown)rArerArArBrg�rhz/TerminalReporter.getreports.<locals>.<listcomp>rA�r�r�)r>r�rArArB�
getreports�r zTerminalReporter.getreportsc
s.��d�r��j�d�}|sdS�jdu}|r|�jd�}n|}t|��_|s)dSi}|D]}|�|jg��|�q-dtt	dt
f�fdd�}|rKdnd}�jd	|d
dd�|��D]2\}}	||	�}
|
r}�j
�|
�|��}d
�dd�|D��}|��}n|��}�j
�|��j
��qZ�j
�d�dSdS)Nr�r1�reportsr:csng}|D]}|��j�}|r|�|�qt|�dkr"d�tt|��Stdd�|D��}d�dd�|��D��S)N�
rcss$�|]
}t|��dd�dVqdSr�)rRr�)rf�locrArArBr��s�
�zWTerminalReporter.summary_warnings.<locals>.collapsed_location_report.<locals>.<genexpr>css.�|]\}}d�|||dkrdnd�VqdS)z{}: {} warning{}rGr�r�N)r])rf�k�vrArArBr��s
��
�)	r�r�r�rr�r�rRrr!)r��	locationsr�r2�counts_by_filenamer�rArB�collapsed_location_report�s
��
�zDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportzwarnings summary (final)zwarnings summaryrTF)r8rbrcss�|]}d|VqdS)r�NrArerArArBr��s�z4TerminalReporter.summary_warnings.<locals>.<genexpr>zG-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html)r�r�r�r�rr"r�r�rr�rRrr!r�rur�r��rstrip)
r>�all_warningsr�warning_reports�reports_grouped_by_message�wrr�rr��message_reports�maybe_locationr��indentedrAr�rBr��s>



��z!TerminalReporter.summary_warningscCs�|jjjdkr<|�d�r>|�d�}|sdS|�dd�|D]"}|jr5|�|�}|jd|ddd�|�|�|�	|j
�qdSdSdS)	Nrt�Pr,r�PASSESrYT)r7rb)r�r�rpr�r�r�sectionsr��_outrep_summary�_handle_teardown_sectionsr��r>r�rHr�rArArBr��s



�zTerminalReporter.summary_passescs|�d�}�fdd�|D�S)Nr�cs$g|]}|jdkr|j�kr|�qS)r�)r�r�)rfr��r�rArBrgs
�z:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r�)r>r�r�rAr�rB�_get_teardown_reportss

�z&TerminalReporter._get_teardown_reportscCs|�|�D]}|�|�qdSrM)r��print_teardown_sections)r>r�r�rArArBr�	s�z*TerminalReporter._handle_teardown_sectionsrHcCsz|jjj}|dkrdS|jD],\}}|dkr||vrqd|vr:|j�d|�|dd�dkr4|dd�}|j�|�qdS)Nrtr|r�rsr�r)r�r�rxr�r�rru�r>rHrx�secnamerrArArBr�
s
��z(TerminalReporter.print_teardown_sectionscCs�|jjjdkrL|�d�}|sdS|�dd�|jjjdkr.|D]}|�|�}|�|�qdS|D]}|�|�}|jd|ddd�|�|�|�	|j
�q0dSdS)	Nrtr+r�FAILURESrurYT�r9rb)r�r�rpr�rr�r�r�r�r�r�)r>r�rHrur�rArArBr�s"

�

�
z!TerminalReporter.summary_failurescCs�|jjjdkrD|�d�}|sdS|�dd�|jdD]*}|�|�}|jdkr,d|}n	d|j�d|��}|jd	|d
d
d�|�|�qdSdS)Nrtr2r�ERRORSr�zERROR collecting z	ERROR at z of rYTr�)	r�r�rpr�rr�r�r�r�r�rArArBr�+s



�zTerminalReporter.summary_errorscCs~|�|j�|jjj}|dkrdS|jD](\}}|dkr!||vr!q|j�d|�|dd�dkr6|dd�}|j�|�qdS)Nrtr|rsr�r)r�r�r�r�rxr�rrur�rArArBr�:s
�z TerminalReporter._outrep_summarycCsP|jdkrdSt��|j}|��\}}g}|jdk}|r!|jj}|D]\}}|jj|fi|��}	|r=|t|	�t|�7}|�	|	�q#d�
|�}
|di}dt|���}|jj|fi|��}
|ri|t|
�t|�7}|
|
7}
|r�|jjdi|��}|�d�r�|dd�}|t|�7}|
|7}
|r�|j
d	|
fd
|i|��dS|j|
fi|��dS)Nr�rr�Tz in r�z���rr��r�)r�rrcrv�build_summary_stats_liner�r�r�rr�r��format_session_durationr�rr�)r>�session_duration�partsrX�
line_parts�display_sepr��textr��with_markupr��main_markup�duration�duration_with_markup�markup_for_end_seprArArBr�Gs:



zTerminalReporter.summary_statsc
	s��jsdSdttdtddf�fdd�}dttddf�fdd�}dttddf�fdd	�}dttddf�fd
d�}||t|dd
�|t|dd
�t|dd
�d�}g}�jD]
}|�|�}|rb||�qU|rx�jddddd�|D]	}	��|	�qpdSdS)Nr��statr:csT�j�|g�}|sdS�j}|D]}t�|t�}t||�j|di�}|�|�qdS)NT)r�r�r��_color_for_type�_color_for_type_default� _get_line_with_reprcrash_messager�r�)r�rr+r�rHr}rur�rArB�show_simpleps��z8TerminalReporter.short_test_summary.<locals>.show_simplecs��j�dg�}|D]7}|��j�}�jj|fitddi��}t�j�j|�}|�d|��}|j}|r;|dt	|�7}|�
|�q	dS)Nr/r1Tr�� - )r�r��_get_verbose_wordr�r�r�r�_get_node_id_with_markupr6rRr�)r�r/rH�verbose_word�markup_wordr�rurKr�rArB�show_xfailed|s�
��z9TerminalReporter.short_test_summary.<locals>.show_xfailedcst�j�dg�}|D].}|��j�}�jj|fitddi��}t�j�j|�}|j}|�	|�d|�d|���q	dS)Nr0r1Tr�)
r�r�rr�r�r�rrr6r�)r�r0rHrr	r�rKr�rArB�show_xpassed�s�
��z9TerminalReporter.short_test_summary.<locals>.show_xpassedc
	s��j�dg�}|rt�j|�ng}|sdS|d��j�}�jj|fitddi��}d}|D]/\}}}}	|	�	|�rB|	t
|�d�}	|durS|�d|||||	f�q/|�d||||	f�q/dS)Nr-rr1T�	Skipped: z%s [%d] %s:%d: %sz%s [%d] %s: %s)r�r��
_folded_skipsr�rr�r�r�r�
startswithrr�)
r�r-�fskipsrr	r��numr�r,rKr�rArB�show_skipped�s(�
�
��z9TerminalReporter.short_test_summary.<locals>.show_skippedr+)rr,r2)r��X�fr��pr�rzshort test summary infoT)r=rb)rirrRrr�rr�)
r>rr
rr�REPORTCHAR_ACTIONSr�r�rcrurAr�rBr�ls2


�	

��z#TerminalReporter.short_test_summarycCsB|jdus
|jdus
|jr|��|jsJ�|jsJ�|j|jfSrM)r�r�rPr$r�rArArBrT�s


z TerminalReporter._get_main_color�unknown_type_seencCsX|j}d|vsd|vrd}|Sd|vsd|vs|rd}|Sd|vs$|js(d}|Sd}|S)	Nr+r2r9r1r0r8r,r7)r�rP)r>rr�rXrArArB�_determine_main_color�s���z&TerminalReporter._determine_main_colorcCsTg}|j��D]}|r|tvr||vr|�|�qtt�||_|�t|��|_dSrM)	r��keys�KNOWN_TYPESr��listr�rrTr�)r>�
unknown_types�
found_typerArArBr$�s
�z TerminalReporter._set_main_colorcCs|j�d�r
|��S|��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.
        r�)r�r��&_build_collect_only_summary_stats_line� _build_normal_summary_stats_liner�rArArBr��sz)TerminalReporter.build_summary_stats_line�keycCs|j�|g�}dd�|D�S)zRGet test/collection reports for the given status key, such as `passed` or `error`.cSsg|]
}t|dd�r|�qS)r�T)rIrerArArBrg�sz<TerminalReporter._get_reports_to_display.<locals>.<listcomp>r�)r>rr�rArArB�_get_reports_to_display�sz(TerminalReporter._get_reports_to_displayc	Cs~|��\}}g}|D]'}|�|�}|r1t|�}t�|t�}|dd||ki}|�dt||�|f�q
|s;dtdifg}||fS)NTrb�%d %szno tests ran)rTr rrr�rr��	pluralize)	r>rX�known_typesr�rr�rar}r�rArArBr�s
�z1TerminalReporter._build_normal_summary_stats_linecCs�t|�d��}t|�d��}|jdkrdddifg}d}n@|dkr3d}dt|jd	�}||difg}n*|j|k}|rCd}d
|�d�}nd}|j|}|�d|j�d
|�d�}||difg}|rqtd}|dt|d�|difg7}||fS)Nr.r2rzno tests collectedr8Tr7z%d %s collected�testzno tests collected (z deselected)rRz tests collected (r!)rr r�r"r)r>r.rr�rX�collected_output�all_tests_were_deselectedrnrArArBrs*


z7TerminalReporter._build_collect_only_summary_stats_linerM)r:r�r�)r:N)NN)r)F)ror*r:N)arNrOrPrrrr=r��propertyr�r�rTr�rerfr��setterr�rRr�r�rrrr�r�r�bytesr�rrrrurrr&rr(r1�WarningMessager.rr0r"r1rr4r(rNrPr[rGr�rUrdr'rkrjr r�rrr~r�r�rr�r
r�r�
BaseExceptionr�r�r�r3r�r�r�r�r�r�r�r�r�r�r&r�r�r�rTrr$r	r�r rrrArArArBr�Vs

		������
� 
�����
�
��
���
�
D


%�
�

�
�


����
�

6



%R
*	
��r��twrHcCsB|�|j�}|�d�^}}|r|jd�|�dd�}|d|S|S)Nr�Trp)r�r�r�r�r�)r,r�rHr��pathr��parts_markuprArArBr,srr]r�rLcCs�|�d�}|dkr|d|�}d}t|�d��}|t|�|kr"dS|t|�|krP|t|�8}|d|�}|t|�|krL|dd�}|t|�|ks>||7}|�|�S)z�Format msg into format, ellipsizing it if doesn't fit in available_width.

    Returns None if even the ellipsis can't fit.
    rr�Nz...r�)�findrr]r)r]r�rL�i�ellipsis�format_widthrArArBrD6s
�
rD�word_markupcCs�|�|�}|j|fi|��}t|||�}|�d|��}t|�}z|jjj}	Wn
ty0Y|Swt�s@|j	|}
t
d|	|
�}	nd|	��}	|	durM||	7}|S)z?Get summary line for a report, trying to add reprcrash message.r�z - {}rN)rr�rrr�r�r�r�rr�rD)r�rHr,r3rr\r5ru�
line_widthr�rLrArArBrOs$

�

rr�r-cCs�i}|D]X}|jdus
J�t|jt�sJ||jf��t|j�dks(J||jf��|j\}}}t|t|��}t|di�}|jdkrNd|vrNd|vrN|d|f}n|||f}|�|g��	|�qg}	|�
�D]\}}
|	�	t|
�g|�R�qc|	S)Nrr�keywordsr��skip�
pytestmark)r�rr@rr%rrIr�r"r�r!)r�r-�d�eventr�r,rKr5rrE�eventsrArArBr
ks$

r
r9r8r7)r+r2r1r,ra�nouncCs6|dvr||fS|�dd�}||dkr|dfS|fS)N)r2r1r$r1�warningrGr�)r�)rar;rArArBr"�sr"cCsJg}|D]\}}dj|d�}|�d�r|dd�}||vr"|�|�q|S)Nz"{dist.project_name}-{dist.version})�distzpytest-�)r]rr�)r�rEr/r=r�rArArBr��s

�r��secondscCs6|dkr
|d�d�Stjt|�d�}|d�d|�d�S)zQFormat the given seconds in a human readable manner to show in the final summary.�<z.2fr�)r?zs (r<)�datetime�	timedeltar�)r?�dtrArArBr��sr�cCs�t|d�rtt|j�}|�d�r|td�d�}|S|jsJ�t|jt	�s'J�|j\}}}|�d�r<|td�d�}|S|dkrBd}|S)zqGet the reason string of a skip/xfail/xpass test report.

    The string is just the part given by the user.
    r6zreason: Nr�Skippedr�)
rArrRr6rrr-rr�r@)r�rKrYrArArBrC�s



�rC)arQrU�dataclassesrAr�rwr�r
r1�collectionsr�	functoolsr�pathlibr�typingrrrrr	r
rrr
rrrrrrrr{�_pytest._versionr�rr�
_pytest._coder�_pytest._code.coder�_pytest._ior�_pytest._io.wcwidthr�_pytest.assertion.utilr�_pytest.compatrr�rrrr �_pytest.config.argparsingr!�
_pytest.nodesr"r#�_pytest.pathlibr$r%�_pytest.reportsr&r'r(�typing_extensionsr)�_pytest.mainr*rlrr��Actionr4rYr�r�rRr�r��	dataclassr�r�rr�rDrTrr
rrr"r��floatr�rCrArArArB�<module>s�%|\
���
�
���
� �