U
    `»{jæc  ã                   @  sF  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  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dœdd„Z%ddœdd„Z&i Z'dddgie'd < dd!d"d#gie'd$< e'd   (¡ e'd%< e&e'd% e'd$ ƒ e'd  e'd&< G d'd(„ d(ƒZ)d)ddd*œd+d,„Z*e#j+d)d-d.œd/d0„ƒZ,e#j+d)d-d.œd1d2„ƒZ-dddd3œd4d5„Z.e#j+d6d7�d)d-d.œd8d9„ƒZ/d:dd;œd<d=„Z0d>dd?œd@dA„Z1d>dd?œdBdC„Z2ddDdEœdFdG„Z3G dHd„ dƒZ4dS )Ia  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ÚLogXMLÚobjectÚstr)ÚargÚreturnc                 C  s&   dddœ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.
    z
Match[str]r   )Úmatchobjr   c                 S  s0   t |  ¡ ƒ}|dkr d|d›�S d|d›�S d S )Néÿ   z#xZ02XZ04X)ÚordÚgroup)r   Úi© r   úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/_pytest/junitxml.pyÚrepl3   s    zbin_xml_escape.<locals>.replu    [^	
 -~Â€-íŸ¿î€€-ï¿½á€€0-áƒ¿ff])ÚreÚsubr   )r   r   Zillegal_xml_rer   r   r   Úbin_xml_escape(   s    ÿr!   ÚNone©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ÚklZvlÚkrZvrr   r   r   Úmerge_familyC   s    
r0   ÚtestcaseÚ	classnameÚnameZ_baseÚfileÚlineÚurlZ_base_legacyÚxunit1Úxunit2c                   @  s8  e Zd Zddddœdd„Zdddœd	d
„Zddddœdd„Zddddœdd„Zddœdd„Zdddœdd„Zddœdd„Z	d8dddddœdd „Z
ddd!œd"d#„Zdddd$œd%d&„Zddddd'œd(d)„Zddd!œd*d+„Zddd!œd,d-„Zddd!œd.d/„Zddd!œd0d1„Zddd!œd2d3„Zddd!œd4d5„Zddœd6d7„ZdS )9Ú_NodeReporterzstr | TestReportr   r"   )ÚnodeidÚxmlr   c                 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__z
ET.Element)Únoder   c                 C  s   | j  |j¡ | j |¡ d S r$   )r;   r>   Útagr   Úappend)rC   rE   r   r   r   rG   d   s    z_NodeReporter.appendr   r   ©r3   Úvaluer   c                 C  s   | j  t|ƒt|ƒf¡ d S r$   )rA   rG   r   r!   ©rC   r3   rI   r   r   r   Úadd_propertyh   s    z_NodeReporter.add_propertyc                 C  s   t |ƒ| jt|ƒ< d S r$   )r!   rB   r   rJ   r   r   r   Úadd_attributek   s    z_NodeReporter.add_attributeúET.Element | Noner#   c                 C  s>   | j r:t d¡}| j D ]\}}| tjd||d�¡ q|S dS ©z9Return a Junit node containing custom properties, if any.rA   Úproperty©r3   rI   N)rA   ÚETÚElementrG   ©rC   rA   r3   rI   r   r   r   Úmake_properties_noden   s    
z"_NodeReporter.make_properties_noder   )Ú
testreportr   c                 C  sâ   t |jƒ}| j}|d d… }| jjr4| d| jj¡ d |¡t|d ƒ|jd dœ}|jd d k	rtt	|jd ƒ|d< t
|dƒrˆ|j|d< || _| j |¡ | jdkr¨d S i }| jD ]$}|t| j d	 kr²| j| ||< q²|| _d S )
Néÿÿÿÿr   Ú.)r2   r3   r4   é   r5   r6   r7   r1   )Úmangle_test_addressr:   rB   r;   ÚprefixÚinsertÚjoinr!   Úlocationr   Úhasattrr6   r*   r?   Úfamilies)rC   rU   ÚnamesZexisting_attrsZ
classnamesrB   Z
temp_attrsÚkeyr   r   r   Úrecord_testreportw   s,    

ý



z_NodeReporter.record_testreportc                 C  sB   t jd| j| jd›d�}|  ¡ }|d k	r2| |¡ | | j¡ |S )Nr1   ú.3f)Útime)rQ   rR   rB   r@   rT   rG   Úextendr   )rC   r1   rA   r   r   r   Úto_xml•   s    
z_NodeReporter.to_xmlNú
str | None)rF   ÚmessageÚdatar   c                 C  s&   t j||d�}t|ƒ|_|  |¡ d S )N)rh   ©rQ   rR   r!   ÚtextrG   )rC   rF   rh   ri   rE   r   r   r   Ú_add_simple�   s    
z_NodeReporter._add_simple©Úreportr   c                 C  sÂ   | j js|jrd S |j}|j}|j}| j jdkr4d S d}| j jdkrP|  |d¡}| j jdkr~||  |d¡7 }|  ||d¡ d}| j jdkr¬||  |d	¡7 }|  ||d
¡ d}|r¾|  ||d¡ d S )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errrr   z Captured Out rs   )ú
system-errrt   rr   z Captured Err ru   )	r;   Úlog_passing_testsÚpassedZ	capstdoutZcaplogZ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rC   rn   Zcontent_outZcontent_logZcontent_errZcontent_allr   r   r   Úwrite_captured_output¢   s(    z#_NodeReporter.write_captured_output)ÚcontentÚheaderr   c                 C  s   d  | dd¡|dg¡S )NÚ
éP   ú-rp   )r\   Úcenter)rC   r|   r}   r   r   r   ry   ¹   s    z_NodeReporter._prepare_content)rn   r|   Újheaderr   c                 C  s"   t  |¡}t|ƒ|_|  |¡ d S r$   rj   )rC   rn   r|   r‚   rF   r   r   r   rz   ¼   s    

z_NodeReporter._write_contentc                 C  s   |   d¡ d S )Nrw   )r>   ©rC   rn   r   r   r   Úappend_passÁ   s    z_NodeReporter.append_passc                 C  sn   t |dƒr|  dd¡ nR|jd k	s&t‚t|jdd ƒ}|d k	rD|j}n
t|jƒ}t|ƒ}|  d|t|jƒ¡ d S )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)r^   rl   ÚlongreprÚAssertionErrorÚgetattrrh   r   r!   )rC   rn   r‡   rh   r   r   r   Úappend_failureÄ   s    
  ÿ
z_NodeReporter.append_failurec                 C  s&   |j d k	st‚|  ddt|j ƒ¡ d S )NÚerrorzcollection failure)r‰   rŠ   rl   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)rl   r   r‰   rƒ   r   r   r   Úappend_collect_skippedÙ   s    z$_NodeReporter.append_collect_skippedc                 C  sv   |j d k	st‚t|j dd ƒ}|d k	r,|j}n
t|j ƒ}|jdkrNd|› 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‹   rh   r   Úwhenrl   r!   )rC   rn   r‡   ÚreasonÚmsgr   r   r   Úappend_errorÜ   s    

z_NodeReporter.append_errorc                 C  sÆ   t |dƒrJ|j}| d¡r&|dd … }t|ƒ}tjdd|d�}|  |¡ nxt|jt	ƒsZt
‚|j\}}}| d¡r||dd … }|› d	|› d
|› �}tjddt|ƒd�}t|ƒ|_|  |¡ |  |¡ d S )Nr…   zreason: é   r†   zpytest.xfail)r)   rh   z	Skipped: é	   ú:z: zpytest.skip)r^   r…   Ú
startswithr!   rQ   rR   rG   r&   r‰   ÚtuplerŠ   rk   r{   )rC   rn   Zxfailreasonr†   ÚfilenameÚlinenoZ
skipreasonÚdetailsr   r   r   Úappend_skippedê   s(    


  ÿ

z_NodeReporter.append_skippedc                   s$   |   ¡ ‰ | j ¡  ‡ fdd„| _ d S )Nc                     s   ˆ S r$   r   r   ©ri   r   r   Ú<lambda>  ó    z(_NodeReporter.finalize.<locals>.<lambda>)rf   Ú__dict__Úclear©rC   r   rŸ   r   Úfinalize   s    
z_NodeReporter.finalize)N)Ú__name__Ú
__module__Ú__qualname__rD   rG   rK   rL   rT   rb   rf   rl   r{   ry   rz   r„   rŒ   rŽ   r�   r•   rž   r¥   r   r   r   r   r9   Y   s$   
	r9   r   )ÚrequestÚfixture_namer   c                 C  sP   ddl m} | jj td¡}|dk	rL|jdkrL| j ||› d|j› d�ƒ¡ dS )z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )ÚPytestWarningN)r7   Úlegacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	Ú_pytest.warning_typesr«   ÚconfigÚstashÚgetÚxml_keyr?   rE   Úwarn)r©   rª   r«   r;   r   r   r   Ú!_warn_incompatibility_with_xunit2  s    ÿÿr³   zCallable[[str, object], None])r©   r   c                   s$   t ˆ dƒ ddddœ‡ 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_propertyr   r   r"   rH   c                   s   ˆ j j | |f¡ d S r$   )rE   Úuser_propertiesrG   rP   ©r©   r   r   Úappend_property(  s    z(record_property.<locals>.append_property)r³   )r©   r·   r   r¶   r   r´     s    
r´   c                 C  sl   ddl m} | j |dƒ¡ t| dƒ ddddœd	d
„}|}| jj td¡}|dk	rh| 	| 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   r   r"   rH   c                 S  s   d S r$   r   rP   r   r   r   Úadd_attr_noop>  s    z+record_xml_attribute.<locals>.add_attr_noopN)r­   r¸   rE   r²   r³   r®   r¯   r°   r±   Únode_reporterr:   rL   )r©   r¸   rº   Z	attr_funcr;   r»   r   r   r   r¹   .  s    ÿ
r¹   )ÚparamÚvr   c                 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(   Úformatr)   r¦   )r¼   r½   Ú__tracebackhide__r”   r   r   r   Ú_check_record_param_typeK  s    
rÁ   Úsession)Úscopec                 C  s8   d}ddddœdd„}| j j td¡}|dk	r4|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   r   r"   rH   c                 S  s   d}t d| ƒ dS )zFNo-op function in case --junit-xml was not passed in the command-line.Tr3   N)rÁ   )r3   rI   rÀ   r   r   r   Úrecord_funcp  s    z.record_testsuite_property.<locals>.record_funcN)r®   r¯   r°   r±   Úadd_global_property)r©   rÀ   rÄ   r;   r   r   r   Úrecord_testsuite_propertyT  s    rÆ   r   )Úparserr   c              
   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|allro   Ú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|xunit2r8   )ZgetgroupZ	addoptionÚ	functoolsÚpartialr   Zaddini)rÇ   r   r   r   r   Úpytest_addoption{  sZ    
ø
ú  ÿüüýýrÛ   r   )r®   r   c              
   C  sl   | j j}|rht| dƒsh|  d¡}t|| j j|  d¡|  d¡|  d¡||  d¡ƒ| jt< | j 	| jt ¡ d S )NZworkerinputrØ   rÑ   rÓ   rÖ   rÔ   )
ÚoptionrÉ   r^   Zgetinir   Z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 r$   )r¯   r°   r±   rÝ   Ú
unregister)r®   r;   r   r   r   Úpytest_unconfigure»  s    rá   z	list[str])Úaddressr   c                 C  s^   |   d¡\}}}| d¡}|d  tjd¡|d< t dd|d ¡|d< |d  || 7  < |S )Nú[z::r   rW   z\.py$rp   rV   )Ú	partitionÚsplitÚreplacer   ZSEPr   r    )râ   rÊ   Zpossible_open_bracketÚparamsr`   r   r   r   rY   Â  s    
rY   c                   @  sò   e Zd Zd5dddddd	d
œdd„Zdd	dœdd„Zdddœdd„Zdd	dœdd„Zdddœdd„Zdd	dœdd„Zdd	dœdd„Z	dd	dœdd„Z
d d	d!œd"d#„Zd	d$œd%d&„Zd	d$œd'd(„Zd)d	d*œd+d,„Zdd-d	d.œd/d0„Zd1d$œd2d3„Zd4S )6r   rÒ   ro   r×   r7   Trg   r   rÕ   r"   )rZ   Ú
suite_namerx   Úreport_durationrv   r   c                 C  s–   t j t j |¡¡}t j t j |¡¡| _|| _|| _|| _	|| _
|| _|| _t ddddgd¡| _i | _g | _g | _g | _d| _| jdkr’d| _d S )Nr�   rw   rˆ   r†   r   r¬   r7   )ÚosrÊ   Ú
expanduserÚ
expandvarsÚnormpathÚabspathÚlogfilerZ   rè   rx   rv   ré   r?   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rC   rï   rZ   rè   rx   ré   r?   rv   r   r   r   rD   Î  s&    

 ÿ
zLogXML.__init__r   rm   c                 C  s\   t |d|ƒ}t |dd ƒ}| j ||f¡}|jD ]\}}| |t|ƒ¡ q.|d k	rX| ¡  d S ©Nr:   rE   )r‹   ró   Úpoprµ   rK   r   r¥   )rC   rn   r:   Ú
workernodeÚreporterZpropnameZ	propvaluer   r   r   r¥   ï  s    zLogXML.finalizezTestReport | strr9   c                 C  sX   t |d|ƒ}t |dd ƒ}||f}|| jkr4| j| S t|| ƒ}|| j|< | j |¡ |S rø   )r‹   ró   r9   rô   rG   )rC   rn   r:   rú   ra   rû   r   r   r   r»   û  s    



zLogXML.node_reporter)ra   r   c                 C  s    || j kr| j |  d7  < d S )NrX   )rò   )rC   ra   r   r   r   r>     s    
zLogXML.add_statsc                 C  s   |   |¡}| |¡ |S r$   )r»   rb   ©rC   rn   rû   r   r   r   Ú_opentestcase  s    

zLogXML._opentestcasec                   sn  d}ˆ j r*ˆ jdkrî|  ˆ ¡}| ˆ ¡ nÄˆ jrÔˆ jdkrŒtˆ ddƒ‰tˆ ddƒ‰t‡ ‡‡fdd„| jD ƒdƒ}|rŒ|  |¡ |  j	d7  _	|  ˆ ¡}ˆ jdkrÈ| 
ˆ ¡ | j ˆ ¡ | jsÒ| ˆ ¡ qî| ˆ ¡ nˆ jrî|  ˆ ¡}| ˆ ¡ |  ˆ ¡ ˆ jdk�rj|  ˆ ¡}| ˆ ¡ |  ˆ ¡ tˆ ddƒ‰tˆ ddƒ‰t‡ ‡‡fd	d„| jD ƒdƒ}|�rj| j |¡ 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  s>   | ]6}|j ˆ j krt|d dƒˆkrt|ddƒˆkr|V  qdS ©r   Nrÿ   ©r:   r‹   ©Ú.0Úrep©rn   Z	report_iiZ
report_widr   r   Ú	<genexpr>8  s
   ûz2LogXML.pytest_runtest_logreport.<locals>.<genexpr>rX   c                 3  s>   | ]6}|j ˆ j krt|d dƒˆkrt|ddƒˆkr|V  qdS r  r  r  r  r   r   r  ]  s
   û)rw   r’   rý   r„   Úfailedr‹   Únextrö   r¥   r÷   rŒ   rG   rv   r{   r•   r†   rž   Úupdate_testcase_durationÚremove)rC   rn   Zclose_reportrû   r   r  r   Úpytest_runtest_logreport  sV    


þ	ö









þ	özLogXML.pytest_runtest_logreportc                 C  s4   | j d|jhkr0|  |¡}| jt|ddƒ7  _dS )zƒAccumulate total duration for nodeid from given report and update
        the Junit.testcase with the new total if already created.r×   r@   r<   N)ré   r’   r»   r@   r‹   rü   r   r   r   r
  k  s    
zLogXML.update_testcase_durationc                 C  s0   |j s,|  |¡}|jr"| |¡ n
| |¡ d S r$   )rw   rý   r  rŽ   r�   rü   r   r   r   Úpytest_collectreportr  s
    
zLogXML.pytest_collectreportr	   )Úexcreprr   c                 C  s0   |   d¡}|jjddd� | ddt|ƒ¡ d S )NZinternalrÒ   )r2   r3   r�   zinternal error)r»   rB   r*   rl   r   )rC   r  rû   r   r   r   Úpytest_internalerrorz  s    
zLogXML.pytest_internalerrorr#   c                 C  s   t  ¡ | _d S r$   )r   rd   Úsuite_start_timer¤   r   r   r   Úpytest_sessionstart  s    zLogXML.pytest_sessionstartc           
      C  sH  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j¡ ¡  ¡ t ¡ d�	}|  ¡ }|d k	rø| |¡ | jD ]}| | ¡ ¡ qþt d¡}	|	 |¡ | tj|	dd�¡ W 5 Q R X d S )NT)Úexist_okÚwzutf-8)Úencodingrw   rˆ   r†   r�   z&<?xml version="1.0" encoding="utf-8"?>Z	testsuiterc   )r3   ÚerrorsZfailuresr†   Ztestsrd   Ú	timestampÚhostnameÚ
testsuitesÚunicode)rê   rÊ   Údirnamerî   rï   ÚmakedirsÚopenr   rd   r  rò   r÷   ÚwriterQ   rR   rè   r   r   Úfromtimestampr   ÚutcÚ
astimezoneÚ	isoformatÚplatformrE   Ú_get_global_properties_noderG   rô   rf   Útostring)
rC   r  rï   Zsuite_stop_timeZsuite_time_deltaZnumtestsZ
suite_noderõ   r»   r  r   r   r   Úpytest_sessionfinish‚  sF    
ÿþýüÿ
õ



zLogXML.pytest_sessionfinishr   )Úterminalreporterr   c                 C  s   |  dd| j› �¡ d S )Nr€   zgenerated xml file: )Z	write_seprï   )rC   r&  r   r   r   Úpytest_terminal_summaryª  s    zLogXML.pytest_terminal_summaryr   rH   c                 C  s&   d}t d|ƒ | j |t|ƒf¡ d S )NTr3   )rÁ   rõ   rG   r!   )rC   r3   rI   rÀ   r   r   r   rÅ   ­  s    
zLogXML.add_global_propertyrM   c                 C  s>   | j r:t d¡}| j D ]\}}| tjd||d�¡ q|S dS rN   )rõ   rQ   rR   rG   rS   r   r   r   r#  ²  s    
z"LogXML._get_global_properties_nodeN)rÒ   ro   r×   r7   T)r¦   r§   r¨   rD   r¥   r»   r>   rý   r  r
  r  r  r  r%  r'  rÅ   r#  r   r   r   r   r   Í  s&        ø!U()5Ú__doc__Ú
__future__r   r   r   rÙ   rê   r"  r   Útypingr   r   Zxml.etree.ElementTreeÚetreeZElementTreerQ   Z_pytestr   r   Z_pytest._code.coder	   r
   Z_pytest.configr   r   Z_pytest.config.argparsingr   Z_pytest.fixturesr   Z_pytest.reportsr   Z_pytest.stashr   Z_pytest.terminalr   rÒ   r±   r!   r0   r_   Úcopyr9   r³   Zfixturer´   r¹   rÁ   rÆ   rÛ   rß   rá   rY   r   r   r   r   r   Ú<module>   s\   	

 0	
&/