ó
    EñiÃ¥  ã                  ó&  • S 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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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,J0r0  SSK,J1r1  SSK,J2r2  SSK3J4r4  SS K3J5r5  SS!K6J7r7  SS"K6J8r8  SS#K9J:r:  \(       a  SS$K;J<r<  SS%K=J>r>  SHS& jr?SIS' jr@      SJS( jrASKS) jrBSLS+ jrCSMS, jrDSNS- jrESOS. jrFSPS/ jrG      SQS0 jrHSRS1 jrI " S2 S35      rJ " S4 S5\K5      rL " S6 S7\M5      rN\Rž                   " S8 S9\P\\Q4   5      5       rR\ " S: S;\R¦                  5      5       rT\ " S< S*\Rª                  5      5       rVS=S>.     SSS? jjrW\Rž                  " S@SA9 " SB SC5      5       rXS=S=SD.           STSE jjrY      SUSF jrZ    SVSG jr[g)WzHCore implementation of the testing process: init, session, runtest loop.é    )ÚannotationsN)ÚCallable)ÚIterable)ÚIterator)ÚSequence)ÚSet)ÚPath)Úfinal)ÚLiteral)Úoverload)ÚTYPE_CHECKING)Únodes)ÚConfig)Údirectory_arg)ÚExitCode)Úhookimpl)ÚPytestPluginManager)Ú
UsageError)ÚOverrideIniAction)ÚParser)ÚPathAwareHookProxy)Úexit©Úabsolutepath)Úbestrelpath©Ú
fnmatch_ex)Úsafe_exists)Úsamefile_nofollow)Úscandir)ÚCollectReport)Ú
TestReport)Úcollect_one_node)Ú
SetupState)ÚPytestWarning)ÚSelf)ÚFixtureManagerc                ó  • U R                  S5      nUR                  SSSSSSS9  UR                  S	S
S[        SSSS9  UR                  S[        SSSS9  UR                  S[        SSSS9  UR                  S[        SSSS9  U R                  SSSS S9  U R                  SSSS S9  U R                  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+5      nUR                  S,S-S.S/S0S%9  UR                  S1S/S2S%9  UR                  S3S#S4S5S69  UR                  S7S#S4S8S69  UR                  S9S#S:S;S69  UR                  S<S=S S>[        R                  " [        S<S?9S@SA9  UR                  SBS/SCSSDSE9  UR                  SFSGS/SHSSISE9  UR                  SJS/SKSSLSE9  UR                  SMS/SSNSOSP9  UR                  SQSR/ SSQSTSUSV9  U R                  SWSXSY/ SZQS9  U R                  S[S\SY/ S9  U R                  S]S^SS_S9  U R                  S`SSSaSb9  U R                  ScSd5      nUR                  SeSfSg[        ShSiSj9  UR                  SkSSlSmSn9  UR                  SoSpS [        S>SqSr9  g )sNÚgeneralz-xz--exitfirstÚstore_constÚmaxfailé   z,Exit instantly on first error or failed test)ÚactionÚdestÚconstÚhelpz	--maxfailÚnumÚstorer   z'Exit after first num failures or errors)Úmetavarr-   Útyper.   Údefaultr0   z--strict-configÚstrict_configÚtruez Enables the strict_config option)r-   Ú
ini_optionÚ	ini_valuer0   z--strict-markersÚstrict_markersz!Enables the strict_markers optionz--strictÚstrictzEnables the strict optionzbAny warnings encountered while parsing the `pytest` section of the configuration file raise errorsÚbool)r4   r5   zVMarkers not registered in the `markers` section of the configuration file raise errorszrEnables all strictness options, currently: strict_config, strict_markers, strict_xfail, strict_parametrization_idsFzpytest-warningsz-Wz--pythonwarningsÚappendz<Set which warnings to report, see -W option of Python itself)r-   r0   ÚfilterwarningsÚlinelistz_Each line specifies a pattern for warnings.filterwarnings. Processed after -W/--pythonwarnings.)r4   r0   ÚcollectÚ
collectionz--collectonlyz--collect-onlyz--coÚ
store_truez&Only collect tests, don't execute themz--pyargsz1Try to interpret all arguments as Python packagesz--ignoreÚpathz-Ignore path during collection (multi-allowed))r-   r3   r0   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)r.   r5   r3   r4   r0   z--noconftestÚ
noconftestz Don't load any conftest.py files)r-   r.   r5   r0   z--keepduplicatesz--keep-duplicatesÚkeepduplicateszKeep duplicate testsz--collect-in-virtualenvÚcollect_in_virtualenvz2Don't ignore tests in a local virtualenv directoryz--continue-on-collection-errorsÚcontinue_on_collection_errorsz4Force test execution even if collection errors occur)r-   r5   r.   r0   z--import-modeÚprepend)rL   r=   Ú	importlibÚ
importmodez\Prepend/append to sys.path when importing test modules and conftest files. Default: prepend.)r5   Úchoicesr.   r0   Únorecursedirsz)Directory patterns to avoid for recursionÚargs)	z*.eggz.*Ú_darcsÚbuildÚCVSÚdistÚnode_modulesÚvenvz{arch}Ú	testpathszZDirectories to search for tests when no files or directories are given on the command lineÚcollect_imported_testsz@Whether to collect tests in imported modules outside `testpaths`TÚconsider_namespace_packageszEConsider namespace packages when resolving module names during import)r4   r5   r0   Údebugconfigz(test session debugging and configurationz-cz--config-fileÚFILEÚinifilenamezcLoad configuration from `FILE` instead of trying to locate one of the implicit configuration files.)r3   r4   r.   r0   z	--rootdirÚrootdirz¶Define 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'.)r-   r.   r0   z
--basetempÚbasetempz^Base temporary directory for this test run. (Warning: this directory is removed if it exists.))r.   r5   r4   r3   r0   )ÚgetgroupÚ
_addoptionÚ	addoptionÚintr   ÚaddiniÚ	functoolsÚpartialr   ÚstrÚvalidate_basetemp)ÚparserÚgroups     ÚI/home/mande/repo/quber/.venv/lib/python3.13/site-packages/_pytest/main.pyÚpytest_addoptionrl   :   s  € Ø�O‰O˜IÓ&€EØ	×ÑØØØØØØ;ð ñ ð 
‡O�OØØØÜØØØ6ð ñ ð 
‡O�OØÜ Ø"ØØ/ð ñ ð 
‡O�OØÜ Ø#ØØ0ð ñ ð 
‡O�OØÜ ØØØ(ð ñ ð ‡M�MØð	*ààð ñ ð ‡M�MØð	ààð ñ ð ‡M�MØð	RàØð ñ ð �O‰OÐ-Ó.€EØ	‡O�OØØØØKð	 ñ ð ‡M�MØØð/ð ñ ð �O‰O˜I |Ó4€EØ	‡O�OØØØØØ5ð ñ ð 
‡O�OØØØ@ð ñ ð
 
‡O�OØØØØ<ð	 ñ ð 
‡O�OØØØØDð	 ñ ð 
‡O�OØØØØSð	 ñ ð 
‡O�OØØØØÜ×Òœ}°nÑEØ@ð ñ ð 
‡O�OØØØØØ/ð ñ ð 
‡O�OØØØØØØ#ð ñ ð 
‡O�OØ!ØØ$ØØAð ñ ð 
‡O�OØ)ØØØ,ØCð ñ ð 
‡O�OØØÚ2Øð#ð ñ ð ‡M�MØØ3Øò

ð	 ñ ð  ‡M�MØð	àØð ñ ð ‡M�MØ ØJØØð	 ñ ð ‡M�MØ%ØØØTð	 ñ ð �O‰O˜MÐ+UÓV€EØ	×ÑØØØÜØð(ð ñ ð 
‡O�OØØØðð	 ñ ð 
‡O�OØØØÜØð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     rk   Úis_ancestorÚ&validate_basetemp.<locals>.is_ancestor   s   € à‹=ØØŸ™Ñ$Ð$rm   )rq   r	   rr   r	   Úreturnr<   )ÚargparseÚArgumentTypeErrorr	   ÚcwdÚabsoluteÚresolve)rC   Úmsgrs   s      rk   rh   rh     s–   € à
c€Cö Ü×(Ò(¨Ó-Ð-ô%ñ ”4—8’8“:œt D›z×2Ñ2Ó4×5Ñ5Ü×(Ò(¨Ó-Ð-ñ ”4—8’8“:×%Ñ%Ó'¬¨d«×);Ñ);Ó)=×>Ñ>Ü×(Ò(¨Ó-Ð-à€Krm   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NÏS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NÿS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   r,   ©Úsessioné   Nz: Ú
)Úexcinfoz(mainloop: caught unexpected SystemExit!
)r~   Ú
exitstatus))ÚSessionÚfrom_configr   ÚOKr‚   Ú_do_configureÚhookÚpytest_sessionstartr   ÚUSAGE_ERRORÚFailedÚTESTS_FAILEDÚKeyboardInterruptr   Ú	ExceptionÚ_pytestÚ_codeÚExceptionInfoÚfrom_currentÚINTERRUPTEDÚ
isinstanceÚvalueÚ
returncodeÚsysÚstderrÚwriteÚtypenamer{   Úpytest_keyboard_interruptÚBaseExceptionÚINTERNAL_ERRORÚnotify_exceptionÚoptionÚ
SystemExitr4   Ú__name__ÚosÚchdirÚ	startpathÚpytest_sessionfinishÚ_ensure_unconfigure)ÚconfigÚdoitr~   Ú	initstater�   r‚   Úexcs          rk   Úwrap_sessionrª   1  s”  € ô ×!Ñ! &Ó)€GÜ!Ÿ™€GÔØ€Ið0%ð 	RØ× Ñ Ô"ØˆIØ�K‰K×+Ñ+°GÐ+Ñ<ØˆIÙ!% fÓ!6×!;¸!ˆGÔð> ˆÜ
�Š�×"Ñ"Ô#Ø˜‹>ðCØ—‘×0Ñ0Ø#×0BÑ0Bð 1ñ ð 	×"Ñ"Ô$Ø×ÑÐøôU ó 	Ü!)×!5Ñ!5ˆGÔØÜó 	7Ü!)×!6Ñ!6ˆGÖÜ!¤4§>¡>Ð2ó 		,Ü—m‘m×1Ñ1×>Ñ>Ó@ˆGÜ)1×)=Ñ)=ˆJÜ˜'Ÿ-™-¬¯©×8Ñ8Ø—=‘=×+Ñ+Ñ7Ø!(§¡×!9Ñ!9�JØ˜q“=Ü—J‘J×$Ñ$¨×(8Ñ(8Ð'9¸¸G¿M¹M×<MÑ<MÐ;NÈbÐ%QÔRØ�K‰K×1Ñ1¸'Ð1ÑBØ!+×Üô 	RÜ!)×!8Ñ!8ˆGÔÜ—m‘m×1Ñ1×>Ñ>Ó@ˆGðRØ×'Ñ'¨·±Ô?ô ˜gŸm™m¬Z×8Ñ8Ü—J‘J×$Ñ$Ð%PÔQûô —>‘>ó CØ—>‘>Ñ-Ø),¯©�GÔ&Ü—
‘
× Ñ ¤D¨£I×$6Ñ$6Ð#7°r¸#¸¸bÐ!A×BÓBûðCúð	Rûô, —>‘>ó CØ—>‘>Ñ-Ø),¯©�GÔ&Ü—
‘
× Ñ ¤D¨£I×$6Ñ$6Ð#7°r¸#¸¸bÐ!A×BÒBûðCûð ˆÜ
�Š�×"Ñ"Ô#Ø˜‹>ðCØ—‘×0Ñ0Ø#×0BÑ0Bð 1ò øô —>‘>ó CØ—>‘>Ñ-Ø),¯©�GÔ&Ü—
‘
× Ñ ¤D¨£I×$6Ñ$6Ð#7°r¸#¸¸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    rk   Úpytest_cmdline_mainr¯   l  s   € Ü˜¤Ó&Ð&rm   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.r}   r   N)r‡   Úpytest_collectionÚpytest_runtestloopÚtestsfailedr   r‹   ÚtestscollectedÚNO_TESTS_COLLECTED)r¦   r~   s     rk   r­   r­   p  s`   € ð ‡K�K×!Ñ!¨'Ð!Ñ2Ø
‡K�K×"Ñ"¨7Ð"Ñ3à××Ü×$Ñ$Ð$Ø	×	Ñ	 1Ó	$Ü×*Ñ*Ð*Ørm   c                ó$   • U R                  5         g r¬   )Úperform_collectr}   s    rk   r±   r±   }  s   € Ø×ÑÕrm   c                ó´  • U R                   (       aX  U R                  R                  R                  (       d3  U R	                  U R                    SU R                   S:w  a  SOS S3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 errorr,   ÚsÚ z during collectionT)ÚitemÚnextitem)r³   r¦   rž   rK   ÚInterruptedÚcollectonlyÚ	enumerateÚitemsÚlenr‡   Úpytest_runtest_protocolÚ
shouldfailrŠ   Ú
shouldstop)r~   Úir»   r¼   s       rk   r²   r²   �  s  € Ø×× 7§>¡>×#8Ñ#8×#V×#VØ×!Ñ!Ø×"Ñ"Ð# 6°×1DÑ1DÈÓ1I©#ÈrÐ)RÐRdÐeó
ð 	
ð ‡~�~×Ñ×(×(Øä˜WŸ]™]Ö+‰ˆØ+,¨q©5´3°w·}±}Ó3EÓ+E�7—=‘=  Q¡Ò'È4ˆØ�‰×Ñ×0Ñ0°dÐ0ÑNØ××Ø—.‘. ×!3Ñ!3Ó4Ð4Ø××ÑØ×%Ñ% g×&8Ñ&8Ó9Ð9ñ ,ð rm   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©rC   s    rk   Ú_in_venvrÌ   ”  sR   € ðà�M‰M˜,Ó'×/Ñ/Ó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     rk   Ú	<genexpr>Ú(pytest_ignore_collect.<locals>.<genexpr>³  s   é € Ð@²Z°œL¨ŸO˜O²Zùó   ‚Úcollect_ignore_globÚignore_globc              3  ó8   #   • U  H  n[        U5      v •  M     g 7fr¬   r   rÒ   s     rk   rÕ   rÖ   ¾  s   é € ÐD²^°œL¨ŸO˜O²^ùr×   c              3  óv   >#   • U  H.  n[         R                   " [        T5      [        U5      5      v •  M0     g 7fr¬   )Úfnmatchrg   )rÓ   ÚglobÚcollection_paths     €rk   rÕ   rÖ   À  s(   øé € Ð
UÊÀŒ7�?Š?œ3˜Ó/´°T³×;Ð;Êùs   ƒ69rJ   rP   c              3  ó<   >#   • U  H  n[        UT5      v •  M     g 7fr¬   r   )rÓ   ÚpatrÞ   s     €rk   rÕ   rÖ   É  s   øé € ÐMÒ;L°CŒz˜#˜×/Ð/Ò;Lùs   ƒ)	ÚnameÚ_getconftest_pathlistÚparentÚ	getoptionÚextendÚanyrÌ   Úis_dirÚgetini)rÞ   r¦   Úignore_pathsÚ
excludeoptÚignore_globsÚexcludegloboptÚallow_in_venvÚnorecursepatternss   `       rk   Úpytest_ignore_collectrï   ©  s0  ø€ Ø×Ñ˜}Ó,Øà×/Ñ/Ø˜×5Ñ5ð 0ð €Lð  ×% 2€LØ×!Ñ! (Ó+€JÞØ×ÑÑ@±ZÓ@Ô@à˜,Ó&Øà×/Ñ/Ø O×$:Ñ$:ð 0ð €Lð  ×% 2€LØ×%Ñ% mÓ4€NÞØ×ÑÑD±^ÓDÔDä
Ô
UÉÓ
U×UÑUØà×$Ñ$Ð%<Ó=€MÞœX o×6Ñ6Øà×Ñ×ÑØ"ŸM™M¨/Ó:ÐÜÔMÑ;LÓM×MÑMØàrm   c                ó(   • [         R                  XS9$ )NrË   )ÚDirÚfrom_parent©rC   rã   s     rk   Úpytest_collect_directoryrô   Ï  s   € ô �?‰?˜6ˆ?Ð-Ð-rm   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         rk   Úpytest_collection_modifyitemsrÿ   Õ  s�   € Ü˜f×.Ñ.¨zÓ:×@¸bÓAÐÞØà€IØ€JÛˆØ�>‰>×$Ñ$Ð%6×7Ñ7Ø×Ñ˜gÖ&à×Ñ˜WÖ%ñ	 ö Ø�‰×%Ñ%¨JÐ%Ñ7Ø‰a‰ð rm   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      rk   Ú__init__ÚFSHookProxy.__init__è  s   € ð
 ŒØ&Õrm   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      rk   Ú__getattr__ÚFSHookProxy.__getattr__ð  s0   € Ø�G‰G×&Ñ& t×<LÑ<LÐ&ÐMˆØ�‰�dÑØˆrm   r  N)r  r   r  zAbstractSet[object]ru   ÚNone)rá   rg   ru   zpluggy.HookCaller)r    Ú
__module__Ú__qualname__Ú__firstlineno__r  r  Ú__static_attributes__© rm   rk   r  r  ç  s(   † ð'àð'ð )ð'ð 
ô	'÷rm   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  rm   rk   r½   r½   ö  s
   † Ù4àƒJrm   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  rm   rk   rŠ   rŠ   ü  s   † Ü,rm   rŠ   c                  ó.   • \ rS rSr% SrS\S'   SS jrSrg)	Ú_bestrelpath_cachei   rË   r	   rC   c                ó:   • [        U R                  U5      nX U'   U$ r¬   )r   rC   )r  rC   Úrs      rk   Ú__missing__Ú_bestrelpath_cache.__missing__  s   € Ü˜Ÿ	™	 4Ó(ˆØˆT‰
Øˆrm   r  N)rC   r	   ru   rg   )r    r  r  r  Ú	__slots__Ú__annotations__r  r  r  rm   rk   r  r     s   ‡ à€Ià
ƒJ÷rm   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  zúCollector 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$ )z†The public constructor.

:param parent: The parent collector of this Dir.
:param path: The directory's path.
:type path: pathlib.Path
)rã   rC   )Úsuperrò   )Úclsrã   rC   Ú	__class__s      €rk   rò   ÚDir.from_parent  s   ø€ ô ‰wÑ"¨&Ð"Ð<Ð<rm   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    rC   rç   r	   r~   Ú
isinitpathrï   rô   rÉ   Úpytest_collect_file)r  r¦   r-  ÚdirentryrC   ÚcolÚcolss          rk   r@   ÚDir.collect(  sû   é € Ø—‘ˆð —
‘
ˆÜ §	¡	Ö*ˆHØ�‰× Ñ Ü˜HŸM™MÓ*�Ø—|‘|×.Ñ.¨tÀ$Ð.ÖGØ×2Ñ2À4Ð2ÖWÙ Ø×4Ñ4¸$Ð4ÐL�Ø‘?Ø”Iñ #ð ×!Ñ!×#Ó#Ü˜HŸM™MÓ*�Ø—|‘|×.Ñ.¨t×4Ñ4Ø×2Ñ2À4Ð2ÖWÙ Ø×0Ñ0¸4Ð0ÐM�Ø—’ò! +ñ   ùs   ‚B=D.ÃAD.Ä"D,Ä#
D.r  )rã   únodes.CollectorrC   r	   ru   r&   )ru   z&Iterable[nodes.Item | nodes.Collector])
r    r  r  r  r  Úclassmethodrò   r@   r  Ú__classcell__©r&  s   @rk   rñ   rñ     sB   ø† ñ	ð ð=àð=ð ð	=ð
 
ö=ó ð=÷ ò  rm   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 | ExitCoder‚   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á   rC   Úfspathrã   r¦   r~   rø   r   FrA   r~   )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     €rk   r  ÚSession.__init__O  sÌ   ø€ Ü‰ÑØØ—‘ØØØØØð 	ñ 	
ð ˆÔØˆÔØ',ˆÔØ',ˆÔØ—\‘\×&Ñ&×*Ñ*¨<Ó8ˆŒ
Ü.7«kˆÔÜ;D»;ˆÔ'ØFHˆŒØ8:ˆÔØGIˆÔØ')ˆŒ
ä2DÀVÇ_Á_Ó2UˆÔà�‰×!Ñ!×*Ñ*¨4°iÐ*Ò@rm   c                ó$   • U R                  US9nU$ )Nr®   )Ú_create)r%  r¦   r~   s      rk   r„   ÚSession.from_configi  s   € àŸ;™;¨f˜;Ð5ˆØˆrm   c           	     ó    • SU R                   R                   SU R                   SU R                   SU R                   S3	[        U SS5      -  $ )NÚ<Ú z exitstatus=%r testsfailed=z testscollected=Ú>r‚   z<UNSET>)r&  r    rá   r³   r´   Úgetattr©r  s    rk   Ú__repr__ÚSession.__repr__n  s_   € à�—‘×'Ñ'Ð(¨¨$¯)©)¨ð 5à×+Ñ+Ð,ð -Ø"×1Ñ1Ð2°!ð5ô �D˜,¨	Ó2ñ3ð 	3rm   c                ó   • U R                   $ r¬   )r?  rV  s    rk   rÄ   ÚSession.shouldstopv  ó   € à×ÑÐrm   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.r   ©Ú
stacklevel)r?  ÚwarningsÚwarnr%   ©r  r”   s     rk   rÄ   rZ  z  ó:   € ð �EŠ>˜d×.×.Ü�MŠMÜØYóð ò	ð Ø Õrm   c                ó   • U R                   $ r¬   )r@  rV  s    rk   rÃ   ÚSession.shouldfailˆ  r[  rm   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.r   r]  )r@  r_  r`  r%   ra  s     rk   rÃ   rd  Œ  rb  rm   c                óB   • U R                   R                  R                  $ )zAThe path from which pytest was invoked.

.. versionadded:: 7.0.0
)r¦   Úinvocation_paramsrF   rV  s    rk   r£   ÚSession.startpathš  s   € ð �{‰{×,Ñ,×0Ñ0Ð0rm   c                ó    • U R                   U   $ r¬   )rJ  )r  Ú	node_paths     rk   Ú_node_location_to_relpathÚ!Session._node_location_to_relpath¢  s   € à×%Ñ% iÑ0Ð0rm   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½   rV  s    rk   Úpytest_collectstartÚSession.pytest_collectstart¦  s=   € à�?�?Ø—+‘+˜dŸo™oÓ.Ð.Ø�?�?Ø×"Ñ" 4§?¡?Ó3Ð3ð rm   c                ó  • UR                   (       aq  [        US5      (       d_  U =R                  S-  sl        U R                  R	                  S5      nU(       a'  U R                  U:¼  a  SU R                   S3U l        g g g g g )NÚwasxfailr,   r+   zstopping after z	 failures)ÚfailedÚhasattrr³   r¦   ÚgetvaluerÃ   )r  Úreportr+   s      rk   Úpytest_runtest_logreportÚ Session.pytest_runtest_logreport­  so   € à�=�=¤¨°×!<Ñ!<Ø×Ò Ñ!ÕØ—k‘k×*Ñ*¨9Ó5ˆGÞ˜4×+Ñ+¨wÓ6Ø$3°D×4DÑ4DÐ3EÀYÐ"O�•ð 7ˆwð "=ˆ=rm   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	   rF  rE  )r  rC   r*  Úpath_s       rk   r.  ÚSession.isinitpath·  s<   € ô$ # 4¬×.Ñ.‘´D¸³JˆÞØ×;Ñ;Ñ;Ð;à×.Ñ.Ñ.Ð.rm   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¦   rK  Ú_getconftestmodulesÚ_conftest_pluginsÚ
differencer   r  r‡   )r  r=  rC   r  Úmy_conftestmodulesr  Úproxys          rk   ÚgethookproxyÚSession.gethookproxyÏ  s�   € ä# F¬D×1Ñ1‰v´t¸F³|ˆØ�[‰[×&Ñ&ˆð  ×3Ñ3°DÓ9ÐØ×*Ñ*×5Ñ5Ð6HÓIˆæä&¤{°2Ó'CÓDˆEð ˆð —K‘K×$Ñ$ˆEØˆrm   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ç   r‚  rã   rô   rÉ   r/  )r  rC   Ú
path_cacher-  r1  r2  s         rk   Ú_collect_pathÚSession._collect_pathà  sœ   € ð ÓØÑ#Ð#à�;‰;�=‰=Ø×%Ñ% d§k¡kÓ2ˆEØ*/×*HÑ*HØð +Ið +ˆCð 9<¹¨s©fÈR‰Dà�\‰\�^‰^Ø×%Ñ% dÓ+ˆEØ×,Ñ,°tÐ,ÐI‰Dð ˆDà�4ÑØˆrm   c                ó   • g r¬   r  ©r  rQ   Úgenitemss      rk   r·   ÚSession.perform_collectÿ  s   € ð  #rm   c                ó   • g r¬   r  r‰  s      rk   r·   r‹    s   € ð 25rm   c                ó:  • 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U R                   R                  S5      n / n/ n[        U5       VV	s/ s HN  u  p‰[        U R                   R                  R                  U	UU R                   R                  R                   US9PMP     n
nn	U R                   R#                  S5      (       d  [%        U
5      U l        OX l        U R                   H^  n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        [5        U 5      nU R6                  R9                  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=     [;        U6 eU(       d  UR<                  nONUR>                  (       a=  UR<                   H-  nU R                  R+                  U RA                  U5      5        M/     U R                   RB                  RE                  5         URG                  X R                   US9  / U l        / U l        0 U l        URI                  U S9  U(       a  [K        U5      U l&        U$ s  sn	nf ! / U l        / U l        0 U l        URI                  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·   r,   rZ   ©Ú	as_pypathrZ   rI   ©rv  znot found: z
(no match in any of Ú)zfound no collectors for )r~   r¦   rÀ   r}   )'r¦   rQ   rA  rB  Úindentr‡   rG  rH  rI  rÀ   rè   r¿   Úresolve_collection_argumentrg  rF   rž   Úpyargsrä   Únormalize_collection_argumentsr=   rC   rå   rp   rD  rE  rF  r#   r-  Úpytest_collectreportr   ÚresultÚpassedrŠ  rK  Úcheck_pendingrÿ   Úpytest_collection_finishrÁ   r´   )r  rQ   rŠ  r‡   rÀ   rZ   ÚinitialpathsÚinitialpaths_with_parentsrÅ   ÚargÚcollection_argsÚcollection_argumentÚrepÚerrorsÚ
collectorsÚnodes                   rk   r·   r‹  	  s  € ð  ‰<Ø—;‘;×#Ñ#ˆDà�
‰
Ð$ dÔ1Ø�
‰
�‰×Ò !Ñ#Õà�{‰{×ÑˆàˆŒØ ˆÔØ!#ˆÔØˆŒ
Ø8<¿
¹
ˆØ,0¯K©K×,>Ñ,>Ø)ó-
Ð#ð:	8Ø')ˆLØ46Ð%ô (¨œoô	ò .‘F�Aô ,Ø—K‘K×1Ñ1×5Ñ5ØØØ"Ÿk™k×0Ñ0×7Ñ7Ø0Kôñ .ð ñ 	ð —;‘;×(Ñ(Ð)9×:Ñ:ä&DÀ_Ó&U�Õ#à&5Ô#à'+×':Ô':Ð#Ø×#Ñ#Ð$7×$<Ñ$<Ô=Ø)×0Ñ0Ð1D×1IÑ1IÔJØ)×0Ñ0Ð1D×1IÑ1I×1QÑ1QÖRñ (;ô "+¨<Ó!8ˆDÔÜ.7Ð8QÓ.RˆDÔ+ä" 4Ó(ˆCØ�J‰J×+Ñ+°3Ð+Ñ7Ø�J‰J�O‰O×"Ò" aÑ'Õ"Ø�~�~Ø�Ø'+§~¤~‘O�CÞ!ØŸ™Ø)¨#¨Ð.DÀZÁNÐRSÐTöð Ÿ™Ð(@ÀÀÐ&FÖGñ (6ô ! &Ð)Ð)æØŸ
™
‘à—:—:Ø #§
¤
˜ØŸ
™
×)Ñ)¨$¯-©-¸Ó*=Ö>ñ !+ð �K‰K×%Ñ%×3Ñ3Ô5Ø×.Ñ.Ø§[¡[¸ð /ñ ð  ˆDŒNØ"$ˆDÔØ%'ˆDÔ"Ø×)Ñ)°$Ð)Ñ7æÜ"% e£*ˆDÔàˆùów	øðf  ˆDŒNØ"$ˆDÔØ%'ˆDÔ"Ø×)Ñ)°$Ð)Ò7ús    Â/M4 ÃAM.ÄHM4 Í.M4 Í4&Nc                óŽ   • XR                   ;   a  U(       a  U R                   U   nUS4$ [        U5      nX0R                   U'   US4$ )NTF)rI  r#   )r  r£  Úhandle_dupesr   s       rk   Ú_collect_one_nodeÚSession._collect_one_nodej  sN   € ð
 ×)Ñ)Ó)®lØ×(Ñ(¨Ñ.ˆCØ˜�9Ðä" 4Ó(ˆCØ+.×"Ñ" 4Ñ(Ø˜�:Ðrm   c              #  ót  #   • 0 nU R                   R                  nU R                   GH  nU R                  SU5        U R                  R                  =R
                  S-  sl        UR                  n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  p¹U[!        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aJ  UR%                  5       u  nnU(       d  Uv •  SnM*  ['        U[(        R*                  5      (       d  MK  ['        U[,        5      (       a0  ['        US   [.        5      (       d   eUR1                  US   U5      nO­[!        U5      S:H  =(       a-    ['        US   [.        5      =(       a    US   R3                  5       (       + nU R5                  UU5      u  nnU(       d*  UR6                  (       d  UR8                  R;                  US	9  UR6                  (       d  GM1  UR<                  nSn[?        U5       Hâ  n['        US   [.        5      (       aG  UR                  US   :H  n[@        RB                  S
:X  a   U(       d  [E        UR                  US   5      nO_[!        U5      S:X  a>  Ub  URF                  US   U-   :H  nO7URF                  R                  S5      S   US   :H  nOURF                  US   :H  nU(       d  MÊ  URI                  UUSS  45        SnMä     U(       d  URI                  U5        U(       a  GMJ  U(       d;  SRK                  [M        U5      /UQ75      nU RN                  RI                  UU45        U R                  R                  =R
                  S-  sl        GM     g 7f)Nzprocessing argumentr,   zinvalid arg r   Ú.r   FTr�  Úwin32Ú[ú::)(r¦   rK  rH  rA  rB  r’  rC   ÚpartsÚparametrizationÚmodule_namerç   rp   Ú_is_in_confcutdirÚinsertÚsplitr¿   rÁ   ÚstemÚpopr“   r   Ú	Collectorrƒ   r	   r†  rÉ   r¦  r˜  r-  r–  r—  Úreversedr–   Úplatformr   rá   r=   Újoinrg   rG  )r  r…  r  rŸ  ÚargpathÚnamesr®  r¯  ÚpathsrC   Úmodule_name_partsrÅ   Úany_matched_in_initial_partÚnotfound_collectorsÚworkÚ	matchnodeÚ
matchpartsÚsubnodesr¥  r   Ú	duplicateÚany_matched_in_collectorr£  Úis_matchÚ
report_args                            rk   r@   ÚSession.collectw  s¾  é € ð =?ˆ
à�[‰[×&Ñ&ˆà#'×#6Õ#6ÐØ�J‰JÐ,Ð.AÔBØ�J‰J�O‰O×"Ò" aÑ'Õ"à)×.Ñ.ˆGØ'×-Ñ-ˆEØ1×AÑAˆOØ-×9Ñ9ˆKð �~‰~×ÑÞ ÐE L°'Ð1AÑ0DÐ"EÓE�yà�IˆEð Ñ"à#ŸOœO�DØ×/Ñ/°×5Ñ5ÙØ—L‘L  DÖ)ò ,ð %0×$5Ñ$5°cÓ$:Ð!Ü(¨¯©¸!Ö<‘G�AØœ3Ð0Ó1Ó1°T·Y±YÐBSÐTVÑBWÓ5WÙØ—L‘L  DÖ)ñ  =ð +0Ð'Ø"$ÐàÐ'˜Ð' Ð'Ð(ðQˆD÷ Ø(,¯©«
Ñ%�	˜:ö "Ø#’OØ26Ð/Ùô " )¬U¯_©_×=Ñ=Ùô ˜i¬×1Ñ1Ü% j°¡m´T×:Ñ:Ð:Ð:Ø(×6Ñ6°zÀ!±}ÀjÓQ‘Hô
 ˜J›¨1Ñ,÷ 4Ü& z°!¡}´dÓ;÷4à& q™M×1Ñ1Ó3ô$�Lð
 &*×%;Ñ%;¸IÀ|Ó%T‘N�C˜Þ$¨S¯Z¯Zð "Ÿ™×<Ñ<ÀCÐ<ÑHØŸ:Ÿ:Ú Ø"Ÿz™z�Hð ,1Ð(Ü$ XÖ.�Dä! *¨Q¡-´×6Ñ6Ø#'§9¡9°
¸1±Ñ#=˜ÜŸ<™<¨7Ó2¾8ô
 (9¸¿¹ÀJÈqÁMÓ'R˜Høô ˜z›?¨aÓ/à.Ñ:à+/¯9©9¸
À1¹ÈÑ8WÑ+W¡ð
 ,0¯9©9¯?©?¸3Ó+?ÀÑ+BÀjÐQRÁmÑ+S¡à'+§y¡y°J¸q±MÑ'A˜Hß�xØŸ™ T¨:°a°b¨>Ð$:Ô;Ø37Ò0ñ7 /ö: 0Ø'×.Ñ.¨yÔ9÷M ‘$öP /Ø!ŸY™Y¬¨G«Ð'=°uÑ'=Ó>�
Ø—‘×%Ñ% zÐ3FÐ&GÔHà�J‰J�O‰O×"Ò" aÑ'×"Ð"òe $7ùs   ‚NP8Î	;P8ÏA1P8c              #  ó  #   • 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                  5      (       + nU R                  X5      u  p4U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»   r�  )rA  r“   r   ÚItemr-  Úpytest_itemcollectedrµ  ÚFiler¦  r˜  r—  rŠ  r–  )r  r£  r¥  r   rÃ  Úsubnodes         rk   rŠ  ÚSession.genitemsó  sÃ   é € Ø�
‰
�:˜tÔ$Ü�dœEŸJ™J×'Ñ'Ø�J‰J×+Ñ+°Ð+Ñ6Ø‹Jä˜d¤E§O¡O×4Ñ4Ð4Ð4ä)¨$´·
±
Ó;Ô;ˆLØ!×3Ñ3°DÓG‰NˆCØ�z�zØ"Ÿzœz�GØ#Ÿ}™}¨WÓ5×5Ò5ñ  *æØ—
‘
×/Ñ/°sÐ/Ò;ð ñ 6ùs   ‚CDÃDÃ+D)rJ  rI  rH  rE  rF  rG  r@  r?  rÀ   rÃ   r´   r³   rA  )r¦   r   ru   r  )r¦   r   ru   rƒ   )ru   rg   )ru   ú
bool | str)r”   rÎ  ru   r  )ru   r	   )rj  r	   ru   rg   )ru   r  )rv  zTestReport | CollectReportru   r  )rC   zstr | os.PathLike[str]r*  r<   ru   r<   )r=  zos.PathLike[str]ru   zpluggy.HookRelay)rC   r	   r…  z%dict[Path, Sequence[nodes.Collector]]ru   zSequence[nodes.Collector])..)rQ   úSequence[str] | NonerŠ  zLiteral[True]ru   zSequence[nodes.Item])rQ   rÏ  rŠ  r<   ru   z&Sequence[nodes.Item | nodes.Collector])NT)T)r£  r4  r¥  r<   ru   ztuple[CollectReport, bool])ru   z&Iterator[nodes.Item | nodes.Collector])r£  znodes.Item | nodes.Collectorru   zIterator[nodes.Item]) r    r  r  r  r  r½   rŠ   r!  r  r5  r„   rW  ÚpropertyrÄ   ÚsetterrÃ   r£   rk  r   ro  rw  r–  r.  r‚  r†  r   r·   r¦  r@   rŠ  r  r6  r7  s   @rk   rƒ   rƒ   @  s   ø‡ ñð
 €KØ€FàÓà#Ó#ØÓ÷Að4 óó ðô3ð ó ó ð ð ×Ñó!ó ð!ð ó ó ð ð ×Ñó!ó ð!ð ó1ó ð1ô1ñ �tÑó4ó ð4ñ �tÑóPó ðPð 4Ðð #ñ	/à$ð/ð ð	/ð
 
õ/ô0ð"àðð :ðð 
#ô	ð> àJMð#Ø(ð#Ø:Gð#à	ô#ó ð#ð àADð5Ø(ð5Ø:>ð5à	/ô5ó ð5ð
 CGð_Ø(ð_Ø;?ð_à	/õ_ðH "ðàðð ðð 
$õ	ôz(÷x<ò <rm   F©rZ   c               ó~  •  [         R                  R                  U 5      nUc  gUR                  b  [        UR                  5      S:X  a  UR                  $ U(       a  UR                  S   $ UR                  c  g[        R                  R                  UR                  5      $ ! [        [        [
        4 a     gf = f)z]Search sys.path for the given a dotted module name, and return its file
system path if found.Nr   )rM   ÚutilÚ	find_specÚAttributeErrorÚImportErrorÚ
ValueErrorÚsubmodule_search_locationsrÁ   Úoriginr¡   rC   Údirname)r¯  rZ   Úspecs      rk   Úsearch_pypathrÝ    s§   € ð
Ü�~‰~×'Ñ'¨Ó4ˆð �|Øð 	×'Ñ'Ñ/Üˆt×.Ñ.Ó/°1Ó4ð �{‰{Ðæ"ð ×.Ñ.¨qÑ1Ð1à‡{�{Ñàä�7‰7�?‰?˜4Ÿ;™;Ó'Ð'øô/ œK¬Ð4ó Ùðús   ‚B$ Â$B<Â;B<T)Úfrozenc                  óL   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
\S'   Srg)ÚCollectionArgumenti(  zA resolved collection argument.r	   rC   zSequence[str]r­  ú
str | Noner®  r¯  rc   Úoriginal_indexr  N)r    r  r  r  r  r!  r  r  rm   rk   rà  rà  (  s"   ‡ á)à
ƒJØÓØÓØÓØÖrm   rà  rŽ  c               óò  • UR                  S5      u  pVnUR                  S5      tp‰U(       a  U	(       d  [        SU 35      eU(       a  U U 3OSn
SnU(       a  [        X„S9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
UUS9$ )a‘  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[a,b]"

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"],
        parametrization="[a,b]",
        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¬  z(path cannot contain [] parametrization: NrÒ  z9module 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})rC   r­  r®  r¯  râ  )	Ú	partitionr²  r   rÝ  r   r   Úformatrç   rà  )Úinvocation_pathr�  Ú	arg_indexr�  rZ   rq   ÚsquacketÚrestÚstrpathr­  r®  r¯  Úpyarg_strpathr=  r{   s                  rk   r“  r“  3  s  € ðR Ÿ=™=¨Ó-Ñ€D�DØ—j‘j Ó&€O€GÞžÜÐCÀCÀ5ÐIÓJÐJÞ-5˜˜
 4 &Ñ)¸4€OØ€KÞÜ%Øñ
ˆð Ñ$Ø!ˆKØ#ˆGØÑ&€FÜ˜&Ó!€FÜ�v×Ñö ñ Hà5ð 	ô
 ˜Ÿ™¨˜Ð,Ó-Ð-Þ�—‘—‘ö ñ HàNð 	ô
 ˜Ÿ™¨˜Ð,Ó-Ð-ÜØØØ'ØØ ñð rm   c                ó°  • UR                   U R                   :w  a7  UR                  (       d%  U R                   R                  UR                   5      $ g[        UR                  5      [        U R                  5      :”  d0  U R                  S[        UR                  5       UR                  :w  a  gUR                  b  UR                  U R                  :w  a  gg)z/Check if `arg` is subsumed (contained) by `by`.FNT)rC   r­  Úis_relative_torÁ   r®  )r�  Úbys     rk   Ú"is_collection_argument_subsumed_byrð  ‚  s›   € ð
 
‡w�w�#—(‘(Óð �x�xØ—8‘8×*Ñ*¨2¯7©7Ó3Ð3Øô ˆ2�8‰8ƒ}”s˜3Ÿ9™9“~Ó%¨¯©°?´S¸¿¹³]Ð)CÀrÇxÁxÓ)OØð
 
×ÑÑ%¨"×*<Ñ*<À×@SÑ@SÓ*SØØrm   c                ó¦   • [        U S S9n/ nSnU H+  nUb  [        XC5      (       a  M  UR                  U5        UnM-     UR                  S S9  U$ )a  Normalize collection arguments to eliminate overlapping paths and parts.

Detects when collection arguments overlap in either paths or parts and only
keeps the shorter prefix, or the earliest argument if duplicate, preserving
order. The result is prefix-free.
c                óZ   • U R                   U R                  U R                  =(       d    S4$ )Nrº   )rC   r­  r®  rä  s    rk   Ú<lambda>Ú0normalize_collection_arguments.<locals>.<lambda>ª  s   € ˜Ÿ™ 3§9¡9¨c×.AÑ.A×.GÀRÑHrm   )ÚkeyNc                ó   • U R                   $ r¬   )râ  rä  s    rk   ró  rô  ²  s
   €  C×$6Ò$6rm   )Úsortedrð  r=   Úsort)rž  Úcollection_args_sortedÚ
normalizedÚ	last_keptr�  s        rk   r•  r•  š  sf   € ô $ØÙHñÐð ,.€JØ€IÛ%ˆØÑÔ$FÀs×$VÓ$VØ×Ñ˜cÔ"ØŠIñ &ð ‡O�OÑ6€OÑ7ØÐrm   )ri   r   ru   r  )rC   rg   ru   rg   )r¦   r   r§   z2Callable[[Config, Session], int | ExitCode | None]ru   r;  )r¦   r   ru   r;  )r¦   r   r~   rƒ   ru   zint | ExitCode | None)r~   rƒ   ru   r  )r~   rƒ   ru   r<   )rC   r	   ru   r<   )rÞ   r	   r¦   r   ru   zbool | None)rC   r	   rã   r4  ru   znodes.Collector | None)rÀ   zlist[nodes.Item]r¦   r   ru   r  )r¯  rg   rZ   r<   ru   rá  )rç  r	   r�  rg   rè  rc   r�  r<   rZ   r<   ru   rà  )r�  rà  rï  rà  ru   r<   )rž  zSequence[CollectionArgument]ru   zlist[CollectionArgument])\r  Ú
__future__r   rv   Úcollections.abcr   r   r   r   r   ÚAbstractSetÚdataclassesrÜ   re   rM   Úimportlib.utilr¡   Úpathlibr	   r–   Útypingr
   r   r   r   r_  ÚpluggyrŽ   r   Ú_pytest._codeÚ_pytest.configr   r   r   r   r   r   Ú_pytest.config.argparsingr   r   Ú_pytest.config.compatr   Ú_pytest.outcomesr   Ú_pytest.pathlibr   r   r   r   r   r    Ú_pytest.reportsr!   r"   Ú_pytest.runnerr#   r$   Ú_pytest.warning_typesr%   Útyping_extensionsr&   Ú_pytest.fixturesr'   rl   rh   rª   r¯   r­   r±   r²   rÌ   rï   rô   rÿ   r  rŒ   r½   r�   rŠ   Ú	dataclassÚdictrg   r  Ú	Directoryrñ   rµ  rƒ   rÝ  rà  r“  rð  r•  r  rm   rk   Ú<module>r     sX  ðÙ Nå "ã Ý $Ý $Ý $Ý $Ý .Û Û Û Û Û Û 	Ý Û 
Ý Ý Ý Ý  Û ã å Û Ý !Ý (Ý #Ý #Ý .Ý %Ý 7Ý ,Ý 4Ý !Ý (Ý 'Ý &Ý 'Ý -Ý #Ý )Ý &Ý +Ý %Ý /ö Ý&å/ô[ô|ð28Øð8ØLð8àô8ôv'ô
ôôô&ô*#ðL.Ø
ð.Ø'ð.àô.ô÷$ñ ôÐ#ô ô-ˆYô -ð ×Ñô˜˜d C˜i™ó ó ðð ô0 ˆ%�/‰/ó 0 ó ð0 ðf ô@<ˆe�o‰oó @<ó ð@<ðH >Cñ!(Øð!(Ø6:ð!(àõ!(ðH ×Ò˜dÑ#÷ð ó $ðð Ø(-ñLØðLà	ðLð ðLð
 ðLð "&ðLð õLð^Ø	ðØ!3ðà	ôð0Ø1ðàõrm   