
    ?g(                       S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
Jr  SSKrSSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKrSSKJr  SSKrSSKJr  SSKJr  SSKJ r   SSKJ!r!  SSKJ"r"  SSKJ#r#  SSK$J%r%  SSK&J'r'  SSK(J)r)  SSK*J+r+  SSK*J,r,  SSK*J-r-  SSK*J.r.  SSK*J/r/  SSK0J1r1  SSK0J2r2  SS K3J4r4  SS!K3J5r5  SS"K6J7r7  \(       a  SS#K8J9r9  SS$K:J;r;  SDS% jr<SES& jr=      SFS' jr>SGS( jr?SHS* jr@SIS+ jrASJS, jrBSKS- jrCSLS. jrD      SMS/ jrESNS0 jrF " S1 S25      rG " S3 S4\H5      rI " S5 S6\J5      rK\R                   " S7 S8\\\M4   5      5       rN\ " S9 S:\R                  5      5       rP\ " S; S)\R                  5      5       rRSOS< jrS\R                  " S=S>9 " S? S@5      5       rTSASB.       SPSC jjrUg)QzHCore implementation of the testing process: init, session, runtest loop.    )annotationsN)Path)AbstractSet)Callable)Dict)final)Iterable)Iterator)Literal)overload)Sequence)TYPE_CHECKING)nodes)Config)directory_arg)ExitCode)hookimpl)PytestPluginManager)
UsageError)Parser)PathAwareHookProxy)exitabsolutepath)bestrelpath
fnmatch_ex)safe_exists)scandir)CollectReport)
TestReport)collect_one_node)
SetupState)PytestWarning)Self)FixtureManagerc                Z   U R                  SSS/ SQS9  U R                  SSS/ S9  U R                  SS	5      nUR                  S
SSSSSS9  U R                  S5      nUR                  SSSSS9  U R                  SSSS9  UR                  SSS[        SSSS 9  UR                  S!S"S#S9  UR                  S$S"S%S9  UR                  S&S"S'S9  UR                  S(S)S*[
        S+S,S-9  UR                  S.S"S/S0S1S29  UR                  S3SS4S5S69  U R                  S7S85      nUR                  S9S:S;S"S<S9  UR                  S=S"S>S9  UR                  S?SS@SASB9  UR                  SCSS@SDSB9  UR                  SESSFSGSB9  UR                  SHSIS SJ[        R                  " [        SHSK9SLSM9  UR                  SNS"SOS/SPSQ9  UR                  SRSSS"STS/SUSQ9  UR                  SVS"SWS/SXSQ9  UR                  SYSZ/ S[QS\S]S^9  U R                  S_S`S/SaSb9  U R                  ScSd5      nUR                  SeSfS [        SJSgSh9  g )iNnorecursedirsz)Directory patterns to avoid for recursionargs)	z*.eggz.*_darcsbuildCVSdistnode_modulesvenvz{arch})typedefault	testpathszZDirectories to search for tests when no files or directories are given on the command linegeneralzRunning and selection optionsz-xz--exitfirststore_constmaxfail   z,Exit instantly on first error or failed test)actiondestconsthelpzpytest-warningsz-Wz--pythonwarningsappendz<Set which warnings to report, see -W option of Python itself)r7   r:   filterwarningslinelistz_Each line specifies a pattern for warnings.filterwarnings. Processed after -W/--pythonwarnings.)r0   r:   z	--maxfailnumstorer   z'Exit after first num failures or errors)metavarr7   r0   r8   r1   r:   z--strict-config
store_truezbAny warnings encountered while parsing the `pytest` section of the configuration file raise errorsz--strict-markerszVMarkers not registered in the `markers` section of the configuration file raise errorsz--strictz&(Deprecated) alias to --strict-markersz-cz--config-fileFILEinifilenamezcLoad configuration from `FILE` instead of trying to locate one of the implicit configuration files.)r@   r0   r8   r:   z--continue-on-collection-errorsFcontinue_on_collection_errorsz4Force test execution even if collection errors occur)r7   r1   r8   r:   z	--rootdirrootdirzDefine root directory for tests. Can be relative path: 'root_dir', './root_dir', 'root_dir/another_dir/'; absolute path: '/home/user/root_dir'; path with variables: '$HOME/root_dir'.)r7   r8   r:   collect
collectionz--collectonlyz--collect-onlyz--coz&Only collect tests, don't execute themz--pyargsz1Try to interpret all arguments as Python packagesz--ignorepathz-Ignore path during collection (multi-allowed))r7   r@   r:   z--ignore-globz5Ignore path pattern during collection (multi-allowed)z
--deselectnodeid_prefixzDDeselect item (via node id prefix) during collection (multi-allowed)z--confcutdir
confcutdirdir)optnamez1Only load conftest.py's relative to specified dir)r8   r1   r@   r0   r:   z--noconftest
noconftestz Don't load any conftest.py files)r7   r8   r1   r:   z--keepduplicatesz--keep-duplicateskeepduplicateszKeep duplicate testsz--collect-in-virtualenvcollect_in_virtualenvz2Don't ignore tests in a local virtualenv directoryz--import-modeprepend)rP   r;   	importlib
importmodez\Prepend/append to sys.path when importing test modules and conftest files. Default: prepend.)r1   choicesr8   r:   consider_namespace_packagesboolzEConsider namespace packages when resolving module names during import)r0   r1   r:   debugconfigz(test session debugging and configurationz
--basetempbasetempz^Base temporary directory for this test run. (Warning: this directory is removed if it exists.))r8   r1   r0   r@   r:   )
addinigetgroup
_addoption	addoptionintstr	functoolspartialr   validate_basetemp)parsergroups     ./usr/lib/python3/dist-packages/_pytest/main.pypytest_addoptionrd   9   s   
MM3

	    MM	   OOI'FGE	;   OO-.E	OOK	   MM/   
6   
*   
   
5  
 
(   
),C   
	   OOI|4E	OO5   
OO@  
 
OO<	   
OOD	   
OOS	   
OO}nE@   
OO/   
OO#   
OO!$A   
OO2#   MM%T	   OOM+UVE	OOA  
    c                   SnU (       d  [         R                  " U5      eSS jnU" [        R                  " 5       [        U 5      R	                  5       5      (       a  [         R                  " U5      eU" [        R                  " 5       R                  5       [        U 5      R                  5       5      (       a  [         R                  " U5      eU $ )NzWbasetemp must not be empty, the current working directory or any parent directory of itc                *    X:X  a  gXR                   ;   $ )z,Return whether query is an ancestor of base.T)parents)basequerys     rc   is_ancestor&validate_basetemp.<locals>.is_ancestor   s    =$$re   )ri   r   rj   r   returnrU   )argparseArgumentTypeErrorr   cwdabsoluteresolve)rH   msgrk   s      rc   r`   r`      s    
cC ((--% 488:tDz22455((-- 488:%%'d););)=>>((--Kre   c           	     <	   [         R                  U 5      n[        R                  Ul        Sn  U R                  5         SnU R                  R                  US9  SnU" X5      =(       d    SUl        Sn[H        RJ                  " URL                  5        US:  a$   U R                  RO                  X"R                  S
9  U RQ                  5         UR                  $ ! [         a    [        R                  Ul        e [         a    [        R                  Ul         N[        [        R                  4 a    [        R                   R"                  R%                  5       n[        R&                  n[)        UR*                  [        R                  5      (       av  UR*                  R,                  b  UR*                  R,                  nUS:  aC  [.        R0                  R3                  UR4                   SUR*                  R6                   S35        U R                  R9                  US9  XRl         GN[:         Ga    [        R<                  Ul        [        R                   R"                  R%                  5       n U R?                  X@R@                  5        [)        UR*                  [B        5      (       a  [.        R0                  R3                  S	5         GN^! [        R                   ab  nUR,                  b  UR,                  Ul        [.        R0                  R3                  [E        U5      RF                   SU S35         SnA GNSnAff = ff = f! [        R                   aa  nUR,                  b  UR,                  Ul        [.        R0                  R3                  [E        U5      RF                   SU S35         SnAGNSnAff = f! Sn[H        RJ                  " URL                  5        US:  a   U R                  RO                  X"R                  S
9  Ow! [        R                   a`  nUR,                  b  UR,                  Ul        [.        R0                  R3                  [E        U5      RF                   SU S35         SnAOSnAff = fU RQ                  5         f = f)zSkeleton command line program.r   r6   session   Nz: 
)excinfoz(mainloop: caught unexpected SystemExit!
)rv   
exitstatus))Sessionfrom_configr   OKrz   _do_configurehookpytest_sessionstartr   USAGE_ERRORFailedTESTS_FAILEDKeyboardInterruptr   	Exception_pytest_codeExceptionInfofrom_currentINTERRUPTED
isinstancevalue
returncodesysstderrwritetypenamers   pytest_keyboard_interruptBaseExceptionINTERNAL_ERRORnotify_exceptionoption
SystemExitr0   __name__oschdir	startpathpytest_sessionfinish_ensure_unconfigure)configdoitrv   	initstatery   rz   excs          rc   wrap_sessionr     s    !!&)G!GI0% 	R  "IKK++G+<I!%f!6!;!G> 
""#>C00#0B0B 1  	""$U  	!)!5!5G 	7!)!6!6G!4>>2 		,mm11>>@G)1)=)=J'--88==++7!(!9!9Jq=JJ$$(8(8'9GMM<M<M;Nb%QRKK11'1B!+ 	R!)!8!8Gmm11>>@GR''? gmmZ88JJ$$%PQ >> C>>-),G&

  DI$6$6#7r#b!ABBC	R, >> C>>-),G&

  DI$6$6#7r#b!ABBC 
""#>C00#0B0B 1  >> C>>-),G&

  DI$6$6#7r#b!ABBC 	""$s   AC #M >M
O DM
)O ,AM
4K>M
O M$AM:M
>O MM

O O!AN==O)R/#PRR'AR=RRRc                "    [        U [        5      $ N)r   _mainr   s    rc   pytest_cmdline_mainr   I  s    &&re   r{   c                    U R                   R                  US9  U R                   R                  US9  UR                  (       a  [        R
                  $ UR                  S:X  a  [        R                  $ g)zWDefault command line protocol for initialization, session,
running tests and reporting.ru   r   N)r   pytest_collectionpytest_runtestlooptestsfailedr   r   testscollectedNO_TESTS_COLLECTED)r   rv   s     rc   r   r   M  s`     KK!!'!2
KK""7"3$$$			1	$***re   c                $    U R                  5         g r   )perform_collectru   s    rc   r   r   Z  s    re   c                   U R                   (       a^  U R                  R                  R                  (       d9  U R	                  SU R                   U R                   S:w  a	  S4-  5      eS4-  5      eU R                  R                  R
                  (       a  g[        U R                  5       H  u  pUS-   [        U R                  5      :  a  U R                  US-      OS nUR                  R                  R                  X#S9  U R                  (       a  U R                  U R                  5      eU R                  (       d  M  U R	                  U R                  5      e   g)Nz%d error%s during collectionr6   s T)itemnextitem)r   r   r   rD   Interruptedcollectonly	enumerateitemslenr   pytest_runtest_protocol
shouldfailr   
shouldstop)rv   ir   r   s       rc   r   r   ^  s    7>>#8#8#V#V!!*""7+>+>!+CCLM
 	
IKLM
 	

 ~~((W]]++,q53w}}3E+E7==Q'400d0N..!3!344%%g&8&899 , re   c                     U R                  S5      R                  5       =(       d     U R                  SS5      R                  5       $ ! [         a     gf = f)a  Attempt to detect if ``path`` is the root of a Virtual Environment by
checking for the existence of the pyvenv.cfg file.

[https://peps.python.org/pep-0405/]

For regression protection we also check for conda environments that do not include pyenv.cfg yet --
https://github.com/conda/conda/issues/13337 is the conda issue tracking adding pyenv.cfg.

Checking for the `conda-meta/history` file per https://github.com/pytest-dev/pytest/issues/12652#issuecomment-2246336902.

z
pyvenv.cfgz
conda-metahistoryF)joinpathis_fileOSErrorrH   s    rc   _in_venvr   r  sR    MM,'//1 @}}\95==?	
  s   AA 
AAc                  ^  T R                   S:X  a  gUR                  ST R                  S9nU=(       d    / nUR                  S5      nU(       a  UR	                  S U 5       5        T U;   a  gUR                  ST R                  S9nU=(       d    / nUR                  S5      nU(       a  UR	                  S	 U 5       5        [        U 4S
 jU 5       5      (       a  gUR                  S5      nU(       d  [        T 5      (       a  gT R                  5       (       a,  UR                  S5      n[        U 4S jU 5       5      (       a  gg )N__pycache__Tcollect_ignorer   ignorec              3  8   #    U  H  n[        U5      v   M     g 7fr   r   .0xs     rc   	<genexpr>(pytest_ignore_collect.<locals>.<genexpr>  s     @ZLOOZ   collect_ignore_globignore_globc              3  8   #    U  H  n[        U5      v   M     g 7fr   r   r   s     rc   r   r     s     D^LOO^r   c              3  v   >#    U  H.  n[         R                   " [        T5      [        U5      5      v   M0     g 7fr   )fnmatchr]   )r   globcollection_paths     rc   r   r     s(     
U7??3/T;;s   69rO   r(   c              3  <   >#    U  H  n[        UT5      v   M     g 7fr   r   )r   patr   s     rc   r   r     s     M;LCz#//;Ls   )	name_getconftest_pathlistparent	getoptionextendanyr   is_dirgetini)r   r   ignore_paths
excludeoptignore_globsexcludegloboptallow_in_venvnorecursepatternss   `       rc   pytest_ignore_collectr     s0   },//55 0 L  %2L!!(+J@Z@@,&//O$:$: 0 L  %2L%%m4ND^DD

U
UUU$$%<=MXo66"MM/:M;LMMMre   c                (    [         R                  XS9$ )Nr   )Dirfrom_parentrH   r   s     rc   pytest_collect_directoryr     s     ??6?--re   c                F   [        UR                  S5      =(       d    / 5      nU(       d  g / n/ nU  HG  nUR                  R                  U5      (       a  UR	                  U5        M6  UR	                  U5        MI     U(       a  UR
                  R                  US9  X0S S & g g )Ndeselect)r   )tupler   nodeid
startswithr;   r   pytest_deselected)r   r   deselect_prefixes	remaining
deselectedcolitems         rc   pytest_collection_modifyitemsr     s    f..z:@bAIJ>>$$%677g&W%	  %%J%7a re   c                  4    \ rS rSr      SS jrSS jrSrg)FSHookProxyi  c                    Xl         X l        g r   pmremove_mods)selfr   r   s      rc   __init__FSHookProxy.__init__  s    
 &re   c                h    U R                   R                  XR                  S9nX R                  U'   U$ )N)remove_plugins)r   subset_hook_callerr   __dict__)r   r   r   s      rc   __getattr__FSHookProxy.__getattr__  s0    GG&&t<L<L&Mdre   r   N)r   r   r   zAbstractSet[object]rm   None)r   r]   rm   zpluggy.HookCaller)r   
__module____qualname____firstlineno__r   r  __static_attributes__ re   rc   r   r     s(    '' )' 
	're   r   c                      \ rS rSrSrSrSrg)r   i  z*Signals that the test run was interrupted.builtinsr  Nr   r  r	  r
  __doc__r  r  re   rc   r   r     s
    4Jre   r   c                      \ rS rSrSrSrg)r   i  z"Signals a stop as failed test run.r  Nr  r  re   rc   r   r     s    ,re   r   c                  .    \ rS rSr% SrS\S'   SS jrSrg)	_bestrelpath_cachei  r   r   rH   c                :    [        U R                  U5      nX U'   U$ r   )r   rH   )r   rH   rs      rc   __missing___bestrelpath_cache.__missing__  s    		4(T
re   r  N)rH   r   rm   r]   )r   r  r	  r
  	__slots____annotations__r  r  r  re   rc   r  r    s    I
Jre   r  c                  P   ^  \ rS rSrSr\      SU 4S jj5       rSS jrSrU =r	$ )r   i  zCollector of files in a file system directory.

.. versionadded:: 8.0

.. note::

    Python directories with an `__init__.py` file are instead collected by
    :class:`~pytest.Package` by default. Both are :class:`~pytest.Directory`
    collectors.
c                  > [         TU ]  XS9$ )zThe public constructor.

:param parent: The parent collector of this Dir.
:param path: The directory's path.
:type path: pathlib.Path
)r   rH   )superr   )clsr   rH   	__class__s      rc   r   Dir.from_parent  s     w"&"<<re   c              #  `  #    U R                   nU R                  n[        U R                  5       H  nUR	                  5       (       ad  [        UR                  5      nU R                  R                  USS9(       d  UR                  XAS9(       a  Mb  UR                  X@S9nUb  Uv   Mz  M|  UR                  5       (       d  M  [        UR                  5      nU R                  R                  U5      (       d  UR                  XAS9(       a  M  UR                  X@S9nU S h  vN   M     g  N	7f)NTwith_parents)r   r   r   	file_pathr   )r   ihookr   rH   r   r   rv   
isinitpathr   r   r   pytest_collect_file)r   r   r%  direntryrH   colcolss          rc   rF   Dir.collect  s      

		*H  HMM*||..t$.G2242W 44$4L?I # !!##HMM*||..t442242W 0040M! +   s   B=D.AD."D,#
D.r  )r   nodes.CollectorrH   r   rm   r%   )rm   z&Iterable[nodes.Item | nodes.Collector])
r   r  r	  r
  r  classmethodr   rF   r  __classcell__r  s   @rc   r   r     sB    	 == 	=
 
= =   re   r   c                    ^  \ rS rSr% Sr\r\rS\S'   S\S'   S\S'   S"U 4S	 jjr\	S#S
 j5       r
S$S jr\S%S j5       r\R                  S&S j5       r\S%S j5       r\R                  S&S j5       r\S'S j5       rS(S jr\" SS9S)S j5       r\" SS9S*S j5       r\rSS.     S+S jjrS,S jr      S-S jr\ S.     S/S jj5       r\ S.     S0S jj5       r S1     S0S jjr S2     S3S jjrS4S jrS5S  jrS!rU =r$ )6r{   i  zgThe root of the collection tree.

``Session`` collects the initial paths given as arguments to pytest.
r#   _setupstater&   _fixturemanagerint | ExitCoderz   c           
       > [         TU ]  SUR                  S S UU SS9  SU l        SU l        SU l        SU l        UR                  R                  R                  S5      U l        [        5       U l        [        5       U l        / U l        / U l        0 U l        / U l        [#        UR                  5      U l        U R&                  R(                  R+                  U SS9  g )Nr   )r   rH   fspathr   r   rv   r   r   FrG   rv   )r   )r  r   rootpathr   r   _shouldstop_shouldfailtracerootget	frozenset_initialpaths_initialpaths_with_parents	_notfound_initial_parts_collection_cacher   r  _bestrelpathcacher   pluginmanagerregister)r   r   r  s     rc   r   Session.__init__-  s     	 	
 ',',\\&&**<8
.7k;D;'FH8:GI')
2DV__2U!!**4i*@re   c                $    U R                  US9nU$ )Nr   )_create)r  r   rv   s      rc   r|   Session.from_configG  s    ;;f;5re   c                    SU R                   R                  U R                  [        U SS5      U R                  U R
                  4-  $ )Nz6<%s %s exitstatus=%r testsfailed=%d testscollected=%d>rz   z<UNSET>)r  r   r   getattrr   r   r   s    rc   __repr__Session.__repr__L  sG    GNN##IID,	2K
 
 	
re   c                    U R                   $ r   )r7  rK  s    rc   r   Session.shouldstopU      re   c                z    USL a0  U R                   (       a  [        R                  " [        S5      SS9  g Xl         g )NFzCsession.shouldstop cannot be unset after it has been set; ignoring.rw   
stacklevel)r7  warningswarnr$   r   r   s     rc   r   rO  Y  :     E>d..MMY 	  re   c                    U R                   $ r   )r8  rK  s    rc   r   Session.shouldfailg  rP  re   c                z    USL a0  U R                   (       a  [        R                  " [        S5      SS9  g Xl         g )NFzCsession.shouldfail cannot be unset after it has been set; ignoring.rw   rR  )r8  rT  rU  r$   rV  s     rc   r   rY  k  rW  re   c                B    U R                   R                  R                  $ )zAThe path from which pytest was invoked.

.. versionadded:: 7.0.0
)r   invocation_paramsrK   rK  s    rc   r   Session.startpathy  s     {{,,000re   c                     U R                   U   $ r   )rB  )r   	node_paths     rc   _node_location_to_relpath!Session._node_location_to_relpath  s    %%i00re   T)tryfirstc                    U R                   (       a  U R                  U R                   5      eU R                  (       a  U R                  U R                  5      eg r   )r   r   r   r   rK  s    rc   pytest_collectstartSession.pytest_collectstart  s=    ??++doo..??""4??33 re   c                   UR                   (       ap  [        US5      (       d^  U =R                  S-  sl        U R                  R	                  S5      nU(       a&  U R                  U:  a  SU R                  -  U l        g g g g g )Nwasxfailr6   r5   zstopping after %d failures)failedhasattrr   r   getvaluer   )r   reportr5   s      rc   pytest_runtest_logreport Session.pytest_runtest_logreport  sj    ==!<!<!kk**95G4++w6">$BRBR"S 7w "==re   Fr!  c                   [        U[        5      (       a  UO
[        U5      nU(       a  X0R                  ;   $ X0R                  ;   $ )a  Is path an initial path?

An initial path is a path explicitly given to pytest on the command
line.

:param with_parents:
    If set, also return True if the path is a parent of an initial path.

.. versionchanged:: 8.0
    Added the ``with_parents`` parameter.
)r   r   r>  r=  )r   rH   r"  path_s       rc   r&  Session.isinitpath  s<    $ #4..DJ;;;;....re   c                4   [        U[        5      (       a  UO
[        U5      nU R                  R                  nUR	                  U5      nUR
                  R                  U5      nU(       a  [        [        X55      5      nU$ U R                  R                  nU$ r   )
r   r   r   rC  _getconftestmodules_conftest_plugins
differencer   r   r   )r   r5  rH   r   my_conftestmodulesr   proxys          rc   gethookproxySession.gethookproxy  s    #FD11vtF|[[&&  33D9**556HI&{2'CDE  KK$$Ere   c                    X;   a  X!   $ UR                  5       (       a3  U R                  UR                  5      nUR                  XS9nUb  U4OSnO8UR	                  5       (       a!  U R                  U5      nUR                  XS9nOSnXRU'   U$ )zuCreate a Collector for the given path.

`path_cache` makes it so the same Collectors are returned for the same
path.
r   r  r#  )r   rw  r   r   r   r'  )r   rH   
path_cacher%  r)  r*  s         rc   _collect_pathSession._collect_path  s     ##;;==%%dkk2E*/*H*H +I +C 9<sfRD\\^^%%d+E,,t,ID D4re   c                    g r   r  r   r)   genitemss      rc   r   Session.perform_collect  s      #re   c                    g r   r  r~  s      rc   r   r    s     25re   c                n   Uc  U R                   R                  nU R                  SX5        U R                  R                  =R                  S-  sl        U R                   R
                  n/ U l        / U l        0 U l        / U l	        U R                  n / n/ nU H  n[        U R                   R                  R                  UU R                   R                  R                  S9nU R                  R                  U5        UR                  UR                   5        UR                  UR                   5        UR#                  UR                   R$                  5        M     ['        U5      U l        ['        U5      U l        [-        U 5      n	U R.                  R1                  U	S9  U R                  R                  =R                  S-  sl        U R                  (       aU  / n
U R                   H;  u  p{U(       a  U
R                  SU SU< S35        M'  U
R                  SU 35        M=     [3        U
6 eU(       d  U	R4                  nONU	R6                  (       a=  U	R4                   H-  nU R                  R#                  U R9                  U5      5        M/     U R                   R:                  R=                  5         UR?                  X R                   US	9  / U l        / U l        0 U l        URA                  U S
9  U(       a  [C        U5      U l"        U$ ! / U l        / U l        0 U l        URA                  U S
9  f = f)a3  Perform the collection phase for this session.

This is called by the default :hook:`pytest_collection` hook
implementation; see the documentation of this hook for more details.
For testing purposes, it may also be called directly on a fresh
``Session``.

This function normally recursively expands any collectors collected
from the session to their items, and only items are returned. For
testing purposes, this may be suppressed by passing ``genitems=False``,
in which case the return value contains these collectors unexpanded,
and ``session.items`` is empty.
r   r6   	as_pypathrk  znot found: z
(no match in any of )zfound no collectors for )rv   r   r   ru   )#r   r)   r9  r:  indentr   r?  r@  rA  r   resolve_collection_argumentr\  rK   r   pyargsr;   rH   r   rh   r<  r=  r>  r"   r%  pytest_collectreportr   resultpassedr  rC  check_pendingr   pytest_collection_finishr   r   )r   r)   r  r   r   initialpathsinitialpaths_with_parentsargcollection_argumentreperrors
collectorsnodes                rc   r   r    s     <;;##D

$d1

!#{{ !#
8<

.	8')L46%&AKK1155"kk0077'#
 ##**+>?##$7$<$<=)001D1I1IJ)001D1I1I1Q1QR  "+<!8D.78Q.RD+"4(CJJ++3+7JJOO""a'"~~'+~~OC!)#.DZNRST (@&FG (6 !&))

:: #



))$--*=> !+ KK%%335..[[ /   DN"$D%'D"))$)7"%e*D  DN"$D%'D"))$)7s   H=L &L4c                    XR                   ;   a  U(       a  U R                   U   nUS4$ [        U5      nX0R                   U'   US4$ )NTF)rA  r"   )r   r  handle_dupesr  s       rc   _collect_one_nodeSession._collect_one_node:  sN    
 )))l((.C9"4(C+.""4(:re   c              #    #    0 nU R                   R                  nU R                   GHH  nU R                  SU5        U R                  R                  =R
                  S-  sl        UR                  nUR                  nUR                  nUR                  5       (       a  U(       a   SXE4< 35       eU/nUc>  UR                   H-  nUR                  U5      (       d    O}UR                  SU5        M/     OfUR                  S5      n	[        UR                  S5       H;  u  pU
[        U	5      :  d  UR                   X*    :w  a    OUR                  SU5        M=     Sn/ nU / UQUQ4/nU(       Ga  UR#                  5       u  pU(       d  Uv   SnM)  [%        U[&        R(                  5      (       d  MJ  [%        U[*        5      (       a0  [%        US   [,        5      (       d   eUR/                  US   U5      nO[        U5      S:H  =(       a-    [%        US   [,        5      =(       a    US   R1                  5       (       + nU R3                  UU5      u  nnU(       d*  UR4                  (       d  UR6                  R9                  US	9  UR4                  (       d  GM0  UR:                  nSn[=        U5       GH+  n[%        US   [,        5      (       a  UR                  US   :H  n[>        R@                  S
:X  a  U(       d  [B        R                  RE                  UR                  US   5      nU=(       aL    [B        R                  RG                  UR                  5      [B        R                  RG                  US   5      :H  nO=URH                  US   :H  =(       d$    URH                  R                  S5      S   US   :H  nU(       d  GM  URK                  UUSS  45        SnGM.     U(       d  URK                  U5        U(       a  GM  U(       d;  SRM                  [O        U5      /UQ75      nU RP                  RK                  UU45        U R                  R                  =R
                  S-  sl        GMK     g 7f)Nzprocessing argumentr6   zinvalid arg r   .rw   FTr  win32[::))r   rC  r@  r9  r:  r  rH   partsmodule_namer   rh   _is_in_confcutdirinsertsplitr   r   stempopr   r   	Collectorr{   r   r{  r   r  r  r%  r  r  reversedr   platformr   samefileislinkr   r;   joinr]   r?  )r   rz  r   r  argpathnamesr  pathsrH   module_name_partsr   any_matched_in_initial_partnotfound_collectorswork	matchnode
matchpartssubnodesr  r  	duplicateany_matched_in_collectorr  is_match	same_file
report_args                            rc   rF   Session.collectG  s     =?
[[&&#'#6#6JJ,.ABJJOO""a'")..G'--E-99K ~~ EL'1A0D"EEyIE "#OOD//55LLD) , %0$5$5c$:!(!<GA3011TYYBSTVBW5WLLD)  = +0'"$'''(QD (,
%	 "#O26/ ")U__== i11%jmT::::(66z!}jQH
 J1, 4&z!}d;4&qM113$L
 &*%;%;I|%TNC$SZZ "<<C<H:: "zzH ,1($X.D!*Q-66#'99
1#=<<728 )+(8(8JqM(RI (1 ( "tyy 9#%77>>*Q-#@!A % !IIA6 H#yys3A6*Q-G !  xT:ab>$:;3703 /6 0'..y9I $L /!YYG'=u'=>
%%z3F&GHJJOO""a'""_ $7s   N>Q5<Q5A1Q5c              #  v  #    U R                  SU5        [        U[        R                  5      (       a  UR                  R                  US9  Uv   g [        U[        R                  5      (       d   eU R                  R                  S5      nU=(       a    [        U[        R                  5      (       + nU R                  X5      u  pEU(       a  U(       d  g UR                  (       a,  UR                   H  nU R                  U5       S h  vN   M     U(       d  UR                  R                  US9  g g  N*7f)Nr  )r   rN   r  )r9  r   r   Itemr%  pytest_itemcollectedr  r   r   Filer  r  r  r  r  )r   r  rN   r  r  r  subnodes          rc   r  Session.genitems  s     

:t$dEJJ''JJ+++6JdEOO4444![[223CDN . O:dEJJ3OPL!33DGNCzz"zzG#}}W555  *

//s/;  6s   D
D9D7+D9)rB  rA  r@  r=  r>  r?  r8  r7  r   r   r   r   r9  )r   r   rm   r  )r   r   rm   r{   )rm   r]   )rm   
bool | str)r   r  rm   r  )rm   r   )r_  r   rm   r]   )rm   r  )rk  zTestReport | CollectReportrm   r  )rH   zstr | os.PathLike[str]r"  rU   rm   rU   )r5  zos.PathLike[str]rm   zpluggy.HookRelay)rH   r   rz  z%dict[Path, Sequence[nodes.Collector]]rm   zSequence[nodes.Collector])..)r)   Sequence[str] | Noner  zLiteral[True]rm   zSequence[nodes.Item])r)   r  r  rU   rm   z&Sequence[nodes.Item | nodes.Collector])NT)T)r  r,  r  rU   rm   ztuple[CollectReport, bool])rm   z&Iterator[nodes.Item | nodes.Collector])r  znodes.Item | nodes.Collectorrm   zIterator[nodes.Item]) r   r  r	  r
  r  r   r   r  r   r-  r|   rL  propertyr   setterr   r   r`  r   rd  rl  r  r&  rw  r{  r   r   r  rF   r  r  r.  r/  s   @rc   r{   r{     s    
 KF##A4  
     ! !     ! ! 1 11 t4 4 tT T 4 #	/$/ 	/
 
/0" : 
#	> JM#(#:G#	# # AD5(5:>5	/5 5
 CGP(P;?P	/Pj "  
$	w(r< <re   c                F    [         R                  R                  U 5      nUb  UR                  b  UR                  S:X  a  gUR                  (       a)  [        R                  R                  UR                  5      $ UR                  $ ! [        [        [
        4 a     gf = f)z]Search sys.path for the given a dotted module name, and return its file
system path if found.N	namespace)rQ   util	find_specAttributeErrorImportError
ValueErrororiginsubmodule_search_locationsr   rH   dirname)r  specs     rc   search_pypathr    s~    ~~''4 |t{{*dkk[.H		(	(wwt{{++{{ K4 s   B B B T)frozenc                  8    \ rS rSr% SrS\S'   S\S'   S\S'   S	rg
)CollectionArgumenti  zA resolved collection argument.r   rH   zSequence[str]r  
str | Noner  r  N)r   r  r	  r
  r  r  r  r  re   rc   r  r    s    )
Jre   r  Fr  c                  [        U5      R                  S5      u  p4nUR                  S5      tpgU(       a  US    U U 3US'   SnU(       a  [        U5      n	U	b  UnU	nX-  n
[	        U
5      n
[        U
5      (       d#  U(       a  SOSn[        UR                  US95      eU(       a8  U
R                  5       (       a#  U(       a  SOS	n[        UR                  US95      e[        U
UUS
9$ )ak  Parse path arguments optionally containing selection parts and return (fspath, names).

Command-line arguments can point to files and/or directories, and optionally contain
parts for specific tests selection, for example:

    "pkg/tests/test_foo.py::TestClass::test_foo"

This function ensures the path exists, and returns a resolved `CollectionArgument`:

    CollectionArgument(
        path=Path("/full/path/to/pkg/tests/test_foo.py"),
        parts=["TestClass", "test_foo"],
        module_name=None,
    )

When as_pypath is True, expects that the command-line argument actually contains
module paths instead of file-system paths:

    "pkg.tests.test_foo::TestClass::test_foo"

In which case we search sys.path for a matching module, and then return the *path* to the
found module, which may look like this:

    CollectionArgument(
        path=Path("/home/u/myvenv/lib/site-packages/pkg/tests/test_foo.py"),
        parts=["TestClass", "test_foo"],
        module_name="pkg.tests.test_foo",
    )

If the path doesn't exist, raise UsageError.
If the path is a directory and selection parts are present, raise UsageError.
r  r  Nz9module or package not found: {arg} (missing __init__.py?)z"file or directory not found: {arg})r  z9package argument cannot contain :: selection parts: {arg}z;directory argument cannot contain :: selection parts: {arg})rH   r  r  )
r]   	partitionr  r  r   r   r   formatr   r  )invocation_pathr  r  ri   squacketreststrpathr  r  pyarg_strpathr5  rs   s               rc   r  r    s   F s8--c2DDjj&OGRyk(D62b	K%g.$!K#G&F&!Fv  H5 	
 ,--  HN 	
 ,-- re   )ra   r   rm   r  )rH   r]   rm   r]   )r   r   r   z2Callable[[Config, Session], int | ExitCode | None]rm   r3  )r   r   rm   r3  )r   r   rv   r{   rm   zint | ExitCode | None)rv   r{   rm   r  )rv   r{   rm   rU   )rH   r   rm   rU   )r   r   r   r   rm   zbool | None)rH   r   r   r,  rm   znodes.Collector | None)r   zlist[nodes.Item]r   r   rm   r  )r  r]   rm   r  )r  r   r  r]   r  rU   rm   r  )Vr  
__future__r   rn   dataclassesr   r^   rQ   importlib.utilr   pathlibr   r   typingr   r   r   r   r	   r
   r   r   r   r   rT  pluggyr   r   _pytest._code_pytest.configr   r   r   r   r   r   _pytest.config.argparsingr   _pytest.config.compatr   _pytest.outcomesr   _pytest.pathlibr   r   r   r   r   _pytest.reportsr    r!   _pytest.runnerr"   r#   _pytest.warning_typesr$   typing_extensionsr%   _pytest.fixturesr&   rd   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	dataclassr]   r  	Directoryr   r  r{   r  r  r  r  re   rc   <module>r     s   N "       	  
                ! ( # # . % , 4 ! ( ' & ' # ) & + % / &/yx288L88v'
(*#L.
.'..$ # -Y - dCi   0 %// 0  0 f r<eoo r< r<j$ d#  $ ;@AA #A37AAre   