o
    h                     @   s  d Z ddlZddlZddlZddlZddlZddlZddl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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-m.Z. ddl/m0Z0 ddl1m2Z2 ddl1m3Z3 dd l1m4Z4 dd!l1m5Z5 dd"l6m7Z7 dd#l8m9Z9 dd$l8m:Z: dd%l;m<Z< dd&l;m=Z= dd'l>m?Z? dd(l>m@Z@ dd)l>mAZA er#dd*lBmCZC dd+lDmEZE d,ZFd-ZGd.ZHG d/d0 d0ejIZJG d1d2 d2eZKd3e7d4dfd5d6ZLd7e3d4dfd8d9ZMd7e3d4eNfd:d;ZOe5d<d=d>e?d4eeNeNeNf fd?d@ZPejQG dAdB dBZRe0G dCdD dDZSdEe*d7e3dFe?fdGdHZTdIeNdJeNdKeUd4eeN fdLdMZVd7e3dFe?dEe*dNeeNeWf d4eNf
dOdPZXdQedRee@ d4eeeUeNeeU eNf  fdSdTZYdUdUdVdWdXZZdVZ[dYeUdZeNd4eeUeNf fd[d\Z\d4eeN fd]d^Z]d_e^d4eNfd`daZ_d>eAd4eNfdbdcZ`dS )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   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   )r5   r6   nargsr7   r8   r9   )super__init__)selfr5   r6   r7   r8   r9   	__class__ F/var/www/html/ai/venv/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)getattrr6   setattrrH   )r>   rC   rD   rE   rF   	new_countrA   rA   rB   __call__g   s   zMoreQuietAction.__call__)NFNN)__name__
__module____qualname____doc__r   strobjectboolr   r=   argparseArgumentParser	Namespacer   rL   __classcell__rA   rA   r?   rB   r4   O   s<    
r4   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)
rN   rO   rP   rQ   rR   __annotations__r   r   r   rT   rA   rA   rA   rB   rY   t   s
   
 $rY   rC   r:   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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 d S )LNzterminal reporting	Reportinggeneral)afterz-vz	--verbosecountr   verbosezIncrease verbosity)actionr7   r6   r9   z--no-header
store_trueF	no_headerzDisable headerz--no-summary
no_summaryzDisable summaryz-qz--quietzDecrease verbosityz--verbosityzSet verbosity. Default: 0.)r6   typer7   r9   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').)rc   r6   r7   metavarr9   z--disable-warningsz--disable-pytest-warningsdisable_warningszDisable warnings summary)r7   r6   rc   r9   z-lz--showlocals
showlocalsz/Show locals in tracebacks (disabled by default))rc   r6   r7   r9   z--no-showlocalsstore_falsezFHide locals in tracebacks (negate --showlocals passed through addopts))rc   r6   r9   z--tbstyletbstyleauto)rq   longshortnolinenativez5Traceback print mode (auto/long/short/line/native/no))rk   rc   r6   r7   choicesr9   z--show-captureshowcapture)rt   stdoutstderrlogallr|   zOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)rc   r6   rw   r7   r9   z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))rc   r7   r9   z--colorcolor)yesrt   rq   z#Color terminal output (yes/no/auto)z--code-highlightr~   rt   zSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r7   rw   r9   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)r9   r7   )getgroup
_addoptionr4   int_REPORTCHARS_DEFAULTaddini)rC   grouprA   rA   rB   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maprR   
write_line)tagsargsmsgreporterrA   rB   mywriter	  s   z"pytest_configure.<locals>.mywriterzpytest:config)TerminalReportersysry   pluginmanagerregisteroptiondebugtraceconfigtracerootsetprocessor)r   r   rA   r   rB   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 asxXEfAPpsxXEfNw)r   ri   lowerrl   replace)r   ri   old_aliases
reportoptscharrA   rA   rB   getreportopt  s*   r   T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+   r2   E)r,   r-   outcomewhenupper)r   r[   r   rA   rA   rB   pytest_report_teststatus)  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   r:   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relpathrA   rA   rB   get_locationK  s   
zWarningReport.get_location)rN   rO   rP   rQ   rR   r]   r   r   r   r   r   r   r   r   r   rA   rA   rA   rB   r   9  s   
 
r   c                   @   st  e Zd Zddedee ddfddZdd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.dXe/ddfdYdZZ0edefd[d\Z1deddfd]d^Z2defd_d`Z3ddadbZ4ede	fdcddZ5ddedfZ6dXe7ddfdgdhZ8ddieddfdjdkZ9e: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Z@e:dld{dndod|ee	eAf fd}d~ZBe:dld{deCd fddZDdeEeF ddfddZGdddZHdddZIdededee	 dedef
ddZJdd ZKdd ZLdefddZMdddZNdddZOdede=e/ fddZPdeddfddZQde/ddfddZRdddZSdddZTdeUddfddZVdddZWdddZXde-ee=e f fddZYdedefddZZdddZ[de-e=e-ee\eef f  ef fddZ]dede=e" fddZ^de-e=e-ee\eef f  ef fddZ_de-e=e-ee\eef f  ef fddZ`dS )r   Nr   filer:   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   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   _pytestrA   rA   rB   r=   X  s,   






zTerminalReporter.__init__#Literal['progress', 'count', False]c                 C   sh   | j dddkr| j ddkrdS | j ddrdS | j d}|dks*|dkr,dS |dkr2dS dS )	zRReturn whether we should display progress information based on the current config.capturert   r   zprogress-even-when-capture-noF	setupshowr   ra   )r   	getoptiongetini)r>   cfgrA   rA   rB   r   r  s   
z.TerminalReporter._determine_show_progress_infoc                 C   s   | j jj}|S rM   )r   r   rb   )r>   	verbosityrA   rA   rB   r     s   
zTerminalReporter.verbosityc                 C   s
   | j dkS r   r   r>   rA   rA   rB   
showheader     
zTerminalReporter.showheaderc                 C      t | jjjS rM   )rT   r   r   re   r   rA   rA   rB   re        zTerminalReporter.no_headerc                 C   r   rM   )rT   r   r   rf   r   rA   rA   rB   rf     r   zTerminalReporter.no_summaryc                 C   s   | j d u r
| jdkS | j S r   )r   r   r   rA   rA   rB   
showfspath  s   

zTerminalReporter.showfspathvaluec                 C   s
   || _ d S rM   )r   )r>   r   rA   rA   rB   r     r   c                 C   s
   | j dkS r   r   r   rA   rA   rB   showlongtestinfo  r   z!TerminalReporter.showlongtestinfor   c                 C   s   ddd ||}|| jv S )Nxr   )r/   r-   )getri   )r>   r   rA   rA   rB   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   ru   write)r>   r   resr   fspath	relfspathrA   rA   rB   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   ru   r   )r>   r   r   kwargsrA   rA   rB   write_ensure_prefix  s   


z$TerminalReporter.write_ensure_prefixc                 C   s   | j r| j  d | _ d S d S rM   )r   r   ru   r   rA   rA   rB   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  wrappedrA   rA   rB   
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   rA   rA   rB   r     s   zTerminalReporter.writec                 C   s   | j   d S rM   )r   r   r   rA   rA   rB   r     s   zTerminalReporter.flushru   c                 K   s6   t |tst|dd}|   | jj|fi | d S )Nr   )errors)
isinstancerR   r  r   ru   )r>   ru   r   rA   rA   rB   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.
        eraseFrG   r   r   N)popr   r   lenrR   r   )r>   ru   r   r  
fill_countfillrA   rA   rB   rewrite  s   	
 zTerminalReporter.rewriteseptitler   c                 K   s$   |    | jj|||fi | d S rM   )r  r   r  )r>   r  r  r   r   rA   rA   rB   	write_sep  s   zTerminalReporter.write_sep=kwc                 K   s   | j j||fi | d S rM   )r   r  )r>   r  r  r  rA   rA   rB   section  s   zTerminalReporter.sectionr   c                 K   s   | j j|fi | d S rM   )r   ru   )r>   r   r  rA   rA   rB   ru        zTerminalReporter.linerZ   itemsc                 C   s2   || j v}| j |g | |r|   d S d S rM   )r   
setdefaultextend_set_main_color)r>   rZ   r!  set_main_colorrA   rA   rB   
_add_stats  s
   
zTerminalReporter._add_statsexcreprc                 C   s&   t |dD ]	}| d|  qdS )Nr  zINTERNALERROR> T)rR   r   r   )r>   r'  ru   rA   rA   rB   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   r1   )_pytest.warningsr*  r   linenor   r&  )r>   r)  r   r*  r   r   warning_reportrA   rA   rB   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   rA   rA   rB   pytest_plugin_registered!  s   

z)TerminalReporter.pytest_plugin_registeredc                 C   s   |  d| d S )Nr.   )r&  )r>   r!  rA   rA   rB   pytest_deselected)  s   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   r2  ru   rA   rA   rB   pytest_runtest_logstart,  s   z(TerminalReporter.pytest_runtest_logstartr   c                 C   s0  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dkry| jj|fi | n| j|j | j|jg|jR  }
|s| j|
|fi | |jst|drt|}| jj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%]rG   z ({})z ()z[%s]r   )cyanr   ))
_tests_ranrY   r   hookr   rZ   r[   r\   r  tupler&  hasattrr,   r+   r-   r   r   r   r   addr   r3  r2  r  _get_raw_skip_reasonr   rb   r   r  r  _format_trimmedr  r   r   r  r5  gatewayid!_get_progress_information_messager   r   )r>   r   repr   rZ   r[   r\   r   running_xdist	was_xfailru   reasonavailable_widthformatted_reasonrA   rA   rB   pytest_runtest_logreport9  sv   










z)TerminalReporter.pytest_runtest_logreportc                 C   s    | j d usJ t| j| j jkS rM   )r   r  r   testscollectedr   rA   rA   rB   _is_last_item}  s   zTerminalReporter._is_last_itemc           	      C   s   | j sJ | jdkr]| jr_| jdkr"| j j}td| d| d}ntd}| j| | jr5|   d S | 	 \}}| j
}|| d | jk}|ra|  }| jj|d fi |d	i d S d S d S d S )
Nr   ra    [/]r;  rG   r  T)r   r   r   rO  r  r   rB  rP  r   _get_main_color_width_of_current_liner   rG  r   r   )	r>   r   	num_testsprogress_length
main_color_r   	past_edger   rA   rA   rB   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 |rBd	t| jd
 | S dS )Nra   z{:zd}rQ  z/{}]z [ z / z ]z	 [{:3d}%]d   r;  )r   rO  r   r   r  rR   format)r>   	collectedr   counter_formatformat_stringrA   rA   rB   rG    s   

z2TerminalReporter._get_progress_information_messagec                 C   sN   |   \}}|  }| j}| jj| d }| j||fddi|di d S )NrG   r   T)rT  rG  rU  r   r   r   rjust)r>   r}   rY  r   r   r  rA   rA   rB   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   rA   rA   rB   rU    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   boldrG   )r   r   r   rb   r   r   timer   r   rA   rA   rB   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 )Nr2   r-   c                 S   s   g | ]	}t |tr|qS rA   )r  r"   .0r   rA   rA   rB   
<listcomp>      z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)r+   r&  r-   resultr   r  r   report_collect)r>   r   r!  rA   rA   rB   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   r2   r-   r.   z
collected zcollecting z itemrG   r   r   z / %d error%sz / %d deselectedz / %d skippedz / %d selectedT)rb  r  r  )r   r   rb   r   rc  r   REPORT_COLLECTING_RESOLUTIONr  r   r   r   rR   r   r  r   r   )r>   r   tr  r-   r.   selectedru   rA   rA   rB   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tj7 }| jdksc| jjjsct
| jjdd rl|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--rS  z, pytest-{}, pluggy-{}r   pastebinz -- )r   
start_path)r   r   rc  _sessionstarttimer   r  platformpython_versionre   r   rI   r   r   rR   r]  r   _versionversionpluggy__version__r   r   r   r   
executabler   r?  pytest_report_headerr   _write_report_lines_from_hooks)r>   ro  verinfor   rq  linesrA   rA   rB   pytest_sessionstart  s6   



z$TerminalReporter.pytest_sessionstartr  c                 C   s<   t |D ]}t|tr| | q|D ]}| | qqd S rM   )reversedr  rR   r   )r>   r  line_or_linesru   rA   rA   rB   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   inipathappendr%   args_sourcer   
ArgsSource	TESTPATHSr   r]  r   r   list_plugin_distinfo_plugin_nameversions)r>   r   ri  r  
plugininforA   rA   rB   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   ru  r!  collectonlyr   r+   !zcollection failures)rj  r   r?  pytest_report_collectionfinishr   r!  r  r   r   rb   r   ru   _printcollecteditemsr   r   r  
toterminal)r>   ro  r  r+   rH  rA   rA   rB   pytest_collection_finish!  s(   

z)TerminalReporter.pytest_collection_finishc              	   C   s^  | j jjdk r<| j jjdk r.tdd |D }t| D ]\}}| jd||f  qd S |D ]	}| j|j q0d S g }d}|D ]j}|	 dd  }|r_||d t
| krYn|  |sN|t
|d  D ]D}	||	 t
|d d }| j| |	  | j jjdkrt|	d	d }
|
rt|
nd }|r| D ]}| jd
|d | qqgqBd S )Nr   r  c                 s   s"    | ]}|j d dd V  qdS r   rG   r   N)r   r   )rf  itemrA   rA   rB   	<genexpr>:  s     z8TerminalReporter._printcollecteditems.<locals>.<genexpr>z%s: %dr   rG     objz{}{})r   r   rb   r   sortedr!  r   ru   r   	listchainr  r  r  rI   inspectgetdoc
splitlinesr]  )r>   r!  countsnamera   r  stackindentneeded_collectorscolr  docru   rA   rA   rB   r  7  s>   
z%TerminalReporter._printcollecteditems)hookwrapper
exitstatusc                 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r:| jdt|jdd |tjkrG|   d | _n|jrU| jdt|jdd |   d S )Nr   )r   r  r   r  T)r9  )
get_resultr   ru   r   OKTESTS_FAILEDINTERRUPTEDUSAGE_ERRORNO_TESTS_COLLECTEDrf   r   r?  pytest_terminal_summary
shouldfailr  rR   _report_keyboardinterruptr   
shouldstopsummary_stats)r>   ro  r  r   summary_exit_codesrA   rA   rB   pytest_sessionfinishT  s,   
z%TerminalReporter.pytest_sessionfinish)NNNc                 c   s<    |    |   |   |   d V  |   |   d S rM   )summary_errorssummary_failuressummary_warningssummary_passesshort_test_summaryr   rA   rA   rB   r  o  s   z(TerminalReporter.pytest_terminal_summaryexcinfoc                 C   s   |j dd| _d S )NT)funcargs)getreprr   )r>   r  rA   rA   rB   pytest_keyboard_interruptz  s   z*TerminalReporter.pytest_keyboard_interruptc                 C   s   | j d ur|   d S d S rM   )r   r  r   rA   rA   rB   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 )Nr  KeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)r8  )
r   	reprcrashr   r  r   r   	fulltracer  r   ru   )r>   r'  r   rA   rA   rB   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   r:   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   ru   rE   r  r>   rA   rB   mkrel  s   
z-TerminalReporter._locationline.<locals>.mkrelr:  r   r   \z <- z
[location]r   )	rR   r   r   r   r   SEPr%   r   r   )r>   r   r   r,  r  r  r   rA   r  rB   r3    s   
zTerminalReporter._locationlinec                 C   s   |j }|r|S dS )Nztest session)	head_line)r>   rH  r  rA   rA   rB   _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   )rR   longreprr  AttributeError)r>   rH  rA   rA   rB   _getcrashline  s   zTerminalReporter._getcrashliner  c                 C   s   dd | j |dD S )Nc                 S   s   g | ]	}t |d s|qS )	_pdbshown)rA  re  rA   rA   rB   rg    rh  z/TerminalReporter.getreports.<locals>.<listcomp>rA   r   r   )r>   r  rA   rA   rB   
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   r1   reportsr:   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 r  )rR   r   )rf  locrA   rA   rB   r    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{}rG   r   r   N)r]  )rf  kvrA   rA   rB   r    s
    
)	r   r   r  r  r   r   rR   r   r!  )r  	locationsr   r2  counts_by_filenamer   rA   rB   collapsed_location_report  s   

zDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportzwarnings summary (final)zwarnings summaryr  TF)r8  rb  r  c                 s   s    | ]}d | V  qdS )r  NrA   re  rA   rA   rB   r    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   r  r   r   rR   r  r!  r   ru   r  r   rstrip)r>   all_warningsr   warning_reportsreports_grouped_by_messagewrr  r  r   message_reportsmaybe_locationr  indentedrA   r   rB   r    s>   



z!TerminalReporter.summary_warningsc                 C   s   | j jjdkr<| dr>| d}|sd S | dd |D ]"}|jr5| |}| jd|ddd | | | 	|j
 qd S d S d S )	Nrt   Pr,   r  PASSESrY  T)r7  rb  )r   r   rp   r   r  r  sectionsr  _outrep_summary_handle_teardown_sectionsr   r>   r  rH  r   rA   rA   rB   r    s   



zTerminalReporter.summary_passesc                    s   |  d} fdd|D S )Nr   c                    s$   g | ]}|j d kr|j kr|qS )r   )r   r   )rf  r   r   rA   rB   rg    s
    z:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r  )r>   r   r  rA   r  rB   _get_teardown_reports  s   

z&TerminalReporter._get_teardown_reportsc                 C   s   |  |D ]}| | qd S rM   )r  print_teardown_sections)r>   r   r   rA   rA   rB   r  	  s   z*TerminalReporter._handle_teardown_sectionsrH  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 )Nrt   r|   r   rs  r  r  )r   r   rx   r  r   r  ru   r>   rH  rx   secnamer  rA   rA   rB   r    s   
z(TerminalReporter.print_teardown_sectionsc                 C   s   | j jjdkrL| d}|sd S | dd | j jjdkr.|D ]}| |}| | qd S |D ]}| |}| jd|ddd | | | 	|j
 q0d S d S )	Nrt   r+   r  FAILURESru   rY  Tr9  rb  )r   r   rp   r  r  r  r   r  r  r  r   )r>   r  rH  ru   r   rA   rA   rB   r    s"   




z!TerminalReporter.summary_failuresc                 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 )Nrt   r2   r  ERRORSr   zERROR collecting z	ERROR at z of rY  Tr  )	r   r   rp   r  r  r   r  r   r  r  rA   rA   rB   r  +  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 )Nrt   r|   rs  r  r  )r  r   r   r   rx   r  r  ru   r  rA   rA   rB   r  :  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 )Nr  r   r  Tz in r   z[0mr  r   r   )r   r   rc  rv  build_summary_stats_liner   r   r   r  r  r   format_session_durationr  r  r   )r>   session_durationpartsrX  
line_partsdisplay_sepr   textr   with_markupr   main_markupdurationduration_with_markupmarkup_for_end_seprA   rA   rB   r  G  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  statr:   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   r  )r  r   r+   r   rH  r}   ru   r   rA   rB   show_simplep  s   z8TerminalReporter.short_test_summary.<locals>.show_simplec                    s    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/   r1   Tr    - )r   r   _get_verbose_wordr   r   r   r  _get_node_id_with_markupr6  rR   r  )r  r/   rH  verbose_wordmarkup_wordr   ru   rK  r   rA   rB   show_xfailed|  s   
z9TerminalReporter.short_test_summary.<locals>.show_xfailedc                    st    j dg }|D ].}| j} jj|fi td di}t j j|}|j}| 	| d| d|  q	d S )Nr0   r1   Tr   )
r   r   r  r   r   r   r  r  r6  r  )r  r0   rH  r  r	  r   rK  r   rA   rB   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   r1   T	Skipped: z%s [%d] %s:%d: %sz%s [%d] %s: %s)r   r   _folded_skipsr   r  r   r   r   r  
startswithr  r  )
r  r-   fskipsr  r	  r   numr   r,  rK  r   rA   rB   show_skipped  s(   

z9TerminalReporter.short_test_summary.<locals>.show_skippedr+   )r   r,   r2   )r   Xfr   pr   r  zshort test summary infoT)r=  rb  )ri   r   rR   r   r   r  r   )
r>   r  r
  r  r  REPORTCHAR_ACTIONSr  r   rc   ru   rA   r   rB   r  l  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 rM   )r   r   rP  r$  r   rA   rA   rB   rT    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+   r2   r9  r1   r0   r8  r,   r7  )r   rP  )r>   r  r   rX  rA   rA   rB   _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 rM   )	r   keysKNOWN_TYPESr  listr   r  rT   r   )r>   unknown_types
found_typerA   rA   rB   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.
        r  )r   r   &_build_collect_only_summary_stats_line _build_normal_summary_stats_liner   rA   rA   rB   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)rI   re  rA   rA   rB   rg    s    z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>r  )r>   r  r  rA   rA   rB   _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)rT  r   r  r  r   r  r  	pluralize)	r>   rX  known_typesr  r  r  ra   r}   r   rA   rA   rB   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.   r2   r   zno tests collectedr8  Tr7  z%d %s collectedtestzno tests collected (z deselected)rR  z tests collected (r!  )r  r   r   r"  r  )r>   r.   r  r  rX  collected_outputall_tests_were_deselectedrn  rA   rA   rB   r    s*   


z7TerminalReporter._build_collect_only_summary_stats_linerM   )r:   r   r  )r:   N)NN)r  )F)ro  r*   r:   N)arN   rO   rP   r   r   r   r=   r   propertyr   r   rT   r   re   rf   r   setterr   rR   r   r   r  r  r  r   r   r   bytesr   r  r  r  ru   r   r   r&  r   r(  r1   WarningMessager.  r   r0  r"   r1  r   r4  r(   rN  rP  r[  rG  r   rU  rd  r'   rk  rj  r    r  r  r   r~  r  r  r   r  r
   r  r   BaseExceptionr  r  r  r3  r  r  r  r  r  r  r  r  r  r  r&   r  r  r  rT  r  r$  r	   r  r   r  r  rA   rA   rA   rB   r   V  s   

		
 




D


%









6



%R
*	
r   twrH  c                 C   sB   | |j}|d^}}|r| jd|dd}|d | S |S )Nr   Trp  )r  r   r   r   r   )r,  r   rH  r   pathr  parts_markuprA   rA   rB   r  ,  s   r  r]  r   rL  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  r  Nz...r   )findr   r]  r  )r]  r   rL  iellipsisformat_widthrA   rA   rB   rD  6  s   

rD  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   rD  )r   rH  r,  r3  r  r\   r5  ru   
line_widthr   rL  rA   rA   rB   r  O  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   skip
pytestmark)r  r  r@  r  r%   r   rI   r   r"  r  r!  )r   r-   deventr   r,  rK  r5  r  rE   eventsrA   rA   rB   r  k  s$   

r  r9  r8  r7  )r+   r2   r1   r,   ra   nounc                 C   s6   |dvr| |fS | dd}| | dkr|d fS |fS )N)r2   r1   r$  r1   warningrG   r   )r   )ra   r;  rA   rA   rB   r"    s   r"  c                 C   sJ   g }| D ]\}}dj |d}|dr|dd  }||vr"|| q|S )Nz"{dist.project_name}-{dist.version})distzpytest-   )r]  r  r  )r  rE   r/  r=  r  rA   rA   rB   r    s   

r  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	timedeltar   )r?  dtrA   rA   rB   r    s   r  c                 C   s   t | drtt| j}|dr|tdd }|S | jsJ t| jt	s'J | j\}}}|dr<|tdd }|S |dkrBd}|S )zqGet the reason string of a skip/xfail/xpass test report.

    The string is just the part given by the user.
    r6  zreason: Nr  Skippedr   )
rA  r   rR   r6  r  r  r-   r  r  r@  )r   rK  rY  rA   rA   rB   rC    s   



rC  )arQ   rU   dataclassesrA  r  rw  r   r  r1   collectionsr   	functoolsr   pathlibr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r{  _pytest._versionr   r   r   _pytest._coder   _pytest._code.coder   _pytest._ior   _pytest._io.wcwidthr   _pytest.assertion.utilr   _pytest.compatr   r   r   r   r   r    _pytest.config.argparsingr!   _pytest.nodesr"   r#   _pytest.pathlibr$   r%   _pytest.reportsr&   r'   r(   typing_extensionsr)   _pytest.mainr*   rl  r  r   Actionr4   rY   r   r   rR   r   r   	dataclassr   r   r  r   rD  rT   r  r  r  r  r"  r  floatr  rC  rA   rA   rA   rB   <module>   s    %|       \



 	