K iJdZddlmZddlZddlZddlZddlZddlZddlm Z m Z m Z ddl m Z ddlmZddlmZddlmZmZdd lmZdd lmZdd lmZdd lmZmZmZmZd dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&d dl#m'Z'd dl(m)Z)m*Z*d dl+m,Z,d dl-m.Z.d dl/m0Z0m1Z1ddl2m2Z3ddl4m4Z5ddl6m6Z7ddl8m8Z9ddl:m:Z;ddlm?Z?d dl@mAZAede'ZBejeDZEGdd eZFd!ZGd"ZHGd#d$e!ZIGd%d&eZJGd'd(ZKGd)d*eKZLGd+d,ZMd@d-ZNdAd.ZO dBd/ZPd0ZQdCd1ZRdCd2ZS dDd3ZTdEd4ZUdFd5ZV dGd6ZWdHd7ZXdId8ZYdJd9ZZGd:d;e&jZ\dd?e%jZ`y)La Create a wheel that, when installed, will make the source package 'editable' (add it to the interpreter's path, including metadata) per PEP 660. Replaces 'setup.py develop'. .. note:: One of the mechanisms briefly mentioned in PEP 660 to implement editable installs is to create a separated directory inside ``build`` and use a .pth file to point to that directory. In the context of this file such directory is referred as *auxiliary build directory* or ``auxiliary_dir``. ) annotationsN)IterableIteratorMapping)suppress)Enum)cleandoc)chainstarmap)Path)TemporaryDirectory) TracebackType) TYPE_CHECKINGProtocolTypeVarcast)Command_normalization_path_shutilerrors namespaces)StrPath)py310py312)find_package_path) Distribution)InformationOnlySetuptoolsDeprecationWarning)build)build_py) dist_info)egg_info)install)install_scripts)Self WheelFile_P)boundc.eZdZdZdZdZdZeddZy) _EditableModea Possible editable installation modes: `lenient` (new files automatically added to the package - DEFAULT); `strict` (requires a new installation when files are added/removed); or `compat` (attempts to emulate `python setup.py develop` - DEPRECATED). strictlenientcompatc|stjS|j}|tjvrt j d|d|dk(rt jdddt|S)NzInvalid editable mode: z. Try: 'strict'.COMPATzCompat editable installsa  The 'compat' editable mode is transitional and will be removed in future versions of `setuptools`. Please adapt your code accordingly to use either the 'strict' or the 'lenient' modes. zuserguide/development_mode.html)see_docs)r.LENIENTupper __members__r OptionErrorr emit)clsmode_modes g/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/setuptools/command/editable_wheel.pyconvertz_EditableMode.convert@sv (( (   11 1$$'>thFV%WX X H  ( - -* ;  U##N)r; str | Nonereturnr.) __name__ __module__ __qualname____doc__STRICTr5r3 classmethodr>r?r=r.r.4s*FG F$$r?r.zU New or renamed files may not be automatically picked up without a new installation. zt Options like `package-data`, `include/exclude-package-data` or `packages.find.exclude/include` may have no effect. ceZdZdZdZddddeejxsdfgZdZdd Z dd Z d Z d Z dd Z ddZdZddZ ddZddZddZdZddZ ddZy)editable_wheelzBuild 'editable' wheel for development. This command is private and reserved for internal use of setuptools, users should rely on ``setuptools.build_meta`` APIs. zBDO NOT CALL DIRECTLY, INTERNAL ONLY: create PEP 660 editable wheel)z dist-dir=dz-directory to put final built distributions in)zdist-info-dir=Iz(path to a pre-build .dist-info directoryzmode=Nc<d|_d|_d|_d|_yN)dist_dir dist_info_dir project_dirr;selfs r=initialize_optionsz!editable_wheel.initialize_optionsus  ! r?c|j}|jxstj|_|j xsi|_t |jxs*tjj|jd|_y)Ndist) distributionsrc_rootoscurdirrR package_dirr rPpathjoin)rTrWs r=finalize_optionszeditable_wheel.finalize_options{s_  ==5BII++1rT]]Tbggll4;K;KV.TU r?c |jjd|j|jd|j d}|j |j |j|y#t$rR}|jjxs|jj}tj|d|dd}~wwxYw)NT)exist_ok bdist_wheelz3An error occurred when building editable wheel for zl. See debugging tips in: https://setuptools.pypa.io/en/latest/userguide/development_mode.html#debugging-tips)rPmkdir_ensure_dist_inforeinitialize_commandget_finalized_commandwrite_wheelfilerQ_create_wheel_file ExceptionrXnameget_nameradd_note)rTrbexprojects r=runzeditable_wheel.runs  MM    .  " " $  % %m 444]CK  ' '(:(: ;  # #K 0 '',,L0A0A0J0J0LG NNEgYOff   sA:A== CA CCcx|jbtt|jd}|j|_|j |j|j|_yt|jjdsJt|jdjsJy)Nr$z .dist-infoMETADATA) rQr dist_info_clsrerP output_dirensure_finalizedrostrendswithr exists)rTr$s r=rdz editable_wheel._ensure_dist_infos    %]D,E,Ek,RSI#'==I  & & ( MMO!*!8!8D t))*33LA AA**J7>>@ @@r?c|j}|jsyt|j|jj ddj }t||||}|jy)NrM.) rXnamespace_packagesr rRr\getresolve_NamespaceInstallerinstall_namespaces)rTinstallation_dir pth_prefixrWrY installers r=_install_namespacesz"editable_wheel._install_namespacessd  && (($*:*:*>*>r3*GHPPR'.> HU $$&r?c|jrt|jjn t}tt|j d}t |dS)Nz *.egg-info)rQr parentmapruglobnext)rT parent_dir candidatess r=_find_egg_info_dirz!editable_wheel._find_egg_info_dirsH8<8J8JT$,,-44PTPV jool;< J%%r?c|j}t|}t|}tt||dd}tt||dd}tt||dd} tt|j dd} t|| _d| _tt|j dd} tt|j d d} |x| _ x| _ | _ |x| _ x| _| _| x| _| _|| _|| _|j)d } d | _tt,|j)d }d|_t|| _tt2|j)d }d|_|j7|_|j;| j=| j=y)aConfigure commands to behave in the following ways: - Build commands can write to ``build_lib`` if they really want to... (but this folder is expected to be ignored and modules are expected to live in the project directory...) - Binary extensions should be built in-place (editable_mode = True) - Data/header/script files are not part of the "editable" specification so they are written directly to the unpacked_wheel directory. z.datadataheadersscriptsr%T)reinit_subcommandsr"r& build_scriptspythonr'r#FN)rXrur r egg_info_clsreegg_baseignore_egg_info_in_manifest build_cls install_cls build_platlib build_purelib build_libinstall_purelibinstall_platlib install_libr'rinstall_headers install_dataget_command_obj executableinstall_scripts_clsno_ep build_temp build_py_clscompilerexisting_egg_info_dir_set_editable_modert)rTrjunpacked_wheelrtmp_dirrWwheelrrrr%r"r&rr'r#s r=_configure_buildzeditable_wheel._configure_builds  N# N 44&?@d>dV5>9EFd>dV5>9EF $33JSW3X  L/3, t00T0R  229QU2V GPOOe1EORWWW'"9Gg}i}|jd}|jD]r}|j|}t|dr#|j|j xsgt|dsP|j |j xsit||fS)Nr" get_outputsget_output_mapping)rfrrextendrupdater)rTfilesmappingr"rrs r=_collect_build_outputsz%editable_wheel._collect_build_outputss"$**73..0 ?H,,X6CsM* S__.4"5s01s557=2>  ?g~r?c|j|||||j|j\}}|jd|jd|jd||fS)Nrrr)r_run_build_subcommandsr _run_install)rT dist_namerrrrrs r=_run_build_commandsz"editable_wheel._run_build_commandssj iGL ##%446w )$ )$ &!g~r?c|jd}|jD]L}|j|}|dk(r#t|tur|j |<|j |Ny)a} Issue #3501 indicates that some plugins/customizations might rely on: 1. ``build_py`` not running 2. ``build_py`` always copying files to ``build_lib`` However both these assumptions may be false in editable_wheel. This method implements a temporary workaround to support the ecosystem while the implementations catch up. r"r#N)rfrtyper _safely_run run_command)rTr"rjrs r=rz%editable_wheel._run_build_subcommandssk**73**, 'D,,T2Cz!d3i|&C  &  &  'r?c  |j|S#t$r5tjddt j d|d|dYywxYw)Nz0Customization incompatible with editable installz z If you are seeing this warning it is very likely that a setuptools plugin or customization overrides the `a` command, without taking into consideration how editable installs run build steps starting from setuptools v64.0.0. Plugin authors and developers relying on custom build steps are encouraged to update their `aa` implementation considering the information about editable installs in https://setuptools.pypa.io/en/latest/userguide/extension.html. For the time being `setuptools` will silence this error and ignore the faulty command, but this behavior will change in future versions. )rrir r9 traceback format_exc)rTrs r=rzeditable_wheel._safely_run-sp ##H- -  ( - -B%%'()89AzB- .6J7  s;AAc ddlm}|jd}|j}dj |j }d}|d|d|d}t |j|}|jr|jt|} td} td } | 5} | 5} | 5}t | t |jj}tj|j||j| ||j|| | |\}}|j!||| }|5||d 5}|||||j#| ddddddddddddddd|S#1swY+xYw#1swY/xYw#1swY3xYw#1swY7xYw#1swY|SxYw) Nrr)r$-z 0.editablez.whl)suffixz .build-libz .build-tempw)wheel.wheelfiler*rfrjr^get_tagr rPrwunlinkr rQshutilcopytreerr_select_strategy write_files)rTrbr*r$rtag build_tag archive_name wheel_pathrr build_tmpunpackedlibtmpunpacked_dist_inforrstrategy wheel_objs r=rhz!editable_wheel._create_wheel_fileIs-..{; NN hh{**,- #Ai[#d; $--6        +<@&l; &m<  0x 0c9 0!%hT5G5G0H0M0M!N  OOD..0B C  $ $Xy 9!55i3PSTNE7,,YSAH 09Z5 0E73%%h/ 0 0  0 0 0  0 0 0 0  0 0 0 0 0sm,F:/F.2BF": F F F (F"0F.8F: FF F F""F+ 'F..F7 3F::Gct|jd|d}|r6|r.tjd|d|j d|yyy)Nhas_z Installing z as non editableinstall_)getattrrX_loggerinfor)rTcategory has_categorys r=rzeditable_wheel._run_installesVt00D 2CTJ LN LL;xj0@A B   xz2 3+|jjdd} t|j|t|| gSt!|j|S)zDDecides which strategy to use to implement an editable installation. __editable__.rr"rMry)r rRr.r>r;rF _empty_dir _LinkTreerX_find_packages_simple_layoutr\r3setr{ _StaticPth_TopLevelFinder) rTrjrr build_namerRr; auxiliary_dirpackageshas_simple_layoutis_compat_modesrc_dirs r=rzeditable_wheel._select_strategyks%TF!C51 4++, $$TYY/ ='' '&tD,<,.&&**2s3Gd//['8R7ST Tt00$77r?rANone)rAr@)rjrurrrrrr)rA tuple[list[str], dict[str, str]]) rrurrrrrrrAr)rru)rru)rjrurrurrrAEditableStrategy)rBrCrDrE descriptionr r. user_optionsrUr_rordrrrrrrrrrhrrrHr?r=rJrJgs WK LK $!6!6!<"=>L  V * A'& =#=#)0=#=D=#OV=#~ #         * ',884 888 8  8r?rJcDeZdZ ddZddZ ddZy)rcyrOrH)rTrrrs r=__call__zEditableStrategy.__call__sr?cyrOrHrSs r= __enter__zEditableStrategy.__enter__sr?cyrOrHrT _exc_type _exc_value _tracebacks r=__exit__zEditableStrategy.__exit__s r?N)rr*r list[str]rMapping[str, str]rAobjectrAr()rztype[BaseException] | NonerzBaseException | NonerzTracebackType | NonerAr)rBrCrDrrrrHr?r=rrsW'0;L %-))   r?rc<eZdZddZddZddZ d dZy) rc.||_||_||_yrO)rWrj path_entries)rTrWrjr s r=__init__z_StaticPth.__init__s  (r?cdjd|jD}t|d}|jd|jd|y)N c3NK|]}t|jywrO)rur|).0ps r= z&_StaticPth.__call__..sHC ,Hs#%r.pth)r^r  _encode_pthwritestrrj)rTrrrentriescontentss r=rz_StaticPth.__call__sG))Hd6G6GHH'"~. tyyk6Ar?cdtttj|jd}t j |tz|S)Nz_ Editable install will be performed using .pth file to extend `sys.path` with: z )listrrZfspathr rwarning_LENIENT_WARNINGrTmsgs r=rz_StaticPth.__enter__sH c"))T../ 034   ../ r?cyrOrHrs r=rz_StaticPth.__exit__s r?N)rWrrjrur z list[Path]rArrr*rrrrrrrrrrrrAr)rBrCrDr rrrrHr?r=rrs=) B        r?rc~eZdZdZ d fd Zd fd Zd dZd d dZddZddZ ddZ xZ S)ra` Creates a ``.pth`` file that points to a link tree in the ``auxiliary_dir``. This strategy will only link files (not dirs), so it can be implemented in any OS, even if that means using hardlinks instead of symlinks. By collocating ``auxiliary_dir`` and the original source code, limitations with hardlinks should be avoided. ct||_t|j|_|j dj |_t|!|||jgy)Nr#) r rr|rr copy_file_filesuperr )rTrWrjrr __class__s r=r z_LinkTree.__init__sX"-0i002))*5??  td&8&8%9:r?cL|j||t| |||yrO) _create_linksr&r)rTrrrr's r=rz_LinkTree.__call__s$ 5'* w/r?ctt5t|jj |j }t |jtjdcdddS#1swYyxYw)N/) r ValueErrorr r| relative_torrureplacerZsep)rTfiler]s r=_normalize_outputz_LinkTree._normalize_outputs] j ! 2:%%'33DNNCDt9$$RVVS1 2 2 2s AA55A>c|j|z }|jjs|jjd|j |||y)NT)parentslink)rris_dirrcr%)rTrelative_outputsrc_filer5dests r= _create_filez_LinkTree._create_filesI!!O3{{!!# KK  d  + 8T -r?cjjddtjrdnd}fd|jD}|Dcic] \}}| || }}}|D]-}j |} | s| |vsj | |/|jD]\} } j | | |ycc}}w)NT)r3rasymhardc3JK|]\}}j||fywrO)r1)rkvrTs r=rz*_LinkTree._create_links..s%XAt--a0!4Xs #r4)rrc_can_symlink_filesitemsr1r:) rToutputsoutput_mapping link_type normalisedr?r@mappingsoutputrelativesrcs ` r=r)z_LinkTree._create_linkss    =/0B0BCE XAUAUAWX %/ATQ1=AqDAA 4F--f5HHH4!!(F3 4 &^^- =MHc   h)  < =Bs  C!CcBd}tj|tz|S)Nz=Strict editable install will be performed using a link tree. )rr_STRICT_WARNINGrs r=rz_LinkTree.__enter__sNo-. r?cPd|jd}tjd|y)Nz\ Strict editable installation performed using the auxiliary directory: z Please be careful to not remove this directory, otherwise you might not be able to import/use your package. Editable installation.)rrr9rTrrrrs r=rz_LinkTree.__exit__s2     !   5s;r?) rWrrjrurrrrrArr )r0rurAr@rO)r7rur8ru)rDrrr!) rBrCrDrEr rr1r:r)rr __classcell__)r's@r=rrs ; ; ; ;  ;  ;0. = < < < <  . sDb"bDsrMrz.finder)rWrYrZr[r r_find_top_level_modulesr\_find_package_rootsdict_find_namespacesr_find_virtual_namespacesrzrrjrsafe_identifier) rTrY top_levelr\roots namespaces_pkglegacy_namespacesrrjfinders r= template_varsz_TopLevelFinder.template_varss+99%%2.35LTYY5WX ii++1r #I{HE  !3!3!9r5AD$>> _simple_layout(['a'], {"": "src"}, "/tmp/myproj") True >>> _simple_layout(['a', 'a.b'], {"": "src"}, "/tmp/myproj") True >>> _simple_layout(['a', 'a.b'], {}, "/tmp/myproj") True >>> _simple_layout(['a', 'a.a1', 'a.a1.a2', 'b'], {"": "src"}, "/tmp/myproj") True >>> _simple_layout(['a', 'a.a1', 'a.a1.a2', 'b'], {"a": "a", "b": "b"}, ".") True >>> _simple_layout(['a', 'a.a1', 'a.a1.a2', 'b'], {"a": "_a", "b": "_b"}, ".") False >>> _simple_layout(['a', 'a.a1', 'a.a1.a2', 'b'], {"a": "_a"}, "/tmp/myproj") False >>> _simple_layout(['a', 'a.a1', 'a.a1.a2', 'b'], {"a.a1.a2": "_a2"}, ".") False >>> _simple_layout(['a', 'a.b'], {"": "src", "a.b": "_ab"}, "/tmp/myproj") False >>> # Special cases, no packages yet: >>> _simple_layout([], {"": "src"}, "/tmp/myproj") True >>> _simple_layout([], {"a": "_a", "": "src"}, "/tmp/myproj") False rMc 3K|]6\}}tjtg|jd|8ywryN)r same_pathr split)rkeyvaluers r=rz!_simple_layout..s: C V5ciin5u=sPX Xc$S+{CC XF X ;B:-- WW   flln E FF  ,,.  YsB c|j|r|dt| n|}|jdtjzS)a7Infer the parent path containing a package, that if added to ``sys.path`` would allow importing that package. When ``pkg`` is directly mapped into a directory with a different name, return its own path. >>> _parent_path("a", "src/a") 'src' >>> _parent_path("b", "src/c") 'src/c' Nr+)rvlenrstriprZr/)r_pkg_pathrs r=rrs<'/&7&7&c3#:c>N> &&," ;Ha#-166HH ))#. A )? Is8C CC  CC2C 8C C'C  C c#K|jxsg}d|DEd{|js"|jxsg}d|DEd{yy737w)Nc3*K|] }d|vs| ywrrH)rrs r=rz*_find_top_level_modules..s<S^.sEq3aff3DAFFEs'')rrr)rWrrs r=rVrVsZ&BJ>#ejj011r?c #K|D]y}d|vr|jd}tt|dz ddD]E}dj|d|}t t ||d}|j r||vsB|G{yw)a8By carefully designing ``package_dir``, it is possible to implement the logical structure of PEP 420 in a package without the corresponding directories. Moreover a parent package can be purposefully/accidentally skipped in the discovery phase (e.g. ``find_packages(include=["mypkg.*"])``, when ``mypkg.foo`` is included by ``mypkg`` itself is not). We consider this case to also be a virtual namespace (ignoring the original directory) to emulate a non-editable installation. This function will try to find these kinds of namespaces. ryr!rNrM)rrangerr^r rrw)rr_partsi partial_namer]s r=rZrZs # c>  #s5zA~q"- #A88E"1I.L), 2FGD;;=L $A""  # #s A6B9 Bc#K|D]K}t||d}t|js*t|djrE||gfMyw)NrMz __init__.py)rr rw)rrr_r]s r=rYrYsS  i4 :   tD-'@'G'G'I-  s,AA Act|j}tt|j D]:\t fd|j Ds*|j <|S)Nc3NK|]\}}|k7xrt||ywrO) _is_nested)rother other_pathr]r_s r=rz!_remove_nested..s4 !z 5L EZT5*E E s"%)rXcopyreversedrrBanypop)rrHr]r_s @@r=rrsh ).." #Fd9??#456 T  %.__%6   JJsO  Mr?ctj|}|j|ddjdj d}|j |xr"|tjt |g|k(S)a Return ``True`` if ``pkg`` is nested inside ``parent`` both logically and in the file system. >>> _is_nested("a.b", "path/a/b", "a", "path/a") True >>> _is_nested("a.b", "path/a/b", "a", "otherpath/a") False >>> _is_nested("a.b", "path/a/b", "c", "path/c") False >>> _is_nested("a.a", "path/a/a", "a", "path/a") True >>> _is_nested("b.a", "path/b/a", "a", "path/a") False rMr!ry)rnormpathr.stripr startswithr )r_rr parent_path norm_pkg_pathrests r=rrsoNN8,M ;;vr1 % + +C 0 6 6s ;D >>& ! mu~~ [ 4 8'r?c^tj|dtj||S)zFCreate a directory ensured to be empty. Existing files may be removed.T) ignore_errors)rrmtreerZmakedirs)dir_s r=rrs! NN4t,KK Kr?c eZdZddZdZdZy)r}cX||_||_||_||_g|_d|_y)NF)rXrYr editable_namerCdry_run)rTrXrrrYs r=r z_NamespaceInstaller.__init__s/(  0*"$  r?ctjj|j|j|j zS)zInstallation target.)rZr]r^rr nspkg_extrSs r=_get_nspkg_filez#_NamespaceInstaller._get_nspkg_files,ww||D1143E3E3VWWr?c>tt|jS)z1Where the modules/packages should be loaded from.)reprrurYrSs r= _get_rootz_NamespaceInstaller._get_root#sC &''r?Nr)rBrCrDr rrrHr?r=r}r}sX(r?r}a from __future__ import annotations import sys from importlib.machinery import ModuleSpec, PathFinder from importlib.machinery import all_suffixes as module_suffixes from importlib.util import spec_from_file_location from itertools import chain from pathlib import Path MAPPING: dict[str, str] = {mapping!r} NAMESPACES: dict[str, list[str]] = {namespaces!r} PATH_PLACEHOLDER = {name!r} + ".__path_hook__" class _EditableFinder: # MetaPathFinder @classmethod def find_spec(cls, fullname: str, path=None, target=None) -> ModuleSpec | None: # type: ignore # Top-level packages and modules (we know these exist in the FS) if fullname in MAPPING: pkg_path = MAPPING[fullname] return cls._find_spec(fullname, Path(pkg_path)) # Handle immediate children modules (required for namespaces to work) # To avoid problems with case sensitivity in the file system we delegate # to the importlib.machinery implementation. parent, _, child = fullname.rpartition(".") if parent and parent in MAPPING: return PathFinder.find_spec(fullname, path=[MAPPING[parent]]) # Other levels of nesting should be handled automatically by importlib # using the parent path. return None @classmethod def _find_spec(cls, fullname: str, candidate_path: Path) -> ModuleSpec | None: init = candidate_path / "__init__.py" candidates = (candidate_path.with_suffix(x) for x in module_suffixes()) for candidate in chain([init], candidates): if candidate.exists(): return spec_from_file_location(fullname, candidate) return None class _EditableNamespaceFinder: # PathEntryFinder @classmethod def _path_hook(cls, path) -> type[_EditableNamespaceFinder]: if path == PATH_PLACEHOLDER: return cls raise ImportError @classmethod def _paths(cls, fullname: str) -> list[str]: paths = NAMESPACES[fullname] if not paths and fullname in MAPPING: paths = [MAPPING[fullname]] # Always add placeholder, for 2 reasons: # 1. __path__ cannot be empty for the spec to be considered namespace. # 2. In the case of nested namespaces, we need to force # import machinery to query _EditableNamespaceFinder again. return [*paths, PATH_PLACEHOLDER] @classmethod def find_spec(cls, fullname: str, target=None) -> ModuleSpec | None: # type: ignore if fullname in NAMESPACES: spec = ModuleSpec(fullname, None, is_package=True) spec.submodule_search_locations = cls._paths(fullname) return spec return None @classmethod def find_module(cls, _fullname) -> None: return None def install(): if not any(finder == _EditableFinder for finder in sys.meta_path): sys.meta_path.append(_EditableFinder) if not NAMESPACES: return if not any(hook == _EditableNamespaceFinder._path_hook for hook in sys.path_hooks): # PathEntryFinder is needed to create NamespaceSpec without private APIS sys.path_hooks.append(_EditableNamespaceFinder._path_hook) if PATH_PLACEHOLDER not in sys.path: sys.path.append(PATH_PLACEHOLDER) # Used just to trigger the path hook c|tt|jd}tj |||S)z_Create a string containing the code for the``MetaPathFinder`` and ``PathEntryFinder``. c |dS)NrrH)rs r=z"_finder_template..s 1r?)rrjrr)rXrrB_FINDER_TEMPLATEformatrs r=rfrfs3 6'--/~>?G  " "g* " UUr?ceZdZdZy)rzCFile system does not seem to support either symlinks or hard links.N)rBrCrDrErHr?r=rrsMr?r)rgrurAre)rr rAbool)r Iterable[str]r\dict[str, str]rRrrAr)rWrrA Iterator[str])rrr\rrYrrAr)r]rrAru)rrrAr)rrrrrAzIterator[tuple[str, list[str]]])rrrAr) r_rurrurrurrurAr)rr+rAr+)rjrurrrzdict[str, list[str]]rAru)arE __future__rrologgingrZrrcollections.abcrrr contextlibrenumrinspectr itertoolsr r pathlibr tempfiler typesrtypingrrrrrMrrrrrrrr1rr discoveryrrWrwarningsrr r"rr#rr$rrr%rr&rr'rtyping_extensionsr(_vendor.wheel.wheelfiler*r+ getLoggerrBrr.rLrrJrrrrrrArrrrVrWrrZrYrrr Installerr}rrf FileErrorrrHr?r=rs #  77$'99JJ!)D%.1.+C&3 T! '  H %&$D&$R \8W\8~ x   8I< I