ó
    áÅŸgæc  ã                  óœ  • S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKrSSK	J
r
  SSK	Jr  SSKJs  Jr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"  SSK#r#\ S   " 5       r$S,S jr%S-S jr&0 r'SSS/0\'S'   S/ SQ0\'S'   \'S   RQ                  5       \'S'   \&" \'S   \'S   5        \'S   \'S'    " S S5      r)      S.S  jr*\#RV                  S/S! j5       r,\#RV                  S/S" j5       r-S0S# jr.\#RV                  " S$S%9S/S& j5       r/S1S' jr0S2S( jr1S2S) jr2S3S* jr3 " S+ S5      r4g)4a  Report test results in JUnit-XML format, for use with Jenkins and build
integration servers.

Based on initial code from Ross Lawley.

Output conforms to
https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
é    )Úannotations)Údatetime)ÚtimezoneN)ÚCallable)ÚMatch)Únodes)Útiming)ÚExceptionRepr)ÚReprFileLocation)ÚConfig)Úfilename_arg)ÚParser)ÚFixtureRequest)Ú
TestReport)ÚStashKey)ÚTerminalReporterÚLogXMLc                óP   • SS jnSn[         R                  " X![        U 5      5      $ )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                óX   • [        U R                  5       5      nUS::  a  SUS 3$ SUS 3$ )Néÿ   z#xÚ02XÚ04X)ÚordÚgroup)ÚmatchobjÚis     ÚQ/var/www/blue/EV-Temp_rev04/venv/lib/python3.13/site-packages/_pytest/junitxml.pyÚreplÚbin_xml_escape.<locals>.repl3   s6   € Ü�—‘Ó Ó!ˆØ�‹9Ø˜˜#�w�<Ðà˜˜#�w�<Ðó    u    [^	
 -~Â€-íŸ¿î€€-ï¿½á€€0-áƒ¿ff])r   z
Match[str]ÚreturnÚstr)ÚreÚsubr"   )Úargr   Úillegal_xml_res      r   Úbin_xml_escaper'   (   s)   € ô ð 	Wð ô �6Š6�.¬¨C«Ó1Ð1r    c                óì   • 0 nU R                  5        HM  u  p4UR                  5        H4  u  pV[        U[        5      (       d  [        [	        U5      5      eXF-   X#'   M6     MO     U R                  U5        g ©N)ÚitemsÚ
isinstanceÚlistÚ	TypeErrorÚtypeÚupdate)ÚleftÚrightÚresultÚklÚvlÚkrÚvrs          r   Úmerge_familyr7   C   s^   € Ø€FØ—*‘*–,‰ˆØ—k‘k–m‰FˆBÜ˜b¤$×'Ñ'Ü¤ R£Ó)Ð)Ø™ˆF‹Jó $ñ ð
 	‡K�K�Õr    ÚtestcaseÚ	classnameÚnameÚ_base)ÚfileÚlineÚurlÚ_base_legacyÚxunit1Úxunit2c                  óÌ   • \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SSS
 jjrSS jrSS jrS S jrSS jrSS jrSS jrSS jrSS jrSS jrS!S jrSrg	)"Ú_NodeReporteréY   c                óÀ   • Xl         X l        U R                  R                  U l        U R                  R                  U l        SU l        / U l        / U l        0 U l        g )Nç        )ÚidÚxmlÚ	add_statsÚfamilyÚdurationÚ
propertiesr   Úattrs)ÚselfÚnodeidrH   s      r   Ú__init__Ú_NodeReporter.__init__Z   sH   € ØŒØŒØŸ™×+Ñ+ˆŒØ—h‘h—o‘oˆŒØˆŒØ13ˆŒØ')ˆŒ
Ø%'ˆ�
r    c                ó„   • U R                   R                  UR                  5        U R                  R	                  U5        g r)   )rH   rI   Útagr   Úappend)rN   Únodes     r   rT   Ú_NodeReporter.appendd   s*   € Ø�‰×Ñ˜4Ÿ8™8Ô$Ø�
‰
×Ñ˜$Õr    c                ób   • U R                   R                  [        U5      [        U5      45        g r)   )rL   rT   r"   r'   ©rN   r:   Úvalues      r   Úadd_propertyÚ_NodeReporter.add_propertyh   s"   € Ø�‰×Ñ¤ D£	¬>¸%Ó+@ÐAÕBr    c                óF   • [        U5      U R                  [        U5      '   g r)   )r'   rM   r"   rX   s      r   Úadd_attributeÚ_NodeReporter.add_attributek   s   € Ü .¨uÓ 5ˆ�
‰
”3�t“9Òr    c           	     óÈ   • U R                   (       aQ  [        R                  " S5      nU R                    H)  u  p#UR                  [        R                  " SX#S95        M+     U$ g©z9Return a Junit node containing custom properties, if any.rL   Úproperty©r:   rY   N)rL   ÚETÚElementrT   ©rN   rL   r:   rY   s       r   Úmake_properties_nodeÚ"_NodeReporter.make_properties_noden   sI   € à�?�?ÜŸš LÓ1ˆJØ#Ÿœ‘�Ø×!Ñ!¤"§*¢*¨Z¸dÑ"PÖQñ  /àÐØr    c                ó¸  • [        UR                  5      nU R                  nUS S nU R                  R                  (       a&  UR                  SU R                  R                  5        SR                  U5      [        US   5      UR                  S   S.nUR                  S   b  [        UR                  S   5      US'   [        US5      (       a  UR                  US'   XPl        U R                  R                  U5        U R                  S:X  a  g 0 nU R                   H0  nU[        U R                     S	   ;   d  M  U R                  U   Xg'   M2     X`l        g )
Néÿÿÿÿr   Ú.)r9   r:   r<   é   r=   r>   r@   r8   )Úmangle_test_addressrO   rM   rH   ÚprefixÚinsertÚjoinr'   Úlocationr"   Úhasattrr>   r/   rJ   Úfamilies)rN   Ú
testreportÚnamesÚexisting_attrsÚ
classnamesrM   Ú
temp_attrsÚkeys           r   Úrecord_testreportÚ_NodeReporter.record_testreportw   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ØŒ
Ø�
‰
×Ñ˜.Ô)ð �;‰;˜(Ó"Øð ˆ
Ø—:”:ˆCØ”h˜tŸ{™{Ñ+¨JÑ7Õ7Ø"&§*¡*¨S¡/�
“ñ ð  �
r    c                óÜ   • [         R                  " SU R                  U R                  S S9nU R	                  5       nUb  UR                  U5        UR                  U R                  5        U$ )Nr8   ú.3f)Útime)rc   rd   rM   rK   rf   rT   Úextendr   )rN   r8   rL   s      r   Úto_xmlÚ_NodeReporter.to_xml•   sV   € Ü—:’:˜j¨$¯*©*¸d¿m¹mÈCÐ=PÑRˆØ×.Ñ.Ó0ˆ
ØÑ!Ø�O‰O˜JÔ'Ø�‰˜Ÿ
™
Ô#Øˆr    Nc                ón   • [         R                  " XS9n[        U5      Ul        U R	                  U5        g )N)Úmessage©rc   rd   r'   ÚtextrT   )rN   rS   r‚   ÚdatarU   s        r   Ú_add_simpleÚ_NodeReporter._add_simple�   s(   € Ü�zŠz˜#Ñ/ˆÜ" 4Ó(ˆŒ	Ø�‰�DÕr    c                ót  • U R                   R                  (       d  UR                  (       a  g UR                  nUR                  nUR
                  nU R                   R                  S:X  a  g SnU R                   R                  S;   a  U R                  US5      nU R                   R                  S;   a(  XPR                  US5      -  nU R                  XS5        SnU R                   R                  S;   a(  XPR                  US	5      -  nU R                  XS
5        SnU(       a  U R                  XS5        g g )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errrŒ   z Captured Out r�   )ú
system-errrŽ   rŒ   z Captured Err r�   )	rH   Úlog_passing_testsÚpassedÚ	capstdoutÚcaplogÚ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rN   ÚreportÚcontent_outÚcontent_logÚcontent_errÚcontent_alls         r   Úwrite_captured_outputÚ#_NodeReporter.write_captured_output¢   s
  € Ø�x‰x×)×)¨f¯m¯mØà×&Ñ&ˆØ—m‘mˆØ×&Ñ&ˆØ�8‰8×Ñ˜tÓ#ØØˆØ�8‰8×Ñ˜~Ó-Ø×/Ñ/°Ð=MÓNˆKØ�8‰8×ÑÐ?Ó?Ø×0Ñ0°Ð>NÓOÑOˆKØ×Ñ °\ÔBØˆKØ�8‰8×ÑÐ?Ó?Ø×0Ñ0°Ð>NÓOÑOˆKØ×Ñ °\ÔBØˆKÞØ×Ñ °\ÕBð r    c                óJ   • SR                  UR                  SS5      US/5      $ )NÚ
éP   Ú-rŠ   )ro   Úcenter)rN   ÚcontentÚheaders      r   r–   Ú_NodeReporter._prepare_content¹   s#   € Ø�y‰y˜&Ÿ-™-¨¨CÓ0°'¸2Ð>Ó?Ð?r    c                ór   • [         R                  " U5      n[        U5      Ul        U R	                  U5        g r)   rƒ   )rN   r˜   r¤   ÚjheaderrS   s        r   r—   Ú_NodeReporter._write_content¼   s(   € Ü�jŠj˜Ó!ˆÜ! 'Ó*ˆŒØ�‰�CÕr    c                ó&   • U R                  S5        g )Nr‘   )rI   ©rN   r˜   s     r   Úappend_passÚ_NodeReporter.append_passÁ   s   € Ø�‰�xÕ r    c                óD  • [        US5      (       a  U R                  SS5        g UR                  c   e[        UR                  SS 5      nUb  UR                  nO[        UR                  5      n[        U5      nU R                  SU[        UR                  5      5        g )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)rq   r†   ÚlongreprÚgetattrr‚   r"   r'   )rN   r˜   r±   r‚   s       r   Úappend_failureÚ_NodeReporter.append_failureÄ   s‹   € ä�6˜:×&Ñ&Ø×Ñ˜YÐ(OÕPà—?‘?Ñ.Ð.Ð.Ü18Ø—‘ ¨dó2ˆIð Ñ$Ø#×+Ñ+‘ä˜fŸo™oÓ.�Ü$ WÓ-ˆGØ×Ñ˜Y¨´°V·_±_Ó1EÕFr    c                ón   • UR                   c   eU R                  SS[        UR                   5      5        g )NÚerrorzcollection failure)r³   r†   r"   r«   s     r   Úappend_collect_errorÚ"_NodeReporter.append_collect_errorÔ   s.   € à�‰Ñ*Ð*Ð*Ø×Ñ˜Ð"6¼¸F¿O¹OÓ8LÕMr    c                óP   • U R                  SS[        UR                  5      5        g )Nr°   zcollection skipped)r†   r"   r³   r«   s     r   Úappend_collect_skippedÚ$_NodeReporter.append_collect_skippedÙ   s   € Ø×Ñ˜Ð$8¼#¸f¿o¹oÓ:NÕOr    c                ó2  • UR                   c   e[        UR                   SS 5      nUb  UR                  nO[        UR                   5      nUR                  S:X  a  SU S3nOSU S3nU R                  S[        U5      [        UR                   5      5        g )Nr±   Úteardownzfailed on teardown with "Ú"zfailed on setup with "r¸   )r³   r´   r‚   r"   Úwhenr†   r'   )rN   r˜   r±   ÚreasonÚmsgs        r   Úappend_errorÚ_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                ó&  • [        US5      (       aZ  UR                  nUR                  S5      (       a  USS  n[        U5      n[        R
                  " SSUS9nU R                  U5        g [        UR                  [        5      (       d   eUR                  u  pEnUR                  S5      (       a  USS  nU S	U S
U 3n[        R
                  " SS[        U5      S9n[        U5      Ul
        U R                  U5        U R                  U5        g )Nr¯   zreason: é   r°   zpytest.xfail)r.   r‚   z	Skipped: é	   Ú:z: zpytest.skip)rq   r¯   Ú
startswithr'   rc   rd   rT   r+   r³   Útupler„   r�   )rN   r˜   Úxfailreasonr°   ÚfilenameÚlinenoÚ
skipreasonÚdetailss           r   Úappend_skippedÚ_NodeReporter.append_skippedê   sõ   € Ü�6˜:×&Ñ&Ø Ÿ/™/ˆKØ×%Ñ% j×1Ñ1Ø)¨!¨"˜o�Ü(¨Ó5ˆKÜ—j’j °ÈÑUˆGØ�K‰K˜Õ ä˜fŸo™o¬u×5Ñ5Ð5Ð5Ø+1¯?©?Ñ(ˆH˜jØ×$Ñ$ [×1Ñ1Ø'¨¨˜^�
Ø!˜
 ! F 8¨2¨j¨\Ð:ˆGä—j’jØ ´~ÀjÓ7QñˆGô *¨'Ó2ˆGŒLØ�K‰K˜Ô Ø×&Ñ& vÕ.r    c                óp   ^• U R                  5       mU R                  R                  5         U4S jU l         g )Nc                 ó   >• T $ r)   © )r…   s   €r   Ú<lambda>Ú(_NodeReporter.finalize.<locals>.<lambda>  s   ø€ ™dr    )r   Ú__dict__Úclear)rN   r…   s    @r   ÚfinalizeÚ_NodeReporter.finalize   s'   ø€ Ø�{‰{‹}ˆØ�‰×ÑÔô #ˆ�r    )	rI   rM   rK   rJ   rG   r   rL   r   rH   )rO   zstr | TestReportrH   r   r!   ÚNone)rU   ú
ET.Elementr!   rÜ   ©r:   r"   rY   Úobjectr!   rÜ   ©r!   zET.Element | None)rs   r   r!   rÜ   )r!   rÝ   r)   )rS   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Ü   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rP   rT   rZ   r]   rf   ry   r   r†   r�   r–   r—   r¬   rµ   r¹   r¼   rÄ   rÑ   rÚ   Ú__static_attributes__rÕ   r    r   rC   rC   Y   sc   † ô(ô ôCô6ôô ô<öô
Cô.@ôô
!ôGô Nô
PôMô/÷,#r    rC   c                óð   • SSK Jn  U R                  R                  R	                  [
        S5      nUbC  UR                  S;  a2  U R                  R                  U" U SUR                   S35      5        ggg)z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )ÚPytestWarningN)r@   Úlegacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	Ú_pytest.warning_typesrê   ÚconfigÚstashÚgetÚxml_keyrJ   rU   Úwarn)ÚrequestÚfixture_namerê   rH   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                ó0   ^ • [        T S5        SU 4S jjnU$ )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                óR   >• TR                   R                  R                  X45        g r)   )rU   Úuser_propertiesrT   )r:   rY   rò   s     €r   Úappend_propertyÚ(record_property.<locals>.append_property(  s   ø€ Ø�‰×$Ñ$×+Ñ+¨T¨MÕ:r    rÞ   )rô   )rò   rù   s   ` r   rö   rö     s   ø€ ô & gÐ/@ÔA÷;ð Ðr    c                ó6  • SSK Jn  U R                  R                  U" S5      5        [	        U S5        SS jnUnU R
                  R                  R                  [        S5      nUb1  UR                  U R                  R                  5      nUR                  nU$ )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                ó   • g r)   rÕ   rb   s     r   Úadd_attr_noopÚ+record_xml_attribute.<locals>.add_attr_noop>  s   € Ør    NrÞ   )rì   rü   rU   rñ   rô   rí   rî   rï   rð   Únode_reporterrO   r]   )rò   rü   rÿ   Ú	attr_funcrH   r  s         r   rý   rý   .  sˆ   € õ Cà‡L�L×ÑÙ$Ð%VÓWôô & gÐ/EÔFôð €Ià
�.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
�Ø×)Ñ)¨'¯,©,×*=Ñ*=Ó>ˆØ!×/Ñ/ˆ	àÐr    c                óŽ   • Sn[        U[        5      (       d.  Sn[        UR                  U [	        U5      R
                  S95      eg)z_Used 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	  K  sC   € ð ÐÜ�aœ×ÑØEˆÜ˜Ÿ
™
¨´$°q³'×2BÑ2B˜
ÐCÓDÐDð r    Úsession)Úscopec                ó†   • SnSS jnU R                   R                  R                  [        S5      nUb  UR                  nU$ )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                ó    • Sn[        SU 5        g)zFNo-op function in case --junit-xml was not passed in the command-line.Tr:   N)r	  )r:   rY   r  s      r   Úrecord_funcÚ.record_testsuite_property.<locals>.record_funcp  s   € à ÐÜ  ¨Õ.r    NrÞ   )rí   rî   rï   rð   Úadd_global_property)rò   r  r  rH   s       r   Úrecord_testsuite_propertyr  T  sC   € ð4 Ðô/ð
 �.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
�Ø×-Ñ-ˆØÐr    c                óT  • U R                  S5      nUR                  SSSSS[        R                  " [        SS9S SS	9  UR                  S
SSSS SS9  U R                  SSSS9  U R                  SSSS9  U R                  SSSSS9  U R                  SSSS9  U R                  SSS S9  g )!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)Úparserr   s     r   Úpytest_addoptionr*  {  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                óÂ  • U R                   R                  nU(       aÂ  [        U S5      (       d°  U R                  S5      n[	        UU R                   R
                  U R                  S5      U R                  S5      U R                  S5      UU R                  S5      5      U R                  [        '   U R                  R                  U R                  [           5        g g g )NÚworkerinputr#  r  r  r!  r  )
Úoptionr  rq   Úgetinir   Újunitprefixrî   rð   ÚpluginmanagerÚregister)rí   r  r#  s      r   Úpytest_configurer2  ª  s­   € Ø�m‰m×#Ñ#€Gæ”w˜v }×5Ñ5Ø—}‘} ^Ó4ˆÜ &ØØ�M‰M×%Ñ%Ø�M‰MÐ,Ó-Ø�M‰M˜/Ó*Ø�M‰MÐ1Ó2ØØ�M‰MÐ3Ó4ó!
ˆ�‰”WÑð 	×Ñ×%Ñ% f§l¡l´7Ñ&;Õ<ð 6€wr    c                ó¬   • U R                   R                  [        S 5      nU(       a-  U R                   [        	 U R                  R	                  U5        g g r)   )rî   rï   rð   r0  Ú
unregister)rí   rH   s     r   Úpytest_unconfigurer5  »  s@   € Ø
�,‰,×
Ñ
œ7 DÓ
)€CÞ
Ø�L‰LœÐ!Ø×Ñ×'Ñ'¨Õ,ð r    c                óö   • U R                  S5      u  pnUR                  S5      nUS   R                  [        R                  S5      US'   [
        R                  " SSUS   5      US'   US==   X#-   -  ss'   U$ )NÚ[z::r   rj   z\.py$rŠ   ri   )Ú	partitionÚsplitÚreplacer   ÚSEPr#   r$   )Úaddressr  Úpossible_open_bracketÚparamsrt   s        r   rl   rl   Â  st   € Ø*1×*;Ñ*;¸CÓ*@Ñ'€D Ø�J‰J�tÓ€Eà�Q‰x×Ñ¤§	¡	¨3Ó/€Eˆ!�HÜ�vŠv�h  E¨!¡HÓ-€Eˆ!�Hà	ˆ"ƒIÐ&Ñ/Ñ/ƒIØ€Lr    c                  óÄ   • \ rS rSr     S           SS jjrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSrg)r   iÍ  c                óö  • [         R                  R                  [         R                  R                  U5      5      n[         R                  R	                  [         R                  R                  U5      5      U l        X l        X0l        X@l	        Xpl
        XPl        X`l        [        R                  / SQS5      U l        0 U l        / U l        / U l        / U l        SU l        U R                  S:X  a  SU l        g g )N)r¸   r‘   r²   r°   r   rë   r@   )Úosr  Ú
expanduserÚ
expandvarsÚnormpathÚabspathÚlogfilerm   Ú
suite_namer•   r�   Úreport_durationrJ   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rN   rF  rm   rG  r•   rH  rJ   r�   s           r   rP   ÚLogXML.__init__Î  sÇ   € ô —'‘'×$Ñ$¤R§W¡W×%7Ñ%7¸Ó%@ÓAˆÜ—w‘w×'Ñ'¬¯©¯©¸Ó(@ÓAˆŒØŒØ$ŒØŒØ!2ÔØ.ÔØŒÜ%)§]¡]Ú5°qó&
ˆŒ
ð UWˆÔØ;=ˆÔ#Ø8:ˆÔð /1ˆÔØ%&ˆÔ"ð �;‰;˜(Ó"Ø"ˆD�Kð #r    c                óø   • [        USU5      n[        USS 5      nU R                  R                  X#45      nUR                   H   u  pVUR	                  U[        U5      5        M"     Ub  UR                  5         g g ©NrO   rU   )r´   rL  Úpoprø   rZ   r"   rÚ   )rN   r˜   rO   Ú
workernodeÚreporterÚpropnameÚ	propvalues          r   rÚ   ÚLogXML.finalizeï  sw   € Ü˜ ¨6Ó2ˆä˜V V¨TÓ2ˆ
Ø×&Ñ&×*Ñ*¨FÐ+?Ó@ˆà#)×#9Ô#9ÑˆHØ×!Ñ! (¬C°	«NÖ;ñ $:ð ÑØ×ÑÕð  r    c                óä   • [        USU5      n[        USS 5      nX#4nX@R                  ;   a  U R                  U   $ [        X 5      nXPR                  U'   U R                  R	                  U5        U$ rS  )r´   rL  rC   rM  rT   )rN   r˜   rO   rU  rx   rV  s         r   r  ÚLogXML.node_reporterû  st   € Ü#*¨6°8¸VÓ#Dˆä˜V V¨TÓ2ˆ
àÐ ˆà×%Ñ%Ó%à×&Ñ& sÑ+Ð+ä  Ó.ˆà#+×Ñ˜CÑ Ø×#Ñ#×*Ñ*¨8Ô4àˆr    c                óR   • XR                   ;   a  U R                   U==   S-  ss'   g g )Nrk   )rK  )rN   rx   s     r   rI   ÚLogXML.add_stats  s#   € Ø—*‘*ÓØ�J‰J�s‹O˜qÑ ŒOð r    c                óJ   • U R                  U5      nUR                  U5        U$ r)   )r  ry   ©rN   r˜   rV  s      r   Ú_opentestcaseÚLogXML._opentestcase  s%   € Ø×%Ñ% fÓ-ˆØ×"Ñ" 6Ô*Øˆr    c                ó~  ^^^• SnTR                   (       a4  TR                  S:X  a"  U R                  T5      nUR                  T5        GO?TR                  (       aû  TR                  S:X  ai  [        TSS5      m[        TSS5      m[        UUU4S jU R                   5       S5      nU(       a&  U R                  U5        U =R                  S-  sl	        U R                  T5      nTR                  S:X  aO  UR                  T5        U R                  R                  T5        U R                  (       d  UR                  T5        OEUR                  T5        O3TR                  (       a"  U R                  T5      nUR!                  T5        U R#                  T5        TR                  S:X  a“  U R                  T5      nUR                  T5        U R                  T5        [        TSS5      m[        TSS5      m[        UUU4S jU R                   5       S5      nU(       a  U R                  R%                  U5        ggg)	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  óª   >#   • U HI  nUR                   TR                   :X  d  M  [        US S5      T:X  d  M2  [        USS5      T:X  d  ME  Uv •  MK     g7f©re  Nrd  ©rO   r´   ©Ú.0Úrepr˜   Ú	report_iiÚ
report_wids     €€€r   Ú	<genexpr>Ú2LogXML.pytest_runtest_logreport.<locals>.<genexpr>8  sZ   øé € ð á#4˜CàŸJ™J¨&¯-©-Ñ7ó ô !(¨¨\¸4Ó @ÀIÑ Mó	 ô
 !(¨¨[¸$Ó ?À:Ñ M÷ ™Ú#4ùó   ƒA¤A·AÁ
	Ark   c              3  óª   >#   • U HI  nUR                   TR                   :X  d  M  [        US S5      T:X  d  M2  [        USS5      T:X  d  ME  Uv •  MK     g7frg  rh  ri  s     €€€r   rn  ro  ]  sZ   øé € ð á0˜àŸ
™
 f§m¡mÑ3ó ô $ C¨°tÓ<À	ÑIó	 ô
 $ C¨°dÓ;¸zÑI÷ ‘CÚ0ùrp  )r‘   rÁ   r`  r¬   Úfailedr´   ÚnextrO  rÚ   rP  rµ   rT   r�   r�   rÄ   r°   rÑ   Úupdate_testcase_durationÚremove)rN   r˜   Úclose_reportrV  rl  rm  s    `  @@r   Úpytest_runtest_logreportÚLogXML.pytest_runtest_logreport  sß  ú€ ð. ˆØ�=�=Ø�{‰{˜fÓ$Ø×-Ñ-¨fÓ5�Ø×$Ñ$ VÔ,ùØ�]�]Ø�{‰{˜jÓ(ä$ V¨[¸$Ó?�
Ü# F¨L¸$Ó?�	Ü#öà#'×#4Ò#4óð ó �ö  ð —M‘M ,Ô/Ø×.Ò.°!Ñ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                ó    • U R                   SUR                  1;   a2  U R                  U5      nU=R                  [	        USS5      -  sl        gg)z{Accumulate total duration for nodeid from given report and update
the Junit.testcase with the new total if already created.r"  rK   rF   N)rH  rÁ   r  rK   r´   r_  s      r   rt  ÚLogXML.update_testcase_durationk  sJ   € ð ×Ñ G¨V¯[©[Ð#9Ó9Ø×)Ñ)¨&Ó1ˆHØ×Ò¤¨°¸SÓ!AÑAÖð :r    c                ó²   • UR                   (       dF  U R                  U5      nUR                  (       a  UR                  U5        g UR	                  U5        g g r)   )r‘   r`  rr  r¹   r¼   r_  s      r   Úpytest_collectreportÚLogXML.pytest_collectreportr  sA   € Ø�}�}Ø×)Ñ)¨&Ó1ˆHØ�}�}Ø×-Ñ-¨fÕ5à×/Ñ/°Õ7ð r    c                ó’   • U R                  S5      nUR                  R                  SSS9  UR                  SS[	        U5      5        g )NÚinternalr  )r9   r:   r¸   zinternal error)r  rM   r/   r†   r"   )rN   ÚexcreprrV  s      r   Úpytest_internalerrorÚLogXML.pytest_internalerrorz  s@   € Ø×%Ñ% jÓ1ˆØ�‰×Ñ¨°zÐÑBØ×Ñ˜WÐ&6¼¸G»ÕEr    c                ó8   • [         R                  " 5       U l        g r)   )r	   r}   Úsuite_start_time)rN   s    r   Úpytest_sessionstartÚLogXML.pytest_sessionstart  s   € Ü &§¢£ˆÕr    c                óø  • [         R                  R                  [         R                  R                  U R                  5      5      n[         R
                  " USS9  [        U R                  SSS9 n[        R                  " 5       nX0R                  -
  nU R                  S   U R                  S   -   U R                  S   -   U R                  S	   -   U R                  -
  nUR                  S
5        [        R                  " SU R                  [!        U R                  S	   5      [!        U R                  S   5      [!        U R                  S   5      [!        U5      US ["        R$                  " U R                  [&        R(                  5      R+                  5       R-                  5       [.        R0                  " 5       S9	nU R3                  5       nUb  UR5                  U5        U R6                   H"  nUR5                  UR9                  5       5        M$     [        R                  " S5      n	U	R5                  U5        UR                  [        R:                  " U	SS95        S S S 5        g ! , (       d  f       g = f)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Ú
testsuitesÚunicode)rA  r  ÚdirnamerE  rF  ÚmakedirsÚopenr	   r}   r„  rK  rP  Úwriterc   rd   rG  r"   r   Úfromtimestampr   ÚutcÚ
astimezoneÚ	isoformatÚplatformrU   Ú_get_global_properties_noderT   rM  r   Útostring)
rN   r“  rF  Úsuite_stop_timeÚsuite_time_deltaÚnumtestsÚ
suite_noderN  r  r‘  s
             r   Úpytest_sessionfinishÚLogXML.pytest_sessionfinish‚  sÞ  € Ü—'‘'—/‘/¤"§'¡'§/¡/°$·,±,Ó"?Ó@ˆä
�Š�G dÒ+ä�$—,‘, ¨gÒ6¸'Ü$Ÿkšk›mˆOØ.×1FÑ1FÑFÐð —
‘
˜8Ñ$Ø—*‘*˜YÑ'ñ(à—*‘*˜YÑ'ñ(ð —*‘*˜WÑ%ñ&ð ×,Ñ,ñ	-ð ð �M‰MÐBÔCäŸšØØ—_‘_Ü˜4Ÿ:™: gÑ.Ó/Ü˜TŸZ™Z¨	Ñ2Ó3Ü˜DŸJ™J yÑ1Ó2Ü˜(“mØ(¨Ð-Ü"×0Ò0°×1FÑ1FÌÏÉÓUß‘“ß‘“Ü!Ÿš›ñˆJð !%× @Ñ @Ó BÐØ Ñ,Ø×!Ñ!Ð"3Ô4Ø!%×!<Ô!<�Ø×!Ñ! -×"6Ñ"6Ó"8Ö9ñ "=äŸš LÓ1ˆJØ×Ñ˜jÔ)Ø�M‰Mœ"Ÿ+š+ j¸9ÑEÔF÷C 7×6Ö6ús   Á1G1I+É+
I9c                óB   • UR                  SSU R                   35        g )Nr¢   zgenerated xml file: )Ú	write_seprF  )rN   Úterminalreporters     r   Úpytest_terminal_summaryÚLogXML.pytest_terminal_summaryª  s   € Ø×"Ñ" 3Ð*>¸t¿|¹|¸nÐ(MÕNr    c                ól   • Sn[        SU5        U R                  R                  U[        U5      45        g )NTr:   )r	  rN  rT   r'   )rN   r:   rY   r  s       r   r  ÚLogXML.add_global_property­  s0   € Ø ÐÜ  ¨Ô.Ø×Ñ×%Ñ% t¬^¸EÓ-BÐ&CÕDr    c           	     óÈ   • U R                   (       aQ  [        R                  " S5      nU R                    H)  u  p#UR                  [        R                  " SX#S95        M+     U$ gr`   )rN  rc   rd   rT   re   s       r   rœ  Ú"LogXML._get_global_properties_node²  sM   € à×!×!ÜŸš LÓ1ˆJØ#×5Ô5‘�Ø×!Ñ!¤"§*¢*¨Z¸dÑ"PÖQñ  6àÐØr    )rP  rJ   rN  r�   rF  r•   rL  rM  rO  rm   rH  rK  rG  r„  N)r  r‰   r"  r@   T)rm   rá   rG  r"   r•   r"   rH  r"   r�   r   r!   rÜ   râ   )r˜   zTestReport | strr!   rC   )rx   r"   r!   rÜ   )r˜   r   r!   rC   )r€  r
   r!   rÜ   rã   )r¦  r   r!   rÜ   rÞ   rà   )rä   rå   ræ   rç   rP   rÚ   r  rI   r`  rw  rt  r|  r�  r…  r¢  r§  r  rœ  rè   rÕ   r    r   r   r   Í  sž   † ð
 #ØØ&ØØ"&ð#ð ð#ð ð	#ð
 ð#ð ð#ð  ð#ð 
õ#ôB
 ôô$!ôô
S7ôjBô8ôFô
.ô&GôPOô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])5Ú__doc__Ú
__future__r   r   r   r&  rA  r›  r#   Útypingr   r   Úxml.etree.ElementTreeÚetreeÚElementTreerc   Ú_pytestr   r	   Ú_pytest._code.coder
   r   Ú_pytest.configr   r   Ú_pytest.config.argparsingr   Ú_pytest.fixturesr   Ú_pytest.reportsr   Ú_pytest.stashr   Ú_pytest.terminalr   r  rð   r'   r7   rr   ÚcopyrC   rô   Úfixturerö   rý   r	  r  r*  r2  r5  rl   r   rÕ   r    r   Ú<module>r½     ss  ðñõ #å Ý Û Û 	Û Û 	Ý Ý ß "Ð "å Ý Ý ,Ý /Ý !Ý 'Ý ,Ý +Ý &Ý "Ý -Û ð �8Ò
Ó
€ô2ô6ð €Ø +¨vÐ!6Ð7€ˆÑ Ø&Ò(?Ð@€ˆÑ ð ˜gÑ&×+Ñ+Ó-€ˆÑ Ù ˆX�hÑ ¨.Ñ!9Ô :ð ˜gÑ&€ˆÑ ÷l#ñ l#ð^
Øð
Ø+.ð
à	ô
ð ‡�óó ðð, ‡�óó ðô8Eð ‡‚�iÑ ó#ó !ð#ôL,ô^=ô"-ô÷lò lr    