o
    Zh                     @   s  d 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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l0m1Z1 ddl0m2Z2 dd l0m3Z3 dd!l0m4Z4 dd"l5m6Z6 dd#l7m8Z8 dd$l7m9Z9 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@ erdd*lAmBZB d+ZCd,ZDd-ZEG d.d/ d/ejFZGG d0d1 d1eZHd2e6d3dfd4d5ZId6e2d3dfd7d8ZJd6e2d3eKfd9d:ZLe4d;d<d=e>d3eeKeKeKf fd>d?ZMejNG d@dA dAZOeG dBdC dCZPdDe*d6e2dEe>fdFdGZQdHeKdIeKdJeRd3eeK fdKdLZSd6e2dEe>dDe*dMeeKeTf d3eKf
dNdOZUdPe
dQee? d3eeeReKeeR eKf  fdRdSZVdTdTdUdVdWZWdUZXdXeRdYeKd3eeReKf fdZd[ZYd3eeK fd\d]ZZd^e[d3eKfd_d`Z\d=e@d3eKfdadbZ]dS )czsTerminal reporting of the full testing process.

This is a good source for looking at the various reporting hooks.
    N)Counter)partial)Path)Any)Callable)ClassVar)Dict)final)	Generator)List)Literal)Mapping)
NamedTuple)Optional)Sequence)Set)TextIO)Tuple)TYPE_CHECKING)Union)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                       s   e Zd ZdZ			ddee dedededee d	df fd
dZ		dde
jde
jdeeee df dee d	df
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   )r3   r4   nargsr5   r6   r7   )super__init__)selfr3   r4   r5   r6   r7   	__class__ G/var/www/html/lang_env/lib/python3.10/site-packages/_pytest/terminal.pyr;   V   s   
zMoreQuietAction.__init__parser	namespacevaluesoption_stringc                 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__g   s   zMoreQuietAction.__call__)NFNN)__name__
__module____qualname____doc__r   strobjectboolr   r;   argparseArgumentParser	Namespacer   rI   __classcell__r?   r?   r=   r@   r2   O   s<    
r2   c                   @   sB   e Zd ZU dZeed< eed< eeeeeee	f f f 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.
    categoryletterwordN)
rK   rL   rM   rN   rO   __annotations__r   r   r   rQ   r?   r?   r?   r@   rV   t   s
   
 $rV   rA   r8   c              	   C   sn  | 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- |jd.d/dd0d1g d2d3d4 |jd5dd6g d7d8d9d: |jd;d<ddd=d> |jd?d@dd@d1g dAdBd4 |jdCdDdDdEgdFdG | jdHdIdJdK tj| tjdLdM d S )NNz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-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').)r^   r4   r5   metavarr7   z--disable-warningsz--disable-pytest-warningsdisable_warningszDisable warnings summary)r5   r4   r^   r7   z-lz--showlocalsZ
showlocalsz/Show locals in tracebacks (disabled by default))r^   r4   r5   r7   z--no-showlocalsstore_falsezFHide locals in tracebacks (negate --showlocals passed through addopts))r^   r4   r7   z--tbstyletbstyleauto)rk   longZshortnolinenativez5Traceback print mode (auto/long/short/line/native/no))rf   r^   r4   r5   choicesr7   z--show-captureshowcapture)rm   stdoutstderrlogallru   zOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)r^   r4   rp   r5   r7   z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))r^   r5   r7   z--colorcolor)yesrm   rk   z#Color terminal output (yes/no/auto)z--code-highlightrw   rm   zSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r5   rp   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
_addoptionr2   int_REPORTCHARS_DEFAULTZaddinir   Z_add_verbosity_iniVERBOSITY_TEST_CASES)rA   groupr?   r?   r@   pytest_addoption   s   			
r~   configc                    sN   t | tj | j d | jjs| jjr% fdd}| jj	
d| d S d S )Nterminalreporterc                    s"   d tt|} d|  d S )N z[traceconfig] )joinmaprO   
write_line)tagsargsmsgreporterr?   r@   mywriter  s   z"pytest_configure.<locals>.mywriterzpytest:config)TerminalReportersysrr   pluginmanagerregisteroptiondebugtraceconfigtracerootZsetprocessor)r   r   r?   r   r@   pytest_configure  s   r   c                 C   s   | j j}ddh}d}|D ]'}||v r| }|dkrd}q|dkr$d}q|dkr+d}q||vr3||7 }q| j jsBd	|vrBd	| }|S | j jrPd	|v rP|d	d}|S )
NFS aZsxXEfAZPpsxXEfNw)r   rd   lowerrg   replace)r   rd   Zold_aliasesZ
reportoptscharr?   r?   r@   getreportopt  s*   r   TZtrylastreportc                 C   sH   d}| j rd}n| jrd}| j}| jdv r|dkrd}d}||| fS )Nr   .s)collectsetupteardownr*   r1   E)r+   r,   outcomewhenupper)r   rX   r   r?   r?   r@   pytest_report_teststatus1  s   r   c                   @   sd   e Zd ZU dZeed< dZee ed< dZee	ee
f  ed< dZeed< ded	ee f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``).
    messageNnodeid
fslocationTcount_towards_summaryr   r8   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   filenameZlinenumrelpathr?   r?   r@   get_locationS  s   
zWarningReport.get_location)rK   rL   rM   rN   rO   rZ   r   r   r   r   rz   r   r   r   r   r?   r?   r?   r@   r   A  s   
 
r   c                   @   s  e Zd Zddedee ddfddZded fdd	Ze	de
fd
dZe	defddZe	defddZe	defddZe	defddZejdee ddfddZe	defddZdedefddZdededdfddZdd ed!eddfd"d#Zdd$d%Zd&d'd(d)d*ed+ed,e
d-ededdfd.d/Zd&d0d*ed+ededdfd1d2Zdd3d4Zd5eeef deddfd6d7Zd5ededdfd8d9Z		dd:ed;ee d<ee
 deddf
d=d>Zdd;ed:ed@eddfdAdBZ dCed@eddfdDdEZ!dFedGe"e# ddfdHdIZ$dJe%defdKdLZ&dMe'j(deddfdNdOZ)dPe*ddfdQdRZ+dGe"e, ddfdSdTZ-dedUe.eee
 ef ddfdVdWZ/dXe0ddfdYdZZ1e	defd[d\Z2deddfd]d^Z3defd_d`Z4ddadbZ5e	de
fdcddZ6ddedfZ7dXe8ddfdgdhZ9ddieddfdjdkZ:e;dldmddpdqZ<dre"eee"e f  ddfdsdtZ=dede>e fdudvZ?ddwdxZ@dGe"e, ddfdydzZAe;dld{dndod|ee
eBf deCd} fd~dZDe;dld{deCd} fddZEdeFeG ddfddZHdddZIdddZJdededee
 dedef
ddZKdd ZLdd ZMdefddZNdddZOdddZPdddZQdedededdfddZRdede>e0 fddZSdeddfddZTde0ddfddZUdddZVdddZW	ddededee ddfddZXdddZYdeZddfddZ[dddZ\dddZ]de.ee>e f fddZ^dedefddZ_dddZ`de.e>e.eeaeef f  ef fddZbdede>e# fddZcde.e>e.eeaeef f  ef fddZdde.e>e.eeaeef f  ef fddĄZedS )r   Nr   filer8   c                 C   s   dd l }|| _d| _d | _d | _i | _d | _d | _|jj	| _
|d u r%tj}|j||| _| jj| _d | _t|| _| jj| _| | _t | _|  | _d | _d | _d | _d S Nr   )_pytest.configr   _numcollected_session_showfspathstats_main_color_known_typesr   r   	startpathr   rr   Zcreate_terminal_writer_tw	fullwidth_screen_widthcurrentfspathr   rd   Z	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;   `  s,   






zTerminalReporter.__init__)ry   r\   Fc                 C   s`   | j dddkr| j ddkrdS | j ddrdS | j d}|dv r(dS |d	kr.d	S dS )
zRReturn whether we should display progress information based on the current config.capturerm   rx   progress-even-when-capture-noFZ	setupshow>   r   ry   ry   r\   )r   	getoptiongetini)r<   cfgr?   r?   r@   r   z  s   
z.TerminalReporter._determine_show_progress_infoc                 C   s   | j jj}|S rJ   )r   r   r]   )r<   	verbosityr?   r?   r@   r     s   
zTerminalReporter.verbosityc                 C   s
   | j dkS r   )r   r<   r?   r?   r@   
showheader     
zTerminalReporter.showheaderc                 C      t | jjjS rJ   )rQ   r   r   r`   r   r?   r?   r@   r`        zTerminalReporter.no_headerc                 C   r   rJ   )rQ   r   r   ra   r   r?   r?   r@   ra     r   zTerminalReporter.no_summaryc                 C   s"   | j d u r| jtjdkS | j S r   )r   r   get_verbosityr   r|   r   r?   r?   r@   
showfspath  s   
zTerminalReporter.showfspathvaluec                 C   s
   || _ d S rJ   )r   )r<   r   r?   r?   r@   r     r   c                 C   s   | j tjdkS r   )r   r   r   r|   r   r?   r?   r@   showlongtestinfo  s   z!TerminalReporter.showlongtestinfor   c                 C   s   ddd ||}|| jv S )Nxr   )r.   r,   )getrd   )r<   r   r?   r?   r@   hasopt  s   
zTerminalReporter.hasoptr   markupc                 K   s   | j j|dd  }| jd u s|| jkr7| jd ur!| jr!|   || _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   rn   write)r<   r   resr   fspathZ	relfspathr?   r?   r@   write_fspath_result  s   
z$TerminalReporter.write_fspath_resultr   prefixextrac                 K   sL   | j |kr| j  || _ | j| |r$| jj|fi | d| _ d S d S )N)r   r   rn   r   )r<   r   r   kwargsr?   r?   r@   write_ensure_prefix  s   


z$TerminalReporter.write_ensure_prefixc                 C   s   | j r| j  d | _ d S d S rJ   )r   r   rn   r   r?   r?   r@   ensure_newline  s   

zTerminalReporter.ensure_newlineF   
)r   marginline_sepcontentr   r   r   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   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 rJ   )r   r   r   r?   r?   r@   r     s   zTerminalReporter.flushrn   c                 K   s6   t |tst|dd}|   | jj|fi | d S )Nr   )errors)
isinstancerO   r   r   rn   )r<   rn   r   r?   r?   r@   r     s   
zTerminalReporter.write_linec                 K   sZ   | dd}|r| jjt| d }d| }nd}t|}| jjd| | fi | 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   lenrO   r   )r<   rn   r   r   Z
fill_countfillr?   r?   r@   rewrite  s   	
 zTerminalReporter.rewriteseptitler   c                 K   s$   |    | jj|||fi | d S rJ   )r   r   r  )r<   r  r  r   r   r?   r?   r@   	write_sep  s   zTerminalReporter.write_sep=kwc                 K   s   | j j||fi | d S rJ   )r   r  )r<   r  r  r	  r?   r?   r@   section	  s   zTerminalReporter.sectionr   c                 K   s   | j j|fi | d S rJ   )r   rn   )r<   r   r	  r?   r?   r@   rn        zTerminalReporter.linerW   itemsc                 C   s2   || j v}| j |g | |r|   d S d S rJ   )r   
setdefaultextend_set_main_color)r<   rW   r  Zset_main_colorr?   r?   r@   
_add_stats  s
   
zTerminalReporter._add_statsexcreprc                 C   s&   t |dD ]	}| d|  qdS )Nr   zINTERNALERROR> T)rO   r   r   )r<   r  rn   r?   r?   r@   pytest_internalerror  s   z%TerminalReporter.pytest_internalerrorwarning_messagec                 C   s@   ddl m} |j|jf}||}t|||d}| d|g d S )Nr   )warning_record_to_str)r   r   r   r0   )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_recordedpluginc                 C   s&   | j jjrd| }| | d S d S )NzPLUGIN registered: )r   r   r   r   )r<   r  r   r?   r?   r@   pytest_plugin_registered)  s   

z)TerminalReporter.pytest_plugin_registeredc                 C   s   |  d| d S )Nr-   )r  )r<   r  r?   r?   r@   pytest_deselected1     z"TerminalReporter.pytest_deselectedlocationc                 C   sR   | j r| j|g|R  }| |d |   d S | jr'| |d |   d S d S )Nr   )r   _locationliner   r   r   r   )r<   r   r  rn   r?   r?   r@   pytest_runtest_logstart4  s   z(TerminalReporter.pytest_runtest_logstartr   c                 C   s<  d| _ |}t| jjj|| jd }|j|j|j}}}t|t	s$d }n|\}}| 
||g |s5|s5d S t|d}|d u rit|d}	|jrM|	sMddi}n|jrW|	rWddi}n|jr_ddi}n
|jrgddi}ni }| jtjdkr}| jj|fi | n| j|j | j|jg|jR  }
|s| j|
|fi | |jst|drt|}| jtjd	k r| jj| jj td
 d }td||}nd| d}|r|d ur| | | j r| !  n:| "  | jd|j#j$j%  | j r| jj| & d dd n| jd | jj|fi | | jd|
  d| _'| (  d S )NT)r   r   nodewasxfailgreenyellowredr       [100%]rE   z ({})z ()z[%s]r   )cyanr   ))Z
_tests_ranrV   r   hookr   rW   rX   rY   r   tupler  hasattrr+   r*   r,   r   r   r|   r   r   r   addr   r  r  r   _get_raw_skip_reasonr   r   r  _format_trimmedr   r   r   r   r  Zgatewayid!_get_progress_information_messager   r   )r<   r   repr   rW   rX   rY   r   Zrunning_xdistZ	was_xfailrn   reasonavailable_widthZformatted_reasonr?   r?   r@   pytest_runtest_logreportA  sv   









z)TerminalReporter.pytest_runtest_logreportc                 C   s    | j d usJ t| j| j jkS rJ   )r   r  r   testscollectedr   r?   r?   r@   _is_last_item  s   zTerminalReporter._is_last_itemc           	      C   s   | j sJ | jtjdkra| jrc| jdkr&| j j}td| d| d}ntd}| j	| | j
r9|   d S |  \}}| j}|| d | jk}|re|  }| jj|d fi |d	i d S d S d S d S )
Nr   r\    [/]r$  rE   r   T)r   r   r   r   r|   r   r3  r  r   r*  r4  r   _get_main_color_width_of_current_liner   r.  r   r   )	r<   r   Z	num_testsZprogress_length
main_color_r   Z	past_edger   r?   r?   r@   pytest_runtest_logfinish  s&   

 z)TerminalReporter.pytest_runtest_logfinishc                 C   s   | j sJ | j j}| jdkr4|r+| j}dtt| d}d| d}|t||S d| d| dS |rDdt| jd	 | d
dS dS )Nr\   z{:zd}r5  z/{}]z [ z / z ]d   Z3dz%]r$  )r   r3  r   r   r  rO   format)r<   	collectedry   Zcounter_formatformat_stringr?   r?   r@   r.    s   

z2TerminalReporter._get_progress_information_messagec                 C   sN   |   \}}|  }| j}| jj| d }| j||fddi|di d S )NrE   r   T)r8  r.  r9  r   r   r   rjust)r<   rv   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@   r9    s   z'TerminalReporter._width_of_current_linec                 C   s\   | j r| jjjdkr| jdddd t | _d S d S | jjjdkr,| jdddd d S d S )Nr   zcollecting ... T)r   boldrE   )r   r   r   r]   r   r   timer   r   r?   r?   r@   pytest_collection  s   z"TerminalReporter.pytest_collectionc                 C   sb   |j r| d|g n
|jr| d|g dd |jD }|  jt|7  _| jr/|   d S d S )Nr1   r,   c                 S   s   g | ]	}t |tr|qS r?   )r   r"   .0r   r?   r?   r@   
<listcomp>      z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)r*   r  r,   resultr   r  r   report_collect)r<   r   r  r?   r?   r@   pytest_collectreport  s   z%TerminalReporter.pytest_collectreportr	   c                 C   s@  | j jjdk r	d S |s t }| jd ur| j|t krd S || _t| j	dg }t| j	dg }t| j	dg }| j
| }|rDdnd}|t| j
d | j
dkrTd	nd
 7 }|rh|d||dkrcd
nd	f 7 }|rp|d| 7 }|rx|d| 7 }| j
|kr|d| 7 }| jr| j|ddd |r| d d S d S | | d S )Nr   r1   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   r]   r   rC  r   REPORT_COLLECTING_RESOLUTIONr  r   r   r   rO   r   r  r   r   )r<   r	   tr   r,   r-   selectedrn   r?   r?   r@   rJ    s<   


zTerminalReporter.report_collectTr   sessionr)   c                 C   s  || _ t | _| jsd S | jdddd t }| jsdt	j d| }t
t	dd }|rFdtt|d d	 }|d
| d|d	  d7 }|dtjj dtj 7 }| jdkse| jjjset
| jjdd rn|dtt	j 7 }| | | jjj| j| jd}| | d S d S )Nr  ztest session startsTrB  z	platform z -- Python pypy_version_infor      z[pypy--r7  z	, pytest-z	, pluggy-r   Zpastebinz -- )r   
start_path)r   r   rC  _sessionstarttimer   r  platformpython_versionr`   r   rG   r   r   rO   r   _versionversionpluggy__version__r   r   r   r   
executabler   r'  pytest_report_headerr   _write_report_lines_from_hooks)r<   rO  Zverinfor   rQ  linesr?   r?   r@   pytest_sessionstart  s2   


z$TerminalReporter.pytest_sessionstartr_  c                 C   s<   t |D ]}t|tr| | q|D ]}| | qqd S rJ   )reversedr   rO   r   )r<   r_  Zline_or_linesrn   r?   r?   r@   r^    s   
z/TerminalReporter._write_report_lines_from_hooksc                 C   s   d|j  g}|jr|dt|j |j  |jtjjkr-|d}|d	d
| |j }|r@|dd
t|  |S )Nz	rootdir: zconfigfile: 	testpathsztestpaths: {}, zplugins: %s)r   Zinipathappendr%   Zargs_sourcer   Z
ArgsSourceZ	TESTPATHSr   r>  r   r   Zlist_plugin_distinfo_plugin_nameversions)r<   r   rI  rb  
plugininfor?   r?   r@   r]    s   

z%TerminalReporter.pytest_report_headerc                 C   s   |  d | jjj| j| j|jd}| | | jdrM|jr3| jjj	dkr-| j
d | |j | jd}|rO| j
dd |D ]}|| j
 qDd S d S d S )	NT)r   rT  r  collectonlyr   r*   !zcollection failures)rJ  r   r'  Zpytest_report_collectionfinishr   r  r^  r   r   r]   r   rn   _printcollecteditemsr   r   r  
toterminal)r<   rO  r_  r*   r/  r?   r?   r@   pytest_collection_finish*  s(   

z)TerminalReporter.pytest_collection_finishc              	   C   sZ  | j tj}|dk r=|dk r/tdd |D }t| D ]\}}| jd||f  qd S |D ]	}| j|j	 q1d S g }d}|D ]g}|
 dd  }	|r`||	d t| krZn|  |sO|	t|d  D ]A}
||
 t|d d }| j| |
  |dkrt|
d	d }|rt|nd }|r| D ]}| jd
|d | qqhqCd 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>D  s     z8TerminalReporter._printcollecteditems.<locals>.<genexpr>z%s: %dr   rE     objz{}{})r   r   r   r|   r   sortedr  r   rn   r   Z	listchainr  r  rd  rG   inspectgetdoc
splitlinesr>  )r<   r  Ztest_cases_verbositycountsnamer\   rn  stackindentZneeded_collectorscolrq  docrn   r?   r?   r@   rj  @  s@   
z%TerminalReporter._printcollecteditems)wrapper
exitstatus)NNNc                 c   s    d V }| j d tjtjtjtjtjf}||v r(| js(| j	j
j| || j	d |jr6| jdt|jdd |tjkrC|   d | _n|jrQ| jdt|jdd |   |S )Nr   )r   r}  r   ri  T)r"  )r   rn   r   OKZTESTS_FAILEDZINTERRUPTEDZUSAGE_ERRORZNO_TESTS_COLLECTEDra   r   r'  pytest_terminal_summaryZ
shouldfailr  rO   _report_keyboardinterruptr   Z
shouldstopsummary_stats)r<   rO  r}  rI  Zsummary_exit_codesr?   r?   r@   pytest_sessionfinish^  s,   
z%TerminalReporter.pytest_sessionfinishc                 c   s^    |    |   |   |   |   |   zd V W |   |   S |   |   w rJ   )summary_errorssummary_failuressummary_xfailuressummary_warningssummary_passessummary_xpassesshort_test_summaryr   r?   r?   r@   r  y  s   

z(TerminalReporter.pytest_terminal_summaryexcinfoc                 C   s   |j dd| _d S )NT)Zfuncargs)Zgetreprr   )r<   r  r?   r?   r@   pytest_keyboard_interrupt     z*TerminalReporter.pytest_keyboard_interruptc                 C   s   | j d ur|   d S d S rJ   )r   r  r   r?   r?   r@   pytest_unconfigure  s   
z#TerminalReporter.pytest_unconfigurec                 C   s|   | j }|d us	J |jd usJ |jj}| d| d|v r<| jjjr+|| j d S |j| j | jj	ddd d S d S )Nri  KeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)r!  )
r   	reprcrashr   r  r   r   Z	fulltracerk  r   rn   )r<   r  r   r?   r?   r@   r    s   

z*TerminalReporter._report_keyboardinterruptr   r  domainc                    sv   dt dt f fdd}|r5||}jdkr1|dd |dtjkr1|d	tjt| 7 }|d S d
}|d S )Nr   r8   c                    s\   j | } r,| r,|d t   } d}|d dd|d< |d|7 }|S )N[r   r   r   )r   cwd_relative_nodeidendswithr  r   r   r   )r   rn   rC   r  r<   r?   r@   mkrel  s   
z-TerminalReporter._locationline.<locals>.mkrelr#  r   r   \z <- z
[location]r   )	rO   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   sN   zt |jjW S  ty&   zt |jd d W  Y S  ty%   Y Y dS w w )N2   r   )rO   longreprr  AttributeError)r<   r/  r?   r?   r@   _getcrashline  s   zTerminalReporter._getcrashlinerw  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    rH  z/TerminalReporter.getreports.<locals>.<listcomp>r?   r   r   )r<   rw  r?   r?   r@   
getreports  r  zTerminalReporter.getreportsc                    s.    dr jd}|sd S  jd u}|r| jd  }n|}t| _|s)d S i }|D ]}||jg | q-dtt	 dt
f fdd}|rKdnd} jd	|d
dd | D ]2\}}	||	}
|
r} j|
 | }ddd |D }| }n| } j|  j  qZ jd d S d S )Nr   r0   reportsr8   c                    sn   g }| D ]}|  j}|r|| qt|dk r"d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  )rO   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   rO   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   rO   r  r  r   rn   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      |  ddd d S )Nr+   ZPASSESPsummary_passes_combinedr   r?   r?   r@   r    r  zTerminalReporter.summary_passesc                 C   r  )Nr/   ZXPASSESXr  r   r?   r?   r@   r    r  z TerminalReporter.summary_xpasseswhich_reports	sep_title
needed_optc                 C   s   | j jjdkr<| |r>| |}|sd S | d| |D ]"}|jr5| |}| jd|ddd | | | 	|j
 qd S d S d S )Nrm   r  r;  T)r   rB  )r   r   rj   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_combinedc                    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    s
    z:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r  )r<   r   r  r?   r  r@   _get_teardown_reports  s   

z&TerminalReporter._get_teardown_reportsc                 C   s   |  |D ]}| | qd S rJ   )r  print_teardown_sections)r<   r   r   r?   r?   r@   r    s   z*TerminalReporter._handle_teardown_sectionsr/  c                 C   sz   | j jj}|dkrd S |jD ],\}}|dkr||vrqd|v r:| jd| |dd  dkr4|d d }| j| qd S )Nrm   ru   r   rS  rh  r   )r   r   rq   r  r   r  rn   r<   r/  rq   Zsecnamer   r?   r?   r@   r  #  s   
z(TerminalReporter.print_teardown_sectionsc                 C   s   |  dd d S )Nr*   ZFAILURESsummary_failures_combinedr   r?   r?   r@   r  0  r  z!TerminalReporter.summary_failuresc                 C   r  )Nr.   Z	XFAILURESr   r  r   r?   r?   r@   r  3  r  z"TerminalReporter.summary_xfailuresc                 C   s   | j jjdkrS|r| |rU| |}|sd S | d| | j jjdkr5|D ]}| |}| | q&d S |D ]}| |}| jd|ddd | 	| | 
|j q7d S d S d S )Nrm   r  rn   r;  Tr"  rB  )r   r   rj   r   r  r  r  r   r  r  r  r   )r<   r  r  r  r  r/  rn   r   r?   r?   r@   r  6  s&   




z*TerminalReporter.summary_failures_combinedc                 C   s   | j jjdkrD| d}|sd S | dd | jd D ]*}| |}|jdkr,d| }n	d|j d| }| jd	|d
d
d | | qd S d S )Nrm   r1   r  ZERRORSr   zERROR collecting z	ERROR at z of r;  Tr  )	r   r   rj   r  r  r   r  r   r  )r<   r  r/  r   r?   r?   r@   r  J  s   



zTerminalReporter.summary_errorsc                 C   s~   | | j | jjj}|dkrd S |jD ](\}}|dkr!||vr!q| jd| |dd  dkr6|d d }| j| qd S )Nrm   ru   rS  rh  r   )rk  r   r   r   rq   r  r  rn   r  r?   r?   r@   r  Y  s   
z TerminalReporter._outrep_summaryc                 C   sP  | j dk rd S t | j }|  \}}g }| j dk}|r!| jj}|D ]\}}| jj|fi |}	|r=|t|	t| 7 }|	|	 q#d
|}
|di}dt| }| jj|fi |}|ri|t|t| 7 }|
|7 }
|r| jjdi |}|dr|d d }|t|7 }|
|7 }
|r| jd	|
fd
|i| d S | j|
fi | d S )Nrh  r   rc  Tz in r   z[0mr  r   r   )r   r   rC  rU  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  f  s:   



zTerminalReporter.summary_statsc           
   	      s    j sd S dtt dtdd f fdd}dtt dd f fdd}dtt dd f fdd	}dtt dd f fd
d}||t|dd|t|ddt|ddd}g } j D ]}||}|rb|| qU|rx jddddd |D ]	}	 |	 qpd S d S )Nr_  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/  rv   rn   r   r?   r@   show_simple  s   z8TerminalReporter.short_test_summary.<locals>.show_simplec                        j dg }|D ]7}| j} jj|fi td di}t j j|}| d| }|j}|r;|dt	| 7 }| 
| q	d S )Nr.   r0   Tr    - r   r   _get_verbose_wordr   r   r   r  _get_node_id_with_markupr  rO   rd  )r_  r.   r/  verbose_wordmarkup_wordr   rn   r0  r   r?   r@   show_xfailed  s   
z9TerminalReporter.short_test_summary.<locals>.show_xfailedc                    r  )Nr/   r0   Tr   r  r  )r_  r/   r/  r  r  r   rn   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} jj|fi td di}d}|D ]/\}}}}	|		|rB|	t
|d  }	|d urS| d|||||	f  q/| d||||	f  q/d S )Nr,   r   r0   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   numr   r  r0  r   r?   r@   show_skipped  s(   

z9TerminalReporter.short_test_summary.<locals>.show_skippedr*   )r  r+   r1   )r   r  fr   pr   r  zshort test summary infoT)r&  rB  )rd   r   rO   r   r   r  r   )
r<   r  r  r  r  ZREPORTCHAR_ACTIONSr_  r   r^   rn   r?   r   r@   r    s2   


	

z#TerminalReporter.short_test_summaryc                 C   sB   | j d u s| jd u s| jr|   | j sJ | jsJ | j | jfS rJ   )r   r   r4  r  r   r?   r?   r@   r8    s
   

z TerminalReporter._get_main_colorunknown_type_seenc                 C   sX   | j }d|v sd|v rd}|S d|v sd|v s|rd}|S d|v s$| js(d}|S d}|S )	Nr*   r1   r"  r0   r/   r!  r+   r   )r   r4  )r<   r  r   r:  r?   r?   r@   _determine_main_color  s   z&TerminalReporter._determine_main_colorc                 C   sT   g }| j  D ]}|r|tvr||vr|| qtt| | _| t|| _d S rJ   )	r   keysKNOWN_TYPESrd  listr   r  rQ   r   )r<   Zunknown_typesZ
found_typer?   r?   r@   r    s   
z TerminalReporter._set_main_colorc                 C   s   | 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.
        rg  )r   r   &_build_collect_only_summary_stats_line _build_normal_summary_stats_liner   r?   r?   r@   r    s   z)TerminalReporter.build_summary_stats_linekeyc                 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    s    z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>r  )r<   r  r  r?   r?   r@   _get_reports_to_display  s   z(TerminalReporter._get_reports_to_displayc           	      C   s~   |   \}}g }|D ]'}| |}|r1t|}t|t}|dd||ki}|dt|| |f q
|s;dtdifg}||fS )NTrB  %d %szno tests ran)r8  r  r  r  r   r  rd  	pluralize)	r<   r:  Zknown_typesr  r  r  r\   rv   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r3d}dt| jd	 }||difg}n*| j|k}|rCd}d
| d}nd}| j| }| d| j d| d}||difg}|rqtd }|dt|d |difg7 }||fS )Nr-   r1   r   zno tests collectedr!  Tr   z%d %s collectedtestzno tests collected (z deselected)r6  z tests collected (r  )r  r  r   r  r  )r<   r-   r   r  r:  Zcollected_outputZall_tests_were_deselectedrN  r?   r?   r@   r  -  s*   


z7TerminalReporter._build_collect_only_summary_stats_linerJ   r  )r8   N)NN)r  )F)rO  r)   r8   N)frK   rL   rM   r   r   r   r;   r   r   propertyrz   r   rQ   r   r`   ra   r   setterr   rO   r   r   r   r   r   r   r   r   bytesr   r  r  r
  rn   r   r   r  r   r  r0   WarningMessager  r   r  r"   r  r   r  r(   r2  r4  r<  r.  r   r9  rD  r'   rK  rJ  r    r`  r^  r   r]  rl  rj  r   r
   r  r  r   BaseExceptionr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&   r  r  r  r8  r  r  r   r  r  r  r  r?   r?   r?   r@   r   ^  sH   
		
 




D


%








6







%U
*	
r   twr/  c                 C   sB   | |j}|d^}}|r| jd|dd}|d | S |S )Nr   TrP  )r  r   r   r   r   )r  r   r/  r   pathr  Zparts_markupr?   r?   r@   r  N  s   r  r>  r   r1  c                 C   s   | d}|dkr|d| }d}t| d}|t| |kr"dS |t| |krP|t|8 }|d| }|t| |krL|dd }|t| |ks>||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  iellipsisZformat_widthr?   r?   r@   r,  X  s   

r,  word_markupc                 C   s   | | }|j|fi |}t|| |}| d| }t|}z|jjj}	W n
 ty0   Y |S w t s@|j	| }
t
d|	|
}	nd|	 }	|	durM||	7 }|S )z?Get summary line for a report, trying to add reprcrash message.r   z - {}r  N)r  r   r  r   r  r  r   r  r   r   r,  )r   r/  r  r  r  rY   r  rn   Z
line_widthr   r1  r?   r?   r@   r  q  s$   



r  r   r,   c                 C   s   i }|D ]X}|j d usJ t|j tsJ ||j ft|j dks(J ||j f|j \}}}t| t|}t|di }|jdkrNd|v rNd|vrN|d |f}n|||f}||g 	| qg }	|
 D ]\}}
|		t|
g|R  qc|	S )NrR  keywordsr   skipZ
pytestmark)r  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*   r1   r0   r+   r\   nounc                 C   s6   |dvr| |fS | dd}| | dkr|d fS |fS )N)r1   r0   r  r0   warningrE   r   )r   )r\   r  r?   r?   r@   r    s   r  c                 C   sP   g }| D ]!\}}|j  d|j }|dr|dd  }||vr%|| q|S )NrS  zpytest-   )project_namerY  r  rd  )rf  rC   r  distrw  r?   r?   r@   re    s   

re  secondsc                 C   s6   | dk r
| ddS t jt| d}| dd| dS )zQFormat the given seconds in a human readable manner to show in the final summary.<   z.2fr   )r  zs (r%  )datetime	timedeltarz   )r  dtr?   r?   r@   r    s   r  c                 C   s   t | dr| j}|dr|tdd }|S | jsJ t| jts$J | j\}}}|dr9|tdd }|S |dkr?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,   r   r  r(  )r   r0  r;  r?   r?   r@   r+    s   



r+  )^rN   rR   collectionsr   dataclassesr  	functoolsr   rs  pathlibr   rV  r   r   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r0   rZ  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)   rL  r  r{   Actionr2   rV   r~   r   rO   r   r   	dataclassr   r   r  rz   r,  rQ   r  r  r  r  r  re  floatr  r+  r?   r?   r?   r@   <module>   s   %        v



 	