o
    Ú­jnd  ã                   @   s¤  d Z ddlZddlZddlZddlZddlm  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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% e#d ƒ Z&de'de(fdd„Z)dCdd„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&„ d&ƒZ-d'ed(e(ddfd)d*„Z.ej/d'edee(e'gdf fd+d,„ƒZ0ej/d'edee(e'gdf fd-d.„ƒZ1d/e(d0e(ddfd1d2„Z2ej/d3d4�d'edee(e'gdf fd5d6„ƒZ3d7eddfd8d9„Z4d:eddfd;d<„Z5d:eddfd=d>„Z6d?e(dee( fd@dA„Z7G dBd„ dƒZ8dS )Da  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
é    N)Údatetime)ÚCallable)ÚDict)ÚList)ÚMatch)ÚOptional)ÚTuple)ÚUnion)Únodes)Útiming)ÚExceptionRepr)ÚReprFileLocation)ÚConfig)Úfilename_arg)ÚParser)ÚFixtureRequest)Ú
TestReport)ÚStashKey)ÚTerminalReporterÚLogXMLÚargÚreturnc                 C   s,   dt t dtfdd„}d}t ||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                 S   s$   t |  ¡ ƒ}|dkrd| S d| S )Néÿ   z#x%02Xz#x%04X)ÚordÚgroup)r   Úi© r   úM/var/www/html/CropPilot/venv/lib/python3.10/site-packages/_pytest/junitxml.pyÚrepl3   s   zbin_xml_escape.<locals>.replu    [^	
 -~Â€-íŸ¿î€€-ï¿½á€€0-áƒ¿FF])r   ÚstrÚreÚsub)r   r   Úillegal_xml_rer   r   r   Úbin_xml_escape(   s   ÿr$   c                 C   sX   i }|   ¡ D ]\}}|  ¡ D ]\}}t|tƒstt|ƒƒ‚|| ||< qq|  |¡ d S ©N)ÚitemsÚ
isinstanceÚlistÚ	TypeErrorÚtypeÚupdate)ÚleftÚrightÚresultÚklÚvlÚkrÚvrr   r   r   Úmerge_familyC   s   
ýr3   ÚtestcaseÚ	classnameÚnameÚ_base)ÚfileÚlineÚurlÚ_base_legacyÚxunit1Úxunit2c                	   @   sx  e Zd Zdeeef ddddfdd„Zdejddfd	d
„Z	dede
ddfdd„Zdede
ddfdd„Zdeej fdd„Zdeddfdd„Zdejfdd„Zd5dededee ddfdd„Zdeddfdd„Zd ed!edefd"d#„Zded ed$eddfd%d&„Zdeddfd'd(„Zdeddfd)d*„Zdeddfd+d,„Zdeddfd-d.„Zdeddfd/d0„Zdeddfd1d2„Zd6d3d4„ZdS )7Ú_NodeReporterÚnodeidÚxmlr   r   Nc                 C   s<   || _ || _| jj| _| jj| _d| _g | _g | _i | _d S )Nç        )Úidr@   Ú	add_statsÚfamilyÚdurationÚ
propertiesr
   Úattrs)Úselfr?   r@   r   r   r   Ú__init__Z   s   


z_NodeReporter.__init__Únodec                 C   s   | j  |j¡ | j |¡ d S r%   )r@   rC   Útagr
   Úappend)rH   rJ   r   r   r   rL   d   s   z_NodeReporter.appendr6   Úvaluec                 C   s   | j  t|ƒt|ƒf¡ d S r%   )rF   rL   r    r$   ©rH   r6   rM   r   r   r   Úadd_propertyh   s   z_NodeReporter.add_propertyc                 C   s   t |ƒ| jt|ƒ< d S r%   )r$   rG   r    rN   r   r   r   Úadd_attributek   ó   z_NodeReporter.add_attributec                 C   ó>   | j rt d¡}| j D ]\}}| tjd||d�¡ q|S dS ©z9Return a Junit node containing custom properties, if any.rF   Úproperty©r6   rM   N)rF   ÚETÚElementrL   ©rH   rF   r6   rM   r   r   r   Úmake_properties_noden   ó   
z"_NodeReporter.make_properties_nodeÚ
testreportc                 C   sæ   t |jƒ}| j}|d d… }| jjr| d| jj¡ d |¡t|d ƒ|jd dœ}|jd d ur:t	|jd ƒ|d< t
|dƒrD|j|d< || _| j |¡ | jdkrTd S i }| j ¡ D ]}|t| j d	 v rm| j| ||< q[|| _d S )
Néÿÿÿÿr   Ú.)r5   r6   r8   é   r9   r:   r<   r4   )Úmangle_test_addressr?   rG   r@   ÚprefixÚinsertÚjoinr$   Úlocationr    Úhasattrr:   r+   rD   ÚkeysÚfamilies)rH   r[   ÚnamesÚexisting_attrsÚ
classnamesrG   Ú
temp_attrsÚkeyr   r   r   Úrecord_testreportw   s.   

ý


€
z_NodeReporter.record_testreportc                 C   sB   t jd| jd| j d�}|  ¡ }|d ur| |¡ | | j¡ |S )Nr4   ú%.3f)Útime)rV   rW   rG   rE   rY   rL   Úextendr
   )rH   r4   rF   r   r   r   Úto_xml•   s   
z_NodeReporter.to_xmlrK   ÚmessageÚdatac                 C   s&   t j||d�}t|ƒ|_|  |¡ d S )N)rq   ©rV   rW   r$   ÚtextrL   )rH   rK   rq   rr   rJ   r   r   r   Ú_add_simple�   s   
z_NodeReporter._add_simpleÚreportc                 C   sÆ   | 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 r?||  |d¡7 }|  ||d¡ d}| j jdv rV||  |d	¡7 }|  ||d
¡ d}|ra|  ||d¡ d S d S )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errrz   z Captured Out r{   )ú
system-errr|   rz   z Captured Err r}   )	r@   Úlog_passing_testsÚpassedÚ	capstdoutÚcaplogÚ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rH   rv   Úcontent_outÚcontent_logÚcontent_errÚcontent_allr   r   r   Úwrite_captured_output¢   s*   ÿz#_NodeReporter.write_captured_outputÚcontentÚheaderc                 C   s   d  | dd¡|dg¡S )NÚ
éP   ú-rx   )rb   Úcenter)rH   r‹   rŒ   r   r   r   r„   ¹   ó   z_NodeReporter._prepare_contentÚjheaderc                 C   s"   t  |¡}t|ƒ|_|  |¡ d S r%   rs   )rH   rv   r‹   r’   rK   r   r   r   r…   ¼   s   

z_NodeReporter._write_contentc                 C   s   |   d¡ d S )Nr   )rC   ©rH   rv   r   r   r   Úappend_passÁ   ó   z_NodeReporter.append_passc                 C   sp   t |dƒr|  dd¡ d S |jd usJ ‚t|jdd ƒ}|d ur#|j}nt|jƒ}t|ƒ}|  d|t|jƒ¡ d S )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)rd   ru   ÚlongreprÚgetattrrq   r    r$   )rH   rv   r˜   rq   r   r   r   Úappend_failureÄ   s   
ÿ
z_NodeReporter.append_failurec                 C   s&   |j d usJ ‚|  ddt|j ƒ¡ d S )NÚerrorzcollection failure)rš   ru   r    r“   r   r   r   Úappend_collect_errorÔ   s   z"_NodeReporter.append_collect_errorc                 C   s   |   ddt|jƒ¡ d S )Nr—   zcollection skipped)ru   r    rš   r“   r   r   r   Úappend_collect_skippedÙ   r‘   z$_NodeReporter.append_collect_skippedc                 C   sv   |j d usJ ‚t|j dd ƒ}|d ur|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›   rq   r    Úwhenru   r$   )rH   rv   r˜   ÚreasonÚmsgr   r   r   Úappend_errorÜ   s   ÿ

z_NodeReporter.append_errorc                 C   sÄ   t |dƒr&|j}| d¡r|dd … }t|ƒ}tjdd|d�}|  |¡ d S t|jt	ƒs.J ‚|j\}}}| d¡r?|dd … }|› d	|› d
|› �}tjdd|d�}t|ƒ|_
|  |¡ |  |¡ d S )Nr–   zreason: é   r—   zpytest.xfail)r*   rq   z	Skipped: é	   ú:z: zpytest.skip)rd   r–   Ú
startswithr$   rV   rW   rL   r'   rš   Útuplert   rŠ   )rH   rv   Úxfailreasonr—   ÚfilenameÚlinenoÚ
skipreasonÚdetailsr   r   r   Úappend_skippedì   s    




z_NodeReporter.append_skippedc                    s$   |   ¡ ‰ | j ¡  ‡ fdd„| _ d S )Nc                      s   ˆ S r%   r   r   ©rr   r   r   Ú<lambda>  s    z(_NodeReporter.finalize.<locals>.<lambda>)rp   Ú__dict__Úclear©rH   r   r±   r   Úfinalize   s   
z_NodeReporter.finalizer%   ©r   N)Ú__name__Ú
__module__Ú__qualname__r	   r    r   rI   rV   rW   rL   ÚobjectrO   rP   r   rY   rl   rp   ru   rŠ   r„   r…   r”   rœ   rž   rŸ   r¥   r°   r¶   r   r   r   r   r>   Y   s&    
	 r>   ÚrequestÚfixture_namec                 C   sV   ddl m} | jj td¡}|dur'|jdvr)| j |dj	||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<   ÚlegacyzV{fixture_name} is incompatible with junit_family '{family}' (use 'legacy' or 'xunit1'))r½   rD   )
Ú_pytest.warning_typesr¾   ÚconfigÚstashÚgetÚxml_keyrD   rJ   ÚwarnÚformat)r¼   r½   r¾   r@   r   r   r   Ú!_warn_incompatibility_with_xunit2  s   ÿÿÿÿrÇ   c                    s(   t ˆ dƒ dtdtddf‡ fd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_propertyr6   rM   r   Nc                    s   ˆ j j | |f¡ d S r%   )rJ   Úuser_propertiesrL   rU   ©r¼   r   r   Úappend_property*  rQ   z(record_property.<locals>.append_property)rÇ   r    r»   )r¼   rË   r   rÊ   r   rÈ     s   
rÈ   c                 C   sp   ddl m} | j |dƒ¡ t| dƒ dtdtddfd	d
„}|}| jj 	t
d¡}|dur6| | 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_attributer6   rM   r   Nc                 S   s   d S r%   r   rU   r   r   r   Úadd_attr_noop@  s   z+record_xml_attribute.<locals>.add_attr_noop)rÀ   rÌ   rJ   rÅ   rÇ   r    r»   rÁ   rÂ   rÃ   rÄ   Únode_reporterr?   rP   )r¼   rÌ   rÎ   Ú	attr_funcr@   rÏ   r   r   r   rÍ   0  s   ÿ
rÍ   ÚparamÚvc                 C   s.   d}t |tƒsd}t|j| t|ƒjd�ƒ‚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)   rÆ   r*   r¸   )rÑ   rÒ   Ú__tracebackhide__r¤   r   r   r   Ú_check_record_param_typeM  s
   
þrÕ   Úsession)Úscopec                 C   s<   d}dt dtddfdd„}| jj td¡}|dur|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.
    Tr6   rM   r   Nc                 S   s   d}t d| ƒ dS )zFNo-op function in case --junit-xml was not passed in the command-line.Tr6   N)rÕ   )r6   rM   rÔ   r   r   r   Úrecord_funcs  s   z.record_testsuite_property.<locals>.record_func)r    r»   rÁ   rÂ   rÃ   rÄ   Úadd_global_property)r¼   rÔ   rØ   r@   r   r   r   Úrecord_testsuite_propertyV  s   rÚ   Úparserc              
   C   sš   |   d¡}|jdddddtjtdd�d dd	� |jd
dddd dd� | jdddd� | jdddd� | jddddd� | jdddd� | j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|allrw   Ú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   r   r   r   Úpytest_addoption~  sV   
ø
úÿüüý
ýrò   rÁ   c              
   C   st   | j j}|r6t| dƒs8|  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Ý   rd   Úgetinir   ÚjunitprefixrÂ   rÄ   ÚpluginmanagerÚregister)rÁ   rÝ   rì   r   r   r   Úpytest_configure­  s   

ù	õrù   c                 C   s.   | j  td ¡}|r| j t= | j |¡ d S d S r%   )rÂ   rÃ   rÄ   r÷   Ú
unregister)rÁ   r@   r   r   r   Úpytest_unconfigure¾  s
   þrû   Úaddressc                 C   s^   |   d¡\}}}| d¡}|d  tjd¡|d< t dd|d ¡|d< |d  || 7  < |S )Nú[z::r   r]   z\.py$rx   r\   )Ú	partitionÚsplitÚreplacer
   ÚSEPr!   r"   )rü   rÞ   Úpossible_open_bracketÚparamsrg   r   r   r   r_   Å  s   
r_   c                   @   s&  e Zd Z					d/dee deded	ed
eddfdd„Zdeddfdd„Zde	eef de
fdd„Zdeddfdd„Zdede
fdd„Zdeddfdd„Zdeddfdd„Zdeddfdd„Zdeddfd d!„Zd0d"d#„Zd0d$d%„Zd&eddfd'd(„Zd)ed*eddfd+d,„Zdeej fd-d.„ZdS )1r   ræ   rw   rë   r<   Tr`   Ú
suite_namerƒ   Úreport_durationr~   r   Nc                 C   s–   t j t j |¡¡}t j t j |¡¡| _|| _|| _|| _	|| _
|| _|| _t g d¢d¡| _i | _g | _g | _g | _d| _| jdkrId| _d S d S )N)r�   r   r™   r—   r   r¿   r<   )ÚosrÞ   Ú
expanduserÚ
expandvarsÚnormpathÚabspathÚlogfiler`   r  rƒ   r~   r  rD   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rH   r  r`   r  rƒ   r  rD   r~   r   r   r   rI   Ñ  s(   
ÿþ

ÿzLogXML.__init__rv   c                 C   s`   t |d|ƒ}t |dd ƒ}| j ||f¡}|jD ]\}}| |t|ƒ¡ q|d ur.| ¡  d S d S ©Nr?   rJ   )r›   r  ÚpoprÉ   rO   r    r¶   )rH   rv   r?   Ú
workernodeÚreporterÚpropnameÚ	propvaluer   r   r   r¶   ô  s   ÿzLogXML.finalizec                 C   sX   t |d|ƒ}t |dd ƒ}||f}|| jv r| j| S t|| ƒ}|| j|< | j |¡ |S r  )r›   r  r>   r  rL   )rH   rv   r?   r  rk   r  r   r   r   rÏ      s   



zLogXML.node_reporterrk   c                 C   s$   || j v r| j |  d7  < d S d S )Nr^   )r  )rH   rk   r   r   r   rC     s   
ÿzLogXML.add_statsc                 C   s   |   |¡}| |¡ |S r%   )rÏ   rl   ©rH   rv   r  r   r   r   Ú_opentestcase  s   

zLogXML._opentestcasec                    sr  d}ˆ j rˆ jdkr|  ˆ ¡}| ˆ ¡ nbˆ jrjˆ jdkrFtˆ ddƒ‰tˆ ddƒ‰t‡ ‡‡fdd„| jD ƒdƒ}|rF|  |¡ |  j	d7  _	|  ˆ ¡}ˆ jdkrd| 
ˆ ¡ | j ˆ ¡ | jsc| ˆ ¡ n| ˆ ¡ nˆ jrw|  ˆ ¡}| ˆ ¡ |  ˆ ¡ ˆ jdkrµ|  ˆ ¡}| ˆ ¡ |  ˆ ¡ tˆ ddƒ‰tˆ ddƒ‰t‡ ‡‡fd	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   ó@   � | ]}|j ˆ j krt|d dƒˆkrt|ddƒˆkr|V  qdS ©r  Nr  ©r?   r›   ©Ú.0Úrep©rv   Ú	report_iiÚ
report_widr   r   Ú	<genexpr>=  ó   € ûúz2LogXML.pytest_runtest_logreport.<locals>.<genexpr>r^   c                 3   r  r   r!  r"  r%  r   r   r(  b  r)  )r   r¢   r  r”   Úfailedr›   Únextr  r¶   r  rœ   rL   r~   rŠ   r¥   r—   r°   Úupdate_testcase_durationÚremove)rH   rv   Úclose_reportr  r   r%  r   Úpytest_runtest_logreport  s^   


€
þ	ö




€






þ	öìzLogXML.pytest_runtest_logreportc                 C   s>   | j dks|j| j kr|  |¡}| jt|ddƒ7  _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ë   rE   rA   N)r  r¢   rÏ   rE   r›   r  r   r   r   r,  p  s   
þzLogXML.update_testcase_durationc                 C   s6   |j s|  |¡}|jr| |¡ d S | |¡ d S d S r%   )r   r  r*  rž   rŸ   r  r   r   r   Úpytest_collectreportw  s   
ûzLogXML.pytest_collectreportÚexcreprc                 C   s0   |   d¡}|jjddd� | ddt|ƒ¡ d S )NÚinternalræ   )r5   r6   r�   zinternal error)rÏ   rG   r+   ru   r    )rH   r1  r  r   r   r   Úpytest_internalerror  s   
zLogXML.pytest_internalerrorc                 C   s   t  ¡ | _d S r%   )r   rn   Úsuite_start_timerµ   r   r   r   Úpytest_sessionstart„  r•   zLogXML.pytest_sessionstartc           
      C   sT  t j t j | j¡¡}t j|dd� t| jddd��†}t ¡ }|| j	 }| j
d | j
d  | j
d  | j
d	  | j }| d
¡ tjd| jt| j
d	 ƒt| j
d ƒt| j
d ƒt|ƒd| t | j	¡ ¡ t ¡ d�	}|  ¡ }|d urw| |¡ | jD ]	}| | ¡ ¡ qzt d¡}	|	 |¡ | tj|	dd�¡ W d   ƒ d S 1 s£w   Y  d S )NT)Úexist_okÚwzutf-8)Úencodingr   r™   r—   r�   z&<?xml version="1.0" encoding="utf-8"?>Ú	testsuiterm   )r6   ÚerrorsÚfailuresr—   Útestsrn   Ú	timestampÚhostnameÚ
testsuitesÚunicode)r  rÞ   Údirnamer
  r  ÚmakedirsÚopenr   rn   r4  r  r  ÚwriterV   rW   r  r    r   ÚfromtimestampÚ	isoformatÚplatformrJ   Ú_get_global_properties_noderL   r  rp   Útostring)
rH   rA  r  Úsuite_stop_timeÚsuite_time_deltaÚnumtestsÚ
suite_noder  rÏ   r?  r   r   r   Úpytest_sessionfinish‡  sH   
ÿþýüÿ
÷



"ázLogXML.pytest_sessionfinishÚterminalreporterc                 C   s   |  dd| j› �¡ d S )Nr�   zgenerated xml file: )Ú	write_sepr  )rH   rO  r   r   r   Úpytest_terminal_summary­  r‘   zLogXML.pytest_terminal_summaryr6   rM   c                 C   s&   d}t d|ƒ | j |t|ƒf¡ d S )NTr6   )rÕ   r  rL   r$   )rH   r6   rM   rÔ   r   r   r   rÙ   °  s   
zLogXML.add_global_propertyc                 C   rR   rS   )r  rV   rW   rL   rX   r   r   r   rH  µ  rZ   z"LogXML._get_global_properties_node)ræ   rw   rë   r<   Tr·   )r¸   r¹   rº   r   r    ré   rI   r   r¶   r	   r>   rÏ   rC   r  r/  r,  r0  r   r3  r5  rN  r   rQ  r»   rÙ   rV   rW   rH  r   r   r   r   r   Ð  s@    øýüûúø	
÷#U

&r·   )9Ú__doc__rï   r  rG  r!   Úxml.etree.ElementTreeÚetreeÚElementTreerV   r   Útypingr   r   r   r   r   r   r	   ræ   Ú_pytestr
   r   Ú_pytest._code.coder   r   Ú_pytest.configr   r   Ú_pytest.config.argparsingr   Ú_pytest.fixturesr   Ú_pytest.reportsr   Ú_pytest.stashr   Ú_pytest.terminalr   rÄ   r»   r    r$   r3   rf   Úcopyr>   rÇ   ÚfixturerÈ   rÍ   rÕ   rÚ   rò   rù   rû   r_   r   r   r   r   r   Ú<module>   sp    


 0ÿÿ
þ  
	 '/