Ë
    •Kêjòl  ã                  óÐ  — 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
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!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*e
d   Z+e
d   Z,e
d   Z-d5d„Z.dZ/e/fd6d„Z0d7d„Z1ddd gidg d!¢id"œZ2e2d#   jg                  «       e2d$<    e1e2d$   e2d%   «       e2d#   e2d&<    G d'„ d(«      Z4	 	 	 	 	 	 d8d)„Z5e)jl                  d9d*„«       Z7e)jl                  d9d+„«       Z8d:d,„Z9 e)jl                  d-¬.«      d9d/„«       Z:d;d0„Z;d<d1„Z<d<d2„Z=d=d3„Z> G d4„ d«      Z?y)>a  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)ÚLiteral)Únodes)Útiming)ÚExceptionRepr)ÚReprFileLocation)Úassert_never)ÚConfig)Úfilename_arg)ÚParser)ÚFixtureRequest)Úcoerce_node_id)ÚNodeId)Ú
BaseReport)ÚCollectReport)Ú
TestReport)ÚStashKey)ÚTerminalReporterÚLogXML)ÚnoÚlogú
system-outú
system-errúout-errÚall)ÚtotalÚcall)ÚlegacyÚxunit1Úxunit2c                ó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     úU/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/_pytest/junitxml.pyÚreplzbin_xml_escape.<locals>.repl:   s6   € Ü�—‘Ó Ó!ˆØ�Š9Ø˜˜#�w�<Ðà˜˜#�w�<Ðó    u   [^	
 -~Â€-íŸ¿î€€-ï¿½ð�€€-ô�¿¿])r)   zre.Match[str]ÚreturnÚstr)ÚreÚsubr/   )Úargr,   Úillegal_xml_res      r+   Úbin_xml_escaper4   /   s&   € ó ð i€NÜ�6‰6�. $¬¨C«Ó1Ð1r-   iô  c                óx  — | j                  «       xs dg}g }d}|D ]<  }|r|t        |«      z   dz   |kD  r n$|j                  |«       |t        |«      dz   z  }Œ> dj                  |«      }t        |«      |kD  }|r|d| dz   }t        |«      t        |«      z
  }|rd|› d|dkD  rd	nd› �}	n|rd
}	n| S |› d|	› d�S )a-  Shorten ``msg`` for use in a ``message`` attribute.

    Whole lines are kept while they fit in ``budget`` characters; a first
    line that is longer than ``budget`` on its own is cut. If anything was
    dropped, a final line points readers to the element text, which holds
    the full report.
    Ú r   é   ú
Nz...ú+z
 more lineÚsÚ	truncatedz
[z; full report in element text])Ú
splitlinesÚlenÚappendÚjoin)
ÚmsgÚbudgetÚlinesÚkeptÚsizeÚlineÚ	shortenedÚfirst_line_cutÚ	remainingÚnotes
             r+   Úshorten_messagerJ   M   së   € ð �N‰NÓÒ$  €EØ€DØ€DØò ˆÙ�Dœ3˜t›9Ñ$ qÑ(¨6Ò1ÙØ�‰�DÔØ”�D“	˜A‘Ñ‰ð	ð
 —	‘	˜$“€IÜ˜“^ fÑ,€NÙØ˜g˜vÐ&¨Ñ.ˆ	Ü�E“
œS ›YÑ&€IÙØ�9�+˜Z¨y¸1ª}©À"Ð'EÐF‰Ù	Ø‰àˆ
Øˆ[˜˜D˜6Ð!?Ð@Ð@r-   c                óÜ   — i }| j                  «       D ]F  \  }}|j                  «       D ].  }t        |t        «      st	        t        |«      «      ‚||z   ||<   Œ0 ŒH | j                  |«       y ©N)ÚitemsÚvaluesÚ
isinstanceÚlistÚ	TypeErrorÚtypeÚupdate)ÚleftÚrightÚresultÚklÚvlÚvrs         r+   Úmerge_familyrZ   k   si   € Ø€FØ—*‘*“,ò !‰ˆˆBØ—,‘,“.ò 	!ˆBÜ˜b¤$Ô'Ü¤ R£Ó)Ð)Ø˜b™ˆF�2ŠJñ	!ð!ð
 	‡K�K�Õr-   ÚtestcaseÚ	classnameÚname)ÚfilerE   Úurl)Ú_baseÚ_base_legacyr`   r    ra   r!   c                  óž   — 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Únode_idrg   s      r+   Ú__init__z_NodeReporter.__init__‚   sL   € ØˆŒØˆŒØŸ™×+Ñ+ˆŒØ—h‘h—o‘oˆŒØˆŒØ13ˆŒØ')ˆŒ
Ø%'ˆ�
r-   c                ó„   — | j                   j                  |j                  «       | j                  j	                  |«       y rL   )rg   rh   Útagr   r>   )rm   Únodes     r+   r>   z_NodeReporter.appendŒ   s*   € Ø�‰×Ñ˜4Ÿ8™8Ô$Ø�
‰
×Ñ˜$Õr-   c                ób   — | j                   j                  t        |«      t        |«      f«       y rL   )rk   r>   r/   r4   ©rm   r]   Úvalues      r+   Úadd_propertyz_NodeReporter.add_property�   s"   € Ø�‰×Ñ¤ D£	¬>¸%Ó+@ÐAÕBr-   c                óF   — t        |«      | j                  t        |«      <   y rL   )r4   rl   r/   rt   s      r+   Úadd_attributez_NodeReporter.add_attribute“   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.rk   Úproperty©r]   ru   N)rk   ÚETÚElementr>   ©rm   rk   r]   ru   s       r+   Úmake_properties_nodez"_NodeReporter.make_properties_node–   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                  «       |j                  }|€J ‚dj                  |«      t        |d   «      |d   dœ}|d   �t        |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   ú.)r\   r]   r^   r7   rE   r_   r    r[   )Úmangle_test_addressÚnodeidrl   rg   ÚprefixÚinsertÚlocationr?   r4   r/   Úhasattrr_   rS   ri   Úfamilies)	rm   Ú
testreportÚnamesÚexisting_attrsÚ
classnamesrˆ   rl   Ú
temp_attrsÚkeys	            r+   Úrecord_testreportz_NodeReporter.record_testreportŸ   s/  € Ü# J×$5Ñ$5Ó6ˆØŸ™ˆØ˜3˜B�Zˆ
Ø�8‰8�?Š?Ø×Ñ˜a §¡§¡Ô1Ø×&Ñ&ˆØÐ#Ð#Ð#àŸ™ *Ó-Ü" 5¨¡9Ó-Ø˜Q‘Kñ!
ˆð
 �A‰;Ð"Ü ¨¡Ó,ˆ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 )Nr[   ú.3f)Útime)r}   r~   rl   rj   r€   r>   Úextendr   )rm   r[   rk   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©r}   r~   r4   Útextr>   )rm   rq   r˜   Údatarr   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 )Nr   r6   )r   r   z Captured Log )r   r   r   z Captured Out r   )r   r   r   z Captured Err r   )	rg   Úlog_passing_testsÚpassedÚ	capstdoutÚcaplogÚ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rm   Ú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 )Nr8   éP   ú-r6   )r?   Úcenter)rm   ÚcontentÚheaders      r+   r¤   z_NodeReporter._prepare_contentã   s#   € Ø�y‰y˜&Ÿ-™-¨¨CÓ0°'¸2Ð>Ó?Ð?r-   c                óp   — t        j                  |«      }t        |«      |_        | j	                  |«       y rL   r™   )rm   r¦   r°   Újheaderrq   s        r+   r¥   z_NodeReporter._write_contentæ   s(   € Ü�j‰j˜Ó!ˆÜ! 'Ó*ˆŒØ�‰�CÕr-   c                ó&   — | j                  d«       y )NrŸ   )rh   ©rm   r¦   s     r+   Úappend_passz_NodeReporter.append_passë   s   € Ø�‰�xÕ r-   c                óH  — t        |d«      r| j                  dd«       y |j                  €J ‚t        |j                  dd «      }|�|j                  }nt        |j                  «      }t        t        |«      «      }| j                  d|t        |j                  «      «       y )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)r‰   rœ   ÚlongreprÚgetattrr˜   r/   r4   rJ   )rm   r¦   rº   r˜   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¼   rœ   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)rœ   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        |«      «      t        |j                   «      «       y )Nrº   Úteardownzfailed on teardown with "ú"zfailed on setup with "rÀ   )r¼   r½   r˜   r/   Úwhenrœ   r4   rJ   )rm   r¦   rº   Úreasonr@   s        r+   Úappend_errorz_NodeReporter.append_error  s”   € Ø�‰Ð*Ð*Ð*Ü-4°V·_±_ÀkÐSWÓ-Xˆ	ØÐ Ø×&Ñ&‰Fä˜Ÿ™Ó)ˆFà�;‰;˜*Ò$Ø-¨f¨X°QÐ7‰Cà*¨6¨(°!Ð4ˆCØ×ÑØ”^¤O°CÓ$8Ó9¼3¸v¿¹Ó;Oõ	
r-   c                óô  — t        |d«      rR|j                  }|j                  d«      }t        |«      }t	        j
                  dd|¬«      }| j                  |«       y t        |j                  t        «      sJ ‚|j                  \  }}}|j                  d«      }|› d|› d|› �}t	        j
                  dd	t        |«      ¬«      }t        |«      |_
        | j                  |«       | j                  |«       y )
Nr¸   zreason: r¹   zpytest.xfail)rR   r˜   z	Skipped: ú:z: zpytest.skip)r‰   r¸   Úremoveprefixr4   r}   r~   r>   rO   r¼   Útuplerš   r«   )rm   r¦   Úxfailreasonr¹   ÚfilenameÚlinenoÚ
skipreasonÚdetailss           r+   Úappend_skippedz_NodeReporter.append_skipped  sÙ   € Ü�6˜:Ô&Ø Ÿ/™/ˆKØ%×2Ñ2°:Ó>ˆKÜ(¨Ó5ˆKÜ—j‘j °ÈÔUˆGØ�K‰K˜Õ ä˜fŸo™o¬uÔ5Ð5Ð5Ø+1¯?©?Ñ(ˆH�f˜jØ#×0Ñ0°Ó=ˆJØ!˜
 ! 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 rL   © )r›   s   €r+   ú<lambda>z(_NodeReporter.finalize.<locals>.<lambda>/  s   ø€ ˜d€ r-   )r–   Ú__dict__Úclear)rm   r›   s    @r+   Úfinalizez_NodeReporter.finalize*  s'   ø€ Ø�{‰{‹}ˆØ�‰×ÑÔó #ˆ�r-   )rn   r   rg   r   r.   ÚNone)rr   ú
ET.Elementr.   rÛ   ©r]   r/   ru   Úobjectr.   rÛ   ©r.   zET.Element | None)r‹   úTestReport | CollectReportr.   rÛ   )r.   rÜ   rL   )rq   r/   r˜   r/   r›   ú
str | Noner.   rÛ   ©r¦   r   r.   rÛ   )r°   r/   r±   r/   r.   r/   )r¦   r   r°   r/   r³   r/   r.   rÛ   ©r¦   r   r.   rÛ   ©r.   rÛ   )Ú__name__Ú
__module__Ú__qualname__ro   r>   rv   rx   r€   r‘   r–   rœ   r«   r¤   r¥   r¶   r¾   rÁ   rÃ   rÉ   rÓ   rÚ   rÖ   r-   r+   rc   rc   �   sc   „ ó(ó óCó6óó ó@ôó
Có.@óó
!óGó Nó
Pó
ó /ô(#r-   rc   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    r   z$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	Ú_pytest.warning_typesré   ÚconfigÚstashÚgetÚxml_keyri   rr   Úwarn)ÚrequestÚfixture_nameré   rg   s       r+   Ú!_warn_incompatibility_with_xunit2rò   2  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 rL   )rr   Úuser_propertiesr>   )r]   ru   rð   s     €r+   Úappend_propertyz(record_property.<locals>.append_propertyR  s   ø€ Ø�‰×$Ñ$×+Ñ+¨T°5¨MÕ:r-   rÝ   )rò   )rð   r÷   s   ` r+   rô   rô   A  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 rL   rÖ   r|   s     r+   Úadd_attr_noopz+record_xml_attribute.<locals>.add_attr_nooph  s   € Ør-   NrÝ   )rê   rù   rr   rï   rò   rë   rì   rí   rî   Únode_reporterrf   rx   )rð   rù   rü   Ú	attr_funcrg   rý   s         r+   rú   rú   X  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)rO   r/   rQ   ÚformatrR   rå   )r   ÚvÚ__tracebackhide__r@   s       r+   Ú_check_record_param_typer  u  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.Tr]   N)r  )r]   ru   r  s      r+   Úrecord_funcz.record_testsuite_property.<locals>.record_funcš  s   € à ÐÜ  ¨Õ.r-   NrÝ   )rë   rì   rí   rî   Úadd_global_property)rð   r  r
  rg   s       r+   Úrecord_testsuite_propertyr  ~  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t        d¬«       | j                  dddd¬«       | j                  ddt        d¬«       | j                  ddt        d ¬«       y )!Nzterminal reportingz
--junitxmlz--junit-xmlÚstoreÚxmlpathÚpath)Úoptnamez0Create junit-xml style report file at given path)ÚactionÚdestÚmetavarrR   Ú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 reportr   )rR   r  Újunit_log_passing_testsz;Capture log information for passing tests to JUnit report: ÚboolTÚjunit_duration_reportzDuration time to reportr   Újunit_familyzEmit XML for schemar!   )	ÚgetgroupÚ	addoptionÚ	functoolsÚpartialr   ÚaddiniÚ_JunitLoggingÚ_JunitDurationReportÚ_JunitFamily)Úparserr(   s     r+   Úpytest_addoptionr'  ¥  s  € Ø�O‰OÐ0Ó1€EØ	‡O�OØØØØØÜ×Ñœ|°\ÔBØØ?ð ô 	ð 
‡O�OØØØØØØ?ð ô ð ‡M�MØÐ>Èð ô ð ‡M�MØØ5ÜØð	 ô ð ‡M�MØ!ØEØØð	 ô ð ‡M�MØØ!Ü!Øð	 ô ð ‡M�MØØÜØð	 õ r-   c                óª  — | j                   j                  }|r»t        | d«      s®t        || j                   j                  | j                  d«      | j                  d«      | j                  d«      | j                  d«      | j                  d«      «      | j                  t        <   | j                  j                  | j                  t           «       y y y )NÚworkerinputr  r  r  r  r  )
Úoptionr  r‰   r   ÚjunitprefixÚgetinirì   rî   ÚpluginmanagerÚregister)rë   r  s     r+   Úpytest_configurer/  Ö  s¥   € Ø�m‰m×#Ñ#€Gá”w˜v }Ô5Ü &ØØ�M‰M×%Ñ%Ø�M‰MÐ,Ó-Ø�M‰M˜/Ó*Ø�M‰MÐ1Ó2Ø�M‰M˜.Ó)Ø�M‰MÐ3Ó4ó!
ˆ�‰”WÑð 	×Ñ×%Ñ% f§l¡l´7Ñ&;Õ<ð 6€wr-   c                ó¢   — | j                   j                  t        d «      }|r-| j                   t        = | j                  j	                  |«       y y rL   )rì   rí   rî   r-  Ú
unregister)rë   rg   s     r+   Úpytest_unconfigurer2  æ  s@   € Ø
�,‰,×
Ñ
œ7 DÓ
)€CÙ
Ø�L‰LœÐ!Ø×Ñ×'Ñ'¨Õ,ð r-   c                ó6  — t        j                  | «      }|j                  g|j                  ¢}|d   j	                  t
        j                  d«      |d<   t        j                  dd|d   «      |d<   |j                  �|dxx   d|j                  › d�z  cc<   |S )Nr   rƒ   z\.py$r6   r‚   ú[ú])
r   Úparser  rŒ   Úreplacer   ÚSEPr0   r1   Úparams)ÚaddressÚoidrŒ   s      r+   r„   r„   í  s‰   € Ü
�,‰,�wÓ
€CØ�X‰XÐ"˜Ÿ	™	Ð"€Eà�Q‰x×Ñ¤§	¡	¨3Ó/€Eˆ!�HÜ�v‰v�h  E¨!¡HÓ-€Eˆ!�Hð ‡z�zÐØˆb‹	�q˜Ÿ™˜ AÐ&Ñ&‹	Ø€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Úlogfiler†   Ú
suite_namer£   rž   Úreport_durationri   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rm   rC  r†   rD  r£   rE  ri   rž   s           r+   ro   zLogXML.__init__û  sÓ   € ô —'‘'×$Ñ$¤R§W¡W×%7Ñ%7¸Ó%@ÓAˆÜ—w‘w×'Ñ'¬¯©¯©¸Ó(@ÓAˆŒØˆŒØ$ˆŒØˆŒØ!2ˆÔØ.ˆÔØˆŒÜ%)§]¡]Ú5°qó&
ˆŒ
ð KMˆÔØ;=ˆÔ#Ø8:ˆÔð /1ˆÔØ%&ˆÔ"ð �;‰;˜(Ò"Ø"ˆD�Kð #r-   c                óô   — |j                   }t        |dd «      }| j                  j                  ||f«      }|j                  D ]   \  }}|j                  |t        |«      «       Œ" |�|j                  «        y y )Nrr   )rf   r½   rI  Úpoprö   rv   r/   rÚ   )rm   r¦   rn   Ú
workernodeÚreporterÚpropnameÚ	propvalues          r+   rÚ   zLogXML.finalize  s{   € Ø—)‘)ˆä˜V V¨TÓ2ˆ
Ø×&Ñ&×*Ñ*¨G°ZÐ+@ÓAˆà#)×#9Ñ#9ò 	<ÑˆH�iØ×!Ñ! (¬C°	«NÕ;ð	<ð ÐØ×ÑÕð  r-   c                ó‚  — |xt         d˜ x�\    t        |«      }n@ xt        d˜ x�\    t        |«      }n& t        d˜ x�\   |j                  }n 	 t        |«       t        |dd «      }|f}|| j                  v r| j                  |   S t        || «      }|| j                  |<   | j                  j                  |«       |S )NrÖ   rr   )r   r   r/   r   rf   r
   r½   rI  rc   rJ  r>   )rm   r¦   rn   rP  r�   rQ  s         r+   rý   zLogXML.node_reporter(  s»   € ØØ”–Ü(¨Ó0‘ð à”–Ü(¨Ó0‘ð ä•Ø Ÿ)™)‘ð àÜ˜VÔ$ä˜V V¨TÓ2ˆ
à�zÐ!ˆà�$×%Ñ%Ñ%à×&Ñ& sÑ+Ð+ä  ¨$Ó/ˆà#+ˆ×Ñ˜CÑ Ø×#Ñ#×*Ñ*¨8Ô4àˆr-   c                óP   — || j                   v r| j                   |xx   dz  cc<   y y )Nr7   )rH  )rm   r�   s     r+   rh   zLogXML.add_statsB  s%   € Ø�$—*‘*ÑØ�J‰J�s‹O˜qÑ ŒOð r-   c                óJ   — | j                  |«      }|j                  |«       |S rL   )rý   r‘   ©rm   r¦   rQ  s      r+   Ú_opentestcasezLogXML._opentestcaseF  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
        Nr   rÅ   Ú	worker_idÚ
item_indexc              3  ó”   •K  — | ]?  }|j                   ‰j                   k(  r$t        |d d«      ‰k(  rt        |dd«      ‰k(  r|–— ŒA y­w©r[  NrZ  ©rf   r½   ©Ú.0Úrepr¦   Ú	report_iiÚ
report_wids     €€€r+   ú	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>m  sK   øè ø€ ò ààŸF™F f§i¡iÒ/Ü '¨¨\¸4Ó @ÀIÒ MÜ '¨¨[¸$Ó ?À:Ò Mô ñùó   ƒAArr   c              3  ó”   •K  — | ]?  }|j                   ‰j                   k(  r$t        |d d«      ‰k(  rt        |dd«      ‰k(  r|–— ŒA y­wr]  r^  r_  s     €€€r+   rd  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>œ  sK   øè ø€ ò ààŸ™ &§)¡)Ò+Ü# C¨°tÓ<À	ÒIÜ# C¨°dÓ;¸zÒIô ñùre  )rŸ   rÇ   rX  r¶   Úfailedr½   ÚnextrL  rÚ   rM  Úintrf   rI  r¾   r>   rž   r«   rÉ   r¹   rÓ   Úupdate_testcase_durationÚremove)rm   r¦   Úclose_reportrQ  rb  rc  s    `  @@r+   Úpytest_runtest_logreportzLogXML.pytest_runtest_logreportK  s  ú€ ð. ˆØ�=Š=Ø�{‰{˜fÓ$Ø×-Ñ-¨fÓ5�Ø×$Ñ$ VÖ,Ø�]‹]Ø�{‰{˜jÒ(ä$ V¨[¸$Ó?�
Ü# F¨L¸$Ó?�	Ü#õà#'×#4Ñ#4ôð ó �ñ  ð —M‘M ,Õ/ð
 ×.Ò.´#à"ŸI™IÜ# 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   rj   re   N)rE  rÇ   rý   rj   r½   rW  s      r+   rj  zLogXML.update_testcase_durationª  sJ   € ð ×Ñ G¨V¯[©[Ð#9Ñ9Ø×)Ñ)¨&Ó1ˆHØ×Ò¤¨°¸SÓ!AÑAÖð :r-   c                óž   — |j                   sA| j                  |«      }|j                  r|j                  |«       y |j	                  |«       y y rL   )rŸ   rX  rg  rÁ   rÃ   rW  s      r+   Úpytest_collectreportzLogXML.pytest_collectreport±  sA   € Ø�}Š}Ø×)Ñ)¨&Ó1ˆHØ�}Š}Ø×-Ñ-¨fÕ5à×/Ñ/°Õ7ð r-   c                ó˜   — | j                  d«      }|j                  j                  dd¬«       |j                  ddt	        |«      «       y )NÚinternalr  )r\   r]   rÀ   zinternal error)rý   rl   rS   rœ   r/   )rm   ÚexcreprrQ  s      r+   Úpytest_internalerrorzLogXML.pytest_internalerror¹  s@   € Ø×%Ñ% jÓ1ˆØ�‰×Ñ¨°zÐÔBØ×Ñ˜WÐ&6¼¸G»ÕEr-   c                ó6   — t        j                  «       | _        y rL   )r   ÚInstantÚsuite_start)rm   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"?>Ú	testsuiter“   )r]   ÚerrorsÚfailuresr¹   Útestsr”   Ú	timestampÚhostnameÚ
testsuitesr]   zpytest testsÚunicode)r>  r  ÚdirnamerB  rC  ÚmakedirsÚopenrw  ÚelapsedrH  rM  Úwriter}   r~   rD  r/   ÚsecondsÚas_utcÚ
astimezoneÚ	isoformatÚplatformrr   Ú_get_global_properties_noder>   rJ  r–   ÚsetÚtostring)	rm   r…  rC  rj   ÚnumtestsÚ
suite_noderK  rý   rƒ  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_seprC  )rm   Ú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 )NTr]   )r  rK  r>   r4   )rm   r]   ru   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rz   )rK  r}   r~   r>   r   s       r+   r�  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)r†   rá   rD  r/   r£   r#  rE  r$  ri   r%  rž   r  r.   rÛ   râ   )r¦   zBaseReport | NodeId | strr.   rc   )r�   r/   r.   rÛ   )r¦   rà   r.   rc   rã   )rs  r   r.   rÛ   rä   )r˜  r   rë   zpytest.Configr.   rÛ   rÝ   rß   )rå   ræ   rç   ro   rÚ   rý   rh   rX  rm  rj  rp  rt  rx  r”  r™  r  r�  rÖ   r-   r+   r   r   ú  sÃ   „ ð
 #Ø!%Ø07Ø'Ø"&ð#ð ð#ð ð	#ð
 ð#ð .ð#ð ð#ð  ð#ð 
ó#óB
 óó4!óó
]7ó~Bó8óFó
,ó$GðLSØ 0ðSØ:GðSà	óSóEô
r-   )r2   rÞ   r.   r/   )r@   r/   rA   ri  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])@Ú__doc__Ú
__future__r   Úcollections.abcr   r   r>  rŽ  r0   Útypingr   Úxml.etree.ElementTreeÚetreeÚElementTreer}   Ú_pytestr   r   Ú_pytest._code.coder   r	   Ú_pytest.compatr
   Ú_pytest.configr   r   Ú_pytest.config.argparsingr   Ú_pytest.fixturesr   Ú_pytest.nodeidr   r   Ú_pytest.reportsr   r   r   Ú_pytest.stashr   Ú_pytest.terminalr   r  rî   r#  r$  r%  r4   ÚMESSAGE_ATTR_BUDGETrJ   rZ   rŠ   Úcopyrc   rò   Úfixturerô   rú   r  r  r'  r/  r2  r„   r   rÖ   r-   r+   ú<module>r°     s©  ðñõ #å $Û Û 	Û Û 	Ý ß "Ð "å Ý Ý ,Ý /Ý 'Ý !Ý 'Ý ,Ý +Ý )Ý !Ý &Ý )Ý &Ý "Ý -Û ð ˆ(�8Ñ
Ó
€àÐQÑR€Ø˜Ñ/Ð ØÐ3Ñ4€ó2ð6 Ð ð -@ô Aó<ð ˜;¨Ð/Ð0ØÒ!8Ð9ñ€ð
 ˜gÑ&×+Ñ+Ó-€ˆÑ Ù ˆX�hÑ ¨.Ñ!9Ô :ð ˜gÑ&€ˆÑ ÷n#ñ n#ðb
Øð
Ø+.ð
à	ó
ð ‡�òó ðð, ‡�òó ðó8Eð €‡��iÔ ò#ó !ð#óL.ób=ó -ó
÷ò r-   