
    	hmd                     ~   d 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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%  e#d                     Z&de'de(fdZ)d8d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%ed&e(ddfd'Z.ej/        d%edee(e'gdf         fd(            Z0ej/        d%edee(e'gdf         fd)            Z1d*e(d+e(ddfd,Z2 ej/        d-.          d%edee(e'gdf         fd/            Z3d0eddfd1Z4d2eddfd3Z5d2eddfd4Z6d5e(dee(         fd6Z7 G d7 d          Z8dS )9a  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
    N)datetime)Callable)Dict)List)Match)Optional)Tuple)Union)nodes)timing)ExceptionRepr)ReprFileLocation)Config)filename_arg)Parser)FixtureRequest)
TestReport)StashKey)TerminalReporterLogXMLargreturnc                     dt           t                   dt          f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.
    matchobjr   c                 d    t          |                                           }|dk    rd|z  S d|z  S )N   z#x%02Xz#x%04X)ordgroup)r   is     ]/var/www/html/web-builder-api.evdpl.com/venv/lib/python3.11/site-packages/_pytest/junitxml.pyreplzbin_xml_escape.<locals>.repl3   s6      !!99a<a<    u    [^	
 -~-퟿-�က0-ჿFF])r   strresub)r   r!   illegal_xml_res      r    bin_xml_escaper'   (   sO     uSz  c         	W  6.$C111r"   c                    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_familyr7   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eeef         ddddfdZdej        ddfdZ	d	ed
e
ddfdZd	ed
e
ddfdZdeej                 fdZdeddfdZdej        fdZd#dededee         ddfdZdeddfdZdededefdZdedededdfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfd Zdeddfd!Zd$d"ZdS )%_NodeReporternodeidxmlr   r   Nc                     || _         || _        | j        j        | _        | j        j        | _        d| _        g | _        g | _        i | _        d S )N        )idrE   	add_statsfamilyduration
propertiesr   attrs)selfrD   rE   s      r    __init__z_NodeReporter.__init__Z   sG    +ho13')
%'


r"   nodec                 x    | j                             |j                   | j                            |           d S r)   )rE   rI   tagr   append)rN   rP   s     r    rS   z_NodeReporter.appendd   s6    48$$$
$r"   r:   valuec                 r    | j                             t          |          t          |          f           d S r)   )rL   rS   r#   r'   rN   r:   rT   s      r    add_propertyz_NodeReporter.add_propertyh   s1    D		>%+@+@ABBBBBr"   c                 N    t          |          | j        t          |          <   d S r)   )r'   rM   r#   rV   s      r    add_attributez_NodeReporter.add_attributek   s"     .u 5 5
3t99r"   c                     | j         rMt          j        d          }| j         D ]/\  }}|                    t          j        d||                     0|S dS z9Return a Junit node containing custom properties, if any.rL   propertyr:   rT   N)rL   ETElementrS   rN   rL   r:   rT   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"   
testreportc                    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   .)r9   r:   r<      r=   r>   r@   r8   )mangle_test_addressrD   rM   rE   prefixinsertjoinr'   locationr#   hasattrr>   r/   rJ   keysfamilies)rN   rb   namesexisting_attrs
classnamesrM   
temp_attrskeys           r    record_testreportz_NodeReporter.record_testreportw   sL   #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        d| j        z            }|                                 }||                    |           |                    | j                   |S )Nr8   %.3f)time)r^   r_   rM   rK   ra   rS   extendr   )rN   r8   rL   s      r    to_xmlz_NodeReporter.to_xml   sc    :j$*6DM;QRRR..00
!OOJ'''
###r"   rR   messagedatac                     t          j        ||          }t          |          |_        |                     |           d S )N)rz   r^   r_   r'   textrS   )rN   rR   rz   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   )rj   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   rR   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)rl   r   longreprgetattrrz   r#   r'   )rN   r   r   rz   s       r    append_failurez_NodeReporter.append_failure   s    6:&& 	GY(OPPPPP?...4;d5 5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   rz   r#   whenr   r'   )rN   r   r   reasonmsgs        r    append_errorz_NodeReporter.append_error   s    ***07O[$1
 1
	  &FF))F;*$$7f777CC46444C."5"5s6?7K7KLLLLLr"   c                 6   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          |          |_
        |                     |           |                     |           d S )Nr   zreason:    r   zpytest.xfail)r.   rz   z	Skipped: 	   :z: zpytest.skip)rl   r   
startswithr'   r^   r_   rS   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
SSSG)'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"   )ry   __dict__clear)rN   r{   s    @r    finalizez_NodeReporter.finalize   s7    {{}} #lllr"   r)   r   N)__name__
__module____qualname__r
   r#   r   rO   r^   r_   rS   objectrW   rY   r   ra   rt   ry   r   r   r   r   r   r   r   r   r   r   r   r   r"   r    rC   rC   Y   s       (uS*_5 (H ( ( ( ( ( 2:  $        C CV C C C C C6# 6f 6 6 6 6 6hrz&:     J  4        <
     s S  QU    
CJ C4 C C C C.@ @S @S @ @ @ @Z #  PT    
!* ! ! ! ! !GZ GD G G G G N: N$ N N N N
PZ PD P P P PM: M$ M M M M /Z /D / / / /(# # # # # #r"   rC   requestfixture_namec                     ddl m} | j        j                            t
          d          }|H|j        dvrA| j                             |d	                    ||j                                       dS dS dS )z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )PytestWarningN)r@   legacyzV{fixture_name} is incompatible with junit_family '{family}' (use 'legacy' or 'xunit1'))r   rJ   )
_pytest.warning_typesr   configstashgetxml_keyrJ   rP   warnformat)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hoo!-cj p   	
 	
 	
 	
 	
 AAr"   c                 T     t           d           dt          dt          ddf 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:   rT   r   Nc                 J    j         j                            | |f           d S r)   )rP   user_propertiesrS   )r:   rT   r   s     r    append_propertyz(record_property.<locals>.append_property*  s&    $++T5M:::::r"   )r   r#   r   )r   r   s   ` r    r   r     sQ     &g/@AAA;c ;& ;T ; ; ; ; ; ; r"   c                 >   ddl m} | j                             |d                     t	          | d           dt
          dt          ddf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:   rT   r   Nc                     d S r)   r   r]   s     r    add_attr_noopz+record_xml_attribute.<locals>.add_attr_noop@  s    r"   )r   r   rP   r   r   r#   r   r   r   r   r   node_reporterrD   rY   )r   r   r   	attr_funcrE   r   s         r    r   r   0  s     CBBBBBL$$%VWW   &g/EFFFC  4     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-   r   r.   r   )r   r   __tracebackhide__r   s       r    _check_record_param_typer   M  sU     a EE

$q''2B
CCDDDE Er"   session)scopec                     d}dt           dt          ddf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:   rT   r   Nc                 *    d}t          d|            dS )zENo-op function in case --junitxml was not passed in the command-line.Tr:   N)r   )r:   rT   r   s      r    record_funcz.record_testsuite_property.<locals>.record_funcs  s      .....r"   )r#   r   r   r   r   r   add_global_property)r   r   r   rE   s       r    record_testsuite_propertyr   V  sb    6 /# /f / / / / /
 .

"
"7D
1
1C
-r"   parserc                    |                      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|xunit2rA   )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   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   rl   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"   addressc                    |                      d          \  }}}|                    d          }|d                             t          j        d          |d<   t          j        dd|d                   |d<   |dxx         ||z   z  cc<   |S )N[z::r   re   z\.py$r   rd   )	partitionsplitreplacer   SEPr$   r%   )r  r   possible_open_bracketparamsro   s        r    rg   rg     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ee         deded	ed
eddfdZdeddfdZde	eef         de
fdZdeddfdZdede
fdZdeddfdZdeddfdZdeddfdZdeddfdZd"dZd"dZdeddfdZdededdfdZdeej                 fd ZdS )#r   r   r   r  r@   Trh   
suite_namer   report_durationr   r   Nc                    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logfilerh   r"  r   r   r#  rJ   dictfromkeysstatsnode_reportersnode_reporters_orderedglobal_propertiesopen_reportscnt_double_fail_tests)rN   r*  rh   r"  r   r#  rJ   r   s           r    rO   zLogXML.__init__  s     '$$RW%7%7%@%@AAw''(@(@AA$!2.%)]]555q&
 &


  	 <>#8: /1%&" ;("""DKKK #"r"   r   c                    t          |d|          }t          |dd           }| j                            ||f          }|j        D ](\  }}|                    |t          |                     )||                                 d S d S NrD   rP   )r   r.  popr   rW   r#   r   )rN   r   rD   
workernodereporterpropname	propvalues          r    r   zLogXML.finalize  s    622VVT22
&**FJ+?@@#)#9 	< 	<Hi!!(C	NN;;;;  r"   c                     t          |d|          }t          |dd           }||f}|| j        v r| j        |         S t          ||           }|| j        |<   | j                            |           |S r4  )r   r.  rC   r/  rS   )rN   r   rD   r6  rs   r7  s         r    r   zLogXML.node_reporter   s    )06)J)JVVT22
j $%%%&s++ ..#+C #**8444r"   rs   c                 F    || j         v r| j         |xx         dz  cc<   d S d S )Nrf   )r-  )rN   rs   s     r    rI   zLogXML.add_stats  s3    $*JsOOOq OOOOO r"   c                 Z    |                      |          }|                    |           |S r)   )r   rt   rN   r   r7  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 rB  NrA  rD   r   .0repr   	report_ii
report_wids     r    	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>=  so        J&-77 '\4 @ @I M M '[$ ? ?: M M 
 !N M M M r"   rf   c              3      K   | ]@}|j         j         k    r.t          |d d          k    rt          |dd          k    <|V  AdS rD  rE  rF  s     r    rK  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>b  so        
fm33#Ct<<	II#Cd;;zII 
 JIII r"   )r   r   r>  r   failedr   nextr1  r   r2  r   rS   r   r   r   r   r   update_testcase_durationremove)rN   r   close_reportr7  rI  rJ  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k    s|j        | j         k    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   r=  s      r    rO  zLogXML.update_testcase_durationp  sc     7**fkT=Q.Q.Q))&11HS!A!AA /R.Qr"   c                     |j         sJ|                     |          }|j        r|                    |           d S |                    |           d S d S r)   )r   r>  rM  r   r   r=  s      r    pytest_collectreportzLogXML.pytest_collectreportw  sg    } 	8))&11H} 8--f55555//77777	8 	8r"   excreprc                     |                      d          }|j                            dd           |                    ddt	          |                     d S )Ninternalr   )r9   r:   r   zinternal error)r   rM   r/   r   r#   )rN   rV  r7  s      r    pytest_internalerrorzLogXML.pytest_internalerror  sU    %%j11zBBBW&6GEEEEEr"   c                 6    t          j                    | _        d S r)   )r   rw   suite_start_time)rN   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|z  t#          j        | 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"?>	testsuiterv   )r:   errorsfailuresr   testsrw   	timestamphostname
testsuitesunicode)r%  r   dirnamer)  r*  makedirsopenr   rw   r[  r-  r2  writer^   r_   r"  r#   r   fromtimestamp	isoformatplatformrP   _get_global_properties_noderS   r/  ry   tostring)
rN   ri  r*  suite_stop_timesuite_time_deltanumtests
suite_noder0  r   rg  s
             r    pytest_sessionfinishzLogXML.pytest_sessionfinish  st   '//"'//$,"?"?@@
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GGQQSS!
 
 
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F?	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   /GIIIterminalreporterc                 B    |                     dd| j                    d S )Nr   zgenerated xml file: )	write_sepr*  )rN   rw  s     r    pytest_terminal_summaryzLogXML.pytest_terminal_summary  s)    ""3(Mt|(M(MNNNNNr"   r:   rT   c                 |    d}t          d|           | j                            |t          |          f           d S )NTr:   )r   r0  rS   r'   )rN   r:   rT   r   s       r    r   zLogXML.add_global_property  sB      ...%%t^E-B-B&CDDDDDr"   c                     | j         rMt          j        d          }| j         D ]/\  }}|                    t          j        d||                     0|S dS r[   )r0  r^   r_   rS   r`   s       r    rp  z"LogXML._get_global_properties_node  sg    ! 	L11J#5 R Re!!"*Zd%"P"P"PQQQQtr"   )r   r   r  r@   Tr   )r   r   r   r   r#   r  rO   r   r   r
   rC   r   rI   r>  rR  rO  rU  r   rY  r\  rv  r   rz  r   r   r^   r_   rp  r   r"   r    r   r     sS       
 #&"&!# !# !# 	!#
 !# !#  !# 
!# !# !# !#F
 z 
 d 
  
  
  
 E*c/$: }    $!S !T ! ! ! !J =    
S7z S7d S7 S7 S7 S7jBz Bd B B B B8: 8$ 8 8 8 8FM Fd F F F F
. . . .$G $G $G $GLO8H OT O O O OE EF Et E E E E
Xbj-A      r"   r   )9__doc__r	  r%  ro  r$   xml.etree.ElementTreeetreeElementTreer^   r   typingr   r   r   r   r   r	   r
   r   _pytestr   r   _pytest._code.coder   r   _pytest.configr   r   _pytest.config.argparsingr   _pytest.fixturesr   _pytest.reportsr   _pytest.stashr   _pytest.terminalr   r   r   r#   r'   r7   rn   copyrC   r   fixturer   r   r   r   r  r  r  rg   r   r   r"   r    <module>r     s        				  				 " " " " " " " " "                                                              , , , , , , / / / / / / ! ! ! ! ! ! ' ' ' ' ' ' , , , , , , + + + + + + & & & & & & " " " " " " - - - - - - (8


2 23 2 2 2 26    +v!67 &(?(?(?@  g&++--  Xh.!9 : : : g& l# l# l# l# l# l# l# l#^

+.
	
 
 
 
" ^ #v9L0M    , . XsFmT>Q5R    8EC EC ED E E E E i   $~ $(C=RVCV:W $ $ $ ! $N,V , , , , ,^=V = = = = ="-v -$ - - - - c    l l l l l l l l l lr"   