o
    h+                     @  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Z1dDd!d"Z2dEd&d'Z3dFd*d+Z4e!d,d-dGd0d1Z5dHd4d5Z6e!dId7d8Z7dJd;d<Z8ed=d=d>dKdBdCZ9dS )Lz>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Zeddd)ddZd*ddZd+d,d#d$Z	d-d%d&Z
dS ).TempPathFactoryzFactory for temporary directories under the common base temp directory,
    as discussed at :ref:`temporary directory location and retention`.
    Path | None_given_basetempr   _trace	_basetempint_retention_countRetentionType_retention_policyNF	_ispytestgiven_basetempretention_countretention_policybasetempr)   boolreturnNonec                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)    r8   O/var/www/html/openai_agents/venv/lib/python3.10/site-packages/_pytest/tmpdir.py__init__6   s   

zTempPathFactory.__init__configr   c                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*   r7   r+   r,   r)   )r   r$   getini
ValueErroroptionr-   r7   get)clsr;   r)   countpolicyr8   r8   r9   from_configM   s$   



zTempPathFactory.from_configbasenamer5   c                 C  s8   t j|}|  |  j|  krt| d|S )Nz& is not a normalized and relative path)r2   r3   normpathgetbasetempresolveparentrA   )r6   rH   r8   r8   r9   _ensure_relative_to_basetempm   s   z,TempPathFactory._ensure_relative_to_basetempTnumberedr   c                 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"   )r6   rH   rN   pr8   r8   r9   rT   s   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   r2   environrC   r   tempfile
gettempdirget_userrU   OSErrorr   statst_uidst_modechmodr%   r'   r   r   r"   )	r6   r-   from_envtemprootuserrootdiruidrootdir_statr\   r8   r8   r9   rJ      sR   








zTempPathFactory.getbasetempr1   )r*   r    r+   r$   r,   r&   r-   r    r)   r.   r/   r0   )r;   r   r)   r.   r/   r   )rH   r5   r/   r5   )T)rH   r5   rN   r.   r/   r   )r/   r   )__name__
__module____qualname____doc____annotations__r:   classmethodrG   rM   rT   rJ   r8   r8   r8   r9   r   (   s"   
 
r   r/   
str | Nonec               
   C  s.   z	ddl } |  W S  t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ImportErrorrc   KeyError)ru   r8   r8   r9   rb      s   
rb   r;   r   r0   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   r8   r8   r9   pytest_configure   s   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   )addini)r   r8   r8   r9   pytest_addoption   s   
r   session)scoperequestr   c                 C  s   | j jS )zGReturn a :class:`pytest.TempPathFactory` instance for the test session.)r;   ry   )r   r8   r8   r9   tmp_path_factory   s   r   factoryr   c                 C  s4   | j j}tdd|}d}|d | }|j|ddS )Nz[\W]_   T)rN   )nodenameresubrT   )r   r   r   MAXVALr8   r8   r9   _mk_tmp   s
   r   Generator[Path]c                 c  sR    t | |}|V  |j}| jjt }|dkr"|ddr"t|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_keyrC   r   )r   r   r3   rF   result_dictr8   r8   r9   tmp_path   s   

r   
exitstatusint | ExitCodec                 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   r8   r8   r9   pytest_sessionfinish  s   
r   T)wrappertryfirstitemr   'Generator[None, TestReport, TestReport]c                 c  s4    d V }|j d usJ i }|j| jt||j < |S r1   )whenpassedr   
setdefaultr   )r   r   repemptyr8   r8   r9   pytest_runtest_makereport0  s   r   )r/   rt   )r;   r   r/   r0   )r   r   r/   r0   )r   r   r/   r   )r   r   r   r   r/   r   )r   r   r   r   r/   r   )r   r   )r   r   r/   r   ):rq   
__future__r   collections.abcr   dataclassesr2   pathlibr   r   shutilr   r`   typingr   r   r   r
   r   r   r   r   _pytest.compatr   _pytest.configr   r   r   _pytest.config.argparsingr   _pytest.deprecatedr   _pytest.fixturesr   r   _pytest.monkeypatchr   _pytest.nodesr   _pytest.reportsr   _pytest.stashr   dictr5   r.   r   r&   	dataclassr   rb   r   r   r   r   r   r   r   r8   r8   r8   r9   <module>   s\    





