a
    *ñ»jÿ+  ã                   @  s  d Z ddlmZ ddlmZ ddlZddlZddlmZ ddl	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 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*e+e,e-f  ƒ Z.ed Z/eej0G dd„ dƒƒƒZ1dd œd!d"„Z2d#d$d%œd&d'„Z3d(d$d)œd*d+„Z4e!d,d-�d.dd/œd0d1„ƒZ5d.dd2d3œd4d5„Z6e!d.dd6d7œd8d9„ƒZ7d:d;œd<d=„Z8ed>d>d?�d@dAdBœdCdD„ƒZ9dS )Ez>Support for providing temporary directories to test functions.é    )Úannotations)Ú	GeneratorN)ÚPath)Úrmtree)ÚAny)Úfinal)ÚLiteralé   )Úcleanup_dead_symlinks)ÚLOCK_TIMEOUT)Úmake_numbered_dir)Úmake_numbered_dir_with_cleanup)Úrm_rf)Úget_user_id)ÚConfig)ÚExitCode)Úhookimpl)ÚParser)Úcheck_ispytest)Úfixture)ÚFixtureRequest)ÚMonkeyPatch)ÚItem)Ú
TestReport)ÚStashKey©ÚallÚfailedÚnonec                	   @  s¨   e Zd ZU dZded< ded< ded< ded< d	ed
< d#ddœddd	ddddœdd„Zeddœddd dœdd„ƒZdddœdd„Zd$ddddœdd„Z	dd œd!d"„Z
dS )%ÚTempPathFactoryz“Factory for temporary directories under the common base temp directory,
    as discussed at :ref:`temporary directory location and retention`.
    zPath | NoneÚ_given_basetempr   Ú_traceÚ	_basetempÚintÚ_retention_countÚRetentionTypeÚ_retention_policyNF©Ú	_ispytestÚboolÚNone)Úgiven_basetempÚretention_countÚretention_policyÚbasetempr(   Úreturnc                C  sJ   t |ƒ |d u rd | _nttj t|ƒ¡ƒ| _|| _|| _|| _	|| _
d S ©N)r   r    r   ÚosÚpathÚabspathÚstrr!   r$   r&   r"   )Úselfr+   r,   r-   Útracer.   r(   © r7   ú4E:\soccer\ml_env\Lib\site-packages\_pytest/tmpdir.pyÚ__init__6   s    
zTempPathFactory.__init__r   )Úconfigr(   r/   c                C  sn   t |ƒ t| d¡ƒ}|dk r.td|› d�ƒ‚| d¡}|dvrPtd|› d�ƒ‚| |jj|j d¡||d	d
�S )zTCreate a factory according to pytest configuration.

        :meta private:
        Útmp_path_retention_countr   z6tmp_path_retention_count must be >= 0. Current input: Ú.Útmp_path_retention_policyr   zKtmp_path_retention_policy must be either all, failed, none. Current input: ZtmpdirT)r+   r6   r,   r-   r(   )r   r#   ZgetiniÚ
ValueErrorÚoptionr.   r6   Úget)Úclsr:   r(   ÚcountÚpolicyr7   r7   r8   Úfrom_configM   s$    
ÿ

ÿ
ûzTempPathFactory.from_configr4   )Úbasenamer/   c                 C  s8   t j |¡}|  ¡ |  ¡ j|  ¡ kr4t|› d�ƒ‚|S )Nz& is not a normalized and relative path)r1   r2   ÚnormpathÚgetbasetempÚresolveÚparentr>   )r5   rE   r7   r7   r8   Ú_ensure_relative_to_basetempm   s    z,TempPathFactory._ensure_relative_to_basetempTr   )rE   Únumberedr/   c                 C  sL   |   |¡}|s*|  ¡  |¡}|jdd� nt|  ¡ |dd�}|  d|¡ |S )a  Create a new temporary directory managed by the factory.

        :param basename:
            Directory base name, must be a relative path.

        :param numbered:
            If ``True``, ensure the directory is unique by adding a numbered
            suffix greater than any existing one: ``basename="foo-"`` and ``numbered=True``
            means that this function will create directories named ``"foo-0"``,
            ``"foo-1"``, ``"foo-2"`` and so on.

        :returns:
            The path to the new directory.
        éÀ  ©Úmode)ÚrootÚprefixrN   Úmktemp)rJ   rG   ÚjoinpathÚmkdirr   r!   )r5   rE   rK   Úpr7   r7   r8   rQ   s   s    
zTempPathFactory.mktemp©r/   c           	      C  sb  | j dur| j S | jdurF| j}| ¡ r0t|ƒ |jdd� | ¡ }nôtj d¡}t	|p^t
 ¡ ƒ ¡ }tƒ pnd}| d|› �¡}z|jddd� W n* ty¼   | d	¡}|jddd� Y n0 tƒ }|du�r| ¡ }|j|krðtd
|› d�ƒ‚|jd@ dk�rt ||jd@ ¡ | j}| jdk�r(d}td||tdd�}|du�sLJ |ƒ‚|| _ |  d|¡ |S )z�Return the base temporary directory, creating it if needed.

        :returns:
            The base temporary directory.
        NrL   rM   ZPYTEST_DEBUG_TEMPROOTÚunknownz
pytest-of-T)rN   Úexist_okzpytest-of-unknownzThe temporary directory z: is not owned by the current user. Fix this and try again.é?   r   iÀÿÿÿr   zpytest-)rP   rO   ÚkeepZlock_timeoutrN   znew basetemp)r"   r    Úexistsr   rS   rH   r1   Úenvironr@   r   ÚtempfileÚ
gettempdirÚget_userrR   ÚOSErrorr   ÚstatÚst_uidÚst_modeÚchmodr$   r&   r   r   r!   )	r5   r.   Zfrom_envZtemprootÚuserÚrootdirÚuidZrootdir_statrY   r7   r7   r8   rG   ‹   sP    







ÿûzTempPathFactory.getbasetemp)N)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r9   ÚclassmethodrD   rJ   rQ   rG   r7   r7   r7   r8   r   (   s    
 úøür   z
str | NonerU   c               
   C  s2   zddl } |  ¡ W S  tttfy,   Y dS 0 dS )zlReturn the current user name, or None if getuser() does not work
    in the current environment (see #1010).r   N)ÚgetpassÚgetuserÚImportErrorr_   ÚKeyError)rm   r7   r7   r8   r^   Ç   s
    
r^   r   r*   )r:   r/   c                 C  s6   t ƒ }|  |j¡ tj| dd�}|j| d|dd� dS )a  Create a TempPathFactory and attach it to the config object.

    This is to comply with existing plugins which expect the handler to be
    available at pytest_configure time, but ideally should be moved entirely
    to the tmp_path_factory session fixture.
    Tr'   Ú_tmp_path_factoryF)ZraisingN)r   Zadd_cleanupZundor   rD   Úsetattr)r:   Úmprq   r7   r7   r8   Úpytest_configureÓ   s    rt   r   )Úparserr/   c                 C  s$   | j dddd� | j dddd� d S )Nr;   zfHow many sessions should we keep the `tmp_path` directories, according to `tmp_path_retention_policy`.é   )ÚhelpÚdefaultr=   zvControls which directories created by the `tmp_path` fixture are kept around, based on test outcome. (all/failed/none)r   )Zaddini)ru   r7   r7   r8   Úpytest_addoptionà   s    ýüry   Úsession)Úscoper   )Úrequestr/   c                 C  s   | j jS )zGReturn a :class:`pytest.TempPathFactory` instance for the test session.)r:   rq   )r|   r7   r7   r8   Útmp_path_factoryï   s    r}   r   )r|   Úfactoryr/   c                 C  s4   | j j}t dd|¡}d}|d |… }|j|dd�S )Nz[\W]Ú_é   T)rK   )ÚnodeÚnameÚreÚsubrQ   )r|   r~   r‚   ZMAXVALr7   r7   r8   Ú_mk_tmpö   s
    r…   zGenerator[Path])r|   r}   r/   c                 c  sP   t | |ƒ}|V  |j}| jjt }|dkrB| dd¡rBt|dd� | jjt= dS )a;  Return a temporary directory (as :class:`pathlib.Path` object)
    which is unique to each test function invocation.
    The temporary directory is created as a subdirectory
    of the base temporary directory, with configurable retention,
    as discussed in :ref:`temporary directory location and retention`.
    r   ÚcallT©Úignore_errorsN)r…   r&   r�   ÚstashÚtmppath_result_keyr@   r   )r|   r}   r2   rC   Zresult_dictr7   r7   r8   Útmp_pathþ   s    

r‹   zint | ExitCode)Ú
exitstatusc                 C  sb   | j j}|j}|du rdS |j}|dkrN|dkrN|jdu rN| ¡ rNt|dd� | ¡ r^t|ƒ dS )z�After each session, remove base directory if all the tests passed,
    the policy is "failed", and the basetemp is not specified by a user.
    Nr   r   Tr‡   )r:   rq   r"   r&   r    Úis_dirr   r
   )rz   rŒ   r}   r.   rC   r7   r7   r8   Úpytest_sessionfinish  s    ÿþýrŽ   T)ÚwrapperZtryfirstr   z'Generator[None, TestReport, TestReport])Úitemr/   c                 c  s2   d V }|j d usJ ‚i }|j| j t|¡|j < |S r0   )ÚwhenZpassedr‰   Ú
setdefaultrŠ   )r�   r†   ÚrepÚemptyr7   r7   r8   Úpytest_runtest_makereport0  s
    r•   ):rj   Ú
__future__r   Úcollections.abcr   Údataclassesr1   Úpathlibr   rƒ   Úshutilr   r\   Útypingr   r   r   r
   r   r   r   r   Z_pytest.compatr   Z_pytest.configr   r   r   Z_pytest.config.argparsingr   Z_pytest.deprecatedr   Z_pytest.fixturesr   r   Z_pytest.monkeypatchr   Z_pytest.nodesr   Z_pytest.reportsr   Z_pytest.stashr   Údictr4   r)   rŠ   r%   Ú	dataclassr   r^   rt   ry   r}   r…   r‹   rŽ   r•   r7   r7   r7   r8   Ú<module>   sZ    
