o
    rh1                     @  s  d Z ddlmZ ddlZddlmZ ddlZddlZddlm	Z	 ddl
Z
ddlmZ ddlZddlZddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)Zddl*m+Z+ ddl,m-Z- ddl,m.Z. ddl,m/Z/ ddl,m0Z0 ddl1m2Z2 ddl3m4Z4 ddl3m5Z5 dd l6m7Z7 dd!l6m8Z8 dd"l9m:Z: dd#l9m;Z; dd$l9m<Z< erdd%l=m>Z> d&Z?d'Z@d(ZAG d)d* d*ejBZCG d+d, d,eZDdod1d2ZEdpd5d6ZFdqd8d9ZGe0d:d;drd?d@ZHejIG dAdB dBZJeG dCdD dDZKdsdHdIZLdtdOdPZMdudSdTZNdvdZd[ZOd\d\d]d^d_ZPd]ZQdwdcddZRdxdfdgZSdydjdkZTdzdmdnZUdS ){zsTerminal reporting of the full testing process.

This is a good source for looking at the various reporting hooks.
    )annotationsN)Counter)partial)Path)Any)Callable)ClassVar)final)	Generator)Literal)Mapping)
NamedTuple)Sequence)TextIO)TYPE_CHECKING)nodes)timing)ExceptionInfo)ExceptionRepr)TerminalWriter)wcswidth)running_on_ci)_PluggyPlugin)Config)ExitCode)hookimpl)Parser)Item)Node)absolutepath)bestrelpath)
BaseReport)CollectReport)
TestReport)Sessiong      ?)failedpassedskipped
deselectedxfailedxpassedwarningserrorfEc                      s8   e Zd ZdZ			dd fddZ	ddddZ  ZS )MoreQuietActionzA modified copy of the argparse count action which counts down and updates
    the legacy quiet attribute at the same time.

    Used to unify verbosity handling.
    NFoption_stringsSequence[str]deststrdefaultobjectrequiredboolhelp
str | NonereturnNonec                   s   t  j||d|||d d S )Nr   )r/   r1   nargsr3   r5   r7   )super__init__)selfr/   r1   r3   r5   r7   	__class__ N/var/www/html/alpaca_bot/venv/lib/python3.10/site-packages/_pytest/terminal.pyr=   S   s   
zMoreQuietAction.__init__parserargparse.ArgumentParser	namespaceargparse.Namespacevaluesstr | Sequence[object] | Noneoption_stringc                 C  s6   t || jdd }t|| j| t |ddd |_d S )Nr      quiet)getattrr1   setattrrK   )r>   rC   rE   rG   rI   	new_countrA   rA   rB   __call__d   s   zMoreQuietAction.__call__)NFN)r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   N)
rC   rD   rE   rF   rG   rH   rI   r8   r9   r:   )__name__
__module____qualname____doc__r=   rO   __classcell__rA   rA   r?   rB   r.   L   s    
r.   c                   @  s*   e Zd ZU dZded< ded< ded< dS )TestShortLogReportuG  Used to store the test status result category, shortletter and verbose word.
    For example ``"rerun", "R", ("RERUN", {"yellow": True})``.

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

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

    :ivar word:
        Verbose word is shown as testing progresses in verbose mode, for example ``"PASSED"``, ``"SKIPPED"``,
        ``"ERROR"``, or the empty string.
    r2   categoryletterz$str | tuple[str, Mapping[str, bool]]wordN)rQ   rR   rS   rT   __annotations__rA   rA   rA   rB   rV   q   s
   
 rV   rC   r   r9   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dddd |jddtdd	dd |jdd	tddd |jd d!d"td#d$d% |jd&d'dd(dd)d* |jd+d,dd-dd.d |jd/dd-d0d1 |jd2d3d!d4d5g d6d7d8 |jd9dd:dd;d |jd<d!d=g d>d?d@dA |jdBdCdddDdE |jdFdGd!dGd5g dHdId8 |jdJdKdKdLgdMdN | jdOdPdQdR tj| tjdSdT d S )UNzterminal reporting	Reportinggeneral)afterz-vz	--verbosecountr   verbosezIncrease verbosity)actionr3   r1   r7   z--no-header
store_trueF	no_headerzDisable headerz--no-summary
no_summaryzDisable summaryz--no-fold-skippedstore_falsefold_skippedTz+Do not fold skipped tests in short summary.)r`   r1   r3   r7   z-qz--quietzDecrease verbosityz--verbosityzSet verbosity. Default: 0.)r1   typer3   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`   r1   r3   metavarr7   z--disable-warningsz--disable-pytest-warningsdisable_warningszDisable warnings summary)r3   r1   r`   r7   z-lz--showlocals
showlocalsz/Show locals in tracebacks (disabled by default)z--no-showlocalszFHide locals in tracebacks (negate --showlocals passed through addopts))r`   r1   r7   z--tbstyletbstyleauto)ro   longshortnolinenativez5Traceback print mode (auto/long/short/line/native/no))rj   r`   r1   r3   choicesr7   z
--xfail-tbxfail_tbz1Show tracebacks for xfail (as long as --tb != no)z--show-captureshowcapture)rr   stdoutstderrlogallr{   zOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)r`   r1   ru   r3   r7   z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))r`   r3   r7   z--colorcolor)yesrr   ro   z#Color terminal output (yes/no/auto)z--code-highlightr}   rr   zSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r3   ru   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   r3   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   )	getgroup
_addoptionr.   int_REPORTCHARS_DEFAULTaddinir   _add_verbosity_iniVERBOSITY_TEST_CASES)rC   grouprA   rA   rB   pytest_addoption   s  			
r   configr   c                   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mapr2   
write_line)tagsargsmsgreporterrA   rB   mywriter  s   z"pytest_configure.<locals>.mywriterzpytest:config)TerminalReportersysrx   pluginmanagerregisteroptiondebugtraceconfigtracerootsetprocessor)r   r   rA   r   rB   pytest_configure  s   r   r2   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   rh   lowerrk   replace)r   rh   old_aliases
reportoptscharrA   rA   rB   getreportopt#  s*   r   Ttrylastreportr!   tuple[str, str, str]c                 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%   r,   E)r&   r'   outcomewhenupper)r   rX   r   rA   rA   rB   pytest_report_teststatus<  s   r   c                   @  sH   e Zd ZU dZded< dZded< dZded< d	Zd
ed< ddd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``).
    r2   messageNr8   nodeidztuple[str, int] | None
fslocationTr   count_towards_summaryr   r   r9   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_location^  s   
zWarningReport.get_location)r   r   r9   r8   )	rQ   rR   rS   rT   rZ   r   r   r   r   rA   rA   rA   rB   r   L  s   
 
r   c                   @  s  e Zd Zdddd	ZdddZedddZedddZedddZedddZ	edddZ
e
jdddZ
edddZdd d!Zdd%d&Zddd*d+Zdd,d-Zd.d/d0d1dd6d7Zd.d8dd9d:Zdd;d<Zdd?d@ZddAdBZ		dddHdIZdddLdMZddOdPZddTdUZddXdYZdd\d]Zdd`daZddcddZddgdhZd dkdlZeddmdnZ e!dodpddrdsZ"ddtduZ#ddvdwZ$ddxdyZ%eddzd{Z&dd|d}Z'dddZ(ddddZ)e!doddddZ*dddZ+dddZ,dddZ-dddZ.e!dodpd	ddZ/e!dodpd
ddZ0dddZ1dddZ2dddZ3dddZ4dd Z5dd Z6dddZ7dddZ8dddZ9dddZ:dddZ;dddZ<dddZ=dddZ>dddÄZ?dddńZ@ddƜdddɄZAddd˄ZBddd΄ZCdddЄZDddd҄ZEdddՄZFddd؄ZGdddڄZHddd݄ZIdddZJdddZKdddZLdS (  r   Nr   r   fileTextIO | Noner9   r:   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| _| jj| _| | _t | _|  | _d | _d | _d | _d S Nr   ) _pytest.configr   _numcollected_session_showfspathstats_main_color_known_typesr   r   	startpathr   rx   create_terminal_writer_tw	fullwidth_screen_widthcurrentfspathr   rh   r   re   foldskipped	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=   k  s.   







zTerminalReporter.__init__#Literal['progress', 'count', False]c                 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.capturerr   r~   progress-even-when-capture-noF	setupshow>   r   r   r   r^   )r   	getoptiongetini)r>   cfgrA   rA   rB   r     s   
z.TerminalReporter._determine_show_progress_infor   c                 C  s   | j jj}|S rP   )r   r   r_   )r>   	verbosityrA   rA   rB   r     s   
zTerminalReporter.verbosityr6   c                 C  s
   | j dkS r   )r   r>   rA   rA   rB   
showheader     
zTerminalReporter.showheaderc                 C     t | jjjS rP   )r6   r   r   rb   r   rA   rA   rB   rb        zTerminalReporter.no_headerc                 C  r   rP   )r6   r   r   rc   r   rA   rA   rB   rc     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   rA   rA   rB   
showfspath  s   
zTerminalReporter.showfspathvaluebool | Nonec                 C  s
   || _ d S rP   )r   )r>   r   rA   rA   rB   r     r   c                 C  s   | j tjdkS r   )r   r   r   r   r   rA   rA   rB   showlongtestinfo  s   z!TerminalReporter.showlongtestinfor   r2   c                 C  s   ddd ||}|| jv S )Nxr   )r)   r'   )getrh   )r>   r   rA   rA   rB   hasopt  s   
zTerminalReporter.hasoptr   res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   rs   write)r>   r   r   r   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   rs   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 rP   )r   r   rs   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 rP   )r   r   r   rA   rA   rB   r     s   zTerminalReporter.flushrs   str | bytesc                 K  s6   t |tst|dd}|   | jj|fi | d S )Nr   )errors)
isinstancer2   r	  r   rs   )r>   rs   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.
        eraseFrJ   r   r   N)popr   r   lenr2   r   )r>   rs   r   r  
fill_countfillrA   rA   rB   rewrite  s   	
 zTerminalReporter.rewriteseptitler8   r   
int | Nonec                 K  s$   |    | jj|||fi | d S rP   )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 rP   )r   r!  )r>   r"  r!  r&  rA   rA   rB   section  s   zTerminalReporter.sectionr   c                 K  s   | j j|fi | d S rP   )r   rs   )r>   r   r&  rA   rA   rB   rs        zTerminalReporter.linerW   itemsSequence[Any]c                 C  s2   || j v}| j |g | |r|   d S d S rP   )r   
setdefaultextend_set_main_color)r>   rW   r)  set_main_colorrA   rA   rB   
_add_stats  s
   
zTerminalReporter._add_statsexcreprr   c                 C  s&   t |dD ]	}| d|  qdS )Nr  zINTERNALERROR> T)r2   r   r   )r>   r0  rs   rA   rA   rB   pytest_internalerror!  s   z%TerminalReporter.pytest_internalerrorwarning_messagewarnings.WarningMessagec                 C  s@   ddl m} |j|jf}||}t|||d}| d|g d S )Nr   )warning_record_to_str)r   r   r   r+   )_pytest.warningsr4  r   linenor   r/  )r>   r2  r   r4  r   r   warning_reportrA   rA   rB   pytest_warning_recorded&  s   z(TerminalReporter.pytest_warning_recordedpluginr   c                 C  s&   | j jjrd| }| | d S d S )NzPLUGIN registered: )r   r   r   r   )r>   r9  r   rA   rA   rB   pytest_plugin_registered5  s   

z)TerminalReporter.pytest_plugin_registeredSequence[Item]c                 C  s   |  d| d S )Nr(   )r/  )r>   r)  rA   rA   rB   pytest_deselected=  s   z"TerminalReporter.pytest_deselectedlocationtuple[str, int | None, str]c                 C  sZ   |\}}}| j r| ||||}| |d |   d S | jr+| |d |   d S d S )Nr   )r   _locationliner  r   r   r  )r>   r   r=  r  r6  domainrs   rA   rA   rB   pytest_runtest_logstart@  s   
z(TerminalReporter.pytest_runtest_logstartr   r#   c                 C  sV  d| _ |}t| jjj|| jd }|j|j|j}}}t|t	s$d }n|\}}| 
||g |s5|s5d S |d u rdt|d}|jrH|sHddi}n|jrR|rRddi}n|jrZddi}n
|jrbddi}ni }| j|j | jtjdkr| jj|fi | | jr| js|   n| j|jg|jR  }	t|d}
|
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' d | jr
| jj| ( d dd n| jd | jj|fi | | jd|	  d| _)| *  d S )NT)r   r   wasxfailgreenyellowredr   node    [100%]rJ   z ({})z ()[]r   )cyanr  )+
_tests_ranrV   r   hookr   rW   rX   rY   r  tupler/  hasattrr&   r%   r'   r   addr   r   r   r   r   r   r   _is_last_item(_write_progress_information_if_past_edger?  r=  r  _get_raw_skip_reasonr   r  r  _format_trimmedr  r   r	  rF  gatewayid!_get_progress_information_messager   r   )r>   r   repr   rW   rX   rY   r   	was_xfailrs   running_xdistreasonavailable_widthformatted_reasonrA   rA   rB   pytest_runtest_logreportN  s|   









z)TerminalReporter.pytest_runtest_logreportc                 C  s    | j d usJ t| j| j jkS rP   )r   r  r   testscollectedr   rA   rA   rB   rR    s   zTerminalReporter._is_last_itemT)wrapperGenerator[None, object, object]c                 c  s2    d V }| j tjdkr| jr| jr|   |S r   )r   r   r   r   r   r   r   )r>   resultrA   rA   rB   pytest_runtestloop  s   z#TerminalReporter.pytest_runtestloopc                 C  s   | j sJ | j j}| jdkr4|r+t| j}dtt| d}d| d}|||S d| d| dS |rDdt| jd	 | d
dS dS )Nr^   z{:zd} [z/{}]z [ z / z ]d   3dz%]rH  )r   r`  r   r  r   r2   format)r>   	collectedr   counter_formatformat_stringrA   rA   rB   rX    s   


z2TerminalReporter._get_progress_information_messagec                 C  s   | j }| jdkr| jsJ | jj}td| d| d}ntd}|| d | jk}|rF|  \}}|  }| jj	|d fi |di d S d S )	Nr^   re  /rK  rH  rJ   r  T)
_width_of_current_liner   r   r`  r  r   _get_main_colorrX  r   r   )r>   r   	num_testsprogress_length	past_edge
main_color_r   rA   rA   rB   rS    s   

 z9TerminalReporter._write_progress_information_if_past_edgec                 C  sN   |   \}}|  }| j}| jj| d }| j||fddi|di d S )NrJ   r   T)rn  rX  rm  r   r   r   rjust)r>   r|   rs  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   rm    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   boldrJ   )r   r   r   r_   r   r   timer   r   rA   rA   rB   pytest_collection  s   z"TerminalReporter.pytest_collectionr"   c                 C  sb   |j r| d|g n
|jr| d|g dd |jD }|  jt|7  _| jr/|   d S d S )Nr,   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'   rc  r   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   r,   r'   r(   z
collected zcollecting z itemrJ   r   r   z / %d error%sz / %d deselectedz / %d skippedz / %d selectedT)ru  r  r  )r   r   r_   r   rv  r   REPORT_COLLECTING_RESOLUTIONr  r   r   r   r2   r   r   r   r   )r>   r	   tr  r'   r(   selectedrs   rA   rA   rB   r|    s<   


zTerminalReporter.report_collectr   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ru  z	platform z -- Python pypy_version_infor      z[pypy--rK  z	, pytest-z	, pluggy-r   pastebinz -- )r   
start_path)r   r   rv  _sessionstarttimer   r$  platformpython_versionrb   r   rL   r   r   r2   r   _versionversionpluggy__version__r   r   r   r   
executabler   rN  pytest_report_headerr   _write_report_lines_from_hooks)r>   r  verinfor   r  linesrA   rA   rB   pytest_sessionstart  s2   


z$TerminalReporter.pytest_sessionstartr  Sequence[str | Sequence[str]]c                 C  s<   t |D ]}t|tr| | q|D ]}| | qqd S rP   )reversedr  r2   r   )r>   r  line_or_linesrs   rA   rA   rB   r  *  s   
z/TerminalReporter._write_report_lines_from_hooks	list[str]c                 C  s   d|j  g}|jr|dt|j |j  |jtjjkr-|d}|d	d
| |j }|rA|d	d
t| |S )Nz	rootdir: zconfigfile: 	testpathsztestpaths: {}, zplugins: {})r   inipathappendr    args_sourcer   
ArgsSource	TESTPATHSr   rh  r   r   list_plugin_distinfo_plugin_nameversions)r>   r   rc  r  
plugininforA   rA   rB   r  4  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   r  r)  collectonlyr   r%   !zcollection failures)r|  r   rN  pytest_report_collectionfinishr   r)  r  r   r   r_   r   rs   _printcollecteditemsr   r   r!  
toterminal)r>   r  r  r%   rY  rA   rA   rB   pytest_collection_finishE  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   r  c                 s  s"    | ]}|j d dd V  qdS r   rJ   r   N)r   r   )ry  itemrA   rA   rB   	<genexpr>_  s     z8TerminalReporter._printcollecteditems.<locals>.<genexpr>z%s: %dr   rJ     objz{}{})r   r   r   r   r   sortedr)  r   rs   r   	listchainr  r  r  rL   inspectgetdoc
splitlinesrh  )r>   r)  test_cases_verbositycountsnamer^   r  stackindentneeded_collectorscolr  docrs   rA   rA   rB   r  [  s@   
z%TerminalReporter._printcollecteditems
exitstatusint | ExitCodeGenerator[None]c                 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   r  T)rE  )r   rs   r   OKTESTS_FAILEDINTERRUPTEDUSAGE_ERRORNO_TESTS_COLLECTEDrc   r   rN  pytest_terminal_summary
shouldfailr$  r2   _report_keyboardinterruptr   
shouldstopsummary_stats)r>   r  r  rc  summary_exit_codesrA   rA   rB   pytest_sessionfinishy  s,   
z%TerminalReporter.pytest_sessionfinishc                 c  s^    |    |   |   |   |   |   zd V W |   |   S |   |   w rP   )summary_errorssummary_failuressummary_xfailuressummary_warningssummary_passessummary_xpassesshort_test_summaryr   rA   rA   rB   r    s   

z(TerminalReporter.pytest_terminal_summaryexcinfoExceptionInfo[BaseException]c                 C  s   |j dd| _d S )NT)funcargs)getreprr   )r>   r  rA   rA   rB   pytest_keyboard_interrupt     z*TerminalReporter.pytest_keyboard_interruptc                 C  s   | j d ur|   d S d S rP   )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)rD  )
r   	reprcrashr   r$  r   r   	fulltracer  r   rs   )r>   r0  r   rA   rA   rB   r    s   

z*TerminalReporter._report_keyboardinterruptr  r6  r@  c                   sn   d fdd}|r1||}j dkr-|dd |d	tjkr-|d
tjt| 7 }|d S d}|d S )Nr   r2   r9   c                   s\   j | } r,| r,|d t   } d}|d dd|d< |d|7 }|S )NrJ  r   r   r   )r   cwd_relative_nodeidendswithr  r   r   r   )r   rs   rG   r@  r>   rA   rB   mkrel  s   
z-TerminalReporter._locationline.<locals>.mkrelrG  r   r   \z <- z
[location]r   )r   r2   r9   r2   )r   r   r   r   SEPr    r   r   )r>   r   r  r6  r@  r  r   rA   r  rB   r?    s   
zTerminalReporter._locationlinec                 C  s   |j }|r|S dS )Nztest session)	head_line)r>   rY  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   )r2   longreprr  AttributeError)r>   rY  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)rP  rx  rA   rA   rB   rz    r{  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 fdd}|rEd	nd
} jd|ddd |	 D ]2\}}	||	}
|
rw j
|
 | }ddd |D }| }n| } j
|  j
  qT j
d d S d S )Nr   r+   reportslist[WarningReport]r9   r2   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  )r2   r   )ry  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{}rJ   r   r   N)rh  )ry  kvrA   rA   rB   r    s
    
)	r   r   r  r  r   r   r2   r   r)  )r  	locationsr   r=  counts_by_filenamer   rA   rB   collapsed_location_report  s   

zDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportzwarnings summary (final)zwarnings summaryr%  TF)rD  ru  r  c                 s  s    | ]}d | V  qdS )r  NrA   rx  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  r9   r2   )r   r   r   r   r  r+  r   r  r$  r)  r   rs   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     |  ddd d S )Nr&   PASSESPsummary_passes_combinedr   rA   rA   rB   r    r  zTerminalReporter.summary_passesc                 C  r  )Nr*   XPASSESXr  r   rA   rA   rB   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 )Nrr   r%  rs  T)rC  ru  )r   r   rn   r   r  r$  sectionsr  _outrep_summary_handle_teardown_sectionsr   )r>   r  r  r  r  rY  r   rA   rA   rB   r   "  s   



z(TerminalReporter.summary_passes_combinedlist[TestReport]c                   s   |  d} fdd|D S )Nr   c                   s$   g | ]}|j d kr|j kr|qS )r   )r   r   )ry  r   r   rA   rB   rz  4  s
    z:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r  )r>   r   r  rA   r
  rB   _get_teardown_reports2  s   

z&TerminalReporter._get_teardown_reportsc                 C  s   |  |D ]}| | qd S rP   )r  print_teardown_sections)r>   r   r   rA   rA   rB   r  :  s   z*TerminalReporter._handle_teardown_sectionsrY  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 )Nrr   r{   r   r  r  r  )r   r   rw   r  r   r!  rs   r>   rY  rw   secnamer  rA   rA   rB   r  >  s   
z(TerminalReporter.print_teardown_sectionsc                 C  s   | j jj}| jdd|d d S )Nr%   FAILURESrm   )r   r   rn   summary_failures_combined)r>   rm   rA   rA   rB   r  K  s   
z!TerminalReporter.summary_failuresc                 C  s0   | j jj}|r| j jjnd}| jdd|d d S )Nrr   r)   	XFAILURESr  )r   r   rv   rn   r  )r>   show_tbrm   rA   rA   rB   r  O  s   
z"TerminalReporter.summary_xfailures)r  rm   c          	      C  s   |dkrM|r|  |rO| |}|sd S | d| |dkr/|D ]}| |}| | q d S |D ]}| |}| jd|ddd | | | |j q1d S d S d S )Nrr   r%  rs   rs  TrE  ru  )	r   r  r$  r  r   r  r  r  r   )	r>   r  r  rm   r  r  rY  rs   r   rA   rA   rB   r  T  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 )Nrr   r,   r%  ERRORSr   zERROR collecting z	ERROR at z of rs  Tr  )	r   r   rn   r  r$  r   r  r   r  )r>   r  rY  r   rA   rA   rB   r  m  s   



zTerminalReporter.summary_errorsr!   c                 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 )Nrr   r{   r  r  r  )r  r   r   r   rw   r  r!  rs   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   rv  r  build_summary_stats_liner   r   r   r  r  r   format_session_durationr  r$  r   )r>   session_durationpartsrr  
line_partsdisplay_sepr   textr   with_markupr   main_markupdurationduration_with_markupmarkup_for_end_seprA   rA   rB   r    s:   



zTerminalReporter.summary_statsc           
   	     s    j sd S d fdd}d fd	d
}d fdd}d fddd fddd fdd}||t|dd|t|ddt|ddd}g } j D ]}||}|rX|| qK|rn jddddd |D ]	}	 |	 qfd S d S )Nr  r  statr2   r9   r:   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   rY  r|   rs   r   rA   rB   show_simple  s   z8TerminalReporter.short_test_summary.<locals>.show_simplec           	            j dg }|D ]:}| jtd di\}} jj|fi |}t j j|}| d| }|j}|r>|dt	| 7 }| 
| q	d S )Nr)   r+   Tr    - r   r   _get_verbose_word_with_markupr   r%  r   r   _get_node_id_with_markuprB  r2   r  )	r  r)   rY  verbose_wordverbose_markupmarkup_wordr   rs   r\  r   rA   rB   show_xfailed  s   z9TerminalReporter.short_test_summary.<locals>.show_xfailedc           	        r)  )Nr*   r+   Tr   r*  r+  )	r  r*   rY  r.  r/  r0  r   rs   r\  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td di\}} jj|fi |}d}|D ]/\}}}	}
|
	|rE|
t
|d  }
|	d urV| d||||	|
f  q2| d||||
f  q2d S )Nr'   r   r+   T	Skipped: z%s [%d] %s:%d: %sz%s [%d] %s: %s)r   r   _folded_skipsr   r,  r   r%  r   r   
startswithr  r  )r  r'   fskipsr.  r/  r0  r  numr  r6  r\  r   rA   rB   show_skipped_folded  s$   
z@TerminalReporter.short_test_summary.<locals>.show_skipped_foldedc           	        s    j dg }|D ]^}|jd usJ t|jtsJ ||jft|jdks-J ||jf| jtd di\}} j	j
|fi |}t j	 j|}| d| }|jd }|rb|dt| 7 }| | q	d S )Nr'   r  r+   Tr   rG  r*  )r   r   r  r  rO  r  r,  r   r%  r   r   r-  r2   r  )	r  r'   rY  r.  r/  r0  r   rs   r\  r   rA   rB   show_skipped_unfolded  s    
zBTerminalReporter.short_test_summary.<locals>.show_skipped_unfoldedc                   s    j r	|  d S |  d S rP   )r   )r  r>   r8  r9  rA   rB   show_skipped  s   z9TerminalReporter.short_test_summary.<locals>.show_skippedr%   )r$  r&   r,   )r   r  fr   pr   r%  zshort test summary infoT)rL  ru  )r  r  r$  r2   r9   r:   )r  r  r9   r:   )rh   r   r   r$  r   )
r>   r(  r1  r2  r;  REPORTCHAR_ACTIONSr  r   r`   rs   rA   r:  rB   r    s6   


	

z#TerminalReporter.short_test_summarytuple[str, list[str]]c                 C  sB   | j d u s| jd u s| jr|   | j sJ | jsJ | j | jfS rP   )r   r   rR  r-  r   rA   rA   rB   rn    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%   r,   rE  r+   r*   rD  r&   rC  )r   rR  )r>   r@  r   rr  rA   rA   rB   _determine_main_color#  s   z&TerminalReporter._determine_main_colorc                 C  sP   g }| j D ]}|r|tvr||vr|| qtt| | _| t|| _d S rP   )r   KNOWN_TYPESr  listr   rA  r6   r   )r>   unknown_types
found_typerA   rA   rB   r-  /  s   

z TerminalReporter._set_main_color-tuple[list[tuple[str, dict[str, bool]]], str]c                 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  8  s   z)TerminalReporter.build_summary_stats_linekey	list[Any]c                 C  s   | j |g }dd |D S )zRGet test/collection reports for the given status key, such as `passed` or `error`.c                 S  s   g | ]
}t |d dr|qS )r   T)rL   rx  rA   rA   rB   rz  T  s    z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>r  )r>   rI  r  rA   rA   rB   _get_reports_to_displayQ  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 )NTru  %d %szno tests ran)rn  rK  r  r%  r   r&  r  	pluralize)	r>   rr  known_typesr  rI  r  r^   r|   r   rA   rA   rB   rH  V  s   
z1TerminalReporter._build_normal_summary_stats_linec                 C  s   t | d}t | d}| jdkrdddifg}d}n@|dk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(   r,   r   zno tests collectedrD  TrC  z%d %s collectedtestzno tests collected (z deselected)rl  z tests collected (rL  )r  rK  r   rM  r%  )r>   r(   r  r  rr  collected_outputall_tests_were_deselectedr  rA   rA   rB   rG  i  s*   


z7TerminalReporter._build_collect_only_summary_stats_linerP   )r   r   r   r   r9   r:   )r9   r   )r9   r   )r9   r6   )r   r   r9   r:   )r   r2   r9   r6   )r   r2   r   r2   r   r6   r9   r:   r  )r  r2   r  r2   r9   r:   )r9   r:   )r  r2   r   r6   r  r   r  r2   r   r6   r9   r:   )r  r2   r   r6   r   r6   r9   r:   )rs   r  r   r6   r9   r:   )rs   r2   r   r6   r9   r:   )NN)
r!  r2   r"  r8   r   r#  r   r6   r9   r:   )r%  )r"  r2   r!  r2   r&  r6   r9   r:   )r   r2   r&  r6   r9   r:   )rW   r2   r)  r*  r9   r:   )r0  r   r9   r6   )r2  r3  r   r2   r9   r:   )r9  r   r9   r:   )r)  r;  r9   r:   )r   r2   r=  r>  r9   r:   )r   r#   r9   r:   )r9   rb  )r9   r2   )r   r"   r9   r:   )F)r	   r6   r9   r:   )r  r$   r9   r:   )r  r  r9   r:   )r   r   r9   r  )r  r$   r  r  r9   r  )r9   r  )r  r  r9   r:   )
r   r2   r  r2   r6  r#  r@  r2   r9   r2   )r  r2   )r  r2   r  r2   r  r2   r9   r:   )r   r2   r9   r	  )r   r2   r9   r:   )rY  r#   r9   r:   )
r  r2   r  r2   rm   r2   r  r8   r9   r:   )rY  r!   r9   r:   )r9   r?  )r@  r6   r9   r2   )r9   rF  )rI  r2   r9   rJ  )MrQ   rR   rS   r=   r   propertyr   r   rb   rc   r   setterr   r   r  r  r	  r  r   r   r   r   r$  r'  rs   r/  r1  r8  r:  r<  rA  r_  rR  r   rd  rX  rS  r   rm  rw  r}  r|  r  r  r  r  r  r  r  r  r  r  r?  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  rn  rA  r-  r  rK  rH  rG  rA   rA   rA   rB   r   i  s    



		










L



%





6





%n
	r   twr   rY  c                 C  sB   | |j}|d^}}|r| jd|dd}|d | S |S )Nr   Tr  )r  r   r   r   r   )rT  r   rY  r   pathr  parts_markuprA   rA   rB   r-    s   r-  rh  r   r]  r   r8   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   rh  r  )rh  r   r]  iellipsisformat_widthrA   rA   rB   rU    s   

rU  word_markupdict[str, bool]c                 C  s   | | |\}}|j|fi |}t|| |}| d| }t|}	z|jjj}
W n
 ty3   Y |S w t s=| j	j
dkrCd|
 }
n|j|	 }td|
|}
|
durV||
7 }|S )z?Get summary line for a report, trying to add reprcrash message.r   rG  r*  z - {}N)r,  r   r-  r   r  r  r   r  r   r   r_   r   rU  )r   rY  rT  r[  r.  r/  rY   rF  rs   
line_widthr   r]  rA   rA   rB   r'    s(   

r'  r   r   r'   Sequence[CollectReport]&list[tuple[int, str, int | None, str]]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 )Nr  keywordsr   skip
pytestmark)r  r  rO  r  r    r   rL   r   r+  r  r)  )r   r'   deventr  r6  r\  r`  rI  rG   eventsrA   rA   rB   r4    s$   

r4  rE  rD  rC  )r%   r,   r+   r&   r^   nountuple[int, str]c                 C  s6   |dvr| |fS | dd}| | dkr|d fS |fS )N)r,   r+   rO  r+   warningrJ   r   )r   )r^   rf  rA   rA   rB   rM    s   rM  r  c                 C  sP   g }| D ]!\}}|j  d|j }|dr|dd  }||vr%|| q|S )Nr  zpytest-   )project_namer  r5  r  )r  rG   r9  distr  rA   rA   rB   r     s   

r  secondsfloatc                 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   )rl  zs (rI  )datetime	timedeltar   )rl  dtrA   rA   rB   r    s   r  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.
    rB  zreason: Nr3  Skippedr   )rP  rB  r5  r  r'   r  r  rO  )r   r\  rs  rA   rA   rB   rT    s   



rT  )rC   r   r9   r:   )r   r   r9   r:   )r   r   r9   r2   )r   r!   r9   r   )rT  r   r   r   rY  r!   )rh  r2   r   r2   r]  r   r9   r8   )
r   r   rY  r!   rT  r   r[  r\  r9   r2   )r   r   r'   r^  r9   r_  )r^   r   rf  r2   r9   rg  )r9   r  )rl  rm  r9   r2   )r   r#   r9   r2   )VrT   
__future__r   argparsecollectionsr   dataclassesro  	functoolsr   r  pathlibr   r  r   r  typingr   r   r   r	   r
   r   r   r   r   r   r   r+   r  r   r   r   _pytest._coder   _pytest._code.coder   _pytest._ior   _pytest._io.wcwidthr   _pytest._version_pytest.assertion.utilr   r   r   r   r   r   _pytest.config.argparsingr   _pytest.nodesr   r   _pytest.pathlibr   r    _pytest.reportsr!   r"   r#   _pytest.mainr$   r~  rB  r   Actionr.   rV   r   r   r   r   	dataclassr   r   r-  rU  r'  r4  r%  r&  rM  r  r  rT  rA   rA   rA   rB   <module>   s   %
 

        
(



 


	