
    iac                    j   S r SSKJr  SSKJr  SSKrSSKrSSKrSSKrSSK	J
s  Jr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSK r \S   " 5       r!S*S jr"S+S jr#SSS/0S/ SQ0S.r$\$S   RK                  5       \$S'   \#" \$S   \$S   5        \$S   \$S'    " S S5      r&      S,S jr'\ RP                  S-S j5       r)\ RP                  S-S  j5       r*S.S! jr+\ RP                  " S"S#9S-S$ j5       r,S/S% jr-S0S& jr.S0S' jr/S1S( jr0 " S) S5      r1g)2a  Report test results in JUnit-XML format, for use with Jenkins and build
integration servers.

Based on initial code from Ross Lawley.

Output conforms to
https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
    )annotations)CallableN)nodes)timing)ExceptionRepr)ReprFileLocation)Config)filename_arg)Parser)FixtureRequest)
TestReport)StashKey)TerminalReporterLogXMLc                P    SS jnSn[         R                  " X![        U 5      5      $ )a  Visually escape invalid XML characters.

For example, transforms
    'hello\aworld\b'
into
    'hello#x07world#x08'
Note that the #xABs are *not* XML escapes - missing the ampersand &#xAB.
The idea is to escape visually for the user rather than for XML itself.
c                X    [        U R                  5       5      nUS::  a  SUS 3$ SUS 3$ )N   z#x02X04X)ordgroup)matchobjis     O/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/_pytest/junitxml.pyreplbin_xml_escape.<locals>.repl0   s6     !9#w<#w<    u    [^	
 -~-퟿-�က0-ჿff])r   zre.Match[str]returnstr)resubr   )argr   illegal_xml_res      r   bin_xml_escaper$   %   s)      	W  66.C11r   c                    0 nU R                  5        HM  u  p4UR                  5        H4  u  pV[        U[        5      (       d  [        [	        U5      5      eXF-   X#'   M6     MO     U R                  U5        g N)items
isinstancelist	TypeErrortypeupdate)leftrightresultklvlkrvrs          r   merge_familyr4   @   s^    F**,kkmFBb$''R))FJ $ 
 	KKr   testcase	classnamename)filelineurl)_base_base_legacyr;   xunit1r<   xunit2c                      \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SSS
 jjrSS jrSS jrS S jrSS jrSS jrSS jrSS jrSS jrSS jrS!S jrSrg	)"_NodeReporterV   c                    Xl         X l        U R                  R                  U l        U R                  R                  U l        SU l        / U l        / U l        0 U l        g )N        )idxml	add_statsfamilyduration
propertiesr   attrs)selfnodeidrE   s      r   __init___NodeReporter.__init__W   sH    ++hhoo13')
%'
r   c                    U R                   R                  UR                  5        U R                  R	                  U5        g r&   )rE   rF   tagr   append)rK   nodes     r   rQ   _NodeReporter.appenda   s*    488$

$r   c                b    U R                   R                  [        U5      [        U5      45        g r&   )rI   rQ   r   r$   rK   r7   values      r   add_property_NodeReporter.add_propertye   s"    D	>%+@ABr   c                F    [        U5      U R                  [        U5      '   g r&   )r$   rJ   r   rU   s      r   add_attribute_NodeReporter.add_attributeh   s     .u 5

3t9r   c           	         U R                   (       aQ  [        R                  " S5      nU R                    H)  u  p#UR                  [        R                  " SX#S95        M+     U$ gz9Return a Junit node containing custom properties, if any.rI   propertyr7   rV   N)rI   ETElementrQ   rK   rI   r7   rV   s       r   make_properties_node"_NodeReporter.make_properties_nodek   sI    ??L1J#!!"**Zd"PQ  /r   c                   [        UR                  5      nU R                  nUS S nU R                  R                  (       a&  UR                  SU R                  R                  5        SR                  U5      [        US   5      UR                  S   S.nUR                  S   b  [        UR                  S   5      US'   [        US5      (       a  UR                  US'   XPl        U R                  R                  U5        U R                  S:X  a  g 0 nU R                   H0  nU[        U R                     S	   ;   d  M  U R                  U   Xg'   M2     X`l        g )
Nr   .)r6   r7   r8      r9   r:   r=   r5   )mangle_test_addressrL   rJ   rE   prefixinsertjoinr$   locationr   hasattrr:   r,   rG   families)rK   
testreportnamesexisting_attrs
classnamesrJ   
temp_attrskeys           r   record_testreport_NodeReporter.record_testreportt   s%   #J$5$563BZ
88??a1*-"59-''*!

 q!-
 3 3A 67E&M:u%%%>>E%L


.) ;;(" 
::Cht{{+J77"&**S/
   
r   c                    [         R                  " SU R                  U R                  S S9nU R	                  5       nUb  UR                  U5        UR                  U R                  5        U$ )Nr5   .3f)time)r`   ra   rJ   rH   rc   rQ   extendr   )rK   r5   rI   s      r   to_xml_NodeReporter.to_xml   sV    ::j$**dmmC=PR..0
!OOJ'

#r   Nc                n    [         R                  " XS9n[        U5      Ul        U R	                  U5        g )N)messager`   ra   r$   textrQ   )rK   rP   r   datarR   s        r   _add_simple_NodeReporter._add_simple   s(    zz#/"4(	Dr   c                t   U R                   R                  (       d  UR                  (       a  g UR                  nUR                  nUR
                  nU R                   R                  S:X  a  g SnU R                   R                  S;   a  U R                  US5      nU R                   R                  S;   a(  XPR                  US5      -  nU R                  XS5        SnU R                   R                  S;   a(  XPR                  US	5      -  nU R                  XS
5        SnU(       a  U R                  XS5        g g )Nno )logallz Captured Log )
system-outout-errr   z Captured Out r   )
system-errr   r   z Captured Err r   )	rE   log_passing_testspassed	capstdoutcaplog	capstderrlogging_prepare_content_write_content)rK   reportcontent_outcontent_logcontent_errcontent_alls         r   write_captured_output#_NodeReporter.write_captured_output   s
   xx))fmm&&mm&&88t#88~-//=MNK88??00>NOOK\BK88??00>NOOK\BK\B r   c                J    SR                  UR                  SS5      US/5      $ )N
P   -r   )rl   center)rK   contentheaders      r   r   _NodeReporter._prepare_content   s#    yy&--C0'2>??r   c                r    [         R                  " U5      n[        U5      Ul        U R	                  U5        g r&   r   )rK   r   r   jheaderrP   s        r   r   _NodeReporter._write_content   s(    jj!!'*Cr   c                &    U R                  S5        g )Nr   )rF   rK   r   s     r   append_pass_NodeReporter.append_pass   s    x r   c                D   [        US5      (       a  U R                  SS5        g UR                  c   e[        UR                  SS 5      nUb  UR                  nO[        UR                  5      n[        U5      nU R                  SU[        UR                  5      5        g )Nwasxfailskippedz%xfail-marked test passes unexpectedly	reprcrashfailure)rn   r   longreprgetattrr   r   r$   )rK   r   r   r   s       r   append_failure_NodeReporter.append_failure   s    6:&&Y(OP??...18d2I $#++foo.$W-GYV__1EFr   c                n    UR                   c   eU R                  SS[        UR                   5      5        g )Nerrorzcollection failure)r   r   r   r   s     r   append_collect_error"_NodeReporter.append_collect_error   s.    ***"6FOO8LMr   c                P    U R                  SS[        UR                  5      5        g )Nr   zcollection skipped)r   r   r   r   s     r   append_collect_skipped$_NodeReporter.append_collect_skipped   s    $8#foo:NOr   c                2   UR                   c   e[        UR                   SS 5      nUb  UR                  nO[        UR                   5      nUR                  S:X  a  SU S3nOSU S3nU R                  S[        U5      [        UR                   5      5        g )Nr   teardownzfailed on teardown with ""zfailed on setup with "r   )r   r   r   r   whenr   r$   )rK   r   r   reasonmsgs        r   append_error_NodeReporter.append_error   s    ***-4V__kSW-X	 &&F)F;;*$-fXQ7C*6(!4C."5s6??7KLr   c                &   [        US5      (       aZ  UR                  nUR                  S5      (       a  USS  n[        U5      n[        R
                  " SSUS9nU R                  U5        g [        UR                  [        5      (       d   eUR                  u  pEnUR                  S5      (       a  USS  nU S	U S
U 3n[        R
                  " SS[        U5      S9n[        U5      Ul
        U R                  U5        U R                  U5        g )Nr   zreason:    r   zpytest.xfail)r+   r   z	Skipped: 	   :z: zpytest.skip)rn   r   
startswithr$   r`   ra   rQ   r(   r   tupler   r   )rK   r   xfailreasonr   filenamelineno
skipreasondetailss           r   append_skipped_NodeReporter.append_skipped   s    6:&& //K%%j11)!"o(5KjjUGKK foou5555+1??(Hj$$[11'^
!
!F82j\:Gjj~j7QG *'2GLKK &&v.r   c                p   ^ U R                  5       mU R                  R                  5         U4S jU l         g )Nc                    > T $ r&    )r   s   r   <lambda>(_NodeReporter.finalize.<locals>.<lambda>  s    dr   )r|   __dict__clear)rK   r   s    @r   finalize_NodeReporter.finalize   s'    {{} #r   )	rF   rJ   rH   rG   rD   r   rI   r|   rE   )rL   zstr | TestReportrE   r   r   None)rR   
ET.Elementr   r   r7   r   rV   objectr   r   r   zET.Element | None)rp   r   r   r   )r   r   r&   )rP   r   r   r   r   
str | Noner   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____firstlineno__rM   rQ   rW   rZ   rc   rv   r|   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r   r   r@   r@   V   sc    ( C6 <
C.@
!G N
PM/,#r   r@   c                    SSK Jn  U R                  R                  R	                  [
        S5      nUbC  UR                  S;  a2  U R                  R                  U" U SUR                   S35      5        ggg)z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )PytestWarningN)r=   legacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	_pytest.warning_typesr   configstashgetxml_keyrG   rR   warn)requestfixture_namer   rE   s       r   !_warn_incompatibility_with_xunit2r     sl     4
..


"
"7D
1C
3::-AA. DSZZLPlm	
 Br   c                0   ^  [        T S5        SU 4S jjnU$ )aN  Add extra properties to the calling test.

User properties become part of the test report and are available to the
configured reporters, like JUnit XML.

The fixture is callable with ``name, value``. The value is automatically
XML-encoded.

Example::

    def test_function(record_property):
        record_property("example_key", 1)
record_propertyc                R   > TR                   R                  R                  X45        g r&   )rR   user_propertiesrQ   )r7   rV   r   s     r   append_property(record_property.<locals>.append_property%  s    $$++TM:r   r   )r   )r   r   s   ` r   r   r     s     &g/@A; r   c                6   SSK Jn  U R                  R                  U" S5      5        [	        U S5        SS jnUnU R
                  R                  R                  [        S5      nUb1  UR                  U R                  R                  5      nUR                  nU$ )zAdd extra xml attributes to the tag for the calling test.

The fixture is callable with ``name, value``. The value is
automatically XML-encoded.
r   )PytestExperimentalApiWarningz/record_xml_attribute is an experimental featurerecord_xml_attributec                    g r&   r   r_   s     r   add_attr_noop+record_xml_attribute.<locals>.add_attr_noop;  s    r   Nr   )r   r   rR   r   r   r   r   r   r   node_reporterrL   rZ   )r   r   r   	attr_funcrE   r   s         r   r   r   +  s     CLL$%VW &g/EF I
..


"
"7D
1C
))',,*=*=>!//	r   c                    Sn[        U[        5      (       d.  Sn[        UR                  U [	        U5      R
                  S95      eg)z_Used by record_testsuite_property to check that the given parameter name is of the proper
type.Tz5{param} parameter needs to be a string, but {g} given)paramgN)r(   r   r*   formatr+   r   )r  v__tracebackhide__r   s       r   _check_record_param_typer  H  sC     aE

$q'2B2B
CDD r   session)scopec                    SnSS jnU R                   R                  R                  [        S5      nUb  UR                  nU$ )a  Record a new ``<property>`` tag as child of the root ``<testsuite>``.

This is suitable to writing global information regarding the entire test
suite, and is compatible with ``xunit2`` JUnit family.

This is a ``session``-scoped fixture which is called with ``(name, value)``. Example:

.. code-block:: python

    def test_foo(record_testsuite_property):
        record_testsuite_property("ARCH", "PPC")
        record_testsuite_property("STORAGE_TYPE", "CEPH")

:param name:
    The property name.
:param value:
    The property value. Will be converted to a string.

.. warning::

    Currently this fixture **does not work** with the
    `pytest-xdist <https://github.com/pytest-dev/pytest-xdist>`__ plugin. See
    :issue:`7767` for details.
Tc                     Sn[        SU 5        g)zFNo-op function in case --junit-xml was not passed in the command-line.Tr7   N)r  )r7   rV   r  s      r   record_func.record_testsuite_property.<locals>.record_funcm  s      .r   Nr   )r   r   r   r   add_global_property)r   r  r  rE   s       r   record_testsuite_propertyr  Q  sC    4 /
 ..


"
"7D
1C
--r   c                T   U R                  S5      nUR                  SSSSS[        R                  " [        SS9S SS	9  UR                  S
SSSS SS9  U R                  SSSS9  U R                  SSSS9  U R                  SSSSS9  U R                  SSSS9  U R                  SSS S9  g )!Nzterminal reportingz
--junitxmlz--junit-xmlstorexmlpathpath)optnamez0Create junit-xml style report file at given path)actiondestmetavarr+   defaulthelpz--junitprefixz--junit-prefixr   z0Prepend prefix to classnames in junit-xml output)r  r  r  r  junit_suite_namez Test suite name for JUnit reportpytest)r  junit_loggingz\Write captured log messages to JUnit report: one of no|log|system-out|system-err|out-err|allr   junit_log_passing_testsz;Capture log information for passing tests to JUnit report: boolT)r+   r  junit_duration_reportz*Duration time to report: one of total|calltotaljunit_familyz0Emit XML for schema: one of legacy|xunit1|xunit2r>   )getgroup	addoption	functoolspartialr
   addini)parserr   s     r   pytest_addoptionr'  x  s    OO01E	OO|\B?  	 
OO?   MM>   MM	:	   MM!E	   MM4  
 MM:  r   c                   U R                   R                  nU(       a  [        U S5      (       d  U R                  S5      n[	        UU R                   R
                  U R                  S5      U R                  S5      U R                  S5      UU R                  S5      5      U R                  [        '   U R                  R                  U R                  [           5        g g g )Nworkerinputr   r  r  r  r  )
optionr  rn   getinir   junitprefixr   r   pluginmanagerregister)r   r  r   s      r   pytest_configurer/    s    mm##Gwv}55}}^4 &MM%%MM,-MM/*MM12MM34!
W 	%%fll7&;< 6wr   c                    U R                   R                  [        S 5      nU(       a-  U R                   [        	 U R                  R	                  U5        g g r&   )r   r   r   r-  
unregister)r   rE   s     r   pytest_unconfigurer2    s@    
,,

7D
)C
LL!'', r   c                    U R                  S5      u  pnUR                  S5      nUS   R                  [        R                  S5      US'   [
        R                  " SSUS   5      US'   US==   X#-   -  ss'   U$ )N[z::r   rg   z\.py$r   rf   )	partitionsplitreplacer   SEPr    r!   )addressr  possible_open_bracketparamsrq   s        r   ri   ri     st    *1*;*;C*@'DJJtEQx		3/E!HvvhE!H-E!H	"I&//ILr   c                      \ rS rSr     S           SS jjrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSrg)r   i  c                   [         R                  R                  [         R                  R                  U5      5      n[         R                  R	                  [         R                  R                  U5      5      U l        X l        X0l        X@l	        Xpl
        XPl        X`l        [        R                  / SQS5      U l        0 U l        / U l        / U l        / U l        SU l        U R                  S:X  a  SU l        g g )N)r   r   r   r   r   r   r=   )osr  
expanduser
expandvarsnormpathabspathlogfilerj   
suite_namer   r   report_durationrG   dictfromkeysstatsnode_reportersnode_reporters_orderedglobal_propertiesopen_reportscnt_double_fail_tests)rK   rC  rj   rD  r   rE  rG   r   s           r   rM   LogXML.__init__  s     ''$$RWW%7%7%@Aww''(@A$!2.%)]]5q&

 UW;=#8: /1%&" ;;(""DK #r   c                    [        USU5      n[        USS 5      nU R                  R                  X#45      nUR                   H   u  pVUR	                  U[        U5      5        M"     Ub  UR                  5         g g NrL   rR   )r   rI  popr   rW   r   r   )rK   r   rL   
workernodereporterpropname	propvalues          r   r   LogXML.finalize  sw    62VVT2
&&**F+?@#)#9#9H!!(C	N; $:   r   c                    [        USU5      n[        USS 5      nX#4nX@R                  ;   a  U R                  U   $ [        X 5      nXPR                  U'   U R                  R	                  U5        U$ rP  )r   rI  r@   rJ  rQ   )rK   r   rL   rR  ru   rS  s         r   r   LogXML.node_reporter  st    #*68V#DVVT2
 %%%&&s++ .#+C ##**84r   c                R    XR                   ;   a  U R                   U==   S-  ss'   g g )Nrh   )rH  )rK   ru   s     r   rF   LogXML.add_stats
  s#    **JJsOq O r   c                J    U R                  U5      nUR                  U5        U$ r&   )r   rv   rK   r   rS  s      r   _opentestcaseLogXML._opentestcase  s%    %%f-""6*r   c                ~  ^^^ SnTR                   (       a4  TR                  S:X  a"  U R                  T5      nUR                  T5        GO?TR                  (       a  TR                  S:X  ai  [        TSS5      m[        TSS5      m[        UUU4S jU R                   5       S5      nU(       a&  U R                  U5        U =R                  S-  sl	        U R                  T5      nTR                  S:X  aO  UR                  T5        U R                  R                  T5        U R                  (       d  UR                  T5        OEUR                  T5        O3TR                  (       a"  U R                  T5      nUR!                  T5        U R#                  T5        TR                  S:X  a  U R                  T5      nUR                  T5        U R                  T5        [        TSS5      m[        TSS5      m[        UUU4S jU R                   5       S5      nU(       a  U R                  R%                  U5        ggg)	a  Handle a setup/call/teardown report, generating the appropriate
XML tags as necessary.

Note: due to plugins like xdist, this hook may be called in interlaced
order with reports from other nodes. For example:

Usual call order:
    -> setup node1
    -> call node1
    -> teardown node1
    -> setup node2
    -> call node2
    -> teardown node2

Possible call order in xdist:
    -> setup node1
    -> call node1
    -> setup node2
    -> call node2
    -> teardown node2
    -> teardown node1
Ncallr   	worker_id
item_indexc              3     >#    U  HI  nUR                   TR                   :X  d  M  [        US S5      T:X  d  M2  [        USS5      T:X  d  ME  Uv   MK     g7frb  Nra  rL   r   .0repr   	report_ii
report_wids     r   	<genexpr>2LogXML.pytest_runtest_logreport.<locals>.<genexpr>5  sZ      #4CJJ&--7  !(\4 @I M	 
 !([$ ?: M #4   AAA	Arh   c              3     >#    U  HI  nUR                   TR                   :X  d  M  [        US S5      T:X  d  M2  [        USS5      T:X  d  ME  Uv   MK     g7frd  re  rf  s     r   rk  rl  Z  sZ      0

fmm3  $Ct<	I	 
 $Cd;zI C0rm  )r   r   r]  r   failedr   nextrL  r   rM  r   rQ   r   r   r   r   r   update_testcase_durationremove)rK   r   close_reportrS  ri  rj  s    `  @@r   pytest_runtest_logreportLogXML.pytest_runtest_logreport  s   . =={{f$--f5$$V,]]{{j($V[$?
#FL$?	##'#4#4     MM,/..!3.))&1H{{f$''/!!((0--226:%%f-^^))&1H##F+%%f-;;*$))&1H**62MM&! d;Jd;I#00 L !!((6 ' %r   c                    U R                   SUR                  1;   a2  U R                  U5      nU=R                  [	        USS5      -  sl        gg)z{Accumulate total duration for nodeid from given report and update
the Junit.testcase with the new total if already created.r  rH   rC   N)rE  r   r   rH   r   r\  s      r   rq  LogXML.update_testcase_durationh  sJ     GV[[#99))&1HS!AA :r   c                    UR                   (       dF  U R                  U5      nUR                  (       a  UR                  U5        g UR	                  U5        g g r&   )r   r]  ro  r   r   r\  s      r   pytest_collectreportLogXML.pytest_collectreporto  sA    }}))&1H}}--f5//7 r   c                    U R                  S5      nUR                  R                  SSS9  UR                  SS[	        U5      5        g )Ninternalr  )r6   r7   r   zinternal error)r   rJ   r,   r   r   )rK   excreprrS  s      r   pytest_internalerrorLogXML.pytest_internalerrorw  s@    %%j1zBW&6GEr   c                8    [         R                  " 5       U l        g r&   )r   Instantsuite_start)rK   s    r   pytest_sessionstartLogXML.pytest_sessionstart|  s    !>>+r   c                   [         R                  R                  [         R                  R                  U R                  5      5      n[         R
                  " USS9  [        U R                  SSS9 nU R                  R                  5       nU R                  S   U R                  S   -   U R                  S   -   U R                  S	   -   U R                  -
  nUR                  S
5        [        R                  " SU R                  [        U R                  S	   5      [        U R                  S   5      [        U R                  S   5      [        U5      UR                   S U R                  R#                  5       R%                  5       R'                  5       [(        R*                  " 5       S9	nU R-                  5       nUb  UR/                  U5        U R0                   H"  nUR/                  UR3                  5       5        M$     [        R                  " S5      nUR5                  SS5        UR/                  U5        UR                  [        R6                  " USS95        S S S 5        g ! , (       d  f       g = f)NT)exist_okwzutf-8)encodingr   r   r   r   z&<?xml version="1.0" encoding="utf-8"?>	testsuitery   )r7   errorsfailuresr   testsrz   	timestamphostname
testsuitesr7   zpytest testsunicode)r>  r  dirnamerB  rC  makedirsopenr  elapsedrH  rM  writer`   ra   rD  r   secondsas_utc
astimezone	isoformatplatformrR   _get_global_properties_noderQ   rJ  r|   settostring)	rK   r  rC  rH   numtests
suite_noderK  r   r  s	            r   pytest_sessionfinishLogXML.pytest_sessionfinish  s   ''//"''//$,,"?@
Gd+$,,g6'''//1H 

8$**Y'(**Y'( **W%& ,,	-  MMBC__4::g./TZZ	23DJJy12(m ((-**113>>@JJL!
J !% @ @ B ,!!"34!%!<!<!!-"6"6"89 "=L1JNN6>2j)MM"++j9EF? 766s   1G/I))
I7c                B    UR                  SSU R                   35        g )Nr   zgenerated xml file: )	write_seprC  )rK   terminalreporters     r   pytest_terminal_summaryLogXML.pytest_terminal_summary  s    ""3*>t||n(MNr   c                l    Sn[        SU5        U R                  R                  U[        U5      45        g )NTr7   )r  rK  rQ   r$   )rK   r7   rV   r  s       r   r  LogXML.add_global_property  s0      .%%t^E-B&CDr   c           	         U R                   (       aQ  [        R                  " S5      nU R                    H)  u  p#UR                  [        R                  " SX#S95        M+     U$ gr]   )rK  r`   ra   rQ   rb   s       r   r  "LogXML._get_global_properties_node  sM    !!L1J#55!!"**Zd"PQ  6r   )rM  rG   rK  r   rC  r   rI  rJ  rL  rj   rE  rH  rD  r  N)r  r   r  r=   T)rj   r   rD  r   r   r   rE  r   r   r  r   r   r   )r   zTestReport | strr   r@   )ru   r   r   r   )r   r   r   r@   )r}  r   r   r   r   )r  r   r   r   r   r   )r   r   r   r   rM   r   r   rF   r]  rt  rq  ry  r~  r  r  r  r  r  r   r   r   r   r   r     s    
 #&"&# # 	#
 # #  # 
#B
 $!
S7jB8F
,$GLOE
r   )r"   r   r   r   r   )r   r   r   r   r   r   )r   r   r   zCallable[[str, object], None])r  r   r  r   r   r   )r&  r   r   r   )r   r	   r   r   )r9  r   r   z	list[str])2__doc__
__future__r   collections.abcr   r#  r>  r  r    xml.etree.ElementTreeetreeElementTreer`   _pytestr   r   _pytest._code.coder   r   _pytest.configr	   r
   _pytest.config.argparsingr   _pytest.fixturesr   _pytest.reportsr   _pytest.stashr   _pytest.terminalr   r  r   r$   r4   ro   copyr@   r   fixturer   r   r  r  r'  r/  r2  ri   r   r   r   r   <module>r     s^   # $  	  	 " "   , / ! ' , + & " -  8

26 ;/0!89
 g&++-  Xh.!9 : g& l# l#^

+.
	
  ,  8E i # !#L,^="-j jr   