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,291 @@
|
|
|
1
|
+
"""Cache Management"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
|
|
13
|
+
from pip._vendor.packaging.utils import canonicalize_name
|
|
14
|
+
|
|
15
|
+
from pip._internal.exceptions import InvalidWheelFilename
|
|
16
|
+
from pip._internal.models.direct_url import DirectUrl
|
|
17
|
+
from pip._internal.models.link import Link
|
|
18
|
+
from pip._internal.models.wheel import Wheel
|
|
19
|
+
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
|
|
20
|
+
from pip._internal.utils.urls import path_to_url
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
ORIGIN_JSON_NAME = "origin.json"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _hash_dict(d: dict[str, str]) -> str:
|
|
28
|
+
"""Return a stable sha224 of a dictionary."""
|
|
29
|
+
s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
|
|
30
|
+
return hashlib.sha224(s.encode("ascii")).hexdigest()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class Cache:
|
|
34
|
+
"""An abstract class - provides cache directories for data from links
|
|
35
|
+
|
|
36
|
+
:param cache_dir: The root of the cache.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, cache_dir: str) -> None:
|
|
40
|
+
super().__init__()
|
|
41
|
+
assert not cache_dir or os.path.isabs(cache_dir)
|
|
42
|
+
self.cache_dir = cache_dir or None
|
|
43
|
+
|
|
44
|
+
def _get_cache_path_parts(self, link: Link) -> list[str]:
|
|
45
|
+
"""Get parts of part that must be os.path.joined with cache_dir"""
|
|
46
|
+
|
|
47
|
+
# We want to generate an url to use as our cache key, we don't want to
|
|
48
|
+
# just reuse the URL because it might have other items in the fragment
|
|
49
|
+
# and we don't care about those.
|
|
50
|
+
key_parts = {"url": link.url_without_fragment}
|
|
51
|
+
if link.hash_name is not None and link.hash is not None:
|
|
52
|
+
key_parts[link.hash_name] = link.hash
|
|
53
|
+
if link.subdirectory_fragment:
|
|
54
|
+
key_parts["subdirectory"] = link.subdirectory_fragment
|
|
55
|
+
|
|
56
|
+
# Include interpreter name, major and minor version in cache key
|
|
57
|
+
# to cope with ill-behaved sdists that build a different wheel
|
|
58
|
+
# depending on the python version their setup.py is being run on,
|
|
59
|
+
# and don't encode the difference in compatibility tags.
|
|
60
|
+
# https://github.com/pypa/pip/issues/7296
|
|
61
|
+
key_parts["interpreter_name"] = interpreter_name()
|
|
62
|
+
key_parts["interpreter_version"] = interpreter_version()
|
|
63
|
+
|
|
64
|
+
# Encode our key url with sha224, we'll use this because it has similar
|
|
65
|
+
# security properties to sha256, but with a shorter total output (and
|
|
66
|
+
# thus less secure). However the differences don't make a lot of
|
|
67
|
+
# difference for our use case here.
|
|
68
|
+
hashed = _hash_dict(key_parts)
|
|
69
|
+
|
|
70
|
+
# We want to nest the directories some to prevent having a ton of top
|
|
71
|
+
# level directories where we might run out of sub directories on some
|
|
72
|
+
# FS.
|
|
73
|
+
parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
|
|
74
|
+
|
|
75
|
+
return parts
|
|
76
|
+
|
|
77
|
+
def _get_candidates(self, link: Link, canonical_package_name: str) -> list[Any]:
|
|
78
|
+
can_not_cache = not self.cache_dir or not canonical_package_name or not link
|
|
79
|
+
if can_not_cache:
|
|
80
|
+
return []
|
|
81
|
+
|
|
82
|
+
path = self.get_path_for_link(link)
|
|
83
|
+
if os.path.isdir(path):
|
|
84
|
+
return [(candidate, path) for candidate in os.listdir(path)]
|
|
85
|
+
return []
|
|
86
|
+
|
|
87
|
+
def get_path_for_link(self, link: Link) -> str:
|
|
88
|
+
"""Return a directory to store cached items in for link."""
|
|
89
|
+
raise NotImplementedError()
|
|
90
|
+
|
|
91
|
+
def get(
|
|
92
|
+
self,
|
|
93
|
+
link: Link,
|
|
94
|
+
package_name: str | None,
|
|
95
|
+
supported_tags: list[Tag],
|
|
96
|
+
) -> Link:
|
|
97
|
+
"""Returns a link to a cached item if it exists, otherwise returns the
|
|
98
|
+
passed link.
|
|
99
|
+
"""
|
|
100
|
+
raise NotImplementedError()
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class SimpleWheelCache(Cache):
|
|
104
|
+
"""A cache of wheels for future installs."""
|
|
105
|
+
|
|
106
|
+
def __init__(self, cache_dir: str) -> None:
|
|
107
|
+
super().__init__(cache_dir)
|
|
108
|
+
|
|
109
|
+
def get_path_for_link(self, link: Link) -> str:
|
|
110
|
+
"""Return a directory to store cached wheels for link
|
|
111
|
+
|
|
112
|
+
Because there are M wheels for any one sdist, we provide a directory
|
|
113
|
+
to cache them in, and then consult that directory when looking up
|
|
114
|
+
cache hits.
|
|
115
|
+
|
|
116
|
+
We only insert things into the cache if they have plausible version
|
|
117
|
+
numbers, so that we don't contaminate the cache with things that were
|
|
118
|
+
not unique. E.g. ./package might have dozens of installs done for it
|
|
119
|
+
and build a version of 0.0...and if we built and cached a wheel, we'd
|
|
120
|
+
end up using the same wheel even if the source has been edited.
|
|
121
|
+
|
|
122
|
+
:param link: The link of the sdist for which this will cache wheels.
|
|
123
|
+
"""
|
|
124
|
+
parts = self._get_cache_path_parts(link)
|
|
125
|
+
assert self.cache_dir
|
|
126
|
+
# Store wheels within the root cache_dir
|
|
127
|
+
return os.path.join(self.cache_dir, "wheels", *parts)
|
|
128
|
+
|
|
129
|
+
def get(
|
|
130
|
+
self,
|
|
131
|
+
link: Link,
|
|
132
|
+
package_name: str | None,
|
|
133
|
+
supported_tags: list[Tag],
|
|
134
|
+
) -> Link:
|
|
135
|
+
candidates = []
|
|
136
|
+
|
|
137
|
+
if not package_name:
|
|
138
|
+
return link
|
|
139
|
+
|
|
140
|
+
canonical_package_name = canonicalize_name(package_name)
|
|
141
|
+
for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
|
|
142
|
+
try:
|
|
143
|
+
wheel = Wheel(wheel_name)
|
|
144
|
+
except InvalidWheelFilename:
|
|
145
|
+
continue
|
|
146
|
+
if canonicalize_name(wheel.name) != canonical_package_name:
|
|
147
|
+
logger.debug(
|
|
148
|
+
"Ignoring cached wheel %s for %s as it "
|
|
149
|
+
"does not match the expected distribution name %s.",
|
|
150
|
+
wheel_name,
|
|
151
|
+
link,
|
|
152
|
+
package_name,
|
|
153
|
+
)
|
|
154
|
+
continue
|
|
155
|
+
if not wheel.supported(supported_tags):
|
|
156
|
+
# Built for a different python/arch/etc
|
|
157
|
+
continue
|
|
158
|
+
candidates.append(
|
|
159
|
+
(
|
|
160
|
+
wheel.support_index_min(supported_tags),
|
|
161
|
+
wheel_name,
|
|
162
|
+
wheel_dir,
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
if not candidates:
|
|
167
|
+
return link
|
|
168
|
+
|
|
169
|
+
_, wheel_name, wheel_dir = min(candidates)
|
|
170
|
+
return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class EphemWheelCache(SimpleWheelCache):
|
|
174
|
+
"""A SimpleWheelCache that creates it's own temporary cache directory"""
|
|
175
|
+
|
|
176
|
+
def __init__(self) -> None:
|
|
177
|
+
self._temp_dir = TempDirectory(
|
|
178
|
+
kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
|
|
179
|
+
globally_managed=True,
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
super().__init__(self._temp_dir.path)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class CacheEntry:
|
|
186
|
+
def __init__(
|
|
187
|
+
self,
|
|
188
|
+
link: Link,
|
|
189
|
+
persistent: bool,
|
|
190
|
+
):
|
|
191
|
+
self.link = link
|
|
192
|
+
self.persistent = persistent
|
|
193
|
+
self.origin: DirectUrl | None = None
|
|
194
|
+
origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
|
|
195
|
+
if origin_direct_url_path.exists():
|
|
196
|
+
try:
|
|
197
|
+
self.origin = DirectUrl.from_json(
|
|
198
|
+
origin_direct_url_path.read_text(encoding="utf-8")
|
|
199
|
+
)
|
|
200
|
+
except Exception as e:
|
|
201
|
+
logger.warning(
|
|
202
|
+
"Ignoring invalid cache entry origin file %s for %s (%s)",
|
|
203
|
+
origin_direct_url_path,
|
|
204
|
+
link.filename,
|
|
205
|
+
e,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
class WheelCache(Cache):
|
|
210
|
+
"""Wraps EphemWheelCache and SimpleWheelCache into a single Cache
|
|
211
|
+
|
|
212
|
+
This Cache allows for gracefully degradation, using the ephem wheel cache
|
|
213
|
+
when a certain link is not found in the simple wheel cache first.
|
|
214
|
+
"""
|
|
215
|
+
|
|
216
|
+
def __init__(self, cache_dir: str) -> None:
|
|
217
|
+
super().__init__(cache_dir)
|
|
218
|
+
self._wheel_cache = SimpleWheelCache(cache_dir)
|
|
219
|
+
self._ephem_cache = EphemWheelCache()
|
|
220
|
+
|
|
221
|
+
def get_path_for_link(self, link: Link) -> str:
|
|
222
|
+
return self._wheel_cache.get_path_for_link(link)
|
|
223
|
+
|
|
224
|
+
def get_ephem_path_for_link(self, link: Link) -> str:
|
|
225
|
+
return self._ephem_cache.get_path_for_link(link)
|
|
226
|
+
|
|
227
|
+
def get(
|
|
228
|
+
self,
|
|
229
|
+
link: Link,
|
|
230
|
+
package_name: str | None,
|
|
231
|
+
supported_tags: list[Tag],
|
|
232
|
+
) -> Link:
|
|
233
|
+
cache_entry = self.get_cache_entry(link, package_name, supported_tags)
|
|
234
|
+
if cache_entry is None:
|
|
235
|
+
return link
|
|
236
|
+
return cache_entry.link
|
|
237
|
+
|
|
238
|
+
def get_cache_entry(
|
|
239
|
+
self,
|
|
240
|
+
link: Link,
|
|
241
|
+
package_name: str | None,
|
|
242
|
+
supported_tags: list[Tag],
|
|
243
|
+
) -> CacheEntry | None:
|
|
244
|
+
"""Returns a CacheEntry with a link to a cached item if it exists or
|
|
245
|
+
None. The cache entry indicates if the item was found in the persistent
|
|
246
|
+
or ephemeral cache.
|
|
247
|
+
"""
|
|
248
|
+
retval = self._wheel_cache.get(
|
|
249
|
+
link=link,
|
|
250
|
+
package_name=package_name,
|
|
251
|
+
supported_tags=supported_tags,
|
|
252
|
+
)
|
|
253
|
+
if retval is not link:
|
|
254
|
+
return CacheEntry(retval, persistent=True)
|
|
255
|
+
|
|
256
|
+
retval = self._ephem_cache.get(
|
|
257
|
+
link=link,
|
|
258
|
+
package_name=package_name,
|
|
259
|
+
supported_tags=supported_tags,
|
|
260
|
+
)
|
|
261
|
+
if retval is not link:
|
|
262
|
+
return CacheEntry(retval, persistent=False)
|
|
263
|
+
|
|
264
|
+
return None
|
|
265
|
+
|
|
266
|
+
@staticmethod
|
|
267
|
+
def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
|
|
268
|
+
origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
|
|
269
|
+
if origin_path.exists():
|
|
270
|
+
try:
|
|
271
|
+
origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
|
|
272
|
+
except Exception as e:
|
|
273
|
+
logger.warning(
|
|
274
|
+
"Could not read origin file %s in cache entry (%s). "
|
|
275
|
+
"Will attempt to overwrite it.",
|
|
276
|
+
origin_path,
|
|
277
|
+
e,
|
|
278
|
+
)
|
|
279
|
+
else:
|
|
280
|
+
# TODO: use DirectUrl.equivalent when
|
|
281
|
+
# https://github.com/pypa/pip/pull/10564 is merged.
|
|
282
|
+
if origin.url != download_info.url:
|
|
283
|
+
logger.warning(
|
|
284
|
+
"Origin URL %s in cache entry %s does not match download URL "
|
|
285
|
+
"%s. This is likely a pip bug or a cache corruption issue. "
|
|
286
|
+
"Will overwrite it with the new value.",
|
|
287
|
+
origin.url,
|
|
288
|
+
cache_dir,
|
|
289
|
+
download_info.url,
|
|
290
|
+
)
|
|
291
|
+
origin_path.write_text(download_info.to_json(), encoding="utf-8")
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""Logic that powers autocompletion installed by ``pip completion``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import optparse
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from collections.abc import Iterable
|
|
9
|
+
from itertools import chain
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from pip._internal.cli.main_parser import create_main_parser
|
|
13
|
+
from pip._internal.commands import commands_dict, create_command
|
|
14
|
+
from pip._internal.metadata import get_default_environment
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def autocomplete() -> None:
|
|
18
|
+
"""Entry Point for completion of main and subcommand options."""
|
|
19
|
+
# Don't complete if user hasn't sourced bash_completion file.
|
|
20
|
+
if "PIP_AUTO_COMPLETE" not in os.environ:
|
|
21
|
+
return
|
|
22
|
+
# Don't complete if autocompletion environment variables
|
|
23
|
+
# are not present
|
|
24
|
+
if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
|
|
25
|
+
return
|
|
26
|
+
cwords = os.environ["COMP_WORDS"].split()[1:]
|
|
27
|
+
cword = int(os.environ["COMP_CWORD"])
|
|
28
|
+
try:
|
|
29
|
+
current = cwords[cword - 1]
|
|
30
|
+
except IndexError:
|
|
31
|
+
current = ""
|
|
32
|
+
|
|
33
|
+
parser = create_main_parser()
|
|
34
|
+
subcommands = list(commands_dict)
|
|
35
|
+
options = []
|
|
36
|
+
|
|
37
|
+
# subcommand
|
|
38
|
+
subcommand_name: str | None = None
|
|
39
|
+
for word in cwords:
|
|
40
|
+
if word in subcommands:
|
|
41
|
+
subcommand_name = word
|
|
42
|
+
break
|
|
43
|
+
# subcommand options
|
|
44
|
+
if subcommand_name is not None:
|
|
45
|
+
# special case: 'help' subcommand has no options
|
|
46
|
+
if subcommand_name == "help":
|
|
47
|
+
sys.exit(1)
|
|
48
|
+
# special case: list locally installed dists for show and uninstall
|
|
49
|
+
should_list_installed = not current.startswith("-") and subcommand_name in [
|
|
50
|
+
"show",
|
|
51
|
+
"uninstall",
|
|
52
|
+
]
|
|
53
|
+
if should_list_installed:
|
|
54
|
+
env = get_default_environment()
|
|
55
|
+
lc = current.lower()
|
|
56
|
+
installed = [
|
|
57
|
+
dist.canonical_name
|
|
58
|
+
for dist in env.iter_installed_distributions(local_only=True)
|
|
59
|
+
if dist.canonical_name.startswith(lc)
|
|
60
|
+
and dist.canonical_name not in cwords[1:]
|
|
61
|
+
]
|
|
62
|
+
# if there are no dists installed, fall back to option completion
|
|
63
|
+
if installed:
|
|
64
|
+
for dist in installed:
|
|
65
|
+
print(dist)
|
|
66
|
+
sys.exit(1)
|
|
67
|
+
|
|
68
|
+
should_list_installables = (
|
|
69
|
+
not current.startswith("-") and subcommand_name == "install"
|
|
70
|
+
)
|
|
71
|
+
if should_list_installables:
|
|
72
|
+
for path in auto_complete_paths(current, "path"):
|
|
73
|
+
print(path)
|
|
74
|
+
sys.exit(1)
|
|
75
|
+
|
|
76
|
+
subcommand = create_command(subcommand_name)
|
|
77
|
+
|
|
78
|
+
for opt in subcommand.parser.option_list_all:
|
|
79
|
+
if opt.help != optparse.SUPPRESS_HELP:
|
|
80
|
+
options += [
|
|
81
|
+
(opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
# filter out previously specified options from available options
|
|
85
|
+
prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
|
|
86
|
+
options = [(x, v) for (x, v) in options if x not in prev_opts]
|
|
87
|
+
# filter options by current input
|
|
88
|
+
options = [(k, v) for k, v in options if k.startswith(current)]
|
|
89
|
+
# get completion type given cwords and available subcommand options
|
|
90
|
+
completion_type = get_path_completion_type(
|
|
91
|
+
cwords,
|
|
92
|
+
cword,
|
|
93
|
+
subcommand.parser.option_list_all,
|
|
94
|
+
)
|
|
95
|
+
# get completion files and directories if ``completion_type`` is
|
|
96
|
+
# ``<file>``, ``<dir>`` or ``<path>``
|
|
97
|
+
if completion_type:
|
|
98
|
+
paths = auto_complete_paths(current, completion_type)
|
|
99
|
+
options = [(path, 0) for path in paths]
|
|
100
|
+
for option in options:
|
|
101
|
+
opt_label = option[0]
|
|
102
|
+
# append '=' to options which require args
|
|
103
|
+
if option[1] and option[0][:2] == "--":
|
|
104
|
+
opt_label += "="
|
|
105
|
+
print(opt_label)
|
|
106
|
+
|
|
107
|
+
# Complete sub-commands (unless one is already given).
|
|
108
|
+
if not any(name in cwords for name in subcommand.handler_map()):
|
|
109
|
+
for handler_name in subcommand.handler_map():
|
|
110
|
+
if handler_name.startswith(current):
|
|
111
|
+
print(handler_name)
|
|
112
|
+
else:
|
|
113
|
+
# show main parser options only when necessary
|
|
114
|
+
|
|
115
|
+
opts = [i.option_list for i in parser.option_groups]
|
|
116
|
+
opts.append(parser.option_list)
|
|
117
|
+
flattened_opts = chain.from_iterable(opts)
|
|
118
|
+
if current.startswith("-"):
|
|
119
|
+
for opt in flattened_opts:
|
|
120
|
+
if opt.help != optparse.SUPPRESS_HELP:
|
|
121
|
+
subcommands += opt._long_opts + opt._short_opts
|
|
122
|
+
else:
|
|
123
|
+
# get completion type given cwords and all available options
|
|
124
|
+
completion_type = get_path_completion_type(cwords, cword, flattened_opts)
|
|
125
|
+
if completion_type:
|
|
126
|
+
subcommands = list(auto_complete_paths(current, completion_type))
|
|
127
|
+
|
|
128
|
+
print(" ".join([x for x in subcommands if x.startswith(current)]))
|
|
129
|
+
sys.exit(1)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def get_path_completion_type(
|
|
133
|
+
cwords: list[str], cword: int, opts: Iterable[Any]
|
|
134
|
+
) -> str | None:
|
|
135
|
+
"""Get the type of path completion (``file``, ``dir``, ``path`` or None)
|
|
136
|
+
|
|
137
|
+
:param cwords: same as the environmental variable ``COMP_WORDS``
|
|
138
|
+
:param cword: same as the environmental variable ``COMP_CWORD``
|
|
139
|
+
:param opts: The available options to check
|
|
140
|
+
:return: path completion type (``file``, ``dir``, ``path`` or None)
|
|
141
|
+
"""
|
|
142
|
+
if cword < 2 or not cwords[cword - 2].startswith("-"):
|
|
143
|
+
return None
|
|
144
|
+
for opt in opts:
|
|
145
|
+
if opt.help == optparse.SUPPRESS_HELP:
|
|
146
|
+
continue
|
|
147
|
+
for o in str(opt).split("/"):
|
|
148
|
+
if cwords[cword - 2].split("=")[0] == o:
|
|
149
|
+
if not opt.metavar or any(
|
|
150
|
+
x in ("path", "file", "dir") for x in opt.metavar.split("/")
|
|
151
|
+
):
|
|
152
|
+
return opt.metavar
|
|
153
|
+
return None
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
|
|
157
|
+
"""If ``completion_type`` is ``file`` or ``path``, list all regular files
|
|
158
|
+
and directories starting with ``current``; otherwise only list directories
|
|
159
|
+
starting with ``current``.
|
|
160
|
+
|
|
161
|
+
:param current: The word to be completed
|
|
162
|
+
:param completion_type: path completion type(``file``, ``path`` or ``dir``)
|
|
163
|
+
:return: A generator of regular files and/or directories
|
|
164
|
+
"""
|
|
165
|
+
directory, filename = os.path.split(current)
|
|
166
|
+
current_path = os.path.abspath(directory)
|
|
167
|
+
# Don't complete paths if they can't be accessed
|
|
168
|
+
if not os.access(current_path, os.R_OK):
|
|
169
|
+
return
|
|
170
|
+
filename = os.path.normcase(filename)
|
|
171
|
+
# list all files that start with ``filename``
|
|
172
|
+
file_list = (
|
|
173
|
+
x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
|
|
174
|
+
)
|
|
175
|
+
for f in file_list:
|
|
176
|
+
opt = os.path.join(current_path, f)
|
|
177
|
+
comp_file = os.path.normcase(os.path.join(directory, f))
|
|
178
|
+
# complete regular files when there is not ``<dir>`` after option
|
|
179
|
+
# complete directories when there is ``<file>``, ``<path>`` or
|
|
180
|
+
# ``<dir>``after option
|
|
181
|
+
if completion_type != "dir" and os.path.isfile(opt):
|
|
182
|
+
yield comp_file
|
|
183
|
+
elif os.path.isdir(opt):
|
|
184
|
+
yield os.path.join(comp_file, "")
|