
    F-Phac                       d 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
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#dddgidg didZ$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*d?d,Z+ e j(        d-.          d>d/            Z,d@d2Z-dAd5Z.dAd6Z/dBd9Z0 G d: d          Z1dS )Ca  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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re.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     P/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/_pytest/junitxml.pyreplzbin_xml_escape.<locals>.repl0   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_familyr6   @   s    F**,, ! !Bkkmm 	! 	!FBb$'' *R)))bF2JJ	! 	KKr!   testcase	classnamename)filelineurl)_base_base_legacyr=   xunit1r>   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        )idrE   	add_statsfamilyduration
propertiesr   attrs)selfrC   rE   s      r   __init__z_NodeReporter.__init__W   sG    +ho13')
%'


r!   node
ET.Elementc                x    | j                             |j                   | j                            |           d S r(   )rE   rI   tagr   append)rN   rP   s     r   rT   z_NodeReporter.appenda   s6    48$$$
$r!   r9   r   valuer   c                r    | j                             t          |          t          |          f           d S r(   )rL   rT   r   r%   rN   r9   rU   s      r   add_propertyz_NodeReporter.add_propertye   s1    D		>%+@+@ABBBBBr!   c                N    t          |          | j        t          |          <   d S r(   )r%   rM   r   rW   s      r   add_attributez_NodeReporter.add_attributeh   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.rL   propertyr9   rU   N)rL   ETElementrT   rN   rL   r9   rU   s       r   make_properties_nodez"_NodeReporter.make_properties_nodek   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   .)r8   r9   r:      r;   r<   r?   r7   )mangle_test_addressrC   rM   rE   prefixinsertjoinr%   locationr   hasattrr<   r.   rJ   families)rN   rd   namesexisting_attrs
classnamesrM   
temp_attrskeys           r   record_testreportz_NodeReporter.record_testreportt   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 )Nr7   .3f)time)r`   ra   rM   rK   rc   rT   extendr   )rN   r7   rL   s      r   to_xmlz_NodeReporter.to_xml   sd    :j$*dm;Q;QRRR..00
!OOJ'''
###r!   NrS   messagedata
str | Nonec                    t          j        ||          }t          |          |_        |                     |           d S )N)r{   r`   ra   r%   textrT   )rN   rS   r{   r|   rP   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   )	rE   log_passing_testspassed	capstdoutcaplog	capstderrlogging_prepare_content_write_content)rN   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   )rl   center)rN   r   r   s      r   r   z_NodeReporter._prepare_content   s)    yy&--C00'2>???r!   jheaderc                    t          j        |          }t          |          |_        |                     |           d S r(   r   )rN   r   r   r   rS   s        r   r   z_NodeReporter._write_content   s8    j!!!'**Cr!   c                0    |                      d           d S )Nr   )rI   rN   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)rn   r   longreprgetattrr{   r   r%   )rN   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%   )rN   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)r-   r{   z	Skipped: 	   :z: zpytest.skip)rn   r   
startswithr%   r`   ra   rT   r*   r   tupler   r   )rN   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!   )rz   __dict__clear)rN   r|   s    @r   finalizez_NodeReporter.finalize   s7    {{}} #lllr!   )rC   rD   rE   r   r   r&   )rP   rQ   r   r&   r9   r   rU   r   r   r&   r   r[   )rd   r   r   r&   )r   rQ   r(   )rS   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__rO   rT   rX   rZ   rc   ru   rz   r   r   r   r   r   r   r   r   r   r   r   r   r!   r   rB   rB   V   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!   rB   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)r?   legacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	_pytest.warning_typesr   configstashgetxml_keyrJ   rP   warn)r   r   r   rE   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_propertyr9   r   rU   r   r   r&   c                J    j         j                            | |f           d S r(   )rP   user_propertiesrT   )r9   rU   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_attributer9   r   rU   r   r   r&   c                    d S r(   r   r_   s     r   add_attr_noopz+record_xml_attribute.<locals>.add_attr_noop;  s    r!   Nr   )r   r   rP   r   r   r   r   r   r   node_reporterrC   rZ   )r   r   r   	attr_funcrE   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,   formatr-   r   )r   r   __tracebackhide__r   s       r   _check_record_param_typer   H  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.
    Tr9   r   rU   r   r   r&   c                *    d}t          d|            dS )zFNo-op function in case --junit-xml was not passed in the command-line.Tr9   N)r   )r9   rU   r   s      r   record_funcz.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  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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)r   r   s     r   pytest_addoptionr  x  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   rn   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   rE   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   rg   z\.py$r   rf   )	partitionsplitreplacer   SEPr"   r#   )r  r   possible_open_bracketparamsrp   s        r   ri   ri     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
  r?   Trj   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   r?   )osr   
expanduser
expandvarsnormpathabspathlogfilerj   r(  r   r   r)  rJ   dictfromkeysstatsnode_reportersnode_reporters_orderedglobal_propertiesopen_reportscnt_double_fail_tests)rN   r0  rj   r(  r   r)  rJ   r   s           r   rO   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 NrC   rP   )r   r4  popr   rX   r   r   )rN   r   rC   
workernodereporterpropname	propvalues          r   r   zLogXML.finalize  s    622VVT22
&**FJ+?@@#)#9 	< 	<Hi!!(C	NN;;;;  r!   TestReport | strrB   c                    t          |d|          }t          |dd           }||f}|| j        v r| j        |         S t          ||           }|| j        |<   | j                            |           |S r:  )r   r4  rB   r5  rT   )rN   r   rC   r<  rt   r=  s         r   r   zLogXML.node_reporter  s    #*68V#D#DVVT22
j $%%%&s++ ..#+C #**8444r!   rt   c                F    || j         v r| j         |xx         dz  cc<   d S d S )Nrh   )r3  )rN   rt   s     r   rI   zLogXML.add_stats
  s3    $*JsOOOq OOOOO r!   c                Z    |                      |          }|                    |           |S r(   )r   ru   rN   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 rI  NrH  rC   r   .0repr   	report_ii
report_wids     r   	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>5  so        J&-77 '\4 @ @I M M '[$ ? ?: M M 
 !N M M M r!   rh   c              3     K   | ]@}|j         j         k    r.t          |d d          k    rt          |dd          k    <|V  AdS rK  rL  rM  s     r   rR  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>Z  so        
fm33#Ct<<	II#Cd;;zII 
 JIII r!   )r   r   rE  r   failedr   nextr7  r   r8  r   rT   r   r   r   r   r   update_testcase_durationremove)rN   r   close_reportr=  rP  rQ  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
  rK   rG   N)r)  r   r   rK   r   rD  s      r   rV  zLogXML.update_testcase_durationh  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   rE  rT  r   r   rD  s      r   pytest_collectreportzLogXML.pytest_collectreporto  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  )r8   r9   r   zinternal error)r   rM   r.   r   r   )rN   r]  r=  s      r   pytest_internalerrorzLogXML.pytest_internalerrorw  sU    %%j11zBBBW&6GEEEEEr!   c                6    t          j                    | _        d S r(   )r   Instantsuite_start)rN   s    r   pytest_sessionstartzLogXML.pytest_sessionstart|  s    !>++r!   c                
   t           j                            t           j                            | j                            }t          j        |d           t          | j        dd          5 }| j                                        }| 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          |          |j        d| j                                                                                                        t)          j                    	  	        }|                                 }||                    |           | j        D ])}|                    |                                           *t          j        d          }|                    d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"?>	testsuiterw   )r9   errorsfailuresr   testsrx   	timestamphostname
testsuitesr9   zpytest testsunicode)r+  r   dirnamer/  r0  makedirsopenrc  elapsedr3  r8  writer`   ra   r(  r   secondsas_utc
astimezone	isoformatplatformrP   _get_global_properties_noderT   r5  rz   settostring)	rN   rq  r0  rK   numtests
suite_noder6  r   ro  s	            r   pytest_sessionfinishzLogXML.pytest_sessionfinish  s   '//"'//$,"?"?@@
Gd++++$,g666 	G''//11H 
8$*Y'(*Y'( *W%& ,	-  MMBCCC_4:g.//TZ	233DJy122(mm (..*1133>>@@JJLL!
 
 
J !% @ @ B B ,!!"3444!%!< : :!!-"6"6"8"89999L11JNN6>222j)))MM"+j9EEEFFF?	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   /G<I88I<?I<terminalreporterr   c                B    |                     dd| j                    d S )Nr   zgenerated xml file: )	write_sepr0  )rN   r  s     r   pytest_terminal_summaryzLogXML.pytest_terminal_summary  s)    ""3(Mt|(M(MNNNNNr!   r9   rU   r   c                |    d}t          d|           | j                            |t          |          f           d S )NTr9   )r   r6  rT   r%   )rN   r9   rU   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]   )r6  r`   ra   rT   rb   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
  r?   T)rj   r}   r(  r   r   r   r)  r   r   r  r   r&   r   )r   r@  r   rB   )rt   r   r   r&   )r   r   r   rB   )r]  r   r   r&   r   )r  r   r   r&   r   r   )r   r   r   rO   r   r   rI   rE  rY  rV  r\  r`  rd  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L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  )2__doc__
__future__r   collections.abcr   r  r+  rz  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%   r6   ro   copyrB   r   fixturer   r   r   r   r  r  r  ri   r   r   r!   r   <module>r     sU    # " " " " " $ $ $ $ $ $     				  				 " " " " " " " " "             , , , , , , / / / / / / ! ! ! ! ! ! ' ' ' ' ' ' , , , , , , + + + + + + & & & & & & " " " " " " - - - - - -  (8


2 2 2 26    ;/0!8!8!89 
 g&++--  Xh.!9 : : : g& l# l# l# l# l# l# l# l#^
 
 
 
    ,    8E E E E i   # # # ! #L, , , ,^= = = ="- - - -   j j j j j j j j j jr!   