o
    h-                  
   @   sV  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r`d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 Z2d!ee. fd"d#Z3d$e$d!dfd%d&Z4d'ed!dfd(d)Z5e*d*d+d,e+d!e2fd-d.Z6d,e+d/e2d!efd0d1Z7e*d,e+d.e2d!eeddf fd2d3Z8d4ee9e%f fd5d6Z:e&d7d7d8d9ef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
dee dedddee de	ddfddZ
ed	d
dede	dd fddZdedefddZd dede	defddZdef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   D/var/www/html/ai/venv/lib/python3.10/site-packages/_pytest/tmpdir.py__init__;   s   

zTempPathFactory.__init__configc                C   sn   t | t|d}|dk rtd| d|d}|dvr(t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: tmpdirT)r+   r6   r,   r-   r*   )r   intgetini
ValueErroroptionr.   r6   get)clsr:   r*   countpolicyr7   r7   r8   from_configR   s$   



zTempPathFactory.from_configbasenamec                 C   s8   t j|}|  |  j|  krt| d|S )Nz& is not a normalized and relative path)r1   r2   normpathgetbasetempresolveparentrA   )r5   rH   r7   r7   r8   _ensure_relative_to_basetempr   s   z,TempPathFactory._ensure_relative_to_basetempTnumberedc                 C   sN   |  |}|s|  |}|jdd |S 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prefixrQ   mktemp)rM   rJ   joinpathmkdirr   r$   )r5   rH   rN   pr7   r7   r8   rT   x   s   
zTempPathFactory.mktempc           	      C   sZ  | j dur| j S | jdur#| j}| rt| |jdd | }nwtjd}t	|p/t
  }t p7d}|d| }z	|jddd W n ty^   |d	}|jddd Y nw t }|dur| }|j|krwtd
| d|jd@ dkrt||jd@  | j}| jdkrd}td||tdd}|dusJ ||| _ | d| |S )zReturn the base temporary directory, creating it if needed.

        :returns:
            The base temporary directory.
        NrO   rP   PYTEST_DEBUG_TEMPROOTunknownz
pytest-of-T)rQ   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-)rS   rR   keeplock_timeoutrQ   znew basetemp)r%   r#   existsr   rV   rK   r1   environrC   r   tempfile
gettempdirget_userrU   OSErrorr   statst_uidst_modechmodr&   r(   r   r   r$   )	r5   r.   from_envtemprootuserrootdiruidrootdir_statr\   r7   r7   r8   rJ      sR   








zTempPathFactory.getbasetempr0   )T)__name__
__module____qualname____doc__r   r   __annotations__r   r?   boolr9   classmethodr   rG   r4   rM   rT   rJ   r7   r7   r7   r8   r"   ,   sF   
 	
r"   r/   c               	   C   s,   z	ddl } |  W S  ttfy   Y dS w )zlReturn the current user name, or None if getuser() does not work
    in the current environment (see #1010).r   N)getpassgetuserImportErrorKeyError)ru   r7   r7   r8   rb      s   
rb   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)raisingN)r!   add_cleanupundor"   rG   setattr)r:   mpry   r7   r7   r8   pytest_configure   s   r   parserc                 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   )addini)r   r7   r7   r8   pytest_addoption   s   
r   session)scoperequestc                 C   s   | j jS )zGReturn a :class:`pytest.TempPathFactory` instance for the test session.)r:   ry   )r   r7   r7   r8   tmp_path_factory   s   r   factoryc                 C   s4   | j j}tdd|}d}|d | }|j|ddS )Nz[\W]_   T)rN   )nodenameresubrT   )r   r   r   MAXVALr7   r7   r8   _mk_tmp   s
   r   c                 c   s\    t | |}|V  | jjj}|j}| jjt }|dkr'|ddr't	|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:   ry   r(   r   stashtmppath_result_keyrC   r   )r   r   r2   rF   result_dictr7   r7   r8   tmp_path  s   

r   
exitstatusc                 C   sf   | j j}|j}|du rdS |j}|dkr'|dkr'|jdu r'| r't|dd | r1t| dS 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:   ry   r%   r(   r#   is_dirr   r   )r   r   r   r.   rF   r7   r7   r8   pytest_sessionfinish%  s   
r   T)tryfirsthookwrapperitemc                 c   s.    d V }|  }i }|j| jt||j< d S r0   )
get_resultpassedr   
setdefaultr   when)r   r   outcomeresultemptyr7   r7   r8   pytest_runtest_makereport>  s
   r   )<rq   dataclassesr1   r   r`   pathlibr   shutilr   typingr   r   r   r   r   r	   _pytest.nodesr
   _pytest.reportsr   _pytest.stashr   typing_extensionsr   r'   _pytest.config.argparsingr   r   r   r   r   r   _pytest.compatr   r   _pytest.configr   r   r   _pytest.deprecatedr   _pytest.fixturesr   r    _pytest.monkeypatchr!   r4   rs   r   	dataclassr"   rb   r   r   r   r   r   r?   r   r   r7   r7   r7   r8   <module>   sn     !
