Ë
    æØjjie  ã                  óZ  — 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   jK                  «       e$d<    e#e$d   e$d   «       e$d   e$d<    G d„ d«      Z&	 	 	 	 	 	 d,d„Z'e jP                  d-d„«       Z)e jP                  d-d „«       Z*d.d!„Z+ e jP                  d"¬#«      d-d$„«       Z,d/d%„Z-d0d&„Z.d0d'„Z/d1d(„Z0 G d)„ d«      Z1y)2a  Report test results in JUnit-XML format, for use with Jenkins and build
integration servers.

Based on initial code from Ross Lawley.

Output conforms to
https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
é    )Úannotations)ÚCallableN)Únodes)Útiming)ÚExceptionRepr)ÚReprFileLocation)ÚConfig)Úfilename_arg)ÚParser)ÚFixtureRequest)Ú
TestReport)ÚStashKey)ÚTerminalReporterÚLogXMLc                óN   — 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.
    c                óV   — t        | j                  «       «      }|dk  rd|d›�S d|d›�S )Néÿ   z#xÚ02XÚ04X)ÚordÚgroup)ÚmatchobjÚis     úR/opt/eval-harness/bench_task/venv/lib/python3.12/site-packages/_pytest/junitxml.pyÚreplzbin_xml_escape.<locals>.repl0   s6   € Ü�—‘Ó Ó!ˆØ�Š9Ø˜˜#�w�<Ðà˜˜#�w�<Ðó    u   [^	
 -~Â€-íŸ¿î€€-ï¿½ð�€€-ô�¿¿])r   zre.Match[str]ÚreturnÚstr)ÚreÚsubr   )Úargr   Úillegal_xml_res      r   Úbin_xml_escaper#   %   s&   € ó ð i€NÜ�6‰6�. $¬¨C«Ó1Ð1r   c                óâ   — i }| j                  «       D ]I  \  }}|j                  «       D ]1  \  }}t        |t        «      st        t	        |«      «      ‚||z   ||<   Œ3 ŒK | j                  |«       y ©N)ÚitemsÚ
isinstanceÚlistÚ	TypeErrorÚtypeÚupdate)ÚleftÚrightÚresultÚklÚvlÚkrÚvrs          r   Úmerge_familyr3   >   sm   € Ø€FØ—*‘*“,ò !‰ˆˆBØ—k‘k“mò 	!‰FˆB�Ü˜b¤$Ô'Ü¤ R£Ó)Ð)Ø˜b™ˆF�2ŠJñ	!ð!ð
 	‡K�K�Õ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dd„Z	ddd	„Z
dd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zy) Ú_NodeReporterc                óÄ   — || _         || _        | j                  j                  | _        | j                  j                  | _        d| _        g | _        g | _        i | _        y )Nç        )ÚidÚxmlÚ	add_statsÚfamilyÚdurationÚ
propertiesr   Úattrs)ÚselfÚnodeidrC   s      r   Ú__init__z_NodeReporter.__init__U   sL   € ØˆŒØˆŒØŸ™×+Ñ+ˆŒØ—h‘h—o‘oˆŒØˆŒØ13ˆŒØ')ˆŒ
Ø%'ˆ�
r   c                ó„   — | j                   j                  |j                  «       | j                  j	                  |«       y r%   )rC   rD   Útagr   Úappend)rI   Únodes     r   rN   z_NodeReporter.append_   s*   € Ø�‰×Ñ˜4Ÿ8™8Ô$Ø�
‰
×Ñ˜$Õr   c                ób   — | j                   j                  t        |«      t        |«      f«       y r%   )rG   rN   r   r#   ©rI   r6   Úvalues      r   Úadd_propertyz_NodeReporter.add_propertyc   s"   € Ø�‰×Ñ¤ D£	¬>¸%Ó+@ÐAÕBr   c                óF   — t        |«      | j                  t        |«      <   y r%   )r#   rH   r   rQ   s      r   Úadd_attributez_NodeReporter.add_attributef   s   € Ü .¨uÓ 5ˆ�
‰
”3�t“9Òr   c                óÀ   — | j                   rRt        j                  d«      }| j                   D ],  \  }}|j                  t        j                  d||¬«      «       Œ. |S y©z9Return a Junit node containing custom properties, if any.rG   Úproperty©r6   rR   N)rG   ÚETÚElementrN   ©rI   rG   r6   rR   s       r   Úmake_properties_nodez"_NodeReporter.make_properties_nodei   sT   € à�?Š?ÜŸ™ LÓ1ˆJØ#Ÿ™ò R‘��eØ×!Ñ!¤"§*¡*¨Z¸dÈ%Ô"PÕQðRàÐØr   c                óœ  — t        |j                  «      }| j                  }|d d }| j                  j                  r&|j                  d| j                  j                  «       dj                  |«      t        |d   «      |j                  d   dœ}|j                  d   �t        |j                  d   «      |d<   t        |d«      r|j                  |d<   || _        | j                  j                  |«       | j                  dk(  ry i }| j                  D ]-  }|t        | j                     d	   v sŒ| j                  |   ||<   Œ/ || _        y )
Néÿÿÿÿr   ú.)r5   r6   r7   é   r8   r9   r<   r4   )Úmangle_test_addressrJ   rH   rC   ÚprefixÚinsertÚjoinr#   Úlocationr   Úhasattrr9   r+   rE   Úfamilies)rI   Ú
testreportÚnamesÚexisting_attrsÚ
classnamesrH   Ú
temp_attrsÚkeys           r   Úrecord_testreportz_NodeReporter.record_testreportr   s-  € Ü# J×$5Ñ$5Ó6ˆØŸ™ˆØ˜3˜B�Zˆ
Ø�8‰8�?Š?Ø×Ñ˜a §¡§¡Ô1àŸ™ *Ó-Ü" 5¨¡9Ó-Ø×'Ñ'¨Ñ*ñ!
ˆð
 ×Ñ˜qÑ!Ð-Ü 
× 3Ñ 3°AÑ 6Ó7ˆE�&‰MÜ�:˜uÔ%Ø%Ÿ>™>ˆE�%‰LØˆŒ
Ø�
‰
×Ñ˜.Ô)ð �;‰;˜(Ò"Øð ˆ
Ø—:‘:ò 	2ˆCØ”h˜tŸ{™{Ñ+¨JÑ7Ò7Ø"&§*¡*¨S¡/�
˜3’ð	2ð  ˆ�
r   c                óÞ   — t        j                  d| j                  | j                  d›¬«      }| j	                  «       }|�|j                  |«       |j                  | j                  «       |S )Nr4   ú.3f)Útime)rZ   r[   rH   rF   r]   rN   Úextendr   )rI   r4   rG   s      r   Úto_xmlz_NodeReporter.to_xml�   sV   € Ü—:‘:˜j¨$¯*©*¸d¿m¹mÈCÐ=PÔRˆØ×.Ñ.Ó0ˆ
ØÐ!Ø�O‰O˜JÔ'Ø�‰˜Ÿ
™
Ô#Øˆr   Nc                ót   — t        j                  ||¬«      }t        |«      |_        | j	                  |«       y )N)Úmessage©rZ   r[   r#   ÚtextrN   )rI   rM   rv   ÚdatarO   s        r   Ú_add_simplez_NodeReporter._add_simple˜   s*   € Ü�z‰z˜# wÔ/ˆÜ" 4Ó(ˆŒ	Ø�‰�DÕr   c                óR  — | j                   j                  s|j                  ry |j                  }|j                  }|j
                  }| j                   j                  dk(  ry d}| j                   j                  dv r| j                  |d«      }| j                   j                  dv r*|| j                  |d«      z  }| j                  ||d«       d}| j                   j                  dv r*|| j                  |d	«      z  }| j                  ||d
«       d}|r| j                  ||d«       y y )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errr   z Captured Out r€   )ú
system-errr�   r   z Captured Err r‚   )	rC   Úlog_passing_testsÚpassedÚ	capstdoutÚcaplogÚ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rI   ÚreportÚcontent_outÚcontent_logÚcontent_errÚcontent_alls         r   Úwrite_captured_outputz#_NodeReporter.write_captured_output�   s  € Ø�x‰x×)Ò)¨f¯mªmØà×&Ñ&ˆØ—m‘mˆØ×&Ñ&ˆØ�8‰8×Ñ˜tÒ#ØØˆØ�8‰8×Ñ˜~Ñ-Ø×/Ñ/°Ð=MÓNˆKØ�8‰8×ÑÐ?Ñ?Ø˜4×0Ñ0°Ð>NÓOÑOˆKØ×Ñ ¨°\ÔBØˆKØ�8‰8×ÑÐ?Ñ?Ø˜4×0Ñ0°Ð>NÓOÑOˆKØ×Ñ ¨°\ÔBØˆKÙØ×Ñ ¨°\ÕBð r   c                óJ   — dj                  |j                  dd«      |dg«      S )Nú
éP   ú-r}   )re   Úcenter)rI   ÚcontentÚheaders      r   r‰   z_NodeReporter._prepare_content´   s#   € Ø�y‰y˜&Ÿ-™-¨¨CÓ0°'¸2Ð>Ó?Ð?r   c                óp   — t        j                  |«      }t        |«      |_        | j	                  |«       y r%   rw   )rI   r‹   r–   ÚjheaderrM   s        r   rŠ   z_NodeReporter._write_content·   s(   € Ü�j‰j˜Ó!ˆÜ! 'Ó*ˆŒØ�‰�CÕr   c                ó&   — | j                  d«       y )Nr„   )rD   ©rI   r‹   s     r   Úappend_passz_NodeReporter.append_pass¼   s   € Ø�‰�xÕ r   c                ó6  — t        |d«      r| j                  dd«       y |j                  €J ‚t        |j                  dd «      }|�|j                  }nt        |j                  «      }t        |«      }| j                  d|t        |j                  «      «       y )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)rg   rz   ÚlongreprÚgetattrrv   r   r#   )rI   r‹   r    rv   s       r   Úappend_failurez_NodeReporter.append_failure¿   sˆ   € ä�6˜:Ô&Ø×Ñ˜YÐ(OÕPà—?‘?Ð.Ð.Ð.Ü18Ø—‘ ¨dó2ˆIð Ð$Ø#×+Ñ+‘ä˜fŸo™oÓ.�Ü$ WÓ-ˆGØ×Ñ˜Y¨´°V·_±_Ó1EÕFr   c                ól   — |j                   €J ‚| j                  ddt        |j                   «      «       y )NÚerrorzcollection failure)r¢   rz   r   r›   s     r   Úappend_collect_errorz"_NodeReporter.append_collect_errorÏ   s.   € à�‰Ð*Ð*Ð*Ø×Ñ˜Ð"6¼¸F¿O¹OÓ8LÕMr   c                óP   — | j                  ddt        |j                  «      «       y )NrŸ   zcollection skipped)rz   r   r¢   r›   s     r   Úappend_collect_skippedz$_NodeReporter.append_collect_skippedÔ   s   € Ø×Ñ˜Ð$8¼#¸f¿o¹oÓ:NÕOr   c                ó,  — |j                   €J ‚t        |j                   dd «      }|�|j                  }nt        |j                   «      }|j                  dk(  rd|› d�}nd|› d�}| j                  dt        |«      t        |j                   «      «       y )Nr    Úteardownzfailed on teardown with "ú"zfailed on setup with "r¦   )r¢   r£   rv   r   Úwhenrz   r#   )rI   r‹   r    ÚreasonÚmsgs        r   Úappend_errorz_NodeReporter.append_error×   sŒ   € Ø�‰Ð*Ð*Ð*Ü-4°V·_±_ÀkÐSWÓ-Xˆ	ØÐ Ø×&Ñ&‰Fä˜Ÿ™Ó)ˆFà�;‰;˜*Ò$Ø-¨f¨X°QÐ7‰Cà*¨6¨(°!Ð4ˆCØ×Ñ˜¤.°Ó"5´s¸6¿?¹?Ó7KÕLr   c                ó  — t        |d«      rW|j                  }|j                  d«      r|dd  }t        |«      }t	        j
                  dd|¬«      }| j                  |«       y t        |j                  t        «      sJ ‚|j                  \  }}}|j                  d«      r|dd  }|› d	|› d
|› �}t	        j
                  ddt        |«      ¬«      }t        |«      |_
        | j                  |«       | j                  |«       y )Nrž   zreason: é   rŸ   zpytest.xfail)r*   rv   z	Skipped: é	   ú:z: zpytest.skip)rg   rž   Ú
startswithr#   rZ   r[   rN   r'   r¢   Útuplerx   r�   )rI   r‹   ÚxfailreasonrŸ   ÚfilenameÚlinenoÚ
skipreasonÚdetailss           r   Úappend_skippedz_NodeReporter.append_skippedå   së   € Ü�6˜:Ô&Ø Ÿ/™/ˆKØ×%Ñ% jÔ1Ø)¨!¨"˜o�Ü(¨Ó5ˆKÜ—j‘j °ÈÔUˆGØ�K‰K˜Õ ä˜fŸo™o¬uÔ5Ð5Ð5Ø+1¯?©?Ñ(ˆH�f˜jØ×$Ñ$ [Ô1Ø'¨¨˜^�
Ø!˜
 ! F 8¨2¨j¨\Ð:ˆGä—j‘jØ ´~ÀjÓ7QôˆGô *¨'Ó2ˆGŒLØ�K‰K˜Ô Ø×&Ñ& vÕ.r   c                ón   ‡— | j                  «       Š| j                  j                  «        ˆfd„| _         y )Nc                 ó   •— ‰ S r%   © )ry   s   €r   ú<lambda>z(_NodeReporter.finalize.<locals>.<lambda>   s   ø€ ˜d€ r   )rt   Ú__dict__Úclear)rI   ry   s    @r   Úfinalizez_NodeReporter.finalizeû   s'   ø€ Ø�{‰{‹}ˆØ�‰×ÑÔó #ˆ�r   )rJ   zstr | TestReportrC   r   r   ÚNone)rO   ú
ET.Elementr   rÄ   ©r6   r   rR   Úobjectr   rÄ   ©r   zET.Element | None)ri   r   r   rÄ   )r   rÅ   r%   )rM   r   rv   r   ry   ú
str | Noner   rÄ   ©r‹   r   r   rÄ   )r–   r   r—   r   r   r   )r‹   r   r–   r   r™   r   r   rÄ   ©r   rÄ   )Ú__name__Ú
__module__Ú__qualname__rK   rN   rS   rU   r]   ro   rt   rz   r�   r‰   rŠ   rœ   r¤   r§   r©   r°   r¼   rÃ   r¿   r   r   r?   r?   T   sc   „ ó(ó óCó6óó ó<ôó
Có.@óó
!óGó Nó
PóMó/ô,#r   r?   c                óê   — ddl m} | j                  j                  j	                  t
        d«      }|�A|j                  dvr2| j                  j                   ||› d|j                  › d�«      «       yyy)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_keyrE   rO   Úwarn)ÚrequestÚfixture_namerÐ   rC   s       r   Ú!_warn_incompatibility_with_xunit2rÚ     sl   € õ 4à
�.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
€˜3Ÿ:™:Ð-AÑAØ�‰×ÑÙØ�.Ð DÀSÇZÁZÀLÐPlÐmóõ	
ð B€r   c                ó,   ‡ — 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_propertyc                óT   •— ‰j                   j                  j                  | |f«       y r%   )rO   Úuser_propertiesrN   )r6   rR   rØ   s     €r   Úappend_propertyz(record_property.<locals>.append_property#  s   ø€ Ø�‰×$Ñ$×+Ñ+¨T°5¨MÕ:r   rÆ   )rÚ   )rØ   rß   s   ` r   rÜ   rÜ     s   ø€ ô & gÐ/@ÔAõ;ð Ðr   c                ó2  — ddl m} | j                  j                   |d«      «       t	        | d«       dd„}|}| j
                  j                  j                  t        d«      }|�1|j                  | j                  j                  «      }|j                  }|S )z�Add extra xml attributes to the tag for the calling test.

    The fixture is callable with ``name, value``. The value is
    automatically XML-encoded.
    r   )ÚPytestExperimentalApiWarningz/record_xml_attribute is an experimental featureÚrecord_xml_attributec                 ó   — y r%   r¿   rY   s     r   Úadd_attr_noopz+record_xml_attribute.<locals>.add_attr_noop9  s   € Ør   NrÆ   )rÒ   rá   rO   r×   rÚ   rÓ   rÔ   rÕ   rÖ   Únode_reporterrJ   rU   )rØ   rá   rä   Ú	attr_funcrC   rå   s         r   râ   râ   )  sˆ   € õ Cà‡L�L×ÑÙ$Ð%VÓWôô & gÐ/EÔFóð €Ià
�.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
€Ø×)Ñ)¨'¯,©,×*=Ñ*=Ó>ˆØ!×/Ñ/ˆ	àÐr   c                óŠ   — d}t        |t        «      s1d}t        |j                  | t	        |«      j
                  ¬«      «      ‚y)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)ÚparamÚgN)r'   r   r)   Úformatr*   rÌ   )rè   ÚvÚ__tracebackhide__r¯   s       r   Ú_check_record_param_typerí   F  s@   € ð ÐÜ�aœÔØEˆÜ˜Ÿ
™
¨´$°q³'×2BÑ2B˜
ÓCÓDÐDð r   Úsession)Úscopec                ó‚   — d}dd„}| j                   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.
    Tc                ó    — d}t        d| «       y)zFNo-op function in case --junit-xml was not passed in the command-line.Tr6   N)rí   )r6   rR   rì   s      r   Úrecord_funcz.record_testsuite_property.<locals>.record_funck  s   € à ÐÜ  ¨Õ.r   NrÆ   )rÓ   rÔ   rÕ   rÖ   Úadd_global_property)rØ   rì   rò   rC   s       r   Úrecord_testsuite_propertyrô   O  sC   € ð4 Ðó/ð
 �.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
€Ø×-Ñ-ˆØÐr   c                ó‚  — | j                  d«      }|j                  dddddt        j                  t        d¬«      d d¬	«       |j                  d
dddd d¬«       | j                  ddd¬«       | j                  ddd¬«       | j                  dddd¬«       | j                  ddd¬«       | j                  ddd ¬«       y )!Nzterminal reportingz
--junitxmlz--junit-xmlÚstoreÚxmlpathÚpath)Úoptnamez0Create junit-xml style report file at given path)ÚactionÚdestÚmetavarr*   ÚdefaultÚhelpz--junitprefixz--junit-prefixr   z0Prepend prefix to classnames in junit-xml output)rú   rü   rý   rþ   Újunit_suite_namez Test suite name for JUnit reportÚpytest)rý   Újunit_loggingz\Write captured log messages to JUnit report: one of no|log|system-out|system-err|out-err|allr|   Újunit_log_passing_testsz;Capture log information for passing tests to JUnit report: ÚboolT)r*   rý   Újunit_duration_reportz*Duration time to report: one of total|callÚtotalÚjunit_familyz0Emit XML for schema: one of legacy|xunit1|xunit2r=   )ÚgetgroupÚ	addoptionÚ	functoolsÚpartialr
   Úaddini)Úparserr   s     r   Úpytest_addoptionr  v  sü   € Ø�O‰OÐ0Ó1€EØ	‡O�OØØØØØÜ×Ñœ|°\ÔBØØ?ð ô 	ð 
‡O�OØØØØØØ?ð ô ð ‡M�MØÐ>Èð ô ð ‡M�MØð	:àð	 ô ð ‡M�MØ!ØEØØð	 ô ð ‡M�MØØ4Øð ô ð
 ‡M�MØØ:Øð õ r   c                ó®  — | j                   j                  }|r½t        | d«      s°| j                  d«      }t	        || j                   j
                  | j                  d«      | j                  d«      | j                  d«      || j                  d«      «      | j                  t        <   | j                  j                  | j                  t           «       y y y )NÚworkerinputr  rÿ   r  r  r  )
Úoptionr÷   rg   Úgetinir   ÚjunitprefixrÔ   rÖ   ÚpluginmanagerÚregister)rÓ   r÷   r  s      r   Úpytest_configurer  ¥  sª   € Ø�m‰m×#Ñ#€Gá”w˜v }Ô5Ø—}‘} ^Ó4ˆÜ &ØØ�M‰M×%Ñ%Ø�M‰MÐ,Ó-Ø�M‰M˜/Ó*Ø�M‰MÐ1Ó2ØØ�M‰MÐ3Ó4ó!
ˆ�‰”WÑð 	×Ñ×%Ñ% f§l¡l´7Ñ&;Õ<ð 6€wr   c                ó¢   — | j                   j                  t        d «      }|r-| j                   t        = | j                  j	                  |«       y y r%   )rÔ   rÕ   rÖ   r  Ú
unregister)rÓ   rC   s     r   Úpytest_unconfigurer  ¶  s@   € Ø
�,‰,×
Ñ
œ7 DÓ
)€CÙ
Ø�L‰LœÐ!Ø×Ñ×'Ñ'¨Õ,ð r   c                óø   — | j                  d«      \  }}}|j                  d«      }|d   j                  t        j                  d«      |d<   t        j                  dd|d   «      |d<   |dxx   ||z   z  cc<   |S )Nú[z::r   r`   z\.py$r}   r_   )Ú	partitionÚsplitÚreplacer   ÚSEPr   r    )Úaddressrø   Úpossible_open_bracketÚparamsrj   s        r   rb   rb   ½  sy   € Ø*1×*;Ñ*;¸CÓ*@Ñ'€DÐ
 Ø�J‰J�tÓ€Eà�Q‰x×Ñ¤§	¡	¨3Ó/€Eˆ!�HÜ�v‰v�h  E¨!¡HÓ-€Eˆ!�Hà	ˆ"ƒIÐ&¨Ñ/Ñ/ƒIØ€Lr   c                  óª   — e Zd Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zdd
„Zdd„Z	 	 	 	 	 	 dd„Zdd„Zdd„Zy)r   c                ó   — t         j                  j                  t         j                  j                  |«      «      }t         j                  j	                  t         j                  j                  |«      «      | _        || _        || _        || _	        || _
        || _        || _        t        j                  g d¢d«      | _        i | _        g | _        g | _        g | _        d| _        | j                  dk(  rd| _        y y )N)r¦   r„   r¡   rŸ   r   rÑ   r<   )Úosrø   Ú
expanduserÚ
expandvarsÚnormpathÚabspathÚlogfilerc   Ú
suite_namerˆ   rƒ   Úreport_durationrE   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rI   r)  rc   r*  rˆ   r+  rE   rƒ   s           r   rK   zLogXML.__init__É  sÓ   € ô —'‘'×$Ñ$¤R§W¡W×%7Ñ%7¸Ó%@ÓAˆÜ—w‘w×'Ñ'¬¯©¯©¸Ó(@ÓAˆŒØˆŒØ$ˆŒØˆŒØ!2ˆÔØ.ˆÔØˆŒÜ%)§]¡]Ú5°qó&
ˆŒ
ð UWˆÔØ;=ˆÔ#Ø8:ˆÔð /1ˆÔØ%&ˆÔ"ð �;‰;˜(Ò"Ø"ˆD�Kð #r   c                óö   — t        |d|«      }t        |dd «      }| j                  j                  ||f«      }|j                  D ]   \  }}|j	                  |t        |«      «       Œ" |�|j                  «        y y ©NrJ   rO   )r£   r/  ÚpoprÞ   rS   r   rÃ   )rI   r‹   rJ   Ú
workernodeÚreporterÚpropnameÚ	propvalues          r   rÃ   zLogXML.finalizeê  s€   € Ü˜ ¨6Ó2ˆä˜V V¨TÓ2ˆ
Ø×&Ñ&×*Ñ*¨F°JÐ+?Ó@ˆà#)×#9Ñ#9ò 	<ÑˆH�iØ×!Ñ! (¬C°	«NÕ;ð	<ð ÐØ×ÑÕð  r   c                óè   — t        |d|«      }t        |dd «      }||f}|| j                  v r| j                  |   S t        || «      }|| j                  |<   | j                  j	                  |«       |S r5  )r£   r/  r?   r0  rN   )rI   r‹   rJ   r7  rn   r8  s         r   rå   zLogXML.node_reporterö  s|   € Ü#*¨6°8¸VÓ#Dˆä˜V V¨TÓ2ˆ
à�jÐ ˆà�$×%Ñ%Ñ%à×&Ñ& sÑ+Ð+ä  ¨Ó.ˆà#+ˆ×Ñ˜CÑ Ø×#Ñ#×*Ñ*¨8Ô4àˆr   c                óP   — || j                   v r| j                   |xx   dz  cc<   y y )Nra   )r.  )rI   rn   s     r   rD   zLogXML.add_stats  s%   € Ø�$—*‘*ÑØ�J‰J�s‹O˜qÑ ŒOð r   c                óJ   — | j                  |«      }|j                  |«       |S r%   )rå   ro   ©rI   r‹   r8  s      r   Ú_opentestcasezLogXML._opentestcase  s%   € Ø×%Ñ% fÓ-ˆØ×"Ñ" 6Ô*Øˆr   c           
     ó”  ‡‡‡— d}‰j                   r4‰j                  dk(  �rz| j                  ‰«      }|j                  ‰«       �nV‰j                  �r‰j                  dk(  r�t        ‰dd«      Št        ‰dd«      Št        ˆˆˆfd„| j                  D «       d«      }|r| j                  |«       nA| xj                  t        ‰j                  t        ‰dd«      f| j                  v «      z  c_	        | j                  ‰«      }‰j                  dk(  rJ|j                  ‰«       | j                  j                  ‰«       | j                  sR|j!                  ‰«       n@|j#                  ‰«       n.‰j$                  r"| j                  ‰«      }|j'                  ‰«       | j)                  ‰«       ‰j                  dk(  r�| j                  ‰«      }|j!                  ‰«       | j                  ‰«       t        ‰dd«      Št        ‰dd«      Št        ˆˆˆfd„| j                  D «       d«      }|r| j                  j+                  |«       yyy)	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(  r|–— ŒA y­w©rC  NrB  ©rJ   r£   ©Ú.0Úrepr‹   Ú	report_iiÚ
report_wids     €€€r   ú	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>3  sK   øè ø€ ò ààŸJ™J¨&¯-©-Ò7Ü '¨¨\¸4Ó @ÀIÒ MÜ '¨¨[¸$Ó ?À:Ò Mô ñùó   ƒAArO   c              3  ó”   •K  — | ]?  }|j                   ‰j                   k(  r$t        |d d«      ‰k(  rt        |dd«      ‰k(  r|–— ŒA y­wrE  rF  rG  s     €€€r   rL  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>b  sK   øè ø€ ò ààŸ
™
 f§m¡mÒ3Ü# C¨°tÓ<À	ÒIÜ# C¨°dÓ;¸zÒIô ñùrM  )r„   r­   r?  rœ   Úfailedr£   Únextr2  rÃ   r3  ÚintrJ   r/  r¤   rN   rƒ   r�   r°   rŸ   r¼   Úupdate_testcase_durationÚremove)rI   r‹   Úclose_reportr8  rJ  rK  s    `  @@r   Úpytest_runtest_logreportzLogXML.pytest_runtest_logreport  s  ú€ ð. ˆØ�=Š=Ø�{‰{˜fÓ$Ø×-Ñ-¨fÓ5�Ø×$Ñ$ VÖ,Ø�]‹]Ø�{‰{˜jÒ(ä$ V¨[¸$Ó?�
Ü# F¨L¸$Ó?�	Ü#õà#'×#4Ñ#4ôð ó �ñ  ð —M‘M ,Õ/ð
 ×.Ò.´#à"ŸM™MÜ# F¨F°DÓ9ðð  ×.Ñ.ð	/ó3ñ Õ.ð ×)Ñ)¨&Ó1ˆHØ�{‰{˜fÒ$Ø×'Ñ'¨Ô/Ø×!Ñ!×(Ñ(¨Ô0Ø×-Ò-Ø×2Ñ2°6Õ:à×%Ñ% fÕ-Ø�^Š^Ø×)Ñ)¨&Ó1ˆHØ×#Ñ# FÔ+Ø×%Ñ% fÔ-Ø�;‰;˜*Ò$Ø×)Ñ)¨&Ó1ˆHØ×*Ñ*¨6Ô2à�M‰M˜&Ô!Ü  ¨°dÓ;ˆJÜ ¨°dÓ;ˆIÜõà#×0Ñ0ôð óˆLñ Ø×!Ñ!×(Ñ(¨Õ6ð ð' %r   c                óœ   — | j                   d|j                  hv r2| j                  |«      }|xj                  t	        |dd«      z  c_        yy)zƒAccumulate total duration for nodeid from given report and update
        the Junit.testcase with the new total if already created.r  rF   rA   N)r+  r­   rå   rF   r£   r>  s      r   rR  zLogXML.update_testcase_durationp  sJ   € ð ×Ñ G¨V¯[©[Ð#9Ñ9Ø×)Ñ)¨&Ó1ˆHØ×Ò¤¨°¸SÓ!AÑAÖð :r   c                óž   — |j                   sA| j                  |«      }|j                  r|j                  |«       y |j	                  |«       y y r%   )r„   r?  rO  r§   r©   r>  s      r   Úpytest_collectreportzLogXML.pytest_collectreportw  sA   € Ø�}Š}Ø×)Ñ)¨&Ó1ˆHØ�}Š}Ø×-Ñ-¨fÕ5à×/Ñ/°Õ7ð r   c                ó˜   — | j                  d«      }|j                  j                  dd¬«       |j                  ddt	        |«      «       y )NÚinternalr   )r5   r6   r¦   zinternal error)rå   rH   r+   rz   r   )rI   Úexcreprr8  s      r   Úpytest_internalerrorzLogXML.pytest_internalerror  s@   € Ø×%Ñ% jÓ1ˆØ�‰×Ñ¨°zÐÔBØ×Ñ˜WÐ&6¼¸G»ÕEr   c                ó6   — t        j                  «       | _        y r%   )r   ÚInstantÚsuite_start)rI   s    r   Úpytest_sessionstartzLogXML.pytest_sessionstart„  s   € Ü!Ÿ>™>Ó+ˆÕr   c                óò  — t         j                  j                  t         j                  j                  | j                  «      «      }t        j
                  |d¬«       t        | j                  dd¬«      5 }| j                  j                  «       }| j                  d   | j                  d   z   | j                  d   z   | j                  d	   z   | j                  z
  }|j                  d
«       t        j                  d| j                  t        | j                  d	   «      t        | j                  d   «      t        | j                  d   «      t        |«      |j                   d›| j                  j#                  «       j%                  «       j'                  «       t)        j*                  «       ¬«	      }| j-                  «       }|�|j/                  |«       | j0                  D ]!  }|j/                  |j3                  «       «       Œ# t        j                  d«      }|j5                  dd«       |j/                  |«       |j                  t        j6                  |d¬«      «       d d d «       y # 1 sw Y   y xY w)NT)Úexist_okÚwzutf-8)Úencodingr„   r¡   rŸ   r¦   z&<?xml version="1.0" encoding="utf-8"?>Ú	testsuiterq   )r6   ÚerrorsÚfailuresrŸ   Útestsrr   Ú	timestampÚhostnameÚ
testsuitesr6   zpytest testsÚunicode)r$  rø   Údirnamer(  r)  ÚmakedirsÚopenr_  Úelapsedr.  r3  ÚwriterZ   r[   r*  r   ÚsecondsÚas_utcÚ
astimezoneÚ	isoformatÚplatformrO   Ú_get_global_properties_noderN   r0  rt   ÚsetÚtostring)	rI   rm  r)  rF   ÚnumtestsÚ
suite_noder1  rå   rk  s	            r   Úpytest_sessionfinishzLogXML.pytest_sessionfinish‡  sù  € Ü—'‘'—/‘/¤"§'¡'§/¡/°$·,±,Ó"?Ó@ˆä
�‰�G dÕ+ä�$—,‘, ¨gÔ6ð 	G¸'Ø×'Ñ'×/Ñ/Ó1ˆHð —
‘
˜8Ñ$Ø—*‘*˜YÑ'ñ(à—*‘*˜YÑ'ñ(ð —*‘*˜WÑ%ñ&ð ×,Ñ,ñ	-ð ð �M‰MÐBÔCäŸ™ØØ—_‘_Ü˜4Ÿ:™: gÑ.Ó/Ü˜TŸZ™Z¨	Ñ2Ó3Ü˜DŸJ™J yÑ1Ó2Ü˜(“mØ ×(Ñ(¨Ð-Ø×*Ñ*×1Ñ1Ó3×>Ñ>Ó@×JÑJÓLÜ!Ÿ™›ô
ˆJð !%× @Ñ @Ó BÐØ Ð,Ø×!Ñ!Ð"3Ô4Ø!%×!<Ñ!<ò :�Ø×!Ñ! -×"6Ñ"6Ó"8Õ9ð:äŸ™ LÓ1ˆJØ�N‰N˜6 >Ô2Ø×Ñ˜jÔ)Ø�M‰Mœ"Ÿ+™+ j¸9ÔEÔF÷?	G÷ 	Gñ 	Gús   Á6G.I-É-I6c                ój   — |j                  «       dk\  r |j                  dd| j                  › �«       y y )Nr   r”   zgenerated xml file: )Úget_verbosityÚ	write_sepr)  )rI   ÚterminalreporterrÓ   s      r   Úpytest_terminal_summaryzLogXML.pytest_terminal_summary­  s6   € ð ×ÑÓ! QÒ&Ø×&Ñ& sÐ.BÀ4Ç<Á<À.Ð,QÕRð 'r   c                ól   — d}t        d|«       | j                  j                  |t        |«      f«       y )NTr6   )rí   r1  rN   r#   )rI   r6   rR   rì   s       r   ró   zLogXML.add_global_property³  s0   € Ø ÐÜ  ¨Ô.Ø×Ñ×%Ñ% t¬^¸EÓ-BÐ&CÕDr   c                óÀ   — | j                   rRt        j                  d«      }| j                   D ],  \  }}|j                  t        j                  d||¬«      «       Œ. |S yrW   )r1  rZ   r[   rN   r\   s       r   rw  z"LogXML._get_global_properties_node¸  sX   € à×!Ò!ÜŸ™ LÓ1ˆJØ#×5Ñ5ò R‘��eØ×!Ñ!¤"§*¡*¨Z¸dÈ%Ô"PÕQðRàÐØr   N)r   r|   r  r<   T)rc   rÉ   r*  r   rˆ   r   r+  r   rƒ   r  r   rÄ   rÊ   )r‹   zTestReport | strr   r?   )rn   r   r   rÄ   )r‹   r   r   r?   )r[  r   r   rÄ   rË   )r€  r   rÓ   zpytest.Configr   rÄ   rÆ   rÈ   )rÌ   rÍ   rÎ   rK   rÃ   rå   rD   r?  rU  rR  rX  r\  r`  r|  r�  ró   rw  r¿   r   r   r   r   È  s¹   „ ð
 #ØØ&ØØ"&ð#ð ð#ð ð	#ð
 ð#ð ð#ð  ð#ð 
ó#óB
 óó$!óó
]7ó~Bó8óFó
,ó$GðLSØ 0ðSØ:GðSà	óSóEô
r   )r!   rÇ   r   r   rË   )rØ   r   rÙ   r   r   rÄ   )rØ   r   r   zCallable[[str, object], None])rè   r   rë   r   r   rÄ   )r  r   r   rÄ   )rÓ   r	   r   rÄ   )r  r   r   z	list[str])2Ú__doc__Ú
__future__r   Úcollections.abcr   r	  r$  rv  r   Úxml.etree.ElementTreeÚetreeÚElementTreerZ   Ú_pytestr   r   Ú_pytest._code.coder   r   Ú_pytest.configr	   r
   Ú_pytest.config.argparsingr   Ú_pytest.fixturesr   Ú_pytest.reportsr   Ú_pytest.stashr   Ú_pytest.terminalr   r   rÖ   r#   r3   rh   Úcopyr?   rÚ   ÚfixturerÜ   râ   rí   rô   r  r  r  rb   r   r¿   r   r   ú<module>r”     sb  ðñõ #å $Û Û 	Û Û 	ß "Ð "å Ý Ý ,Ý /Ý !Ý 'Ý ,Ý +Ý &Ý "Ý -Û ð ˆ(�8Ñ
Ó
€ó2ó2ð ˜;¨Ð/Ð0ØÒ!8Ð9ñ€ð
 ˜gÑ&×+Ñ+Ó-€ˆÑ Ù ˆX�hÑ ¨.Ñ!9Ô :ð ˜gÑ&€ˆÑ ÷l#ñ l#ð^
Øð
Ø+.ð
à	ó
ð ‡�òó ðð, ‡�òó ðó8Eð €‡��iÔ ò#ó !ð#óL,ó^=ó"-ó÷wò wr   