o
    v&i                     @  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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/m0Z0 ddl/m1Z1 ddl/m2Z2 ddl/m3Z3 ddl4m5Z5 ddl6m7Z7 dd l6m8Z8 dd!l9m:Z: dd"l9m;Z; dd#l<m=Z= dd$l<m>Z> dd%l<m?Z? er	dd&l@mAZA d'ZBd(ZCd)ZDG d*d+ d+ejEZFG d,d- d-eZGdtd2d3ZHdud6d7ZIdvd9d:ZJe3d;d<dwd@dAZKejLG dBdC dCZMeG dDdE dEZNdxdIdJZOdydPdQZPdzdTdUZQd{d[d\ZRd]d]d^d_d_d]d`ZSd^ZTd|dddeZUd}dgdhZVd~dkdlZWd~dmdnZXddpdqZYG drds dsZZdS )zsTerminal 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errorsubtests passedsubtests failedzsubtests skippedfEc                      s8   e Zd ZdZ			dd fddZ	ddddZ  ZS )MoreQuietActionzA modified copy of the argparse count action which counts down and updates
    the legacy quiet attribute at the same time.

    Used to unify verbosity handling.
    NFoption_stringsSequence[str]deststrdefaultobjectrequiredboolhelp
str | NonereturnNonec                   s   t  j||d|||d d S )Nr   )r2   r4   nargsr6   r8   r:   )super__init__)selfr2   r4   r6   r8   r:   	__class__ V/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/_pytest/terminal.pyr@   X   s   
zMoreQuietAction.__init__parserargparse.ArgumentParser	namespaceargparse.Namespacevaluesstr | Sequence[object] | Noneoption_stringc                 C  s6   t || jdd }t|| j| t |ddd |_d S )Nr      quiet)getattrr4   setattrrN   )rA   rF   rH   rJ   rL   	new_countrD   rD   rE   __call__i   s   zMoreQuietAction.__call__)NFN)r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   N)
rF   rG   rH   rI   rJ   rK   rL   r;   r<   r=   )__name__
__module____qualname____doc__r@   rR   __classcell__rD   rD   rB   rE   r1   Q   s    
r1   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.
    r5   categoryletterz$str | tuple[str, Mapping[str, bool]]wordN)rT   rU   rV   rW   __annotations__rD   rD   rD   rE   rY   v   s
   
 rY   rF   r   r<   r=   c              	   C  s  | j dddd}|jddddd	d
d |jdddddd |jdddddd |jdddddd |jdd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 reporting	Reportinggeneral)afterz-vz	--verbosecountr   verbosezIncrease verbosity)actionr6   r4   r:   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.)rc   r4   r6   r:   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.)r4   typer6   r:   z-rstorereportcharscharsa  Show extra test summary info as specified by chars: (f)ailed, (E)rror, (s)kipped, (x)failed, (X)passed, (p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll. (w)arnings are enabled by default (see --disable-warnings), 'N' can be used to reset the list. (default: 'fE').)rc   r4   r6   metavarr:   z--disable-warningsz--disable-pytest-warningsdisable_warningszDisable warnings summary)r6   r4   rc   r:   z-lz--showlocals
showlocalsz/Show locals in tracebacks (disabled by default)z--no-showlocalszFHide locals in tracebacks (negate --showlocals passed through addopts))rc   r4   r:   z--tbstyletbstyleauto)rs   longshortnolinenativez5Traceback print mode (auto/long/short/line/native/no))rn   rc   r4   r6   choicesr:   z
--xfail-tbxfail_tbz1Show tracebacks for xfail (as long as --tb != no)z--show-captureshowcapture)rv   stdoutstderrlogallr   zOControls how captured stdout/stderr/log is shown on failed tests. Default: all.)rc   r4   ry   r6   r:   z--fulltracez--full-tracez,Don't cut any tracebacks (default is to cut))rc   r6   r:   z--colorcolor)yesrv   rs   z#Color terminal output (yes/no/auto)z--code-highlightr   rv   zSWhether code should be highlighted (only if --color is also enabled). Default: yes.)r6   ry   r:   console_output_stylezConsole output: "classic", or with additional progress information ("progress" (percentage) | "count" | "progress-even-when-capture-no" (forces progress even when capture=no)progress)r:   r6   zSpecify a verbosity level for test case execution, overriding the main level. Higher levels will provide more detailed information about each test case executed.)r:   )
getgroup
_addoption	addoptionr1   int_REPORTCHARS_DEFAULTaddinir   _add_verbosity_iniVERBOSITY_TEST_CASES)rF   grouprD   rD   rE   pytest_addoption   s  			
r   configr   c                   s~   t | tj | j d | jjs| jjr# fdd}| jj	
d|   r;dtjv }|s=t }| j|d d S d S d S )Nterminalreporterc                   s"   d tt|} d|  d S )N z[traceconfig] )joinmapr5   
write_line)tagsargsmsgreporterrD   rE   mywriter(  s   z"pytest_configure.<locals>.mywriterzpytest:configITERM_SESSION_IDterminalprogress)TerminalReportersysr|   pluginmanagerregisteroptiondebugtraceconfigtracerootsetprocessorisattyosenvironTerminalProgressPlugin)r   r   should_skip_terminal_progresspluginrD   r   rE   pytest_configure#  s   r   r5   c                 C  s   | j j}ddh}d}|D ]'}||v r| }|dkrd}q|dkr$d}q|dkr+d}q||vr3||7 }q| j jsBd	|vrBd	| }|S | j jrPd	|v rP|d	d}|S )
NFS asxXEfAPpsxXEfNw)r   rl   lowerro   replace)r   rl   old_aliases
reportoptscharrD   rD   rE   getreportopt:  s*   r   Ttrylastreportr"   tuple[str, str, str]c                 C  sH   d}| j rd}n| jrd}| j}| jdv r|dkrd}d}||| fS )Nr   .s)collectsetupteardownr&   r-   E)r'   r(   outcomewhenupper)r   r[   r   rD   rD   rE   pytest_report_teststatusS  s   r   c                   @  sH   e Zd ZU dZded< dZded< dZded< d	Zd
ed< dddZdS )WarningReportao  Simple structure to hold warnings information captured by ``pytest_warning_recorded``.

    :ivar str message:
        User friendly message about the warning.
    :ivar str|None nodeid:
        nodeid that generated the warning (see ``get_location``).
    :ivar tuple fslocation:
        File system location of the source of the warning (see ``get_location``).
    r5   messageNr;   nodeidztuple[str, int] | None
fslocationTr   count_towards_summaryr   r   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    )rA   r   filenamelinenumrelpathrD   rD   rE   get_locationu  s   
zWarningReport.get_location)r   r   r<   r;   )	rT   rU   rV   rW   r]   r   r   r   r   rD   rD   rD   rE   r   c  s   
 
r   c                   @  s  e Zd Zdddd	ZdddZedddZedddZedddZedddZ	edddZ
e
jdddZ
edddZedddZdd"d#Zdd'd(Zddd,d-Zdd.d/Zd0d1d2d3dd8d9Zd0d:dd;d<Zd0d:dd=d>Zdd?d@ZddCdDZddEdFZ		dddLdMZdddPdQZddSdTZddXdYZd d\d]Zdd`daZddddeZddgdhZddkdlZ ddodpZ!eddqdrZ"e#dsdtddvdwZ$ddxdyZ%ddzd{Z&dd|d}Z'edd~dZ(dddZ)dddZ*d	d
ddZ+e#dsddddZ,dddZ-dddZ.dddZ/dddZ0e#dsdtdddZ1e#dsdtdddZ2dddZ3dddZ4dddZ5dddZ6dd Z7dd Z8dddZ9dddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddńZ@dddǄZAdddɄZBddʜddd̈́ZCdddτZDddd҄ZEdddԄZFdddքZGdddلZHddd܄ZIdddބZJdddZKdddZLdddZMdddZNdS (  r   Nr   r   fileTextIO | Noner<   r=   c                 C  s   dd l }|| _d| _d | _d | _i | _d | _d | _|jj	| _
|d u r%tj}|j||| _| jj| _d | _t|| _|jj| _| jj| _t| | _t | _t | _|  | _t ! | _"d | _#d | _$d S Nr   )%_pytest.configr   _numcollected_session_showfspathstats_main_color_known_typesr   r   	startpathr   r|   create_terminal_writer_tw	fullwidth_screen_widthcurrentfspathr   rl   r   rh   foldskipped	hasmarkupr   CallableBoolr   set_progress_nodeids_reported_timing_nodeids_reported_determine_show_progress_info_show_progress_infor   Instant_collect_report_last_write_already_displayed_warnings_keyboardinterrupt_memo)rA   r   r   _pytestrD   rD   rE   r@     s0   







zTerminalReporter.__init__,Literal['progress', 'count', 'times', False]c                 C  sl   | j dddkr| j ddkrdS | j ddrdS | j d}|dv r(dS |d	kr.d	S |d
kr4d
S dS )zRReturn whether we should display progress information based on the current config.capturerv   r   progress-even-when-capture-noF	setupshow>   r   r   r   ra   times)r   	getoptiongetini)rA   cfgrD   rD   rE   r     s   
z.TerminalReporter._determine_show_progress_infor   c                 C  s   | j jj}|S rS   )r   r   rb   )rA   	verbosityrD   rD   rE   r     s   
zTerminalReporter.verbosityr9   c                 C  s
   | j dkS r   )r   rA   rD   rD   rE   
showheader     
zTerminalReporter.showheaderc                 C     t | jjjS rS   )r9   r   r   re   r   rD   rD   rE   re        zTerminalReporter.no_headerc                 C  r   rS   )r9   r   r   rf   r   rD   rD   rE   rf     r   zTerminalReporter.no_summaryc                 C  s"   | j d u r| jtjdkS | j S r   )r   r   get_verbosityr   r   r   rD   rD   rE   
showfspath  s   
zTerminalReporter.showfspathvaluebool | Nonec                 C  s
   || _ d S rS   )r   )rA   r  rD   rD   rE   r    r   c                 C  s   | j tjdkS r   )r   r  r   r   r   rD   rD   rE   showlongtestinfo  s   z!TerminalReporter.showlongtestinfoc                 C  s
   t | jS )zUThe amount of items reported in the progress so far.

        :meta private:
        )lenr   r   rD   rD   rE   reported_progress  s   
z"TerminalReporter.reported_progressr   r5   c                 C  s   ddd ||}|| jv S )Nxr   )r*   r(   )getrl   )rA   r   rD   rD   rE   hasopt  s   
zTerminalReporter.hasoptr   resmarkupc                 K  s   | j j|dd  }| jd u s|| jkr7| jd ur!| jr!|   || _t| j|}| j	  | j
|d  | jj
|fddi| d S )N::r   r   flushT)r   rootpathsplitr   r   )_write_progress_information_filling_spacer!   r   r   rw   write)rA   r   r  r  fspath	relfspathrD   rD   rE   write_fspath_result  s   
z$TerminalReporter.write_fspath_resultr   prefixextrac                 K  sL   | j |kr| j  || _ | j| |r$| jj|fi | d| _ d S d S )N)r   r   rw   r  )rA   r  r  kwargsrD   rD   rE   write_ensure_prefix  s   


z$TerminalReporter.write_ensure_prefixc                 C  s   | j r| j  d | _ d S d S rS   )r   r   rw   r   rD   rD   rE   ensure_newline  s   

zTerminalReporter.ensure_newlineF   
)r  marginline_sepcontentr  r  r  c                K  sV   | j j}|tjd| | | j| ddd}||d }| j j|fd|i| dS )z+Wrap message with margin for progress info.r   TF)widthdrop_whitespacereplace_whitespaceNr  )r   width_of_current_liner   textwrapwrapr   r  )rA   r   r  r  r  r  r$  wrappedrD   rD   rE   
wrap_write  s   

zTerminalReporter.wrap_writer  c                K  s   | j j|fd|i| d S )Nr  )r   r  )rA   r   r  r  rD   rD   rE   r    s   zTerminalReporter.writec                C  s   | j j||d d S )Nr)  )r   	write_raw)rA   r   r  rD   rD   rE   r*    s   zTerminalReporter.write_rawc                 C  s   | j   d S rS   )r   r  r   rD   rD   rE   r    s   zTerminalReporter.flushrw   str | bytesc                 K  s6   t |tst|dd}|   | jj|fi | d S )Nr   )errors)
isinstancer5   r  r   rw   )rA   rw   r  rD   rD   rE   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.
        eraseFrM   r   r   N)popr   r   r  r5   r  )rA   rw   r  r.  
fill_countfillrD   rD   rE   rewrite"  s   	
 zTerminalReporter.rewriteseptitler;   r   
int | Nonec                 K  s$   |    | jj|||fi | d S rS   )r  r   r4  )rA   r4  r5  r   r  rD   rD   rE   	write_sep4  s   zTerminalReporter.write_sep=kwc                 K  s   | j j||fi | d S rS   )r   r4  )rA   r5  r4  r9  rD   rD   rE   section>  s   zTerminalReporter.sectionr   c                 K  s   | j j|fi | d S rS   )r   rw   )rA   r   r9  rD   rD   rE   rw   A     zTerminalReporter.linerZ   itemsSequence[Any]c                 C  s2   || j v}| j |g | |r|   d S d S rS   )r   
setdefaultextend_set_main_color)rA   rZ   r<  set_main_colorrD   rD   rE   
_add_statsD  s
   
zTerminalReporter._add_statsexcreprr   c                 C  s&   t |dD ]	}| d|  qdS )Nr  zINTERNALERROR> T)r5   r  r   )rA   rC  rw   rD   rD   rE   pytest_internalerrorJ  s   z%TerminalReporter.pytest_internalerrorwarning_messagewarnings.WarningMessagec                 C  s@   ddl m} |j|jf}||}t|||d}| d|g d S )Nr   )warning_record_to_str)r   r   r   r,   )_pytest.warningsrG  r   linenor   rB  )rA   rE  r   rG  r   r   warning_reportrD   rD   rE   pytest_warning_recordedO  s   z(TerminalReporter.pytest_warning_recordedr   r   c                 C  s&   | j jjrd| }| | d S d S )NzPLUGIN registered: )r   r   r   r   )rA   r   r   rD   rD   rE   pytest_plugin_registered^  s   

z)TerminalReporter.pytest_plugin_registeredSequence[Item]c                 C  s   |  d| d S )Nr)   )rB  )rA   r<  rD   rD   rE   pytest_deselectedf  s   z"TerminalReporter.pytest_deselectedlocationtuple[str, int | None, str]c                 C  sZ   |\}}}| j r| ||||}| |d |   d S | jr+| |d |   d S d S )Nr   )r  _locationliner  r  r  r  )rA   r   rO  r  rI  domainrw   rD   rD   rE   pytest_runtest_logstarti  s   
z(TerminalReporter.pytest_runtest_logstartr   r$   c                 C  sV  d| _ |}t| jjj|| jd }|j|j|j}}}t|t	s$d }n|\}}| 
||g |s5|s5d S |d u rdt|d}|jrH|sHddi}n|jrR|rRddi}n|jrZddi}n
|jrbddi}ni }| j|j | jtjdkr| jj|fi | | jr| js|   n| j|jg|jR  }	t|d}
|
s| j|	|fi | |jst|drt|}| jtjd	k r| jj| jj t d
 d }t!d||}nd| d}|r|d ur| "| | jr| #  n=| $  | jd|j%j&j' d | jr
| jj| ( d dd n| jd | jj|fi | | jd|	  d| _)| *  d S )NT)r   r   wasxfailgreenyellowredr   node    [100%]rM   z ({})z ()[]r   )cyanr  )+
_tests_ranrY   r   hookr   rZ   r[   r\   r-  tuplerB  hasattrr'   r&   r(   r   addr   r  r   r   r   r  r   _is_last_item(_write_progress_information_if_past_edgerQ  rO  r  _get_raw_skip_reasonr   r$  r  _format_trimmedr(  r  r  rX  gatewayid!_get_progress_information_messager   r  )rA   r   repr  rZ   r[   r\   r  	was_xfailrw   running_xdistreasonavailable_widthformatted_reasonrD   rD   rE   pytest_runtest_logreportw  s|   









z)TerminalReporter.pytest_runtest_logreportc                 C  s   | j d usJ | j| j jkS rS   )r   r  testscollectedr   rD   rD   rE   rd       zTerminalReporter._is_last_itemT)wrapperGenerator[None, object, object]c                 c  s2    d V }| j tjdkr| jr| jr|   |S r   )r   r  r   r   r   r  r  )rA   resultrD   rD   rE   pytest_runtestloop  s   z#TerminalReporter.pytest_runtestloopc           
        sn  j sJ j j}jdkr2|r)j}dtt| d}d| d}|||S d| d| dS jd	kr|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|	rjdd |D  tt	dd |D S d
S |rdjd | ddS dS )Nra   z{:zd} [z/{}]z [  / z ]r   r   r'   r+   r&   r*   r(   r-   r   c                   s   g | ]
}|j  jvr|qS rD   )r   r   .0rr   rD   rE   
<listcomp>  s    zFTerminalReporter._get_progress_information_message.<locals>.<listcomp>c                 3  s    | ]
}|j d   kV  qdS )r   N)rO  )r|  icurrent_locationrD   rE   	<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)rO  r   r{  r  rD   rE   r    s    c                 s  s    | ]}|j V  qd S rS   r   r{  rD   rD   rE   r    s    c                 s  s     | ]}t |tr|jV  qd S rS   )r-  r$   durationr{  rD   rD   rE   r    s    d   3dz%]rZ  )r   rr  r   r  r  r5   format_get_reports_to_displayrO  sumr<  r  r   updateformat_node_duration)
rA   	collectedr   counter_formatformat_stringall_reportsnot_reportedtests_in_moduletests_completedlast_in_modulerD   )r  rA   rE   rj    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r'td}ntd}|| d | jk}|rP|  \}}|  }| jj	|d	 fi |d
i d S d S )Nra   rx  /r]  r   z 99h 59mrZ  rM   r  T)
_width_of_current_liner   r   rr  r  r   _get_main_colorrj  r   r  )rA   r   	num_testsprogress_length	past_edge
main_color_r   rD   rD   rE   re    s   



 z9TerminalReporter._write_progress_information_if_past_edgec                 C  sN   |   \}}|  }| j}| jj| d }| j||fddi|di d S )NrM   r  T)r  rj  r  r   r   r  rjust)rA   r   r  r   r   r2  rD   rD   rE   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   rD   rD   rE   r    s   z'TerminalReporter._width_of_current_linec                 C  sT   |   r| jjjdkr| jdddd d S d S | jjjdkr(| jdddd d S d S )Nr   zcollecting ... T)r  boldrM   )r   r   r   rb   r  r   rD   rD   rE   pytest_collection  s   z"TerminalReporter.pytest_collectionr#   c                 C  sd   |j r| d|g n
|jr| d|g dd |jD }|  jt|7  _|  r0|   d S d S )Nr-   r(   c                 S  s   g | ]	}t |tr|qS rD   )r-  r   r|  r  rD   rD   rE   r~  +      z9TerminalReporter.pytest_collectreport.<locals>.<listcomp>)r&   rB  r(   rv  r   r  r   report_collect)rA   r   r<  rD   rD   rE   pytest_collectreport&  s   z%TerminalReporter.pytest_collectreportr   c                 C  sF  | j jjdk r	d S |s| 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rNd	nd
 7 }|rd|d| d|dkr_d
nd	 7 }|rn|d| d7 }|rx|d| d7 }| j|kr|d| d7 }|  r| j|ddd |r| d d S d S | | d S )Nr   r-   r(   r)   z
collected zcollecting z itemrM   r   r   ry  z errorz deselectedz skippedz	 selectedT)r  r.  r  )r   r   rb   r   elapsedsecondsREPORT_COLLECTING_RESOLUTIONr   r   r  r   r	  r   r5   r   r3  r  r   )rA   r   r,  r(   r)   selectedrw   rD   rD   rE   r  0  s<   


 
zTerminalReporter.report_collectr   sessionr%   c                 C  s  || _ t | _| jsd S | jdddd t }| jsdt	j d| }t
t	dd }|rFdtt|d d	 }|d
| d|d	  d7 }|dtjj dtj 7 }| jdkse| jjjset
| jjdd rn|dtt	j 7 }| | | jjj| j| jd}| | d S d S )Nr8  ztest session startsTr  z	platform z -- Python pypy_version_infor      z[pypy--r]  z	, pytest-z	, pluggy-r   pastebinz -- )r   
start_path)r   r   r   _session_startr   r7  platformpython_versionre   r   rO   r   r   r5   r   _versionversionpluggy__version__r   r   r   r   
executabler   r`  pytest_report_headerr   _write_report_lines_from_hooks)rA   r  verinfor   r  linesrD   rD   rE   pytest_sessionstartT  s2   


z$TerminalReporter.pytest_sessionstartr  Sequence[str | Sequence[str]]c                 C  s<   t |D ]}t|tr| | q|D ]}| | qqd S rS   )reversedr-  r5   r   )rA   r  line_or_linesrw   rD   rD   rE   r  o  s   
z/TerminalReporter._write_report_lines_from_hooks	list[str]c                 C  s   d|j  g}|jr'd}|jrdd|j d}|dt|j |j |  |jtjj	kr>|
d}|dd| |j }|rR|d	dt| |S )
Nz	rootdir: r   z% (WARNING: ignoring pytest config in , z!)zconfigfile: 	testpathsztestpaths: {}zplugins: {})r  inipath_ignored_config_filesr   appendr!   args_sourcer   
ArgsSource	TESTPATHSr   r  r   list_plugin_distinfo_plugin_nameversions)rA   r   rv  warningr  
plugininforD   rD   rE   r  y  s"   

z%TerminalReporter.pytest_report_headerc                 C  s   |  d | jjj| j| j|jd}| | | jdrM|jr3| jjj	dkr-| j
d | |j | jd}|rO| j
dd |D ]}|| j
 qDd S d S d S )	NT)r   r  r<  collectonlyrz  r   r&   !zcollection failures)r  r   r`  pytest_report_collectionfinishr   r<  r  r   r   rb   r   rw   _printcollecteditemsr   r	  r4  
toterminal)rA   r  r  r&   rk  rD   rD   rE   pytest_collection_finish  s(   

z)TerminalReporter.pytest_collection_finishc              	   C  s\  | j tj}|dk r>|dk r0tdd |D }t| D ]\}}| j| d|  qd S |D ]	}| j|j	 q2d S g }d}|D ]g}|
 dd  }	|ra||	d t| kr[n|  |sP|	t|d  D ]A}
||
 t|d d }| j| |
  |dkrt|
d	d }|rt|nd }|r| D ]}| jd
|d | qqiqDd S )Nr   rz  c                 s  s"    | ]}|j d dd V  qdS r  rM   r   N)r   r  )r|  itemrD   rD   rE   r    s     z8TerminalReporter._printcollecteditems.<locals>.<genexpr>: r   rM     objz{}{})r   r  r   r   r   sortedr<  r   rw   r   	listchainr  r0  r  rO   inspectgetdoc
splitlinesr  )rA   r<  test_cases_verbositycountsnamera   r  stackindentneeded_collectorscolr  docrw   rD   rD   rE   r    s@   
z%TerminalReporter._printcollecteditems
exitstatusint | ExitCodeGenerator[None]c                 c  s    d V }| j d tjtjtjtjtjf}||v r(| js(| j	j
j| || j	d |jr6| jdt|jdd |tjkrC|   d | _n|jrQ| jdt|jdd |   |S )Nr   )r   r  r   r  T)rW  )r   rw   r   OKTESTS_FAILEDINTERRUPTEDUSAGE_ERRORNO_TESTS_COLLECTEDrf   r   r`  pytest_terminal_summary
shouldfailr7  r5   _report_keyboardinterruptr   
shouldstopsummary_stats)rA   r  r  rv  summary_exit_codesrD   rD   rE   pytest_sessionfinish  s,   
z%TerminalReporter.pytest_sessionfinishc                 c  s^    |    |   |   |   |   |   zd V W |   |   S |   |   w rS   )summary_errorssummary_failuressummary_xfailuressummary_warningssummary_passessummary_xpassesshort_test_summaryr   rD   rD   rE   r    s   

z(TerminalReporter.pytest_terminal_summaryexcinfoExceptionInfo[BaseException]c                 C  s   |j dd| _d S )NT)funcargs)getreprr   )rA   r  rD   rD   rE   pytest_keyboard_interrupt     z*TerminalReporter.pytest_keyboard_interruptc                 C  s   | j d ur|   d S d S rS   )r   r  r   rD   rD   rE   pytest_unconfigure  s   
z#TerminalReporter.pytest_unconfigurec                 C  s|   | j }|d us	J |jd usJ |jj}| d| d|v r<| jjjr+|| j d S |j| j | jj	ddd d S d S )Nr  KeyboardInterruptz@(to show a full traceback on KeyboardInterrupt use --full-trace)T)rV  )
r   	reprcrashr   r7  r   r   	fulltracer  r   rw   )rA   rC  r   rD   rD   rE   r    s   

z*TerminalReporter._report_keyboardinterruptr  rI  rR  c                   sn   d fdd}|r1||}j dkr-|dd |d	tjkr-|d
tjt| 7 }|d S d}|d S )Nr   r5   r<   c                   s\   j | } r,| r,|d t   } d}|d dd|d< |d|7 }|S )Nr\  r   r   r  )r   cwd_relative_nodeidendswithr  r  r   r   )r   rw   rJ   rR  rA   rD   rE   mkrel  s   
z-TerminalReporter._locationline.<locals>.mkrelrY  r  r   \z <- z
[location]r   )r   r5   r<   r5   )r   r  r   r   SEPr!   r   r	   )rA   r   r  rI  rR  r  r  rD   r  rE   rQ    s   
zTerminalReporter._locationlinec                 C  s   |j }|r|S dS )Nztest session)	head_line)rA   rk  r	  rD   rD   rE   _getfailureheadline  s   z$TerminalReporter._getfailureheadlinec                 C  sN   zt |jjW S  ty&   zt |jd d W  Y S  ty%   Y Y dS w w )N2   r   )r5   longreprr  AttributeError)rA   rk  rD   rD   rE   _getcrashline!  s   zTerminalReporter._getcrashliner  c                 C  s   dd | j |dD S )Nc                 S  s   g | ]	}t |d s|qS )	_pdbshown)rb  r  rD   rD   rE   r~  .  r  z/TerminalReporter.getreports.<locals>.<listcomp>rD   r   r	  )rA   r  rD   rD   rE   
getreports-  r;  zTerminalReporter.getreportsc                   s"    dr jd}|sd S  jd u}|r| jd  }n|}t| _|s)d S i }|D ]}||jg | q-d fdd}|rEd	nd
} jd|ddd |	 D ]2\}}	||	}
|
rw j
|
 | }ddd |D }| }n| } j
|  j
  qT j
d d S d S )Nr   r,   reportslist[WarningReport]r<   r5   c                   sn   g }| D ]}|  j}|r|| qt|dk r"dtt|S tdd |D }ddd | D S )N
   r  c                 s  s$    | ]}t |d dd V  qdS r  )r5   r  )r|  locrD   rD   rE   r  M  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{}rM   r   r   N)r  )r|  kvrD   rD   rE   r  P  s
    
)	r   r   r  r  r   r   r5   r   r<  )r  	locationsr   rO  counts_by_filenamer   rD   rE   collapsed_location_reportC  s   

zDTerminalReporter.summary_warnings.<locals>.collapsed_location_reportzwarnings summary (final)zwarnings summaryr8  TF)rV  r  r  c                 s  s    | ]}d | V  qdS )r  NrD   r  rD   rD   rE   r  \  s    z4TerminalReporter.summary_warnings.<locals>.<genexpr>zG-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html)r  r  r<   r5   )r
  r   r	  r   r  r>  r   r  r7  r<  r   rw   r  r   rstrip)rA   all_warningsr   warning_reportsreports_grouped_by_messagewrr  r5  r   message_reportsmaybe_locationr  indentedrD   r   rE   r  0  s>   



z!TerminalReporter.summary_warningsc                 C     |  ddd d S )Nr'   PASSESPsummary_passes_combinedr   rD   rD   rE   r  f  r  zTerminalReporter.summary_passesc                 C  r#  )Nr+   XPASSESXr&  r   rD   rD   rE   r  i  r  z TerminalReporter.summary_xpasseswhich_reports	sep_title
needed_optc                 C  s   | j jjdkr<| |r>| |}|sd S | d| |D ]"}|jr5| |}| jd|ddd | | | 	|j
 qd S d S d S )Nrv   r8  r  T)rU  r  )r   r   rr   r
  r  r7  sectionsr
  _outrep_summary_handle_teardown_sectionsr   )rA   r*  r+  r,  r  rk  r   rD   rD   rE   r'  l  s   



z(TerminalReporter.summary_passes_combinedlist[TestReport]c                   s   |  d} fdd|D S )Nr   c                   s$   g | ]}|j d kr|j kr|qS )r   )r   r   )r|  r   r  rD   rE   r~  ~  s
    z:TerminalReporter._get_teardown_reports.<locals>.<listcomp>)r  )rA   r   r  rD   r  rE   _get_teardown_reports|  s   

z&TerminalReporter._get_teardown_reportsc                 C  s   |  |D ]}| | qd S rS   )r1  print_teardown_sections)rA   r   r   rD   rD   rE   r/    s   z*TerminalReporter._handle_teardown_sectionsrk  c                 C  sz   | j jj}|dkrd S |jD ],\}}|dkr||vrqd|v r:| jd| |dd  dkr4|d d }| j| qd S )Nrv   r   r   r  rz  r  )r   r   r{   r-  r   r4  rw   rA   rk  r{   secnamer   rD   rD   rE   r2    s   
z(TerminalReporter.print_teardown_sectionsc                 C  s   | j jj}| jdd|d d S )Nr&   FAILURESrq   )r   r   rr   summary_failures_combined)rA   rq   rD   rD   rE   r    s   
z!TerminalReporter.summary_failuresc                 C  s0   | j jj}|r| j jjnd}| jdd|d d S )Nrv   r*   	XFAILURESr6  )r   r   rz   rr   r7  )rA   show_tbrq   rD   rD   rE   r    s   
z"TerminalReporter.summary_xfailures)r,  rq   c          	      C  s   |dkrR|r|  |rT| |}|sd S | d| |dkr4|D ]}| |}| | | | q d S |D ]}| |}| jd|ddd | | | |j q6d S d S d S )Nrv   r8  rw   r  TrW  r  )	r
  r  r7  r  r.  r   r
  r/  r   )	rA   r*  r+  rq   r,  r  rk  rw   r   rD   rD   rE   r7    s(   




z*TerminalReporter.summary_failures_combinedc                 C  s   | j jjdkrD| d}|sd S | dd | jd D ]*}| |}|jdkr,d| }n	d|j d| }| jd	|d
d
d | | qd S d S )Nrv   r-   r8  ERRORSr   zERROR collecting z	ERROR at z of r  Tr:  )	r   r   rr   r  r7  r   r
  r   r.  )rA   r  rk  r   rD   rD   rE   r    s   



zTerminalReporter.summary_errorsr"   c                 C  s~   | | j | jjj}|dkrd S |jD ](\}}|dkr!||vr!q| jd| |dd  dkr6|d d }| j| qd S )Nrv   r   r  rz  r  )r  r   r   r   r{   r-  r4  rw   r3  rD   rD   rE   r.    s   
z TerminalReporter._outrep_summaryc                 C  sN  | j dk rd S | j }|  \}}g }| j dk}|r| jj}|D ]\}}| jj|fi |}	|r;|t|	t| 7 }||	 q!d	|}
|di}dt
|j }| jj|fi |}|rh|t|t| 7 }|
|7 }
|r| jjdi |}|dr|d d }|t|7 }|
|7 }
|r| jd	|
fd
|i| d S | j|
fi | d S )Nrz  r   r  Tz in r   z[0mr8  r   r   )r   r  r  build_summary_stats_liner   r   r  r  r  r   format_session_durationr  r  r7  r   )rA   session_durationpartsr  
line_partsdisplay_sepr   textr  with_markupr   main_markupr  duration_with_markupmarkup_for_end_seprD   rD   rE   r    s:   




zTerminalReporter.summary_statsc           
   	     s    j sd S d fdd}d fd	d
}d fdd}d fddd fddd fdd}||t|dd|t|ddt|ddd}g } j D ]}||}|rX|| qK|rn jddddd |D ]	}	 |	 qfd S d S )Nr  r  statr5   r<   r=   c                  sT    j |g }|sd S  j}|D ]}t|t}t|| j|di}| | qd S )NT)r   r	  r   _color_for_type_color_for_type_default _get_line_with_reprcrash_messager   r  )r  rI  r&   r   rk  r   rw   r   rD   rE   show_simple  s   z8TerminalReporter.short_test_summary.<locals>.show_simplec           	            j dg }|D ]:}| jtd di\}} jj|fi |}t j j|}| d| }|j}|r>|dt	| 7 }| 
| q	d S )Nr*   r,   Tr    - r   r	  _get_verbose_word_with_markupr   rJ  r   r  _get_node_id_with_markuprT  r5   r  )	r  r*   rk  verbose_wordverbose_markupmarkup_wordr   rw   rn  r   rD   rE   show_xfailed	  s   z9TerminalReporter.short_test_summary.<locals>.show_xfailedc           	        rN  )Nr+   r,   Tr   rO  rP  )	r  r+   rk  rS  rT  rU  r   rw   rn  r   rD   rE   show_xpassed  s   z9TerminalReporter.short_test_summary.<locals>.show_xpassedc                   s    j dg }|rt j|ng }|sd S |d  jtd di\}} jj|fi |}d}|D ];\}}}	}
|
	|rE|
t
|d  }
|	d ur]| | d| d| d|	 d	|
 	 q2| | d| d| d	|
  q2d S )
Nr(   r   r,   T	Skipped: rx  z] r   r  )r   r	  _folded_skipsr   rQ  r   rJ  r   r  
startswithr  r  )r  r(   fskipsrS  rT  rU  r  numr  rI  rn  r   rD   rE   show_skipped_folded&  s    
("z@TerminalReporter.short_test_summary.<locals>.show_skipped_foldedc           	        s    j dg }|D ]^}|jd usJ t|jtsJ ||jft|jdks-J ||jf| jtd di\}} j	j
|fi |}t j	 j|}| d| }|jd }|rb|dt| 7 }| | q	d S )Nr(   r  r,   Tr   rY  rO  )r   r	  r  r-  ra  r  rQ  r   rJ  r   r  rR  r5   r  )	r  r(   rk  rS  rT  rU  r   rw   rn  r   rD   rE   show_skipped_unfolded8  s    
zBTerminalReporter.short_test_summary.<locals>.show_skipped_unfoldedc                   s    j r	|  d S |  d S rS   )r   )r  rA   r]  r^  rD   rE   show_skippedK  s   z9TerminalReporter.short_test_summary.<locals>.show_skippedr&   )rI  r'   r-   )r  r)  fr   pr   r8  zshort test summary infoT)r^  r  )r  r  rI  r5   r<   r=   )r  r  r<   r=   )rl   r   r	  r7  r   )
rA   rM  rV  rW  r`  REPORTCHAR_ACTIONSr  r   rc   rw   rD   r_  rE   r    s6   


	

z#TerminalReporter.short_test_summarytuple[str, list[str]]c                 C  sB   | j d u s| jd u s| jr|   | j sJ | jsJ | j | jfS rS   )r   r   rd  r@  r   rD   rD   rE   r  e  s
   

z TerminalReporter._get_main_colorunknown_type_seenc                 C  sX   | j }d|v sd|v rd}|S d|v sd|v s|rd}|S d|v s$| js(d}|S d}|S )	Nr&   r-   rW  r,   r+   rV  r'   rU  )r   rd  )rA   re  r   r  rD   rD   rE   _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 rS   )r   KNOWN_TYPESr  listr   rf  r9   r   )rA   unknown_types
found_typerD   rD   rE   r@  x  s   

z TerminalReporter._set_main_color-tuple[list[tuple[str, dict[str, bool]]], str]c                 C  s   | j dr
|  S |  S )a  
        Build the parts used in the last summary stats line.

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

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

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

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

        The final color of the line is also determined by this function, and is the second
        element of the returned tuple.
        r  )r   r   &_build_collect_only_summary_stats_line _build_normal_summary_stats_liner   rD   rD   rE   r>    s   z)TerminalReporter.build_summary_stats_linekey	list[Any]c                 C  s   | j |g }dd |D S )zRGet test/collection reports for the given status key, such as `passed` or `error`.c                 S  s   g | ]
}t |d dr|qS )r   T)rO   r  rD   rD   rE   r~    s    z<TerminalReporter._get_reports_to_display.<locals>.<listcomp>r  )rA   rn  r  rD   rD   rE   r    rs  z(TerminalReporter._get_reports_to_displayc           	      C  s~   |   \}}g }|D ]'}| |}|r1t|}t|t}|dd||ki}|dt|| |f q
|s;dtdifg}||fS )NTr  %d %szno tests ran)r  r  r  rJ  r	  rK  r  	pluralize)	rA   r  known_typesrA  rn  r  ra   r   r  rD   rD   rE   rm    s   
z1TerminalReporter._build_normal_summary_stats_linec                 C  s   t | d}t | d}| jdkrdddifg}d}n@|dkr3d}dt| jd	 }||difg}n*| j|k}|rCd}d
| d}nd}| j| }| d| j d| d}||difg}|rqtd }|dt|d |difg7 }||fS )Nr)   r-   r   zno tests collectedrV  TrU  z%d %s collectedtestzno tests collected (z deselected)r  z tests collected (rp  )r  r  r   rq  rJ  )rA   r)   r,  rA  r  collected_outputall_tests_were_deselectedr  rD   rD   rE   rl    s*   


z7TerminalReporter._build_collect_only_summary_stats_linerS   )r   r   r   r   r<   r=   )r<   r   )r<   r   )r<   r9   )r  r  r<   r=   )r   r5   r<   r9   )r   r5   r  r5   r  r9   r<   r=   r=  )r  r5   r  r5   r<   r=   r<   r=   )r   r5   r  r9   r  r   r  r5   r  r9   r<   r=   )r   r5   r  r9   r  r9   r<   r=   )r   r5   r  r9   r<   r=   )rw   r+  r  r9   r<   r=   )rw   r5   r  r9   r<   r=   )NN)
r4  r5   r5  r;   r   r6  r  r9   r<   r=   )r8  )r5  r5   r4  r5   r9  r9   r<   r=   )r   r5   r9  r9   r<   r=   )rZ   r5   r<  r=  r<   r=   )rC  r   r<   r9   )rE  rF  r   r5   r<   r=   )r   r   r<   r=   )r<  rM  r<   r=   )r   r5   rO  rP  r<   r=   r   r$   r<   r=   )r<   ru  )r<   r5   )r   r#   r<   r=   )F)r   r9   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   r5   r  r5   rI  r6  rR  r5   r<   r5   )r  r5   )r*  r5   r+  r5   r,  r5   r<   r=   )r   r5   r<   r0  )r   r5   r<   r=   )rk  r$   r<   r=   )
r*  r5   r+  r5   rq   r5   r,  r;   r<   r=   )rk  r"   r<   r=   )r<   rd  )re  r9   r<   r5   )r<   rk  )rn  r5   r<   ro  )OrT   rU   rV   r@   r   propertyr   r   re   rf   r  setterr  r  r
  r  r  r  r(  r  r*  r  r   r3  r7  r:  rw   rB  rD  rK  rL  rN  rS  rq  rd  r   rw  rj  re  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rQ  r
  r  r  r  r  r  r'  r1  r/  r2  r  r  r7  r  r.  r  r  r  rf  r@  r>  r  rm  rl  rD   rD   rD   rE   r     s    



		





L
-


$




6





%l
	r   twr   rk  c                 C  sB   | |j}|d^}}|r| jd|dd}|d | S |S )Nr  Tr  )r  r   r  r  r   )r{  r   rk  r   pathrA  parts_markuprD   rD   rE   rR    s   rR  r  r   ro  r   r;   c                 C  s   | d}|dkr|d| }d}t| d}|t| |kr"dS |t| |krP|t|8 }|d| }|t| |krL|dd }|t| |ks>||7 }| |S )zFormat msg into format, ellipsizing it if doesn't fit in available_width.

    Returns None if even the ellipsis can't fit.
    r  rz  Nz...r   )findr   r  r  )r  r   ro  r  ellipsisformat_widthrD   rD   rE   rg    s   

rg  word_markupdict[str, bool]c                 C  s   | | |\}}|j|fi |}t|| |}| d| }t|}	zt|jtr-|j}
n|jjj}
W n
 t	y=   Y |S w t
 sG| jjdkrQ| jjsQd|
 }
n|j|	 }td|
|}
|
durd||
7 }|S )z?Get summary line for a report, trying to add reprcrash message.r   rY  rO  z - {}N)rQ  r  rR  r   r-  r  r5   r  r   r  r   r   rb   ri   r   rg  )r   rk  r{  r  rS  rT  r\   rX  rw   
line_widthr   ro  rD   rD   rE   rL    s6   

rL  r   r	   r(   Sequence[CollectReport]&list[tuple[int, str, int | None, str]]c                 C  s   i }|D ]X}|j d usJ t|j tsJ ||j ft|j dks(J ||j f|j \}}}t| t|}t|di }|jdkrNd|v rNd|vrN|d |f}n|||f}||g 	| qg }	|
 D ]\}}
|		t|
g|R  qc|	S )Nr  keywordsr   skip
pytestmark)r  r-  ra  r  r!   r	   rO   r   r>  r  r<  )r   r(   deventr  rI  rn  r  rn  rJ   eventsrD   rD   rE   rY    s$   

rY  rW  rV  rU  )r&   r-   r,   r'   r.   r/   ra   nountuple[int, str]c                 C  s6   |dvr| |fS | dd}| | dkr|d fS |fS )N)r-   r,   rs  r,   r  rM   r   )r   )ra   r  rD   rD   rE   rq  D  s   rq  r  c                 C  sP   g }| D ]!\}}|j  d|j }|dr|dd  }||vr%|| q|S )Nr  zpytest-   )project_namer  rZ  r  )r  rJ   r   distr  rD   rD   rE   r  Q  s   

r  r  floatc                 C  s6   | dk r
| ddS t jt| d}| dd| dS )zQFormat the given seconds in a human readable manner to show in the final summary.<   .2fr   r  zs (r[  )datetime	timedeltar   )r  dtrD   rD   rE   r?  _  s   r?  c                 C  s   | dk rd| d ddS | dk rd| d ddS | dk r'd| d d	dS | d
k r4d| d ddS | dk rAd| d ddS | dk rNd| d d	dS | dk rYd| ddS | dk rld| 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.gh㈵>r   i@B z.3fusg-C6?r  gMbP?z.1fg{Gz?i  msg?rM   r  r   i  z.0fzm zh mrD   r  rD   rD   rE   r  h  s"   "r  r$   c                 C  s   t | dr| j}|dr|tdd }|S | jsJ t| jts$J | j\}}}|dr9|tdd }|S |dkr?d}|S )zqGet the reason string of a skip/xfail/xpass test report.

    The string is just the part given by the user.
    rT  zreason: NrX  Skippedr   )rb  rT  rZ  r  r(   r-  r  ra  )r   rn  r  rD   rD   rE   rf    s   



rf  c                   @  s`   e Zd ZdZdddZ	ddddZedddZedddZed ddZ	edddZ
dS )!r   a#  Terminal progress reporting plugin using OSC 9;4 ANSI sequences.

    Emits OSC 9;4 sequences to indicate test progress to terminal
    tabs/windows/etc.

    Not all terminal emulators support this feature.

    Ref: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
    trr   r<   r=   c                 C  s   || _ d | _d| _d S )NF)_trr   _has_failures)rA   r  rD   rD   rE   r@     s   
zTerminalProgressPlugin.__init__Nstate?Literal['remove', 'normal', 'error', 'indeterminate', 'paused']r   r6  c                 C  s   |du sd|  krdksJ  J | dkr d}n> dkr- |dus&J d| d}n, d	kr@ |dur=d
| d}nd}n dkrH d}ndkrY|durVd| d}nd}	 | j j|dd dS )a  Emit OSC 9;4 sequence for indicating progress to the terminal.

        :param state:
            Progress state to set.
        :param progress:
            Progress value 0-100. Required for "normal", optional for "error"
            and "paused", otherwise ignored.
        Nr   r  removez
]9;4;0;\normalz]9;4;1;z\r-   z]9;4;2;z
]9;4;2;\indeterminatez
]9;4;3;\pausedz]9;4;4;z
]9;4;4;\Tr)  )r  r*  )rA   r  r   sequencerD   rD   rE   _emit_progress  s$   $



z%TerminalProgressPlugin._emit_progressr  r%   c                 C  s   || _ | d d S )Nr  )r   r  )rA   r  rD   rD   rE   r    s   z*TerminalProgressPlugin.pytest_sessionstartc                 C  s.   | j d usJ | j jdkr| dd d S d S )Nr   r  )r   rr  r  r   rD   rD   rE   r    s   z/TerminalProgressPlugin.pytest_collection_finishr   r$   c                 C  sp   |j rd| _|jdkrd S | jd usJ | jj}|dkr6| jj}t|d | d}| | jr0dnd| d S d S )NTcallr   r  r-   r  )	r&   r  r   r   rr  r  r  minr  )rA   r   r  reportedr   rD   rD   rE   rq    s   
z/TerminalProgressPlugin.pytest_runtest_logreportc                 C  s   |  d d S )Nr  )r  r   rD   rD   rE   r    r   z+TerminalProgressPlugin.pytest_sessionfinish)r  r   r<   r=   rS   )r  r  r   r6  r<   r=   rx  rv  rw  )rT   rU   rV   rW   r@   r  r   r  r  rq  r  rD   rD   rD   rE   r     s    

&r   )rF   r   r<   r=   )r   r   r<   r=   )r   r   r<   r5   )r   r"   r<   r   )r{  r   r   r   rk  r"   )r  r5   r   r5   ro  r   r<   r;   )
r   r   rk  r"   r{  r   r  r  r<   r5   )r   r	   r(   r  r<   r  )ra   r   r  r5   r<   r  )r<   r  )r  r  r<   r5   )r   r$   r<   r5   )[rW   
__future__r   argparsecollectionsr   collections.abcr   r   r   r   dataclassesr  	functoolsr   r  r   pathlibr	   r  r   r%  typingr
   r   r   r   r   r   r   r,   r  r   r   r   r   _pytest._coder   _pytest._code.coder   _pytest._ior   _pytest._io.wcwidthr   _pytest._version_pytest.compatr   r   r   r   r   r   _pytest.config.argparsingr   _pytest.nodesr   r   _pytest.pathlibr    r!   _pytest.reportsr"   r#   r$   _pytest.mainr%   r  rg  r   Actionr1   rY   r   r   r   r   	dataclassr   r   rR  rg  rL  rY  rJ  rK  rq  r  r?  r  rf  r   rD   rD   rD   rE   <module>   s   %
 

        
Z



$ 



	
