§
    öyIf=d  ã                   ó~  — d 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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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e'de(fd„Z)d8d„Z*i Z+dddgie+d<   dg d¢ie+d <   e+d          ,                    ¦   «         e+d!<    e*e+d!         e+d          ¦  «         e+d         e+d"<    G d#„ d$¦  «        Z-d%ed&e(ddfd'„Z.e%j/        d%edee(e'gdf         fd(„¦   «         Z0e%j/        d%edee(e'gdf         fd)„¦   «         Z1d*e(d+e(ddfd,„Z2 e%j/        d-¬.¦  «        d%edee(e'gdf         fd/„¦   «         Z3d0eddfd1„Z4d2eddfd3„Z5d2eddfd4„Z6d5e(de	e(         fd6„Z7 G d7„ d¦  «        Z8dS )9a  Report test results in JUnit-XML format, for use with Jenkins and build
integration servers.

Based on initial code from Ross Lawley.

Output conforms to
https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
é    )ÚdatetimeN)ÚCallable)ÚDict)ÚList)ÚMatch)ÚOptional)ÚTuple)ÚUnion)Únodes)Útiming)ÚExceptionRepr)ÚReprFileLocation)ÚConfig)Úfilename_arg)ÚParser)ÚFixtureRequest)Ú
TestReport)ÚStashKey)ÚTerminalReporterÚLogXMLÚargÚreturnc                 ó†   — dt           t                   dt          fd„}d}t          j        ||t          | ¦  «        ¦  «        S )a!  Visually escape invalid XML characters.

    For example, transforms
        'hello\aworld\b'
    into
        'hello#x07world#x08'
    Note that the #xABs are *not* XML escapes - missing the ampersand &#xAB.
    The idea is to escape visually for the user rather than for XML itself.
    Úmatchobjr   c                 ód   — t          |                      ¦   «         ¦  «        }|dk    rd|z  S d|z  S )Néÿ   z#x%02Xz#x%04X)ÚordÚgroup)r   Úis     úD/var/www/piapp/venv/lib/python3.11/site-packages/_pytest/junitxml.pyÚreplzbin_xml_escape.<locals>.repl5   s6   € Ý�—’Ñ Ô Ñ!Ô!ˆØ�Š9ˆ9Ø˜a‘<Ðà˜a‘<Ðó    u    [^	
 -~Â€-íŸ¿î€€-ï¿½á€€0-áƒ¿ff])r   ÚstrÚreÚsub)r   r!   Úillegal_xml_res      r    Úbin_xml_escaper'   *   sO   € ð •u�S”zð  ¥cð  ð  ð  ð  ð 	Wð õ Œ6�. $­¨C©¬Ñ1Ô1Ð1r"   c                 ó  — i }|                       ¦   «         D ]X\  }}|                      ¦   «         D ]>\  }}t          |t          ¦  «        st          t	          |¦  «        ¦  «        ‚||z   ||<   Œ?ŒY|                      |¦  «         d S ©N)ÚitemsÚ
isinstanceÚlistÚ	TypeErrorÚtypeÚupdate)ÚleftÚrightÚresultÚklÚvlÚkrÚvrs          r    Úmerge_familyr7   E   s‘   € Ø€FØ—*’*‘,”,ð !ð !‰ˆˆBØ—k’k‘m”mð 	!ð 	!‰FˆB�Ý˜b¥$Ñ'Ô'ð *Ý¥ R¡¤Ñ)Ô)Ð)Ø˜b™ˆF�2‰JˆJð	!ð 	‡K‚K�ÑÔÐÐÐr"   ÚtestcaseÚ	classnameÚnameÚ_base)ÚfileÚlineÚurlÚ_base_legacyÚxunit1Úxunit2c            	       ó†  — e Zd Zdeeef         ddddfd„Zdej        ddfd„Z	d	ed
e
ddfd„Zd	ed
e
ddfd„Zdeej                 fd„Zdeddfd„Zdej        fd„Zd#dededee         ddfd„Zdeddfd„Zdededefd„Zdedededdfd„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd „Zdeddfd!„Zd$d"„ZdS )%Ú_NodeReporterÚnodeidÚxmlr   r   Nc                 óž   — || _         || _        | j        j        | _        | j        j        | _        d| _        g | _        g | _        i | _        d S )Nç        )ÚidrE   Ú	add_statsÚfamilyÚdurationÚ
propertiesr   Úattrs)ÚselfrD   rE   s      r    Ú__init__z_NodeReporter.__init__\   sG   € ØˆŒØˆŒØœÔ+ˆŒØ”h”oˆŒØˆŒØ13ˆŒØ')ˆŒ
Ø%'ˆŒ
ˆ
ˆ
r"   Únodec                 óx   — | j                              |j        ¦  «         | j                             |¦  «         d S r)   )rE   rI   Útagr   Úappend)rN   rP   s     r    rS   z_NodeReporter.appendf   s6   € ØŒ×Ò˜4œ8Ñ$Ô$Ð$ØŒ
×Ò˜$ÑÔÐÐÐr"   r:   Úvaluec                 ór   — | j                              t          |¦  «        t          |¦  «        f¦  «         d S r)   )rL   rS   r#   r'   ©rN   r:   rT   s      r    Úadd_propertyz_NodeReporter.add_propertyj   s1   € ØŒ×Ò¥ D¡	¤	­>¸%Ñ+@Ô+@ÐAÑBÔBÐBÐBÐBr"   c                 óN   — t          |¦  «        | j        t          |¦  «        <   d S r)   )r'   rM   r#   rV   s      r    Úadd_attributez_NodeReporter.add_attributem   s"   € Ý .¨uÑ 5Ô 5ˆŒ
•3�t‘9”9ÑÐÐr"   c                 ó®   — | j         rMt          j        d¦  «        }| j         D ]/\  }}|                     t          j        d||¬¦  «        ¦  «         Œ0|S dS ©z9Return a Junit node containing custom properties, if any.rL   Úproperty©r:   rT   N)rL   ÚETÚElementrS   ©rN   rL   r:   rT   s       r    Úmake_properties_nodez"_NodeReporter.make_properties_nodep   se   € àŒ?ð 	Ýœ LÑ1Ô1ˆJØ#œð Rð R‘��eØ×!Ò!¥"¤*¨Z¸dÈ%Ð"PÑ"PÔ"PÑQÔQÐQÐQØÐØˆtr"   Ú
testreportc                 ót  — t          |j        ¦  «        }| j        }|d d…         }| j        j        r |                     d| j        j        ¦  «         d                     |¦  «        t          |d         ¦  «        |j        d         dœ}|j        d         �t          |j        d         ¦  «        |d<   t          |d¦  «        r
|j        |d<   || _        | j                             |¦  «         | j        dk    rd S i }| j        D ],}|t          | j                 d	         v r| j        |         ||<   Œ-|| _        d S )
Néÿÿÿÿr   ú.)r9   r:   r<   é   r=   r>   r@   r8   )Úmangle_test_addressrD   rM   rE   ÚprefixÚinsertÚjoinr'   Úlocationr#   Úhasattrr>   r/   rJ   Úfamilies)rN   rb   ÚnamesÚexisting_attrsÚ
classnamesrM   Ú
temp_attrsÚkeys           r    Úrecord_testreportz_NodeReporter.record_testreporty   sB  € Ý# JÔ$5Ñ6Ô6ˆØœˆØ˜3˜B˜3”Zˆ
ØŒ8Œ?ð 	2Ø×Ò˜a ¤¤Ñ1Ô1Ð1àŸš *Ñ-Ô-Ý" 5¨¤9Ñ-Ô-ØÔ'¨Ô*ð!
ð !
ˆð
 Ô˜qÔ!Ð-Ý 
Ô 3°AÔ 6Ñ7Ô7ˆE�&‰MÝ�:˜uÑ%Ô%ð 	*Ø%œ>ˆE�%‰LØˆŒ
ØŒ
×Ò˜.Ñ)Ô)Ð)ð Œ;˜(Ò"Ð"ØˆFð ˆ
Ø”:ð 	2ð 	2ˆCØ•h˜tœ{Ô+¨JÔ7Ð7Ð7Ø"&¤*¨S¤/�
˜3‘øØˆŒ
ˆ
ˆ
r"   c                 óØ   — t          j        d| j        d| j        z  ¬¦  «        }|                      ¦   «         }|�|                     |¦  «         |                     | j        ¦  «         |S )Nr8   ú%.3f)Útime)r^   r_   rM   rK   ra   rS   Úextendr   )rN   r8   rL   s      r    Úto_xmlz_NodeReporter.to_xml—   sc   € Ý”:˜j¨$¬*¸6ÀDÄMÑ;QÐRÑRÔRˆØ×.Ò.Ñ0Ô0ˆ
ØÐ!Ø�OŠO˜JÑ'Ô'Ð'Ø�Š˜œ
Ñ#Ô#Ð#Øˆr"   rR   ÚmessageÚdatac                 ó„   — t          j        ||¬¦  «        }t          |¦  «        |_        |                      |¦  «         d S )N)ry   ©r^   r_   r'   ÚtextrS   )rN   rR   ry   rz   rP   s        r    Ú_add_simplez_NodeReporter._add_simpleŸ   s=   € ÝŒz˜# wÐ/Ñ/Ô/ˆÝ" 4Ñ(Ô(ˆŒ	Ø�Š�DÑÔÐÐÐr"   Úreportc                 ó   — | j         j        s	|j        rd S |j        }|j        }|j        }| j         j        dk    rd S d}| j         j        dv r|                      |d¦  «        }| j         j        dv r2||                      |d¦  «        z  }|                      ||d¦  «         d}| j         j        dv r2||                      |d	¦  «        z  }|                      ||d
¦  «         d}|r|                      ||d¦  «         d S d S )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errr„   z Captured Out r…   )ú
system-errr†   r„   z Captured Err r‡   )	rE   Úlog_passing_testsÚpassedÚ	capstdoutÚcaplogÚ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rN   r   Úcontent_outÚcontent_logÚcontent_errÚcontent_alls         r    Úwrite_captured_outputz#_NodeReporter.write_captured_output¤   s9  € ØŒxÔ)ð 	¨f¬mð 	ØˆFàÔ&ˆØ”mˆØÔ&ˆØŒ8Ô˜tÒ#Ð#ØˆFØˆØŒ8Ô˜~Ð-Ð-Ø×/Ò/°Ð=MÑNÔNˆKØŒ8ÔÐ?Ð?Ð?Ø˜4×0Ò0°Ð>NÑOÔOÑOˆKØ×Ò ¨°\ÑBÔBÐBØˆKØŒ8ÔÐ?Ð?Ð?Ø˜4×0Ò0°Ð>NÑOÔOÑOˆKØ×Ò ¨°\ÑBÔBÐBØˆKØð 	CØ×Ò ¨°\ÑBÔBÐBÐBÐBð	Cð 	Cr"   ÚcontentÚheaderc                 óZ   — d                      |                     dd¦  «        |dg¦  «        S )Nú
éP   ú-r‚   )rj   Úcenter)rN   r•   r–   s      r    rŽ   z_NodeReporter._prepare_content»   s)   € Ø�yŠy˜&Ÿ-š-¨¨CÑ0Ô0°'¸2Ð>Ñ?Ô?Ð?r"   Újheaderc                 ó€   — t          j        |¦  «        }t          |¦  «        |_        |                      |¦  «         d S r)   r|   )rN   r   r•   rœ   rR   s        r    r�   z_NodeReporter._write_content¾   s8   € ÝŒj˜Ñ!Ô!ˆÝ! 'Ñ*Ô*ˆŒØ�Š�CÑÔÐÐÐr"   c                 ó0   — |                       d¦  «         d S )Nr‰   )rI   ©rN   r   s     r    Úappend_passz_NodeReporter.append_passÃ   s   € Ø�Š�xÑ Ô Ð Ð Ð r"   c                 ó@  — t          |d¦  «        r|                      dd¦  «         d S |j        €J ‚t          |j        dd ¦  «        }|�|j        }nt          |j        ¦  «        }t          |¦  «        }|                      d|t          |j        ¦  «        ¦  «         d S )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)rl   r~   ÚlongreprÚgetattrry   r#   r'   )rN   r   r¤   ry   s       r    Úappend_failurez_NodeReporter.append_failureÆ   s®   € å�6˜:Ñ&Ô&ð 	GØ×Ò˜YÐ(OÑPÔPÐPÐPÐPà”?Ð.Ð.Ð.Ý4;Ø” ¨dñ5ô 5ˆIð Ð$Ø#Ô+��å˜fœoÑ.Ô.�Ý$ WÑ-Ô-ˆGØ×Ò˜Y¨µ°V´_Ñ1EÔ1EÑFÔFÐFÐFÐFr"   c                 ój   — |j         €J ‚|                      ddt          |j         ¦  «        ¦  «         d S )NÚerrorzcollection failure)r¦   r~   r#   rŸ   s     r    Úappend_collect_errorz"_NodeReporter.append_collect_errorÖ   s9   € àŒÐ*Ð*Ð*Ø×Ò˜Ð"6½¸F¼OÑ8LÔ8LÑMÔMÐMÐMÐMr"   c                 óX   — |                       ddt          |j        ¦  «        ¦  «         d S )Nr£   zcollection skipped)r~   r#   r¦   rŸ   s     r    Úappend_collect_skippedz$_NodeReporter.append_collect_skippedÛ   s+   € Ø×Ò˜Ð$8½#¸f¼oÑ:NÔ:NÑOÔOÐOÐOÐOr"   c                 ó  — |j         €J ‚t          |j         dd ¦  «        }|�|j        }nt          |j         ¦  «        }|j        dk    rd|› d�}nd|› d�}|                      dt          |¦  «        t          |j         ¦  «        ¦  «         d S )Nr¤   Úteardownzfailed on teardown with "ú"zfailed on setup with "rª   )r¦   r§   ry   r#   Úwhenr~   r'   )rN   r   r¤   ÚreasonÚmsgs        r    Úappend_errorz_NodeReporter.append_errorÞ   s¨   € ØŒÐ*Ð*Ð*Ý07ØŒO˜[¨$ñ1
ô 1
ˆ	ð Ð ØÔ&ˆFˆFå˜œÑ)Ô)ˆFàŒ;˜*Ò$Ð$Ø7¨fÐ7Ð7Ð7ˆCˆCà4¨6Ð4Ð4Ð4ˆCØ×Ò˜¥.°Ñ"5Ô"5µs¸6¼?Ñ7KÔ7KÑLÔLÐLÐLÐLr"   c                 óP  — t          |d¦  «        rc|j        }|                     d¦  «        r
|dd …         }t          |¦  «        }t	          j        dd|¬¦  «        }|                      |¦  «         d S t          |j        t          ¦  «        sJ ‚|j        \  }}}|                     d¦  «        r
|dd …         }|› d	|› d
|› �}t	          j        ddt          |¦  «        ¬¦  «        }t          |¦  «        |_
        |                      |¦  «         |                      |¦  «         d S )Nr¢   zreason: é   r£   zpytest.xfail)r.   ry   z	Skipped: é	   ú:z: zpytest.skip)rl   r¢   Ú
startswithr'   r^   r_   rS   r+   r¦   Útupler}   r”   )rN   r   Úxfailreasonr£   ÚfilenameÚlinenoÚ
skipreasonÚdetailss           r    Úappend_skippedz_NodeReporter.append_skippedî   s?  € Ý�6˜:Ñ&Ô&ð 	/Ø œ/ˆKØ×%Ò% jÑ1Ô1ð .Ø)¨!¨"¨"œo�Ý(¨Ñ5Ô5ˆKÝ”j °ÈÐUÑUÔUˆGØ�KŠK˜Ñ Ô Ð Ð Ð å˜fœo­uÑ5Ô5Ð5Ð5Ð5Ø+1¬?Ñ(ˆH�f˜jØ×$Ò$ [Ñ1Ô1ð ,Ø'¨¨¨œ^�
Ø!Ð:Ð: FÐ:Ð:¨jÐ:Ð:ˆGå”jØ µ~ÀjÑ7QÔ7Qðñ ô ˆGõ *¨'Ñ2Ô2ˆGŒLØ�KŠK˜Ñ Ô Ð Ø×&Ò& vÑ.Ô.Ð.Ð.Ð.r"   c                 óv   ‡— |                       ¦   «         Š| j                             ¦   «          ˆfd„| _         d S )Nc                  ó   •— ‰ S r)   © )rz   s   €r    ú<lambda>z(_NodeReporter.finalize.<locals>.<lambda>	  s   ø€ ˜d€ r"   )rx   Ú__dict__Úclear)rN   rz   s    @r    Úfinalizez_NodeReporter.finalize  s7   ø€ Ø�{Š{‰}Œ}ˆØŒ×ÒÑÔÐð #�l�l�lˆŒˆˆr"   r)   ©r   N)Ú__name__Ú
__module__Ú__qualname__r
   r#   r   rO   r^   r_   rS   ÚobjectrW   rY   r   ra   rs   rx   r~   r”   rŽ   r�   r    r¨   r«   r­   r´   rÀ   rÇ   rÃ   r"   r    rC   rC   [   sß  € € € € € ð(˜u S¨* _Ô5ð (¸Hð (Èð (ð (ð (ð (ð ˜2œ:ð  ¨$ð  ð  ð  ð  ðC ð C¨Vð C¸ð Cð Cð Cð Cð6 #ð 6¨fð 6¸ð 6ð 6ð 6ð 6ð h¨r¬zÔ&:ð ð ð ð ð ¨Jð  ¸4ð  ð  ð  ð  ð<˜œ
ð ð ð ð ðð ˜sð ¨Sð ¸À¼ð ÐQUð ð ð ð ð
C¨Jð C¸4ð Cð Cð Cð Cð.@¨ð @°Sð @¸Sð @ð @ð @ð @ð Zð ¸#ð Èð ÐPTð ð ð ð ð
! *ð !°ð !ð !ð !ð !ðG Zð G°Dð Gð Gð Gð Gð N¨:ð N¸$ð Nð Nð Nð Nð
P¨Zð P¸Dð Pð Pð Pð PðM :ð M°$ð Mð Mð Mð Mð / Zð /°Dð /ð /ð /ð /ð,#ð #ð #ð #ð #ð #r"   rC   ÚrequestÚfixture_namec                 óÖ   — ddl m} | j        j                             t
          d¦  «        }|�9|j        dvr2| j                              ||› d|j        › d�¦  «        ¦  «         dS dS dS )z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )ÚPytestWarningN)r@   Úlegacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	Ú_pytest.warning_typesrÐ   ÚconfigÚstashÚgetÚxml_keyrJ   rP   Úwarn)rÍ   rÎ   rÐ   rE   s       r    Ú!_warn_incompatibility_with_xunit2rØ     s˜   € ð 4Ð3Ð3Ð3Ð3Ð3à
Œ.Ô
×
"Ò
"¥7¨DÑ
1Ô
1€CØ
€˜3œ:Ð-AÐAÐAØŒ×ÒØˆMØÐmÐmÀSÄZÐmÐmÐmñô ñ	
ô 	
ð 	
ð 	
ð 	
ð €ÐAÐAr"   c                 óT   ‡ — t          ‰ d¦  «         dt          dt          ddfˆ fd„}|S )an  Add extra properties to the calling test.

    User properties become part of the test report and are available to the
    configured reporters, like JUnit XML.

    The fixture is callable with ``name, value``. The value is automatically
    XML-encoded.

    Example::

        def test_function(record_property):
            record_property("example_key", 1)
    Úrecord_propertyr:   rT   r   Nc                 óJ   •— ‰j         j                             | |f¦  «         d S r)   )rP   Úuser_propertiesrS   )r:   rT   rÍ   s     €r    Úappend_propertyz(record_property.<locals>.append_property,  s&   ø€ ØŒÔ$×+Ò+¨T°5¨MÑ:Ô:Ð:Ð:Ð:r"   )rØ   r#   rÌ   )rÍ   rÝ   s   ` r    rÚ   rÚ     sQ   ø€ õ & gÐ/@ÑAÔAÐAð;�cð ;­&ð ;°Tð ;ð ;ð ;ð ;ð ;ð ;ð Ðr"   c                 ó>  — ddl m} | j                              |d¦  «        ¦  «         t	          | d¦  «         dt
          dt          ddfd	„}|}| j        j         	                    t          d¦  «        }|�&|                     | j        j        ¦  «        }|j        }|S )
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_attributer:   rT   r   Nc                 ó   — d S r)   rÃ   r]   s     r    Úadd_attr_noopz+record_xml_attribute.<locals>.add_attr_noopB  s   € Øˆr"   )rÒ   rß   rP   r×   rØ   r#   rÌ   rÓ   rÔ   rÕ   rÖ   Únode_reporterrD   rY   )rÍ   rß   râ   Ú	attr_funcrE   rã   s         r    rà   rà   2  sÈ   € ð CÐBÐBÐBÐBÐBà„L×ÒØ$Ð$Ð%VÑWÔWñô ð õ & gÐ/EÑFÔFÐFð�Cð ­ð °4ð ð ð ð ð €Ià
Œ.Ô
×
"Ò
"¥7¨DÑ
1Ô
1€CØ
€Ø×)Ò)¨'¬,Ô*=Ñ>Ô>ˆØ!Ô/ˆ	àÐr"   ÚparamÚvc                 ó¤   — d}t          |t          ¦  «        s8d}t          |                     | t	          |¦  «        j        ¬¦  «        ¦  «        ‚dS )zcUsed by record_testsuite_property to check that the given parameter name is of the proper
    type.Tz5{param} parameter needs to be a string, but {g} given)rå   ÚgN)r+   r#   r-   Úformatr.   rÉ   )rå   ræ   Ú__tracebackhide__r³   s       r    Ú_check_record_param_typerë   O  sU   € ð ÐÝ�a�ÑÔð EØEˆÝ˜Ÿ
š
¨µ$°q±'´'Ô2B˜
ÑCÔCÑDÔDÐDðEð Er"   Úsession)Úscopec                 óŽ   — d}dt           dt          ddfd„}| j        j                             t
          d¦  «        }|�|j        }|S )a+  Record a new ``<property>`` tag as child of the root ``<testsuite>``.

    This is suitable to writing global information regarding the entire test
    suite, and is compatible with ``xunit2`` JUnit family.

    This is a ``session``-scoped fixture which is called with ``(name, value)``. Example:

    .. code-block:: python

        def test_foo(record_testsuite_property):
            record_testsuite_property("ARCH", "PPC")
            record_testsuite_property("STORAGE_TYPE", "CEPH")

    :param name:
        The property name.
    :param value:
        The property value. Will be converted to a string.

    .. warning::

        Currently this fixture **does not work** with the
        `pytest-xdist <https://github.com/pytest-dev/pytest-xdist>`__ plugin. See
        :issue:`7767` for details.
    Tr:   rT   r   Nc                 ó*   — d}t          d| ¦  «         dS )zFNo-op function in case --junit-xml was not passed in the command-line.Tr:   N)rë   )r:   rT   rê   s      r    Úrecord_funcz.record_testsuite_property.<locals>.record_funct  s   € à ÐÝ  ¨Ñ.Ô.Ð.Ð.Ð.r"   )r#   rÌ   rÓ   rÔ   rÕ   rÖ   Úadd_global_property)rÍ   rê   rð   rE   s       r    Úrecord_testsuite_propertyrò   X  sb   € ð4 Ðð/�#ð /¥fð /°ð /ð /ð /ð /ð
 Œ.Ô
×
"Ò
"¥7¨DÑ
1Ô
1€CØ
€ØÔ-ˆØÐr"   Úparserc                 óÄ  — |                       d¦  «        }|                     dddddt          j        t          d¬¦  «        d d¬	¦  «         |                     d
dddd d¬¦  «         |                      ddd¬¦  «         |                      ddd¬¦  «         |                      dddd¬¦  «         |                      ddd¬¦  «         |                      ddd ¬¦  «         d S )!Nzterminal reportingz
--junitxmlz--junit-xmlÚstoreÚxmlpathÚpath)Úoptnamez0Create junit-xml style report file at given path)ÚactionÚdestÚmetavarr.   ÚdefaultÚhelpz--junitprefixz--junit-prefixr#   z0Prepend prefix to classnames in junit-xml output)rù   rû   rü   rý   Újunit_suite_namez Test suite name for JUnit reportÚpytest)rü   Újunit_loggingz\Write captured log messages to JUnit report: one of no|log|system-out|system-err|out-err|allr�   Újunit_log_passing_testsz;Capture log information for passing tests to JUnit report: ÚboolT)r.   rü   Újunit_duration_reportz*Duration time to report: one of total|callÚtotalÚjunit_familyz0Emit XML for schema: one of legacy|xunit1|xunit2rA   )ÚgetgroupÚ	addoptionÚ	functoolsÚpartialr   Úaddini)ró   r   s     r    Úpytest_addoptionr    sR  € Ø�OŠOÐ0Ñ1Ô1€EØ	‡O‚OØØØØØÝÔ�|°\ÐBÑBÔBØØ?ð ñ 	ô 	ð 	ð 
‡O‚OØØØØØØ?ð ñ ô ð ð ‡M‚MØÐ>Èð ñ ô ð ð ‡M‚MØð	:àð	 ñ ô ð ð ‡M‚MØ!ØEØØð	 ñ ô ð ð ‡M‚MØØ4Øð ñ ô ð ð
 ‡M‚MØØ:Øð ñ ô ð ð ð r"   rÓ   c                 ó¸  — | j         j        }|rÉt          | d¦  «        s»|                      d¦  «        }t	          || j         j        |                      d¦  «        |                      d¦  «        |                      d¦  «        ||                      d¦  «        ¦  «        | j        t          <   | j         	                    | j        t                   ¦  «         d S d S d S )NÚworkerinputr  rþ   r   r  r  )
Úoptionrö   rl   Úgetinir   ÚjunitprefixrÔ   rÖ   ÚpluginmanagerÚregister)rÓ   rö   r  s      r    Úpytest_configurer  ®  sÓ   € ØŒmÔ#€Gàð =•w˜v }Ñ5Ô5ð =Ø—}’} ^Ñ4Ô4ˆÝ &ØØŒMÔ%Ø�MŠMÐ,Ñ-Ô-Ø�MŠM˜/Ñ*Ô*Ø�MŠMÐ1Ñ2Ô2ØØ�MŠMÐ3Ñ4Ô4ñ!
ô !
ˆŒ•WÑð 	Ô×%Ò% f¤lµ7Ô&;Ñ<Ô<Ð<Ð<Ð<ð=ð =ð =ð =r"   c                 óœ   — | j                              t          d ¦  «        }|r)| j         t          = | j                             |¦  «         d S d S r)   )rÔ   rÕ   rÖ   r  Ú
unregister)rÓ   rE   s     r    Úpytest_unconfigurer  ¿  sR   € Ø
Œ,×
Ò
�7 DÑ
)Ô
)€CØ
ð -ØŒL�Ð!ØÔ×'Ò'¨Ñ,Ô,Ð,Ð,Ð,ð-ð -r"   Úaddressc                 ó  — |                       d¦  «        \  }}}|                     d¦  «        }|d                              t          j        d¦  «        |d<   t          j        dd|d         ¦  «        |d<   |dxx         ||z   z  cc<   |S )Nú[z::r   re   z\.py$r‚   rd   )Ú	partitionÚsplitÚreplacer   ÚSEPr$   r%   )r  r÷   Úpossible_open_bracketÚparamsrn   s        r    rg   rg   Æ  s‰   € Ø*1×*;Ò*;¸CÑ*@Ô*@Ñ'€DÐ
 Ø�JŠJ�tÑÔ€Eà�QŒx×Ò¥¤	¨3Ñ/Ô/€Eˆ!�HÝŒv�h  E¨!¤HÑ-Ô-€Eˆ!�Hà	ˆ"€I€I„IÐ&¨Ñ/Ñ/€I€I�IØ€Lr"   c                   ó,  — e Zd Z	 	 	 	 	 d!dee         deded	ed
eddfd„Zdeddfd„Zde	eef         de
fd„Zdeddfd„Zdede
fd„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zd"d„Zd"d„Zdeddfd„Zdededdfd„Zdeej                 fd „ZdS )#r   rÿ   r�   r  r@   Trh   Ú
suite_namer�   Úreport_durationrˆ   r   Nc                 ó  — t           j                             t           j                             |¦  «        ¦  «        }t           j                             t           j                             |¦  «        ¦  «        | _        || _        || _        || _	        || _
        || _        || _        t                               g d¢d¦  «        | _        i | _        g | _        g | _        g | _        d| _        | j        dk    r	d| _        d S d S )N)rª   r‰   r¥   r£   r   rÑ   r@   )Úosr÷   Ú
expanduserÚ
expandvarsÚnormpathÚabspathÚlogfilerh   r!  r�   rˆ   r"  rJ   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rN   r)  rh   r!  r�   r"  rJ   rˆ   s           r    rO   zLogXML.__init__Ò  sí   € õ ”'×$Ò$¥R¤W×%7Ò%7¸Ñ%@Ô%@ÑAÔAˆÝ”w×'Ò'­¬¯ª¸Ñ(@Ô(@ÑAÔAˆŒØˆŒØ$ˆŒØˆŒØ!2ˆÔØ.ˆÔØˆŒÝ%)§]¢]Ø5Ð5Ð5°qñ&
ô &
ˆŒ
ð
 ð 	Ôð <>ˆÔ#Ø8:ˆÔð /1ˆÔØ%&ˆÔ"ð Œ;˜(Ò"Ð"Ø"ˆDŒKˆKˆKð #Ð"r"   r   c                 ó  — t          |d|¦  «        }t          |dd ¦  «        }| j                             ||f¦  «        }|j        D ](\  }}|                     |t          |¦  «        ¦  «         Œ)|�|                     ¦   «          d S d S ©NrD   rP   )r§   r-  ÚpoprÜ   rW   r#   rÇ   )rN   r   rD   Ú
workernodeÚreporterÚpropnameÚ	propvalues          r    rÇ   zLogXML.finalizeõ  s›   € Ý˜ ¨6Ñ2Ô2ˆå˜V V¨TÑ2Ô2ˆ
ØÔ&×*Ò*¨F°JÐ+?Ñ@Ô@ˆà#)Ô#9ð 	<ð 	<ÑˆH�iØ×!Ò! (­C°	©N¬NÑ;Ô;Ð;Ð;àÐØ×ÒÑÔÐÐÐð  Ðr"   c                 óæ   — t          |d|¦  «        }t          |dd ¦  «        }||f}|| j        v r| j        |         S t          || ¦  «        }|| j        |<   | j                             |¦  «         |S r3  )r§   r-  rC   r.  rS   )rN   r   rD   r5  rr   r6  s         r    rã   zLogXML.node_reporter  s‚   € Ý)0°¸À6Ñ)JÔ)Jˆå˜V V¨TÑ2Ô2ˆ
à�jÐ ˆà�$Ô%Ð%Ð%àÔ& sÔ+Ð+å  ¨Ñ.Ô.ˆà#+ˆÔ˜CÑ ØÔ#×*Ò*¨8Ñ4Ô4Ð4àˆr"   rr   c                 óF   — || j         v r| j         |xx         dz  cc<   d S d S )Nrf   )r,  )rN   rr   s     r    rI   zLogXML.add_stats  s3   € Ø�$”*ÐÐØŒJ�sˆOˆOŒO˜qÑ ˆOˆO‰OˆOˆOð Ðr"   c                 óZ   — |                       |¦  «        }|                     |¦  «         |S r)   )rã   rs   ©rN   r   r6  s      r    Ú_opentestcasezLogXML._opentestcase  s.   € Ø×%Ò% fÑ-Ô-ˆØ×"Ò" 6Ñ*Ô*Ð*Øˆr"   c                 óv  ‡‡‡— d}‰j         r7‰j        dk    r*|                      ‰¦  «        }|                     ‰¦  «         �n1‰j        rù‰j        dk    rlt          ‰dd¦  «        Št          ‰dd¦  «        Št          ˆˆˆfd„| j        D ¦   «         d¦  «        }|r%|                      |¦  «         | xj	        dz  c_	        |                      ‰¦  «        }‰j        dk    rL| 
                    ‰¦  «         | j                             ‰¦  «         | j        s|                     ‰¦  «         nG|                     ‰¦  «         n1‰j        r*|                      ‰¦  «        }|                     ‰¦  «         |                      ‰¦  «         ‰j        dk    r¢|                      ‰¦  «        }|                     ‰¦  «         |                      ‰¦  «         t          ‰dd¦  «        Št          ‰dd¦  «        Št          ˆˆˆfd„| j        D ¦   «         d¦  «        }|r| j                             |¦  «         dS dS dS )	a  Handle a setup/call/teardown report, generating the appropriate
        XML tags as necessary.

        Note: due to plugins like xdist, this hook may be called in interlaced
        order with reports from other nodes. For example:

        Usual call order:
            -> setup node1
            -> call node1
            -> teardown node1
            -> setup node2
            -> call node2
            -> teardown node2

        Possible call order in xdist:
            -> setup node1
            -> call node1
            -> setup node2
            -> call node2
            -> teardown node2
            -> teardown node1
        NÚcallr¯   Ú	worker_idÚ
item_indexc              3   ó�   •K  — | ]@}|j         ‰j         k    r.t          |d d¦  «        ‰k    rt          |dd¦  «        ‰k    ¯<|V — ŒAdS ©rA  Nr@  ©rD   r§   ©Ú.0Úrepr   Ú	report_iiÚ
report_wids     €€€r    ú	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>>  so   øè è € ð ð ààœJ¨&¬-Ò7Ð7Ý '¨¨\¸4Ñ @Ô @ÀIÒ MÐ MÝ '¨¨[¸$Ñ ?Ô ?À:Ò MÐ Mð ð
 !NÐ MÐ MÐ Mðð r"   rf   c              3   ó�   •K  — | ]@}|j         ‰j         k    r.t          |d d¦  «        ‰k    rt          |dd¦  «        ‰k    ¯<|V — ŒAdS rC  rD  rE  s     €€€r    rJ  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>c  so   øè è € ð ð ààœ
 f¤mÒ3Ð3Ý# C¨°tÑ<Ô<À	ÒIÐIÝ# C¨°dÑ;Ô;¸zÒIÐIð ð
 JÐIÐIÐIðð r"   )r‰   r±   r=  r    Úfailedr§   Únextr0  rÇ   r1  r¨   rS   rˆ   r”   r´   r£   rÀ   Úupdate_testcase_durationÚremove)rN   r   Úclose_reportr6  rH  rI  s    `  @@r    Úpytest_runtest_logreportzLogXML.pytest_runtest_logreport  s¬  øøø€ ð. ˆØŒ=ð %	,ØŒ{˜fÒ$Ð$Ø×-Ò-¨fÑ5Ô5�Ø×$Ò$ VÑ,Ô,Ð,ùØŒ]ð !	,ØŒ{˜jÒ(Ð(å$ V¨[¸$Ñ?Ô?�
Ý# F¨L¸$Ñ?Ô?�	Ý#ðð ð ð ð ð à#'Ô#4ðñ ô ð ñ ô  �ð  ð 4ð —M’M ,Ñ/Ô/Ð/ØÐ.Ô.°!Ñ3Ð.Ô.Ø×)Ò)¨&Ñ1Ô1ˆHØŒ{˜fÒ$Ð$Ø×'Ò'¨Ñ/Ô/Ð/ØÔ!×(Ò(¨Ñ0Ô0Ð0ØÔ-ð ;Ø×2Ò2°6Ñ:Ô:Ð:øà×%Ò% fÑ-Ô-Ð-Ð-ØŒ^ð 	,Ø×)Ò)¨&Ñ1Ô1ˆHØ×#Ò# FÑ+Ô+Ð+Ø×%Ò% fÑ-Ô-Ð-ØŒ;˜*Ò$Ð$Ø×)Ò)¨&Ñ1Ô1ˆHØ×*Ò*¨6Ñ2Ô2Ð2à�MŠM˜&Ñ!Ô!Ð!Ý  ¨°dÑ;Ô;ˆJÝ ¨°dÑ;Ô;ˆIÝðð ð ð ð ð à#Ô0ðñ ô ð ñô ˆLð ð 7ØÔ!×(Ò(¨Ñ6Ô6Ð6Ð6Ð6ð) %Ð$ð&7ð 7r"   c                 ó’   — | j         d|j        hv r6|                      |¦  «        }|xj        t	          |dd¦  «        z  c_        dS dS )zƒAccumulate total duration for nodeid from given report and update
        the Junit.testcase with the new total if already created.r  rK   rG   N)r"  r±   rã   rK   r§   r<  s      r    rN  zLogXML.update_testcase_durationq  sZ   € ð Ô G¨V¬[Ð#9Ð9Ð9Ø×)Ò)¨&Ñ1Ô1ˆHØÐÔ¥¨°¸SÑ!AÔ!AÑAÐÔÐÐð :Ð9r"   c                 ó¨   — |j         sJ|                      |¦  «        }|j        r|                     |¦  «         d S |                     |¦  «         d S d S r)   )r‰   r=  rL  r«   r­   r<  s      r    Úpytest_collectreportzLogXML.pytest_collectreportx  sg   € ØŒ}ð 	8Ø×)Ò)¨&Ñ1Ô1ˆHØŒ}ð 8Ø×-Ò-¨fÑ5Ô5Ð5Ð5Ð5à×/Ò/°Ñ7Ô7Ð7Ð7Ð7ð	8ð 	8r"   Úexcreprc                 ó°   — |                       d¦  «        }|j                             dd¬¦  «         |                     ddt	          |¦  «        ¦  «         d S )NÚinternalrÿ   )r9   r:   rª   zinternal error)rã   rM   r/   r~   r#   )rN   rU  r6  s      r    Úpytest_internalerrorzLogXML.pytest_internalerror€  sU   € Ø×%Ò% jÑ1Ô1ˆØŒ×Ò¨°zÐÑBÔBÐBØ×Ò˜WÐ&6½¸G¹¼ÑEÔEÐEÐEÐEr"   c                 ó6   — t          j        ¦   «         | _        d S r)   )r   rv   Úsuite_start_time)rN   s    r    Úpytest_sessionstartzLogXML.pytest_sessionstart…  s   € Ý &¤¡¤ˆÔÐÐr"   c                 óº  — t           j                             t           j                             | j        ¦  «        ¦  «        }t          j        |d¬¦  «         t          | j        dd¬¦  «        5 }t          j        ¦   «         }|| j	        z
  }| j
        d         | j
        d         z   | j
        d         z   | j
        d	         z   | j        z
  }|                     d
¦  «         t          j        d| j        t!          | j
        d	         ¦  «        t!          | j
        d         ¦  «        t!          | j
        d         ¦  «        t!          |¦  «        d|z  t#          j        | j	        ¦  «                             ¦   «         t)          j        ¦   «         ¬¦	  «	        }|                      ¦   «         }|�|                     |¦  «         | j        D ])}|                     |                     ¦   «         ¦  «         Œ*t          j        d¦  «        }	|	                     |¦  «         |                     t          j        |	d¬¦  «        ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NT)Úexist_okÚwzutf-8)Úencodingr‰   r¥   r£   rª   z&<?xml version="1.0" encoding="utf-8"?>Ú	testsuiteru   )r:   ÚerrorsÚfailuresr£   Útestsrv   Ú	timestampÚhostnameÚ
testsuitesÚunicode)r$  r÷   Údirnamer(  r)  ÚmakedirsÚopenr   rv   rZ  r,  r1  Úwriter^   r_   r!  r#   r   ÚfromtimestampÚ	isoformatÚplatformrP   Ú_get_global_properties_noderS   r.  rx   Útostring)
rN   rh  r)  Úsuite_stop_timeÚsuite_time_deltaÚnumtestsÚ
suite_noder/  rã   rf  s
             r    Úpytest_sessionfinishzLogXML.pytest_sessionfinishˆ  st  € Ý”'—/’/¥"¤'§/¢/°$´,Ñ"?Ô"?Ñ@Ô@ˆå
Œ�G dÐ+Ñ+Ô+Ð+å�$”, ¨gÐ6Ñ6Ô6ð 	G¸'Ý$œk™mœmˆOØ.°Ô1FÑFÐð ”
˜8Ô$Ø”*˜YÔ'ñ(à”*˜YÔ'ñ(ð ”*˜WÔ%ñ&ð Ô,ñ	-ð ð �MŠMÐBÑCÔCÐCåœØØ”_Ý˜4œ: gÔ.Ñ/Ô/Ý˜TœZ¨	Ô2Ñ3Ô3Ý˜DœJ yÔ1Ñ2Ô2Ý˜(‘m”mØÐ.Ñ.Ý"Ô0°Ô1FÑGÔG×QÒQÑSÔSÝ!œ™œð
ñ 
ô 
ˆJð !%× @Ò @Ñ BÔ BÐØ Ð,Ø×!Ò!Ð"3Ñ4Ô4Ð4Ø!%Ô!<ð :ð :�Ø×!Ò! -×"6Ò"6Ñ"8Ô"8Ñ9Ô9Ð9Ð9Ýœ LÑ1Ô1ˆJØ×Ò˜jÑ)Ô)Ð)Ø�MŠM�"œ+ j¸9ÐEÑEÔEÑFÔFÐFð?	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gs   Á/GIÉIÉIÚterminalreporterc                 óB   — |                      dd| j        › �¦  «         d S )Nrš   zgenerated xml file: )Ú	write_sepr)  )rN   rv  s     r    Úpytest_terminal_summaryzLogXML.pytest_terminal_summary®  s)   € Ø×"Ò" 3Ð(M¸t¼|Ð(MÐ(MÑNÔNÐNÐNÐNr"   r:   rT   c                 ó|   — d}t          d|¦  «         | j                             |t          |¦  «        f¦  «         d S )NTr:   )rë   r/  rS   r'   )rN   r:   rT   rê   s       r    rñ   zLogXML.add_global_property±  sB   € Ø ÐÝ  ¨Ñ.Ô.Ð.ØÔ×%Ò% t­^¸EÑ-BÔ-BÐ&CÑDÔDÐDÐDÐDr"   c                 ó®   — | j         rMt          j        d¦  «        }| j         D ]/\  }}|                     t          j        d||¬¦  «        ¦  «         Œ0|S dS r[   )r/  r^   r_   rS   r`   s       r    ro  z"LogXML._get_global_properties_node¶  sg   € àÔ!ð 	Ýœ LÑ1Ô1ˆJØ#Ô5ð Rð R‘��eØ×!Ò!¥"¤*¨Z¸dÈ%Ð"PÑ"PÔ"PÑQÔQÐQÐQØÐØˆtr"   )rÿ   r�   r  r@   TrÈ   )rÉ   rÊ   rË   r   r#   r  rO   r   rÇ   r
   rC   rã   rI   r=  rQ  rN  rT  r   rX  r[  ru  r   ry  rÌ   rñ   r^   r_   ro  rÃ   r"   r    r   r   Ñ  sS  € € € € € ð
 #ØØ&ØØ"&ð!#ð !#ð ˜”ð!#ð ð	!#ð
 ð!#ð ð!#ð  ð!#ð 
ð!#ð !#ð !#ð !#ðF
 ˜zð 
 ¨dð 
 ð 
 ð 
 ð 
 ð E¨*°c¨/Ô$:ð ¸}ð ð ð ð ð$!˜Sð ! Tð !ð !ð !ð !ð Jð °=ð ð ð ð ð
S7¨zð S7¸dð S7ð S7ð S7ð S7ðjB¨zð B¸dð Bð Bð Bð Bð8¨:ð 8¸$ð 8ð 8ð 8ð 8ðF¨Mð F¸dð Fð Fð Fð Fð
.ð .ð .ð .ð$Gð $Gð $Gð $GðLOÐ8Hð OÈTð Oð Oð Oð OðE¨ð E°Fð E¸tð Eð Eð Eð Eð
¨X°b´jÔ-Að ð ð ð ð ð r"   rÈ   )9Ú__doc__r   r  r$  rn  r$   Útypingr   r   r   r   r   r	   r
   Úxml.etree.ElementTreeÚetreeÚElementTreer^   Ú_pytestr   r   Ú_pytest._code.coder   r   Ú_pytest.configr   r   Ú_pytest.config.argparsingr   Ú_pytest.fixturesr   Ú_pytest.reportsr   Ú_pytest.stashr   Ú_pytest.terminalr   rÿ   rÖ   rÌ   r#   r'   r7   rm   ÚcopyrC   rØ   ÚfixturerÚ   rà   rë   rò   r  r  r  rg   r   rÃ   r"   r    ú<module>r‹     s—  ððð ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø /Ð /Ð /Ð /Ð /Ð /Ø !Ð !Ð !Ð !Ð !Ð !Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø +Ð +Ð +Ð +Ð +Ð +Ø &Ð &Ð &Ð &Ð &Ð &Ø "Ð "Ð "Ð "Ð "Ð "Ø -Ð -Ð -Ð -Ð -Ð -Ø €€€ð ˆ(�8Ô
Ñ
Ô
€ð2˜ð 2 3ð 2ð 2ð 2ð 2ð6ð ð ð ð €Ø +¨vÐ!6Ð7€ˆÑ Ø&Ð(?Ð(?Ð(?Ð@€ˆÑ ð ˜gÔ&×+Ò+Ñ-Ô-€ˆÑ Ø €ˆX�hÔ ¨.Ô!9Ñ :Ô :Ð :ð ˜gÔ&€ˆÑ ðn#ð n#ð n#ð n#ð n#ñ n#ô n#ð n#ðb
Øð
Ø+.ð
à	ð
ð 
ð 
ð 
ð „ð˜^ð °¸#¸v¸ÈÐ9LÔ0Mð ð ð ñ „ðð, „ð .ð °X¸sÀF¸mÈTÐ>QÔ5Rð ð ð ñ „ðð8E Cð E¨Cð E°Dð Eð Eð Eð Eð €„�iÐ Ñ Ô ð# ~ð #¸(ÀCÈÀ=ÐRVÐCVÔ:Wð #ð #ð #ñ !Ô ð#ðL,˜Vð ,¨ð ,ð ,ð ,ð ,ð^=˜Vð =¨ð =ð =ð =ð =ð"-˜vð -¨$ð -ð -ð -ð -ð ð ¨¨c¬ð ð ð ð ðlð lð lð lð lñ lô lð lð lð lr"   