U
    `»{j1à  ã                   @  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�rþdd%l=m>Z> d&Z?d'Z@d(ZAG d)d*„ d*ejBƒZCG d+d,„ d,eƒZDd-d.d/œd0d1„ZEd2d.d3œd4d5„ZFd2d6d3œd7d8„ZGe0d9d:�d;d<d=œd>d?„ƒZHejIG d@dA„ dAƒƒZJeG dBdC„ dCƒƒZKdDd2d;dEœdFdG„ZLd6d6dHdIdJœdKdL„ZMd2d;dDdMd6dNœdOdP„ZNdQdRdSdTœdUdV„ZOdWdWdXdYdZœZPdXZQdHd6d[d\œd]d^„ZRd_d`œdadb„ZSdcd6ddœdedf„ZTdgd6d=œdhdi„ZUdS )jzsTerminal reporting of the full testing process.

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

    Used to unify verbosity handling.
    NFzSequence[str]ÚstrÚobjectÚboolú
str | NoneÚNone)Úoption_stringsÚdestÚdefaultÚrequiredÚhelpÚreturnc                   s   t ƒ j||d|||d� d S )Nr   )r3   r4   Únargsr5   r6   r7   )ÚsuperÚ__init__)Úselfr3   r4   r5   r6   r7   ©Ú	__class__© úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/_pytest/terminal.pyr;   S   s    úzMoreQuietAction.__init__zargparse.ArgumentParserzargparse.Namespacezstr | Sequence[object] | None)ÚparserÚ	namespaceÚvaluesÚoption_stringr8   c                 C  s6   t || jdƒd }t|| j|ƒ t |ddƒd |_d S )Nr   é   Úquiet)Úgetattrr4   ÚsetattrrF   )r<   rA   rB   rC   rD   Z	new_countr?   r?   r@   Ú__call__d   s    zMoreQuietAction.__call__)NFN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   rI   Ú__classcell__r?   r?   r=   r@   r-   L   s   
   ú ûr-   c                   @  s*   e Zd ZU dZded< ded< ded< dS )ÚTestShortLogReportuG  Used to store the test status result category, shortletter and verbose word.
    For example ``"rerun", "R", ("RERUN", {"yellow": True})``.

    :ivar category:
        The class of result, for example ``â€œpassedâ€�``, ``â€œskippedâ€�``, ``â€œerrorâ€�``, or the empty string.

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

    :ivar word:
        Verbose word is shown as testing progresses in verbose mode, for example ``"PASSED"``, ``"SKIPPED"``,
        ``"ERROR"``, or the empty string.
    r.   ÚcategoryÚletterz$str | tuple[str, Mapping[str, bool]]ÚwordN)rJ   rK   rL   rM   Ú__annotations__r?   r?   r?   r@   rO   q   s   
rO   r   r2   )rA   r8   c                 C  s¦  | j dddd�}|jddddd	d
d� |jdddddd� |jdddddd� |jdddddd� |jddtdd	dd� |jdd	tddd� |jd d!d"td#d$d%� |jd&d'dd(dd)d*� |jd+d,dd-dd.d� |jd/dd-d0d1� |jd2d3d!d4d5d5d6d7d8d9d:gd;d<� |jd=dd>dd?d� |jd@d!dAd8dBdCdDdEgdEdFdG� |jdHdIdddJdK� |jdLdMd!dMd5dNd8d5gdOd<� |jdPdNdNd8gdQdR� | jdSdTdUdV� tj| tjdWdX� d S )YNzterminal reportingZ	ReportingZgeneral)Úafterz-vz	--verboseÚcountr   ÚverbosezIncrease verbosity)Úactionr5   r4   r7   z--no-headerÚ
store_trueFÚ	no_headerzDisable headerz--no-summaryÚ
no_summaryzDisable summaryz--no-fold-skippedÚstore_falseÚfold_skippedTz+Do not fold skipped tests in short summary.)rW   r4   r5   r7   z-qz--quietzDecrease verbosityz--verbosityzSet verbosity. Default: 0.)r4   Útyper5   r7   z-rÚstoreÚreportcharsÚcharsa  Show extra test summary info as specified by chars: (f)ailed, (E)rror, (s)kipped, (x)failed, (X)passed, (p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll. (w)arnings are enabled by default (see --disable-warnings), 'N' can be used to reset the list. (default: 'fE').)rW   r4   r5   Úmetavarr7   z--disable-warningsz--disable-pytest-warningsÚdisable_warningszDisable warnings summary)r5   r4   rW   r7   z-lz--showlocalsZ
showlocalsz/Show locals in tracebacks (disabled by default)z--no-showlocalszFHide locals in tracebacks (negate --showlocals passed through addopts))rW   r4   r7   z--tbÚstyleÚtbstyleÚautoÚlongÚshortÚnoÚlineÚnativez5Traceback print mode (auto/long/short/line/native/no))ra   rW   r4   r5   Úchoicesr7   z
--xfail-tbÚxfail_tbz1Show tracebacks for xfail (as long as --tb != no)z--show-captureÚshowcaptureÚstdoutÚstderrÚlogÚallzOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)rW   r4   rk   r5   r7   z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))rW   r5   r7   z--colorÚcolorÚyesz#Color terminal output (yes/no/auto)z--code-highlightzSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r5   rk   r7   Úconsole_output_stylez®Console output: "classic", or with additional progress information ("progress" (percentage) | "count" | "progress-even-when-capture-no" (forces progress even when capture=no)Úprogress)r7   r5   z¡Specify a verbosity level for test case execution, overriding the main level. Higher levels will provide more detailed information about each test case executed.)r7   )	ZgetgroupZ
_addoptionr-   ÚintÚ_REPORTCHARS_DEFAULTZaddinir   Z_add_verbosity_iniÚVERBOSITY_TEST_CASES)rA   Úgroupr?   r?   r@   Úpytest_addoption…   s   úûûûúûúúúüù	ûú	ûù	üûürz   r   ©Úconfigr8   c                   sJ   t | tjƒ‰ | j ˆ d¡ | jjs*| jjrF‡ fdd„}| jj	 
d|¡ d S )NÚterminalreporterc                   s"   d  tt|ƒ¡}ˆ  d| ¡ d S )Nú z[traceconfig] )ÚjoinÚmapr.   Ú
write_line)ÚtagsÚargsÚmsg©Úreporterr?   r@   Úmywriter  s    z"pytest_configure.<locals>.mywriterzpytest:config)ÚTerminalReporterÚsysrn   ÚpluginmanagerÚregisterÚoptionÚdebugÚtraceconfigÚtraceÚrootZsetprocessor)r|   r‡   r?   r…   r@   Úpytest_configure  s
    r‘   r.   c                 C  s¢   | j j}ddh}d}|D ]N}||kr,| ¡ }|dkr:d}q|dkrHd}q|dkrVd}q||kr||7 }q| j js‚d	|kr‚d	| }n| j jržd	|krž| d	d¡}|S )
NÚFÚSÚ ÚaZsxXEfÚAZPpsxXEfÚNÚw)rŒ   r_   Úlowerrb   Úreplace)r|   r_   Zold_aliasesZ
reportoptsÚcharr?   r?   r@   Úgetreportopt#  s&    

rœ   T©Ztrylastr!   ztuple[str, str, str]©Úreportr8   c                 C  sH   d}| j rd}n
| jrd}| j}| jdkr:|dkr:d}d}||| ¡ fS )Nr’   Ú.Ús)ÚcollectÚsetupÚteardownr%   r,   ÚE)r&   r'   ÚoutcomeÚwhenÚupper)rŸ   rQ   r¦   r?   r?   r@   Úpytest_report_teststatus<  s    r©   c                   @  sN   e Zd ZU dZded< dZded< dZded< d	Zd
ed< dddœdd„ZdS )ÚWarningReportao  Simple structure to hold warnings information captured by ``pytest_warning_recorded``.

    :ivar str message:
        User friendly message about the warning.
    :ivar str|None nodeid:
        nodeid that generated the warning (see ``get_location``).
    :ivar tuple fslocation:
        File system location of the source of the warning (see ``get_location``).
    r.   ÚmessageNr1   Únodeidztuple[str, int] | NoneÚ
fslocationTr   Úcount_towards_summaryr   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|   ÚfilenameZlinenumÚrelpathr?   r?   r@   Úget_location^  s    
zWarningReport.get_location)	rJ   rK   rL   rM   rS   r¬   r­   r®   r´   r?   r?   r?   r@   rª   L  s   

rª   c                   @  sä  e Zd ZdÜddddœdd„Zdd	œd
d„Zedd	œdd„ƒZedd	œdd„ƒZedd	œdd„ƒZedd	œdd„ƒZ	edd	œdd„ƒZ
e
jdddœdd„ƒZ
edd	œdd„ƒZdddœdd „Zddddd!œd"d#„ZdÝdddd%œd&d'„Zdd	œd(d)„Zd*d+d,d-œddddddd.œd/d0„Zd*d1œddddd2œd3d4„Zdd	œd5d6„Zd7ddd8œd9d:„Zdddd8œd;d<„ZdÞdd=d>ddd?œd@dA„ZdßdddddCœdDdE„ZddddFœdGdH„ZddIddJœdKdL„ZdMddNœdOdP„ZdQdddRœdSdT„ZdUddVœdWdX„ZdYddZœd[d\„Zdd]dd^œd_d`„Zdaddbœdcdd„Zedd	œdedf„ƒZ e!dgdh�did	œdjdk„ƒZ"dd	œdldm„Z#dd	œdndo„Z$dd	œdpdq„Z%edd	œdrds„ƒZ&dd	œdtdu„Z'dvddbœdwdx„Z(dàdddyœdzd{„Z)e!dgd|�d}dd~œdd€„ƒZ*d�dd‚œdƒd„„Z+dd…d†œd‡dˆ„Z,d}dd~œd‰dŠ„Z-dYddZœd‹dŒ„Z.e!dgdh�d}d�dŽd�œd�d‘„ƒZ/e!dgdh�dŽd	œd’d“„ƒZ0d”dd•œd–d—„Z1dd	œd˜d™„Z2dd	œdšd›„Z3ddd>dddœœd�dž„Z4dŸd „ Z5d¡d¢„ Z6dd£œd¤d¥„Z7dd	œd¦d§„Z8dd	œd¨d©„Z9dd	œdªd«„Z:ddddd¬œd­d®„Z;dd¯d°œd±d²„Z<ddd°œd³d´„Z=daddµœd¶d·„Z>dd	œd¸d¹„Z?dd	œdºd»„Z@dd¼œdddd=dd½œd¾d¿„ZAdd	œdÀdÁ„ZBdÂddµœdÃdÄ„ZCdd	œdÅdÆ„ZDdd	œdÇdÈ„ZEdÉd	œdÊdË„ZFdddÌœdÍdÎ„ZGdd	œdÏdÐ„ZHdÑd	œdÒdÓ„ZIddÔdÕœdÖd×„ZJdÑd	œdØdÙ„ZKdÑd	œdÚdÛ„ZLdS )árˆ   Nr   zTextIO | Noner2   )r|   Úfiler8   c                 C  sº   dd l }|| _d| _d | _d | _i | _d | _d | _|jj	| _
|d krJtj}|j ||¡| _| jj| _d | _t|ƒ| _|jj| _| jj| _| ¡ | _tƒ | _|  ¡ | _d | _d | _d | _d S ©Nr   ) Ú_pytest.configr|   Ú_numcollectedÚ_sessionÚ_showfspathÚstatsÚ_main_colorÚ_known_typesr°   r±   Ú	startpathr‰   rn   Zcreate_terminal_writerÚ_twÚ	fullwidthÚ_screen_widthÚcurrentfspathrœ   r_   rŒ   r\   ÚfoldskippedZ	hasmarkupÚisattyÚsetÚ_progress_nodeids_reportedÚ_determine_show_progress_infoÚ_show_progress_infoÚ_collect_report_last_writeÚ_already_displayed_warningsÚ_keyboardinterrupt_memo)r<   r|   rµ   Ú_pytestr?   r?   r@   r;   k  s.    






zTerminalReporter.__init__z%Literal[('progress', 'count', False)]©r8   c                 C  sd   | j  dd¡dkr&| j  d¡dkr&dS | j  dd¡r8dS | j  d¡}|dkrPdS |d	kr\d	S dS d
S )zRReturn whether we should display progress information based on the current config.Úcapturerh   rt   úprogress-even-when-capture-noFZ	setupshow>   rÏ   ru   ru   rU   N)r|   Ú	getoptionÚgetini)r<   Úcfgr?   r?   r@   rÇ   †  s    ÿ
ÿþz.TerminalReporter._determine_show_progress_inforv   c                 C  s   | j jj}|S ©N)r|   rŒ   rV   )r<   Ú	verbosityr?   r?   r@   rÔ   ›  s    
zTerminalReporter.verbosityr0   c                 C  s
   | j dkS r¶   )rÔ   ©r<   r?   r?   r@   Ú
showheader   s    zTerminalReporter.showheaderc                 C  s   t | jjjƒS rÓ   )r0   r|   rŒ   rY   rÕ   r?   r?   r@   rY   ¤  s    zTerminalReporter.no_headerc                 C  s   t | jjjƒS rÓ   )r0   r|   rŒ   rZ   rÕ   r?   r?   r@   rZ   ¨  s    zTerminalReporter.no_summaryc                 C  s"   | j d kr| j tj¡dkS | j S r¶   )rº   r|   Úget_verbosityr   rx   rÕ   r?   r?   r@   Ú
showfspath¬  s    
zTerminalReporter.showfspathzbool | None)Úvaluer8   c                 C  s
   || _ d S rÓ   )rº   )r<   rÙ   r?   r?   r@   rØ   ²  s    c                 C  s   | j  tj¡dkS r¶   )r|   r×   r   rx   rÕ   r?   r?   r@   Úshowlongtestinfo¶  s    z!TerminalReporter.showlongtestinfor.   )r›   r8   c                 C  s   dddœ  ||¡}|| jkS )NÚxr¡   )r)   r'   )Úgetr_   )r<   r›   r?   r?   r@   Úhasoptº  s    zTerminalReporter.hasopt)r¬   ÚresÚmarkupr8   c                 K  sŠ   | j j| d¡d  }| jd ks*|| jkrn| jd k	rB| jrB|  ¡  || _t| j|ƒ}| j 	¡  | j 
|d ¡ | jj
|fddi|—Ž d S )Nú::r   r~   ÚflushT)r|   ÚrootpathÚsplitrÂ   rÈ   Ú)_write_progress_information_filling_spacer    r¾   r¿   ri   Úwrite)r<   r¬   rÞ   rß   ÚfspathZ	relfspathr?   r?   r@   Úwrite_fspath_result¾  s    
z$TerminalReporter.write_fspath_resultr”   )ÚprefixÚextrar8   c                 K  sD   | j |kr&| j ¡  || _ | j |¡ |r@| jj|f|Ž d| _ d S )Néþÿÿÿ)rÂ   r¿   ri   rå   )r<   rè   ré   Úkwargsr?   r?   r@   Úwrite_ensure_prefixÉ  s    

z$TerminalReporter.write_ensure_prefixc                 C  s   | j r| j ¡  d | _ d S rÓ   )rÂ   r¿   ri   rÕ   r?   r?   r@   Úensure_newlineÒ  s    
zTerminalReporter.ensure_newlineFé   Ú
)rá   ÚmarginÚline_sep)Úcontentrá   rð   rñ   rß   r8   c                K  sV   | j j}| tjd| | | j| ddd�¡}||d… }| j j|fd|i|—Ž dS )z+Wrap message with margin for progress info.r~   TF)ÚwidthÚdrop_whitespaceÚreplace_whitespaceNrá   )r¿   Úwidth_of_current_liner   ÚtextwrapÚwraprÁ   rå   )r<   rò   rá   rð   rñ   rß   rö   Úwrappedr?   r?   r@   Ú
wrap_write×  s    

üÿzTerminalReporter.wrap_write)rá   )rò   rá   rß   r8   c                K  s   | j j|fd|i|—Ž d S )Nrá   )r¿   rå   )r<   rò   rá   rß   r?   r?   r@   rå   í  s    zTerminalReporter.writec                 C  s   | j  ¡  d S rÓ   )r¿   rá   rÕ   r?   r?   r@   rá   ð  s    zTerminalReporter.flushzstr | bytes)ri   rß   r8   c                 K  s2   t |tƒst|dd�}|  ¡  | jj|f|Ž d S )Nrš   )Úerrors)Ú
isinstancer.   rí   r¿   ri   )r<   ri   rß   r?   r?   r@   r�   ó  s    
zTerminalReporter.write_linec                 K  sV   |  dd¡}|r.| jjt|ƒ d }d| }nd}t|ƒ}| jjd| | f|Ž dS )a-  Rewinds the terminal cursor to the beginning and writes the given line.

        :param erase:
            If True, will also add spaces until the full terminal width to ensure
            previous lines are properly erased.

        The rest of the keyword arguments are markup instructions.
        ÚeraseFrE   r~   r”   úN)Úpopr¿   rÀ   Úlenr.   rå   )r<   ri   rß   rý   Z
fill_countÚfillr?   r?   r@   Úrewriteù  s    	
zTerminalReporter.rewriter1   z
int | None)ÚsepÚtitlerÀ   rß   r8   c                 K  s    |   ¡  | jj|||f|Ž d S rÓ   )rí   r¿   r  )r<   r  r  rÀ   rß   r?   r?   r@   Ú	write_sep  s    zTerminalReporter.write_sepú=)r  r  Úkwr8   c                 K  s   | j j||f|Ž d S rÓ   )r¿   r  )r<   r  r  r  r?   r?   r@   Úsection  s    zTerminalReporter.section)r„   r  r8   c                 K  s   | j j|f|Ž d S rÓ   )r¿   ri   )r<   r„   r  r?   r?   r@   ri     s    zTerminalReporter.linezSequence[Any])rP   Úitemsr8   c                 C  s.   || j k}| j  |g ¡ |¡ |r*|  ¡  d S rÓ   )r»   Ú
setdefaultÚextendÚ_set_main_color)r<   rP   r	  Zset_main_colorr?   r?   r@   Ú
_add_stats  s    
zTerminalReporter._add_statsr   )Úexcreprr8   c                 C  s&   t |ƒ d¡D ]}|  d| ¡ qdS )Nrï   zINTERNALERROR> T)r.   rã   r�   )r<   r  ri   r?   r?   r@   Úpytest_internalerror!  s    z%TerminalReporter.pytest_internalerrorzwarnings.WarningMessage)Úwarning_messager¬   r8   c                 C  s@   ddl m} |j|jf}||ƒ}t|||d�}|  d|g¡ d S )Nr   )Úwarning_record_to_str)r­   r«   r¬   r+   )Z_pytest.warningsr  r²   Úlinenorª   r  )r<   r  r¬   r  r­   r«   Zwarning_reportr?   r?   r@   Úpytest_warning_recorded&  s      ÿz(TerminalReporter.pytest_warning_recordedr   )Úpluginr8   c                 C  s"   | j jjrd|› �}|  |¡ d S )NzPLUGIN registered: )r|   rŒ   rŽ   r�   )r<   r  r„   r?   r?   r@   Úpytest_plugin_registered5  s    

z)TerminalReporter.pytest_plugin_registeredzSequence[Item])r	  r8   c                 C  s   |   d|¡ d S )Nr(   )r  )r<   r	  r?   r?   r@   Úpytest_deselected=  s    z"TerminalReporter.pytest_deselectedztuple[str, int | None, str])r¬   Úlocationr8   c                 C  sT   |\}}}| j r6|  ||||¡}|  |d¡ |  ¡  n| jrP|  |d¡ |  ¡  d S )Nr”   )rÚ   Ú_locationlinerì   rá   rØ   rç   )r<   r¬   r  ræ   r  Údomainri   r?   r?   r@   Úpytest_runtest_logstart@  s    

z(TerminalReporter.pytest_runtest_logstartr#   rž   c                 C  s^  d| _ |}t| jjj|| jd�Ž }|j|j|j  }}}t|t	ƒsHd }n|\}}|  
||g¡ |sj|sjd S |d krÈt|dƒ}|jr�|s�ddi}n8|jr¤|r¤ddi}n$|jr´ddi}n|jrÄddi}ni }| j |j¡ | j tj¡dk�r| jj|f|Ž | j�rR| j�sR|  ¡  �n<| j|jf|jžŽ }	t|dƒ}
|
�sÜ| j|	|f|Ž |j�s^t|dƒ�rÊt|ƒ}| j tj¡d	k �r¤| jj| jj t d
ƒ d }t!d||ƒ}nd|› d�}|�rÊ|d k	�rÊ|  "|¡ | j�rR|  #¡  nv|  $¡  | j d|j%j&j'› d�¡ | j�r | jj|  (¡ d dd� n| j d¡ | jj|f|Ž | j d|	 ¡ d| _)|  *¡  d S )NT)rŸ   r|   ÚwasxfailÚgreenÚyellowÚredr   Únodeé   ú [100%]rE   z ({})z (ú)ú[ú]r~   )Úcyanrê   )+Z
_tests_ranrO   r|   Úhookr©   rP   rQ   rR   rü   Útupler  Úhasattrr&   r%   r'   rÆ   Úaddr¬   r×   r   rx   r¿   rå   rÈ   Ú_is_last_itemÚ(_write_progress_information_if_past_edger  r  rì   Ú_get_raw_skip_reasonrÀ   rö   r   Ú_format_trimmedrú   rä   rí   r  ZgatewayÚidÚ!_get_progress_information_messagerÂ   rá   )r<   rŸ   ÚreprÞ   rP   rQ   rR   rß   Z	was_xfailri   Zrunning_xdistÚreasonÚavailable_widthZformatted_reasonr?   r?   r@   Úpytest_runtest_logreportN  s~    ÿ








ÿþÿ  ÿ


 ÿz)TerminalReporter.pytest_runtest_logreportc                 C  s    | j d k	st‚t| jƒ| j jkS rÓ   )r¹   ÚAssertionErrorr   rÆ   ÚtestscollectedrÕ   r?   r?   r@   r*  š  s    zTerminalReporter._is_last_itemT)ÚwrapperzGenerator[None, object, object]c                 c  s0   d V }| j  tj¡dkr,| jr,| jr,|  ¡  |S r¶   )r|   r×   r   rx   rÈ   rÆ   rä   )r<   Úresultr?   r?   r@   Úpytest_runtestloopŸ  s    ÿþýz#TerminalReporter.pytest_runtestloopc                 C  s�   | j s
t‚| j j}| jdkrh|rVt| jƒ}dtt|ƒƒ› d�}d|› d�}| ||¡S d|› d|› d�S |rˆdt| jƒd	 | d
›d�S dS d S )NrU   z{:zd}ú [z/{}]z [ z / z ]éd   Z3dz%]r!  )r¹   r4  r5  rÈ   r   rÆ   r.   Úformat)r<   Ú	collectedru   Zcounter_formatÚformat_stringr?   r?   r@   r/  ­  s    


ÿz2TerminalReporter._get_progress_information_messagec                 C  sˆ   | j }| jdkr:| jst‚| jj}td|› d|› d�ƒ}ntdƒ}|| d | jk}|r„|  ¡ \}}|  ¡ }| j	j
|d f|diŽ d S )	NrU   r9  ú/r$  r!  rE   rï   T)Ú_width_of_current_linerÈ   r¹   r4  r5  r   rÁ   Ú_get_main_colorr/  r¿   rå   )r<   r˜   Z	num_testsZprogress_lengthZ	past_edgeÚ
main_colorÚ_r„   r?   r?   r@   r+  ¾  s    

z9TerminalReporter._write_progress_information_if_past_edgec                 C  sN   |   ¡ \}}|  ¡ }| j}| jj| d }| j| |¡fddi|di—Ž d S )NrE   rá   T)r@  r/  r?  r¿   rÀ   rå   Úrjust)r<   rr   rB  r„   r˜   r  r?   r?   r@   rä   Ì  s
    z:TerminalReporter._write_progress_information_filling_spacec                 C  s   | j jS )z%Return the width of the current line.)r¿   rö   rÕ   r?   r?   r@   r?  Ó  s    z'TerminalReporter._width_of_current_linec                 C  sR   | j r0| jjjdkrN| jdddd� t ¡ | _n| jjjdkrN| jdddd� d S )Nr   zcollecting ... T)rá   ÚboldrE   )rÄ   r|   rŒ   rV   rå   r   ÚtimerÉ   rÕ   r?   r?   r@   Úpytest_collectionØ  s    z"TerminalReporter.pytest_collectionr"   c                 C  s^   |j r|  d|g¡ n|jr*|  d|g¡ dd„ |jD ƒ}|  jt|ƒ7  _| jrZ|  ¡  d S )Nr,   r'   c                 S  s   g | ]}t |tƒr|‘qS r?   )rü   r   ©Ú.0rÛ   r?   r?   r@   Ú
<listcomp>å  s     
 z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)r%   r  r'   r7  r¸   r   rÄ   Úreport_collect)r<   rŸ   r	  r?   r?   r@   Úpytest_collectreportà  s    z%TerminalReporter.pytest_collectreport)r	   r8   c                 C  s@  | j jjdk rd S |s@t ¡ }| jd k	r:| j|t kr:d S || _t| j 	dg ¡ƒ}t| j 	dg ¡ƒ}t| j 	dg ¡ƒ}| j
| }|rˆdnd}|t| j
ƒd | j
dkr¨d	nd
 7 }|rÐ|d||dkrÆd
nd	f 7 }|rà|d| 7 }|rð|d| 7 }| j
|k�r|d| 7 }| j�r2| j|ddd� |�r<|  d¡ n
|  |¡ d S )Nr   r,   r'   r(   z
collected zcollecting z itemrE   r”   r¡   z / %d error%sz / %d deselectedz / %d skippedz / %d selectedT)rD  rý   rï   )r|   rŒ   rV   r   rE  rÉ   ÚREPORT_COLLECTING_RESOLUTIONr   r»   rÜ   r¸   r.   rÄ   r  rå   r�   )r<   r	   Útrû   r'   r(   Úselectedri   r?   r?   r@   rJ  ê  s>    ÿþ
ÿzTerminalReporter.report_collectr�   r$   )Úsessionr8   c                 C  s  || _ t ¡ | _| jsd S | jdddd� t ¡ }| j�sdt	j› d|› �}t
t	dd ƒ}|rŽd tt|d d	… ƒ¡}|d
|› d|d	 › d�7 }|dtjj› dtj› �7 }| jdksÌ| jjjsÌt
| jjdd ƒrÞ|dtt	jƒ 7 }|  |¡ | jjj| j| jd�}|  |¡ d S )Nr  ztest session startsT©rD  z	platform z -- Python Úpypy_version_infor    é   z[pypy-ú-r$  z	, pytest-z	, pluggy-r   Zpastebinz -- )r|   Ú
start_path)r¹   r   rE  Ú_sessionstarttimerÖ   r  ÚplatformÚpython_versionrY   r‰   rG   r   r€   r.   rÌ   Ú_versionÚversionÚpluggyÚ__version__rÔ   r|   rŒ   r�   Ú
executabler�   r&  Úpytest_report_headerr¾   Ú_write_report_lines_from_hooks)r<   rO  Zverinfor„   rQ  Úlinesr?   r?   r@   Úpytest_sessionstart  s4    
ÿþý
 ÿz$TerminalReporter.pytest_sessionstartzSequence[str | Sequence[str]]©r_  r8   c                 C  s<   t |ƒD ].}t|tƒr"|  |¡ q|D ]}|  |¡ q&qd S rÓ   )Úreversedrü   r.   r�   )r<   r_  Zline_or_linesri   r?   r?   r@   r^  *  s
    
z/TerminalReporter._write_report_lines_from_hooksú	list[str]r{   c                 C  s†   d|j › �g}|jr,| dt|j |jƒ ¡ |jtjjkrZ| d¡}| d 	d 
|¡¡¡ |j ¡ }|r‚| d 	d 
t|ƒ¡¡¡ |S )Nz	rootdir: zconfigfile: Ú	testpathsztestpaths: {}ú, zplugins: {})râ   ZinipathÚappendr    Zargs_sourcer   Z
ArgsSourceZ	TESTPATHSrÑ   r;  r   rŠ   Zlist_plugin_distinfoÚ_plugin_nameversions)r<   r|   r7  rd  Ú
plugininfor?   r?   r@   r]  4  s    

ÿz%TerminalReporter.pytest_report_headerc                 C  sž   |   d¡ | jjj| j| j|jd�}|  |¡ | j d¡rš|jrf| jjj	dkrZ| j
 d¡ |  |j¡ | j d¡}|rš| j
 dd¡ |D ]}| | j
¡ qˆd S )	NT)r|   rT  r	  Úcollectonlyéÿÿÿÿr”   r%   ú!zcollection failures)rJ  r|   r&  Zpytest_report_collectionfinishr¾   r	  r^  rÐ   rŒ   rV   r¿   ri   Ú_printcollecteditemsr»   rÜ   r  Ú
toterminal)r<   rO  r_  r%   r0  r?   r?   r@   Úpytest_collection_finishE  s"    
ý
z)TerminalReporter.pytest_collection_finishc              	   C  sZ  | j  tj¡}|dk rx|dk r\tdd„ |D ƒƒ}t| ¡ ƒD ]\}}| j d||f ¡ q<n|D ]}| j |j	¡ q`d S g }d}|D ]Ð}| 
¡ dd … }	|r¼||	d t|ƒ… kr²q¼| ¡  q˜|	t|ƒd … D ]†}
| |
¡ t|ƒd d }| j |› |
› �¡ |dkrÌt|
d	d ƒ}|�r"t |¡nd }|rÌ| ¡ D ]}| j d
 |d |¡¡ �q2qÌq„d S )Nr   rj  c                 s  s    | ]}|j  d d¡d V  qdS ©rà   rE   r   N)r¬   rã   )rH  Úitemr?   r?   r@   Ú	<genexpr>_  s     z8TerminalReporter._printcollecteditems.<locals>.<genexpr>z%s: %dr”   rE   ú  Úobjz{}{})r|   r×   r   rx   r   Úsortedr	  r¿   ri   r¬   Z	listchainr   rÿ   rf  rG   ÚinspectÚgetdocÚ
splitlinesr;  )r<   r	  Ztest_cases_verbosityÚcountsÚnamerU   rp  ÚstackÚindentZneeded_collectorsÚcolrs  Údocri   r?   r?   r@   rl  [  s6    

z%TerminalReporter._printcollecteditemszint | ExitCodezGenerator[None])rO  Ú
exitstatusr8   c                 c  s¬   d V }| j  d¡ tjtjtjtjtjf}||krN| jsN| j	j
j| || j	d� |jrj| jdt|jƒdd� |tjkr„|  ¡  d | _n|jr | jdt|jƒdd� |  ¡  |S )Nr”   )r}   r~  r|   rk  T)r  )r¿   ri   r   ÚOKZTESTS_FAILEDZINTERRUPTEDZUSAGE_ERRORZNO_TESTS_COLLECTEDrZ   r|   r&  Úpytest_terminal_summaryZ
shouldfailr  r.   Ú_report_keyboardinterruptrË   Z
shouldstopÚsummary_stats)r<   rO  r~  r7  Zsummary_exit_codesr?   r?   r@   Úpytest_sessionfinishy  s.    û  ÿ
z%TerminalReporter.pytest_sessionfinishc                 c  sR   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  z
d V W ¢S |  ¡  |  ¡  X d S rÓ   )Úsummary_errorsÚsummary_failuresÚsummary_xfailuresÚsummary_warningsÚsummary_passesÚsummary_xpassesÚshort_test_summaryrÕ   r?   r?   r@   r€  ”  s    
z(TerminalReporter.pytest_terminal_summaryzExceptionInfo[BaseException])Úexcinfor8   c                 C  s   |j dd�| _d S )NT)Zfuncargs)ZgetreprrË   )r<   r‹  r?   r?   r@   Úpytest_keyboard_interrupt£  s    z*TerminalReporter.pytest_keyboard_interruptc                 C  s   | j d k	r|  ¡  d S rÓ   )rË   r�  rÕ   r?   r?   r@   Úpytest_unconfigure¦  s    
z#TerminalReporter.pytest_unconfigurec                 C  sv   | j }|d k	st‚|jd k	s t‚|jj}|  d|¡ d|krr| jjjrT| | j	¡ n|j | j	¡ | j	j
ddd� d S )Nrk  ÚKeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)r  )rË   r4  Ú	reprcrashr«   r  r|   rŒ   Z	fulltracerm  r¿   ri   )r<   r  r„   r?   r?   r@   r�  ª  s    
þz*TerminalReporter._report_keyboardinterrupt)r¬   ræ   r  r  r8   c                   sn   dddœ‡ ‡fdd„}|rb||ƒ}ˆj dkrf| d¡d | dtj¡krf|d	tˆjt|ƒƒ 7 }nd
}|d S )Nr.   ©r¬   r8   c                   s\   ˆj  | ¡}ˆ rX| ˆ ¡rX|d tˆ ƒ … }ˆ  d¡}|d  dd¡|d< |d |¡7 }|S )Nr#  r   r    rà   )r|   Úcwd_relative_nodeidÚendswithr   rã   rš   r   )r¬   ri   rC   ©r  r<   r?   r@   Úmkrel½  s    
z-TerminalReporter._locationline.<locals>.mkrelr   rà   r   ú\z <- z
[location]r~   )rÔ   rã   rš   r   ZSEPr    r¾   r   )r<   r¬   ræ   r  r  r”  rÞ   r?   r“  r@   r  º  s    
 ÿzTerminalReporter._locationlinec                 C  s   |j }|r|S dS )Nztest session)Ú	head_line)r<   r0  r–  r?   r?   r@   Ú_getfailureheadlineÑ  s    z$TerminalReporter._getfailureheadlinec                 C  sZ   zt |jjƒW S  tk
rT   zt |jƒd d… W  Y S  tk
rN   Y Y dS X Y nX d S )Né2   r”   )r.   Úlongreprr�  ÚAttributeError)r<   r0  r?   r?   r@   Ú_getcrashline×  s    zTerminalReporter._getcrashline)ry  c                 C  s   dd„ | j  |d¡D ƒS )Nc                 S  s   g | ]}t |d ƒs|‘qS )Z	_pdbshown)r(  rG  r?   r?   r@   rI  ä  s     
 z/TerminalReporter.getreports.<locals>.<listcomp>r?   ©r»   rÜ   )r<   ry  r?   r?   r@   Ú
getreportsã  s    zTerminalReporter.getreportsc                   s&  ˆ   d¡�r"ˆ j d¡}|s d S ˆ jd k	}|r>|ˆ jd … }n|}t|ƒˆ _|sTd S i }|D ]}| |jg ¡ |¡ q\dddœ‡ fdd„}|r’dnd	}ˆ jd
|ddd� | 	¡ D ]d\}}	||	ƒ}
|
röˆ j
 |
¡ | ¡ }d dd„ |D ƒ¡}| ¡ }n| ¡ }ˆ j
 |¡ ˆ j
 ¡  q°ˆ j
 d¡ d S )Nr˜   r+   zlist[WarningReport]r.   )Úreportsr8   c                   sn   g }| D ]}|  ˆ j¡}|r| |¡ qt|ƒdk rDd tt|ƒ¡S tdd„ |D ƒƒ}d dd„ | ¡ D ƒ¡S )Né
   rï   c                 s  s"   | ]}t |ƒ d d¡d V  qdS ro  )r.   rã   )rH  Úlocr?   r?   r@   rq    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;  )rH  ÚkÚvr?   r?   r@   rq    s   ÿ)	r´   r|   rf  r   r   r€   r.   r   r	  )rž  Ú	locationsr˜   r  Zcounts_by_filenamerÕ   r?   r@   Úcollapsed_location_reportù  s    ÿ
þzDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportzwarnings summary (final)zwarnings summaryr  TF)r  rD  rï   c                 s  s   | ]}d | V  qdS )rr  Nr?   rG  r?   r?   r@   rq    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«   rf  r  r	  r¿   ri   rw  r   Úrstrip)r<   Zall_warningsr	   Zwarning_reportsZreports_grouped_by_messageÚwrr¤  r  r«   Zmessage_reportsZmaybe_locationr_  Zindentedr?   rÕ   r@   r‡  æ  s<    


ÿz!TerminalReporter.summary_warningsc                 C  s   |   ddd¡ d S )Nr&   ZPASSESÚP©Úsummary_passes_combinedrÕ   r?   r?   r@   rˆ    s    zTerminalReporter.summary_passesc                 C  s   |   ddd¡ d S )Nr*   ZXPASSESÚXr¨  rÕ   r?   r?   r@   r‰    s    z TerminalReporter.summary_xpasses)Úwhich_reportsÚ	sep_titleÚ
needed_optr8   c                 C  s|   | j jjdkrx|  |¡rx|  |¡}|s*d S |  d|¡ |D ]<}|jrj|  |¡}| jd|ddd� |  |¡ |  	|j
¡ q:d S )Nrh   r  rB  T)r  rD  )r|   rŒ   rd   rÝ   r�  r  Úsectionsr—  Ú_outrep_summaryÚ_handle_teardown_sectionsr¬   )r<   r«  r¬  r­  rž  r0  r„   r?   r?   r@   r©  "  s    



z(TerminalReporter.summary_passes_combinedzlist[TestReport]r�  c                   s   |   d¡}‡ fdd„|D ƒS )Nr”   c                   s$   g | ]}|j d kr|jˆ kr|‘qS )r¤   )r§   r¬   )rH  rŸ   ©r¬   r?   r@   rI  4  s   
 
þz:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r�  )r<   r¬   rž  r?   r±  r@   Ú_get_teardown_reports2  s    

þz&TerminalReporter._get_teardown_reportsc                 C  s   |   |¡D ]}|  |¡ q
d S rÓ   )r²  Úprint_teardown_sections)r<   r¬   rŸ   r?   r?   r@   r°  :  s    z*TerminalReporter._handle_teardown_sections)r0  r8   c                 C  sz   | j jj}|dkrd S |jD ]X\}}|dkr6||kr6qd|kr| j d|¡ |dd … dkrh|d d… }| j |¡ qd S )Nrh   rq   r¤   rS  rj  rï   )r|   rŒ   rm   r®  r¿   r  ri   ©r<   r0  rm   Zsecnamerò   r?   r?   r@   r³  >  s    
z(TerminalReporter.print_teardown_sectionsc                 C  s   | j jj}| jdd|d� d S )Nr%   ZFAILURES©rc   )r|   rŒ   rd   Úsummary_failures_combined)r<   rc   r?   r?   r@   r…  K  s    
z!TerminalReporter.summary_failuresc                 C  s0   | j jj}|r| j jjnd}| jdd|d� d S )Nrh   r)   Z	XFAILURESrµ  )r|   rŒ   rl   rd   r¶  )r<   Zshow_tbrc   r?   r?   r@   r†  O  s    
z"TerminalReporter.summary_xfailures)r­  )r«  r¬  rc   r­  r8   c          	      C  sœ   |dkr˜|r|   |¡r˜|  |¡}|s(d S |  d|¡ |dkr\|D ]}|  |¡}|  |¡ q@n<|D ]6}|  |¡}| jd|ddd� |  |¡ |  |j¡ q`d S )Nrh   r  ri   rB  T©r  rD  )	rÝ   r�  r  r›  r�   r—  r¯  r°  r¬   )	r<   r«  r¬  rc   r­  rž  r0  ri   r„   r?   r?   r@   r¶  T  s    



z*TerminalReporter.summary_failures_combinedc                 C  sŒ   | j jjdkrˆ|  d¡}|s d S |  dd¡ | jd D ]P}|  |¡}|jdkrXd| }nd|j› d|› �}| jd	|d
d
d� |  |¡ q6d S )Nrh   r,   r  ZERRORSr¢   zERROR collecting z	ERROR at z of rB  Tr·  )	r|   rŒ   rd   r�  r  r»   r—  r§   r¯  )r<   rž  r0  r„   r?   r?   r@   r„  m  s    



zTerminalReporter.summary_errorsr!   c                 C  s~   |  | j¡ | jjj}|dkr"d S |jD ]P\}}|dkrB||krBq(| j d|¡ |dd … dkrl|d d… }| j |¡ q(d S )Nrh   rq   rS  rj  rï   )rm  r¿   r|   rŒ   rm   r®  r  ri   r´  r?   r?   r@   r¯  |  s    
z TerminalReporter._outrep_summaryc                 C  sB  | j dk rd S t ¡ | j }|  ¡ \}}g }| j dk}|rB| jj}|D ]:\}}| jj|f|Ž}	|rv|t|	ƒt|ƒ 7 }| 	|	¡ qFd 
|¡}
|di}dt|ƒ› �}| jj|f|Ž}|rÊ|t|ƒt|ƒ 7 }|
|7 }
|�r| jjd|Ž}| d¡rü|d d… }|t|ƒ7 }|
|7 }
|�r0| jd	|
fd
|i|—Ž n| j|
f|Ž d S )Nrj  r   re  Tz in r”   z[0méüÿÿÿr  rÀ   )r”   )rÔ   r   rE  rU  Úbuild_summary_stats_liner¿   rÀ   rß   r   rf  r   Úformat_session_durationr’  r  r�   )r<   Zsession_durationÚpartsrA  Z
line_partsZdisplay_seprÀ   Útextrß   Zwith_markupr„   Zmain_markupÚdurationZduration_with_markupZmarkup_for_end_sepr?   r?   r@   r‚  ‰  s:    



zTerminalReporter.summary_statsc           
   	     s  ˆ j s
d S ddddœ‡ fdd„}dddœ‡ fdd	„}dddœ‡ fd
d„}dddœ‡ fdd„‰dddœ‡ fdd„‰dddœ‡ ‡‡fdd„}||t|dd�|t|dd�t|dd�dœ}g }ˆ j D ]}| |¡}|r¼||ƒ q¼|�rˆ jddddd� |D ]}	ˆ  |	¡ qôd S )Nrc  r.   r2   )r_  Ústatr8   c                  sT   ˆ j  |g ¡}|sd S ˆ j}|D ].}t |t¡}t||ˆ j|diƒ}|  |¡ q d S )NT)r»   rÜ   r|   Ú_color_for_typeÚ_color_for_type_defaultÚ _get_line_with_reprcrash_messager¿   rf  )r_  r¾  r%   r|   r0  rr   ri   rÕ   r?   r@   Úshow_simple²  s       ÿz8TerminalReporter.short_test_summary.<locals>.show_simplera  c           	        sˆ   ˆ j  dg ¡}|D ]p}| ˆ jtd di¡\}}ˆ jj|f|Ž}tˆ jˆ j|ƒ}|› d|› �}|j}|rx|dt	|ƒ 7 }|  
|¡ qd S )Nr)   r+   Tr~   ú - ©r»   rÜ   Ú_get_verbose_word_with_markupr|   r¿  r¿   rß   Ú_get_node_id_with_markupr  r.   rf  )	r_  r)   r0  Úverbose_wordÚverbose_markupÚmarkup_wordr¬   ri   r1  rÕ   r?   r@   Úshow_xfailed¾  s     
ÿz9TerminalReporter.short_test_summary.<locals>.show_xfailedc           	        sˆ   ˆ j  dg ¡}|D ]p}| ˆ jtd di¡\}}ˆ jj|f|Ž}tˆ jˆ j|ƒ}|› d|› �}|j}|rx|dt	|ƒ 7 }|  
|¡ qd S )Nr*   r+   Tr~   rÃ  rÄ  )	r_  r*   r0  rÇ  rÈ  rÉ  r¬   ri   r1  rÕ   r?   r@   Úshow_xpassedÍ  s     
ÿz9TerminalReporter.short_test_summary.<locals>.show_xpassedc              	     sÄ   ˆ j  dg ¡}|rtˆ j|ƒng }|s*d S |d  ˆ jtd di¡\}}ˆ jj|f|Ž}d}|D ]^\}}}	}
|
 	|¡r†|
t
|ƒd … }
|	d k	r¨|  d||||	|
f ¡ q`|  d||||
f ¡ q`d S )Nr'   r   r+   Tú	Skipped: z%s [%d] %s:%d: %sz%s [%d] %s: %s)r»   rÜ   Ú_folded_skipsr¾   rÅ  r|   r¿  r¿   rß   Ú
startswithr   rf  )r_  r'   ZfskipsrÇ  rÈ  rÉ  rè   Únumræ   r  r1  rÕ   r?   r@   Úshow_skipped_foldedÛ  s$     
ÿ
ÿz@TerminalReporter.short_test_summary.<locals>.show_skipped_foldedc           	        sÐ   ˆ j  dg ¡}|D ]¸}|jd k	s$t‚t|jtƒs>t||jfƒ‚t|jƒdksZt||jfƒ‚| ˆ jt	d di¡\}}ˆ j
j|f|Ž}tˆ j
ˆ j|ƒ}|› d|› �}|jd }|rÀ|dt|ƒ 7 }|  |¡ qd S )Nr'   rR  r+   Tr~   r   rÃ  )r»   rÜ   r™  r4  rü   r'  r   rÅ  r|   r¿  r¿   rß   rÆ  r.   rf  )	r_  r'   r0  rÇ  rÈ  rÉ  r¬   ri   r1  rÕ   r?   r@   Úshow_skipped_unfoldedï  s      
ÿ
zBTerminalReporter.short_test_summary.<locals>.show_skipped_unfoldedc                   s   ˆ j rˆ| ƒ nˆ| ƒ d S rÓ   )rÃ   )r_  ©r<   rÐ  rÑ  r?   r@   Úshow_skipped  s    
z9TerminalReporter.short_test_summary.<locals>.show_skippedr%   )r¾  r&   r,   )rÛ   rª  Úfr¡   Úpr¥   r  zshort test summary infoT)r%  rD  )r_   r   rÜ   r  r�   )
r<   rÂ  rÊ  rË  rÓ  ZREPORTCHAR_ACTIONSr_  r›   rW   ri   r?   rÒ  r@   rŠ  ®  s0    


ú	


z#TerminalReporter.short_test_summaryztuple[str, list[str]]c                 C  sB   | j d ks| jd ks| jr6|  ¡  | j s,t‚| js6t‚| j | jfS rÓ   )r¼   r½   r*  r  r4  rÕ   r?   r?   r@   r@    s
    

z TerminalReporter._get_main_color)Úunknown_type_seenr8   c                 C  sR   | j }d|ksd|krd}n2d|ks0d|ks0|r6d}nd|ksD| jsJd}nd}|S )	Nr%   r,   r  r+   r*   r  r&   r  )r»   r*  )r<   rÖ  r»   rA  r?   r?   r@   Ú_determine_main_color#  s    z&TerminalReporter._determine_main_colorc                 C  sP   g }| j D ]"}|r
|tkr
||kr
| |¡ q
ttƒ| | _|  t|ƒ¡| _d S rÓ   )r»   ÚKNOWN_TYPESrf  Úlistr½   r×  r0   r¼   )r<   Zunknown_typesZ
found_typer?   r?   r@   r  /  s    
z TerminalReporter._set_main_colorz-tuple[list[tuple[str, dict[str, bool]]], str]c                 C  s    | j  d¡r|  ¡ S |  ¡ S dS )a™  
        Build the parts used in the last summary stats line.

        The summary stats line is the line shown at the end, "=== 12 passed, 2 errors in Xs===".

        This function builds a list of the "parts" that make up for the text in that line, in
        the example above it would be:

            [
                ("12 passed", {"green": True}),
                ("2 errors", {"red": True}
            ]

        That last dict for each line is a "markup dictionary", used by TerminalWriter to
        color output.

        The final color of the line is also determined by this function, and is the second
        element of the returned tuple.
        ri  N)r|   rÐ   Ú&_build_collect_only_summary_stats_lineÚ _build_normal_summary_stats_linerÕ   r?   r?   r@   r¹  8  s    z)TerminalReporter.build_summary_stats_linez	list[Any])Úkeyr8   c                 C  s   | j  |g ¡}dd„ |D ƒS )zRGet test/collection reports for the given status key, such as `passed` or `error`.c                 S  s   g | ]}t |d dƒr|‘qS )r®   T)rG   rG  r?   r?   r@   rI  T  s      z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>rœ  )r<   rÜ  rž  r?   r?   r@   Ú_get_reports_to_displayQ  s    z(TerminalReporter._get_reports_to_displayc           	      C  s~   |   ¡ \}}g }|D ]N}|  |¡}|rt|ƒ}t |t¡}|dd||ki}| dt||ƒ |f¡ q|svdtdifg}||fS )NTrD  ú%d %szno tests ran)r@  rÝ  r   r¿  rÜ   rÀ  rf  Ú	pluralize)	r<   rA  Zknown_typesr»  rÜ  rž  rU   rr   rß   r?   r?   r@   rÛ  V  s    
z1TerminalReporter._build_normal_summary_stats_linec                 C  sê   t |  d¡ƒ}t |  d¡ƒ}| jdkr:dddifg}d}n€|dkrfd}dt| jd	ƒ }||difg}nT| j|k}|r†d}d
|› d�}n&d}| j| }|› d| j› d|› d�}||difg}|râtd }|dt|dƒ |difg7 }||fS )Nr(   r,   r   zno tests collectedr  Tr  z%d %s collectedÚtestzno tests collected (z deselected)r>  z tests collected (rÞ  )r   rÝ  r¸   rß  r¿  )r<   r(   rû   r»  rA  Zcollected_outputZall_tests_were_deselectedrN  r?   r?   r@   rÚ  i  s*    


z7TerminalReporter._build_collect_only_summary_stats_line)N)r”   )NN)r  )F)MrJ   rK   rL   r;   rÇ   ÚpropertyrÔ   rÖ   rY   rZ   rØ   ÚsetterrÚ   rÝ   rç   rì   rí   rú   rå   rá   r�   r  r  r  ri   r  r  r  r  r  r  r3  r*  r   r8  r/  r+  rä   r?  rF  rK  rJ  r`  r^  r]  rn  rl  rƒ  r€  rŒ  r�  r�  r  r—  r›  r�  r‡  rˆ  r‰  r©  r²  r°  r³  r…  r†  r¶  r„  r¯  r‚  rŠ  r@  r×  r  r¹  rÝ  rÛ  rÚ  r?   r?   r?   r@   rˆ   i  s¶   		ú  ü
L
%
6ú%n	rˆ   r   )Útwr|   r0  c                 C  sF   |  |j¡}| d¡^}}|r>| jd |¡dd�}|d | S |S d S )Nrà   TrP  )r‘  r¬   rã   rß   r   )rã  r|   r0  r¬   Úpathr»  Zparts_markupr?   r?   r@   rÆ  Š  s    rÆ  rv   r1   )r;  r„   r2  r8   c                 C  sœ   |  d¡}|dkr|d|… }d}t|  d¡ƒ}|t|ƒ |krDdS |t|ƒ |kr’|t|ƒ8 }|d|… }|t|ƒ |krŠ|dd… }ql||7 }|  |¡S )z€Format msg into format, ellipsizing it if doesn't fit in available_width.

    Returns None if even the ellipsis can't fit.
    rï   rj  Nz...r”   )Úfindr   r;  r   )r;  r„   r2  ÚiÚellipsisZformat_widthr?   r?   r@   r-  ”  s    
r-  zdict[str, bool])r|   r0  rã  Úword_markupr8   c                 C  s¬   |  | |¡\}}|j|f|Ž}t|| |ƒ}|› d|› �}t|ƒ}	z|jjj}
W n tk
rb   Y nFX tƒ sv| j	j
dkr‚d|
› �}
n|j|	 }td|
|ƒ}
|
dk	r¨||
7 }|S )z?Get summary line for a report, trying to add reprcrash message.r~   r   rÃ  z - {}N)rÅ  rß   rÆ  r   r™  r�  r«   rš  r   rŒ   rV   rÀ   r-  )r|   r0  rã  rè  rÇ  rÈ  rR   r  ri   Ú
line_widthr„   r2  r?   r?   r@   rÁ  ­  s&     ÿ
rÁ  r   zSequence[CollectReport]z&list[tuple[int, str, int | None, str]])r¾   r'   r8   c                 C  sè   i }|D ]°}|j d k	st‚t|j tƒs4t||j fƒ‚t|j ƒdksPt||j fƒ‚|j \}}}t| t|ƒƒ}t|di ƒ}|jdkrœd|krœd|krœ|d |f}n
|||f}| 	|g ¡ 
|¡ qg }	| ¡ D ]\}}
|	 
t|
ƒf|˜¡ qÆ|	S )NrR  Úkeywordsr£   ÚskipZ
pytestmark)r™  r4  rü   r'  r   r    r   rG   r§   r
  rf  r	  )r¾   r'   ÚdÚeventræ   r  r1  rê  rÜ  rC   Úeventsr?   r?   r@   rÍ  Ë  s*    ÿþý
rÍ  r  r  r  )r%   r,   r+   r&   ztuple[int, str])rU   Únounr8   c                 C  s4   |dkr| |fS |  dd¡}| | dkr.|d n|fS )N)r,   r+   rà  r+   ÚwarningrE   r¡   )rš   )rU   rï  r?   r?   r@   rß  ó  s    rß  rc  rÍ   c                 C  sP   g }| D ]B\}}|j › d|j› �}| d¡r8|dd … }||kr| |¡ q|S )NrS  zpytest-é   )Úproject_namerY  rÎ  rf  )rh  rC   r  Údistry  r?   r?   r@   rg     s    
rg  Úfloat)Úsecondsr8   c                 C  s:   | dk r| d›d�S t jt| ƒd�}| d›d|› d�S dS )zQFormat the given seconds in a human readable manner to show in the final summary.é<   z.2fr¡   )rõ  zs (r"  N)ÚdatetimeÚ	timedeltarv   )rõ  Údtr?   r?   r@   rº    s    rº  r#   c                 C  s„   t | dƒr.| j}| d¡r*|tdƒd… }|S | js8t‚t| jtƒsHt‚| j\}}}| d¡rp|tdƒd… }n|dkr|d}|S dS )zqGet the reason string of a skip/xfail/xpass test report.

    The string is just the part given by the user.
    r  zreason: NrÌ  ZSkippedr”   )	r(  r  rÎ  r   r'   r4  rü   r™  r'  )rŸ   r1  rB  r?   r?   r@   r,    s    



r,  )VrM   Ú
__future__r   ÚargparseÚcollectionsr   Údataclassesr÷  Ú	functoolsr   ru  Úpathlibr   rV  r‰   r÷   Útypingr   r   r   r	   r
   r   r   r   r   r   r   r+   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Ø  rw   ÚActionr-   rO   rz   r‘   rœ   r©   Ú	dataclassrª   rˆ   rÆ  r-  rÁ  rÍ  r¿  rÀ  rß  rg  rº  r,  r?   r?   r?   r@   Ú<module>   s¦   %         (
 ü	