a
    *ñ»jac  ã                   @  s  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
  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#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$„ d$ƒZ&d%ddd&œd'd(„Z'e j(d%d)d*œd+d,„ƒZ)e j(d%d)d*œd-d.„ƒZ*dddd/œd0d1„Z+e j(d2d3�d%d)d*œd4d5„ƒZ,d6dd7œd8d9„Z-d:dd;œd<d=„Z.d:dd;œd>d?„Z/dd@dAœdBdC„Z0G dDd„ dƒZ1dS )Ea  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Ú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re.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   ú6E:\soccer\ml_env\Lib\site-packages\_pytest/junitxml.pyÚrepl0   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_family@   s    
r-   ÚtestcaseÚ	classnameÚname)ÚfileÚlineÚurl)Ú_baseÚ_base_legacyr4   Úxunit1r5   Ú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)Úselfr9   r:   r   r   r   Ú__init__W   s    

z_NodeReporter.__init__z
ET.Element)Únoder   c                 C  s   | j  |j¡ | j |¡ d S r!   )r:   r=   Útagr   Úappend)rB   rD   r   r   r   rF   a   s    z_NodeReporter.appendr   r   ©r0   Úvaluer   c                 C  s   | j  t|ƒt|ƒf¡ d S r!   )r@   rF   r   r   ©rB   r0   rH   r   r   r   Úadd_propertye   s    z_NodeReporter.add_propertyc                 C  s   t |ƒ| jt|ƒ< d S r!   )r   rA   r   rI   r   r   r   Úadd_attributeh   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.r@   Úproperty©r0   rH   N)r@   ÚETÚElementrF   ©rB   r@   r0   rH   r   r   r   Úmake_properties_nodek   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 urtt	|jd ƒ|d< t
|dƒrˆ|j|d< || _| j |¡ | jdkr¨d S i }| jD ]$}|t| j d	 v r²| j| ||< q²|| _d S )
Néÿÿÿÿr   Ú.)r/   r0   r1   é   r2   r3   r6   r.   )Úmangle_test_addressr9   rA   r:   ÚprefixÚinsertÚjoinr   Úlocationr   Úhasattrr3   r'   r>   Úfamilies)rB   rT   ÚnamesZexisting_attrsZ
classnamesrA   Z
temp_attrsÚkeyr   r   r   Úrecord_testreportt   s,    

ý



z_NodeReporter.record_testreportc                 C  sB   t jd| j| jd›d�}|  ¡ }|d ur2| |¡ | | j¡ |S )Nr.   ú.3f)Útime)rP   rQ   rA   r?   rS   rF   Úextendr   )rB   r.   r@   r   r   r   Úto_xml’   s    
z_NodeReporter.to_xmlNú
str | None)rE   ÚmessageÚdatar   c                 C  s&   t j||d�}t|ƒ|_|  |¡ d S )N)rg   ©rP   rQ   r   ÚtextrF   )rB   rE   rg   rh   rD   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v rP|  |d¡}| j jdv r~||  |d¡7 }|  ||d¡ d}| j jdv r¬||  |d	¡7 }|  ||d
¡ d}|r¾|  ||d¡ d S )NÚnoÚ )ÚlogÚallz Captured Log )ú
system-outúout-errrq   z Captured Out rr   )ú
system-errrs   rq   z Captured Err rt   )	r:   Úlog_passing_testsÚpassedZ	capstdoutZcaplogZ	capstderrÚloggingÚ_prepare_contentÚ_write_content)rB   rm   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   ú-ro   )r[   Úcenter)rB   r{   r|   r   r   r   rx   ¶   s    z_NodeReporter._prepare_content)rm   r{   Újheaderr   c                 C  s"   t  |¡}t|ƒ|_|  |¡ d S r!   ri   )rB   rm   r{   r�   rE   r   r   r   ry   ¹   s    

z_NodeReporter._write_contentc                 C  s   |   d¡ d S )Nrv   )r=   ©rB   rm   r   r   r   Úappend_pass¾   s    z_NodeReporter.append_passc                 C  sn   t |dƒr|  dd¡ nR|jd us&J ‚t|jdd ƒ}|d urD|j}n
t|jƒ}t|ƒ}|  d|t|jƒ¡ d S )NÚwasxfailÚskippedz%xfail-marked test passes unexpectedlyÚ	reprcrashÚfailure)r]   rk   ÚlongreprÚgetattrrg   r   r   )rB   rm   r†   rg   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ˆ   rk   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)rk   r   rˆ   r‚   r   r   r   Úappend_collect_skippedÖ   s    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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‰   rg   r   Úwhenrk   r   )rB   rm   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	ƒsZJ ‚|j\}}}| d¡r||dd … }|› d	|› d
|› �}tjddt|ƒd�}t|ƒ|_
|  |¡ |  |¡ d S )Nr„   zreason: é   r…   zpytest.xfail)r&   rg   z	Skipped: é	   ú:z: zpytest.skip)r]   r„   Ú
startswithr   rP   rQ   rF   r#   rˆ   Útuplerj   rz   )rB   rm   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   ©rh   r   r   Ú<lambda>  ó    z(_NodeReporter.finalize.<locals>.<lambda>)re   Ú__dict__Úclear©rB   r   r�   r   Úfinalizeý   s    
z_NodeReporter.finalize)N)Ú__name__Ú
__module__Ú__qualname__rC   rF   rJ   rK   rS   ra   re   rk   rz   rx   ry   rƒ   rŠ   rŒ   r�   r“   rœ   r£   r   r   r   r   r8   V   s$   
	r8   r   )ÚrequestÚfixture_namer   c                 C  sP   ddl m} | jj td¡}|durL|jdvrL| j ||› d|j› d�ƒ¡ dS )z[Emit a PytestWarning about the given fixture being incompatible with newer xunit revisions.r   )ÚPytestWarningN)r6   Úlegacyz$ is incompatible with junit_family 'z' (use 'legacy' or 'xunit1'))	Ú_pytest.warning_typesr©   ÚconfigÚstashÚgetÚxml_keyr>   rD   Ú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   rG   c                   s   ˆ j j | |f¡ d S r!   )rD   Úuser_propertiesrF   rO   ©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u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   rG   c                 S  s   d S r!   r   rO   r   r   r   Úadd_attr_noop;  s    z+record_xml_attribute.<locals>.add_attr_noopN)r«   r¶   rD   r°   r±   r¬   r­   r®   r¯   Únode_reporterr9   rK   )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_typeH  s    
r¿   Úsession)Úscopec                 C  s8   d}ddddœdd„}| j j td¡}|du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   rG   c                 S  s   d}t d| ƒ dS )zFNo-op function in case --junit-xml was not passed in the command-line.Tr0   N)r¿   )r0   rH   r¾   r   r   r   Úrecord_funcm  s    z.record_testsuite_property.<locals>.record_funcN)r¬   r­   r®   r¯   Úadd_global_property)r§   r¾   rÂ   r:   r   r   r   Úrecord_testsuite_propertyQ  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|allrn   Ú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|xunit2r7   )ZgetgroupZ	addoptionÚ	functoolsÚpartialr	   Zaddini)rÅ   r   r   r   r   Úpytest_addoptionx  sV    
ø
úÿüüýý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   rV   z\.py$ro   rU   )Ú	partitionÚsplitÚreplacer   ZSEPr   r   )rà   rÈ   Zpossible_open_bracketÚparamsr_   r   r   r   rX   ¿  s    
rX   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Ð   rn   rÕ   r6   Trf   r   rÓ   r   )rY   Ú
suite_namerw   Úreport_durationru   r   c                 C  s’   t j t j |¡¡}t j t j |¡¡| _|| _|| _|| _	|| _
|| _|| _t g d¢d¡| _i | _g | _g | _g | _d| _| jdkrŽd| _d S )N)r‹   rv   r‡   r…   r   rª   r6   )ÚosrÈ   Ú
expanduserÚ
expandvarsÚnormpathÚabspathÚlogfilerY   ræ   rw   ru   rç   r>   ÚdictÚfromkeysÚstatsÚnode_reportersÚnode_reporters_orderedÚglobal_propertiesÚopen_reportsÚcnt_double_fail_tests)rB   rí   rY   ræ   rw   rç   r>   ru   r   r   r   rC   Ë  s$    
ÿ
zLogXML.__init__r   rl   c                 C  s\   t |d|ƒ}t |dd ƒ}| j ||f¡}|jD ]\}}| |t|ƒ¡ q.|d urX| ¡  d S ©Nr9   rD   )r‰   rñ   Úpopr³   rJ   r   r£   )rB   rm   r9   Ú
workernodeÚreporterZpropnameZ	propvaluer   r   r   r£   ì  s    zLogXML.finalizezTestReport | strr8   c                 C  sX   t |d|ƒ}t |dd ƒ}||f}|| jv r4| j| S t|| ƒ}|| j|< | j |¡ |S rö   )r‰   rñ   r8   rò   rF   )rB   rm   r9   rø   r`   rù   r   r   r   r¹   ø  s    



zLogXML.node_reporter)r`   r   c                 C  s    || j v r| j |  d7  < d S )NrW   )rð   )rB   r`   r   r   r   r=   
  s    
zLogXML.add_statsc                 C  s   |   |¡}| |¡ |S r!   )r¹   ra   ©rB   rm   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ý   ©r9   r‰   ©Ú.0Úrep©rm   Z	report_iiZ
report_widr   r   Ú	<genexpr>5  s
   ûz2LogXML.pytest_runtest_logreport.<locals>.<genexpr>rW   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  Z  s
   û)rv   r�   rû   rƒ   Úfailedr‰   Únextrô   r£   rõ   rŠ   rF   ru   rz   r“   r…   rœ   Úupdate_testcase_durationÚremove)rB   rm   Zclose_reportrù   r   r  r   Úpytest_runtest_logreport  sV    


þ	ö









þ	özLogXML.pytest_runtest_logreportc                 C  s4   | j d|jhv 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  h  s    
zLogXML.update_testcase_durationc                 C  s0   |j s,|  |¡}|jr"| |¡ n
| |¡ d S r!   )rv   rû   r  rŒ   r�   rú   r   r   r   Úpytest_collectreporto  s
    
zLogXML.pytest_collectreportr   )Úexcreprr   c                 C  s0   |   d¡}|jjddd� | ddt|ƒ¡ d S )NZinternalrÐ   )r/   r0   r‹   zinternal error)r¹   rA   r'   rk   r   )rB   r  rù   r   r   r   Úpytest_internalerrorw  s    
zLogXML.pytest_internalerrorr    c                 C  s   t  ¡ | _d S r!   )r   ZInstantÚsuite_startr¢   r   r   r   Úpytest_sessionstart|  s    zLogXML.pytest_sessionstartc           	      C  s^  t j t j | j¡¡}t j|dd� t| jddd���}| 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|ƒ|jd›| j ¡  ¡  ¡ t ¡ d�	}|  ¡ }|d urì| |¡ | jD ]}| | ¡ ¡ qòt d¡}| dd¡ | |¡ | tj|dd�¡ W d   ƒ n1 �sP0    Y  d S )NT)Úexist_okÚwzutf-8)Úencodingrv   r‡   r…   r‹   z&<?xml version="1.0" encoding="utf-8"?>Z	testsuiterb   )r0   ÚerrorsZfailuresr…   Ztestsrc   Ú	timestampÚhostnameÚ
testsuitesr0   zpytest testsÚunicode)rè   rÈ   Údirnamerì   rí   ÚmakedirsÚopenr  Úelapsedrð   rõ   ÚwriterP   rQ   ræ   r   ÚsecondsZas_utcÚ
astimezoneÚ	isoformatÚplatformrD   Ú_get_global_properties_noderF   rò   re   ÚsetZtostring)	rB   r  rí   r?   Z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í   )rB   r$  r   r   r   Úpytest_terminal_summary¥  s    zLogXML.pytest_terminal_summaryr   rG   c                 C  s&   d}t d|ƒ | j |t|ƒf¡ d S )NTr0   )r¿   ró   rF   r   )rB   r0   rH   r¾   r   r   r   rÃ   ¨  s    
zLogXML.add_global_propertyrL   c                 C  s>   | j r:t d¡}| j D ]\}}| tjd||d�¡ q|S dS rM   )ró   rP   rQ   rF   rR   r   r   r   r!  ­  s    
z"LogXML._get_global_properties_nodeN)rÐ   rn   rÕ   r6   T)r¤   r¥   r¦   rC   r£   r¹   r=   rû   r
  r  r  r  r  r#  r%  rÃ   r!  r   r   r   r   r   Ê  s&        ø!U&)2Ú__doc__Ú
__future__r   Úcollections.abcr   r×   rè   r   r   Zxml.etree.ElementTreeÚetreeZElementTreerP   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   r-   r^   Úcopyr8   r±   Zfixturer²   r·   r¿   rÄ   rÙ   rÝ   rß   rX   r   r   r   r   r   Ú<module>   sV   	


þ 0	
&/