§ |<ˆjàdã óx—ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZdd lmZddl mZddl m!Z!ddl m"Z"ddl m#Z#ddl m$Z$ddl m%Z%ddl m&Z&ddl m'Z'ddl m(Z(ddl m)Z)ddl m*Z*ddl m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1dZ2e*de¬¦«Z3eeeefZ4d Z5d!„Z6d"e3d#e3fd$„Z7d"e8d%e+e9e(e)e9e9e&e j:ffd&ed#e;fd'„Zd"ed#dfd*„Z?d+ed,e8d#e$efd-„Z@d.e#ed,e8d#e$e8fd/„ZAd+ed,e8d#e$e8fd0„ZBd#eCfd1„ZDd+ed2e+e8efd3e+e8efd#dfd4„ZEdld+ed,e8d6eCd#efd7„ZFd8ed#efd9„ZGejHfd:efd;„ZId"ed#dfd<„ZJd"ed=eKd#e;fd>„ZLd"ed=eKd#dfd?„ZMd+ed,e8d@eCd#e$efdA„ZNd+efdB„ZOd+ed,e8d@eCd=eKd#df dC„ZPd+ed,e8d@eCdDeKd6eCd#ef dE„ZQdFe8dGed#efdH„ZRdIe8d"e+e8dJfd#e;fdK„ZSdLe8d#e'e8fdM„ZTdN„ZUGdO„dPe ¦«ZVGdQ„dReW¦«ZXeVjYdSœd8e+e8dJfd6e+e8eVfd+ed#efdT„ZZej[ \dU¦«r dVe8dWe8d#e;fdX„Z]n dVe8dWe8d#e;fdY„Z]d"ed+ed#e8fdZ„Z^d[e"e8efd\e8d#dfd]„Z_d"ed#e&efd^„Z`d"e+e8dJfd#e%d_fd`„Zad"e+e8dJfdae!d_ge;fd#e$d_fdb„Zbd"e+ee8fd#efdc„Zcddedeed#e&efdf„Zddgedhed#e8fdi„Zedjed2ed#dfdk„ZfdS)méN)ÚEnum)ÚEBADF)ÚELOOP)ÚENOENT)ÚENOTDIR)Úpartial)Ú expanduser)Ú expandvars)Úisabs)Úsep)ÚPath)ÚPurePath)Ú ModuleType)ÚCallable)ÚDict)ÚIterable)ÚIterator)ÚList)ÚOptional)ÚSet)ÚTuple)ÚType)ÚTypeVar)ÚUnion)Ú assert_never)Úskip)Ú PytestWarningi€ôÚ _AnyPurePath)Úbound)éi�cób—t|dd¦«tvpt|dd¦«tvS)NÚerrnoÚwinerror)ÚgetattrÚ_IGNORED_ERRORSÚ_IGNORED_WINERRORS)Ú exceptions úa/builddir/build/BUILD/cloudlinux-venv-1.0.12/venv/lib/python3.11/site-packages/_pytest/pathlib.pyÚ _ignore_errorr);s6€å� ˜7 DÑ)Ô)­_Ð<ð FÝ �9˜j¨$Ñ /Ô /Õ3EÐ EðóÚpathÚreturncó,—| d¦«S)Nz.lock)Újoinpath©r+s r(Ú get_lock_pathr0Bs€Ø �=Š=˜Ñ !Ô !Ð!r*ÚexcinfoÚ start_pathc ó ‡—t|t¦«r|}n|d}t|t¦«rdSt|t¦«s9t jt d|›dt|¦«›d|›�¦«¦«dS|tj tj tj fvrU|tj fvrDt jt d  ||t|¦«|¦«¦«¦«dSddlŠd td dfˆfd „ }t!|¦«}| ¦«r*|jD]"}|t|¦«¦«||krnŒ#|t|¦«¦«||¦«d S) zhHandle known read-only errors during rmtree. The returned value is used only by our own tests. éFz(rm_rf) error removing ú z: z4(rm_rf) unknown function {} when removing {}: {}: {}rNÚpr,có„•—tj|¦«j}tj||‰jz‰jz¦«dS©N)ÚosÚstatÚst_modeÚchmodÚS_IRUSRÚS_IWUSR)r6Úmoder:s €r(Úchmod_rwz on_rm_rf_error..chmod_rwrs9ø€ÝŒw�q‰zŒzÔ!ˆÝ Œ��D˜4œ<Ñ'¨$¬,Ñ6Ñ7Ô7Ð7Ð7Ð7r*T)Ú isinstanceÚ BaseExceptionÚFileNotFoundErrorÚPermissionErrorÚwarningsÚwarnrÚtyper9ÚrmdirÚremoveÚunlinkÚopenÚformatr:Ústrr Úis_fileÚparents) Úfuncr+r1r2Úexcr@r6Úparentr:s @r(Úon_rm_rf_errorrSFsÁø€õ�'�=Ñ)Ô)ðØˆˆà�aŒjˆõ�#Õ(Ñ)Ô)ð؈uå �c�?Ñ +Ô +ðÝŒ Ý ÐN°DÐNÐN½DÀ¹I¼IÐNÐNÈÐNÐNÑ OÔ Oñ ô ð ðˆuà •B”H�bœi­¬Ð3Ð3Ð3Ø �œ�zÐ !Ð !Ý ŒMÝØK×RÒRؘd¥D¨¡I¤I¨sñôñôñ ô ð ðˆuð€K€K€Kð8•Cð8˜Dð8ð8ð8ð8ð8ð8õ ˆT‰ Œ €A؇y‚y�{„{ðØ”ið ð ˆFØ ˆH•S˜‘[”[Ñ !Ô !Ð !à˜Ò#Ð#Ø�ð$à €H�S�‰YŒYÑÔÐà€Dˆ�J„J€JØ ˆ4r*có¾—tj d¦«r=| ¦«}t t t |¦«¦«¦«}|S)a0Get the extended-length version of a path (Windows). On Windows, by default, the maximum length of a path (MAX_PATH) is 260 characters, and operations on paths longer than that fail. But it is possible to overcome this by converting the path to "extended-length" form before performing the operation: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation On Windows, this function returns the extended-length absolute version of path. On other platforms it returns path unchanged. Úwin32)ÚsysÚplatformÚ startswithÚresolver Úget_extended_length_path_strrMr/s r(Úensure_extended_length_pathr[…sJ€õ „|×Ò˜wÑ'Ô'ð=Ø�|Š|‰~Œ~ˆÝÕ0µ°T±´Ñ;Ô;Ñ<Ô<ˆØ €Kr*cóŠ—d}d}| ||f¦«r|S| d¦«r ||dd…zS||zS)z1Convert a path to a Windows extended length path.z\\?\z\\?\UNC\z\\éN)rX)r+Úlong_path_prefixÚunc_long_path_prefixs r(rZrZ—s`€à ÐØ)ÐØ ‡‚Ð(Ð*>Ð?Ñ@Ô@ðØˆ à ‡‚�vÑÔð/Ø# d¨1¨2¨2¤hÑ.Ð.Ø ˜dÑ "Ð"r*có—t|¦«}tt|¬¦«}tjdkr%t jt|¦«|¬¦«dSt jt|¦«|¬¦«dS)zNRemove the path contents recursively, even if some elements are read-only.)r2)éé )Úonexc)ÚonerrorN)r[rrSrVÚ version_infoÚshutilÚrmtreerM)r+rds r(Úrm_rfrh£ss€õ ' tÑ ,Ô ,€DÝ•n°Ð6Ñ6Ô6€GÝ Ô˜7Ò"Ð"ÝŒ •c˜$‘i”i wÐ/Ñ/Ô/Ð/Ð/Ð/åŒ •c˜$‘i”i¨Ð1Ñ1Ô1Ð1Ð1Ð1r*ÚrootÚprefixc#óÀK—| ¦«}| ¦«D]2}|j ¦« |¦«r|V—Œ3dS)zGFind all elements in root that begin with the prefix, case insensitive.N)ÚlowerÚiterdirÚnamerX)rirjÚl_prefixÚxs r(Ú find_prefixedrq®s^èè€à�|Š|‰~Œ~€HØ �\Š\‰^Œ^ððˆØ Œ6�<Š<‰>Œ>× $Ò $ XÑ .Ô .ð ØˆGˆGˆGøððr*Úiterc#óTK—t|¦«}|D]}|j|d…V—ŒdS)zšReturn the parts of the paths following the prefix. :param iter: Iterator over path names. :param prefix: Expected prefix of the path names. N)Úlenrn)rrrjÚp_lenr6s r(Úextract_suffixesrv¶sEèè€õ �‰KŒK€EØ ððˆØŒf�U�V�VŒnÐÐÐÐððr*có>—tt||¦«|¦«S)z+Combine find_prefixes and extract_suffixes.)rvrq)rirjs r(Ú find_suffixesrxÁs€å �M¨$°Ñ7Ô7¸Ñ @Ô @Ð@r*cóD— t|¦«S#t$rYdSwxYw)z0Parse number path suffixes, returns -1 on error.éÿÿÿÿ)ÚintÚ ValueError)Ú maybe_nums r(Ú parse_numr~Æs5€ðÝ�9‰~Œ~ÐøÝ ððð؈rˆrðøøøs ‚‘ žÚtargetÚlink_tocóÊ—| |¦«} | ¦«n#t$rYnwxYw | |¦«dS#t$rYdSwxYw)aHelper to create the current symlink. It's full of race conditions that are reasonably OK to ignore for the context of best effort linking to the latest test run. The presumption being that in case of much parallelism the inaccuracy is going to be acceptable. N)r.rJÚOSErrorÚ symlink_toÚ Exception)rirr€Úcurrent_symlinks r(Ú_force_symlinkr†Îs�€ð—m’m FÑ+Ô+€Oð Ø×ÒÑ Ô Ð Ð øÝ ð ð ð Ø ˆð øøøð Ø×"Ò" 7Ñ+Ô+Ð+Ð+Ð+øÝ ð ð ð Ø ˆˆð øøøs—,¬ 9¸9½AÁ A"Á!A"éÀr?c óŠ—td¦«D]�}tttt ||¦«¦«d¬¦«}|dz}| |›|›�¦«} | |¬¦«t||dz|¦«|cS#t$rYŒ�wxYwtd  ||¬¦«¦«‚) zKCreate a directory with an increased number as suffix for the given prefix.é rz©Údefaultr4©r?ÚcurrentzKcould not create numbered dir with prefix {prefix} in {root} after 10 tries)rjri) ÚrangeÚmaxÚmapr~rxr.Úmkdirr†r„r‚rL)rirjr?ÚiÚ max_existingÚ new_numberÚnew_paths r(Úmake_numbered_dirr–äsë€å �2‰YŒYð ð ˆå�3�y­-¸¸fÑ*EÔ*EÑFÔFÐPRÐSÑSÔSˆ Ø! AÑ%ˆ Ø—=’= FÐ!8¨JÐ!8Ð!8Ñ9Ô9ˆð Ø �NŠN ˆNÑ %Ô %Ð %õ ˜4 ¨)Ñ!3°XÑ >Ô >Ð >؈OˆOˆOøõ ð ð ð Ø ˆDð øøøõ ð 0ß06²¸fÈ4°Ñ0PÔ0Pñ ô ð sÁ#B BÂBr6cóþ—t|¦«} tjt|¦«tjtjztjzd¦«}tj¦«}t|¦« ¦«}tj ||¦«tj |¦«|  ¦«std¦«‚|S#t$r}td|›�¦«|‚d}~wwxYw)z2Create a lock to prevent premature folder cleanup.i¤z/lock path got renamed after successful creationzcannot create lockfile in N)r0r9rKrMÚO_WRONLYÚO_CREATÚO_EXCLÚgetpidÚencodeÚwriteÚcloserNr‚ÚFileExistsError)r6Ú lock_pathÚfdÚpidÚspidÚes r(Úcreate_cleanup_lockr¥ùsâ€å˜aÑ Ô €Ið Ý ŒW•S˜‘^”^¥R¤[µ2´:Ñ%=ÅÄ Ñ%IÈ5Ñ QÔ QˆõŒi‰kŒkˆÝ�3‰xŒx�ŠÑ Ô ˆÝ Œ��TÑÔÐÝ Œ�‰ Œ ˆ Ø× Ò Ñ"Ô"ð MÝÐKÑLÔLÐ LØÐøõ ð?ð?ð?ÝÐ6°1Ð6Ð6Ñ7Ô7¸QÐ>øøøøð?øøøs‘ACà C<Ã$C7Ã7C<r cól—tj¦«}||fdtdtddfd„}||¦«S)zFRegister a cleanup function for removing a lock, by default on atexit.r Ú original_pidr,Ncóˆ—tj¦«}||krdS | ¦«dS#t$rYdSwxYwr8)r9r›rJr‚)r r§Ú current_pids r(Úcleanup_on_exitz6register_cleanup_lock_removal..cleanup_on_exits\€Ý”i‘k”kˆ Ø ˜,Ò &Ð &à ˆFð Ø × Ò Ñ Ô Ð Ð Ð øÝð ð ð Ø ˆDˆDð øøøs�3³ AÁA)r9r›r r{)r Úregisterr¢rªs r(Úregister_cleanup_lock_removalr¬ sS€å Œ)‰+Œ+€Cà*3Èðð¥4ðÅ3ðÐQUððððð ˆ8�OÑ $Ô $Ð$r*có—t|¦«}d} t|¦«}|j}| dt j¦«›�¦«}| |¦«t|¦«n;#t$r.Y|�( |  ¦«dS#t$rYdSwxYwdSwxYw |�( |  ¦«dS#t$rYdSwxYwdS#|�& |  ¦«w#t$rYwwxYwwxYw)z^Remove a numbered directory if its lock can be obtained and it does not seem to be in use.Nzgarbage-) r[r¥rRr.ÚuuidÚuuid4Úrenamerhr‚rJ)r+r rRÚgarbages r(Úmaybe_delete_a_numbered_dirr²sy€õ ' tÑ ,Ô ,€DØ€IðÝ'¨Ñ-Ô-ˆ Ø”ˆà—/’/Ð";­T¬Z©\¬\Ð";Ð";Ñ<Ô<ˆØ � Š �GÑÔÐÝ ˆg‰ŒˆˆøÝ ðððð ð Ð ð Ø× Ò Ñ"Ô"Ð"Ð"Ð"øÝð ð ð Ø��ð øøøð !Ð ðøøøð ð Ð ð Ø× Ò Ñ"Ô"Ð"Ð"Ð"øÝð ð ð Ø��ð øøøð !Ð øˆ9Ð ð Ø× Ò Ñ"Ô"Ð"Ð"øÝð ð ð Ø�ð øøøð !øøøsr“A#A7Á6CÁ7 B/ÂCÂB B)Â(B)Â.B/Â/CÂ6C à CÃCÃD Ã#C8Ã7D Ã8 DÄD ÄDÄD Ú$consider_lock_dead_if_created_beforecó’—| ¦«rdSt|¦«} | ¦«sdSn#t$rYdSwxYw | ¦«j}||krGt jt¦«5| ¦« ddd¦«dS#1swxYwYdS#t$rYdSwxYw)zGCheck if `path` is deletable based on whether the lock file is expired.FTN) Ú is_symlinkr0rNr‚r:Úst_mtimeÚ contextlibÚsuppressrJr„)r+r³ÚlockÚ lock_times r(Úensure_deletabler»7s4€à ‡‚ÑÔð؈uÝ ˜Ñ Ô €DðØ�|Š|‰~Œ~ð Ø�4ð øå ððððˆuˆuðøøøð Ø—I’I‘K”KÔ(ˆ ð Ð;Ò ;Ð ;õ Ô$¥WÑ-Ô-ð ð Ø— ’ ‘ ” � Øð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ðˆuøõ ððð؈uˆuðøøøs3§>¾ A Á A ÁB8ÂB+Â+B/Â2B/Â8 CÃCcóH—t||¦«rt|¦«dSdS)z8Try to cleanup a folder if we can ensure it's deletable.N)r»r²)r+r³s r(Ú try_cleanupr½Ss3€å˜ÐBÑCÔCð*Ý# DÑ)Ô)Ð)Ð)Ð)ð*ð*r*Úkeepc #óLK—tttt||¦«¦«d¬¦«}||z }t ||¦«}t j|¦«\}}ttt||¦«¦«}t||¦«D]\}} | |kr|V—ŒdS)zIList candidates for numbered directories to be removed - follows py.path.rzrŠN) r�r�r~rxrqÚ itertoolsÚteervÚzip) rirjr¾r“Ú max_deleteÚpathsÚpaths2Únumbersr+Únumbers r(Úcleanup_candidatesrÈYs®èè€å•s�9¥m°D¸&Ñ&AÔ&AÑBÔBÈBÐOÑOÔO€LØ Ñ$€JÝ ˜$ Ñ 'Ô '€EÝ”M %Ñ(Ô(�M€Eˆ6Ý•)Õ-¨f°fÑ=Ô=Ñ>Ô>€GݘE 7Ñ+Ô+ðð‰ ˆˆfØ �ZÒ Ð ØˆJˆJˆJøððr*cóЗ| ¦«D]P}| ¦«r:| ¦« ¦«s| ¦«ŒQdSr8)rmrµrYÚexistsrJ)riÚleft_dirs r(Úcleanup_dead_symlinksrÌesh€Ø—L’L‘N”Nð"ð"ˆØ × Ò Ñ Ô ð "Ø×#Ò#Ñ%Ô%×,Ò,Ñ.Ô.ð "Ø—’Ñ!Ô!Ð!øð"ð"r*cóè—| ¦«sdSt|||¦«D]}t||¦«Œ| d¦«D]}t||¦«Œt |¦«dS)z-Cleanup for lock driven numbered directories.Nz garbage-*)rÊrÈr½ÚglobrÌ)rirjr¾r³r+s r(Úcleanup_numbered_dirrÏls�€ð �;Š;‰=Œ=ð؈Ý" 4¨°Ñ6Ô6ð@ð@ˆÝ�DÐ>Ñ?Ô?Ð?Ð?Ø— ’ ˜+Ñ&Ô&ð@ð@ˆÝ�DÐ>Ñ?Ô?Ð?Ð?å˜$ÑÔÐÐÐr*Ú lock_timeoutcóL—d}td¦«D]�} t|||¦«}|dkrt|¦«}t|¦«| ¦«j|z } t jt|||| ¦«|cS#t$r } | }Yd} ~ Œ†d} ~ wwxYw|€J‚|‚)z>Create a numbered dir with a cleanup lock and remove old ones.Nr‰r) rŽr–r¥r¬r:r¶Úatexitr«rÏr„) rirjr¾rÐr?r¤r’r6r r³rQs r(Úmake_numbered_dir_with_cleanuprÓzsÞ€ð €AÝ �2‰YŒYððˆð Ý! $¨°Ñ5Ô5ˆAà�qŠyˆyÝ/°Ñ2Ô2� Ý-¨iÑ8Ô8Ð8ð45·6²6±8´8Ô3DÀ|Ñ3SÐ 0å ŒOÝ$ØØØØ4ñ  ô ð ðˆHˆHˆHøõð ð ð ØˆAˆAˆAˆAˆAˆAøøøøð øøøð ˆ=ˆ=ˆ=Ø €Gs•5B BÂBÂBÚinputÚrootpathcó¤—t|¦«}t|¦«}t|¦«rt|¦«S| |¦«Sr8)r r r r r.)rÔrÕs r(Úresolve_from_strr×›sJ€Ý �uÑ Ô €EÝ �uÑ Ô €EÝ ˆU�|„|ð(Ý�E‰{Œ{Ðà× Ò  Ñ'Ô'Ð'r*Úpatternzos.PathLike[str]có¸—t|¦«}tj d¦«}|r2t|vr)t |vr | t t¦«}t|vr|j}nSt|¦«}|  ¦«r0tj   |¦«sdtj›|›�}tj ||¦«S)a¢A port of FNMatcher from py.path.common which works with PurePath() instances. The difference between this algorithm and PurePath.match() is that the latter matches "**" glob expressions for each part of the path, while this algorithm uses the whole path instead. For example: "tests/foo/bar/doc/test_foo.py" matches pattern "tests/**/doc/test*.py" with this algorithm, but not with PurePath.match(). This algorithm was ported to keep backward-compatibility with existing settings which assume paths match according this logic. References: * https://bugs.python.org/issue29249 * https://bugs.python.org/issue34731 ÚwinÚ*)rrVrWrXr Ú posix_sepÚreplacernrMÚ is_absoluter9r+r Úfnmatch)rØr+Úiswin32rns r(Ú fnmatch_exrá¤sÀõ$ �D‰>Œ>€DÝŒl×%Ò% eÑ,Ô,€Gàð2•3˜gÐ%Ð%­)°wÐ*>Ð*>ð—/’/¥)­SÑ1Ô1ˆå �'ÐÐØŒyˆˆå�4‰yŒyˆØ × Ò Ñ Ô ð ,¥b¤g§m¢m°GÑ&<Ô&<ð ,Ø+�"œ&Ð+ 'Ð+Ð+ˆGÝ Œ?˜4 Ñ )Ô )Ð)r*Úsc󈇗| t¦«Šˆfd„tt‰¦«¦«D¦«S)Ncó\•—h|](}tj‰d|dz…¦«pt’Œ)S)Nr4)r Újoin)Ú.0r’Úpartss €r(ú zparts..Ês4ø€Ð GÐ GÐ G°�CŒH�U˜7˜Q ™U˜7”^Ñ $Ô $Ð +­Ð GÐ GÐ Gr*)Úsplitr rŽrt)rârçs @r(rçrçÈs:ø€Ø �GŠG•C‰LŒL€EØ GÐ GÐ GÐ GµU½3¸u¹:¼:Ñ5FÔ5FÐ GÑ GÔ GÐGr*c ó¶— tjt|¦«t|¦«fi|¤ŽdS#t$r}t d|›�¦«Yd}~dSd}~wwxYw)zDMake a symlink, or skip the test in case symlinks are not supported.zsymlinks not supported: N)r9ÚsymlinkrMr‚r)ÚsrcÚdstÚkwargsr¤s r(Úsymlink_or_skiprïÍs{€ð-Ý Œ •3�s‘8”8�S ™XœXÐ0Ð0¨Ð0Ð0Ð0Ð0Ð0øÝ ð-ð-ð-Ý Ð +¨Ð +Ð +Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øøøøð-øøøs‚-1± A»AÁAcó—eZdZdZdZdZdZdS)Ú ImportModez6Possible values for `mode` parameter of `import_path`.ÚprependÚappendÚ importlibN)Ú__name__Ú __module__Ú __qualname__Ú__doc__ròrórô©r*r(rñrñÕs#€€€€€Ø@Ð@à€GØ €FØ€I€I€Ir*rñcó—eZdZdZdS)ÚImportPathMismatchErroraRaised on import_path() if there is a mismatch of __file__'s. This can happen when `import_path` is called multiple times with different filenames that has the same basename but reside in packages (for example "/tests1/test_foo.py" and "/tests2/test_foo.py"). N)rõrör÷rørùr*r(rûrûÝs€€€€€ððððr*rûrŒcóz—t|¦«}t|¦«}| ¦«st|¦«‚|tjurôt ||¦«}t jD]/}| |t|j ¦«g¦«}|�n.Œ0tj   |t|¦«¦«}|€td|›d|›�¦«‚tj   |¦«}|t j|<|j |¦«t#t j|¦«|St%|¦«}|�w|j } t'| d¦« | ¦«j¦«} | ddkr|  ¦«d | ¦«}n|j } |j}|tjurHt| ¦«t jvr,t j t| ¦«¦«nn|tjurQt| ¦«t jdkr-t j dt| ¦«¦«nt=|¦«t j|¦«t j|}|j d kr|StBj" #d d¦«} | d krÄ|j$} | €tK|| |¦«‚|  &d ¦«r | dd…} |  &tBj'd z¦«r%| dtQtBj'd z¦« …} tSt|¦«| ¦«} n#tT$rd } YnwxYw| stK|| |¦«‚|S)a±Import and return a module from the given path, which can be a file (a module) or a directory (a package). The import mechanism used is controlled by the `mode` parameter: * `mode == ImportMode.prepend`: the directory containing the module (or package, taking `__init__.py` files into account) will be put at the *start* of `sys.path` before being imported with `importlib.import_module`. * `mode == ImportMode.append`: same as `prepend`, but the directory will be appended to the end of `sys.path`, if not already in `sys.path`. * `mode == ImportMode.importlib`: uses more fine control mechanisms provided by `importlib` to import the module, which avoids having to muck with `sys.path` at all. It effectively allows having same-named test modules in different places. :param root: Used as an anchor when mode == ImportMode.importlib to obtain a unique name for the module being imported so it can safely be stored into ``sys.modules``. :raises ImportPathMismatchError: If after importing the given `path` and the module `__file__` are different. Only raised in `prepend` and `append` modes. NzCan't find module z at location ÚrzÚ__init__ú.rú __init__.pyÚPY_IGNORE_IMPORTMISMATCHÚ1)z.pycz.pyoF)+rñr rÊÚ ImportErrorrôÚmodule_name_from_pathrVÚ meta_pathÚ find_specrMrRÚutilÚspec_from_file_locationÚmodule_from_specÚmodulesÚloaderÚ exec_moduleÚinsert_missing_modulesÚresolve_package_pathÚlistÚ with_suffixÚ relative_torçÚpopråÚstemrór+ròÚinsertrÚ import_modulernr9ÚenvironÚgetÚ__file__rûÚendswithr rtÚ_is_samerC)r6r?rir+Ú module_nameÚ meta_importerÚspecÚmodÚpkg_pathÚpkg_rootÚnamesÚignoreÚ module_fileÚis_sames r(Ú import_pathr%æsp€õ> �dÑ Ô €Då �‰7Œ7€Dà �;Š;‰=Œ=ð ݘ$ÑÔÐà �zÔ#Ð#Ð#Ý+¨D°$Ñ7Ô7ˆ å œ]ð Rð RˆMØ ×*Ò*¨;½¸T¼[Ñ9IÔ9IÐ8JÑKÔKˆDØÐØ�ð õ”>×9Ò9¸+ÅsÈ4ÁyÄyÑQÔQˆDà ˆ<ÝÐS°;ÐSÐSÈTÐSÐSÑTÔTÐ TÝŒn×-Ò-¨dÑ3Ô3ˆØ#&�Œ �KÑ Ø Œ ×Ò Ñ$Ô$Ð$Ý�sœ{¨KÑ8Ô8Ð8؈ å# DÑ)Ô)€HØÐØ”?ˆÝ�T×%Ò% bÑ)Ô)×5Ò5°hÑ?Ô?ÔEÑFÔFˆØ �Œ9˜ Ò "Ð "Ø �IŠI‰KŒKˆKØ—h’h˜u‘o”oˆ ˆ à”;ˆØ”iˆ ð  �zÔ Ð Ð Ý ˆx‰=Œ=¥¤Ð (Ð (Ý ŒH�OŠO�C ™MœMÑ *Ô *Ð *øØ •Ô#Ð #Ð #Ý ˆx‰=Œ=�CœH QœKÒ 'Ð 'Ý ŒH�OŠO˜A�s 8™}œ}Ñ -Ô -Ð -øå�TÑÔÐå Ô˜KÑ(Ô(Ð(å Œ+�kÔ "€CØ „y�MÒ!Ð!؈ å ŒZ�^Š^Ð6¸Ñ ;Ô ;€FØ �‚}€}Ø”lˆ Ø Ð Ý)¨+°{ÀDÑIÔIÐ Ià × Ò Ð 0Ñ 1Ô 1ð +Ø% c r cÔ*ˆKØ × Ò ¥¤¨Ñ 6Ñ 7Ô 7ð HØ%Ð&F­#­b¬f°}Ñ.DÑ*EÔ*EÐ(FÐ&FÔGˆKð Ý�s 4™yœy¨+Ñ6Ô6ˆGˆGøÝ ð ð ð ØˆGˆGˆGð øøøðð JÝ)¨+°{ÀDÑIÔIÐ Ià €JsÍ8NÎ N%Î$N%rÚÚf1Úf2có‚—t|¦«t|¦«kptj ||¦«Sr8)r r9r+Úsamefile©r&r's r(rrUs0€Ý�B‰xŒx�4 ™8œ8Ò#Ð?¥r¤w×'7Ò'7¸¸BÑ'?Ô'?Ð?r*cóB—tj ||¦«Sr8)r9r+r)r*s r(rrZs€ÝŒw×Ò  BÑ'Ô'Ð'r*cóЗ| d¦«} | |¦«}|j}n#t$r|jdd…}YnwxYwd |¦«S)zÚ Return a dotted module name based on the given path, anchored on root. For example: path="projects/src/tests/test_foo.py" and root="/projects", the resulting module name will be "src.tests.test_foo". rýr4Nrÿ)rrrçr|rå)r+riÚ relative_pathÚ path_partss r(rr^s�€ð × Ò ˜BÑ Ô €Dð)Ø×(Ò(¨Ñ.Ô.ˆ ð#Ô(ˆ ˆ øõ ð$ð$ð$ð”Z   ”^ˆ ˆ ˆ ð$øøøð �8Š8�JÑ Ô Ðs—4´AÁAr rcó6—| d¦«}|r�||vrO tjst‚t j|¦«n&#t$rt |d¬¦«}|||<YnwxYw| d¦«d |¦«}|°dSdS)aM Used by ``import_path`` to create intermediate modules when using mode=importlib. When we want to import a module as "src.tests.test_foo" for example, we need to create empty modules "src" and "src.tests" after inserting "src.tests.test_foo", otherwise "src.tests.test_foo" is not importable by ``__import__``. rÿz6Empty module created by pytest's importmode=importlib.)ÚdocrzN) rérVrÚModuleNotFoundErrorrôrrrrå)r rÚ module_partsÚmodules r(r r ssá€ð×$Ò$ SÑ)Ô)€LØ ð-Ø ˜gÐ %Ð %ð .õ ”}ð.Ý-Ð-ÝÔ'¨ Ñ4Ô4Ð4Ð4øÝ&ð .ð .ð .Ý#ØØPðñô�ð(.�˜ Ñ$Ð$Ð$ð  .øøøð ×Ò˜ÑÔÐØ—h’h˜|Ñ,Ô,ˆ ð# ð-ð-ð-ð-ð-s�'AÁ A(Á'A(cóú—d}tj|f|j¦«D]\}| ¦«rF| d¦« ¦«sn|j ¦«sn|}Œ]|S)z¥Return the Python package path by looking for the last directory upwards which still contains an __init__.py. Returns None if it can not be determined. Nr)rÀÚchainrOÚis_dirr.rNrnÚ isidentifier)r+ÚresultrRs r(rr�sƒ€ð €FÝ”/ 4 '¨4¬<Ñ8Ô8ððˆØ �=Š=‰?Œ?ð Ø—?’? =Ñ1Ô1×9Ò9Ñ;Ô;ð Ø�Ø”;×+Ò+Ñ-Ô-ð Ø�؈FøØ €Mr*zos.DirEntry[str]có@—g}tj|¦«5}|D]T} | ¦«n'#t$r}t |¦«rYd}~Œ6‚d}~wwxYw| |¦«ŒU ddd¦«n #1swxYwY| d„¬¦«|S)z`Scan a directory recursively, in breadth-first order. The returned entries are sorted. Ncó—|jSr8)rn©Úentrys r(úzscandir..²s€ 5¤:€r*)Úkey)r9ÚscandirrNr‚r)róÚsort)r+Úentriesrâr<Úerrs r(r?r?¡s€ð €GÝ Œ�DÑ Ô ð "˜Qðð "ð "ˆEð Ø— ’ ‘”��øÝð ð ð Ý  Ñ%Ô%ðØ�H�H�H�HØøøøøð øøøð �NŠN˜5Ñ !Ô !Ð !Ð !ð "ð "ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð ‡L‚LÐ-Ð-€LÑ.Ô.Ð.Ø €Ns<—A<�2±A<² A¼AÁ A<ÁAÁAÁA<Á<BÂBÚrecursec#ó¶K—t|¦«}|Ed{V—†|D]<}| ¦«r&||¦«rt|j|¦«Ed{V—†Œ=dS)z´Walk a directory recursively, in breadth-first order. The `recurse` predicate determines whether a directory is recursed. Entries at each directory level are sorted. N)r?r6Úvisitr+)r+rCrAr<s r(rErE¶sˆèè€õ�d‰mŒm€GØÐÐÐÐÐÐÐØð2ð2ˆØ �<Š<‰>Œ>ð 2˜g˜g e™nœnð 2ݘUœZ¨Ñ1Ô1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1øð2ð2r*cót—ttj t |¦«¦«¦«S)z¶Convert a path to an absolute path using os.path.abspath. Prefer this over Path.resolve() (see #6523). Prefer this over Path.absolute() (not public, doesn't normalize). )r r9r+ÚabspathrMr/s r(Ú absolutepathrHÆs&€õ •”—’¥ D¡ ¤ Ñ*Ô*Ñ +Ô +Ð+r*Úpath1Úpath2có¶— ttj t |¦«t |¦«f¦«¦«S#t $rYdSwxYw)zŸReturn the common part shared with the other path, or None if there is no common part. If one path is relative and one is absolute, returns None. N)r r9r+Ú commonpathrMr|)rIrJs r(rLrLÏsX€ð Ý•B”G×&Ò&­¨E© ¬ µC¸±J´JÐ'?Ñ@Ô@ÑAÔAÐAøÝ ððð؈tˆtðøøøs‚AA Á AÁAÚ directoryÚdestcó’—t|t¦«sJ‚t|t¦«sJ‚||kr tjSt ||¦«}|st |¦«S| |¦«}| |¦«}tjjgtj gt|j ¦«z¢|j ¢RŽS)zåReturn a string which is a relative path from directory to dest such that directory/bestrelpath == dest. The paths must be either both absolute or both relative. If no such path can be determined, returns dest. ) rAr r9ÚcurdirrLrMrr+råÚpardirrtrç)rMrNÚbaseÚ reldirectoryÚreldests r(Ú bestrelpathrUÛsÑ€õ �i¥Ñ &Ô &Ð&Ð&Ð &Ý �d�DÑ !Ô !Ð!Ð!Ð !Ø ˆyÒÐÝŒyÐå �i Ñ &Ô &€Dð ðÝ�4‰yŒyÐØ×(Ò(¨Ñ.Ô.€LØ×Ò˜tÑ$Ô$€GÝ Œ7Œ<ð å Œ9ˆ+�˜LÔ.Ñ/Ô/Ñ /ð ð Œð  ð ð ðr*Úsourcecó—| ¦«sJ‚t|d„¬¦«D]Ö}t|¦«}| |¦«}||z }|j d¬¦«| ¦«r(| tj |¦«¦«Œ‚|  ¦«rtj ||¦«Œ¬| ¦«r| d¬¦«Œ×dS)z.Recursively copy a source directory to target.có,—| ¦« Sr8)rµr;s r(r=zcopytree..ýs€¸×9IÒ9IÑ9KÔ9KÐ5K€r*)rCT)Úexist_okN) r6rEr rrRr‘rµrƒr9ÚreadlinkrNrfÚcopyfile)rVrr<rpÚrelpathÚnewxs r(Úcopytreer^úsõ€à �=Š=‰?Œ?ÐЈ?Ý�vÐ'KÐ'KÐLÑLÔLð &ð &ˆÝ �‰KŒKˆØ—-’- Ñ'Ô'ˆØ˜ÑˆØ Œ ×Ò 4ÐÑ(Ô(Ð(Ø �<Š<‰>Œ>ð &Ø �OŠO�BœK¨™NœNÑ +Ô +Ð +Ð +Ø �YŠY‰[Œ[ð &Ý ŒO˜A˜tÑ $Ô $Ð $Ð $Ø �XŠX‰ZŒZð &Ø �JŠJ ˆJÑ %Ô %Ð %øð &ð &r*)r‡)grÒr·rßÚimportlib.utilrôrÀr9rfrVÚtypesr®rEÚenumrr"rrrrÚ functoolsrÚos.pathr r r r Úpathlibr rÚ posixpathrÜrÚtypingrrrrrrrrrrrÚ_pytest.compatrÚ_pytest.outcomesrÚ_pytest.warning_typesrÚ LOCK_TIMEOUTrr%r&r)r0rMrBÚ TracebackTypeÚboolrSr[rZrhrqrvrxr{r~r†r–r¥r«r¬r²Úfloatr»r½rÈrÌrÏrÓr×rárçrïrñrrûròr%rWrXrrr rr?rErHrLrUr^rùr*r(úrnsÞ ðØ € € € ØÐÐÐØ€€€ØÐÐÐØÐÐÐØ € € € Ø € € € Ø € € € Ø € € € Ø € € € Ø€€€ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ&Ð&Ð&Ð&Ð&Ð&ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐà'Ð'Ð'Ð'Ð'Ð'Ø!Ð!Ð!Ð!Ð!Ð!Ø/Ð/Ð/Ð/Ð/Ð/à€ ðˆw�~¨XÐ6Ñ6Ô6€ ð ˜7 E¨5Ð1€ðÐð ððð"˜ ð"¨ð"ð"ð"ð"ð<à ð<ðØØ ˆd�=Ô! =°(¸5Ô;NÔ2OÐOÔPð Rôð<ðð<ð ð<ð<ð<ð<ð~ dð¨tððððð$ # sð #¨sð #ð #ð #ð #ð2�ð2˜ð2ð2ð2ð2ð˜ð cð¨h°t¬nððððð˜8 HÔ-ð°sð¸xȼ}ðððððA˜ðA cðA¨h°s¬mðAðAðAðAð ˜Cððððð Ø ð Ø˜c 8˜mÔ,ð Ø7<¸SÀ$¸YÔ7Gð à ð ð ð ð ð, ð ˜Dð ¨#ð °Sð ÀTð ð ð ð ð*˜4ð Dððððð"=C¼Oð%ð%¨Tð%ð%ð%ð%ð" dð¨tððððð8˜4ðÀuðÐQUððððð8*�dð*À%ð*ÈDð*ð*ð*ð*ð ˜Tð ¨3ð °cð ¸hÀt¼nð ð ð ð ð" ð"ð"ð"ð"ð  Ø ð  Øð  Ø#&ð  ØNSð  à ð  ð  ð  ð  ð Ø ð à ð ð ð ðð  ð ð  ð  ð  ð ð ð ðB(˜Cð(¨4ð(°Dð(ð(ð(ð(ð!*˜ð!* 5¨Ð.@Ð)@Ô#Að!*Àdð!*ð!*ð!*ð!*ðHHˆSðH�S˜”XðHðHðHðHð -ð-ð-ððððð�ñôðððððð˜kñôðð$.Ô#5ðhðhðhØ ˆSÐ$Ð $Ô%ðhð ��Z�Ô ðhð ð hð ð hðhðhðhðZ„<×Ò˜5Ñ!Ô!ð(ð@�Sð@˜cð@ dð@ð@ð@ð@ð@ð (�Sð(˜cð( dð(ð(ð(ð(ð  ð ¨Dð °Sð ð ð ð ð*- D¨¨j¨Ô$9ð-Èð-ÐPTð-ð-ð-ð-ð:˜t𨰬ððððð"�%˜Ð/Ð/Ô0ð°TÐ:LÔ5Mððððð* 2Ø �Ð'Ð'Ô (ð 2Ø3;Ð=OÐ &�Tð & 4ð &¨Dð &ð &ð &ð &ð &ð &r*