
    9[go,                    H   d 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& ddl'm(Z( ddl)m*Z*  e*ee+e,f             Z-ed   Z.eej^                   G d d                    Z0d,d Z1d-d!Z2d.d"Z3 e!d#$      d/d%       Z4d0d&Z5e!	 	 	 	 	 	 d1d'       Z6d2d(Z7 ed)d)*      	 	 	 	 d3d+       Z8y)4z>Support for providing temporary directories to test functions.    )annotationsN)Path)rmtree)Any)Dict)final)	Generator)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                      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Zedd	 	 	 	 	 dd       ZddZdddZ	ddZ
y)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	_ispytestc                   t        |       |d | _        n6t        t        j                  j                  t        |                  | _        || _        || _        || _	        || _
        y N)r   r$   r   ospathabspathstrr%   r(   r*   r&   )selfgiven_basetempretention_countretention_policytracebasetempr,   s          I/var/www/html/bid-api/venv/lib/python3.12/site-packages/_pytest/tmpdir.py__init__zTempPathFactory.__init__7   sY     	y!!#'D 
 $(N8K(L#MD  /!1!    c               0   t        |       t        |j                  d            }|dk  rt        d| d      |j                  d      }|dvrt        d| d       | |j                  j
                  |j                  j                  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)r4   r7   r5   r6   r,   )r   r'   getini
ValueErroroptionr8   r7   get)clsconfigr,   countpolicys        r9   from_configzTempPathFactory.from_configN   s     	y!FMM"<=>19HqQ  :;22]^d]eefg  !==11,,""8,!#
 	
r;   c                    t         j                  j                  |      }| j                         |z  j	                         j
                  | j                         k7  rt        | d      |S )Nz& is not a normalized and relative path)r/   r0   normpathgetbasetempresolveparentrB   )r3   basenames     r9   _ensure_relative_to_basetempz,TempPathFactory._ensure_relative_to_basetempn   s\    77##H-)224;;t?O?O?QQz)OPQQr;   c                    | j                  |      }|s3| j                         j                  |      }|j                  d       |S t	        | j                         |d      }| j                  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prefixrT   mktemp)rP   rL   joinpathmkdirr   r%   )r3   rO   numberedps       r9   rW   zTempPathFactory.mktempt   sr     44X>  "++H5AGGG  "t'7'7'9(QVWAKK!$r;   c                   | j                   | j                   S | j                  K| j                  }|j                         rt        |       |j	                  d       |j                         }n$t        j                  j                  d      }t        |xs t        j                               j                         }t               xs d}|j                  d|       }	 |j	                  dd       t               }|c|j!                         }|j"                  |k7  rt        d	| d
      |j$                  dz  dk7  r#t        j&                  ||j$                  dz         | j(                  }| j*                  dk(  rd}t-        d||t.        d      }|J |       || _         | j1                  d|       |S # t        $ r' |j                  d      }|j	                  dd       Y w xY w)zReturn the base temporary directory, creating it if needed.

        :returns:
            The base temporary directory.
        rR   rS   PYTEST_DEBUG_TEMPROOTunknownz
pytest-of-T)rT   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-)rV   rU   keeplock_timeoutrT   znew basetemp)r&   r$   existsr   rY   rM   r/   environrD   r   tempfile
gettempdirget_userrX   OSErrorr   statst_uidst_modechmodr(   r*   r   r   r%   )	r3   r8   from_envtemprootuserrootdiruidrootdir_statra   s	            r9   rL   zTempPathFactory.getbasetemp   s    >>%>>!+++H hNNN&'')Hzz~~&=>HH=(;(;(=>FFHH:*D ''*TF(;<G9548 -C&||~&&#-!27) <2 2  !((50Q6HHWl&:&:V&CD((D%%/5 )H #-X-#!NH-C  9"++,?@5489s   !F8 8-G('G(r.   )r4   r#   r5   r'   r6   r)   r8   r#   r,   boolreturnNone)rF   r   r,   rs   rt   r"   )rO   r2   rt   r2   )T)rO   r2   rZ   rs   rt   r   )rt   r   )__name__
__module____qualname____doc____annotations__r:   classmethodrI   rP   rW   rL    r;   r9   r"   r"   )   s     ! K$$ !%"  "#" " (	" " " 
". 
  	

 	

 

 
>09r;   r"   c                 `    	 ddl } | j                         S # t        t        t        f$ r Y yw xY w)zlReturn the current user name, or None if getuser() does not work
    in the current environment (see #1010).r   N)getpassgetuserImportErrorrh   KeyError)r~   s    r9   rg   rg      s0      (+ s    --c                    t               }| j                  |j                         t        j	                  | d      }|j                  | d|d       y)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"   rI   setattr)rF   mpr   s      r9   pytest_configurer      sI     
B
rww'33Fd3KJJv*,=uJMr;   c                T    | j                  ddd       | j                  ddd       y )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)parsers    r9   pytest_addoptionr      s:    
MM"u   MM#	  r;   session)scopec                .    | j                   j                  S )zGReturn a :class:`pytest.TempPathFactory` instance for the test session.)rF   r   )requests    r9   tmp_path_factoryr      s     >>+++r;   c                    | j                   j                  }t        j                  dd|      }d}|d | }|j	                  |d      S )Nz[\W]_   T)rZ   )nodenameresubrW   )r   factoryr   MAXVALs       r9   _mk_tmpr      sF    <<D66'3%DF=D>>$>..r;   c              #  <  K   t        | |      }| | j                  j                  j                  }|j                  }| j
                  j                  t           }|dk(  r|j                  dd      rt        |d       | j
                  j                  t        = yw)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   rF   r   r*   r   stashtmppath_result_keyrD   r   )r   r   r0   rH   result_dicts        r9   tmp_pathr      s      7,-D
J )0(>(>(P(P//F,,$$%78Kkoofd; 	t4(-.s   BBc                   | j                   j                  }|j                  }|y|j                  }|dk(  r.|dk(  r)|j                  |j                         rt        |d       |j                         rt        |       yy)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   )rF   r   r&   r*   r$   is_dirr   r   )r   
exitstatusr   r8   rH   s        r9   pytest_sessionfinishr     s}     )0(H(H))H//Fah,,4?? 840 h' r;   T)wrappertryfirstc              #     K   d }|j                   J i }|j                  | j                  j                  t        |      |j                   <   |S wr.   )whenpassedr   
setdefaultr   )itemr   repemptys       r9   pytest_runtest_makereportr   2  sK      C88EADDJJ,e4SXX>Js   AA)rt   z
str | None)rF   r   rt   ru   )r   r   rt   ru   )r   r   rt   r"   )r   r   r   r"   rt   r   )r   r   r   r"   rt   zGenerator[Path])r   zint | ExitCode)r   r   rt   z'Generator[None, TestReport, TestReport])9ry   
__future__r   dataclassesr/   pathlibr   r   shutilr   re   typingr   r   r   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   r2   rs   r   r)   	dataclassr"   rg   r   r   r   r   r   r   r   r|   r;   r9   <module>r      s9   D "  	  	        * ! & 3  & ! # # , - $ + +  & " /Xd39o.0 /0 Z Z  Zz	
N 	y, ,/ 	///>// 	/2(2 
$&
, 'r;   