a
    !f-                     @   sH  d 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
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rddlmZ ed 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!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   Z0e!ej1G dd  d Z2ee. d!d"d#Z3e$dd$d%d&Z4edd'd(d)Z5e*d*d+e+e2d,d-d.Z6e+e2ed/d0d1Z7e*e+e2eeddf d2d3d4Z8ee9e%f d5d6d7Z:e&d8d8d9ed:d;d<Z;dS )=z>Support for providing temporary directories to test functions.    N)Path)rmtree)Any)Dict)	Generator)Optional)TYPE_CHECKING)Union)Item)CollectReport)StashKey)Literalallfailednone)Parser   )LOCK_TIMEOUT)make_numbered_dir)make_numbered_dir_with_cleanup)rm_rf)cleanup_dead_symlinks)finalget_user_id)Config)ExitCode)hookimpl)check_ispytest)fixture)FixtureRequest)MonkeyPatchc                	   @   s   e Zd ZU dZee ed< eed< ee ed< eed< ded< dd	d
ee edee e	ddddZ
ed	d
ee	d dddZeedddZdee	edddZedddZdS )TempPathFactoryzFactory for temporary directories under the common base temp directory.

    The base directory can be configured using the ``--basetemp`` option.
    _given_basetemp_trace	_basetemp_retention_countRetentionType_retention_policyNF	_ispytest)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   O/var/www/html/python-backend/venv/lib/python3.9/site-packages/_pytest/tmpdir.py__init__;   s    
zTempPathFactory.__init__)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   intZgetini
ValueErroroptionr.   r6   get)clsr:   r*   countpolicyr7   r7   r8   from_configR   s$    



zTempPathFactory.from_config)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   rF   r7   r7   r8   _ensure_relative_to_basetempr   s    z,TempPathFactory._ensure_relative_to_basetempT)rF   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prefixrO   mktemp)rK   rH   joinpathmkdirr   r$   )r5   rF   rL   pr7   r7   r8   rR   x   s    
zTempPathFactory.mktempr/   c           	      C   sb  | j dur| j S | jdurF| j}| r0t| |jdd | }nt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rt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 )zReturn the base temporary directory, creating it if needed.

        :returns:
            The base temporary directory.
        NrM   rN   ZPYTEST_DEBUG_TEMPROOTunknownz
pytest-of-T)rO   exist_okzpytest-of-unknownzThe temporary directory z: is not owned by the current user. Fix this and try again.?   r   ir   zpytest-)rQ   rP   keepZlock_timeoutrO   znew basetemp)r%   r#   existsr   rT   rI   r1   environrA   r   tempfile
gettempdirget_userrS   OSErrorr   statst_uidst_modechmodr&   r(   r   r   r$   )	r5   r.   Zfrom_envZtemprootuserrootdiruidZrootdir_statrZ   r7   r7   r8   rH      sP    







zTempPathFactory.getbasetemp)N)T)__name__
__module____qualname____doc__r   r   __annotations__r   r>   boolr9   classmethodr   rE   r4   rK   rR   rH   r7   r7   r7   r8   r"   ,   s6   
 r"   rV   c               	   C   s0   zddl } |  W S  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ImportErrorKeyError)ro   r7   r7   r8   r_      s
    
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"   rE   setattr)r:   mprs   r7   r7   r8   pytest_configure   s    rv   )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)rw   r7   r7   r8   pytest_addoption   s    r{   session)scope)requestr/   c                 C   s   | j jS )zGReturn a :class:`pytest.TempPathFactory` instance for the test session.)r:   rs   )r~   r7   r7   r8   tmp_path_factory   s    r   )r~   factoryr/   c                 C   s4   | j j}tdd|}d}|d | }|j|ddS )Nz[\W]_   T)rL   )nodenameresubrR   )r~   r   r   ZMAXVALr7   r7   r8   _mk_tmp   s
    r   )r~   r   r/   c                 c   sZ   t | |}|V  | jjj}|j}| jjt }|dkrL|ddrLt	|dd | jjt= dS )aU  Return a temporary directory path object which is unique to each test
    function invocation, created as a sub directory of the base temporary
    directory.

    By default, a new base temporary directory is created each test session,
    and old bases are removed after 3 sessions, to aid in debugging.
    This behavior can be configured with :confval:`tmp_path_retention_count` and
    :confval:`tmp_path_retention_policy`.
    If ``--basetemp`` is used then it is cleared each session. See :ref:`base
    temporary directory`.

    The returned object is a :class:`pathlib.Path` object.
    r   callTignore_errorsN)
r   r|   r:   rs   r(   r   stashtmppath_result_keyrA   r   )r~   r   r2   rD   Zresult_dictr7   r7   r8   tmp_path  s    

r   )
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 )zAfter 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:   rs   r%   r(   r#   is_dirr   r   )r|   r   r   r.   rD   r7   r7   r8   pytest_sessionfinish%  s    r   T)ZtryfirstZhookwrapper)itemc                 c   s,   d V }|  }i }|j| jt||j< d S r0   )Z
get_resultZpassedr   
setdefaultr   when)r   r   outcomeresultemptyr7   r7   r8   pytest_runtest_makereport>  s    r   )<rk   dataclassesr1   r   r]   pathlibr   shutilr   typingr   r   r   r   r   r	   Z_pytest.nodesr
   Z_pytest.reportsr   Z_pytest.stashr   Ztyping_extensionsr   r'   Z_pytest.config.argparsingr   r   r   r   r   r   Z_pytest.compatr   r   Z_pytest.configr   r   r   Z_pytest.deprecatedr   Z_pytest.fixturesr   r    Z_pytest.monkeypatchr!   r4   rm   r   	dataclassr"   r_   rv   r{   r   r   r   r>   r   r   r7   r7   r7   r8   <module>   sd    !
