Ë
    V.jæc  ã                  óŒ  — d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlZddl	m
Z
 ddl	m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&i Z'dddgie'd<   dg d¢ie'd<   e'd   jQ                  «       e'd<    e&e'd   e'd   «       e'd   e'd<    G d„ d«      Z)	 	 	 	 	 	 d.d „Z*e#jV                  d/d!„«       Z,e#jV                  d/d"„«       Z-d0d#„Z. e#jV                  d$¬%«      d/d&„«       Z/d1d'„Z0d2d(„Z1d2d)„Z2d3d*„Z3 G d+„ d«      Z4y)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                óN   — dd„}d}t        j                  ||t        | «      «      S )a!  Visually escape invalid XML characters.

    For example, transforms
        'hello\aworld\b'
    into
        'hello#x07world#x08'
    Note that the #xABs are *not* XML escapes - missing the ampersand &#xAB.
    The idea is to escape visually for the user rather than for XML itself.
    c                óV   — t        | j                  «       «      }|dk  rd|d›�S d|d›�S )Néÿ   z#xÚ02XÚ04X)ÚordÚgroup)ÚmatchobjÚis     úRC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\_pytest/junitxml.pyÚreplz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                óâ   — i }| j                  «       D ]I  \  }}|j                  «       D ]1  \  }}t        |t        «      st        t	        |«      «      ‚||z   ||<   Œ3 ŒK | j                  |«       y ©N)ÚitemsÚ
isinstanceÚlistÚ	TypeErrorÚtypeÚupdate)ÚleftÚrightÚresultÚklÚvlÚkrÚvrs          r   Úmerge_familyr6   C   sc   € Ø€FØ—*‘*–,‰ˆˆBØ—k‘k–m‰FˆB�Ü˜b¤$Ô'Ü¤ R£Ó)Ð)Ø˜b™ˆF�2ŠJñ $ð ð
 	‡K�K�Õr   ÚtestcaseÚ	classnameÚnameÚ_base)ÚfileÚlineÚurlÚ_base_legacyÚxunit1Úxunit2c                  óž   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	ddd	„Z
dd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zy) Ú_NodeReporterc                óÄ   — || _         || _        | j                  j                  | _        | j                  j                  | _        d| _        g | _        g | _        i | _        y )Nç        )ÚidÚxmlÚ	add_statsÚfamilyÚdurationÚ
propertiesr   Úattrs)ÚselfÚnodeidrF   s      r   Ú__init__z_NodeReporter.__init__Z   sL   € ØˆŒØˆŒØŸ™×+Ñ+ˆŒØ—h‘h—o‘oˆŒØˆŒØ13ˆŒØ')ˆŒ
Ø%'ˆ�
r   c                ó„   — | j                   j                  |j                  «       | j                  j	                  |«       y r(   )rF   rG   Útagr   Úappend)rL   Únodes     r   rQ   z_NodeReporter.appendd   s*   € Ø�‰×Ñ˜4Ÿ8™8Ô$Ø�
‰
×Ñ˜$Õr   c                ób   — | j                   j                  t        |«      t        |«      f«       y r(   )rJ   rQ   r!   r&   ©rL   r9   Úvalues      r   Úadd_propertyz_NodeReporter.add_propertyh   s"   € Ø�‰×Ñ¤ D£	¬>¸%Ó+@ÐAÕBr   c                óF   — t        |«      | j                  t        |«      <   y r(   )r&   rK   r!   rT   s      r   Úadd_attributez_NodeReporter.add_attributek   s   € Ü .¨uÓ 5ˆ�
‰
”3�t“9Òr   c                óÀ   — | j                   rRt        j                  d«      }| j                   D ],  \  }}|j                  t        j                  d||¬«      «       Œ. |S y©z9Return a Junit node containing custom properties, if any.rJ   Úproperty©r9   rU   N)rJ   ÚETÚElementrQ   ©rL   rJ   r9   rU   s       r   Úmake_properties_nodez"_NodeReporter.make_properties_noden   sM   € à�?Š?ÜŸ™ LÓ1ˆJØ#Ÿœ‘��eØ×!Ñ!¤"§*¡*¨Z¸dÈ%Ô"PÕQð  /àÐØr   c                óœ  — t        |j                  «      }| j                  }|d d }| j                  j                  r&|j                  d| j                  j                  «       dj                  |«      t        |d   «      |j                  d   dœ}|j                  d   �t        |j                  d   «      |d<   t        |d«      r|j                  |d<   || _        | j                  j                  |«       | j                  dk(  ry i }| j                  D ]-  }|t        | j                     d	   v sŒ| j                  |   ||<   Œ/ || _        y )
Néÿÿÿÿr   Ú.)r8   r9   r;   é   r<   r=   r?   r7   )Úmangle_test_addressrM   rK   rF   ÚprefixÚinsertÚjoinr&   Úlocationr!   Úhasattrr=   r.   rH   Úfamilies)rL   Ú
testreportÚnamesÚexisting_attrsÚ
classnamesrK   Ú
temp_attrsÚkeys           r   Úrecord_testreportz_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¡/�
˜3’ð ð  ˆ�
r   c                óÞ   — t        j                  d| j                  | j                  d›¬«      }| j	                  «       }|�|j                  |«       |j                  | j                  «       |S )Nr7   ú.3f)Útime)r]   r^   rK   rI   r`   rQ   Úextendr   )rL   r7   rJ   s      r   Úto_xmlz_NodeReporter.to_xml•   sV   € Ü—:‘:˜j¨$¯*©*¸d¿m¹mÈCÐ=PÔRˆØ×.Ñ.Ó0ˆ
ØÐ!Ø�O‰O˜JÔ'Ø�‰˜Ÿ
™
Ô#Øˆr   Nc                ót   — t        j                  ||¬«      }t        |«      |_        | j	                  |«       y )N)Úmessage©r]   r^   r&   ÚtextrQ   )rL   rP   ry   ÚdatarR   s        r   Ú_add_simplez_NodeReporter._add_simple�   s*   € Ü�z‰z˜# wÔ/ˆÜ" 4Ó(ˆŒ	Ø�‰�DÕr   c                óR  — | j                   j                  s|j                  ry |j                  }|j                  }|j
                  }| j                   j                  dk(  ry d}| j                   j                  dv r| j                  |d«      }| j                   j                  dv r*|| j                  |d«      z  }| j                  ||d«       d}| j                   j                  dv r*|| j                  |d	«      z  }| j                  ||d
«       d}|r| j                  ||d«       y y )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errr‚   z Captured Out rƒ   )ú
system-errr„   r‚   z Captured Err r…   )	rF   Úlog_passing_testsÚpassedÚ	capstdoutÚcaplogÚ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rL   ÚreportÚcontent_outÚcontent_logÚcontent_errÚcontent_alls         r   Úwrite_captured_outputz#_NodeReporter.write_captured_output¢   s  € Ø�x‰x×)Ò)¨f¯mªmØà×&Ñ&ˆØ—m‘mˆØ×&Ñ&ˆØ�8‰8×Ñ˜tÒ#ØØˆØ�8‰8×Ñ˜~Ñ-Ø×/Ñ/°Ð=MÓNˆKØ�8‰8×ÑÐ?Ñ?Ø˜4×0Ñ0°Ð>NÓOÑOˆKØ×Ñ ¨°\ÔBØˆKØ�8‰8×ÑÐ?Ñ?Ø˜4×0Ñ0°Ð>NÓOÑOˆKØ×Ñ ¨°\ÔBØˆKÙØ×Ñ ¨°\ÕBð r   c                óJ   — dj                  |j                  dd«      |dg«      S )NÚ
éP   Ú-r€   )rh   Úcenter)rL   ÚcontentÚheaders      r   rŒ   z_NodeReporter._prepare_content¹   s#   € Ø�y‰y˜&Ÿ-™-¨¨CÓ0°'¸2Ð>Ó?Ð?r   c                óp   — t        j                  |«      }t        |«      |_        | j	                  |«       y r(   rz   )rL   rŽ   r™   ÚjheaderrP   s        r   r�   z_NodeReporter._write_content¼   s(   € Ü�j‰j˜Ó!ˆÜ! 'Ó*ˆŒØ�‰�CÕr   c                ó&   — | j                  d«       y )Nr‡   )rG   ©rL   rŽ   s     r   Úappend_passz_NodeReporter.append_passÁ   s   € Ø�‰�xÕ r   c                ó6  — t        |d«      r| j                  dd«       y |j                  €J ‚t        |j                  dd «      }|�|j                  }nt        |j                  «      }t        |«      }| j                  d|t        |j                  «      «       y )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)rj   r}   ÚlongreprÚgetattrry   r!   r&   )rL   rŽ   r£   ry   s       r   Úappend_failurez_NodeReporter.append_failureÄ   sˆ   € ä�6˜:Ô&Ø×Ñ˜YÐ(OÕPà—?‘?Ð.Ð.Ð.Ü18Ø—‘ ¨dó2ˆIð Ð$Ø#×+Ñ+‘ä˜fŸo™oÓ.�Ü$ WÓ-ˆGØ×Ñ˜Y¨´°V·_±_Ó1EÕFr   c                ól   — |j                   €J ‚| j                  ddt        |j                   «      «       y )NÚerrorzcollection failure)r¥   r}   r!   rž   s     r   Úappend_collect_errorz"_NodeReporter.append_collect_errorÔ   s.   € à�‰Ð*Ð*Ð*Ø×Ñ˜Ð"6¼¸F¿O¹OÓ8LÕMr   c                óP   — | j                  ddt        |j                  «      «       y )Nr¢   zcollection skipped)r}   r!   r¥   rž   s     r   Úappend_collect_skippedz$_NodeReporter.append_collect_skippedÙ   s   € Ø×Ñ˜Ð$8¼#¸f¿o¹oÓ:NÕOr   c                ó,  — |j                   €J ‚t        |j                   dd «      }|�|j                  }nt        |j                   «      }|j                  dk(  rd|› d�}nd|› d�}| j                  dt        |«      t        |j                   «      «       y )Nr£   Úteardownzfailed on teardown with "Ú"zfailed on setup with "r©   )r¥   r¦   ry   r!   Úwhenr}   r&   )rL   rŽ   r£   ÚreasonÚmsgs        r   Úappend_errorz_NodeReporter.append_errorÜ   sŒ   € Ø�‰Ð*Ð*Ð*Ü-4°V·_±_ÀkÐSWÓ-Xˆ	ØÐ Ø×&Ñ&‰Fä˜Ÿ™Ó)ˆFà�;‰;˜*Ò$Ø-¨f¨X°QÐ7‰Cà*¨6¨(°!Ð4ˆCØ×Ñ˜¤.°Ó"5´s¸6¿?¹?Ó7KÕLr   c                ó  — t        |d«      rW|j                  }|j                  d«      r|dd  }t        |«      }t	        j
                  dd|¬«      }| j                  |«       y t        |j                  t        «      sJ ‚|j                  \  }}}|j                  d«      r|dd  }|› d	|› d
|› �}t	        j
                  ddt        |«      ¬«      }t        |«      |_
        | j                  |«       | j                  |«       y )Nr¡   zreason: é   r¢   zpytest.xfail)r-   ry   z	Skipped: é	   Ú:z: zpytest.skip)rj   r¡   Ú
startswithr&   r]   r^   rQ   r*   r¥   Útupler{   r“   )rL   rŽ   Úxfailreasonr¢   ÚfilenameÚlinenoÚ
skipreasonÚdetailss           r   Úappend_skippedz_NodeReporter.append_skippedê   së   € Ü�6˜:Ô&Ø Ÿ/™/ˆKØ×%Ñ% jÔ1Ø)¨!¨"˜o�Ü(¨Ó5ˆKÜ—j‘j °ÈÔUˆGØ�K‰K˜Õ ä˜fŸo™o¬uÔ5Ð5Ð5Ø+1¯?©?Ñ(ˆH�f˜jØ×$Ñ$ [Ô1Ø'¨¨˜^�
Ø!˜
 ! F 8¨2¨j¨\Ð:ˆGä—j‘jØ ´~ÀjÓ7QôˆGô *¨'Ó2ˆGŒLØ�K‰K˜Ô Ø×&Ñ& vÕ.r   c                ón   ‡— | j                  «       Š| j                  j                  «        ˆfd„| _         y )Nc                 ó   •— ‰ S r(   © )r|   s   €r   Ú<lambda>z(_NodeReporter.finalize.<locals>.<lambda>  s   ø€ ™dr   )rw   Ú__dict__Úclear)rL   r|   s    @r   Úfinalizez_NodeReporter.finalize   s'   ø€ Ø�{‰{‹}ˆØ�‰×ÑÔó #ˆ�r   )rM   zstr | TestReportrF   r   r    ÚNone)rR   ú
ET.Elementr    rÇ   ©r9   r!   rU   Úobjectr    rÇ   ©r    zET.Element | None)rl   r   r    rÇ   )r    rÈ   r(   )rP   r!   ry   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__rN   rQ   rV   rX   r`   rr   rw   r}   r“   rŒ   r�   rŸ   r§   rª   r¬   r³   r¿   rÆ   rÂ   r   r   rB   rB   Y   sc   „ ó(ó óCó6óó ó<ôó
Có.@óó
!óGó Nó
PóMó/ô,#r   rB   c                óê   — ddl m} | j                  j                  j	                  t
        d«      }|�A|j                  dvr2| j                  j                   ||› d|j                  › d�«      «       yyy)z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )ÚPytestWarningN)r?   Úlegacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	Ú_pytest.warning_typesrÓ   ÚconfigÚstashÚgetÚxml_keyrH   rR   Úwarn)ÚrequestÚfixture_namerÓ   rF   s       r   Ú!_warn_incompatibility_with_xunit2rÝ     sl   € õ 4à
�.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
€˜3Ÿ:™:Ð-AÑAØ�‰×ÑÙØ�.Ð DÀSÇZÁZÀLÐPlÐmóõ	
ð B€r   c                ó,   ‡ — t        ‰ d«       dˆ fd„}|S )an  Add extra properties to the calling test.

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

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

    Example::

        def test_function(record_property):
            record_property("example_key", 1)
    Úrecord_propertyc                óT   •— ‰j                   j                  j                  | |f«       y r(   )rR   Úuser_propertiesrQ   )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õ;ð Ðr   c                ó2  — ddl m} | j                  j                   |d«      «       t	        | d«       dd„}|}| j
                  j                  j                  t        d«      }|�1|j                  | j                  j                  «      }|j                  }|S )z�Add extra xml attributes to the tag for the calling test.

    The fixture is callable with ``name, value``. The value is
    automatically XML-encoded.
    r   )ÚPytestExperimentalApiWarningz/record_xml_attribute is an experimental featureÚrecord_xml_attributec                 ó   — y r(   rÂ   r\   s     r   Úadd_attr_noopz+record_xml_attribute.<locals>.add_attr_noop>  s   € Ør   NrÉ   )rÕ   rä   rR   rÚ   rÝ   rÖ   r×   rØ   rÙ   Únode_reporterrM   rX   )rÛ   rä   rç   Ú	attr_funcrF   rè   s         r   rå   rå   .  sˆ   € õ Cà‡L�L×ÑÙ$Ð%VÓWôô & gÐ/EÔFóð €Ià
�.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
€Ø×)Ñ)¨'¯,©,×*=Ñ*=Ó>ˆØ!×/Ñ/ˆ	àÐr   c                óŠ   — d}t        |t        «      s1d}t        |j                  | t	        |«      j
                  ¬«      «      ‚y)zcUsed by record_testsuite_property to check that the given parameter name is of the proper
    type.Tz5{param} parameter needs to be a string, but {g} given)ÚparamÚgN)r*   r!   r,   Úformatr-   rÏ   )rë   ÚvÚ__tracebackhide__r²   s       r   Ú_check_record_param_typerð   K  s@   € ð ÐÜ�aœÔØEˆÜ˜Ÿ
™
¨´$°q³'×2BÑ2B˜
ÓCÓDÐDð r   Úsession)Úscopec                ó‚   — d}dd„}| j                   j                  j                  t        d«      }|�|j                  }|S )a+  Record a new ``<property>`` tag as child of the root ``<testsuite>``.

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

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

    .. code-block:: python

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

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

    .. warning::

        Currently this fixture **does not work** with the
        `pytest-xdist <https://github.com/pytest-dev/pytest-xdist>`__ plugin. See
        :issue:`7767` for details.
    Tc                ó    — d}t        d| «       y)zFNo-op function in case --junit-xml was not passed in the command-line.Tr9   N)rð   )r9   rU   rï   s      r   Úrecord_funcz.record_testsuite_property.<locals>.record_funcp  s   € à ÐÜ  ¨Õ.r   NrÉ   )rÖ   r×   rØ   rÙ   Úadd_global_property)rÛ   rï   rõ   rF   s       r   Úrecord_testsuite_propertyr÷   T  sC   € ð4 Ðó/ð
 �.‰.×
Ñ
×
"Ñ
"¤7¨DÓ
1€CØ
€Ø×-Ñ-ˆØÐr   c                ó‚  — | j                  d«      }|j                  dddddt        j                  t        d¬«      d d¬	«       |j                  d
dddd d¬«       | j                  ddd¬«       | j                  ddd¬«       | j                  dddd¬«       | j                  ddd¬«       | j                  ddd ¬«       y )!Nzterminal reportingz
--junitxmlz--junit-xmlÚstoreÚxmlpathÚpath)Úoptnamez0Create junit-xml style report file at given path)ÚactionÚdestÚmetavarr-   ÚdefaultÚhelpz--junitprefixz--junit-prefixr!   z0Prepend prefix to classnames in junit-xml output)rý   rÿ   r   r  Újunit_suite_namez Test suite name for JUnit reportÚpytest)r   Újunit_loggingz\Write captured log messages to JUnit report: one of no|log|system-out|system-err|out-err|allr   Újunit_log_passing_testsz;Capture log information for passing tests to JUnit report: ÚboolT)r-   r   Újunit_duration_reportz*Duration time to report: one of total|callÚtotalÚjunit_familyz0Emit XML for schema: one of legacy|xunit1|xunit2r@   )ÚgetgroupÚ	addoptionÚ	functoolsÚpartialr   Úaddini)Úparserr   s     r   Úpytest_addoptionr  {  sü   € Ø�O‰OÐ0Ó1€EØ	‡O�OØØØØØÜ×Ñœ|°\ÔBØØ?ð ô 	ð 
‡O�OØØØØØØ?ð ô ð ‡M�MØÐ>Èð ô ð ‡M�MØð	:àð	 ô ð ‡M�MØ!ØEØØð	 ô ð ‡M�MØØ4Øð ô ð
 ‡M�MØØ:Øð õ r   c                ó®  — | j                   j                  }|r½t        | d«      s°| j                  d«      }t	        || j                   j
                  | j                  d«      | j                  d«      | j                  d«      || j                  d«      «      | j                  t        <   | j                  j                  | j                  t           «       y y y )NÚworkerinputr	  r  r  r  r  )
Úoptionrú   rj   Úgetinir   Újunitprefixr×   rÙ   ÚpluginmanagerÚregister)rÖ   rú   r	  s      r   Úpytest_configurer  ª  sª   € Ø�m‰m×#Ñ#€Gá”w˜v }Ô5Ø—}‘} ^Ó4ˆÜ &ØØ�M‰M×%Ñ%Ø�M‰MÐ,Ó-Ø�M‰M˜/Ó*Ø�M‰MÐ1Ó2ØØ�M‰MÐ3Ó4ó!
ˆ�‰”WÑð 	×Ñ×%Ñ% f§l¡l´7Ñ&;Õ<ð 6€wr   c                ó¢   — | j                   j                  t        d «      }|r-| j                   t        = | j                  j	                  |«       y y r(   )r×   rØ   rÙ   r  Ú
unregister)rÖ   rF   s     r   Úpytest_unconfigurer  »  s@   € Ø
�,‰,×
Ñ
œ7 DÓ
)€CÙ
Ø�L‰LœÐ!Ø×Ñ×'Ñ'¨Õ,ð r   c                óø   — | j                  d«      \  }}}|j                  d«      }|d   j                  t        j                  d«      |d<   t        j                  dd|d   «      |d<   |dxx   ||z   z  cc<   |S )NÚ[z::r   rc   z\.py$r€   rb   )Ú	partitionÚsplitÚreplacer   ÚSEPr"   r#   )Úaddressrû   Úpossible_open_bracketÚparamsrm   s        r   re   re   Â  sy   € Ø*1×*;Ñ*;¸CÓ*@Ñ'€DÐ
 Ø�J‰J�tÓ€Eà�Q‰x×Ñ¤§	¡	¨3Ó/€Eˆ!�HÜ�v‰v�h  E¨!¡HÓ-€Eˆ!�Hà	ˆ"ƒIÐ&¨Ñ/Ñ/ƒIØ€Lr   c                  óž   — e Zd Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zy)r   c                ó   — t         j                  j                  t         j                  j                  |«      «      }t         j                  j	                  t         j                  j                  |«      «      | _        || _        || _        || _	        || _
        || _        || _        t        j                  g d¢d«      | _        i | _        g | _        g | _        g | _        d| _        | j                  dk(  rd| _        y y )N)r©   r‡   r¤   r¢   r   rÔ   r?   )Úosrû   Ú
expanduserÚ
expandvarsÚnormpathÚabspathÚlogfilerf   Ú
suite_namer‹   r†   Úreport_durationrH   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rL   r,  rf   r-  r‹   r.  rH   r†   s           r   rN   zLogXML.__init__Î  sÓ   € ô —'‘'×$Ñ$¤R§W¡W×%7Ñ%7¸Ó%@ÓAˆÜ—w‘w×'Ñ'¬¯©¯©¸Ó(@ÓAˆŒØˆŒØ$ˆŒØˆŒØ!2ˆÔØ.ˆÔØˆŒÜ%)§]¡]Ú5°qó&
ˆŒ
ð UWˆÔØ;=ˆÔ#Ø8:ˆÔð /1ˆÔØ%&ˆÔ"ð �;‰;˜(Ò"Ø"ˆD�Kð #r   c                óö   — t        |d|«      }t        |dd «      }| j                  j                  ||f«      }|j                  D ]   \  }}|j	                  |t        |«      «       Œ" |�|j                  «        y y ©NrM   rR   )r¦   r2  Úpoprá   rV   r!   rÆ   )rL   rŽ   rM   Ú
workernodeÚreporterÚpropnameÚ	propvalues          r   rÆ   zLogXML.finalizeï  s{   € Ü˜ ¨6Ó2ˆä˜V V¨TÓ2ˆ
Ø×&Ñ&×*Ñ*¨F°JÐ+?Ó@ˆà#)×#9Ô#9ÑˆH�iØ×!Ñ! (¬C°	«NÕ;ð $:ð ÐØ×ÑÕð  r   c                óè   — t        |d|«      }t        |dd «      }||f}|| j                  v r| j                  |   S t        || «      }|| j                  |<   | j                  j	                  |«       |S r8  )r¦   r2  rB   r3  rQ   )rL   rŽ   rM   r:  rq   r;  s         r   rè   zLogXML.node_reporterû  s|   € Ü#*¨6°8¸VÓ#Dˆä˜V V¨TÓ2ˆ
à�jÐ ˆà�$×%Ñ%Ñ%à×&Ñ& sÑ+Ð+ä  ¨Ó.ˆà#+ˆ×Ñ˜CÑ Ø×#Ñ#×*Ñ*¨8Ô4àˆr   c                óP   — || j                   v r| j                   |xx   dz  cc<   y y )Nrd   )r1  )rL   rq   s     r   rG   zLogXML.add_stats  s%   € Ø�$—*‘*ÑØ�J‰J�s‹O˜qÑ ŒOð r   c                óJ   — | j                  |«      }|j                  |«       |S r(   )rè   rr   ©rL   rŽ   r;  s      r   Ú_opentestcasezLogXML._opentestcase  s%   € Ø×%Ñ% fÓ-ˆØ×"Ñ" 6Ô*Øˆr   c                ó8  ‡‡‡— d}‰j                   r4‰j                  dk(  �rL| j                  ‰«      }|j                  ‰«       �n(‰j                  rî‰j                  dk(  rct        ‰dd«      Št        ‰dd«      Št        ˆˆˆfd„| j                  D «       d«      }|r&| j                  |«       | xj                  dz  c_	        | j                  ‰«      }‰j                  dk(  rJ|j                  ‰«       | j                  j                  ‰«       | j                  sR|j                  ‰«       n@|j                  ‰«       n.‰j                  r"| j                  ‰«      }|j!                  ‰«       | j#                  ‰«       ‰j                  dk(  r�| j                  ‰«      }|j                  ‰«       | j                  ‰«       t        ‰dd«      Št        ‰dd«      Št        ˆˆˆfd„| j                  D «       d«      }|r| j                  j%                  |«       yyy)	a  Handle a setup/call/teardown report, generating the appropriate
        XML tags as necessary.

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

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

        Possible call order in xdist:
            -> setup node1
            -> call node1
            -> setup node2
            -> call node2
            -> teardown node2
            -> teardown node1
        NÚcallr®   Ú	worker_idÚ
item_indexc              3  ó”   •K  — | ]?  }|j                   ‰j                   k(  r$t        |d d«      ‰k(  rt        |dd«      ‰k(  r|–— ŒA y­w©rF  NrE  ©rM   r¦   ©Ú.0ÚreprŽ   Ú	report_iiÚ
report_wids     €€€r   Ú	<genexpr>z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>8  sK   øè ø€ ð á#4˜CàŸJ™J¨&¯-©-Ò7Ü '¨¨\¸4Ó @ÀIÒ MÜ '¨¨[¸$Ó ?À:Ò Mô Ù#4ùó   ƒAArd   c              3  ó”   •K  — | ]?  }|j                   ‰j                   k(  r$t        |d d«      ‰k(  rt        |dd«      ‰k(  r|–— ŒA y­wrH  rI  rJ  s     €€€r   rO  z2LogXML.pytest_runtest_logreport.<locals>.<genexpr>]  sK   øè ø€ ð á0˜àŸ
™
 f§m¡mÒ3Ü# C¨°tÓ<À	ÒIÜ# C¨°dÓ;¸zÒIô Ù0ùrP  )r‡   r°   rB  rŸ   Úfailedr¦   Únextr5  rÆ   r6  r§   rQ   r†   r“   r³   r¢   r¿   Úupdate_testcase_durationÚremove)rL   rŽ   Úclose_reportr;  rM  rN  s    `  @@r   Úpytest_runtest_logreportz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                óœ   — | j                   d|j                  hv r2| j                  |«      }|xj                  t	        |dd«      z  c_        yy)zƒAccumulate total duration for nodeid from given report and update
        the Junit.testcase with the new total if already created.r  rI   rD   N)r.  r°   rè   rI   r¦   rA  s      r   rT  zLogXML.update_testcase_durationk  sJ   € ð ×Ñ G¨V¯[©[Ð#9Ñ9Ø×)Ñ)¨&Ó1ˆHØ×Ò¤¨°¸SÓ!AÑAÖð :r   c                óž   — |j                   sA| j                  |«      }|j                  r|j                  |«       y |j	                  |«       y y r(   )r‡   rB  rR  rª   r¬   rA  s      r   Úpytest_collectreportzLogXML.pytest_collectreportr  sA   € Ø�}Š}Ø×)Ñ)¨&Ó1ˆHØ�}Š}Ø×-Ñ-¨fÕ5à×/Ñ/°Õ7ð r   c                ó˜   — | j                  d«      }|j                  j                  dd¬«       |j                  ddt	        |«      «       y )NÚinternalr  )r8   r9   r©   zinternal error)rè   rK   r.   r}   r!   )rL   Úexcreprr;  s      r   Úpytest_internalerrorzLogXML.pytest_internalerrorz  s@   € Ø×%Ñ% jÓ1ˆØ�‰×Ñ¨°zÐÔBØ×Ñ˜WÐ&6¼¸G»ÕEr   c                ó6   — t        j                  «       | _        y r(   )r	   ru   Úsuite_start_time)rL   s    r   Úpytest_sessionstartzLogXML.pytest_sessionstart  s   € Ü &§¡£ˆÕr   c                óô  — t         j                  j                  t         j                  j                  | j                  «      «      }t        j
                  |d¬«       t        | j                  dd¬«      5 }t        j                  «       }|| j                  z
  }| j                  d   | j                  d   z   | j                  d   z   | j                  d	   z   | j                  z
  }|j                  d
«       t        j                  d| j                  t!        | j                  d	   «      t!        | j                  d   «      t!        | j                  d   «      t!        |«      |d›t#        j$                  | j                  t&        j(                  «      j+                  «       j-                  «       t/        j0                  «       ¬«	      }| j3                  «       }|�|j5                  |«       | j6                  D ]!  }|j5                  |j9                  «       «       Œ# t        j                  d«      }	|	j5                  |«       |j                  t        j:                  |	d¬«      «       d d d «       y # 1 sw Y   y xY w)NT)Úexist_okÚwzutf-8)Úencodingr‡   r¤   r¢   r©   z&<?xml version="1.0" encoding="utf-8"?>Ú	testsuitert   )r9   ÚerrorsÚfailuresr¢   Útestsru   Ú	timestampÚhostnameÚ
testsuitesÚunicode)r'  rû   Údirnamer+  r,  ÚmakedirsÚopenr	   ru   r`  r1  r6  Úwriter]   r^   r-  r!   r   Úfromtimestampr   ÚutcÚ
astimezoneÚ	isoformatÚplatformrR   Ú_get_global_properties_noderQ   r3  rw   Útostring)
rL   rn  r,  Úsuite_stop_timeÚsuite_time_deltaÚnumtestsÚ
suite_noder4  rè   rl  s
             r   Úpytest_sessionfinishz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   Á6G/I.É.I7c                óB   — |j                  dd| j                  › �«       y )Nr—   zgenerated xml file: )Ú	write_sepr,  )rL   Úterminalreporters     r   Úpytest_terminal_summaryzLogXML.pytest_terminal_summaryª  s   € Ø×"Ñ" 3Ð*>¸t¿|¹|¸nÐ(MÕNr   c                ól   — d}t        d|«       | j                  j                  |t        |«      f«       y )NTr9   )rð   r4  rQ   r&   )rL   r9   rU   rï   s       r   rö   zLogXML.add_global_property­  s0   € Ø ÐÜ  ¨Ô.Ø×Ñ×%Ñ% t¬^¸EÓ-BÐ&CÕDr   c                óÀ   — | j                   rRt        j                  d«      }| j                   D ],  \  }}|j                  t        j                  d||¬«      «       Œ. |S yrZ   )r4  r]   r^   rQ   r_   s       r   rw  z"LogXML._get_global_properties_node²  sQ   € à×!Ò!ÜŸ™ LÓ1ˆJØ#×5Ô5‘��eØ×!Ñ!¤"§*¡*¨Z¸dÈ%Ô"PÕQð  6àÐØr   N)r  r   r  r?   T)rf   rÌ   r-  r!   r‹   r!   r.  r!   r†   r  r    rÇ   rÍ   )rŽ   zTestReport | strr    rB   )rq   r!   r    rÇ   )rŽ   r   r    rB   )r]  r
   r    rÇ   rÎ   )r€  r   r    rÇ   rÉ   rË   )rÏ   rÐ   rÑ   rN   rÆ   rè   rG   rB  rW  rT  rZ  r^  ra  r}  r�  rö   rw  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  r'  rv  r"   Útypingr   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   rk   ÚcopyrB   rÝ   Úfixturerß   rå   rð   r÷   r  r  r  re   r   rÂ   r   r   Ú<module>r”     sw  ðñõ #å Ý Û Û 	Û Û 	Ý Ý ß "Ð "å Ý Ý ,Ý /Ý !Ý 'Ý ,Ý +Ý &Ý "Ý -Û ð ˆ(�8Ñ
Ó
€ó2ó6ð €Ø +¨vÐ!6Ð7€ˆÑ Ø&Ò(?Ð@€ˆÑ ð ˜gÑ&×+Ñ+Ó-€ˆÑ Ù ˆX�hÑ ¨.Ñ!9Ô :ð ˜gÑ&€ˆÑ ÷l#ñ l#ð^
Øð
Ø+.ð
à	ó
ð ‡�òó ðð, ‡�òó ðó8Eð €‡��iÔ ò#ó !ð#óL,ó^=ó"-ó÷lò lr   