cli-ih 0.6.3__py3-none-any.whl → 0.6.3.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cli_ih/asyncClient.py +13 -7
- cli_ih/client.py +13 -6
- {cli_ih-0.6.3.dist-info → cli_ih-0.6.3.1.dist-info}/METADATA +1 -1
- cli_ih-0.6.3.1.dist-info/RECORD +425 -0
- {cli_ih-0.6.3.dist-info → cli_ih-0.6.3.1.dist-info}/WHEEL +1 -1
- {cli_ih-0.6.3.dist-info → cli_ih-0.6.3.1.dist-info}/top_level.txt +1 -0
- venv/Lib/site-packages/__editable___cli_ih_0_6_3_1_finder.py +85 -0
- venv/Lib/site-packages/pip/__init__.py +13 -0
- venv/Lib/site-packages/pip/__main__.py +24 -0
- venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
- venv/Lib/site-packages/pip/_internal/__init__.py +18 -0
- venv/Lib/site-packages/pip/_internal/build_env.py +349 -0
- venv/Lib/site-packages/pip/_internal/cache.py +291 -0
- venv/Lib/site-packages/pip/_internal/cli/__init__.py +3 -0
- venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +184 -0
- venv/Lib/site-packages/pip/_internal/cli/base_command.py +244 -0
- venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1138 -0
- venv/Lib/site-packages/pip/_internal/cli/command_context.py +28 -0
- venv/Lib/site-packages/pip/_internal/cli/index_command.py +175 -0
- venv/Lib/site-packages/pip/_internal/cli/main.py +80 -0
- venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
- venv/Lib/site-packages/pip/_internal/cli/parser.py +298 -0
- venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +151 -0
- venv/Lib/site-packages/pip/_internal/cli/req_command.py +351 -0
- venv/Lib/site-packages/pip/_internal/cli/spinners.py +235 -0
- venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
- venv/Lib/site-packages/pip/_internal/commands/__init__.py +139 -0
- venv/Lib/site-packages/pip/_internal/commands/cache.py +231 -0
- venv/Lib/site-packages/pip/_internal/commands/check.py +66 -0
- venv/Lib/site-packages/pip/_internal/commands/completion.py +135 -0
- venv/Lib/site-packages/pip/_internal/commands/configuration.py +288 -0
- venv/Lib/site-packages/pip/_internal/commands/debug.py +203 -0
- venv/Lib/site-packages/pip/_internal/commands/download.py +145 -0
- venv/Lib/site-packages/pip/_internal/commands/freeze.py +107 -0
- venv/Lib/site-packages/pip/_internal/commands/hash.py +58 -0
- venv/Lib/site-packages/pip/_internal/commands/help.py +40 -0
- venv/Lib/site-packages/pip/_internal/commands/index.py +159 -0
- venv/Lib/site-packages/pip/_internal/commands/inspect.py +92 -0
- venv/Lib/site-packages/pip/_internal/commands/install.py +798 -0
- venv/Lib/site-packages/pip/_internal/commands/list.py +400 -0
- venv/Lib/site-packages/pip/_internal/commands/lock.py +170 -0
- venv/Lib/site-packages/pip/_internal/commands/search.py +178 -0
- venv/Lib/site-packages/pip/_internal/commands/show.py +231 -0
- venv/Lib/site-packages/pip/_internal/commands/uninstall.py +113 -0
- venv/Lib/site-packages/pip/_internal/commands/wheel.py +181 -0
- venv/Lib/site-packages/pip/_internal/configuration.py +397 -0
- venv/Lib/site-packages/pip/_internal/distributions/__init__.py +21 -0
- venv/Lib/site-packages/pip/_internal/distributions/base.py +55 -0
- venv/Lib/site-packages/pip/_internal/distributions/installed.py +33 -0
- venv/Lib/site-packages/pip/_internal/distributions/sdist.py +165 -0
- venv/Lib/site-packages/pip/_internal/distributions/wheel.py +44 -0
- venv/Lib/site-packages/pip/_internal/exceptions.py +881 -0
- venv/Lib/site-packages/pip/_internal/index/__init__.py +1 -0
- venv/Lib/site-packages/pip/_internal/index/collector.py +489 -0
- venv/Lib/site-packages/pip/_internal/index/package_finder.py +1059 -0
- venv/Lib/site-packages/pip/_internal/index/sources.py +287 -0
- venv/Lib/site-packages/pip/_internal/locations/__init__.py +441 -0
- venv/Lib/site-packages/pip/_internal/locations/_distutils.py +173 -0
- venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +215 -0
- venv/Lib/site-packages/pip/_internal/locations/base.py +82 -0
- venv/Lib/site-packages/pip/_internal/main.py +12 -0
- venv/Lib/site-packages/pip/_internal/metadata/__init__.py +164 -0
- venv/Lib/site-packages/pip/_internal/metadata/_json.py +87 -0
- venv/Lib/site-packages/pip/_internal/metadata/base.py +685 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +6 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +87 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +223 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +143 -0
- venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +298 -0
- venv/Lib/site-packages/pip/_internal/models/__init__.py +1 -0
- venv/Lib/site-packages/pip/_internal/models/candidate.py +25 -0
- venv/Lib/site-packages/pip/_internal/models/direct_url.py +227 -0
- venv/Lib/site-packages/pip/_internal/models/format_control.py +78 -0
- venv/Lib/site-packages/pip/_internal/models/index.py +28 -0
- venv/Lib/site-packages/pip/_internal/models/installation_report.py +57 -0
- venv/Lib/site-packages/pip/_internal/models/link.py +613 -0
- venv/Lib/site-packages/pip/_internal/models/pylock.py +188 -0
- venv/Lib/site-packages/pip/_internal/models/scheme.py +25 -0
- venv/Lib/site-packages/pip/_internal/models/search_scope.py +126 -0
- venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +53 -0
- venv/Lib/site-packages/pip/_internal/models/target_python.py +122 -0
- venv/Lib/site-packages/pip/_internal/models/wheel.py +141 -0
- venv/Lib/site-packages/pip/_internal/network/__init__.py +1 -0
- venv/Lib/site-packages/pip/_internal/network/auth.py +564 -0
- venv/Lib/site-packages/pip/_internal/network/cache.py +133 -0
- venv/Lib/site-packages/pip/_internal/network/download.py +342 -0
- venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +213 -0
- venv/Lib/site-packages/pip/_internal/network/session.py +528 -0
- venv/Lib/site-packages/pip/_internal/network/utils.py +98 -0
- venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +61 -0
- venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +140 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +38 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +41 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +73 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +38 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +47 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +119 -0
- venv/Lib/site-packages/pip/_internal/operations/check.py +175 -0
- venv/Lib/site-packages/pip/_internal/operations/freeze.py +259 -0
- venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +1 -0
- venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +48 -0
- venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +746 -0
- venv/Lib/site-packages/pip/_internal/operations/prepare.py +742 -0
- venv/Lib/site-packages/pip/_internal/pyproject.py +182 -0
- venv/Lib/site-packages/pip/_internal/req/__init__.py +105 -0
- venv/Lib/site-packages/pip/_internal/req/constructors.py +562 -0
- venv/Lib/site-packages/pip/_internal/req/req_dependency_group.py +75 -0
- venv/Lib/site-packages/pip/_internal/req/req_file.py +620 -0
- venv/Lib/site-packages/pip/_internal/req/req_install.py +937 -0
- venv/Lib/site-packages/pip/_internal/req/req_set.py +81 -0
- venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +639 -0
- venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/base.py +20 -0
- venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +598 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +142 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +582 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +814 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +166 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +276 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +85 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +247 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +336 -0
- venv/Lib/site-packages/pip/_internal/self_outdated_check.py +254 -0
- venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +109 -0
- venv/Lib/site-packages/pip/_internal/utils/_log.py +38 -0
- venv/Lib/site-packages/pip/_internal/utils/appdirs.py +52 -0
- venv/Lib/site-packages/pip/_internal/utils/compat.py +85 -0
- venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +201 -0
- venv/Lib/site-packages/pip/_internal/utils/datetime.py +10 -0
- venv/Lib/site-packages/pip/_internal/utils/deprecation.py +126 -0
- venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +87 -0
- venv/Lib/site-packages/pip/_internal/utils/egg_link.py +81 -0
- venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +88 -0
- venv/Lib/site-packages/pip/_internal/utils/filesystem.py +152 -0
- venv/Lib/site-packages/pip/_internal/utils/filetypes.py +24 -0
- venv/Lib/site-packages/pip/_internal/utils/glibc.py +102 -0
- venv/Lib/site-packages/pip/_internal/utils/hashes.py +150 -0
- venv/Lib/site-packages/pip/_internal/utils/logging.py +364 -0
- venv/Lib/site-packages/pip/_internal/utils/misc.py +765 -0
- venv/Lib/site-packages/pip/_internal/utils/packaging.py +44 -0
- venv/Lib/site-packages/pip/_internal/utils/retry.py +45 -0
- venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +149 -0
- venv/Lib/site-packages/pip/_internal/utils/subprocess.py +248 -0
- venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +294 -0
- venv/Lib/site-packages/pip/_internal/utils/unpacking.py +337 -0
- venv/Lib/site-packages/pip/_internal/utils/urls.py +55 -0
- venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +105 -0
- venv/Lib/site-packages/pip/_internal/utils/wheel.py +132 -0
- venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
- venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +130 -0
- venv/Lib/site-packages/pip/_internal/vcs/git.py +571 -0
- venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +186 -0
- venv/Lib/site-packages/pip/_internal/vcs/subversion.py +335 -0
- venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +693 -0
- venv/Lib/site-packages/pip/_internal/wheel_builder.py +334 -0
- venv/Lib/site-packages/pip/_vendor/__init__.py +117 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +29 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +70 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +168 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +75 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +8 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +145 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +48 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +511 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +119 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +157 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +146 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +43 -0
- venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +4 -0
- venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
- venv/Lib/site-packages/pip/_vendor/certifi/core.py +83 -0
- venv/Lib/site-packages/pip/_vendor/certifi/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/dependency_groups/__init__.py +13 -0
- venv/Lib/site-packages/pip/_vendor/dependency_groups/__main__.py +65 -0
- venv/Lib/site-packages/pip/_vendor/dependency_groups/_implementation.py +209 -0
- venv/Lib/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py +59 -0
- venv/Lib/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py +62 -0
- venv/Lib/site-packages/pip/_vendor/dependency_groups/_toml_compat.py +9 -0
- venv/Lib/site-packages/pip/_vendor/dependency_groups/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +33 -0
- venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1137 -0
- venv/Lib/site-packages/pip/_vendor/distlib/resources.py +358 -0
- venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +447 -0
- venv/Lib/site-packages/pip/_vendor/distlib/util.py +1984 -0
- venv/Lib/site-packages/pip/_vendor/distro/__init__.py +54 -0
- venv/Lib/site-packages/pip/_vendor/distro/__main__.py +4 -0
- venv/Lib/site-packages/pip/_vendor/distro/distro.py +1403 -0
- venv/Lib/site-packages/pip/_vendor/distro/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/idna/__init__.py +45 -0
- venv/Lib/site-packages/pip/_vendor/idna/codec.py +122 -0
- venv/Lib/site-packages/pip/_vendor/idna/compat.py +15 -0
- venv/Lib/site-packages/pip/_vendor/idna/core.py +437 -0
- venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +4243 -0
- venv/Lib/site-packages/pip/_vendor/idna/intranges.py +57 -0
- venv/Lib/site-packages/pip/_vendor/idna/package_data.py +1 -0
- venv/Lib/site-packages/pip/_vendor/idna/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8681 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +55 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +170 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +929 -0
- venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +15 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py +109 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +262 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +85 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_parser.py +353 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py +195 -0
- venv/Lib/site-packages/pip/_vendor/packaging/licenses/__init__.py +145 -0
- venv/Lib/site-packages/pip/_vendor/packaging/licenses/_spdx.py +759 -0
- venv/Lib/site-packages/pip/_vendor/packaging/markers.py +362 -0
- venv/Lib/site-packages/pip/_vendor/packaging/metadata.py +862 -0
- venv/Lib/site-packages/pip/_vendor/packaging/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +91 -0
- venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +1019 -0
- venv/Lib/site-packages/pip/_vendor/packaging/tags.py +656 -0
- venv/Lib/site-packages/pip/_vendor/packaging/utils.py +163 -0
- venv/Lib/site-packages/pip/_vendor/packaging/version.py +582 -0
- venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3676 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +631 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +55 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +249 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +299 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +144 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +272 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +21 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +272 -0
- venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +82 -0
- venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +17 -0
- venv/Lib/site-packages/pip/_vendor/pygments/console.py +70 -0
- venv/Lib/site-packages/pip/_vendor/pygments/filter.py +70 -0
- venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +940 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +129 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +157 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +23 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +963 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +362 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +602 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +1201 -0
- venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +43 -0
- venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +72 -0
- venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +91 -0
- venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +104 -0
- venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +247 -0
- venv/Lib/site-packages/pip/_vendor/pygments/style.py +203 -0
- venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +61 -0
- venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py +54 -0
- venv/Lib/site-packages/pip/_vendor/pygments/token.py +214 -0
- venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +153 -0
- venv/Lib/site-packages/pip/_vendor/pygments/util.py +324 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +31 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +410 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +21 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +389 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/requests/__init__.py +179 -0
- venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
- venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +50 -0
- venv/Lib/site-packages/pip/_vendor/requests/adapters.py +719 -0
- venv/Lib/site-packages/pip/_vendor/requests/api.py +157 -0
- venv/Lib/site-packages/pip/_vendor/requests/auth.py +314 -0
- venv/Lib/site-packages/pip/_vendor/requests/certs.py +17 -0
- venv/Lib/site-packages/pip/_vendor/requests/compat.py +90 -0
- venv/Lib/site-packages/pip/_vendor/requests/cookies.py +561 -0
- venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +151 -0
- venv/Lib/site-packages/pip/_vendor/requests/help.py +127 -0
- venv/Lib/site-packages/pip/_vendor/requests/hooks.py +33 -0
- venv/Lib/site-packages/pip/_vendor/requests/models.py +1039 -0
- venv/Lib/site-packages/pip/_vendor/requests/packages.py +25 -0
- venv/Lib/site-packages/pip/_vendor/requests/sessions.py +831 -0
- venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +128 -0
- venv/Lib/site-packages/pip/_vendor/requests/structures.py +99 -0
- venv/Lib/site-packages/pip/_vendor/requests/utils.py +1086 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +27 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +196 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +55 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +27 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +47 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +48 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +57 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +622 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +209 -0
- venv/Lib/site-packages/pip/_vendor/rich/__init__.py +177 -0
- venv/Lib/site-packages/pip/_vendor/rich/__main__.py +245 -0
- venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +454 -0
- venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +3610 -0
- venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +32 -0
- venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +76 -0
- venv/Lib/site-packages/pip/_vendor/rich/_extension.py +10 -0
- venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +24 -0
- venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +268 -0
- venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +94 -0
- venv/Lib/site-packages/pip/_vendor/rich/_loop.py +43 -0
- venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +69 -0
- venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +309 -0
- venv/Lib/site-packages/pip/_vendor/rich/_pick.py +17 -0
- venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +153 -0
- venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +482 -0
- venv/Lib/site-packages/pip/_vendor/rich/_stack.py +16 -0
- venv/Lib/site-packages/pip/_vendor/rich/_timer.py +19 -0
- venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +661 -0
- venv/Lib/site-packages/pip/_vendor/rich/_windows.py +71 -0
- venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +56 -0
- venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +93 -0
- venv/Lib/site-packages/pip/_vendor/rich/abc.py +33 -0
- venv/Lib/site-packages/pip/_vendor/rich/align.py +306 -0
- venv/Lib/site-packages/pip/_vendor/rich/ansi.py +241 -0
- venv/Lib/site-packages/pip/_vendor/rich/bar.py +93 -0
- venv/Lib/site-packages/pip/_vendor/rich/box.py +474 -0
- venv/Lib/site-packages/pip/_vendor/rich/cells.py +174 -0
- venv/Lib/site-packages/pip/_vendor/rich/color.py +621 -0
- venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +38 -0
- venv/Lib/site-packages/pip/_vendor/rich/columns.py +187 -0
- venv/Lib/site-packages/pip/_vendor/rich/console.py +2680 -0
- venv/Lib/site-packages/pip/_vendor/rich/constrain.py +37 -0
- venv/Lib/site-packages/pip/_vendor/rich/containers.py +167 -0
- venv/Lib/site-packages/pip/_vendor/rich/control.py +219 -0
- venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +193 -0
- venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +39 -0
- venv/Lib/site-packages/pip/_vendor/rich/emoji.py +91 -0
- venv/Lib/site-packages/pip/_vendor/rich/errors.py +34 -0
- venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +57 -0
- venv/Lib/site-packages/pip/_vendor/rich/filesize.py +88 -0
- venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +232 -0
- venv/Lib/site-packages/pip/_vendor/rich/json.py +139 -0
- venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +101 -0
- venv/Lib/site-packages/pip/_vendor/rich/layout.py +442 -0
- venv/Lib/site-packages/pip/_vendor/rich/live.py +400 -0
- venv/Lib/site-packages/pip/_vendor/rich/live_render.py +106 -0
- venv/Lib/site-packages/pip/_vendor/rich/logging.py +297 -0
- venv/Lib/site-packages/pip/_vendor/rich/markup.py +251 -0
- venv/Lib/site-packages/pip/_vendor/rich/measure.py +151 -0
- venv/Lib/site-packages/pip/_vendor/rich/padding.py +141 -0
- venv/Lib/site-packages/pip/_vendor/rich/pager.py +34 -0
- venv/Lib/site-packages/pip/_vendor/rich/palette.py +100 -0
- venv/Lib/site-packages/pip/_vendor/rich/panel.py +317 -0
- venv/Lib/site-packages/pip/_vendor/rich/pretty.py +1016 -0
- venv/Lib/site-packages/pip/_vendor/rich/progress.py +1715 -0
- venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +223 -0
- venv/Lib/site-packages/pip/_vendor/rich/prompt.py +400 -0
- venv/Lib/site-packages/pip/_vendor/rich/protocol.py +42 -0
- venv/Lib/site-packages/pip/_vendor/rich/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/rich/region.py +10 -0
- venv/Lib/site-packages/pip/_vendor/rich/repr.py +149 -0
- venv/Lib/site-packages/pip/_vendor/rich/rule.py +130 -0
- venv/Lib/site-packages/pip/_vendor/rich/scope.py +86 -0
- venv/Lib/site-packages/pip/_vendor/rich/screen.py +54 -0
- venv/Lib/site-packages/pip/_vendor/rich/segment.py +752 -0
- venv/Lib/site-packages/pip/_vendor/rich/spinner.py +132 -0
- venv/Lib/site-packages/pip/_vendor/rich/status.py +131 -0
- venv/Lib/site-packages/pip/_vendor/rich/style.py +796 -0
- venv/Lib/site-packages/pip/_vendor/rich/styled.py +42 -0
- venv/Lib/site-packages/pip/_vendor/rich/syntax.py +985 -0
- venv/Lib/site-packages/pip/_vendor/rich/table.py +1006 -0
- venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +153 -0
- venv/Lib/site-packages/pip/_vendor/rich/text.py +1361 -0
- venv/Lib/site-packages/pip/_vendor/rich/theme.py +115 -0
- venv/Lib/site-packages/pip/_vendor/rich/themes.py +5 -0
- venv/Lib/site-packages/pip/_vendor/rich/traceback.py +899 -0
- venv/Lib/site-packages/pip/_vendor/rich/tree.py +257 -0
- venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +8 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +770 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_re.py +112 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/pip/_vendor/tomli/py.typed +1 -0
- venv/Lib/site-packages/pip/_vendor/tomli_w/__init__.py +4 -0
- venv/Lib/site-packages/pip/_vendor/tomli_w/_writer.py +229 -0
- venv/Lib/site-packages/pip/_vendor/tomli_w/py.typed +1 -0
- venv/Lib/site-packages/pip/_vendor/truststore/__init__.py +36 -0
- venv/Lib/site-packages/pip/_vendor/truststore/_api.py +333 -0
- venv/Lib/site-packages/pip/_vendor/truststore/_macos.py +571 -0
- venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py +66 -0
- venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py +31 -0
- venv/Lib/site-packages/pip/_vendor/truststore/_windows.py +567 -0
- venv/Lib/site-packages/pip/_vendor/truststore/py.typed +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +102 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +355 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +572 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1140 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +397 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +130 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +518 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +920 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +323 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +155 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1076 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +540 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/request.py +191 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/response.py +879 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +149 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +57 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +137 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +622 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +504 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +159 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +271 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +435 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +152 -0
- venv/Lib/site-packages/pip/py.typed +4 -0
- cli_ih-0.6.3.dist-info/RECORD +0 -8
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib.metadata
|
|
4
|
+
import os
|
|
5
|
+
from typing import Any, Protocol, cast
|
|
6
|
+
|
|
7
|
+
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BadMetadata(ValueError):
|
|
11
|
+
def __init__(self, dist: importlib.metadata.Distribution, *, reason: str) -> None:
|
|
12
|
+
self.dist = dist
|
|
13
|
+
self.reason = reason
|
|
14
|
+
|
|
15
|
+
def __str__(self) -> str:
|
|
16
|
+
return f"Bad metadata in {self.dist} ({self.reason})"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BasePath(Protocol):
|
|
20
|
+
"""A protocol that various path objects conform.
|
|
21
|
+
|
|
22
|
+
This exists because importlib.metadata uses both ``pathlib.Path`` and
|
|
23
|
+
``zipfile.Path``, and we need a common base for type hints (Union does not
|
|
24
|
+
work well since ``zipfile.Path`` is too new for our linter setup).
|
|
25
|
+
|
|
26
|
+
This does not mean to be exhaustive, but only contains things that present
|
|
27
|
+
in both classes *that we need*.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
@property
|
|
31
|
+
def name(self) -> str:
|
|
32
|
+
raise NotImplementedError()
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def parent(self) -> BasePath:
|
|
36
|
+
raise NotImplementedError()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def get_info_location(d: importlib.metadata.Distribution) -> BasePath | None:
|
|
40
|
+
"""Find the path to the distribution's metadata directory.
|
|
41
|
+
|
|
42
|
+
HACK: This relies on importlib.metadata's private ``_path`` attribute. Not
|
|
43
|
+
all distributions exist on disk, so importlib.metadata is correct to not
|
|
44
|
+
expose the attribute as public. But pip's code base is old and not as clean,
|
|
45
|
+
so we do this to avoid having to rewrite too many things. Hopefully we can
|
|
46
|
+
eliminate this some day.
|
|
47
|
+
"""
|
|
48
|
+
return getattr(d, "_path", None)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def parse_name_and_version_from_info_directory(
|
|
52
|
+
dist: importlib.metadata.Distribution,
|
|
53
|
+
) -> tuple[str | None, str | None]:
|
|
54
|
+
"""Get a name and version from the metadata directory name.
|
|
55
|
+
|
|
56
|
+
This is much faster than reading distribution metadata.
|
|
57
|
+
"""
|
|
58
|
+
info_location = get_info_location(dist)
|
|
59
|
+
if info_location is None:
|
|
60
|
+
return None, None
|
|
61
|
+
|
|
62
|
+
stem, suffix = os.path.splitext(info_location.name)
|
|
63
|
+
if suffix == ".dist-info":
|
|
64
|
+
name, sep, version = stem.partition("-")
|
|
65
|
+
if sep:
|
|
66
|
+
return name, version
|
|
67
|
+
|
|
68
|
+
if suffix == ".egg-info":
|
|
69
|
+
name = stem.split("-", 1)[0]
|
|
70
|
+
return name, None
|
|
71
|
+
|
|
72
|
+
return None, None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_dist_canonical_name(dist: importlib.metadata.Distribution) -> NormalizedName:
|
|
76
|
+
"""Get the distribution's normalized name.
|
|
77
|
+
|
|
78
|
+
The ``name`` attribute is only available in Python 3.10 or later. We are
|
|
79
|
+
targeting exactly that, but Mypy does not know this.
|
|
80
|
+
"""
|
|
81
|
+
if name := parse_name_and_version_from_info_directory(dist)[0]:
|
|
82
|
+
return canonicalize_name(name)
|
|
83
|
+
|
|
84
|
+
name = cast(Any, dist).name
|
|
85
|
+
if not isinstance(name, str):
|
|
86
|
+
raise BadMetadata(dist, reason="invalid metadata entry 'name'")
|
|
87
|
+
return canonicalize_name(name)
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import email.message
|
|
4
|
+
import importlib.metadata
|
|
5
|
+
import pathlib
|
|
6
|
+
import zipfile
|
|
7
|
+
from collections.abc import Collection, Iterable, Iterator, Mapping, Sequence
|
|
8
|
+
from os import PathLike
|
|
9
|
+
from typing import (
|
|
10
|
+
cast,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
from pip._vendor.packaging.requirements import Requirement
|
|
14
|
+
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
|
|
15
|
+
from pip._vendor.packaging.version import Version
|
|
16
|
+
from pip._vendor.packaging.version import parse as parse_version
|
|
17
|
+
|
|
18
|
+
from pip._internal.exceptions import InvalidWheel, UnsupportedWheel
|
|
19
|
+
from pip._internal.metadata.base import (
|
|
20
|
+
BaseDistribution,
|
|
21
|
+
BaseEntryPoint,
|
|
22
|
+
InfoPath,
|
|
23
|
+
Wheel,
|
|
24
|
+
)
|
|
25
|
+
from pip._internal.utils.misc import normalize_path
|
|
26
|
+
from pip._internal.utils.packaging import get_requirement
|
|
27
|
+
from pip._internal.utils.temp_dir import TempDirectory
|
|
28
|
+
from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
|
|
29
|
+
|
|
30
|
+
from ._compat import (
|
|
31
|
+
BasePath,
|
|
32
|
+
get_dist_canonical_name,
|
|
33
|
+
parse_name_and_version_from_info_directory,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class WheelDistribution(importlib.metadata.Distribution):
|
|
38
|
+
"""An ``importlib.metadata.Distribution`` read from a wheel.
|
|
39
|
+
|
|
40
|
+
Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``,
|
|
41
|
+
its implementation is too "lazy" for pip's needs (we can't keep the ZipFile
|
|
42
|
+
handle open for the entire lifetime of the distribution object).
|
|
43
|
+
|
|
44
|
+
This implementation eagerly reads the entire metadata directory into the
|
|
45
|
+
memory instead, and operates from that.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
files: Mapping[pathlib.PurePosixPath, bytes],
|
|
51
|
+
info_location: pathlib.PurePosixPath,
|
|
52
|
+
) -> None:
|
|
53
|
+
self._files = files
|
|
54
|
+
self.info_location = info_location
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def from_zipfile(
|
|
58
|
+
cls,
|
|
59
|
+
zf: zipfile.ZipFile,
|
|
60
|
+
name: str,
|
|
61
|
+
location: str,
|
|
62
|
+
) -> WheelDistribution:
|
|
63
|
+
info_dir, _ = parse_wheel(zf, name)
|
|
64
|
+
paths = (
|
|
65
|
+
(name, pathlib.PurePosixPath(name.split("/", 1)[-1]))
|
|
66
|
+
for name in zf.namelist()
|
|
67
|
+
if name.startswith(f"{info_dir}/")
|
|
68
|
+
)
|
|
69
|
+
files = {
|
|
70
|
+
relpath: read_wheel_metadata_file(zf, fullpath)
|
|
71
|
+
for fullpath, relpath in paths
|
|
72
|
+
}
|
|
73
|
+
info_location = pathlib.PurePosixPath(location, info_dir)
|
|
74
|
+
return cls(files, info_location)
|
|
75
|
+
|
|
76
|
+
def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]:
|
|
77
|
+
# Only allow iterating through the metadata directory.
|
|
78
|
+
if pathlib.PurePosixPath(str(path)) in self._files:
|
|
79
|
+
return iter(self._files)
|
|
80
|
+
raise FileNotFoundError(path)
|
|
81
|
+
|
|
82
|
+
def read_text(self, filename: str) -> str | None:
|
|
83
|
+
try:
|
|
84
|
+
data = self._files[pathlib.PurePosixPath(filename)]
|
|
85
|
+
except KeyError:
|
|
86
|
+
return None
|
|
87
|
+
try:
|
|
88
|
+
text = data.decode("utf-8")
|
|
89
|
+
except UnicodeDecodeError as e:
|
|
90
|
+
wheel = self.info_location.parent
|
|
91
|
+
error = f"Error decoding metadata for {wheel}: {e} in {filename} file"
|
|
92
|
+
raise UnsupportedWheel(error)
|
|
93
|
+
return text
|
|
94
|
+
|
|
95
|
+
def locate_file(self, path: str | PathLike[str]) -> pathlib.Path:
|
|
96
|
+
# This method doesn't make sense for our in-memory wheel, but the API
|
|
97
|
+
# requires us to define it.
|
|
98
|
+
raise NotImplementedError
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class Distribution(BaseDistribution):
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
dist: importlib.metadata.Distribution,
|
|
105
|
+
info_location: BasePath | None,
|
|
106
|
+
installed_location: BasePath | None,
|
|
107
|
+
) -> None:
|
|
108
|
+
self._dist = dist
|
|
109
|
+
self._info_location = info_location
|
|
110
|
+
self._installed_location = installed_location
|
|
111
|
+
|
|
112
|
+
@classmethod
|
|
113
|
+
def from_directory(cls, directory: str) -> BaseDistribution:
|
|
114
|
+
info_location = pathlib.Path(directory)
|
|
115
|
+
dist = importlib.metadata.Distribution.at(info_location)
|
|
116
|
+
return cls(dist, info_location, info_location.parent)
|
|
117
|
+
|
|
118
|
+
@classmethod
|
|
119
|
+
def from_metadata_file_contents(
|
|
120
|
+
cls,
|
|
121
|
+
metadata_contents: bytes,
|
|
122
|
+
filename: str,
|
|
123
|
+
project_name: str,
|
|
124
|
+
) -> BaseDistribution:
|
|
125
|
+
# Generate temp dir to contain the metadata file, and write the file contents.
|
|
126
|
+
temp_dir = pathlib.Path(
|
|
127
|
+
TempDirectory(kind="metadata", globally_managed=True).path
|
|
128
|
+
)
|
|
129
|
+
metadata_path = temp_dir / "METADATA"
|
|
130
|
+
metadata_path.write_bytes(metadata_contents)
|
|
131
|
+
# Construct dist pointing to the newly created directory.
|
|
132
|
+
dist = importlib.metadata.Distribution.at(metadata_path.parent)
|
|
133
|
+
return cls(dist, metadata_path.parent, None)
|
|
134
|
+
|
|
135
|
+
@classmethod
|
|
136
|
+
def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
|
|
137
|
+
try:
|
|
138
|
+
with wheel.as_zipfile() as zf:
|
|
139
|
+
dist = WheelDistribution.from_zipfile(zf, name, wheel.location)
|
|
140
|
+
except zipfile.BadZipFile as e:
|
|
141
|
+
raise InvalidWheel(wheel.location, name) from e
|
|
142
|
+
return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location))
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def location(self) -> str | None:
|
|
146
|
+
if self._info_location is None:
|
|
147
|
+
return None
|
|
148
|
+
return str(self._info_location.parent)
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def info_location(self) -> str | None:
|
|
152
|
+
if self._info_location is None:
|
|
153
|
+
return None
|
|
154
|
+
return str(self._info_location)
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def installed_location(self) -> str | None:
|
|
158
|
+
if self._installed_location is None:
|
|
159
|
+
return None
|
|
160
|
+
return normalize_path(str(self._installed_location))
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def canonical_name(self) -> NormalizedName:
|
|
164
|
+
return get_dist_canonical_name(self._dist)
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def version(self) -> Version:
|
|
168
|
+
if version := parse_name_and_version_from_info_directory(self._dist)[1]:
|
|
169
|
+
return parse_version(version)
|
|
170
|
+
return parse_version(self._dist.version)
|
|
171
|
+
|
|
172
|
+
@property
|
|
173
|
+
def raw_version(self) -> str:
|
|
174
|
+
return self._dist.version
|
|
175
|
+
|
|
176
|
+
def is_file(self, path: InfoPath) -> bool:
|
|
177
|
+
return self._dist.read_text(str(path)) is not None
|
|
178
|
+
|
|
179
|
+
def iter_distutils_script_names(self) -> Iterator[str]:
|
|
180
|
+
# A distutils installation is always "flat" (not in e.g. egg form), so
|
|
181
|
+
# if this distribution's info location is NOT a pathlib.Path (but e.g.
|
|
182
|
+
# zipfile.Path), it can never contain any distutils scripts.
|
|
183
|
+
if not isinstance(self._info_location, pathlib.Path):
|
|
184
|
+
return
|
|
185
|
+
for child in self._info_location.joinpath("scripts").iterdir():
|
|
186
|
+
yield child.name
|
|
187
|
+
|
|
188
|
+
def read_text(self, path: InfoPath) -> str:
|
|
189
|
+
content = self._dist.read_text(str(path))
|
|
190
|
+
if content is None:
|
|
191
|
+
raise FileNotFoundError(path)
|
|
192
|
+
return content
|
|
193
|
+
|
|
194
|
+
def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
|
|
195
|
+
# importlib.metadata's EntryPoint structure satisfies BaseEntryPoint.
|
|
196
|
+
return self._dist.entry_points
|
|
197
|
+
|
|
198
|
+
def _metadata_impl(self) -> email.message.Message:
|
|
199
|
+
# From Python 3.10+, importlib.metadata declares PackageMetadata as the
|
|
200
|
+
# return type. This protocol is unfortunately a disaster now and misses
|
|
201
|
+
# a ton of fields that we need, including get() and get_payload(). We
|
|
202
|
+
# rely on the implementation that the object is actually a Message now,
|
|
203
|
+
# until upstream can improve the protocol. (python/cpython#94952)
|
|
204
|
+
return cast(email.message.Message, self._dist.metadata)
|
|
205
|
+
|
|
206
|
+
def iter_provided_extras(self) -> Iterable[NormalizedName]:
|
|
207
|
+
return [
|
|
208
|
+
canonicalize_name(extra)
|
|
209
|
+
for extra in self.metadata.get_all("Provides-Extra", [])
|
|
210
|
+
]
|
|
211
|
+
|
|
212
|
+
def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
|
|
213
|
+
contexts: Sequence[dict[str, str]] = [{"extra": e} for e in extras]
|
|
214
|
+
for req_string in self.metadata.get_all("Requires-Dist", []):
|
|
215
|
+
# strip() because email.message.Message.get_all() may return a leading \n
|
|
216
|
+
# in case a long header was wrapped.
|
|
217
|
+
req = get_requirement(req_string.strip())
|
|
218
|
+
if not req.marker:
|
|
219
|
+
yield req
|
|
220
|
+
elif not extras and req.marker.evaluate({"extra": ""}):
|
|
221
|
+
yield req
|
|
222
|
+
elif any(req.marker.evaluate(context) for context in contexts):
|
|
223
|
+
yield req
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib.metadata
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
import pathlib
|
|
7
|
+
import sys
|
|
8
|
+
import zipfile
|
|
9
|
+
from collections.abc import Iterator, Sequence
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from pip._vendor.packaging.utils import (
|
|
13
|
+
InvalidWheelFilename,
|
|
14
|
+
NormalizedName,
|
|
15
|
+
canonicalize_name,
|
|
16
|
+
parse_wheel_filename,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from pip._internal.metadata.base import BaseDistribution, BaseEnvironment
|
|
20
|
+
from pip._internal.utils.filetypes import WHEEL_EXTENSION
|
|
21
|
+
|
|
22
|
+
from ._compat import BadMetadata, BasePath, get_dist_canonical_name, get_info_location
|
|
23
|
+
from ._dists import Distribution
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _looks_like_wheel(location: str) -> bool:
|
|
29
|
+
if not location.endswith(WHEEL_EXTENSION):
|
|
30
|
+
return False
|
|
31
|
+
if not os.path.isfile(location):
|
|
32
|
+
return False
|
|
33
|
+
try:
|
|
34
|
+
parse_wheel_filename(os.path.basename(location))
|
|
35
|
+
except InvalidWheelFilename:
|
|
36
|
+
return False
|
|
37
|
+
return zipfile.is_zipfile(location)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class _DistributionFinder:
|
|
41
|
+
"""Finder to locate distributions.
|
|
42
|
+
|
|
43
|
+
The main purpose of this class is to memoize found distributions' names, so
|
|
44
|
+
only one distribution is returned for each package name. At lot of pip code
|
|
45
|
+
assumes this (because it is setuptools's behavior), and not doing the same
|
|
46
|
+
can potentially cause a distribution in lower precedence path to override a
|
|
47
|
+
higher precedence one if the caller is not careful.
|
|
48
|
+
|
|
49
|
+
Eventually we probably want to make it possible to see lower precedence
|
|
50
|
+
installations as well. It's useful feature, after all.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
FoundResult = tuple[importlib.metadata.Distribution, Optional[BasePath]]
|
|
54
|
+
|
|
55
|
+
def __init__(self) -> None:
|
|
56
|
+
self._found_names: set[NormalizedName] = set()
|
|
57
|
+
|
|
58
|
+
def _find_impl(self, location: str) -> Iterator[FoundResult]:
|
|
59
|
+
"""Find distributions in a location."""
|
|
60
|
+
# Skip looking inside a wheel. Since a package inside a wheel is not
|
|
61
|
+
# always valid (due to .data directories etc.), its .dist-info entry
|
|
62
|
+
# should not be considered an installed distribution.
|
|
63
|
+
if _looks_like_wheel(location):
|
|
64
|
+
return
|
|
65
|
+
# To know exactly where we find a distribution, we have to feed in the
|
|
66
|
+
# paths one by one, instead of dumping the list to importlib.metadata.
|
|
67
|
+
for dist in importlib.metadata.distributions(path=[location]):
|
|
68
|
+
info_location = get_info_location(dist)
|
|
69
|
+
try:
|
|
70
|
+
name = get_dist_canonical_name(dist)
|
|
71
|
+
except BadMetadata as e:
|
|
72
|
+
logger.warning("Skipping %s due to %s", info_location, e.reason)
|
|
73
|
+
continue
|
|
74
|
+
if name in self._found_names:
|
|
75
|
+
continue
|
|
76
|
+
self._found_names.add(name)
|
|
77
|
+
yield dist, info_location
|
|
78
|
+
|
|
79
|
+
def find(self, location: str) -> Iterator[BaseDistribution]:
|
|
80
|
+
"""Find distributions in a location.
|
|
81
|
+
|
|
82
|
+
The path can be either a directory, or a ZIP archive.
|
|
83
|
+
"""
|
|
84
|
+
for dist, info_location in self._find_impl(location):
|
|
85
|
+
if info_location is None:
|
|
86
|
+
installed_location: BasePath | None = None
|
|
87
|
+
else:
|
|
88
|
+
installed_location = info_location.parent
|
|
89
|
+
yield Distribution(dist, info_location, installed_location)
|
|
90
|
+
|
|
91
|
+
def find_legacy_editables(self, location: str) -> Iterator[BaseDistribution]:
|
|
92
|
+
"""Read location in egg-link files and return distributions in there.
|
|
93
|
+
|
|
94
|
+
The path should be a directory; otherwise this returns nothing. This
|
|
95
|
+
follows how setuptools does this for compatibility. The first non-empty
|
|
96
|
+
line in the egg-link is read as a path (resolved against the egg-link's
|
|
97
|
+
containing directory if relative). Distributions found at that linked
|
|
98
|
+
location are returned.
|
|
99
|
+
"""
|
|
100
|
+
path = pathlib.Path(location)
|
|
101
|
+
if not path.is_dir():
|
|
102
|
+
return
|
|
103
|
+
for child in path.iterdir():
|
|
104
|
+
if child.suffix != ".egg-link":
|
|
105
|
+
continue
|
|
106
|
+
with child.open() as f:
|
|
107
|
+
lines = (line.strip() for line in f)
|
|
108
|
+
target_rel = next((line for line in lines if line), "")
|
|
109
|
+
if not target_rel:
|
|
110
|
+
continue
|
|
111
|
+
target_location = str(path.joinpath(target_rel))
|
|
112
|
+
for dist, info_location in self._find_impl(target_location):
|
|
113
|
+
yield Distribution(dist, info_location, path)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class Environment(BaseEnvironment):
|
|
117
|
+
def __init__(self, paths: Sequence[str]) -> None:
|
|
118
|
+
self._paths = paths
|
|
119
|
+
|
|
120
|
+
@classmethod
|
|
121
|
+
def default(cls) -> BaseEnvironment:
|
|
122
|
+
return cls(sys.path)
|
|
123
|
+
|
|
124
|
+
@classmethod
|
|
125
|
+
def from_paths(cls, paths: list[str] | None) -> BaseEnvironment:
|
|
126
|
+
if paths is None:
|
|
127
|
+
return cls(sys.path)
|
|
128
|
+
return cls(paths)
|
|
129
|
+
|
|
130
|
+
def _iter_distributions(self) -> Iterator[BaseDistribution]:
|
|
131
|
+
finder = _DistributionFinder()
|
|
132
|
+
for location in self._paths:
|
|
133
|
+
yield from finder.find(location)
|
|
134
|
+
yield from finder.find_legacy_editables(location)
|
|
135
|
+
|
|
136
|
+
def get_distribution(self, name: str) -> BaseDistribution | None:
|
|
137
|
+
canonical_name = canonicalize_name(name)
|
|
138
|
+
matches = (
|
|
139
|
+
distribution
|
|
140
|
+
for distribution in self.iter_all_distributions()
|
|
141
|
+
if distribution.canonical_name == canonical_name
|
|
142
|
+
)
|
|
143
|
+
return next(matches, None)
|