a
    *ñ»jì  ã                   @  s\  d 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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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+Zddl,m-Z- ddl.m/Z/ ddl.m0Z0 ddl.m1Z1 ddl.m2Z2 ddl3m4Z4 ddl5m6Z6 dd l5m7Z7 dd!l8m9Z9 dd"l8m:Z: dd#l;m<Z< dd$l;m=Z= dd%l;m>Z> e�r
dd&l?m@Z@ d'ZAd(ZBd)ZCG d*d+„ d+ejDƒZEG d,d-„ d-eƒZFd.d/d0œd1d2„ZGd3d/d4œd5d6„ZHd3d7d4œd8d9„ZIe2d:d;�d<d=d>œd?d@„ƒZJejKG dAdB„ dBƒƒZLeG dCdD„ dDƒƒZMdEd3d<dFœdGdH„ZNd7d7dIdJdKœdLdM„ZOd3d<dEdNd7dOœdPdQ„ZPdRdSdTdUœdVdW„ZQdXdXdYdZd[œZRdYZSdId7d\d]œd^d_„ZTd`daœdbdc„ZUddd7deœdfdg„ZVddd7deœdhdi„ZWdjd7d>œdkdl„ZXdS )mzsTerminal reporting of the full testing process.

This is a good source for looking at the various reporting hooks.
é    )ÚannotationsN)ÚCounter)ÚCallable)Ú	Generator)ÚMapping)ÚSequence)Úpartial)ÚPath)ÚAny)ÚClassVar)Úfinal)ÚLiteral)Ú
NamedTuple)ÚTextIO)ÚTYPE_CHECKING)Úcompat)Ú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   )r4   r5   Únargsr6   r7   r8   )ÚsuperÚ__init__)Úselfr4   r5   r6   r7   r8   ©Ú	__class__© ú6E:\soccer\ml_env\Lib\site-packages\_pytest/terminal.pyr<   T   s    úzMoreQuietAction.__init__zargparse.ArgumentParserzargparse.Namespacezstr | Sequence[object] | None)ÚparserÚ	namespaceÚvaluesÚoption_stringr9   c                 C  s6   t || jdƒd }t|| j|ƒ t |ddƒd |_d S )Nr   é   Úquiet)Úgetattrr5   ÚsetattrrG   )r=   rB   rC   rD   rE   Z	new_countr@   r@   rA   Ú__call__e   s    zMoreQuietAction.__call__)NFN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   rJ   Ú__classcell__r@   r@   r>   rA   r.   M   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)rK   rL   rM   rN   Ú__annotations__r@   r@   r@   rA   rP   r   s   
rP   r   r3   )rB   r9   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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d0dd1d� |jd2dd0d3d4� |jd5d6d$d7d8g d9¢d:d;� |jd<dd=dd>d� |jd?d$d@g dA¢dBdCdD� |jdEdFdddGdH� |jdIdJd$dJd8g dK¢dLd;� |jdMdNdNdOgdPdQ� | jdRdSdTdU� tj| tj	dVdW� d S )XNzterminal reportingZ	ReportingZgeneral)Úafterz-vz	--verboseÚcountr   ÚverbosezIncrease verbosity)Úactionr6   r5   r8   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.)rX   r5   r6   r8   z--force-short-summaryÚforce_short_summaryz=Force condensed summary output regardless of verbosity level.z-qz--quietzDecrease verbosityz--verbosityzSet verbosity. Default: 0.)r5   Útyper6   r8   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').)rX   r5   r6   Úmetavarr8   z--disable-warningsz--disable-pytest-warningsÚdisable_warningszDisable warnings summary)r6   r5   rX   r8   z-lz--showlocalsZ
showlocalsz/Show locals in tracebacks (disabled by default)z--no-showlocalszFHide locals in tracebacks (negate --showlocals passed through addopts))rX   r5   r8   z--tbÚstyleÚtbstyleÚauto)rg   ÚlongÚshortÚnoÚlineÚnativez5Traceback print mode (auto/long/short/line/native/no))rc   rX   r5   r6   Úchoicesr8   z
--xfail-tbÚxfail_tbz1Show tracebacks for xfail (as long as --tb != no)z--show-captureÚshowcapture)rj   ÚstdoutÚstderrÚlogÚallrs   zOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)rX   r5   rm   r6   r8   z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))rX   r6   r8   z--colorÚcolor)Úyesrj   rg   z#Color terminal output (yes/no/auto)z--code-highlightru   rj   zSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r6   rm   r8   Ú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)r8   r6   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.)r8   )
ZgetgroupZ
_addoptionZ	addoptionr.   ÚintÚ_REPORTCHARS_DEFAULTZaddinir   Z_add_verbosity_iniÚVERBOSITY_TEST_CASES)rB   Úgroupr@   r@   rA   Úpytest_addoption†   s   úûûûûúûúúúüù	ûú	ûù	üûür|   r   ©Úconfigr9   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@   rA   Úmywriter$  s    z"pytest_configure.<locals>.mywriterzpytest:config)ÚTerminalReporterÚsysrp   ÚpluginmanagerÚregisterÚoptionÚdebugÚtraceconfigÚtraceÚrootZsetprocessor)r~   r‰   r@   r‡   rA   Úpytest_configure  s
    r“   r/   c                 C  s¢   | j j}ddh}d}|D ]N}||v r,| ¡ }|dkr:d}q|dkrHd}q|dkrVd}q||vr||7 }q| j js‚d	|vr‚d	| }n| j jržd	|v rž| d	d¡}|S )
NÚFÚSÚ ÚaZsxXEfÚAZPpsxXEfÚNÚw)rŽ   ra   Úlowerrd   Úreplace)r~   ra   Zold_aliasesZ
reportoptsÚcharr@   r@   rA   Úgetreportopt+  s&    

rž   T©Ztrylastr"   ztuple[str, str, str]©Úreportr9   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¡   rR   r¨   r@   r@   rA   Úpytest_report_teststatusD  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/   ÚmessageNr2   Ú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@   rA   Úget_locationf  s    
zWarningReport.get_location)	rK   rL   rM   rN   rT   r®   r¯   r°   r¶   r@   r@   r@   rA   r¬   T  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 | Noner3   )r~   Úfiler9   c                 C  sÌ   dd l }|| _d| _d | _d | _i | _d | _d | _|jj	| _
|d u rJtj}|j ||¡| _| jj| _d | _t|ƒ| _|jj| _| jj| _t | ¡ ¡| _tƒ | _tƒ | _|  ¡ | _t  !¡ | _"d | _#d | _$d S ©Nr   )%Ú_pytest.configr~   Ú_numcollectedÚ_sessionÚ_showfspathÚstatsÚ_main_colorÚ_known_typesr²   r³   Ú	startpathr‹   rp   Zcreate_terminal_writerÚ_twÚ	fullwidthÚ_screen_widthÚcurrentfspathrž   ra   rŽ   r]   ÚfoldskippedZ	hasmarkupr   ZCallableBoolÚisattyÚsetÚ_progress_nodeids_reportedÚ_timing_nodeids_reportedÚ_determine_show_progress_infoÚ_show_progress_infor   ÚInstantÚ_collect_report_last_writeÚ_already_displayed_warningsÚ_keyboardinterrupt_memo)r=   r~   r·   Ú_pytestr@   r@   rA   r<   s  s0    






zTerminalReporter.__init__z,Literal['progress', 'count', 'times', False]©r9   c                 C  sp   | j  dd¡dkr&| j  d¡dkr&dS | j  dd¡r8dS | j  d¡}|dv rPdS |d	kr\d	S |d
krhd
S dS dS )zRReturn whether we should display progress information based on the current config.Úcapturerj   rv   úprogress-even-when-capture-noFZ	setupshow>   rw   rÓ   rw   rV   ÚtimesN)r~   Ú	getoptionÚgetini)r=   Úcfgr@   r@   rA   rÊ   ‘  s"    ÿ
ÿþz.TerminalReporter._determine_show_progress_inforx   c                 C  s   | j jj}|S ©N)r~   rŽ   rW   )r=   Ú	verbosityr@   r@   rA   rÙ   ª  s    
zTerminalReporter.verbosityr1   c                 C  s
   | j dkS r¸   )rÙ   ©r=   r@   r@   rA   Ú
showheader¯  s    zTerminalReporter.showheaderc                 C  s   t | jjjƒS rØ   )r1   r~   rŽ   rZ   rÚ   r@   r@   rA   rZ   ³  s    zTerminalReporter.no_headerc                 C  s   t | jjjƒS rØ   )r1   r~   rŽ   r[   rÚ   r@   r@   rA   r[   ·  s    zTerminalReporter.no_summaryc                 C  s"   | j d u r| j tj¡dkS | j S r¸   )r¼   r~   Úget_verbosityr   rz   rÚ   r@   r@   rA   Ú
showfspath»  s    
zTerminalReporter.showfspathzbool | None)Úvaluer9   c                 C  s
   || _ d S rØ   )r¼   )r=   rÞ   r@   r@   rA   rÝ   Á  s    c                 C  s   | j  tj¡dkS r¸   )r~   rÜ   r   rz   rÚ   r@   r@   rA   ÚshowlongtestinfoÅ  s    z!TerminalReporter.showlongtestinfor/   )r�   r9   c                 C  s   dddœ  ||¡}|| jv S )NÚxr£   )r*   r(   )Úgetra   )r=   r�   r@   r@   rA   ÚhasoptÉ  s    zTerminalReporter.hasopt)r®   ÚresÚmarkupr9   c                 K  sŠ   | j j| d¡d  }| jd u s*|| jkrn| jd u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Á   rk   Úwrite)r=   r®   rã   rä   ÚfspathZ	relfspathr@   r@   rA   Úwrite_fspath_resultÍ  s    
z$TerminalReporter.write_fspath_resultr–   )ÚprefixÚextrar9   c                 K  sH   | j |kr&| j ¡  || _ | j |¡ |rD| jj|fi |¤Ž d| _ d S )Néþÿÿÿ)rÄ   rÁ   rk   rê   )r=   rí   rî   Úkwargsr@   r@   rA   Úwrite_ensure_prefixØ  s    

z$TerminalReporter.write_ensure_prefixc                 C  s   | j r| j ¡  d | _ d S rØ   )rÄ   rÁ   rk   rÚ   r@   r@   rA   Úensure_newlineá  s    
zTerminalReporter.ensure_newlineFé   Ú
)ræ   ÚmarginÚline_sep)Úcontentræ   rõ   rö   rä   r9   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@   rA   Ú
wrap_writeæ  s    

üÿzTerminalReporter.wrap_write)ræ   )r÷   ræ   rä   r9   c                K  s   | j j|fd|i|¤Ž d S )Nræ   )rÁ   rê   )r=   r÷   ræ   rä   r@   r@   rA   rê   ü  s    zTerminalReporter.writec                 C  s   | j  ¡  d S rØ   )rÁ   ræ   rÚ   r@   r@   rA   ræ   ÿ  s    zTerminalReporter.flushzstr | bytes)rk   rä   r9   c                 K  s6   t |tƒst|dd�}|  ¡  | jj|fi |¤Ž d S )Nrœ   )Úerrors)Ú
isinstancer/   rò   rÁ   rk   )r=   rk   rä   r@   r@   rA   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.
        ÚeraseFrF   r€   r–   úN)ÚpoprÁ   rÂ   Úlenr/   rê   )r=   rk   rä   r  Z
fill_countÚfillr@   r@   rA   Úrewrite  s    	
zTerminalReporter.rewriter2   z
int | None)ÚsepÚtitlerÂ   rä   r9   c                 K  s$   |   ¡  | jj|||fi |¤Ž d S rØ   )rò   rÁ   r  )r=   r  r	  rÂ   rä   r@   r@   rA   Ú	write_sep  s    zTerminalReporter.write_sepú=)r	  r  Úkwr9   c                 K  s   | j j||fi |¤Ž d S rØ   )rÁ   r  )r=   r	  r  r  r@   r@   rA   Úsection$  s    zTerminalReporter.section)r†   r  r9   c                 K  s   | j j|fi |¤Ž d S rØ   )rÁ   rk   )r=   r†   r  r@   r@   rA   rk   '  s    zTerminalReporter.linezSequence[Any])rQ   Úitemsr9   c                 C  s.   || j v}| j  |g ¡ |¡ |r*|  ¡  d S rØ   )r½   Ú
setdefaultÚextendÚ_set_main_color)r=   rQ   r  Zset_main_colorr@   r@   rA   Ú
_add_stats*  s    
zTerminalReporter._add_statsr   )Úexcreprr9   c                 C  s&   t |ƒ d¡D ]}|  d| ¡ qdS )Nrô   zINTERNALERROR> T)r/   rè   rƒ   )r=   r  rk   r@   r@   rA   Úpytest_internalerror0  s    z%TerminalReporter.pytest_internalerrorzwarnings.WarningMessage)Úwarning_messager®   r9   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@   rA   Úpytest_warning_recorded5  s    ÿz(TerminalReporter.pytest_warning_recordedr   )Úpluginr9   c                 C  s"   | j jjrd|› �}|  |¡ d S )NzPLUGIN registered: )r~   rŽ   r�   rƒ   )r=   r  r†   r@   r@   rA   Úpytest_plugin_registeredD  s    

z)TerminalReporter.pytest_plugin_registeredzSequence[Item])r  r9   c                 C  s   |   d|¡ d S )Nr)   )r  )r=   r  r@   r@   rA   Úpytest_deselectedL  s    z"TerminalReporter.pytest_deselectedztuple[str, int | None, str])r®   Úlocationr9   c                 C  sT   |\}}}| j r6|  ||||¡}|  |d¡ |  ¡  n| jrP|  |d¡ |  ¡  d S )Nr–   )rß   Ú_locationlinerñ   ræ   rÝ   rì   )r=   r®   r  rë   r  Údomainrk   r@   r@   rA   Úpytest_runtest_logstartO  s    

z(TerminalReporter.pytest_runtest_logstartr$   r    c                 C  sl  d| _ |}t| jjj|| jd�Ž }|j|j|j  }}}t|t	ƒsHd }n|\}}|  
||g¡ |sj|sjd S |d u 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i |¤Ž | j�r`| j�s`|  ¡  �nF| j|jg|j¢R Ž }	t|dƒ}
|
�sæ| j|	|fi |¤Ž |j�sht|dƒ�rÔt|ƒ}| j tj¡d	k �r®| jj| jj t d
ƒ d }t!d||ƒ}nd|› d�}|�rÔ|d u�rÔ|  "|¡ | j�r`|  #¡  nz|  $¡  | 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%]rF   z ({})z (ú)ú[ú]r€   )Úcyanrï   )+Z
_tests_ranrP   r~   Úhookr«   rQ   rR   rS   r  Útupler  Úhasattrr'   r&   r(   rÈ   Úaddr®   rÜ   r   rz   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ã   rQ   rR   rS   rä   Z	was_xfailrk   Zrunning_xdistÚreasonÚavailable_widthZformatted_reasonr@   r@   rA   Úpytest_runtest_logreport]  sx    ÿ








ÿþÿÿ

ÿz)TerminalReporter.pytest_runtest_logreportc                 C  s    | j d usJ ‚t| jƒ| j jkS rØ   )r»   r  rÈ   ÚtestscollectedrÚ   r@   r@   rA   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   rz   rË   rÈ   ré   )r=   Úresultr@   r@   rA   Úpytest_runtestloop®  s    ÿþýz#TerminalReporter.pytest_runtestloopc           
        s~  ˆj s
J ‚ˆj j}ˆjdkrh|rVtˆjƒ}dtt|ƒƒ› d�}d|› d�}| ||¡S d|› d|› d�S ˆjd	k�rX|s|d
S ˆ d¡ˆ d¡ ˆ d¡ ˆ d¡ ˆ d¡ ˆ d¡ ˆ d
¡ }|d jd ‰ ‡fdd„|D ƒ}t	‡ fdd„ˆj j
D ƒƒ}t	‡ fdd„|D ƒƒ}||k}	ˆj�s(|	�rTˆj dd„ |D ƒ¡ tt	dd„ |D ƒƒƒS d
S |�rzdtˆjƒd | d›d�S dS )NrV   z{:zd}ú [z/{}]z [ ú / z ]rÔ   r–   r'   r+   r&   r*   r(   r-   éÿÿÿÿr   c                   s   g | ]}|j ˆ jvr|‘qS r@   )r®   rÉ   ©Ú.0ÚrrÚ   r@   rA   Ú
<listcomp>Ó  s   zFTerminalReporter._get_progress_information_message.<locals>.<listcomp>c                 3  s   | ]}|j d  ˆ kV  qdS )r   N)r  )rA  Úi©Úcurrent_locationr@   rA   Ú	<genexpr>Ö  s   zETerminalReporter._get_progress_information_message.<locals>.<genexpr>c                 3  s&   | ]}|j d  ˆ kr|jdkV  qdS )r   r¥   N)r  r©   r@  rE  r@   rA   rG  Ù  s   þc                 s  s   | ]}|j V  qd S rØ   ©r®   r@  r@   r@   rA   rG  à  ó    c                 s  s   | ]}t |tƒr|jV  qd S rØ   )r  r$   Údurationr@  r@   r@   rA   rG  â  rI  éd   Z3dz%]r&  )r»   r9  rË   r  rÈ   r/   ÚformatÚ_get_reports_to_displayr  Úsumr  rß   rÉ   ÚupdateÚformat_node_duration)
r=   Ú	collectedrw   Zcounter_formatÚformat_stringZall_reportsZnot_reportedZtests_in_moduleZtests_completedZlast_in_moduler@   )rF  r=   rA   r4  ¼  s\    


ÿþýüûúÿ	
ÿÿþÿz2TerminalReporter._get_progress_information_messagec                 C  s    | j }| jdkr:| jsJ ‚| jj}td|› d|› d�ƒ}n| jdkrNtdƒ}ntdƒ}|| d | jk}|rœ|  ¡ \}}|  ¡ }| jj	|d	 fi |d
i¤Ž d S )NrV   r=  ú/r)  rÔ   z 99h 59mr&  rF   rô   T)
Ú_width_of_current_linerË   r»   r9  r  rÃ   Ú_get_main_colorr4  rÁ   rê   )r=   rš   Z	num_testsZprogress_lengthZ	past_edgeÚ
main_colorÚ_r†   r@   r@   rA   r0  é  s    



z9TerminalReporter._write_progress_information_if_past_edgec                 C  sN   |   ¡ \}}|  ¡ }| j}| jj| d }| j| |¡fddi|di¤Ž d S )NrF   ræ   T)rU  r4  rT  rÁ   rÂ   rê   Úrjust)r=   rt   rW  r†   rš   r  r@   r@   rA   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@   rA   rT     s    z'TerminalReporter._width_of_current_linec                 C  sJ   |   ¡ r(| jjjdkrF| jdddd� n| jjjdkrF| jdddd� d S )Nr   zcollecting ... T)ræ   ÚboldrF   )rÆ   r~   rŽ   rW   rê   rÚ   r@   r@   rA   Ú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  _|  ¡ r\|  ¡  d S )Nr-   r(   c                 S  s   g | ]}t |tƒr|‘qS r@   )r  r   ©rA  rà   r@   r@   rA   rC    rI  z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)r&   r  r(   r;  rº   r  rÆ   Úreport_collect)r=   r¡   r  r@   r@   rA   Úpytest_collectreport  s    z%TerminalReporter.pytest_collectreport)r   r9   c                 C  sF  | j jjdk rd S |s4| j ¡ jtk r*d S t ¡ | _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|dkr¾d
nd	› �7 }|rÜ|d|› d�7 }|rð|d|› d�7 }| j|k�r|d|› d�7 }|  ¡ �r8| j|ddd� |�rB|  d¡ n
|  |¡ d S )Nr   r-   r(   r)   z
collected zcollecting z itemrF   r–   r£   r>  z errorz deselectedz skippedz	 selectedT)rY  r  rô   )r~   rŽ   rW   rÍ   ÚelapsedÚsecondsÚREPORT_COLLECTING_RESOLUTIONr   rÌ   r  r½   rá   rº   r/   rÆ   r  rê   rƒ   )r=   r   r   r(   r)   Úselectedrk   r@   r@   rA   r\    s<    
ÿÿ

ÿ 
zTerminalReporter.report_collectrŸ   r%   )Úsessionr9   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©rY  z	platform z -- Python Úpypy_version_infor¢   é   z[pypy-ú-r)  z	, pytest-z	, pluggy-r   Zpastebinz -- )r~   Ú
start_path)r»   r   rÌ   Ú_session_startrÛ   r
  ÚplatformÚpython_versionrZ   r‹   rH   r�   r‚   r/   rÐ   Ú_versionÚversionÚpluggyÚ__version__rÙ   r~   rŽ   r�   Ú
executablerƒ   r+  Úpytest_report_headerrÀ   Ú_write_report_lines_from_hooks)r=   rb  Zverinfor†   rd  Úlinesr@   r@   rA   Úpytest_sessionstart:  s2    
ÿþý
ÿz$TerminalReporter.pytest_sessionstartzSequence[str | Sequence[str]]©rr  r9   c                 C  s<   t |ƒD ].}t|tƒr"|  |¡ q|D ]}|  |¡ q&qd S rØ   )Úreversedr  r/   rƒ   )r=   rr  Zline_or_linesrk   r@   r@   rA   rq  U  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Ö   rL  r�   rŒ   Zlist_plugin_distinfoÚ_plugin_nameversions)r=   r~   r;  rw  Ú
plugininfor@   r@   rA   rp  _  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~   rg  r  Úcollectonlyr?  r–   r&   ú!zcollection failures)r\  r~   r+  Zpytest_report_collectionfinishrÀ   r  rq  rÕ   rŽ   rW   rÁ   rk   Ú_printcollecteditemsr½   rá   r  Ú
toterminal)r=   rb  rr  r&   r5  r@   r@   rA   Úpytest_collection_finishp  s"    
ý
z)TerminalReporter.pytest_collection_finishc              	   C  s\  | j  tj¡}|dk rz|dk r^tdd„ |D ƒƒ}t| ¡ ƒD ]\}}| j |› d|› �¡ q<n|D ]}| j |j	¡ qbd 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 |¡¡ �q4qÎq†d S )Nr   r?  c                 s  s    | ]}|j  d d¡d V  qdS ©rå   rF   r   N)r®   rè   )rA  Úitemr@   r@   rA   rG  Š  rI  z8TerminalReporter._printcollecteditems.<locals>.<genexpr>ú: r–   rF   ú  Úobjz{}{})r~   rÜ   r   rz   r   Úsortedr  rÁ   rk   r®   Z	listchainr  r  ry  rH   ÚinspectÚgetdocÚ
splitlinesrL  )r=   r  Ztest_cases_verbosityÚcountsÚnamerV   r‚  ÚstackÚindentZneeded_collectorsÚcolr…  Údocrk   r@   r@   rA   r~  †  s6    

z%TerminalReporter._printcollecteditemszint | ExitCodezGenerator[None])rb  Ú
exitstatusr9   c                 c  s¬   d V }| j  d¡ tjtjtjtjtjf}||v 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~   r}  T)r#  )rÁ   rk   r   ÚOKZTESTS_FAILEDZINTERRUPTEDZUSAGE_ERRORZNO_TESTS_COLLECTEDr[   r~   r+  Úpytest_terminal_summaryZ
shouldfailr
  r/   Ú_report_keyboardinterruptrÏ   Z
shouldstopÚsummary_stats)r=   rb  r�  r;  Zsummary_exit_codesr@   r@   rA   Úpytest_sessionfinish¤  s*    ûÿ
z%TerminalReporter.pytest_sessionfinishc                 c  s`   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  zd V W |  ¡  |  ¡  S |  ¡  |  ¡  0 d S rØ   )Úsummary_errorsÚsummary_failuresÚsummary_xfailuresÚsummary_warningsÚsummary_passesÚsummary_xpassesÚshort_test_summaryrÚ   r@   r@   rA   r’  ¿  s    ü  þz(TerminalReporter.pytest_terminal_summaryzExceptionInfo[BaseException])Úexcinfor9   c                 C  s   |j dd�| _d S )NT)Zfuncargs)ZgetreprrÏ   )r=   r�  r@   r@   rA   Úpytest_keyboard_interruptÎ  s    z*TerminalReporter.pytest_keyboard_interruptc                 C  s   | j d ur|  ¡  d S rØ   )rÏ   r“  rÚ   r@   r@   rA   Úpytest_unconfigureÑ  s    
z#TerminalReporter.pytest_unconfigurec                 C  sv   | j }|d usJ ‚|jd us J ‚|jj}|  d|¡ d|v rr| jjjrT| | j¡ n|j | j¡ | jj	ddd� d S )Nr}  ÚKeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)r"  )
rÏ   Ú	reprcrashr­   r
  r~   rŽ   Z	fulltracer  rÁ   rk   )r=   r  r†   r@   r@   rA   r“  Õ  s    
þz*TerminalReporter._report_keyboardinterrupt)r®   rë   r  r  r9   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®   r9   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®   rk   rD   ©r  r=   r@   rA   Ú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¥  rA   r  å  s    
ÿzTerminalReporter._locationlinec                 C  s   |j }|r|S dS )Nztest session)Ú	head_line)r=   r5  r¨  r@   r@   rA   Ú_getfailureheadlineü  s    z$TerminalReporter._getfailureheadlinec                 C  sV   zt |jjƒW S  tyP   zt |jƒd d… W  Y S  tyJ   Y Y dS 0 Y n0 d S )Né2   r–   )r/   Úlongreprr¡  ÚAttributeError)r=   r5  r@   r@   rA   Ú_getcrashline  s    zTerminalReporter._getcrashline)r‹  c                 C  s   dd„ | j  |d¡D ƒS )Nc                 S  s   g | ]}t |d ƒs|‘qS )Z	_pdbshown)r-  r[  r@   r@   rA   rC    rI  z/TerminalReporter.getreports.<locals>.<listcomp>r@   ©r½   rá   )r=   r‹  r@   r@   rA   Ú
getreports  s    zTerminalReporter.getreportsc                   s&  ˆ   d¡�r"ˆ j d¡}|s d S ˆ jd u}|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/   )Úreportsr9   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 r�  )r/   rè   )rA  Úlocr@   r@   rA   rG  .  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{}rF   r£   r–   N)rL  )rA  ÚkÚvr@   r@   rA   rG  1  s   ÿ)	r¶   r~   ry  r  r�   r‚   r/   r   r  )r°  Ú	locationsrš   r  Zcounts_by_filenamerÚ   r@   rA   Úcollapsed_location_report$  s    ÿ
þzDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportzwarnings summary (final)zwarnings summaryr  TF)r"  rY  rô   c                 s  s   | ]}d | V  qdS )r„  Nr@   r[  r@   r@   rA   rG  =  rI  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­   ry  r
  r  rÁ   rk   r‰  r�   Úrstrip)r=   Zall_warningsr   Zwarning_reportsZreports_grouped_by_messageÚwrr¶  r	  r­   Zmessage_reportsZmaybe_locationrr  Zindentedr@   rÚ   rA   r™    s<    


ÿz!TerminalReporter.summary_warningsc                 C  s   |   ddd¡ d S )Nr'   ZPASSESÚP©Úsummary_passes_combinedrÚ   r@   r@   rA   rš  G  s    zTerminalReporter.summary_passesc                 C  s   |   ddd¡ d S )Nr+   ZXPASSESÚXrº  rÚ   r@   r@   rA   r›  J  s    z TerminalReporter.summary_xpasses)Úwhich_reportsÚ	sep_titleÚ
needed_optr9   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 )Nrj   r  rW  T)r!  rY  )r~   rŽ   rf   râ   r¯  r
  Úsectionsr©  Ú_outrep_summaryÚ_handle_teardown_sectionsr®   )r=   r½  r¾  r¿  r°  r5  r†   r@   r@   rA   r»  M  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®   )rA  r¡   rH  r@   rA   rC  _  s   þz:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r¯  )r=   r®   r°  r@   rH  rA   Ú_get_teardown_reports]  s    

þz&TerminalReporter._get_teardown_reportsc                 C  s   |   |¡D ]}|  |¡ q
d S rØ   )rÃ  Úprint_teardown_sections)r=   r®   r¡   r@   r@   rA   rÂ  e  s    z*TerminalReporter._handle_teardown_sections)r5  r9   c                 C  sz   | j jj}|dkrd S |jD ]X\}}|dkr6||vr6qd|v r| j d|¡ |dd … dkrh|d d… }| j |¡ qd S )Nrj   rs   r¦   rf  r?  rô   )r~   rŽ   ro   rÀ  rÁ   r  rk   ©r=   r5  ro   Zsecnamer÷   r@   r@   rA   rÄ  i  s    
z(TerminalReporter.print_teardown_sectionsc                 C  s   | j jj}| jdd|d� d S )Nr&   ZFAILURES©re   )r~   rŽ   rf   Úsummary_failures_combined)r=   re   r@   r@   rA   r—  v  s    
z!TerminalReporter.summary_failuresc                 C  s0   | j jj}|r| j jjnd}| jdd|d� d S )Nrj   r*   Z	XFAILURESrÆ  )r~   rŽ   rn   rf   rÇ  )r=   Zshow_tbre   r@   r@   rA   r˜  z  s    
z"TerminalReporter.summary_xfailures)r¿  )r½  r¾  re   r¿  r9   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 )Nrj   r  rk   rW  T©r#  rY  )	râ   r¯  r
  r­  rƒ   r©  rÁ  rÂ  r®   )	r=   r½  r¾  re   r¿  r°  r5  rk   r†   r@   r@   rA   rÇ    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 )Nrj   r-   r  ZERRORSr¤   zERROR collecting z	ERROR at z of rW  TrÈ  )	r~   rŽ   rf   r¯  r
  r½   r©  r©   rÁ  )r=   r°  r5  r†   r@   r@   rA   r–  ˜  s    



zTerminalReporter.summary_errorsr"   c                 C  s~   |  | j¡ | jjj}|dkr"d S |jD ]P\}}|dkrB||vrBq(| j d|¡ |dd … dkrl|d d… }| j |¡ q(d S )Nrj   rs   rf  r?  rô   )r  rÁ   r~   rŽ   ro   rÀ  r  rk   rÅ  r@   r@   rA   rÁ  §  s    
z TerminalReporter._outrep_summaryc                 C  sR  | j dk rd S | j ¡ }|  ¡ \}}g }| j dk}|r>| jj}|D ]>\}}| jj|fi |¤Ž}	|rv|t|	ƒt|ƒ 7 }| |	¡ qBd 	|¡}
|di}dt
|jƒ› �}| jj|fi |¤Ž}|rÐ|t|ƒt|ƒ 7 }|
|7 }
|�r| jjdi |¤Ž}| d¡�r|d d… }|t|ƒ7 }|
|7 }
|�r<| jd	|
fd
|i|¤Ž n| j|
fi |¤Ž d S )Nr?  r   rx  Tz in r–   z[0méüÿÿÿr  rÂ   )r–   )rÙ   rh  r^  Úbuild_summary_stats_linerÁ   rÂ   rä   r  ry  r�   Úformat_session_durationr_  r¤  r
  rƒ   )r=   Zsession_durationÚpartsrV  Z
line_partsZdisplay_seprÂ   Útexträ   Zwith_markupr†   Zmain_markuprJ  Zduration_with_markupZmarkup_for_end_sepr@   r@   rA   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 )Nrv  r/   r3   )rr  Ústatr9   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Á   ry  )rr  rÎ  r&   r~   r5  rt   rk   rÚ   r@   rA   Úshow_simpleÝ  s    ÿz8TerminalReporter.short_test_summary.<locals>.show_simplert  c           	        sŒ   ˆ j  dg ¡}|D ]t}| ˆ 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_markupr   r/   ry  )	rr  r*   r5  Úverbose_wordÚverbose_markupÚmarkup_wordr®   rk   r6  rÚ   r@   rA   Úshow_xfailedé  s    ÿz9TerminalReporter.short_test_summary.<locals>.show_xfailedc           	        sŒ   ˆ j  dg ¡}|D ]t}| ˆ 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Ô  )	rr  r+   r5  r×  rØ  rÙ  r®   rk   r6  rÚ   r@   rA   Ú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 ]v\}}}	}
|
 	|¡rŠ|
t
|ƒd … }
|	d urº|  |› d|› d|› d|	› d	|
› �	¡ qd|  |› d|› d|› d	|
› �¡ qdd S )
Nr(   r   r,   Tú	Skipped: r=  z] r±   rƒ  )r½   rá   Ú_folded_skipsrÀ   rÕ  r~   rÏ  rÁ   rä   Ú
startswithr  ry  )rr  r(   Zfskipsr×  rØ  rÙ  rí   Únumrë   r  r6  rÚ   r@   rA   Ú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sZJ ||jfƒ‚| ˆ jtd di¡\}}ˆ j	j
|fi |¤Ž}tˆ j	ˆ j|ƒ}|› d|› �}|jd }|rÄ|dt|ƒ 7 }|  |¡ qd S )Nr(   re  r,   Tr€   r%  rÓ  )r½   rá   r«  r  r,  r  rÕ  r~   rÏ  rÁ   rä   rÖ  r/   ry  )	rr  r(   r5  r×  rØ  rÙ  r®   rk   r6  rÚ   r@   rA   Úshow_skipped_unfolded  s    ÿ
zBTerminalReporter.short_test_summary.<locals>.show_skipped_unfoldedc                   s   ˆ j rˆ| ƒ nˆ| ƒ d S rØ   )rÅ   )rr  ©r=   rà  rá  r@   rA   Úshow_skipped+  s    
z9TerminalReporter.short_test_summary.<locals>.show_skippedr&   )rÎ  r'   r-   )rà   r¼  Úfr£   Úpr§   r  zshort test summary infoT)r*  rY  )ra   r   rá   r
  rƒ   )
r=   rÒ  rÚ  rÛ  rã  ZREPORTCHAR_ACTIONSrr  r�   rX   rk   r@   râ  rA   rœ  Ù  s0    


ú	


z#TerminalReporter.short_test_summaryztuple[str, list[str]]c                 C  sB   | j d u s| jd u s| jr6|  ¡  | j s,J ‚| js6J ‚| j | jfS rØ   )r¾   r¿   r/  r  rÚ   r@   r@   rA   rU  E  s
    

z TerminalReporter._get_main_color)Úunknown_type_seenr9   c                 C  sR   | j }d|v sd|v rd}n2d|v s0d|v s0|r6d}nd|v sD| jsJd}nd}|S )	Nr&   r-   r#  r,   r+   r"  r'   r!  )r½   r/  )r=   ræ  r½   rV  r@   r@   rA   Ú_determine_main_colorL  s    z&TerminalReporter._determine_main_colorc                 C  sP   g }| j D ]"}|r
|tvr
||vr
| |¡ q
ttƒ| | _|  t|ƒ¡| _d S rØ   )r½   ÚKNOWN_TYPESry  Úlistr¿   rç  r1   r¾   )r=   Zunknown_typesZ
found_typer@   r@   rA   r  X  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.
        r|  N)r~   rÕ   Ú&_build_collect_only_summary_stats_lineÚ _build_normal_summary_stats_linerÚ   r@   r@   rA   rÊ  a  s    z)TerminalReporter.build_summary_stats_linez	list[Any])Úkeyr9   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)rH   r[  r@   r@   rA   rC  }  rI  z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>r®  )r=   rì  r°  r@   r@   rA   rM  z  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 )NTrY  ú%d %szno tests ran)rU  rM  r  rÏ  rá   rÐ  ry  Ú	pluralize)	r=   rV  Zknown_typesrÌ  rì  r°  rV   rt   rä   r@   r@   rA   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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)rS  z tests collected (rí  )r  rM  rº   rî  rÏ  )r=   r)   r   rÌ  rV  Zcollected_outputZall_tests_were_deselectedra  r@   r@   rA   rê  ’  s*    


z7TerminalReporter._build_collect_only_summary_stats_line)N)r–   )NN)r  )F)MrK   rL   rM   r<   rÊ   ÚpropertyrÙ   rÛ   rZ   r[   rÝ   Úsetterrß   râ   rì   rñ   rò   rÿ   rê   ræ   rƒ   r  r
  r  rk   r  r  r  r  r  r  r8  r/  r   r<  r4  r0  ré   rT  rZ  r]  r\  rs  rq  rp  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œ  rU  rç  r  rÊ  rM  rë  rê  r@   r@   r@   rA   rŠ   q  s¶   		ú  ü
L-
$
6ú%l	rŠ   r   )Útwr~   r5  c                 C  sF   |  |j¡}| d¡^}}|r>| jd |¡dd�}|d | S |S d S )Nrå   Trc  )r£  r®   rè   rä   r�   )rò  r~   r5  r®   ÚpathrÌ  Zparts_markupr@   r@   rA   rÖ  ³  s    rÖ  rx   r2   )rL  r†   r7  r9   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ô   r?  Nz...r–   )Úfindr   rL  r  )rL  r†   r7  rD  ÚellipsisZformat_widthr@   r@   rA   r2  ½  s    
r2  zdict[str, bool])r~   r5  rò  Úword_markupr9   c                 C  s¶   |  | |¡\}}|j|fi |¤Ž}t|| |ƒ}|› d|› �}t|ƒ}	z|jjj}
W n tyd   Y nN0 tƒ sx| j	j
dkrŒ| j	jsŒd|
› �}
n|j|	 }td|
|ƒ}
|
du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Ž   rW   r^   rÂ   r2  )r~   r5  rò  rö  r×  rØ  rS   r$  rk   Ú
line_widthr†   r7  r@   r@   rA   rÑ  Ö  s.    ÿÿ
ÿþ
rÑ  r	   zSequence[CollectReport]z&list[tuple[int, str, int | None, str]])rÀ   r(   r9   c                 C  sê   i }|D ]°}|j d usJ ‚t|j tƒs4J ||j fƒ‚t|j ƒdksPJ ||j fƒ‚|j \}}}t| t|ƒƒ}t|di ƒ}|jdkrœd|v rœd|vrœ|d |f}n
|||f}| |g ¡ 	|¡ qg }	| 
¡ D ]\}}
|	 	t|
ƒg|¢R ¡ qÆ|	S )Nre  Úkeywordsr¥   ÚskipZ
pytestmark)r«  r  r,  r  r!   r	   rH   r©   r  ry  r  )rÀ   r(   ÚdÚeventrë   r  r6  rø  rì  rD   Úeventsr@   r@   rA   rÝ  ö  s*    ÿþý
rÝ  r#  r"  r!  )r&   r-   r,   r'   ztuple[int, str])rV   Únounr9   c                 C  s4   |dvr| |fS |  dd¡}| | dkr.|d n|fS )N)r-   r,   rï  r,   ÚwarningrF   r£   )rœ   )rV   rý  r@   r@   rA   rî    s    rî  rv  rÑ   c                 C  sP   g }| D ]B\}}|j › d|j› �}| d¡r8|dd … }||vr| |¡ q|S )Nrf  zpytest-é   )Úproject_namerl  rÞ  ry  )r{  rD   r  Údistr‹  r@   r@   rA   rz  +  s    
rz  Úfloat)r_  r9   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.é<   ú.2fr£   ©r_  zs (r'  N)ÚdatetimeÚ	timedeltarx   )r_  Údtr@   r@   rA   rË  9  s    rË  c                 C  sú   | dk rd| d d›d�S | dk r4d| d d›d�S | dk rNd| d d	›d�S | d
k rhd| d d›d�S | dk r‚d| d d›d�S | dk rœd| d d	›d�S | dk r²d| d›d�S | dk rØd| d d›d| d d›d�S d| d d›d| d d d›d�S )zQFormat the given seconds in a human readable manner to show in the test progress.gñhãˆµøä>r€   i@B z.3fÚusg-Cëâ6?r  gü©ñÒMbP?z.1fg{®Gáz„?iè  Úmsgš™™™™™¹?rF   r  r£   i  z.0fzm zh Úmr@   r  r@   r@   rA   rP  B  s"    rP  r$   c                 C  s„   t | dƒr.| j}| d¡r*|tdƒd… }|S | js8J ‚t| jtƒsHJ ‚| 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(   r  r«  r,  )r¡   r6  rW  r@   r@   rA   r1  Y  s    



r1  )YrN   Ú
__future__r   ÚargparseÚcollectionsr   Úcollections.abcr   r   r   r   Údataclassesr  Ú	functoolsr   r‡  Úpathlibr	   ri  r‹   rü   Útypingr
   r   r   r   r   r   r   r,   rm  rÐ   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%   r`  rè  ry   ZActionr.   rP   r|   r“   rž   r«   Ú	dataclassr¬   rŠ   rÖ  r2  rÑ  rÝ  rÏ  rÐ  rî  rz  rË  rP  r1  r@   r@   r@   rA   Ú<module>   sª   %         I
  ü	