cli-ih 0.6.2.1__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 +51 -21
- cli_ih/client.py +14 -7
- {cli_ih-0.6.2.1.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.2.1.dist-info → cli_ih-0.6.3.1.dist-info}/WHEEL +1 -1
- {cli_ih-0.6.2.1.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.2.1.dist-info/RECORD +0 -8
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import fnmatch
|
|
4
|
+
import os
|
|
5
|
+
import os.path
|
|
6
|
+
import random
|
|
7
|
+
import sys
|
|
8
|
+
from collections.abc import Generator
|
|
9
|
+
from contextlib import contextmanager
|
|
10
|
+
from tempfile import NamedTemporaryFile
|
|
11
|
+
from typing import Any, BinaryIO, cast
|
|
12
|
+
|
|
13
|
+
from pip._internal.utils.compat import get_path_uid
|
|
14
|
+
from pip._internal.utils.misc import format_size
|
|
15
|
+
from pip._internal.utils.retry import retry
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def check_path_owner(path: str) -> bool:
|
|
19
|
+
# If we don't have a way to check the effective uid of this process, then
|
|
20
|
+
# we'll just assume that we own the directory.
|
|
21
|
+
if sys.platform == "win32" or not hasattr(os, "geteuid"):
|
|
22
|
+
return True
|
|
23
|
+
|
|
24
|
+
assert os.path.isabs(path)
|
|
25
|
+
|
|
26
|
+
previous = None
|
|
27
|
+
while path != previous:
|
|
28
|
+
if os.path.lexists(path):
|
|
29
|
+
# Check if path is writable by current user.
|
|
30
|
+
if os.geteuid() == 0:
|
|
31
|
+
# Special handling for root user in order to handle properly
|
|
32
|
+
# cases where users use sudo without -H flag.
|
|
33
|
+
try:
|
|
34
|
+
path_uid = get_path_uid(path)
|
|
35
|
+
except OSError:
|
|
36
|
+
return False
|
|
37
|
+
return path_uid == 0
|
|
38
|
+
else:
|
|
39
|
+
return os.access(path, os.W_OK)
|
|
40
|
+
else:
|
|
41
|
+
previous, path = path, os.path.dirname(path)
|
|
42
|
+
return False # assume we don't own the path
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@contextmanager
|
|
46
|
+
def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]:
|
|
47
|
+
"""Return a file-like object pointing to a tmp file next to path.
|
|
48
|
+
|
|
49
|
+
The file is created securely and is ensured to be written to disk
|
|
50
|
+
after the context reaches its end.
|
|
51
|
+
|
|
52
|
+
kwargs will be passed to tempfile.NamedTemporaryFile to control
|
|
53
|
+
the way the temporary file will be opened.
|
|
54
|
+
"""
|
|
55
|
+
with NamedTemporaryFile(
|
|
56
|
+
delete=False,
|
|
57
|
+
dir=os.path.dirname(path),
|
|
58
|
+
prefix=os.path.basename(path),
|
|
59
|
+
suffix=".tmp",
|
|
60
|
+
**kwargs,
|
|
61
|
+
) as f:
|
|
62
|
+
result = cast(BinaryIO, f)
|
|
63
|
+
try:
|
|
64
|
+
yield result
|
|
65
|
+
finally:
|
|
66
|
+
result.flush()
|
|
67
|
+
os.fsync(result.fileno())
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
replace = retry(stop_after_delay=1, wait=0.25)(os.replace)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# test_writable_dir and _test_writable_dir_win are copied from Flit,
|
|
74
|
+
# with the author's agreement to also place them under pip's license.
|
|
75
|
+
def test_writable_dir(path: str) -> bool:
|
|
76
|
+
"""Check if a directory is writable.
|
|
77
|
+
|
|
78
|
+
Uses os.access() on POSIX, tries creating files on Windows.
|
|
79
|
+
"""
|
|
80
|
+
# If the directory doesn't exist, find the closest parent that does.
|
|
81
|
+
while not os.path.isdir(path):
|
|
82
|
+
parent = os.path.dirname(path)
|
|
83
|
+
if parent == path:
|
|
84
|
+
break # Should never get here, but infinite loops are bad
|
|
85
|
+
path = parent
|
|
86
|
+
|
|
87
|
+
if os.name == "posix":
|
|
88
|
+
return os.access(path, os.W_OK)
|
|
89
|
+
|
|
90
|
+
return _test_writable_dir_win(path)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _test_writable_dir_win(path: str) -> bool:
|
|
94
|
+
# os.access doesn't work on Windows: http://bugs.python.org/issue2528
|
|
95
|
+
# and we can't use tempfile: http://bugs.python.org/issue22107
|
|
96
|
+
basename = "accesstest_deleteme_fishfingers_custard_"
|
|
97
|
+
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
|
|
98
|
+
for _ in range(10):
|
|
99
|
+
name = basename + "".join(random.choice(alphabet) for _ in range(6))
|
|
100
|
+
file = os.path.join(path, name)
|
|
101
|
+
try:
|
|
102
|
+
fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL)
|
|
103
|
+
except FileExistsError:
|
|
104
|
+
pass
|
|
105
|
+
except PermissionError:
|
|
106
|
+
# This could be because there's a directory with the same name.
|
|
107
|
+
# But it's highly unlikely there's a directory called that,
|
|
108
|
+
# so we'll assume it's because the parent dir is not writable.
|
|
109
|
+
# This could as well be because the parent dir is not readable,
|
|
110
|
+
# due to non-privileged user access.
|
|
111
|
+
return False
|
|
112
|
+
else:
|
|
113
|
+
os.close(fd)
|
|
114
|
+
os.unlink(file)
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
# This should never be reached
|
|
118
|
+
raise OSError("Unexpected condition testing for writable directory")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def find_files(path: str, pattern: str) -> list[str]:
|
|
122
|
+
"""Returns a list of absolute paths of files beneath path, recursively,
|
|
123
|
+
with filenames which match the UNIX-style shell glob pattern."""
|
|
124
|
+
result: list[str] = []
|
|
125
|
+
for root, _, files in os.walk(path):
|
|
126
|
+
matches = fnmatch.filter(files, pattern)
|
|
127
|
+
result.extend(os.path.join(root, f) for f in matches)
|
|
128
|
+
return result
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def file_size(path: str) -> int | float:
|
|
132
|
+
# If it's a symlink, return 0.
|
|
133
|
+
if os.path.islink(path):
|
|
134
|
+
return 0
|
|
135
|
+
return os.path.getsize(path)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def format_file_size(path: str) -> str:
|
|
139
|
+
return format_size(file_size(path))
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def directory_size(path: str) -> int | float:
|
|
143
|
+
size = 0.0
|
|
144
|
+
for root, _dirs, files in os.walk(path):
|
|
145
|
+
for filename in files:
|
|
146
|
+
file_path = os.path.join(root, filename)
|
|
147
|
+
size += file_size(file_path)
|
|
148
|
+
return size
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def format_directory_size(path: str) -> str:
|
|
152
|
+
return format_size(directory_size(path))
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Filetype information."""
|
|
2
|
+
|
|
3
|
+
from pip._internal.utils.misc import splitext
|
|
4
|
+
|
|
5
|
+
WHEEL_EXTENSION = ".whl"
|
|
6
|
+
BZ2_EXTENSIONS: tuple[str, ...] = (".tar.bz2", ".tbz")
|
|
7
|
+
XZ_EXTENSIONS: tuple[str, ...] = (
|
|
8
|
+
".tar.xz",
|
|
9
|
+
".txz",
|
|
10
|
+
".tlz",
|
|
11
|
+
".tar.lz",
|
|
12
|
+
".tar.lzma",
|
|
13
|
+
)
|
|
14
|
+
ZIP_EXTENSIONS: tuple[str, ...] = (".zip", WHEEL_EXTENSION)
|
|
15
|
+
TAR_EXTENSIONS: tuple[str, ...] = (".tar.gz", ".tgz", ".tar")
|
|
16
|
+
ARCHIVE_EXTENSIONS = ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def is_archive_file(name: str) -> bool:
|
|
20
|
+
"""Return True if `name` is a considered as an archive file."""
|
|
21
|
+
ext = splitext(name)[1].lower()
|
|
22
|
+
if ext in ARCHIVE_EXTENSIONS:
|
|
23
|
+
return True
|
|
24
|
+
return False
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def glibc_version_string() -> str | None:
|
|
8
|
+
"Returns glibc version string, or None if not using glibc."
|
|
9
|
+
return glibc_version_string_confstr() or glibc_version_string_ctypes()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def glibc_version_string_confstr() -> str | None:
|
|
13
|
+
"Primary implementation of glibc_version_string using os.confstr."
|
|
14
|
+
# os.confstr is quite a bit faster than ctypes.DLL. It's also less likely
|
|
15
|
+
# to be broken or missing. This strategy is used in the standard library
|
|
16
|
+
# platform module:
|
|
17
|
+
# https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183
|
|
18
|
+
if sys.platform == "win32":
|
|
19
|
+
return None
|
|
20
|
+
try:
|
|
21
|
+
gnu_libc_version = os.confstr("CS_GNU_LIBC_VERSION")
|
|
22
|
+
if gnu_libc_version is None:
|
|
23
|
+
return None
|
|
24
|
+
# os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17":
|
|
25
|
+
_, version = gnu_libc_version.split()
|
|
26
|
+
except (AttributeError, OSError, ValueError):
|
|
27
|
+
# os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)...
|
|
28
|
+
return None
|
|
29
|
+
return version
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def glibc_version_string_ctypes() -> str | None:
|
|
33
|
+
"Fallback implementation of glibc_version_string using ctypes."
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
import ctypes
|
|
37
|
+
except ImportError:
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
# ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
|
|
41
|
+
# manpage says, "If filename is NULL, then the returned handle is for the
|
|
42
|
+
# main program". This way we can let the linker do the work to figure out
|
|
43
|
+
# which libc our process is actually using.
|
|
44
|
+
#
|
|
45
|
+
# We must also handle the special case where the executable is not a
|
|
46
|
+
# dynamically linked executable. This can occur when using musl libc,
|
|
47
|
+
# for example. In this situation, dlopen() will error, leading to an
|
|
48
|
+
# OSError. Interestingly, at least in the case of musl, there is no
|
|
49
|
+
# errno set on the OSError. The single string argument used to construct
|
|
50
|
+
# OSError comes from libc itself and is therefore not portable to
|
|
51
|
+
# hard code here. In any case, failure to call dlopen() means we
|
|
52
|
+
# can't proceed, so we bail on our attempt.
|
|
53
|
+
try:
|
|
54
|
+
process_namespace = ctypes.CDLL(None)
|
|
55
|
+
except OSError:
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
gnu_get_libc_version = process_namespace.gnu_get_libc_version
|
|
60
|
+
except AttributeError:
|
|
61
|
+
# Symbol doesn't exist -> therefore, we are not linked to
|
|
62
|
+
# glibc.
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
# Call gnu_get_libc_version, which returns a string like "2.5"
|
|
66
|
+
gnu_get_libc_version.restype = ctypes.c_char_p
|
|
67
|
+
version_str: str = gnu_get_libc_version()
|
|
68
|
+
# py2 / py3 compatibility:
|
|
69
|
+
if not isinstance(version_str, str):
|
|
70
|
+
version_str = version_str.decode("ascii")
|
|
71
|
+
|
|
72
|
+
return version_str
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# platform.libc_ver regularly returns completely nonsensical glibc
|
|
76
|
+
# versions. E.g. on my computer, platform says:
|
|
77
|
+
#
|
|
78
|
+
# ~$ python2.7 -c 'import platform; print(platform.libc_ver())'
|
|
79
|
+
# ('glibc', '2.7')
|
|
80
|
+
# ~$ python3.5 -c 'import platform; print(platform.libc_ver())'
|
|
81
|
+
# ('glibc', '2.9')
|
|
82
|
+
#
|
|
83
|
+
# But the truth is:
|
|
84
|
+
#
|
|
85
|
+
# ~$ ldd --version
|
|
86
|
+
# ldd (Debian GLIBC 2.22-11) 2.22
|
|
87
|
+
#
|
|
88
|
+
# This is unfortunate, because it means that the linehaul data on libc
|
|
89
|
+
# versions that was generated by pip 8.1.2 and earlier is useless and
|
|
90
|
+
# misleading. Solution: instead of using platform, use our code that actually
|
|
91
|
+
# works.
|
|
92
|
+
def libc_ver() -> tuple[str, str]:
|
|
93
|
+
"""Try to determine the glibc version
|
|
94
|
+
|
|
95
|
+
Returns a tuple of strings (lib, version) which default to empty strings
|
|
96
|
+
in case the lookup fails.
|
|
97
|
+
"""
|
|
98
|
+
glibc_version = glibc_version_string()
|
|
99
|
+
if glibc_version is None:
|
|
100
|
+
return ("", "")
|
|
101
|
+
else:
|
|
102
|
+
return ("glibc", glibc_version)
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
from collections.abc import Iterable
|
|
5
|
+
from typing import TYPE_CHECKING, BinaryIO, NoReturn
|
|
6
|
+
|
|
7
|
+
from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError
|
|
8
|
+
from pip._internal.utils.misc import read_chunks
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from hashlib import _Hash
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# The recommended hash algo of the moment. Change this whenever the state of
|
|
15
|
+
# the art changes; it won't hurt backward compatibility.
|
|
16
|
+
FAVORITE_HASH = "sha256"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Names of hashlib algorithms allowed by the --hash option and ``pip hash``
|
|
20
|
+
# Currently, those are the ones at least as collision-resistant as sha256.
|
|
21
|
+
STRONG_HASHES = ["sha256", "sha384", "sha512"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Hashes:
|
|
25
|
+
"""A wrapper that builds multiple hashes at once and checks them against
|
|
26
|
+
known-good values
|
|
27
|
+
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, hashes: dict[str, list[str]] | None = None) -> None:
|
|
31
|
+
"""
|
|
32
|
+
:param hashes: A dict of algorithm names pointing to lists of allowed
|
|
33
|
+
hex digests
|
|
34
|
+
"""
|
|
35
|
+
allowed = {}
|
|
36
|
+
if hashes is not None:
|
|
37
|
+
for alg, keys in hashes.items():
|
|
38
|
+
# Make sure values are always sorted (to ease equality checks)
|
|
39
|
+
allowed[alg] = [k.lower() for k in sorted(keys)]
|
|
40
|
+
self._allowed = allowed
|
|
41
|
+
|
|
42
|
+
def __and__(self, other: Hashes) -> Hashes:
|
|
43
|
+
if not isinstance(other, Hashes):
|
|
44
|
+
return NotImplemented
|
|
45
|
+
|
|
46
|
+
# If either of the Hashes object is entirely empty (i.e. no hash
|
|
47
|
+
# specified at all), all hashes from the other object are allowed.
|
|
48
|
+
if not other:
|
|
49
|
+
return self
|
|
50
|
+
if not self:
|
|
51
|
+
return other
|
|
52
|
+
|
|
53
|
+
# Otherwise only hashes that present in both objects are allowed.
|
|
54
|
+
new = {}
|
|
55
|
+
for alg, values in other._allowed.items():
|
|
56
|
+
if alg not in self._allowed:
|
|
57
|
+
continue
|
|
58
|
+
new[alg] = [v for v in values if v in self._allowed[alg]]
|
|
59
|
+
return Hashes(new)
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def digest_count(self) -> int:
|
|
63
|
+
return sum(len(digests) for digests in self._allowed.values())
|
|
64
|
+
|
|
65
|
+
def is_hash_allowed(self, hash_name: str, hex_digest: str) -> bool:
|
|
66
|
+
"""Return whether the given hex digest is allowed."""
|
|
67
|
+
return hex_digest in self._allowed.get(hash_name, [])
|
|
68
|
+
|
|
69
|
+
def check_against_chunks(self, chunks: Iterable[bytes]) -> None:
|
|
70
|
+
"""Check good hashes against ones built from iterable of chunks of
|
|
71
|
+
data.
|
|
72
|
+
|
|
73
|
+
Raise HashMismatch if none match.
|
|
74
|
+
|
|
75
|
+
"""
|
|
76
|
+
gots = {}
|
|
77
|
+
for hash_name in self._allowed.keys():
|
|
78
|
+
try:
|
|
79
|
+
gots[hash_name] = hashlib.new(hash_name)
|
|
80
|
+
except (ValueError, TypeError):
|
|
81
|
+
raise InstallationError(f"Unknown hash name: {hash_name}")
|
|
82
|
+
|
|
83
|
+
for chunk in chunks:
|
|
84
|
+
for hash in gots.values():
|
|
85
|
+
hash.update(chunk)
|
|
86
|
+
|
|
87
|
+
for hash_name, got in gots.items():
|
|
88
|
+
if got.hexdigest() in self._allowed[hash_name]:
|
|
89
|
+
return
|
|
90
|
+
self._raise(gots)
|
|
91
|
+
|
|
92
|
+
def _raise(self, gots: dict[str, _Hash]) -> NoReturn:
|
|
93
|
+
raise HashMismatch(self._allowed, gots)
|
|
94
|
+
|
|
95
|
+
def check_against_file(self, file: BinaryIO) -> None:
|
|
96
|
+
"""Check good hashes against a file-like object
|
|
97
|
+
|
|
98
|
+
Raise HashMismatch if none match.
|
|
99
|
+
|
|
100
|
+
"""
|
|
101
|
+
return self.check_against_chunks(read_chunks(file))
|
|
102
|
+
|
|
103
|
+
def check_against_path(self, path: str) -> None:
|
|
104
|
+
with open(path, "rb") as file:
|
|
105
|
+
return self.check_against_file(file)
|
|
106
|
+
|
|
107
|
+
def has_one_of(self, hashes: dict[str, str]) -> bool:
|
|
108
|
+
"""Return whether any of the given hashes are allowed."""
|
|
109
|
+
for hash_name, hex_digest in hashes.items():
|
|
110
|
+
if self.is_hash_allowed(hash_name, hex_digest):
|
|
111
|
+
return True
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
def __bool__(self) -> bool:
|
|
115
|
+
"""Return whether I know any known-good hashes."""
|
|
116
|
+
return bool(self._allowed)
|
|
117
|
+
|
|
118
|
+
def __eq__(self, other: object) -> bool:
|
|
119
|
+
if not isinstance(other, Hashes):
|
|
120
|
+
return NotImplemented
|
|
121
|
+
return self._allowed == other._allowed
|
|
122
|
+
|
|
123
|
+
def __hash__(self) -> int:
|
|
124
|
+
return hash(
|
|
125
|
+
",".join(
|
|
126
|
+
sorted(
|
|
127
|
+
":".join((alg, digest))
|
|
128
|
+
for alg, digest_list in self._allowed.items()
|
|
129
|
+
for digest in digest_list
|
|
130
|
+
)
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class MissingHashes(Hashes):
|
|
136
|
+
"""A workalike for Hashes used when we're missing a hash for a requirement
|
|
137
|
+
|
|
138
|
+
It computes the actual hash of the requirement and raises a HashMissing
|
|
139
|
+
exception showing it to the user.
|
|
140
|
+
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
def __init__(self) -> None:
|
|
144
|
+
"""Don't offer the ``hashes`` kwarg."""
|
|
145
|
+
# Pass our favorite hash in to generate a "gotten hash". With the
|
|
146
|
+
# empty list, it will never match, so an error will always raise.
|
|
147
|
+
super().__init__(hashes={FAVORITE_HASH: []})
|
|
148
|
+
|
|
149
|
+
def _raise(self, gots: dict[str, _Hash]) -> NoReturn:
|
|
150
|
+
raise HashMissing(gots[FAVORITE_HASH].hexdigest())
|