§
    s
Êjie  ã                  óˆ  — d Z ddlmZ ddlmZ ddlZddlZddlZddlZddl	m
c mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl Z  ed         ¦   «         Z!d;d„Z"d<d„Z#dddgidg d¢idœZ$e$d          %                    ¦   «         e$d<    e#e$d         e$d         ¦  «         e$d         e$d <    G d!„ d"¦  «        Z&d=d&„Z'e j(        d>d(„¦   «         Z)e j(        d>d)„¦   «         Z*d?d,„Z+ e j(        d-¬.¦  «        d>d/„¦   «         Z,d@d2„Z-dAd5„Z.dAd6„Z/dBd9„Z0 G d:„ d¦  «        Z1dS )Ca  Report test results in JUnit-XML format, for use with Jenkins and build
integration servers.

Based on initial code from Ross Lawley.

Output conforms to
https://github.com/jenkinsci/xunit-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
é    )Úannotations)ÚCallableN)Únodes)Útiming)ÚExceptionRepr)ÚReprFileLocation)ÚConfig)Úfilename_arg)ÚParser)ÚFixtureRequest)Ú
TestReport)ÚStashKey)ÚTerminalReporterÚLogXMLÚargÚobjectÚreturnÚstrc                óT   — 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.
    Úmatchobjúre.Match[str]r   r   c                óh   — t          |                      ¦   «         ¦  «        }|dk    rd|d›�S d|d›�S )Néÿ   z#xÚ02XÚ04X)ÚordÚgroup)r   Úis     ú@C:\Projects\Muse2API\.venv\Lib\site-packages\_pytest/junitxml.pyÚreplzbin_xml_escape.<locals>.repl0   s>   € Ý�—’Ñ Ô Ñ!Ô!ˆØ�Š9ˆ9Ø˜�<�<�<Ðà˜�<�<�<Ðó    u   [^	
 -~Â€-íŸ¿î€€-ï¿½ð�€€-ô�¿¿])r   r   r   r   )ÚreÚsubr   )r   r    Úillegal_xml_res      r   Úbin_xml_escaper%   %   s8   € ð ð  ð  ð  ð i€NÝŒ6�. $­¨C©¬Ñ1Ô1Ð1r!   ÚNonec                ó  — 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_familyr6   >   s‘   € Ø€FØ—*’*‘,”,ð !ð !‰ˆˆBØ—k’k‘m”mð 	!ð 	!‰FˆB�Ý˜b¥$Ñ'Ô'ð *Ý¥ R¡¤Ñ)Ô)Ð)Ø˜b™ˆF�2‰JˆJð	!ð 	‡K‚K�ÑÔÐÐÐr!   ÚtestcaseÚ	classnameÚname)ÚfileÚlineÚurl)Ú_baseÚ_base_legacyr=   Úxunit1r>   Úxunit2c                  ó    — e Zd Zd+d„Zd,d
„Zd-d„Zd-d„Zd.d„Zd/d„Zd0d„Z	d1d2d„Z
d3d„Zd4d!„Zd5d#„Zd3d$„Zd3d%„Zd3d&„Zd3d'„Zd3d(„Zd3d)„Zd6d*„ZdS )7Ú_NodeReporterÚnodeidústr | TestReportÚxmlr   r   r&   c                óž   — || _         || _        | j        j        | _        | j        j        | _        d| _        g | _        g | _        i | _        d S )Nç        )ÚidrE   Ú	add_statsÚfamilyÚdurationÚ
propertiesr   Úattrs)ÚselfrC   rE   s      r   Ú__init__z_NodeReporter.__init__U   sG   € ØˆŒØˆŒØœÔ+ˆŒØ”h”oˆŒØˆŒØ13ˆŒØ')ˆŒ
Ø%'ˆŒ
ˆ
ˆ
r!   Únodeú
ET.Elementc                óx   — | j                              |j        ¦  «         | j                             |¦  «         d S r(   )rE   rI   Útagr   Úappend)rN   rP   s     r   rT   z_NodeReporter.append_   s6   € ØŒ×Ò˜4œ8Ñ$Ô$Ð$ØŒ
×Ò˜$ÑÔÐÐÐr!   r9   r   Úvaluer   c                ór   — | j                              t          |¦  «        t          |¦  «        f¦  «         d S r(   )rL   rT   r   r%   ©rN   r9   rU   s      r   Úadd_propertyz_NodeReporter.add_propertyc   s1   € ØŒ×Ò¥ D¡	¤	­>¸%Ñ+@Ô+@ÐAÑBÔBÐBÐBÐBr!   c                óN   — t          |¦  «        | j        t          |¦  «        <   d S r(   )r%   rM   r   rW   s      r   Úadd_attributez_NodeReporter.add_attributef   s"   € Ý .¨uÑ 5Ô 5ˆŒ
•3�t‘9”9ÑÐÐr!   úET.Element | Nonec                ó®   — | j         rMt          j        d¦  «        }| j         D ]/\  }}|                     t          j        d||¬¦  «        ¦  «         Œ0|S dS ©z9Return a Junit node containing custom properties, if any.rL   Úproperty©r9   rU   N)rL   ÚETÚElementrT   ©rN   rL   r9   rU   s       r   Úmake_properties_nodez"_NodeReporter.make_properties_nodei   se   € àŒ?ð 	Ýœ LÑ1Ô1ˆJØ#œð Rð R‘��eØ×!Ò!¥"¤*¨Z¸dÈ%Ð"PÑ"PÔ"PÑQÔQÐQÐQØÐØˆtr!   Ú
testreportr   c                ó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   ú.)r8   r9   r:   é   r;   r<   r?   r7   )Úmangle_test_addressrC   rM   rE   ÚprefixÚinsertÚjoinr%   Úlocationr   Úhasattrr<   r.   rJ   Úfamilies)rN   rd   ÚnamesÚexisting_attrsÚ
classnamesrM   Ú
temp_attrsÚkeys           r   Úrecord_testreportz_NodeReporter.record_testreportr   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        | j        d›¬¦  «        }|                      ¦   «         }|�|                     |¦  «         |                     | j        ¦  «         |S )Nr7   ú.3f)Útime)r`   ra   rM   rK   rc   rT   Úextendr   )rN   r7   rL   s      r   Úto_xmlz_NodeReporter.to_xml�   sd   € Ý”:˜j¨$¬*¸d¼mÐ;QÐ;QÐRÑRÔRˆØ×.Ò.Ñ0Ô0ˆ
ØÐ!Ø�OŠO˜JÑ'Ô'Ð'Ø�Š˜œ
Ñ#Ô#Ð#Øˆr!   NrS   ÚmessageÚdataú
str | Nonec                ó„   — t          j        ||¬¦  «        }t          |¦  «        |_        |                      |¦  «         d S )N)r{   ©r`   ra   r%   ÚtextrT   )rN   rS   r{   r|   rP   s        r   Ú_add_simplez_NodeReporter._add_simple˜   s=   € ÝŒz˜# wÐ/Ñ/Ô/ˆÝ" 4Ñ(Ô(ˆŒ	Ø�Š�DÑÔÐÐÐr!   Úreportc                ó   — | j         j        s	|j        rd S |j        }|j        }|j        }| j         j        dk    rd S d}| j         j        dv r|                      |d¦  «        }| j         j        dv r2||                      |d¦  «        z  }|                      ||d¦  «         d}| j         j        dv r2||                      |d	¦  «        z  }|                      ||d
¦  «         d}|r|                      ||d¦  «         d S d S )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errr‡   z Captured Out rˆ   )ú
system-errr‰   r‡   z Captured Err rŠ   )	rE   Úlog_passing_testsÚpassedÚ	capstdoutÚcaplogÚ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rN   r‚   Úcontent_outÚcontent_logÚcontent_errÚcontent_alls         r   Úwrite_captured_outputz#_NodeReporter.write_captured_output�   s9  € ØŒxÔ)ð 	¨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…   )rl   Ú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Ÿ   rS   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)rn   r�   ÚlongreprÚgetattrr{   r   r%   )rN   r‚   r§   r{   s       r   Úappend_failurez_NodeReporter.append_failure¿   s®   € å�6˜:Ñ&Ô&ð 	GØ×Ò˜YÐ(OÑPÔPÐPÐPÐPà”?Ð.Ð.Ð.Ý18Ø” ¨dñ2ô 2ˆ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ª   r{   r   Úwhenr�   r%   )rN   r‚   r§   ÚreasonÚmsgs        r   Úappend_errorz_NodeReporter.append_error×   s¢   € ØŒÐ*Ð*Ð*Ý-4°V´_ÀkÐSWÑ-XÔ-Xˆ	ØÐ ØÔ&ˆ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-   r{   z	Skipped: é	   ú:z: zpytest.skip)rn   r¥   Ú
startswithr%   r`   ra   rT   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(   © )r|   s   €r   ú<lambda>z(_NodeReporter.finalize.<locals>.<lambda>   s   ø€ ˜d€ r!   )rz   Ú__dict__Úclear)rN   r|   s    @r   Úfinalizez_NodeReporter.finalizeû   s7   ø€ Ø�{Š{‰}Œ}ˆØŒ×ÒÑÔÐð #�l�l�lˆŒˆˆr!   )rC   rD   rE   r   r   r&   )rP   rQ   r   r&   ©r9   r   rU   r   r   r&   ©r   r[   )rd   r   r   r&   )r   rQ   r(   )rS   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&   ©r   r&   )Ú__name__Ú
__module__Ú__qualname__rO   rT   rX   rZ   rc   ru   rz   r�   r—   r‘   r’   r£   r«   r®   r°   r·   rÃ   rÊ   rÆ   r!   r   rB   rB   T   s�  € € € € € ð(ð (ð (ð (ð ð  ð  ð  ðCð Cð Cð Cð6ð 6ð 6ð 6ðð ð ð ð ð  ð  ð  ð<ð ð ð ðð ð ð ð ð
Cð Cð Cð Cð.@ð @ð @ð @ðð ð ð ð
!ð !ð !ð !ðGð Gð Gð Gð Nð Nð Nð Nð
Pð Pð Pð PðMð Mð Mð Mð/ð /ð /ð /ð,#ð #ð #ð #ð #ð #r!   rB   Úrequestr   Ú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!   úCallable[[str, object], None]c                ó4   ‡ — 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_propertyr9   r   rU   r   r   r&   c                óJ   •— ‰j         j                             | |f¦  «         d S r(   )rP   Úuser_propertiesrT   )r9   rU   rÒ   s     €r   Úappend_propertyz(record_property.<locals>.append_property#  s&   ø€ ØŒÔ$×+Ò+¨T°5¨MÑ:Ô:Ð:Ð:Ð:r!   rË   )rÝ   )rÒ   rã   s   ` r   rà   rà     s<   ø€ õ & gÐ/@ÑAÔAÐAð;ð ;ð ;ð ;ð ;ð ;ð Ðr!   c                ó  — ddl m} | j                              |d¦  «        ¦  «         t	          | d¦  «         d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_attributer9   r   rU   r   r   r&   c                ó   — d S r(   rÆ   r_   s     r   Úadd_attr_noopz+record_xml_attribute.<locals>.add_attr_noop9  s   € Øˆr!   NrË   )r×   rå   rP   rÜ   rÝ   rØ   rÙ   rÚ   rÛ   Únode_reporterrC   rZ   )rÒ   rå   rè   Ú	attr_funcrE   ré   s         r   ræ   ræ   )  s³   € ð CÐBÐBÐBÐBÐBà„L×ÒØ$Ð$Ð%VÑWÔWñô ð õ & gÐ/EÑFÔFÐFðð ð ð ð €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ñ   F  sU   € ð ÐÝ�a�ÑÔð EØEˆÝ˜Ÿ
š
¨µ$°q±'´'Ô2B˜
ÑCÔCÑDÔDÐDðEð Er!   Úsession)Úscopec                ón   — d}d
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.
    Tr9   r   rU   r   r   r&   c                ó*   — d}t          d| ¦  «         dS )zFNo-op function in case --junit-xml was not passed in the command-line.Tr9   N)rñ   )r9   rU   rð   s      r   Úrecord_funcz.record_testsuite_property.<locals>.record_funck  s   € à ÐÝ  ¨Ñ.Ô.Ð.Ð.Ð.r!   NrË   )rØ   rÙ   rÚ   rÛ   Úadd_global_property)rÒ   rð   rö   rE   s       r   Úrecord_testsuite_propertyrø   O  sM   € ð4 Ðð/ð /ð /ð /ð
 Œ.Ô
×
"Ò
"¥7¨DÑ
1Ô
1€CØ
€ØÔ-ˆØÐr!   Úparserr   c                óÄ  — |                       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|xunit2r@   )ÚgetgroupÚ	addoptionÚ	functoolsÚpartialr
   Úaddini)rù   r   s     r   Úpytest_addoptionr  v  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Ø   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ü   rn   Ú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!   Úaddressú	list[str]c                ó  — |                       d¦  «        \  }}}|                     d¦  «        }|d                              t          j        d¦  «        |d<   t          j        dd|d         ¦  «        |d<   |dxx         ||z   z  cc<   |S )Nú[z::r   rg   z\.py$r…   rf   )Ú	partitionÚsplitÚreplacer   ÚSEPr"   r#   )r  rý   Úpossible_open_bracketÚparamsrp   s        r   ri   ri   ½  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/d„Zd0d„Zd1d„Zd2d„Zd3d„Zd0d„Zd0d„Z	d0d„Z
d4d„Zd5d „Zd5d!„Zd6d&„Zd7d*„Zd8d,„Zd-S )9r   r  r„   r
  r?   Trj   r}   Ú
suite_namer   r�   Úreport_durationr‹   r  r   r&   c                ó  — 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Úlogfilerj   r(  r�   r‹   r)  rJ   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rN   r0  rj   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ñ&
ô &
ˆŒ
ð UWˆÔØ;=ˆÔ#Ø8:ˆÔð /1ˆÔØ%&ˆÔ"ð Œ;˜(Ò"Ð"Ø"ˆDŒKˆKˆKð #Ð"r!   r‚   r   c                ó  — t          |d|¦  «        }t          |dd ¦  «        }| j                             ||f¦  «        }|j        D ](\  }}|                     |t          |¦  «        ¦  «         Œ)|�|                     ¦   «          d S d S ©NrC   rP   )rª   r4  Úpoprâ   rX   r   rÊ   )rN   r‚   rC   Ú
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!   úTestReport | strrB   c                óæ   — t          |d|¦  «        }t          |dd ¦  «        }||f}|| j        v r| j        |         S t          || ¦  «        }|| j        |<   | j                             |¦  «         |S r:  )rª   r4  rB   r5  rT   )rN   r‚   rC   r<  rt   r=  s         r   ré   zLogXML.node_reporterö  s‚   € Ý#*¨6°8¸VÑ#DÔ#Dˆå˜V V¨TÑ2Ô2ˆ
à�jÐ ˆà�$Ô%Ð%Ð%àÔ& sÔ+Ð+å  ¨Ñ.Ô.ˆà#+ˆÔ˜CÑ ØÔ#×*Ò*¨8Ñ4Ô4Ð4àˆr!   rt   c                óF   — || j         v r| j         |xx         dz  cc<   d S d S )Nrh   )r3  )rN   rt   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é   ru   ©rN   r‚   r=  s      r   Ú_opentestcasezLogXML._opentestcase  s.   € Ø×%Ò% fÑ-Ô-ˆØ×"Ò" 6Ñ*Ô*Ð*Øˆr!   c           
     óÎ  ‡‡‡— d}‰j         r7‰j        dk    r*|                      ‰¦  «        }|                     ‰¦  «         �n]‰j        �r$‰j        dk    r—t          ‰dd¦  «        Št          ‰dd¦  «        Št          ˆˆˆfd„| j        D ¦   «         d¦  «        }|r|                      |¦  «         n:| xj	        t          ‰j        t          ‰dd¦  «        f| j        v ¦  «        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 ©rI  NrH  ©rC   rª   ©Ú.0Úrepr‚   Ú	report_iiÚ
report_wids     €€€r   ú	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>3  so   øè è € ð ð ààœJ¨&¬-Ò7Ð7Ý '¨¨\¸4Ñ @Ô @ÀIÒ MÐ MÝ '¨¨[¸$Ñ ?Ô ?À:Ò MÐ Mð ð
 !NÐ MÐ MÐ Mðð r!   rP   c              3  ó�   •K  — | ]@}|j         ‰j         k    r.t          |d d¦  «        ‰k    rt          |dd¦  «        ‰k    ¯<|V — ŒAdS rK  rL  rM  s     €€€r   rR  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>b  so   øè è € ð ð ààœ
 f¤mÒ3Ð3Ý# C¨°tÑ<Ô<À	ÒIÐIÝ# C¨°dÑ;Ô;¸zÒIÐIð ð
 JÐIÐIÐIðð r!   )rŒ   r´   rE  r£   Úfailedrª   Únextr7  rÊ   r8  ÚintrC   r4  r«   rT   r‹   r—   r·   r¦   rÃ   Úupdate_testcase_durationÚremove)rN   r‚   Úclose_reportr=  rP  rQ  s    `  @@r   Úpytest_runtest_logreportzLogXML.pytest_runtest_logreport  så  øøø€ ð. ˆØŒ=ð /	,ØŒ{˜fÒ$Ð$Ø×-Ò-¨fÑ5Ô5�Ø×$Ò$ VÑ,Ô,Ð,ùØŒ]ñ +	,ØŒ{˜jÒ(Ð(å$ V¨[¸$Ñ?Ô?�
Ý# F¨L¸$Ñ?Ô?�	Ý#ðð ð ð ð ð à#'Ô#4ðñ ô ð ñ ô  �ð  ð ð —M’M ,Ñ/Ô/Ð/Ð/ð
 Ð.Ô.µ#à"œMÝ# F¨F°DÑ9Ô9ðð  Ô.ð	/ñ3ô 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ª   rD  s      r   rW  zLogXML.update_testcase_durationp  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Œ   rE  rT  r®   r°   rD  s      r   Úpytest_collectreportzLogXML.pytest_collectreportw  sg   € ØŒ}ð 	8Ø×)Ò)¨&Ñ1Ô1ˆHØŒ}ð 8Ø×-Ò-¨fÑ5Ô5Ð5Ð5Ð5à×/Ò/°Ñ7Ô7Ð7Ð7Ð7ð	8ð 	8r!   Úexcreprr   c                ó°   — |                       d¦  «        }|j                             dd¬¦  «         |                     ddt	          |¦  «        ¦  «         d S )NÚinternalr  )r8   r9   r­   zinternal error)ré   rM   r.   r�   r   )rN   r^  r=  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   ÚInstantÚsuite_start)rN   s    r   Úpytest_sessionstartzLogXML.pytest_sessionstart„  s   € Ý!œ>Ñ+Ô+ˆÔÐÐr!   c                ó
  — t           j                             t           j                             | j        ¦  «        ¦  «        }t          j        |d¬¦  «         t          | j        dd¬¦  «        5 }| j                             ¦   «         }| 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          |¦  «        |j        d›| j                             ¦   «                              ¦   «                              ¦   «         t)          j        ¦   «         ¬¦	  «	        }|                      ¦   «         }|�|                     |¦  «         | j        D ])}|                     |                     ¦   «         ¦  «         Œ*t          j        d¦  «        }|                     d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"?>Ú	testsuiterw   )r9   ÚerrorsÚfailuresr¦   Útestsrx   Ú	timestampÚhostnameÚ
testsuitesr9   zpytest testsÚunicode)r+  rý   Údirnamer/  r0  ÚmakedirsÚopenrd  Úelapsedr3  r8  Úwriter`   ra   r(  r   ÚsecondsÚas_utcÚ
astimezoneÚ	isoformatÚplatformrP   Ú_get_global_properties_noderT   r5  rz   ÚsetÚtostring)	rN   rr  r0  rK   ÚnumtestsÚ
suite_noder6  ré   rp  s	            r   Úpytest_sessionfinishzLogXML.pytest_sessionfinish‡  s“  € Ý”'—/’/¥"¤'§/¢/°$´,Ñ"?Ô"?Ñ@Ô@ˆå
Œ�G dÐ+Ñ+Ô+Ð+å�$”, ¨gÐ6Ñ6Ô6ð 	G¸'ØÔ'×/Ò/Ñ1Ô1ˆHð ”
˜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Ø Ô(Ð.Ð.ØÔ*×1Ò1Ñ3Ô3×>Ò>Ñ@Ô@×JÒJÑLÔLÝ!œ™œð
ñ 
ô 
ˆJð !%× @Ò @Ñ BÔ BÐØ Ð,Ø×!Ò!Ð"3Ñ4Ô4Ð4Ø!%Ô!<ð :ð :�Ø×!Ò! -×"6Ò"6Ñ"8Ô"8Ñ9Ô9Ð9Ð9Ýœ LÑ1Ô1ˆJØ�NŠN˜6 >Ñ2Ô2Ð2Ø×Ò˜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<I8É8I<É?I<Úterminalreporterr   rØ   úpytest.Configc                óv   — |                      ¦   «         dk    r |                     dd| j        › �¦  «         d S d S )Nr   r�   zgenerated xml file: )Úget_verbosityÚ	write_sepr0  )rN   r‚  rØ   s      r   Úpytest_terminal_summaryzLogXML.pytest_terminal_summary­  sJ   € ð ×ÒÑ!Ô! QÒ&Ð&Ø×&Ò& sÐ,QÀ4Ä<Ð,QÐ,QÑRÔRÐRÐRÐRð 'Ð&r!   r9   rU   r   c                ó|   — d}t          d|¦  «         | j                             |t          |¦  «        f¦  «         d S )NTr9   )rñ   r6  rT   r%   )rN   r9   rU   rð   s       r   r÷   zLogXML.add_global_property³  sB   € Ø ÐÝ  ¨Ñ.Ô.Ð.ØÔ×%Ò% t­^¸EÑ-BÔ-BÐ&CÑDÔDÐDÐDÐDr!   r[   c                ó®   — | j         rMt          j        d¦  «        }| j         D ]/\  }}|                     t          j        d||¬¦  «        ¦  «         Œ0|S dS r]   )r6  r`   ra   rT   rb   s       r   r|  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!   N)r  r„   r
  r?   T)rj   r}   r(  r   r�   r   r)  r   r‹   r  r   r&   rÍ   )r‚   r@  r   rB   )rt   r   r   r&   )r‚   r   r   rB   )r^  r   r   r&   rÎ   )r‚  r   rØ   rƒ  r   r&   rË   rÌ   )rÏ   rÐ   rÑ   rO   rÊ   ré   rI   rE  rZ  rW  r]  ra  re  r�  r‡  r÷   r|  rÆ   r!   r   r   r   È  s]  € € € € € ð
 #ØØ&ØØ"&ð#ð #ð #ð #ð #ðB
 ð 
 ð 
 ð 
 ðð ð ð ð$!ð !ð !ð !ðð ð ð ð
]7ð ]7ð ]7ð ]7ð~Bð Bð Bð Bð8ð 8ð 8ð 8ðFð Fð Fð Fð
,ð ,ð ,ð ,ð$Gð $Gð $Gð $GðLSð Sð Sð SðEð Eð Eð Eð
ð ð ð ð ð 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   r&   )rØ   r	   r   r&   )r  r   r   r  )2Ú__doc__Ú
__future__r   Úcollections.abcr   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%   r6   ro   ÚcopyrB   rÝ   Úfixturerà   ræ   rñ   rø   r  r  r  ri   r   rÆ   r!   r   ú<module>rš     sU  ððð ð #Ð "Ð "Ð "Ð "Ð "à $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø /Ð /Ð /Ð /Ð /Ð /Ø !Ð !Ð !Ð !Ð !Ð !Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø +Ð +Ð +Ð +Ð +Ð +Ø &Ð &Ð &Ð &Ð &Ð &Ø "Ð "Ð "Ð "Ð "Ð "Ø -Ð -Ð -Ð -Ð -Ð -Ø €€€ð ˆ(�8Ô
Ñ
Ô
€ð2ð 2ð 2ð 2ð2ð ð ð ð ˜;¨Ð/Ð0ØÐ!8Ð!8Ð!8Ð9ðð €ð
 ˜gÔ&×+Ò+Ñ-Ô-€ˆÑ Ø €ˆX�hÔ ¨.Ô!9Ñ :Ô :Ð :ð ˜gÔ&€ˆÑ ðl#ð l#ð l#ð l#ð l#ñ l#ô l#ð l#ð^
ð 
ð 
ð 
ð „ðð ð ñ „ðð, „ðð ð ñ „ðð8Eð Eð Eð Eð €„�iÐ Ñ Ô ð#ð #ð #ñ !Ô ð#ðL,ð ,ð ,ð ,ð^=ð =ð =ð =ð"-ð -ð -ð -ðð ð ð ðwð wð wð wð wñ wô wð wð wð wr!   