
    jc                       d 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ZddlZddl	m
Z
 ddl	mZ ddlmc mZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#Z# e d                     Z$d=dZ%d>dZ&i Z'dddgie'd<   dg die'd <   e'd         (                                e'd!<    e&e'd!         e'd                     e'd         e'd"<    G d# d$          Z)d?d(Z*e#j+        d@d*            Z,e#j+        d@d+            Z-dAd.Z. e#j+        d/0          d@d1            Z/dBd4Z0dCd7Z1dCd8Z2dDd;Z3 G d< d          Z4dS )Ea  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)datetime)timezoneN)Callable)Match)nodes)timing)ExceptionRepr)ReprFileLocation)Config)filename_arg)Parser)FixtureRequest)
TestReport)StashKey)TerminalReporterLogXMLargobjectreturnstrc                T    dd}d}t          j        ||t          |                     S )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.
    matchobj
Match[str]r   r   c                h    t          |                                           }|dk    rd|dS d|dS )N   z#x02X04X)ordgroup)r   is     Z/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/_pytest/junitxml.pyreplzbin_xml_escape.<locals>.repl3   s>      !!99<<<<<<    u    [^	
 -~-퟿-�က0-ჿff])r   r   r   r   )resubr   )r   r#   illegal_xml_res      r"   bin_xml_escaper(   (   s=            	W  6.$C111r$   Nonec                   i }|                                  D ]X\  }}|                                 D ]>\  }}t          |t                    st          t	          |                    ||z   ||<   ?Y|                     |           d S N)items
isinstancelist	TypeErrortypeupdate)leftrightresultklvlkrvrs          r"   merge_familyr9   C   s    F**,, ! !Bkkmm 	! 	!FBb$'' *R)))bF2JJ	! 	KKr$   testcase	classnamename_base)filelineurl_base_legacyxunit1xunit2c                      e Zd Zd+dZd,d
Zd-dZd-dZd.dZd/dZd0dZ	d1d2dZ
d3dZd4d!Zd5d#Zd3d$Zd3d%Zd3d&Zd3d'Zd3d(Zd3d)Zd6d*ZdS )7_NodeReporternodeidstr | TestReportxmlr   r   r)   c                    || _         || _        | j        j        | _        | j        j        | _        d| _        g | _        g | _        i | _        d S )N        )idrH   	add_statsfamilyduration
propertiesr   attrs)selfrF   rH   s      r"   __init__z_NodeReporter.__init__Z   sG    +ho13')
%'


r$   node
ET.Elementc                x    | j                             |j                   | j                            |           d S r+   )rH   rL   tagr   append)rQ   rS   s     r"   rW   z_NodeReporter.appendd   s6    48$$$
$r$   r<   r   valuer   c                r    | j                             t          |          t          |          f           d S r+   )rO   rW   r   r(   rQ   r<   rX   s      r"   add_propertyz_NodeReporter.add_propertyh   s1    D		>%+@+@ABBBBBr$   c                N    t          |          | j        t          |          <   d S r+   )r(   rP   r   rZ   s      r"   add_attributez_NodeReporter.add_attributek   s"     .u 5 5
3t99r$   ET.Element | Nonec                    | j         rMt          j        d          }| j         D ]/\  }}|                    t          j        d||                     0|S dS z9Return a Junit node containing custom properties, if any.rO   propertyr<   rX   N)rO   ETElementrW   rQ   rO   r<   rX   s       r"   make_properties_nodez"_NodeReporter.make_properties_noden   se    ? 	L11J# R Re!!"*Zd%"P"P"PQQQQtr$   
testreportr   c                t   t          |j                  }| j        }|d d         }| j        j        r |                    d| j        j                   d                    |          t          |d                   |j        d         d}|j        d         t          |j        d                   |d<   t          |d          r
|j        |d<   || _        | j                            |           | j        dk    rd S i }| j        D ],}|t          | j                 d	         v r| j        |         ||<   -|| _        d S )
Nr   .)r;   r<   r>      r?   r@   rB   r:   )mangle_test_addressrF   rP   rH   prefixinsertjoinr(   locationr   hasattrr@   r1   rM   families)rQ   rg   namesexisting_attrs
classnamesrP   
temp_attrskeys           r"   record_testreportz_NodeReporter.record_testreportw   sB   #J$5663B3Z
8? 	2a111*--"59--'*!
 !

 q!-
 3A 677E&M:u%% 	*%>E%L

.))) ;(""F 
: 	2 	2Cht{+J777"&*S/
3


r$   c                    t          j        d| j        | j        d          }|                                 }||                    |           |                    | j                   |S )Nr:   .3f)time)rc   rd   rP   rN   rf   rW   extendr   )rQ   r:   rO   s      r"   to_xmlz_NodeReporter.to_xml   sd    :j$*dm;Q;QRRR..00
!OOJ'''
###r$   NrV   messagedata
str | Nonec                    t          j        ||          }t          |          |_        |                     |           d S )N)r~   rc   rd   r(   textrW   )rQ   rV   r~   r   rS   s        r"   _add_simplez_NodeReporter._add_simple   s=    z#w///"4((	Dr$   reportc                    | j         j        s	|j        rd S |j        }|j        }|j        }| j         j        dk    rd S d}| j         j        dv r|                     |d          }| j         j        dv r2||                     |d          z  }|                     ||d           d}| j         j        dv r2||                     |d	          z  }|                     ||d
           d}|r|                     ||d           d S d S )Nno )logallz Captured Log )
system-outout-errr   z Captured Out r   )
system-errr   r   z Captured Err r   )	rH   log_passing_testspassed	capstdoutcaplog	capstderrlogging_prepare_content_write_content)rQ   r   content_outcontent_logcontent_errcontent_alls         r"   write_captured_outputz#_NodeReporter.write_captured_output   s9   x) 	fm 	F&m&8t##F8~--//=MNNK8???400>NOOOK\BBBK8???400>NOOOK\BBBK 	C\BBBBB	C 	Cr$   contentheaderc                Z    d                     |                    dd          |dg          S )N
P   -r   )ro   center)rQ   r   r   s      r"   r   z_NodeReporter._prepare_content   s)    yy&--C00'2>???r$   jheaderc                    t          j        |          }t          |          |_        |                     |           d S r+   r   )rQ   r   r   r   rV   s        r"   r   z_NodeReporter._write_content   s8    j!!!'**Cr$   c                0    |                      d           d S )Nr   )rL   rQ   r   s     r"   append_passz_NodeReporter.append_pass   s    x     r$   c                @   t          |d          r|                     dd           d S |j        J t          |j        dd           }||j        }nt          |j                  }t          |          }|                     d|t          |j                             d S )Nwasxfailskippedz%xfail-marked test passes unexpectedly	reprcrashfailure)rq   r   longreprgetattrr~   r   r(   )rQ   r   r   r~   s       r"   append_failurez_NodeReporter.append_failure   s    6:&& 	GY(OPPPPP?...18d2 2I $#+fo..$W--GYV_1E1EFFFFFr$   c                j    |j         J |                     ddt          |j                              d S )Nerrorzcollection failure)r   r   r   r   s     r"   append_collect_errorz"_NodeReporter.append_collect_error   s9    ***"6FO8L8LMMMMMr$   c                X    |                      ddt          |j                             d S )Nr   zcollection skipped)r   r   r   r   s     r"   append_collect_skippedz$_NodeReporter.append_collect_skipped   s+    $8#fo:N:NOOOOOr$   c                   |j         J t          |j         dd           }||j        }nt          |j                   }|j        dk    rd| d}nd| d}|                     dt          |          t          |j                              d S )Nr   teardownzfailed on teardown with ""zfailed on setup with "r   )r   r   r~   r   whenr   r(   )rQ   r   r   reasonmsgs        r"   append_errorz_NodeReporter.append_error   s    ***-4V_kSW-X-X	 &FF))F;*$$7f777CC46444C."5"5s6?7K7KLLLLLr$   c                P   t          |d          rc|j        }|                    d          r
|dd          }t          |          }t	          j        dd|          }|                     |           d S t          |j        t                    sJ |j        \  }}}|                    d          r
|dd          }| d	| d
| }t	          j        ddt          |                    }t          |          |_
        |                     |           |                     |           d S )Nr   zreason:    r   zpytest.xfail)r0   r~   z	Skipped: 	   :z: zpytest.skip)rq   r   
startswithr(   rc   rd   rW   r-   r   tupler   r   )rQ   r   xfailreasonr   filenamelineno
skipreasondetailss           r"   append_skippedz_NodeReporter.append_skipped   s?   6:&& 	/ /K%%j11 .)!""o(55KjUUUGKK     fou55555+1?(Hfj$$[11 ,'^
!::F::j::Gj~j7Q7Q  G *'22GLKK   &&v.....r$   c                v    |                                  | j                                         fd| _         d S )Nc                      S r+    )r   s   r"   <lambda>z(_NodeReporter.finalize.<locals>.<lambda>  s    d r$   )r}   __dict__clear)rQ   r   s    @r"   finalizez_NodeReporter.finalize   s7    {{}} #lllr$   )rF   rG   rH   r   r   r)   )rS   rT   r   r)   r<   r   rX   r   r   r)   r   r^   )rg   r   r   r)   )r   rT   r+   )rV   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)   )__name__
__module____qualname__rR   rW   r[   r]   rf   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r$   r"   rE   rE   Y   s       ( ( ( (       C C C C6 6 6 6          <       
C C C C.@ @ @ @   
! ! ! !G G G G N N N N
P P P PM M M M/ / / /,# # # # # #r$   rE   requestr   fixture_namec                    ddl m} | j        j                            t
          d          }|9|j        dvr2| j                             || d|j         d                     dS dS dS )z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )PytestWarningN)rB   legacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	_pytest.warning_typesr   configstashgetxml_keyrM   rS   warn)r   r   r   rH   s       r"   !_warn_incompatibility_with_xunit2r     s     433333
.

"
"7D
1
1C
3:-AAAMmmSZmmm 	
 	
 	
 	
 	
 AAr$   Callable[[str, object], None]c                4     t           d           d	 fd}|S )
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_propertyr<   r   rX   r   r   r)   c                J    j         j                            | |f           d S r+   )rS   user_propertiesrW   )r<   rX   r   s     r"   append_propertyz(record_property.<locals>.append_property(  s&    $++T5M:::::r$   r   )r   )r   r   s   ` r"   r   r     s<     &g/@AAA; ; ; ; ; ; r$   c                   ddl m} | j                             |d                     t	          | d           dd}|}| j        j                            t          d          }|&|	                    | j        j
                  }|j        }|S )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_attributer<   r   rX   r   r   r)   c                    d S r+   r   rb   s     r"   add_attr_noopz+record_xml_attribute.<locals>.add_attr_noop>  s    r$   Nr   )r   r   rS   r   r   r   r   r   r   node_reporterrF   r]   )r   r   r   	attr_funcrH   r   s         r"   r   r   .  s     CBBBBBL$$%VWW   &g/EFFF    I
.

"
"7D
1
1C
))',*=>>!/	r$   paramvc                    d}t          |t                    s8d}t          |                    | t	          |          j                            dS )zcUsed 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)r   gN)r-   r   r/   formatr0   r   )r   r   __tracebackhide__r   s       r"   _check_record_param_typer   K  sU     a EE

$q''2B
CCDDDE Er$   session)scopec                n    d}d
d}| j         j                            t          d	          }||j        }|S )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.
    Tr<   r   rX   r   r   r)   c                *    d}t          d|            dS )zFNo-op function in case --junit-xml was not passed in the command-line.Tr<   N)r   )r<   rX   r   s      r"   record_funcz.record_testsuite_property.<locals>.record_funcp  s      .....r$   Nr   )r   r   r   r   add_global_property)r   r   r   rH   s       r"   record_testsuite_propertyr   T  sM    4 / / / /
 .

"
"7D
1
1C
-r$   parserr   c                   |                      d          }|                    dddddt          j        t          d          d d	           |                    d
dddd d           |                     ddd           |                     ddd           |                     dddd           |                     ddd           |                     ddd            d S )!Nzterminal reportingz
--junitxmlz--junit-xmlstorexmlpathpath)optnamez0Create junit-xml style report file at given path)actiondestmetavarr0   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)r0   r  junit_duration_reportz*Duration time to report: one of total|calltotaljunit_familyz0Emit XML for schema: one of legacy|xunit1|xunit2rC   )getgroup	addoption	functoolspartialr   addini)r   r    s     r"   pytest_addoptionr  {  sR   OO011E	OO|\BBB?  	 	 	 
OO?     MM>     MM	:	     MM!E	     MM4    
 MM:      r$   r   r   c                   | j         j        }|rt          | d          s|                     d          }t	          || j         j        |                     d          |                     d          |                     d          ||                     d                    | j        t          <   | j        	                    | j        t                              d S d S d S )Nworkerinputr  r  r	  r  r
  )
optionr   rq   getinir   junitprefixr   r   pluginmanagerregister)r   r   r  s      r"   pytest_configurer    s    m#G =wv}55 =}}^44 &M%MM,--MM/**MM122MM344!
 !
W 	%%fl7&;<<<<<= = = =r$   c                    | j                             t          d           }|r)| j         t          = | j                            |           d S d S r+   )r   r   r   r  
unregister)r   rH   s     r"   pytest_unconfigurer    sR    
,

7D
)
)C
 -L!'',,,,,- -r$   address	list[str]c                   |                      d          \  }}}|                    d          }|d                             t          j        d          |d<   t          j        dd|d                   |d<   |dxx         ||z   z  cc<   |S )N[z::r   rj   z\.py$r   ri   )	partitionsplitreplacer   SEPr%   r&   )r   r   possible_open_bracketparamsrs   s        r"   rl   rl     s    *1*;*;C*@*@'D
JJtEQx	3//E!HvhE!H--E!H	"III&//IIILr$   c                      e Zd Z	 	 	 	 	 d,d-dZd.dZd/dZd0dZd1dZd.dZd.dZ	d.dZ
d2dZd3d Zd3d!Zd4d$Zd5d(Zd6d*Zd+S )7r   r  r   r  rB   Trm   r   
suite_namer   r   report_durationr   r  r   r)   c                   t           j                            t           j                            |                    }t           j                            t           j                            |                    | _        || _        || _        || _	        || _
        || _        || _        t                              g dd          | _        i | _        g | _        g | _        g | _        d| _        | j        dk    r	d| _        d S d S )N)r   r   r   r   r   r   rB   )osr   
expanduser
expandvarsnormpathabspathlogfilerm   r+  r   r   r,  rM   dictfromkeysstatsnode_reportersnode_reporters_orderedglobal_propertiesopen_reportscnt_double_fail_tests)rQ   r3  rm   r+  r   r,  rM   r   s           r"   rR   zLogXML.__init__  s     '$$RW%7%7%@%@AAw''(@(@AA$!2.%)]]555q&
 &

 UW;=#8: /1%&" ;("""DKKK #"r$   r   r   c                   t          |d|          }t          |dd           }| j                            ||f          }|j        D ](\  }}|                    |t          |                     )||                                 d S d S NrF   rS   )r   r7  popr   r[   r   r   )rQ   r   rF   
workernodereporterpropname	propvalues          r"   r   zLogXML.finalize  s    622VVT22
&**FJ+?@@#)#9 	< 	<Hi!!(C	NN;;;;  r$   TestReport | strrE   c                    t          |d|          }t          |dd           }||f}|| j        v r| j        |         S t          ||           }|| j        |<   | j                            |           |S r=  )r   r7  rE   r8  rW   )rQ   r   rF   r?  rw   r@  s         r"   r   zLogXML.node_reporter  s    #*68V#D#DVVT22
j $%%%&s++ ..#+C #**8444r$   rw   c                F    || j         v r| j         |xx         dz  cc<   d S d S )Nrk   )r6  )rQ   rw   s     r"   rL   zLogXML.add_stats  s3    $*JsOOOq OOOOO r$   c                Z    |                      |          }|                    |           |S r+   )r   rx   rQ   r   r@  s      r"   _opentestcasezLogXML._opentestcase  s.    %%f--""6***r$   c                v   d}j         r7j        dk    r*|                               }|                               n1j        rj        dk    rlt          dd          t          dd          t          fd| j        D             d          }|r%|                     |           | xj	        dz  c_	        |                               }j        dk    rL|
                               | j                                       | j        s|                               nG|                               n1j        r*|                               }|                               |                                j        dk    r|                               }|                               |                                t          dd          t          dd          t          fd| j        D             d          }|r| j                            |           dS dS dS )	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     K   | ]@}|j         j         k    r.t          |d d          k    rt          |dd          k    <|V  AdS rL  NrK  rF   r   .0repr   	report_ii
report_wids     r"   	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>8  so        J&-77 '\4 @ @I M M '[$ ? ?: M M 
 !N M M M r$   rk   c              3     K   | ]@}|j         j         k    r.t          |d d          k    rt          |dd          k    <|V  AdS rN  rO  rP  s     r"   rU  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>]  so        
fm33#Ct<<	II#Cd;;zII 
 JIII r$   )r   r   rH  r   failedr   nextr:  r   r;  r   rW   r   r   r   r   r   update_testcase_durationremove)rQ   r   close_reportr@  rS  rT  s    `  @@r"   pytest_runtest_logreportzLogXML.pytest_runtest_logreport  s   . = %	,{f$$--f55$$V,,,] !	,{j(($V[$??
#FL$??	#     #'#4         4 MM,///..!3..))&11H{f$$''///!((000- ;226:::%%f----^ 	,))&11H##F+++%%f---;*$$))&11H**6222MM&!!! d;;Jd;;I     #0    L  7!((66666) %$&7 7r$   c                    | j         d|j        hv r6|                     |          }|xj        t	          |dd          z  c_        dS dS )zAccumulate total duration for nodeid from given report and update
        the Junit.testcase with the new total if already created.r  rN   rJ   N)r,  r   r   rN   r   rG  s      r"   rY  zLogXML.update_testcase_durationk  sZ     GV[#999))&11HS!A!AA :9r$   c                    |j         sJ|                     |          }|j        r|                    |           d S |                    |           d S d S r+   )r   rH  rW  r   r   rG  s      r"   pytest_collectreportzLogXML.pytest_collectreportr  sg    } 	8))&11H} 8--f55555//77777	8 	8r$   excreprr
   c                    |                      d          }|j                            dd           |                    ddt	          |                     d S )Ninternalr  )r;   r<   r   zinternal error)r   rP   r1   r   r   )rQ   r`  r@  s      r"   pytest_internalerrorzLogXML.pytest_internalerrorz  sU    %%j11zBBBW&6GEEEEEr$   c                6    t          j                    | _        d S r+   )r	   r{   suite_start_time)rQ   s    r"   pytest_sessionstartzLogXML.pytest_sessionstart  s     &r$   c                   t           j                            t           j                            | j                            }t          j        |d           t          | j        dd          5 }t          j                    }|| j	        z
  }| j
        d         | j
        d         z   | j
        d         z   | j
        d	         z   | j        z
  }|                    d
           t          j        d| j        t!          | j
        d	                   t!          | j
        d                   t!          | j
        d                   t!          |          |dt#          j        | j	        t&          j                                                                                  t/          j                    	  	        }|                                 }||                    |           | j        D ])}|                    |                                           *t          j        d          }	|	                    |           |                    t          j        |	d                     d d d            d S # 1 swxY w Y   d S )NT)exist_okwzutf-8)encodingr   r   r   r   z&<?xml version="1.0" encoding="utf-8"?>	testsuiterz   )r<   errorsfailuresr   testsr{   	timestamphostname
testsuitesunicode)r.  r   dirnamer2  r3  makedirsopenr	   r{   re  r6  r;  writerc   rd   r+  r   r   fromtimestampr   utc
astimezone	isoformatplatformrS   _get_global_properties_noderW   r8  r}   tostring)
rQ   rs  r3  suite_stop_timesuite_time_deltanumtests
suite_noder9  r   rq  s
             r"   pytest_sessionfinishzLogXML.pytest_sessionfinish  s   '//"'//$,"?"?@@
Gd++++$,g666 !	G'$kmmO.1FF 
8$*Y'(*Y'( *W%& ,	-  MMBCCC_4:g.//TZ	233DJy122(mm(.."01FUU!  J !% @ @ B B ,!!"3444!%!< : :!!-"6"6"8"89999L11Jj)))MM"+j9EEEFFFC!	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	G !	Gs   /G0I,,I03I0terminalreporterr   c                B    |                     dd| j                    d S )Nr   zgenerated xml file: )	write_sepr3  )rQ   r  s     r"   pytest_terminal_summaryzLogXML.pytest_terminal_summary  s)    ""3(Mt|(M(MNNNNNr$   r<   rX   r   c                |    d}t          d|           | j                            |t          |          f           d S )NTr<   )r   r9  rW   r(   )rQ   r<   rX   r   s       r"   r   zLogXML.add_global_property  sB      ...%%t^E-B-B&CDDDDDr$   r^   c                    | j         rMt          j        d          }| j         D ]/\  }}|                    t          j        d||                     0|S dS r`   )r9  rc   rd   rW   re   s       r"   r|  z"LogXML._get_global_properties_node  sg    ! 	L11J#5 R Re!!"*Zd%"P"P"PQQQQtr$   N)r  r   r  rB   T)rm   r   r+  r   r   r   r,  r   r   r  r   r)   r   )r   rC  r   rE   )rw   r   r   r)   )r   r   r   rE   )r`  r
   r   r)   r   )r  r   r   r)   r   r   )r   r   r   rR   r   r   rL   rH  r\  rY  r_  rc  rf  r  r  r   r|  r   r$   r"   r   r     s]       
 #&"&# # # # #B
  
  
  
    $! ! ! !   
S7 S7 S7 S7jB B B B8 8 8 8F F F F
. . . .&G &G &G &GPO O O OE E E E
     r$   )r   r   r   r   r   )r   r   r   r   r   r)   )r   r   r   r   )r   r   r   r   r   r)   )r   r   r   r)   )r   r   r   r)   )r   r   r   r!  )5__doc__
__future__r   r   r   r  r.  r{  r%   typingr   r   xml.etree.ElementTreeetreeElementTreerc   _pytestr   r	   _pytest._code.coder
   r   _pytest.configr   r   _pytest.config.argparsingr   _pytest.fixturesr   _pytest.reportsr   _pytest.stashr   _pytest.terminalr   r  r   r(   r9   rr   copyrE   r   fixturer   r   r   r   r  r  r  rl   r   r   r$   r"   <module>r     s    # " " " " "                 				  				             " " " " " " " " "             , , , , , , / / / / / / ! ! ! ! ! ! ' ' ' ' ' ' , , , , , , + + + + + + & & & & & & " " " " " " - - - - - -  (8


2 2 2 26    +v!67 &(?(?(?@  g&++--  Xh.!9 : : : g& l# l# l# l# l# l# l# l#^
 
 
 
    ,    8E E E E i   # # # ! #L, , , ,^= = = ="- - - -   l l l l l l l l l lr$   