From bed5b5dd8a486d150aa05ca7f27d8f1b878c6949 Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 13:56:40 -0500 Subject: [PATCH 1/8] News Entry --- news/12488.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/12488.feature.rst diff --git a/news/12488.feature.rst b/news/12488.feature.rst new file mode 100644 index 00000000000..4ac19b6f97a --- /dev/null +++ b/news/12488.feature.rst @@ -0,0 +1 @@ +No longer import type hint only objects at runtime From 64a36b523652cc26a633a719c25c53083097c09f Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 13:04:00 -0500 Subject: [PATCH 2/8] Add required `from __future__ import annotations` imports --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 7496a08ee2c..abfa9e0d206 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -175,6 +175,7 @@ select = [ # the docs and tests directories. known-first-party = ["pip"] known-third-party = ["pip._vendor"] +required-imports = ["from __future__ import annotations"] [tool.ruff.mccabe] max-complexity = 33 # default is 10 From cbcf66a96272c982e90f773807a50294ce29ee28 Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 13:05:18 -0500 Subject: [PATCH 3/8] Apply required `from __future__ import annotations` --- docs/html/conf.py | 1 + docs/pip_sphinxext.py | 1 + noxfile.py | 1 + setup.py | 2 ++ src/pip/__init__.py | 2 ++ src/pip/__main__.py | 2 ++ src/pip/__pip-runner__.py | 1 + src/pip/_internal/__init__.py | 2 ++ src/pip/_internal/build_env.py | 1 + src/pip/_internal/cache.py | 1 + src/pip/_internal/cli/autocompletion.py | 1 + src/pip/_internal/cli/base_command.py | 1 + src/pip/_internal/cli/cmdoptions.py | 1 + src/pip/_internal/cli/command_context.py | 2 ++ src/pip/_internal/cli/main.py | 2 ++ src/pip/_internal/cli/main_parser.py | 1 + src/pip/_internal/cli/parser.py | 1 + src/pip/_internal/cli/progress_bars.py | 2 ++ src/pip/_internal/cli/req_command.py | 1 + src/pip/_internal/cli/spinners.py | 2 ++ src/pip/_internal/cli/status_codes.py | 2 ++ src/pip/_internal/commands/__init__.py | 1 + src/pip/_internal/commands/cache.py | 2 ++ src/pip/_internal/commands/check.py | 2 ++ src/pip/_internal/commands/completion.py | 2 ++ src/pip/_internal/commands/configuration.py | 2 ++ src/pip/_internal/commands/debug.py | 2 ++ src/pip/_internal/commands/download.py | 2 ++ src/pip/_internal/commands/freeze.py | 2 ++ src/pip/_internal/commands/hash.py | 2 ++ src/pip/_internal/commands/help.py | 2 ++ src/pip/_internal/commands/index.py | 2 ++ src/pip/_internal/commands/inspect.py | 2 ++ src/pip/_internal/commands/install.py | 2 ++ src/pip/_internal/commands/list.py | 2 ++ src/pip/_internal/commands/search.py | 2 ++ src/pip/_internal/commands/show.py | 2 ++ src/pip/_internal/commands/uninstall.py | 2 ++ src/pip/_internal/commands/wheel.py | 2 ++ src/pip/_internal/configuration.py | 1 + src/pip/_internal/distributions/__init__.py | 2 ++ src/pip/_internal/distributions/base.py | 2 ++ src/pip/_internal/distributions/installed.py | 2 ++ src/pip/_internal/distributions/sdist.py | 2 ++ src/pip/_internal/distributions/wheel.py | 2 ++ src/pip/_internal/exceptions.py | 1 + src/pip/_internal/index/collector.py | 1 + src/pip/_internal/index/package_finder.py | 1 + src/pip/_internal/index/sources.py | 2 ++ src/pip/_internal/locations/__init__.py | 2 ++ src/pip/_internal/locations/_distutils.py | 2 ++ src/pip/_internal/locations/_sysconfig.py | 2 ++ src/pip/_internal/locations/base.py | 2 ++ src/pip/_internal/main.py | 2 ++ src/pip/_internal/metadata/__init__.py | 2 ++ src/pip/_internal/metadata/_json.py | 1 + src/pip/_internal/metadata/base.py | 2 ++ src/pip/_internal/metadata/importlib/__init__.py | 2 ++ src/pip/_internal/metadata/importlib/_compat.py | 2 ++ src/pip/_internal/metadata/importlib/_dists.py | 2 ++ src/pip/_internal/metadata/importlib/_envs.py | 2 ++ src/pip/_internal/metadata/pkg_resources.py | 2 ++ src/pip/_internal/models/candidate.py | 2 ++ src/pip/_internal/models/direct_url.py | 2 ++ src/pip/_internal/models/format_control.py | 2 ++ src/pip/_internal/models/index.py | 2 ++ src/pip/_internal/models/installation_report.py | 2 ++ src/pip/_internal/models/link.py | 2 ++ src/pip/_internal/models/scheme.py | 2 +- src/pip/_internal/models/search_scope.py | 2 ++ src/pip/_internal/models/selection_prefs.py | 2 ++ src/pip/_internal/models/target_python.py | 2 ++ src/pip/_internal/models/wheel.py | 2 ++ src/pip/_internal/network/auth.py | 2 ++ src/pip/_internal/network/cache.py | 1 + src/pip/_internal/network/download.py | 2 ++ src/pip/_internal/network/lazy_wheel.py | 1 + src/pip/_internal/network/session.py | 1 + src/pip/_internal/network/utils.py | 2 ++ src/pip/_internal/network/xmlrpc.py | 1 + src/pip/_internal/operations/check.py | 1 + src/pip/_internal/operations/freeze.py | 2 ++ src/pip/_internal/operations/install/editable_legacy.py | 2 ++ src/pip/_internal/operations/install/wheel.py | 1 + src/pip/_internal/operations/prepare.py | 1 + src/pip/_internal/pyproject.py | 2 ++ src/pip/_internal/req/__init__.py | 2 ++ src/pip/_internal/req/constructors.py | 1 + src/pip/_internal/req/req_file.py | 1 + src/pip/_internal/req/req_install.py | 2 ++ src/pip/_internal/req/req_set.py | 2 ++ src/pip/_internal/req/req_uninstall.py | 2 ++ src/pip/_internal/resolution/base.py | 2 ++ src/pip/_internal/resolution/legacy/resolver.py | 1 + src/pip/_internal/resolution/resolvelib/base.py | 2 ++ src/pip/_internal/resolution/resolvelib/candidates.py | 2 ++ src/pip/_internal/resolution/resolvelib/factory.py | 2 ++ src/pip/_internal/resolution/resolvelib/found_candidates.py | 1 + src/pip/_internal/resolution/resolvelib/provider.py | 2 ++ src/pip/_internal/resolution/resolvelib/reporter.py | 2 ++ src/pip/_internal/resolution/resolvelib/requirements.py | 2 ++ src/pip/_internal/resolution/resolvelib/resolver.py | 2 ++ src/pip/_internal/self_outdated_check.py | 2 ++ src/pip/_internal/utils/_jaraco_text.py | 1 + src/pip/_internal/utils/_log.py | 1 + src/pip/_internal/utils/appdirs.py | 1 + src/pip/_internal/utils/compat.py | 1 + src/pip/_internal/utils/compatibility_tags.py | 1 + src/pip/_internal/utils/datetime.py | 1 + src/pip/_internal/utils/deprecation.py | 1 + src/pip/_internal/utils/direct_url_helpers.py | 2 ++ src/pip/_internal/utils/egg_link.py | 2 ++ src/pip/_internal/utils/encoding.py | 2 ++ src/pip/_internal/utils/entrypoints.py | 2 ++ src/pip/_internal/utils/filesystem.py | 2 ++ src/pip/_internal/utils/filetypes.py | 1 + src/pip/_internal/utils/glibc.py | 2 ++ src/pip/_internal/utils/hashes.py | 2 ++ src/pip/_internal/utils/logging.py | 2 ++ src/pip/_internal/utils/misc.py | 2 ++ src/pip/_internal/utils/models.py | 1 + src/pip/_internal/utils/packaging.py | 2 ++ src/pip/_internal/utils/setuptools_build.py | 2 ++ src/pip/_internal/utils/subprocess.py | 2 ++ src/pip/_internal/utils/temp_dir.py | 2 ++ src/pip/_internal/utils/unpacking.py | 1 + src/pip/_internal/utils/urls.py | 2 ++ src/pip/_internal/utils/virtualenv.py | 2 ++ src/pip/_internal/utils/wheel.py | 1 + src/pip/_internal/vcs/__init__.py | 2 ++ src/pip/_internal/vcs/bazaar.py | 2 ++ src/pip/_internal/vcs/git.py | 2 ++ src/pip/_internal/vcs/mercurial.py | 2 ++ src/pip/_internal/vcs/subversion.py | 2 ++ src/pip/_internal/vcs/versioncontrol.py | 1 + src/pip/_internal/wheel_builder.py | 1 + tests/conftest.py | 2 ++ tests/functional/test_bad_url.py | 1 + tests/functional/test_broken_stdout.py | 2 ++ tests/functional/test_build_env.py | 2 ++ tests/functional/test_cache.py | 2 ++ tests/functional/test_check.py | 2 ++ tests/functional/test_cli.py | 2 ++ tests/functional/test_completion.py | 2 ++ tests/functional/test_config_settings.py | 2 ++ tests/functional/test_configuration.py | 2 ++ tests/functional/test_debug.py | 2 ++ tests/functional/test_download.py | 2 ++ tests/functional/test_fast_deps.py | 2 ++ tests/functional/test_freeze.py | 2 ++ tests/functional/test_hash.py | 2 ++ tests/functional/test_help.py | 2 ++ tests/functional/test_index.py | 2 ++ tests/functional/test_inspect.py | 2 ++ tests/functional/test_install.py | 2 ++ tests/functional/test_install_check.py | 2 ++ tests/functional/test_install_cleanup.py | 2 ++ tests/functional/test_install_compat.py | 2 ++ tests/functional/test_install_config.py | 2 ++ tests/functional/test_install_direct_url.py | 2 ++ tests/functional/test_install_extras.py | 2 ++ tests/functional/test_install_force_reinstall.py | 2 ++ tests/functional/test_install_index.py | 2 ++ tests/functional/test_install_report.py | 2 ++ tests/functional/test_install_reqs.py | 2 ++ tests/functional/test_install_requested.py | 2 ++ tests/functional/test_install_upgrade.py | 2 ++ tests/functional/test_install_user.py | 2 ++ tests/functional/test_install_vcs_git.py | 2 ++ tests/functional/test_install_wheel.py | 2 ++ tests/functional/test_list.py | 2 ++ tests/functional/test_new_resolver.py | 2 ++ tests/functional/test_new_resolver_errors.py | 2 ++ tests/functional/test_new_resolver_hashes.py | 2 ++ tests/functional/test_new_resolver_target.py | 2 ++ tests/functional/test_new_resolver_user.py | 2 ++ tests/functional/test_no_color.py | 2 ++ tests/functional/test_pep517.py | 2 ++ tests/functional/test_pep660.py | 2 ++ tests/functional/test_pep668.py | 2 ++ tests/functional/test_pip_runner_script.py | 2 ++ tests/functional/test_python_option.py | 2 ++ tests/functional/test_search.py | 2 ++ tests/functional/test_show.py | 2 ++ tests/functional/test_truststore.py | 2 ++ tests/functional/test_uninstall.py | 2 ++ tests/functional/test_uninstall_user.py | 2 ++ tests/functional/test_vcs_bazaar.py | 1 + tests/functional/test_vcs_git.py | 2 ++ tests/functional/test_vcs_mercurial.py | 2 ++ tests/functional/test_vcs_subversion.py | 2 ++ tests/functional/test_warning.py | 2 ++ tests/functional/test_wheel.py | 2 ++ tests/lib/__init__.py | 2 ++ tests/lib/certs.py | 2 ++ tests/lib/compat.py | 1 + tests/lib/configuration_helpers.py | 1 + tests/lib/direct_url.py | 2 ++ tests/lib/filesystem.py | 2 ++ tests/lib/git_submodule_helpers.py | 2 ++ tests/lib/index.py | 2 ++ tests/lib/local_repos.py | 2 ++ tests/lib/options_helpers.py | 1 + tests/lib/requests_mocks.py | 1 + tests/lib/server.py | 2 ++ tests/lib/test_lib.py | 2 ++ tests/lib/test_wheel.py | 2 ++ tests/lib/venv.py | 2 ++ tests/lib/wheel.py | 2 ++ tests/unit/metadata/test_metadata.py | 2 ++ tests/unit/metadata/test_metadata_pkg_resources.py | 2 ++ tests/unit/resolution_resolvelib/conftest.py | 2 ++ tests/unit/resolution_resolvelib/test_provider.py | 2 ++ tests/unit/resolution_resolvelib/test_requirement.py | 2 ++ tests/unit/resolution_resolvelib/test_resolver.py | 2 ++ tests/unit/test_appdirs.py | 1 + tests/unit/test_base_command.py | 2 ++ tests/unit/test_cache.py | 2 ++ tests/unit/test_cmdoptions.py | 2 ++ tests/unit/test_collector.py | 2 ++ tests/unit/test_command_install.py | 2 ++ tests/unit/test_commands.py | 2 ++ tests/unit/test_compat.py | 2 ++ tests/unit/test_configuration.py | 1 + tests/unit/test_direct_url.py | 2 ++ tests/unit/test_direct_url_helpers.py | 2 ++ tests/unit/test_exceptions.py | 1 + tests/unit/test_finder.py | 2 ++ tests/unit/test_format_control.py | 2 ++ tests/unit/test_index.py | 2 ++ tests/unit/test_link.py | 2 ++ tests/unit/test_locations.py | 2 ++ tests/unit/test_logging.py | 2 ++ tests/unit/test_models.py | 1 + tests/unit/test_models_wheel.py | 2 ++ tests/unit/test_network_auth.py | 2 ++ tests/unit/test_network_cache.py | 2 ++ tests/unit/test_network_download.py | 2 ++ tests/unit/test_network_lazy_wheel.py | 2 ++ tests/unit/test_network_session.py | 2 ++ tests/unit/test_network_utils.py | 2 ++ tests/unit/test_operations_prepare.py | 2 ++ tests/unit/test_options.py | 2 ++ tests/unit/test_packaging.py | 2 ++ tests/unit/test_pep517.py | 2 ++ tests/unit/test_pyproject_config.py | 2 ++ tests/unit/test_req.py | 2 ++ tests/unit/test_req_file.py | 2 ++ tests/unit/test_req_install.py | 2 ++ tests/unit/test_req_uninstall.py | 2 ++ tests/unit/test_resolution_legacy_resolver.py | 2 ++ tests/unit/test_search_scope.py | 2 ++ tests/unit/test_self_check_outdated.py | 2 ++ tests/unit/test_target_python.py | 2 ++ tests/unit/test_urls.py | 2 ++ tests/unit/test_utils.py | 2 ++ tests/unit/test_utils_compatibility_tags.py | 2 ++ tests/unit/test_utils_filesystem.py | 2 ++ tests/unit/test_utils_subprocess.py | 2 ++ tests/unit/test_utils_temp_dir.py | 2 ++ tests/unit/test_utils_unpacking.py | 2 ++ tests/unit/test_utils_virtualenv.py | 2 ++ tests/unit/test_utils_wheel.py | 2 ++ tests/unit/test_vcs.py | 2 ++ tests/unit/test_vcs_mercurial.py | 1 + tests/unit/test_wheel.py | 2 ++ tests/unit/test_wheel_builder.py | 2 ++ tools/protected_pip.py | 2 ++ tools/release/__init__.py | 1 + tools/release/check_version.py | 1 + tools/update-rtd-redirects.py | 2 ++ 271 files changed, 486 insertions(+), 1 deletion(-) diff --git a/docs/html/conf.py b/docs/html/conf.py index 683ea7b87d8..ddc332122cf 100644 --- a/docs/html/conf.py +++ b/docs/html/conf.py @@ -1,4 +1,5 @@ """Sphinx configuration file for pip's documentation.""" +from __future__ import annotations import glob import os diff --git a/docs/pip_sphinxext.py b/docs/pip_sphinxext.py index fe3f41e8b79..06d3db22f2c 100644 --- a/docs/pip_sphinxext.py +++ b/docs/pip_sphinxext.py @@ -1,4 +1,5 @@ """pip sphinx extensions""" +from __future__ import annotations import optparse import pathlib diff --git a/noxfile.py b/noxfile.py index 878dbbd0ad6..5d8c539ab56 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,5 +1,6 @@ """Automation using nox. """ +from __future__ import annotations import argparse import glob diff --git a/setup.py b/setup.py index 5599ffe142e..86b5bbd428f 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys from setuptools import setup diff --git a/src/pip/__init__.py b/src/pip/__init__.py index 46e56014998..cc4bfa7b096 100644 --- a/src/pip/__init__.py +++ b/src/pip/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import List, Optional __version__ = "24.0.dev0" diff --git a/src/pip/__main__.py b/src/pip/__main__.py index 5991326115f..52d23f9dda7 100644 --- a/src/pip/__main__.py +++ b/src/pip/__main__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys diff --git a/src/pip/__pip-runner__.py b/src/pip/__pip-runner__.py index 49a148a097e..849cd58c4e8 100644 --- a/src/pip/__pip-runner__.py +++ b/src/pip/__pip-runner__.py @@ -5,6 +5,7 @@ """ # /!\ This version compatibility check section must be Python 2 compatible. /!\ +from __future__ import annotations import sys diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py index 96c6b88c112..3db1add8916 100755 --- a/src/pip/_internal/__init__.py +++ b/src/pip/_internal/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import List, Optional from pip._internal.utils import _log diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 4f704a3547d..530fa868589 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -1,5 +1,6 @@ """Build Environment used for isolation during sdist building """ +from __future__ import annotations import logging import os diff --git a/src/pip/_internal/cache.py b/src/pip/_internal/cache.py index f45ac23e95a..b4652829077 100644 --- a/src/pip/_internal/cache.py +++ b/src/pip/_internal/cache.py @@ -1,5 +1,6 @@ """Cache Management """ +from __future__ import annotations import hashlib import json diff --git a/src/pip/_internal/cli/autocompletion.py b/src/pip/_internal/cli/autocompletion.py index e5950b90696..2f4d344fddd 100644 --- a/src/pip/_internal/cli/autocompletion.py +++ b/src/pip/_internal/cli/autocompletion.py @@ -1,5 +1,6 @@ """Logic that powers autocompletion installed by ``pip completion``. """ +from __future__ import annotations import optparse import os diff --git a/src/pip/_internal/cli/base_command.py b/src/pip/_internal/cli/base_command.py index db9d5cc6624..cc2e5a0217a 100644 --- a/src/pip/_internal/cli/base_command.py +++ b/src/pip/_internal/cli/base_command.py @@ -1,4 +1,5 @@ """Base Command class, and related routines""" +from __future__ import annotations import functools import logging diff --git a/src/pip/_internal/cli/cmdoptions.py b/src/pip/_internal/cli/cmdoptions.py index d05e502f908..f470f080270 100644 --- a/src/pip/_internal/cli/cmdoptions.py +++ b/src/pip/_internal/cli/cmdoptions.py @@ -9,6 +9,7 @@ # The following comment should be removed at some point in the future. # mypy: strict-optional=False +from __future__ import annotations import importlib.util import logging diff --git a/src/pip/_internal/cli/command_context.py b/src/pip/_internal/cli/command_context.py index 139995ac3f1..6e1850399ba 100644 --- a/src/pip/_internal/cli/command_context.py +++ b/src/pip/_internal/cli/command_context.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from contextlib import ExitStack, contextmanager from typing import ContextManager, Generator, TypeVar diff --git a/src/pip/_internal/cli/main.py b/src/pip/_internal/cli/main.py index 7e061f5b390..edaaa758017 100644 --- a/src/pip/_internal/cli/main.py +++ b/src/pip/_internal/cli/main.py @@ -1,5 +1,7 @@ """Primary application entrypoint. """ +from __future__ import annotations + import locale import logging import os diff --git a/src/pip/_internal/cli/main_parser.py b/src/pip/_internal/cli/main_parser.py index 5ade356b9c2..fe888d3d912 100644 --- a/src/pip/_internal/cli/main_parser.py +++ b/src/pip/_internal/cli/main_parser.py @@ -1,5 +1,6 @@ """A single place for constructing and exposing the main parser """ +from __future__ import annotations import os import subprocess diff --git a/src/pip/_internal/cli/parser.py b/src/pip/_internal/cli/parser.py index ae554b24cae..ad944d96d6c 100644 --- a/src/pip/_internal/cli/parser.py +++ b/src/pip/_internal/cli/parser.py @@ -1,4 +1,5 @@ """Base option parser setup""" +from __future__ import annotations import logging import optparse diff --git a/src/pip/_internal/cli/progress_bars.py b/src/pip/_internal/cli/progress_bars.py index 0ad14031ca5..76ef6a409a8 100644 --- a/src/pip/_internal/cli/progress_bars.py +++ b/src/pip/_internal/cli/progress_bars.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py index 6f2f79c6b3f..e1afd6a81de 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -4,6 +4,7 @@ needing download / PackageFinder capability don't unnecessarily import the PackageFinder machinery and all its vendored dependencies, etc. """ +from __future__ import annotations import logging import os diff --git a/src/pip/_internal/cli/spinners.py b/src/pip/_internal/cli/spinners.py index cf2b976f377..c275acc8573 100644 --- a/src/pip/_internal/cli/spinners.py +++ b/src/pip/_internal/cli/spinners.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import contextlib import itertools import logging diff --git a/src/pip/_internal/cli/status_codes.py b/src/pip/_internal/cli/status_codes.py index 5e29502cddf..540c41f7936 100644 --- a/src/pip/_internal/cli/status_codes.py +++ b/src/pip/_internal/cli/status_codes.py @@ -1,3 +1,5 @@ +from __future__ import annotations + SUCCESS = 0 ERROR = 1 UNKNOWN_ERROR = 2 diff --git a/src/pip/_internal/commands/__init__.py b/src/pip/_internal/commands/__init__.py index 858a4101416..8d85b6c8486 100644 --- a/src/pip/_internal/commands/__init__.py +++ b/src/pip/_internal/commands/__init__.py @@ -1,6 +1,7 @@ """ Package containing all pip commands """ +from __future__ import annotations import importlib from collections import namedtuple diff --git a/src/pip/_internal/commands/cache.py b/src/pip/_internal/commands/cache.py index 328336152cc..8f33539b5a4 100644 --- a/src/pip/_internal/commands/cache.py +++ b/src/pip/_internal/commands/cache.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import textwrap from optparse import Values diff --git a/src/pip/_internal/commands/check.py b/src/pip/_internal/commands/check.py index 5efd0a34160..7146b3fbc20 100644 --- a/src/pip/_internal/commands/check.py +++ b/src/pip/_internal/commands/check.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from optparse import Values from typing import List diff --git a/src/pip/_internal/commands/completion.py b/src/pip/_internal/commands/completion.py index 9e89e279883..8676ef8abdd 100644 --- a/src/pip/_internal/commands/completion.py +++ b/src/pip/_internal/commands/completion.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys import textwrap from optparse import Values diff --git a/src/pip/_internal/commands/configuration.py b/src/pip/_internal/commands/configuration.py index 1a1dc6b6cd8..30da9532126 100644 --- a/src/pip/_internal/commands/configuration.py +++ b/src/pip/_internal/commands/configuration.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import subprocess diff --git a/src/pip/_internal/commands/debug.py b/src/pip/_internal/commands/debug.py index 7e5271c9886..a5558b0ddff 100644 --- a/src/pip/_internal/commands/debug.py +++ b/src/pip/_internal/commands/debug.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import importlib.resources import locale import logging diff --git a/src/pip/_internal/commands/download.py b/src/pip/_internal/commands/download.py index 54247a78a65..687bfe25faf 100644 --- a/src/pip/_internal/commands/download.py +++ b/src/pip/_internal/commands/download.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os from optparse import Values diff --git a/src/pip/_internal/commands/freeze.py b/src/pip/_internal/commands/freeze.py index fd9d88a8b01..2181f7614c4 100644 --- a/src/pip/_internal/commands/freeze.py +++ b/src/pip/_internal/commands/freeze.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys from optparse import Values from typing import AbstractSet, List diff --git a/src/pip/_internal/commands/hash.py b/src/pip/_internal/commands/hash.py index 042dac813e7..814d389648a 100644 --- a/src/pip/_internal/commands/hash.py +++ b/src/pip/_internal/commands/hash.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import hashlib import logging import sys diff --git a/src/pip/_internal/commands/help.py b/src/pip/_internal/commands/help.py index 62066318b74..7540fec1625 100644 --- a/src/pip/_internal/commands/help.py +++ b/src/pip/_internal/commands/help.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from optparse import Values from typing import List diff --git a/src/pip/_internal/commands/index.py b/src/pip/_internal/commands/index.py index f55e9e49974..716619f435e 100644 --- a/src/pip/_internal/commands/index.py +++ b/src/pip/_internal/commands/index.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from optparse import Values from typing import Any, Iterable, List, Optional, Union diff --git a/src/pip/_internal/commands/inspect.py b/src/pip/_internal/commands/inspect.py index 27c8fa3d5b6..af32cf828a1 100644 --- a/src/pip/_internal/commands/inspect.py +++ b/src/pip/_internal/commands/inspect.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from optparse import Values from typing import Any, Dict, List diff --git a/src/pip/_internal/commands/install.py b/src/pip/_internal/commands/install.py index e944bb95a50..a20edcbde4c 100644 --- a/src/pip/_internal/commands/install.py +++ b/src/pip/_internal/commands/install.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import errno import json import operator diff --git a/src/pip/_internal/commands/list.py b/src/pip/_internal/commands/list.py index e551dda9a96..5f616fc13ef 100644 --- a/src/pip/_internal/commands/list.py +++ b/src/pip/_internal/commands/list.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import logging from optparse import Values diff --git a/src/pip/_internal/commands/search.py b/src/pip/_internal/commands/search.py index 03ed925b246..854924c6004 100644 --- a/src/pip/_internal/commands/search.py +++ b/src/pip/_internal/commands/search.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import shutil import sys diff --git a/src/pip/_internal/commands/show.py b/src/pip/_internal/commands/show.py index 3f10701f6b2..5d5ce310898 100644 --- a/src/pip/_internal/commands/show.py +++ b/src/pip/_internal/commands/show.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from optparse import Values from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional diff --git a/src/pip/_internal/commands/uninstall.py b/src/pip/_internal/commands/uninstall.py index f198fc313ff..6e74fe7f57e 100644 --- a/src/pip/_internal/commands/uninstall.py +++ b/src/pip/_internal/commands/uninstall.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from optparse import Values from typing import List diff --git a/src/pip/_internal/commands/wheel.py b/src/pip/_internal/commands/wheel.py index ed578aa2500..feef2c914c5 100644 --- a/src/pip/_internal/commands/wheel.py +++ b/src/pip/_internal/commands/wheel.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import shutil diff --git a/src/pip/_internal/configuration.py b/src/pip/_internal/configuration.py index c25273d5f0b..a4942f815a5 100644 --- a/src/pip/_internal/configuration.py +++ b/src/pip/_internal/configuration.py @@ -10,6 +10,7 @@ - variant A single word describing where the configuration key-value pair came from """ +from __future__ import annotations import configparser import locale diff --git a/src/pip/_internal/distributions/__init__.py b/src/pip/_internal/distributions/__init__.py index 9a89a838b9a..387cccd0a5c 100644 --- a/src/pip/_internal/distributions/__init__.py +++ b/src/pip/_internal/distributions/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pip._internal.distributions.base import AbstractDistribution from pip._internal.distributions.sdist import SourceDistribution from pip._internal.distributions.wheel import WheelDistribution diff --git a/src/pip/_internal/distributions/base.py b/src/pip/_internal/distributions/base.py index 6fb0d7b7772..9d5632e80ca 100644 --- a/src/pip/_internal/distributions/base.py +++ b/src/pip/_internal/distributions/base.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import abc from typing import Optional diff --git a/src/pip/_internal/distributions/installed.py b/src/pip/_internal/distributions/installed.py index ab8d53be740..33bcb9db726 100644 --- a/src/pip/_internal/distributions/installed.py +++ b/src/pip/_internal/distributions/installed.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from pip._internal.distributions.base import AbstractDistribution diff --git a/src/pip/_internal/distributions/sdist.py b/src/pip/_internal/distributions/sdist.py index 15ff42b7b15..fcda5380ffc 100644 --- a/src/pip/_internal/distributions/sdist.py +++ b/src/pip/_internal/distributions/sdist.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from typing import Iterable, Optional, Set, Tuple diff --git a/src/pip/_internal/distributions/wheel.py b/src/pip/_internal/distributions/wheel.py index eb16e25cbcc..357a9505d9d 100644 --- a/src/pip/_internal/distributions/wheel.py +++ b/src/pip/_internal/distributions/wheel.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from pip._vendor.packaging.utils import canonicalize_name diff --git a/src/pip/_internal/exceptions.py b/src/pip/_internal/exceptions.py index 5007a622d82..3cd9cfeb29e 100644 --- a/src/pip/_internal/exceptions.py +++ b/src/pip/_internal/exceptions.py @@ -4,6 +4,7 @@ operate. This is expected to be importable from any/all files within the subpackage and, thus, should not depend on them. """ +from __future__ import annotations import configparser import contextlib diff --git a/src/pip/_internal/index/collector.py b/src/pip/_internal/index/collector.py index b3e293ea3a5..5750d2208c8 100644 --- a/src/pip/_internal/index/collector.py +++ b/src/pip/_internal/index/collector.py @@ -1,6 +1,7 @@ """ The main purpose of this module is to expose LinkCollector.collect_sources(). """ +from __future__ import annotations import collections import email.message diff --git a/src/pip/_internal/index/package_finder.py b/src/pip/_internal/index/package_finder.py index ec9ebc36718..3b0d772f553 100644 --- a/src/pip/_internal/index/package_finder.py +++ b/src/pip/_internal/index/package_finder.py @@ -1,4 +1,5 @@ """Routines related to PyPI, indexes""" +from __future__ import annotations import enum import functools diff --git a/src/pip/_internal/index/sources.py b/src/pip/_internal/index/sources.py index cd9cb8d40f1..78e72d1c4eb 100644 --- a/src/pip/_internal/index/sources.py +++ b/src/pip/_internal/index/sources.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import mimetypes import os diff --git a/src/pip/_internal/locations/__init__.py b/src/pip/_internal/locations/__init__.py index d54bc63eba3..791af1e2c7a 100644 --- a/src/pip/_internal/locations/__init__.py +++ b/src/pip/_internal/locations/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import logging import os diff --git a/src/pip/_internal/locations/_distutils.py b/src/pip/_internal/locations/_distutils.py index 0e18c6e1e14..aec7e685989 100644 --- a/src/pip/_internal/locations/_distutils.py +++ b/src/pip/_internal/locations/_distutils.py @@ -9,6 +9,8 @@ # # See https://github.com/pypa/pip/issues/8761 for the original discussion and # rationale for why this is done within pip. +from __future__ import annotations + try: __import__("_distutils_hack").remove_shim() except (ImportError, AttributeError): diff --git a/src/pip/_internal/locations/_sysconfig.py b/src/pip/_internal/locations/_sysconfig.py index 97aef1f1ac2..1cd73c88990 100644 --- a/src/pip/_internal/locations/_sysconfig.py +++ b/src/pip/_internal/locations/_sysconfig.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import sys diff --git a/src/pip/_internal/locations/base.py b/src/pip/_internal/locations/base.py index 3f9f896e632..16411b17792 100644 --- a/src/pip/_internal/locations/base.py +++ b/src/pip/_internal/locations/base.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import os import site diff --git a/src/pip/_internal/main.py b/src/pip/_internal/main.py index 33c6d24cd85..0557aa37858 100644 --- a/src/pip/_internal/main.py +++ b/src/pip/_internal/main.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import List, Optional diff --git a/src/pip/_internal/metadata/__init__.py b/src/pip/_internal/metadata/__init__.py index aa232b6cabd..56399eb28b3 100644 --- a/src/pip/_internal/metadata/__init__.py +++ b/src/pip/_internal/metadata/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import contextlib import functools import os diff --git a/src/pip/_internal/metadata/_json.py b/src/pip/_internal/metadata/_json.py index 27362fc726c..f545dc2e6b7 100644 --- a/src/pip/_internal/metadata/_json.py +++ b/src/pip/_internal/metadata/_json.py @@ -1,4 +1,5 @@ # Extracted from https://github.com/pfmoore/pkg_metadata +from __future__ import annotations from email.header import Header, decode_header, make_header from email.message import Message diff --git a/src/pip/_internal/metadata/base.py b/src/pip/_internal/metadata/base.py index 92491244108..87657401309 100644 --- a/src/pip/_internal/metadata/base.py +++ b/src/pip/_internal/metadata/base.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import csv import email.message import functools diff --git a/src/pip/_internal/metadata/importlib/__init__.py b/src/pip/_internal/metadata/importlib/__init__.py index a779138db10..881ced290bb 100644 --- a/src/pip/_internal/metadata/importlib/__init__.py +++ b/src/pip/_internal/metadata/importlib/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from ._dists import Distribution from ._envs import Environment diff --git a/src/pip/_internal/metadata/importlib/_compat.py b/src/pip/_internal/metadata/importlib/_compat.py index 593bff23ede..eaed4624f2f 100644 --- a/src/pip/_internal/metadata/importlib/_compat.py +++ b/src/pip/_internal/metadata/importlib/_compat.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import importlib.metadata from typing import Any, Optional, Protocol, cast diff --git a/src/pip/_internal/metadata/importlib/_dists.py b/src/pip/_internal/metadata/importlib/_dists.py index 26370facf28..41c0e1525ff 100644 --- a/src/pip/_internal/metadata/importlib/_dists.py +++ b/src/pip/_internal/metadata/importlib/_dists.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import email.message import importlib.metadata import os diff --git a/src/pip/_internal/metadata/importlib/_envs.py b/src/pip/_internal/metadata/importlib/_envs.py index 048dc55dcb2..fd75e4f7407 100644 --- a/src/pip/_internal/metadata/importlib/_envs.py +++ b/src/pip/_internal/metadata/importlib/_envs.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import importlib.metadata import logging diff --git a/src/pip/_internal/metadata/pkg_resources.py b/src/pip/_internal/metadata/pkg_resources.py index bb11e5bd8a5..2b7a7aa65b6 100644 --- a/src/pip/_internal/metadata/pkg_resources.py +++ b/src/pip/_internal/metadata/pkg_resources.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import email.message import email.parser import logging diff --git a/src/pip/_internal/models/candidate.py b/src/pip/_internal/models/candidate.py index 9184a902aef..68351f1b3bd 100644 --- a/src/pip/_internal/models/candidate.py +++ b/src/pip/_internal/models/candidate.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pip._vendor.packaging.version import parse as parse_version from pip._internal.models.link import Link diff --git a/src/pip/_internal/models/direct_url.py b/src/pip/_internal/models/direct_url.py index 0af884bd8e3..349a3bfdacf 100644 --- a/src/pip/_internal/models/direct_url.py +++ b/src/pip/_internal/models/direct_url.py @@ -1,4 +1,6 @@ """ PEP 610 """ +from __future__ import annotations + import json import re import urllib.parse diff --git a/src/pip/_internal/models/format_control.py b/src/pip/_internal/models/format_control.py index ccd11272c03..f4006a67a71 100644 --- a/src/pip/_internal/models/format_control.py +++ b/src/pip/_internal/models/format_control.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import FrozenSet, Optional, Set from pip._vendor.packaging.utils import canonicalize_name diff --git a/src/pip/_internal/models/index.py b/src/pip/_internal/models/index.py index b94c32511f0..f77c6378046 100644 --- a/src/pip/_internal/models/index.py +++ b/src/pip/_internal/models/index.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import urllib.parse diff --git a/src/pip/_internal/models/installation_report.py b/src/pip/_internal/models/installation_report.py index b9c6330df32..d63c9fcf017 100644 --- a/src/pip/_internal/models/installation_report.py +++ b/src/pip/_internal/models/installation_report.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Any, Dict, Sequence from pip._vendor.packaging.markers import default_environment diff --git a/src/pip/_internal/models/link.py b/src/pip/_internal/models/link.py index 73041b864c3..f8964e516ce 100644 --- a/src/pip/_internal/models/link.py +++ b/src/pip/_internal/models/link.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import itertools import logging diff --git a/src/pip/_internal/models/scheme.py b/src/pip/_internal/models/scheme.py index f51190ac603..1832ce99f01 100644 --- a/src/pip/_internal/models/scheme.py +++ b/src/pip/_internal/models/scheme.py @@ -4,7 +4,7 @@ For a general overview of available schemes and their context, see https://docs.python.org/3/install/index.html#alternate-installation. """ - +from __future__ import annotations SCHEME_KEYS = ["platlib", "purelib", "headers", "scripts", "data"] diff --git a/src/pip/_internal/models/search_scope.py b/src/pip/_internal/models/search_scope.py index fe61e8116b7..f6178623de8 100644 --- a/src/pip/_internal/models/search_scope.py +++ b/src/pip/_internal/models/search_scope.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import itertools import logging import os diff --git a/src/pip/_internal/models/selection_prefs.py b/src/pip/_internal/models/selection_prefs.py index 977bc4caa75..74a1b469ee5 100644 --- a/src/pip/_internal/models/selection_prefs.py +++ b/src/pip/_internal/models/selection_prefs.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from pip._internal.models.format_control import FormatControl diff --git a/src/pip/_internal/models/target_python.py b/src/pip/_internal/models/target_python.py index 67ea5da73a5..4f729e97fa3 100644 --- a/src/pip/_internal/models/target_python.py +++ b/src/pip/_internal/models/target_python.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys from typing import List, Optional, Set, Tuple diff --git a/src/pip/_internal/models/wheel.py b/src/pip/_internal/models/wheel.py index a5dc12bdd63..e7bbae4166e 100644 --- a/src/pip/_internal/models/wheel.py +++ b/src/pip/_internal/models/wheel.py @@ -1,6 +1,8 @@ """Represents a wheel file and provides access to the various parts of the name that have meaning. """ +from __future__ import annotations + import re from typing import Dict, Iterable, List diff --git a/src/pip/_internal/network/auth.py b/src/pip/_internal/network/auth.py index 94a82fa6618..c4176e53396 100644 --- a/src/pip/_internal/network/auth.py +++ b/src/pip/_internal/network/auth.py @@ -3,6 +3,8 @@ Contains interface (MultiDomainBasicAuth) and associated glue code for providing credentials in the context of network requests. """ +from __future__ import annotations + import logging import os import shutil diff --git a/src/pip/_internal/network/cache.py b/src/pip/_internal/network/cache.py index 4d0fb545dc2..705eba2781a 100644 --- a/src/pip/_internal/network/cache.py +++ b/src/pip/_internal/network/cache.py @@ -1,5 +1,6 @@ """HTTP cache implementation. """ +from __future__ import annotations import os from contextlib import contextmanager diff --git a/src/pip/_internal/network/download.py b/src/pip/_internal/network/download.py index d1d43541e6b..c674eb3f6eb 100644 --- a/src/pip/_internal/network/download.py +++ b/src/pip/_internal/network/download.py @@ -1,5 +1,7 @@ """Download files with progress indicators. """ +from __future__ import annotations + import email.message import logging import mimetypes diff --git a/src/pip/_internal/network/lazy_wheel.py b/src/pip/_internal/network/lazy_wheel.py index 82ec50d5106..8d399012b20 100644 --- a/src/pip/_internal/network/lazy_wheel.py +++ b/src/pip/_internal/network/lazy_wheel.py @@ -1,4 +1,5 @@ """Lazy ZIP over HTTP""" +from __future__ import annotations __all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"] diff --git a/src/pip/_internal/network/session.py b/src/pip/_internal/network/session.py index 887dc14e796..eac2e5a1efb 100644 --- a/src/pip/_internal/network/session.py +++ b/src/pip/_internal/network/session.py @@ -1,6 +1,7 @@ """PipSession and supporting code, containing all pip-specific network request configuration and behavior. """ +from __future__ import annotations import email.utils import io diff --git a/src/pip/_internal/network/utils.py b/src/pip/_internal/network/utils.py index 134848ae526..0bb00f48328 100644 --- a/src/pip/_internal/network/utils.py +++ b/src/pip/_internal/network/utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Dict, Generator from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response diff --git a/src/pip/_internal/network/xmlrpc.py b/src/pip/_internal/network/xmlrpc.py index 22ec8d2f4a6..3646a2e4ac3 100644 --- a/src/pip/_internal/network/xmlrpc.py +++ b/src/pip/_internal/network/xmlrpc.py @@ -1,5 +1,6 @@ """xmlrpclib.Transport implementation """ +from __future__ import annotations import logging import urllib.parse diff --git a/src/pip/_internal/operations/check.py b/src/pip/_internal/operations/check.py index 1b7fd7ab7fd..38745527879 100644 --- a/src/pip/_internal/operations/check.py +++ b/src/pip/_internal/operations/check.py @@ -1,5 +1,6 @@ """Validation of dependencies of packages """ +from __future__ import annotations import logging from typing import Callable, Dict, List, NamedTuple, Optional, Set, Tuple diff --git a/src/pip/_internal/operations/freeze.py b/src/pip/_internal/operations/freeze.py index 35445684514..663d898de24 100644 --- a/src/pip/_internal/operations/freeze.py +++ b/src/pip/_internal/operations/freeze.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import collections import logging import os diff --git a/src/pip/_internal/operations/install/editable_legacy.py b/src/pip/_internal/operations/install/editable_legacy.py index bebe24e6d3a..80c182bd613 100644 --- a/src/pip/_internal/operations/install/editable_legacy.py +++ b/src/pip/_internal/operations/install/editable_legacy.py @@ -1,5 +1,7 @@ """Legacy editable installation process, i.e. `setup.py develop`. """ +from __future__ import annotations + import logging from typing import Optional, Sequence diff --git a/src/pip/_internal/operations/install/wheel.py b/src/pip/_internal/operations/install/wheel.py index f67180c9e65..5e35d19d911 100644 --- a/src/pip/_internal/operations/install/wheel.py +++ b/src/pip/_internal/operations/install/wheel.py @@ -1,5 +1,6 @@ """Support for installing and building the "wheel" binary package format. """ +from __future__ import annotations import collections import compileall diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 956717d1e52..e19b90637b2 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -3,6 +3,7 @@ # The following comment should be removed at some point in the future. # mypy: strict-optional=False +from __future__ import annotations import mimetypes import os diff --git a/src/pip/_internal/pyproject.py b/src/pip/_internal/pyproject.py index 8de36b873ed..b0a2c37613a 100644 --- a/src/pip/_internal/pyproject.py +++ b/src/pip/_internal/pyproject.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import importlib.util import os from collections import namedtuple diff --git a/src/pip/_internal/req/__init__.py b/src/pip/_internal/req/__init__.py index 16de903a44c..a0c7e41293e 100644 --- a/src/pip/_internal/req/__init__.py +++ b/src/pip/_internal/req/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import collections import logging from typing import Generator, List, Optional, Sequence, Tuple diff --git a/src/pip/_internal/req/constructors.py b/src/pip/_internal/req/constructors.py index 7e2d0e5b879..5afb3e19fcc 100644 --- a/src/pip/_internal/req/constructors.py +++ b/src/pip/_internal/req/constructors.py @@ -7,6 +7,7 @@ These are meant to be used elsewhere within pip to create instances of InstallRequirement. """ +from __future__ import annotations import copy import logging diff --git a/src/pip/_internal/req/req_file.py b/src/pip/_internal/req/req_file.py index f717c1ccc79..086d2d26667 100644 --- a/src/pip/_internal/req/req_file.py +++ b/src/pip/_internal/req/req_file.py @@ -1,6 +1,7 @@ """ Requirements file parsing """ +from __future__ import annotations import logging import optparse diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index b61a219df68..0affa3228f6 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import logging import os diff --git a/src/pip/_internal/req/req_set.py b/src/pip/_internal/req/req_set.py index 1bf73d595f6..8b0ce79f161 100644 --- a/src/pip/_internal/req/req_set.py +++ b/src/pip/_internal/req/req_set.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from collections import OrderedDict from typing import Dict, List diff --git a/src/pip/_internal/req/req_uninstall.py b/src/pip/_internal/req/req_uninstall.py index 707fde1b2b9..f5c2447e48d 100644 --- a/src/pip/_internal/req/req_uninstall.py +++ b/src/pip/_internal/req/req_uninstall.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import os import sys diff --git a/src/pip/_internal/resolution/base.py b/src/pip/_internal/resolution/base.py index 42dade18c1e..2ff082392d0 100644 --- a/src/pip/_internal/resolution/base.py +++ b/src/pip/_internal/resolution/base.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Callable, List, Optional from pip._internal.req.req_install import InstallRequirement diff --git a/src/pip/_internal/resolution/legacy/resolver.py b/src/pip/_internal/resolution/legacy/resolver.py index 5ddb848a9bc..d6c22f58c1a 100644 --- a/src/pip/_internal/resolution/legacy/resolver.py +++ b/src/pip/_internal/resolution/legacy/resolver.py @@ -12,6 +12,7 @@ # The following comment should be removed at some point in the future. # mypy: strict-optional=False +from __future__ import annotations import logging import sys diff --git a/src/pip/_internal/resolution/resolvelib/base.py b/src/pip/_internal/resolution/resolvelib/base.py index 9c0ef5ca7b9..cdc48794bf1 100644 --- a/src/pip/_internal/resolution/resolvelib/base.py +++ b/src/pip/_internal/resolution/resolvelib/base.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import FrozenSet, Iterable, Optional, Tuple, Union from pip._vendor.packaging.specifiers import SpecifierSet diff --git a/src/pip/_internal/resolution/resolvelib/candidates.py b/src/pip/_internal/resolution/resolvelib/candidates.py index 4125cda2b7c..1ff751e2563 100644 --- a/src/pip/_internal/resolution/resolvelib/candidates.py +++ b/src/pip/_internal/resolution/resolvelib/candidates.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import sys from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast diff --git a/src/pip/_internal/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py index 4adeb4309ce..cc90b5fd887 100644 --- a/src/pip/_internal/resolution/resolvelib/factory.py +++ b/src/pip/_internal/resolution/resolvelib/factory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import contextlib import functools import logging diff --git a/src/pip/_internal/resolution/resolvelib/found_candidates.py b/src/pip/_internal/resolution/resolvelib/found_candidates.py index 8663097b447..6cb2613d64e 100644 --- a/src/pip/_internal/resolution/resolvelib/found_candidates.py +++ b/src/pip/_internal/resolution/resolvelib/found_candidates.py @@ -7,6 +7,7 @@ absolutely need, and not "download the world" when we only need one version of something. """ +from __future__ import annotations import functools from collections.abc import Sequence diff --git a/src/pip/_internal/resolution/resolvelib/provider.py b/src/pip/_internal/resolution/resolvelib/provider.py index 315fb9c8902..fc8ae549096 100644 --- a/src/pip/_internal/resolution/resolvelib/provider.py +++ b/src/pip/_internal/resolution/resolvelib/provider.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import collections import math from typing import ( diff --git a/src/pip/_internal/resolution/resolvelib/reporter.py b/src/pip/_internal/resolution/resolvelib/reporter.py index 12adeff7b6e..d6ed739d39e 100644 --- a/src/pip/_internal/resolution/resolvelib/reporter.py +++ b/src/pip/_internal/resolution/resolvelib/reporter.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from collections import defaultdict from logging import getLogger from typing import Any, DefaultDict diff --git a/src/pip/_internal/resolution/resolvelib/requirements.py b/src/pip/_internal/resolution/resolvelib/requirements.py index 4af4a9f25a6..a0f3b6e3544 100644 --- a/src/pip/_internal/resolution/resolvelib/requirements.py +++ b/src/pip/_internal/resolution/resolvelib/requirements.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name diff --git a/src/pip/_internal/resolution/resolvelib/resolver.py b/src/pip/_internal/resolution/resolvelib/resolver.py index c12beef0b2a..e2dcff52bbe 100644 --- a/src/pip/_internal/resolution/resolvelib/resolver.py +++ b/src/pip/_internal/resolution/resolvelib/resolver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import contextlib import functools import logging diff --git a/src/pip/_internal/self_outdated_check.py b/src/pip/_internal/self_outdated_check.py index 0f64ae0e614..ff6be9cf3b8 100644 --- a/src/pip/_internal/self_outdated_check.py +++ b/src/pip/_internal/self_outdated_check.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import datetime import functools import hashlib diff --git a/src/pip/_internal/utils/_jaraco_text.py b/src/pip/_internal/utils/_jaraco_text.py index e06947c051a..ade92d19e7f 100644 --- a/src/pip/_internal/utils/_jaraco_text.py +++ b/src/pip/_internal/utils/_jaraco_text.py @@ -28,6 +28,7 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +from __future__ import annotations import functools import itertools diff --git a/src/pip/_internal/utils/_log.py b/src/pip/_internal/utils/_log.py index 92c4c6a1938..f8f17ea5135 100644 --- a/src/pip/_internal/utils/_log.py +++ b/src/pip/_internal/utils/_log.py @@ -4,6 +4,7 @@ init_logging() must be called before any other modules that call logging.getLogger. """ +from __future__ import annotations import logging from typing import Any, cast diff --git a/src/pip/_internal/utils/appdirs.py b/src/pip/_internal/utils/appdirs.py index 16933bf8afe..ed567fe35fc 100644 --- a/src/pip/_internal/utils/appdirs.py +++ b/src/pip/_internal/utils/appdirs.py @@ -5,6 +5,7 @@ The intention is to rewrite current usages gradually, keeping the tests pass, and eventually drop this after all usages are changed. """ +from __future__ import annotations import os import sys diff --git a/src/pip/_internal/utils/compat.py b/src/pip/_internal/utils/compat.py index 3f4d300cef0..322b0147cb1 100644 --- a/src/pip/_internal/utils/compat.py +++ b/src/pip/_internal/utils/compat.py @@ -1,5 +1,6 @@ """Stuff that differs in different Python versions and platform distributions.""" +from __future__ import annotations import logging import os diff --git a/src/pip/_internal/utils/compatibility_tags.py b/src/pip/_internal/utils/compatibility_tags.py index b6ed9a78e55..e623b66ec40 100644 --- a/src/pip/_internal/utils/compatibility_tags.py +++ b/src/pip/_internal/utils/compatibility_tags.py @@ -1,5 +1,6 @@ """Generate and work with PEP 425 Compatibility Tags. """ +from __future__ import annotations import re from typing import List, Optional, Tuple diff --git a/src/pip/_internal/utils/datetime.py b/src/pip/_internal/utils/datetime.py index 8668b3b0ec1..150c09341b8 100644 --- a/src/pip/_internal/utils/datetime.py +++ b/src/pip/_internal/utils/datetime.py @@ -1,5 +1,6 @@ """For when pip wants to check the date or time. """ +from __future__ import annotations import datetime diff --git a/src/pip/_internal/utils/deprecation.py b/src/pip/_internal/utils/deprecation.py index 72bd6f25a55..2f629e61c53 100644 --- a/src/pip/_internal/utils/deprecation.py +++ b/src/pip/_internal/utils/deprecation.py @@ -1,6 +1,7 @@ """ A module that implements tooling to enable easy warnings about deprecations. """ +from __future__ import annotations import logging import warnings diff --git a/src/pip/_internal/utils/direct_url_helpers.py b/src/pip/_internal/utils/direct_url_helpers.py index 0e8e5e1608b..bd31f223cc3 100644 --- a/src/pip/_internal/utils/direct_url_helpers.py +++ b/src/pip/_internal/utils/direct_url_helpers.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo diff --git a/src/pip/_internal/utils/egg_link.py b/src/pip/_internal/utils/egg_link.py index 4a384a63682..cbd55302667 100644 --- a/src/pip/_internal/utils/egg_link.py +++ b/src/pip/_internal/utils/egg_link.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import re import sys diff --git a/src/pip/_internal/utils/encoding.py b/src/pip/_internal/utils/encoding.py index 008f06a79bf..2b8b9ea5315 100644 --- a/src/pip/_internal/utils/encoding.py +++ b/src/pip/_internal/utils/encoding.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import codecs import locale import re diff --git a/src/pip/_internal/utils/entrypoints.py b/src/pip/_internal/utils/entrypoints.py index 15013693854..211605e8965 100644 --- a/src/pip/_internal/utils/entrypoints.py +++ b/src/pip/_internal/utils/entrypoints.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import itertools import os import shutil diff --git a/src/pip/_internal/utils/filesystem.py b/src/pip/_internal/utils/filesystem.py index 83c2df75b96..1bca84ec60d 100644 --- a/src/pip/_internal/utils/filesystem.py +++ b/src/pip/_internal/utils/filesystem.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import fnmatch import os import os.path diff --git a/src/pip/_internal/utils/filetypes.py b/src/pip/_internal/utils/filetypes.py index 5948570178f..f2ab69fc34f 100644 --- a/src/pip/_internal/utils/filetypes.py +++ b/src/pip/_internal/utils/filetypes.py @@ -1,5 +1,6 @@ """Filetype information. """ +from __future__ import annotations from typing import Tuple diff --git a/src/pip/_internal/utils/glibc.py b/src/pip/_internal/utils/glibc.py index 81342afa447..87af2a6b6d4 100644 --- a/src/pip/_internal/utils/glibc.py +++ b/src/pip/_internal/utils/glibc.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys from typing import Optional, Tuple diff --git a/src/pip/_internal/utils/hashes.py b/src/pip/_internal/utils/hashes.py index 843cffc6b3d..db46b3216ed 100644 --- a/src/pip/_internal/utils/hashes.py +++ b/src/pip/_internal/utils/hashes.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import hashlib from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional diff --git a/src/pip/_internal/utils/logging.py b/src/pip/_internal/utils/logging.py index 95982dfb691..7503438b580 100644 --- a/src/pip/_internal/utils/logging.py +++ b/src/pip/_internal/utils/logging.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import contextlib import errno import logging diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py index 1ad3f6162a2..f7fff449672 100644 --- a/src/pip/_internal/utils/misc.py +++ b/src/pip/_internal/utils/misc.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import contextlib import errno import getpass diff --git a/src/pip/_internal/utils/models.py b/src/pip/_internal/utils/models.py index b6bb21a8b26..07e7d0147fc 100644 --- a/src/pip/_internal/utils/models.py +++ b/src/pip/_internal/utils/models.py @@ -1,5 +1,6 @@ """Utilities for defining models """ +from __future__ import annotations import operator from typing import Any, Callable, Type diff --git a/src/pip/_internal/utils/packaging.py b/src/pip/_internal/utils/packaging.py index b9f6af4d174..bc44d4b55a6 100644 --- a/src/pip/_internal/utils/packaging.py +++ b/src/pip/_internal/utils/packaging.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import logging import re diff --git a/src/pip/_internal/utils/setuptools_build.py b/src/pip/_internal/utils/setuptools_build.py index 96d1b246067..03e6950b22f 100644 --- a/src/pip/_internal/utils/setuptools_build.py +++ b/src/pip/_internal/utils/setuptools_build.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys import textwrap from typing import List, Optional, Sequence diff --git a/src/pip/_internal/utils/subprocess.py b/src/pip/_internal/utils/subprocess.py index 79580b05320..e0ffaf419c1 100644 --- a/src/pip/_internal/utils/subprocess.py +++ b/src/pip/_internal/utils/subprocess.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import shlex diff --git a/src/pip/_internal/utils/temp_dir.py b/src/pip/_internal/utils/temp_dir.py index 4eec5f37f76..ce3aee3e1a1 100644 --- a/src/pip/_internal/utils/temp_dir.py +++ b/src/pip/_internal/utils/temp_dir.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import errno import itertools import logging diff --git a/src/pip/_internal/utils/unpacking.py b/src/pip/_internal/utils/unpacking.py index 78b5c13ced3..5883cb02702 100644 --- a/src/pip/_internal/utils/unpacking.py +++ b/src/pip/_internal/utils/unpacking.py @@ -1,5 +1,6 @@ """Utilities related archives. """ +from __future__ import annotations import logging import os diff --git a/src/pip/_internal/utils/urls.py b/src/pip/_internal/utils/urls.py index 6ba2e04f350..0c8734c1810 100644 --- a/src/pip/_internal/utils/urls.py +++ b/src/pip/_internal/utils/urls.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import string import urllib.parse diff --git a/src/pip/_internal/utils/virtualenv.py b/src/pip/_internal/utils/virtualenv.py index 882e36f5c1d..d51c9946bf5 100644 --- a/src/pip/_internal/utils/virtualenv.py +++ b/src/pip/_internal/utils/virtualenv.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import re diff --git a/src/pip/_internal/utils/wheel.py b/src/pip/_internal/utils/wheel.py index 3551f8f19bc..e3d3ae0587b 100644 --- a/src/pip/_internal/utils/wheel.py +++ b/src/pip/_internal/utils/wheel.py @@ -1,5 +1,6 @@ """Support functions for working with wheel files. """ +from __future__ import annotations import logging from email.message import Message diff --git a/src/pip/_internal/vcs/__init__.py b/src/pip/_internal/vcs/__init__.py index b6beddbe6d2..b67f500e99e 100644 --- a/src/pip/_internal/vcs/__init__.py +++ b/src/pip/_internal/vcs/__init__.py @@ -2,6 +2,8 @@ # the vcs package don't need to import deeper than `pip._internal.vcs`. # (The test directory may still need to import from a vcs sub-package.) # Import all vcs modules to register each VCS in the VcsSupport object. +from __future__ import annotations + import pip._internal.vcs.bazaar import pip._internal.vcs.git import pip._internal.vcs.mercurial diff --git a/src/pip/_internal/vcs/bazaar.py b/src/pip/_internal/vcs/bazaar.py index 20a17ed0927..b040ce3ccf1 100644 --- a/src/pip/_internal/vcs/bazaar.py +++ b/src/pip/_internal/vcs/bazaar.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from typing import List, Optional, Tuple diff --git a/src/pip/_internal/vcs/git.py b/src/pip/_internal/vcs/git.py index 8c242cf8956..04ae8296de3 100644 --- a/src/pip/_internal/vcs/git.py +++ b/src/pip/_internal/vcs/git.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os.path import pathlib diff --git a/src/pip/_internal/vcs/mercurial.py b/src/pip/_internal/vcs/mercurial.py index c183d41d09c..5a9421d522c 100644 --- a/src/pip/_internal/vcs/mercurial.py +++ b/src/pip/_internal/vcs/mercurial.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import configparser import logging import os diff --git a/src/pip/_internal/vcs/subversion.py b/src/pip/_internal/vcs/subversion.py index 16d93a67b7b..69eb56304c6 100644 --- a/src/pip/_internal/vcs/subversion.py +++ b/src/pip/_internal/vcs/subversion.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import re diff --git a/src/pip/_internal/vcs/versioncontrol.py b/src/pip/_internal/vcs/versioncontrol.py index 46ca2799b76..40184fe585d 100644 --- a/src/pip/_internal/vcs/versioncontrol.py +++ b/src/pip/_internal/vcs/versioncontrol.py @@ -1,4 +1,5 @@ """Handles all VCS (version control) support""" +from __future__ import annotations import logging import os diff --git a/src/pip/_internal/wheel_builder.py b/src/pip/_internal/wheel_builder.py index b1debe3496c..7db14e8fd38 100644 --- a/src/pip/_internal/wheel_builder.py +++ b/src/pip/_internal/wheel_builder.py @@ -1,5 +1,6 @@ """Orchestrator for building wheels from InstallRequirements. """ +from __future__ import annotations import logging import os.path diff --git a/tests/conftest.py b/tests/conftest.py index c5bf4bb9567..6dfa0646e7d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import compileall import contextlib import fnmatch diff --git a/tests/functional/test_bad_url.py b/tests/functional/test_bad_url.py index bc3a987e6f2..240257faf38 100644 --- a/tests/functional/test_bad_url.py +++ b/tests/functional/test_bad_url.py @@ -1,5 +1,6 @@ # test the error message returned by pip when # a bad "file:" URL is passed to it. +from __future__ import annotations from typing import Any diff --git a/tests/functional/test_broken_stdout.py b/tests/functional/test_broken_stdout.py index ae0fdc1ba84..7e130e50bcd 100644 --- a/tests/functional/test_broken_stdout.py +++ b/tests/functional/test_broken_stdout.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import subprocess from pathlib import Path diff --git a/tests/functional/test_build_env.py b/tests/functional/test_build_env.py index 20cd181be07..556a9f756c9 100644 --- a/tests/functional/test_build_env.py +++ b/tests/functional/test_build_env.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys from textwrap import dedent diff --git a/tests/functional/test_cache.py b/tests/functional/test_cache.py index a744dbbb9bc..521ee412888 100644 --- a/tests/functional/test_cache.py +++ b/tests/functional/test_cache.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import shutil from glob import glob diff --git a/tests/functional/test_check.py b/tests/functional/test_check.py index 79b6df39c19..2d03c7e32f9 100644 --- a/tests/functional/test_check.py +++ b/tests/functional/test_check.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Collection from tests.lib import PipTestEnvironment, create_test_package_with_setup diff --git a/tests/functional/test_cli.py b/tests/functional/test_cli.py index 3c3f45d51d1..eb5d7b3435a 100644 --- a/tests/functional/test_cli.py +++ b/tests/functional/test_cli.py @@ -1,5 +1,7 @@ """Basic CLI functionality checks. """ +from __future__ import annotations + from textwrap import dedent import pytest diff --git a/tests/functional/test_completion.py b/tests/functional/test_completion.py index 4be033583ca..d18119dbf2a 100644 --- a/tests/functional/test_completion.py +++ b/tests/functional/test_completion.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys from pathlib import Path diff --git a/tests/functional/test_config_settings.py b/tests/functional/test_config_settings.py index f3975de2af5..201d89c9a1e 100644 --- a/tests/functional/test_config_settings.py +++ b/tests/functional/test_config_settings.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import tarfile from pathlib import Path diff --git a/tests/functional/test_configuration.py b/tests/functional/test_configuration.py index b3de3f697b0..f22a9f55c6a 100644 --- a/tests/functional/test_configuration.py +++ b/tests/functional/test_configuration.py @@ -1,5 +1,7 @@ """Tests for the config command """ +from __future__ import annotations + import re import textwrap diff --git a/tests/functional/test_debug.py b/tests/functional/test_debug.py index 77d4bea335f..d53ba9d14a4 100644 --- a/tests/functional/test_debug.py +++ b/tests/functional/test_debug.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re from typing import List diff --git a/tests/functional/test_download.py b/tests/functional/test_download.py index 555a1163f42..f55ca60bd7d 100644 --- a/tests/functional/test_download.py +++ b/tests/functional/test_download.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import http.server import os import re diff --git a/tests/functional/test_fast_deps.py b/tests/functional/test_fast_deps.py index 9e529c0891e..0a934f26263 100644 --- a/tests/functional/test_fast_deps.py +++ b/tests/functional/test_fast_deps.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import fnmatch import json import os diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py index b7af974ea61..d05206d7c43 100644 --- a/tests/functional/test_freeze.py +++ b/tests/functional/test_freeze.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import re import sys diff --git a/tests/functional/test_hash.py b/tests/functional/test_hash.py index 0422f73ffa5..928e9badd19 100644 --- a/tests/functional/test_hash.py +++ b/tests/functional/test_hash.py @@ -1,4 +1,6 @@ """Tests for the ``pip hash`` command""" +from __future__ import annotations + from pathlib import Path from tests.lib import PipTestEnvironment diff --git a/tests/functional/test_help.py b/tests/functional/test_help.py index 75414214a93..88a029f19b2 100644 --- a/tests/functional/test_help.py +++ b/tests/functional/test_help.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from unittest.mock import Mock import pytest diff --git a/tests/functional/test_index.py b/tests/functional/test_index.py index 43b8f09c311..f4ad7cfd8d7 100644 --- a/tests/functional/test_index.py +++ b/tests/functional/test_index.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from pip._internal.cli.status_codes import ERROR, SUCCESS diff --git a/tests/functional/test_inspect.py b/tests/functional/test_inspect.py index f6690fb1fb1..a0c2c2f949f 100644 --- a/tests/functional/test_inspect.py +++ b/tests/functional/test_inspect.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import pytest diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py index 3411f66d801..0432f021144 100644 --- a/tests/functional/test_install.py +++ b/tests/functional/test_install.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import hashlib import os import re diff --git a/tests/functional/test_install_check.py b/tests/functional/test_install_check.py index 8a8a7c93a80..e9f2d94650e 100644 --- a/tests/functional/test_install_check.py +++ b/tests/functional/test_install_check.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Iterable from tests.lib import PipTestEnvironment, create_test_package_with_setup diff --git a/tests/functional/test_install_cleanup.py b/tests/functional/test_install_cleanup.py index bc34defc978..414a86b4278 100644 --- a/tests/functional/test_install_cleanup.py +++ b/tests/functional/test_install_cleanup.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from os.path import exists import pytest diff --git a/tests/functional/test_install_compat.py b/tests/functional/test_install_compat.py index 6c809e75307..7dbf142bebe 100644 --- a/tests/functional/test_install_compat.py +++ b/tests/functional/test_install_compat.py @@ -2,6 +2,8 @@ Tests for compatibility workarounds. """ +from __future__ import annotations + import os from pathlib import Path diff --git a/tests/functional/test_install_config.py b/tests/functional/test_install_config.py index 7f418067f97..10a85eb1703 100644 --- a/tests/functional/test_install_config.py +++ b/tests/functional/test_install_config.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import ssl import sys diff --git a/tests/functional/test_install_direct_url.py b/tests/functional/test_install_direct_url.py index 139ef178e77..9939f24866b 100644 --- a/tests/functional/test_install_direct_url.py +++ b/tests/functional/test_install_direct_url.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from pip._internal.models.direct_url import VcsInfo diff --git a/tests/functional/test_install_extras.py b/tests/functional/test_install_extras.py index 1dd67be0a0c..64f84a449f3 100644 --- a/tests/functional/test_install_extras.py +++ b/tests/functional/test_install_extras.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re import textwrap from os.path import join diff --git a/tests/functional/test_install_force_reinstall.py b/tests/functional/test_install_force_reinstall.py index 9c49d58c4b7..5a9d53c62c7 100644 --- a/tests/functional/test_install_force_reinstall.py +++ b/tests/functional/test_install_force_reinstall.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from tests.lib import PipTestEnvironment, assert_all_changes diff --git a/tests/functional/test_install_index.py b/tests/functional/test_install_index.py index 72b0b9db7bd..43e4ec55582 100644 --- a/tests/functional/test_install_index.py +++ b/tests/functional/test_install_index.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import shutil import textwrap diff --git a/tests/functional/test_install_report.py b/tests/functional/test_install_report.py index a1e7f8375d9..d36927367c0 100644 --- a/tests/functional/test_install_report.py +++ b/tests/functional/test_install_report.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import textwrap from pathlib import Path diff --git a/tests/functional/test_install_reqs.py b/tests/functional/test_install_reqs.py index 993f25a2abf..11c480a36db 100644 --- a/tests/functional/test_install_reqs.py +++ b/tests/functional/test_install_reqs.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import os import textwrap diff --git a/tests/functional/test_install_requested.py b/tests/functional/test_install_requested.py index 2c5cad9fcc8..760ce7a77ee 100644 --- a/tests/functional/test_install_requested.py +++ b/tests/functional/test_install_requested.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from tests.lib import PipTestEnvironment, TestData, TestPipResult diff --git a/tests/functional/test_install_upgrade.py b/tests/functional/test_install_upgrade.py index 6556fcdf599..e07a209d744 100644 --- a/tests/functional/test_install_upgrade.py +++ b/tests/functional/test_install_upgrade.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import itertools import os import sys diff --git a/tests/functional/test_install_user.py b/tests/functional/test_install_user.py index 3cae4a467e9..f9302245d16 100644 --- a/tests/functional/test_install_user.py +++ b/tests/functional/test_install_user.py @@ -1,6 +1,8 @@ """ tests specific to "pip install --user" """ +from __future__ import annotations + import os import textwrap from os.path import curdir, isdir, isfile diff --git a/tests/functional/test_install_vcs_git.py b/tests/functional/test_install_vcs_git.py index e59b269a61f..01309ea6022 100644 --- a/tests/functional/test_install_vcs_git.py +++ b/tests/functional/test_install_vcs_git.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pathlib import Path from typing import Optional diff --git a/tests/functional/test_install_wheel.py b/tests/functional/test_install_wheel.py index 7e7aeaf7a81..a2b3dfb2590 100644 --- a/tests/functional/test_install_wheel.py +++ b/tests/functional/test_install_wheel.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import base64 import csv import hashlib diff --git a/tests/functional/test_list.py b/tests/functional/test_list.py index 5164c1d5c39..85111d3fec1 100644 --- a/tests/functional/test_list.py +++ b/tests/functional/test_list.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import os from pathlib import Path diff --git a/tests/functional/test_new_resolver.py b/tests/functional/test_new_resolver.py index afe07cbf3ec..a08300a288c 100644 --- a/tests/functional/test_new_resolver.py +++ b/tests/functional/test_new_resolver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pathlib import sys diff --git a/tests/functional/test_new_resolver_errors.py b/tests/functional/test_new_resolver_errors.py index 5976de52e39..8c22fdc5c23 100644 --- a/tests/functional/test_new_resolver_errors.py +++ b/tests/functional/test_new_resolver_errors.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pathlib import sys diff --git a/tests/functional/test_new_resolver_hashes.py b/tests/functional/test_new_resolver_hashes.py index d26def14ae9..52913e5f0c8 100644 --- a/tests/functional/test_new_resolver_hashes.py +++ b/tests/functional/test_new_resolver_hashes.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import collections import hashlib diff --git a/tests/functional/test_new_resolver_target.py b/tests/functional/test_new_resolver_target.py index a81cfe5e83d..80656f065e8 100644 --- a/tests/functional/test_new_resolver_target.py +++ b/tests/functional/test_new_resolver_target.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pathlib import Path from typing import Callable, Optional diff --git a/tests/functional/test_new_resolver_user.py b/tests/functional/test_new_resolver_user.py index 4cd06311348..1df6fa62981 100644 --- a/tests/functional/test_new_resolver_user.py +++ b/tests/functional/test_new_resolver_user.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import textwrap diff --git a/tests/functional/test_no_color.py b/tests/functional/test_no_color.py index 4094bdd167a..4b7b982b300 100644 --- a/tests/functional/test_no_color.py +++ b/tests/functional/test_no_color.py @@ -1,6 +1,8 @@ """ Test specific for the --no-color option """ +from __future__ import annotations + import os import shutil import subprocess diff --git a/tests/functional/test_pep517.py b/tests/functional/test_pep517.py index 78a6c2bbc6c..17b529abfe3 100644 --- a/tests/functional/test_pep517.py +++ b/tests/functional/test_pep517.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path from typing import Any, Dict, List, Optional, Tuple diff --git a/tests/functional/test_pep660.py b/tests/functional/test_pep660.py index 8418b26894c..bf6fedaf541 100644 --- a/tests/functional/test_pep660.py +++ b/tests/functional/test_pep660.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path from typing import Any, Dict diff --git a/tests/functional/test_pep668.py b/tests/functional/test_pep668.py index 3c1085668fc..90ea79629db 100644 --- a/tests/functional/test_pep668.py +++ b/tests/functional/test_pep668.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import pathlib import textwrap diff --git a/tests/functional/test_pip_runner_script.py b/tests/functional/test_pip_runner_script.py index f2f879b824d..548a50a7082 100644 --- a/tests/functional/test_pip_runner_script.py +++ b/tests/functional/test_pip_runner_script.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path diff --git a/tests/functional/test_python_option.py b/tests/functional/test_python_option.py index ecfd819eb7c..1cb16674b8a 100644 --- a/tests/functional/test_python_option.py +++ b/tests/functional/test_python_option.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import os from pathlib import Path diff --git a/tests/functional/test_search.py b/tests/functional/test_search.py index 3f784e5dd1c..9445be882ae 100644 --- a/tests/functional/test_search.py +++ b/tests/functional/test_search.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from typing import TYPE_CHECKING, Dict, List from unittest import mock diff --git a/tests/functional/test_show.py b/tests/functional/test_show.py index 05fccbbe327..f5678c2a2cd 100644 --- a/tests/functional/test_show.py +++ b/tests/functional/test_show.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pathlib import re diff --git a/tests/functional/test_truststore.py b/tests/functional/test_truststore.py index cc90343b52d..a88a69deddc 100644 --- a/tests/functional/test_truststore.py +++ b/tests/functional/test_truststore.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys from typing import Any, Callable diff --git a/tests/functional/test_uninstall.py b/tests/functional/test_uninstall.py index 69e340a5675..378864e1cd9 100644 --- a/tests/functional/test_uninstall.py +++ b/tests/functional/test_uninstall.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import sys diff --git a/tests/functional/test_uninstall_user.py b/tests/functional/test_uninstall_user.py index 0bf2e6d4180..da2cef1b3fd 100644 --- a/tests/functional/test_uninstall_user.py +++ b/tests/functional/test_uninstall_user.py @@ -1,6 +1,8 @@ """ tests specific to uninstalling --user installs """ +from __future__ import annotations + from os.path import isdir, isfile, normcase import pytest diff --git a/tests/functional/test_vcs_bazaar.py b/tests/functional/test_vcs_bazaar.py index 63955d6e701..dcb253c4c74 100644 --- a/tests/functional/test_vcs_bazaar.py +++ b/tests/functional/test_vcs_bazaar.py @@ -1,6 +1,7 @@ """ Contains functional tests of the Bazaar class. """ +from __future__ import annotations import os import sys diff --git a/tests/functional/test_vcs_git.py b/tests/functional/test_vcs_git.py index da4d9583f0f..27c693dc2cd 100644 --- a/tests/functional/test_vcs_git.py +++ b/tests/functional/test_vcs_git.py @@ -1,6 +1,8 @@ """ Contains functional tests of the Git class. """ +from __future__ import annotations + import logging import os import pathlib diff --git a/tests/functional/test_vcs_mercurial.py b/tests/functional/test_vcs_mercurial.py index 9a909e71f24..72906670bad 100644 --- a/tests/functional/test_vcs_mercurial.py +++ b/tests/functional/test_vcs_mercurial.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pip._internal.vcs.mercurial import Mercurial diff --git a/tests/functional/test_vcs_subversion.py b/tests/functional/test_vcs_subversion.py index 05c20c7c145..1cb07a586af 100644 --- a/tests/functional/test_vcs_subversion.py +++ b/tests/functional/test_vcs_subversion.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pathlib import Path import pytest diff --git a/tests/functional/test_warning.py b/tests/functional/test_warning.py index c47443ca903..fccde022ab6 100644 --- a/tests/functional/test_warning.py +++ b/tests/functional/test_warning.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys import textwrap diff --git a/tests/functional/test_wheel.py b/tests/functional/test_wheel.py index b1183fc830b..e2ef0e17256 100644 --- a/tests/functional/test_wheel.py +++ b/tests/functional/test_wheel.py @@ -1,4 +1,6 @@ """'pip wheel' tests""" +from __future__ import annotations + import os import re import sys diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py index ea755c83812..de48a3fb4bc 100644 --- a/tests/lib/__init__.py +++ b/tests/lib/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import os import pathlib diff --git a/tests/lib/certs.py b/tests/lib/certs.py index 9e6542d2d57..96c5f9ae5d3 100644 --- a/tests/lib/certs.py +++ b/tests/lib/certs.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from datetime import datetime, timedelta, timezone from typing import Tuple diff --git a/tests/lib/compat.py b/tests/lib/compat.py index 866ac7a7734..da4fad5e976 100644 --- a/tests/lib/compat.py +++ b/tests/lib/compat.py @@ -1,4 +1,5 @@ # mypy: no-warn-unused-ignores +from __future__ import annotations import contextlib import signal diff --git a/tests/lib/configuration_helpers.py b/tests/lib/configuration_helpers.py index b6e398c5bf1..dc5d8ba8e5b 100644 --- a/tests/lib/configuration_helpers.py +++ b/tests/lib/configuration_helpers.py @@ -1,5 +1,6 @@ """Helpers for tests that check configuration """ +from __future__ import annotations import contextlib import functools diff --git a/tests/lib/direct_url.py b/tests/lib/direct_url.py index e0dac032062..025d2f43a5e 100644 --- a/tests/lib/direct_url.py +++ b/tests/lib/direct_url.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import re from pathlib import Path diff --git a/tests/lib/filesystem.py b/tests/lib/filesystem.py index 5f8fe519d5d..60a5e30af3e 100644 --- a/tests/lib/filesystem.py +++ b/tests/lib/filesystem.py @@ -1,5 +1,7 @@ """Helpers for filesystem-dependent tests. """ +from __future__ import annotations + import os from functools import partial from itertools import chain diff --git a/tests/lib/git_submodule_helpers.py b/tests/lib/git_submodule_helpers.py index 12b40c60768..b279642145f 100644 --- a/tests/lib/git_submodule_helpers.py +++ b/tests/lib/git_submodule_helpers.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import textwrap from pathlib import Path diff --git a/tests/lib/index.py b/tests/lib/index.py index 17282bc562f..fbba7b5c3f2 100644 --- a/tests/lib/index.py +++ b/tests/lib/index.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional from pip._internal.models.candidate import InstallationCandidate diff --git a/tests/lib/local_repos.py b/tests/lib/local_repos.py index a8cf4aa6c74..32c5d6ac7ed 100644 --- a/tests/lib/local_repos.py +++ b/tests/lib/local_repos.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import subprocess import urllib.request diff --git a/tests/lib/options_helpers.py b/tests/lib/options_helpers.py index 4444fa3e97b..cd73ad83a7f 100644 --- a/tests/lib/options_helpers.py +++ b/tests/lib/options_helpers.py @@ -1,5 +1,6 @@ """Provides helper classes for testing option handling in pip """ +from __future__ import annotations from optparse import Values from typing import List, Tuple diff --git a/tests/lib/requests_mocks.py b/tests/lib/requests_mocks.py index a70a9b2b048..e777fd2214d 100644 --- a/tests/lib/requests_mocks.py +++ b/tests/lib/requests_mocks.py @@ -1,5 +1,6 @@ """Helper classes as mocks for requests objects. """ +from __future__ import annotations from io import BytesIO from typing import Any, Callable, Dict, Iterator, List, Optional diff --git a/tests/lib/server.py b/tests/lib/server.py index 96ac5930dc9..b95ad6d40ff 100644 --- a/tests/lib/server.py +++ b/tests/lib/server.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pathlib import ssl import threading diff --git a/tests/lib/test_lib.py b/tests/lib/test_lib.py index c01c1beb883..91a0de00544 100644 --- a/tests/lib/test_lib.py +++ b/tests/lib/test_lib.py @@ -1,4 +1,6 @@ """Test the test support.""" +from __future__ import annotations + import filecmp import pathlib import re diff --git a/tests/lib/test_wheel.py b/tests/lib/test_wheel.py index ffe96cc4335..5de79eac118 100644 --- a/tests/lib/test_wheel.py +++ b/tests/lib/test_wheel.py @@ -1,5 +1,7 @@ """Tests for wheel helper. """ +from __future__ import annotations + import csv from email import message_from_string from email.message import Message diff --git a/tests/lib/venv.py b/tests/lib/venv.py index 12aa739db23..a0b88e1a0ce 100644 --- a/tests/lib/venv.py +++ b/tests/lib/venv.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import compileall import os import shutil diff --git a/tests/lib/wheel.py b/tests/lib/wheel.py index a4efe53b404..574cfd28043 100644 --- a/tests/lib/wheel.py +++ b/tests/lib/wheel.py @@ -1,5 +1,7 @@ """Helper for building wheels as would be in test cases. """ +from __future__ import annotations + import csv import itertools from base64 import urlsafe_b64encode diff --git a/tests/unit/metadata/test_metadata.py b/tests/unit/metadata/test_metadata.py index ccc8ceb2e75..f29113ca014 100644 --- a/tests/unit/metadata/test_metadata.py +++ b/tests/unit/metadata/test_metadata.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os from pathlib import Path diff --git a/tests/unit/metadata/test_metadata_pkg_resources.py b/tests/unit/metadata/test_metadata_pkg_resources.py index ab1a56107f4..ba85eca521e 100644 --- a/tests/unit/metadata/test_metadata_pkg_resources.py +++ b/tests/unit/metadata/test_metadata_pkg_resources.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import email.message import itertools from typing import List, cast diff --git a/tests/unit/resolution_resolvelib/conftest.py b/tests/unit/resolution_resolvelib/conftest.py index a4ee32444e2..bdf7df84133 100644 --- a/tests/unit/resolution_resolvelib/conftest.py +++ b/tests/unit/resolution_resolvelib/conftest.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Iterator import pytest diff --git a/tests/unit/resolution_resolvelib/test_provider.py b/tests/unit/resolution_resolvelib/test_provider.py index ab1dc74caa3..e8e14ab82e4 100644 --- a/tests/unit/resolution_resolvelib/test_provider.py +++ b/tests/unit/resolution_resolvelib/test_provider.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import TYPE_CHECKING, List, Optional from pip._vendor.resolvelib.resolvers import RequirementInformation diff --git a/tests/unit/resolution_resolvelib/test_requirement.py b/tests/unit/resolution_resolvelib/test_requirement.py index b8cd13cb566..1a2a732cf26 100644 --- a/tests/unit/resolution_resolvelib/test_requirement.py +++ b/tests/unit/resolution_resolvelib/test_requirement.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path from typing import Iterator, List, Tuple diff --git a/tests/unit/resolution_resolvelib/test_resolver.py b/tests/unit/resolution_resolvelib/test_resolver.py index 87c2b5f3533..8364990d530 100644 --- a/tests/unit/resolution_resolvelib/test_resolver.py +++ b/tests/unit/resolution_resolvelib/test_resolver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Dict, List, Optional, Set, Tuple, cast from unittest import mock diff --git a/tests/unit/test_appdirs.py b/tests/unit/test_appdirs.py index fd3ea143bcb..e83a3b7e6e8 100644 --- a/tests/unit/test_appdirs.py +++ b/tests/unit/test_appdirs.py @@ -1,4 +1,5 @@ # mypy: no-warn-unused-ignores +from __future__ import annotations import os import sys diff --git a/tests/unit/test_base_command.py b/tests/unit/test_base_command.py index 44dae384a75..340705c6b7f 100644 --- a/tests/unit/test_base_command.py +++ b/tests/unit/test_base_command.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import time diff --git a/tests/unit/test_cache.py b/tests/unit/test_cache.py index d0fee69c39b..1e21cb7c7be 100644 --- a/tests/unit/test_cache.py +++ b/tests/unit/test_cache.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path diff --git a/tests/unit/test_cmdoptions.py b/tests/unit/test_cmdoptions.py index 8c33ca8c18d..fa7fff73745 100644 --- a/tests/unit/test_cmdoptions.py +++ b/tests/unit/test_cmdoptions.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path from typing import Optional, Tuple diff --git a/tests/unit/test_collector.py b/tests/unit/test_collector.py index dae083efee1..589d8eb326a 100644 --- a/tests/unit/test_collector.py +++ b/tests/unit/test_collector.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import itertools import json import logging diff --git a/tests/unit/test_command_install.py b/tests/unit/test_command_install.py index 5e7889fe16b..c92eff42872 100644 --- a/tests/unit/test_command_install.py +++ b/tests/unit/test_command_install.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import errno from unittest import mock diff --git a/tests/unit/test_commands.py b/tests/unit/test_commands.py index 7a5c4e8319d..da01feee626 100644 --- a/tests/unit/test_commands.py +++ b/tests/unit/test_commands.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Callable, List from unittest import mock diff --git a/tests/unit/test_compat.py b/tests/unit/test_compat.py index b7f46ca9000..94c8657aa7b 100644 --- a/tests/unit/test_compat.py +++ b/tests/unit/test_compat.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path diff --git a/tests/unit/test_configuration.py b/tests/unit/test_configuration.py index 1a0acb7b411..bee5a953b00 100644 --- a/tests/unit/test_configuration.py +++ b/tests/unit/test_configuration.py @@ -1,5 +1,6 @@ """Tests for all things related to the configuration """ +from __future__ import annotations import re from unittest.mock import MagicMock diff --git a/tests/unit/test_direct_url.py b/tests/unit/test_direct_url.py index 151e0a30f5b..06b4b6e4956 100644 --- a/tests/unit/test_direct_url.py +++ b/tests/unit/test_direct_url.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from pip._internal.models.direct_url import ( diff --git a/tests/unit/test_direct_url_helpers.py b/tests/unit/test_direct_url_helpers.py index 692ee299c02..36c8a4ba5d4 100644 --- a/tests/unit/test_direct_url_helpers.py +++ b/tests/unit/test_direct_url_helpers.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from functools import partial from pathlib import Path diff --git a/tests/unit/test_exceptions.py b/tests/unit/test_exceptions.py index 6510b569e5f..36be7bcab5e 100644 --- a/tests/unit/test_exceptions.py +++ b/tests/unit/test_exceptions.py @@ -1,4 +1,5 @@ """Tests the presentation style of exceptions.""" +from __future__ import annotations import io import locale diff --git a/tests/unit/test_finder.py b/tests/unit/test_finder.py index 3404d1498e3..3630b462826 100644 --- a/tests/unit/test_finder.py +++ b/tests/unit/test_finder.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from typing import Iterable from unittest.mock import Mock, patch diff --git a/tests/unit/test_format_control.py b/tests/unit/test_format_control.py index 33a03729db5..a85d00b0013 100644 --- a/tests/unit/test_format_control.py +++ b/tests/unit/test_format_control.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from optparse import Values from typing import FrozenSet, List, Set diff --git a/tests/unit/test_index.py b/tests/unit/test_index.py index 78837b94e8b..4d29a7a7f06 100644 --- a/tests/unit/test_index.py +++ b/tests/unit/test_index.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging from typing import FrozenSet, List, Optional, Set, Tuple diff --git a/tests/unit/test_link.py b/tests/unit/test_link.py index a379d877b2c..ddf1e186115 100644 --- a/tests/unit/test_link.py +++ b/tests/unit/test_link.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional import pytest diff --git a/tests/unit/test_locations.py b/tests/unit/test_locations.py index bd233b22aab..15fe1724dbf 100644 --- a/tests/unit/test_locations.py +++ b/tests/unit/test_locations.py @@ -2,6 +2,8 @@ locations.py tests """ +from __future__ import annotations + import getpass import os import shutil diff --git a/tests/unit/test_logging.py b/tests/unit/test_logging.py index 9d507d74277..71b1650918a 100644 --- a/tests/unit/test_logging.py +++ b/tests/unit/test_logging.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import time from threading import Thread diff --git a/tests/unit/test_models.py b/tests/unit/test_models.py index c5545e37d01..d313bd5f7a8 100644 --- a/tests/unit/test_models.py +++ b/tests/unit/test_models.py @@ -1,5 +1,6 @@ """Tests for various classes in pip._internal.models """ +from __future__ import annotations from pip._vendor.packaging.version import parse as parse_version diff --git a/tests/unit/test_models_wheel.py b/tests/unit/test_models_wheel.py index c06525e089e..deb65855fae 100644 --- a/tests/unit/test_models_wheel.py +++ b/tests/unit/test_models_wheel.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from pip._vendor.packaging.tags import Tag diff --git a/tests/unit/test_network_auth.py b/tests/unit/test_network_auth.py index 5c12d870156..e22102ad5e8 100644 --- a/tests/unit/test_network_auth.py +++ b/tests/unit/test_network_auth.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import os import subprocess diff --git a/tests/unit/test_network_cache.py b/tests/unit/test_network_cache.py index 6a816b30090..7310b5f2613 100644 --- a/tests/unit/test_network_cache.py +++ b/tests/unit/test_network_cache.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path from typing import Iterator diff --git a/tests/unit/test_network_download.py b/tests/unit/test_network_download.py index 53200f2e511..010631dce2e 100644 --- a/tests/unit/test_network_download.py +++ b/tests/unit/test_network_download.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import sys from typing import Dict diff --git a/tests/unit/test_network_lazy_wheel.py b/tests/unit/test_network_lazy_wheel.py index 79e86321793..6ece2243ab1 100644 --- a/tests/unit/test_network_lazy_wheel.py +++ b/tests/unit/test_network_lazy_wheel.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Iterator from pip._vendor.packaging.version import Version diff --git a/tests/unit/test_network_session.py b/tests/unit/test_network_session.py index 2bb9317b762..78421c5ad10 100644 --- a/tests/unit/test_network_session.py +++ b/tests/unit/test_network_session.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os from pathlib import Path diff --git a/tests/unit/test_network_utils.py b/tests/unit/test_network_utils.py index 380d5741ff6..cd068289c52 100644 --- a/tests/unit/test_network_utils.py +++ b/tests/unit/test_network_utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from pip._internal.exceptions import NetworkConnectionError diff --git a/tests/unit/test_operations_prepare.py b/tests/unit/test_operations_prepare.py index d06733e8503..300a0364d1a 100644 --- a/tests/unit/test_operations_prepare.py +++ b/tests/unit/test_operations_prepare.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import shutil from pathlib import Path diff --git a/tests/unit/test_options.py b/tests/unit/test_options.py index 22ff7f721d7..69e55ccea67 100644 --- a/tests/unit/test_options.py +++ b/tests/unit/test_options.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from contextlib import contextmanager from optparse import Values diff --git a/tests/unit/test_packaging.py b/tests/unit/test_packaging.py index 88277448c2c..6b1b53c1eaa 100644 --- a/tests/unit/test_packaging.py +++ b/tests/unit/test_packaging.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Optional, Tuple import pytest diff --git a/tests/unit/test_pep517.py b/tests/unit/test_pep517.py index 5eefbf4e77c..706c29ea987 100644 --- a/tests/unit/test_pep517.py +++ b/tests/unit/test_pep517.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path from textwrap import dedent diff --git a/tests/unit/test_pyproject_config.py b/tests/unit/test_pyproject_config.py index c7e46956055..a77f1a1279f 100644 --- a/tests/unit/test_pyproject_config.py +++ b/tests/unit/test_pyproject_config.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Dict, List import pytest diff --git a/tests/unit/test_req.py b/tests/unit/test_req.py index 5e3c640a55e..409fd3210d3 100644 --- a/tests/unit/test_req.py +++ b/tests/unit/test_req.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import contextlib import email.message import os diff --git a/tests/unit/test_req_file.py b/tests/unit/test_req_file.py index 94ccfb98d86..eb438db1902 100644 --- a/tests/unit/test_req_file.py +++ b/tests/unit/test_req_file.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import collections import logging import os diff --git a/tests/unit/test_req_install.py b/tests/unit/test_req_install.py index 4bb71a743aa..05fdf4976f1 100644 --- a/tests/unit/test_req_install.py +++ b/tests/unit/test_req_install.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import tempfile from pathlib import Path diff --git a/tests/unit/test_req_uninstall.py b/tests/unit/test_req_uninstall.py index 6a846e20272..1e44092b9de 100644 --- a/tests/unit/test_req_uninstall.py +++ b/tests/unit/test_req_uninstall.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys from pathlib import Path diff --git a/tests/unit/test_resolution_legacy_resolver.py b/tests/unit/test_resolution_legacy_resolver.py index b2f93b3d4f5..96f93e4c27c 100644 --- a/tests/unit/test_resolution_legacy_resolver.py +++ b/tests/unit/test_resolution_legacy_resolver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import email.message import logging import os diff --git a/tests/unit/test_search_scope.py b/tests/unit/test_search_scope.py index d8128341659..38781e19079 100644 --- a/tests/unit/test_search_scope.py +++ b/tests/unit/test_search_scope.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pip._internal.models.search_scope import SearchScope from pip._internal.req.constructors import install_req_from_line diff --git a/tests/unit/test_self_check_outdated.py b/tests/unit/test_self_check_outdated.py index 6b6fcea55a9..bc77aa0c41f 100644 --- a/tests/unit/test_self_check_outdated.py +++ b/tests/unit/test_self_check_outdated.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import datetime import json import logging diff --git a/tests/unit/test_target_python.py b/tests/unit/test_target_python.py index 31df5935ee3..f4c6a1a5827 100644 --- a/tests/unit/test_target_python.py +++ b/tests/unit/test_target_python.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Any, Dict, Optional, Tuple from unittest import mock diff --git a/tests/unit/test_urls.py b/tests/unit/test_urls.py index 56ee80aa802..7aff4480931 100644 --- a/tests/unit/test_urls.py +++ b/tests/unit/test_urls.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import sys import urllib.request diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 1352b766481..144384b3f71 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -2,6 +2,8 @@ util tests """ +from __future__ import annotations + import codecs import os import shutil diff --git a/tests/unit/test_utils_compatibility_tags.py b/tests/unit/test_utils_compatibility_tags.py index f09c451b8ee..bcabbcf3d5d 100644 --- a/tests/unit/test_utils_compatibility_tags.py +++ b/tests/unit/test_utils_compatibility_tags.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sysconfig from typing import Any, Callable, Dict, List, Tuple from unittest.mock import patch diff --git a/tests/unit/test_utils_filesystem.py b/tests/unit/test_utils_filesystem.py index 7e3ecc2e0b1..6eb9b3cd7aa 100644 --- a/tests/unit/test_utils_filesystem.py +++ b/tests/unit/test_utils_filesystem.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from pathlib import Path diff --git a/tests/unit/test_utils_subprocess.py b/tests/unit/test_utils_subprocess.py index 2dbd5d77e4b..5b7c0d1b8e3 100644 --- a/tests/unit/test_utils_subprocess.py +++ b/tests/unit/test_utils_subprocess.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import locale import sys from logging import DEBUG, ERROR, INFO, WARNING diff --git a/tests/unit/test_utils_temp_dir.py b/tests/unit/test_utils_temp_dir.py index a6cd0d0e5af..3d903bb072e 100644 --- a/tests/unit/test_utils_temp_dir.py +++ b/tests/unit/test_utils_temp_dir.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import itertools import os import stat diff --git a/tests/unit/test_utils_unpacking.py b/tests/unit/test_utils_unpacking.py index 1f0b59dbd6b..0f29df2a9bb 100644 --- a/tests/unit/test_utils_unpacking.py +++ b/tests/unit/test_utils_unpacking.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import io import os import shutil diff --git a/tests/unit/test_utils_virtualenv.py b/tests/unit/test_utils_virtualenv.py index 94461c6d89e..1bd4f9ee0d1 100644 --- a/tests/unit/test_utils_virtualenv.py +++ b/tests/unit/test_utils_virtualenv.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os import site diff --git a/tests/unit/test_utils_wheel.py b/tests/unit/test_utils_wheel.py index 4e8e72be64a..4fa470611db 100644 --- a/tests/unit/test_utils_wheel.py +++ b/tests/unit/test_utils_wheel.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os from contextlib import ExitStack from email import message_from_string diff --git a/tests/unit/test_vcs.py b/tests/unit/test_vcs.py index a52a6217e77..9fdac652fcb 100644 --- a/tests/unit/test_vcs.py +++ b/tests/unit/test_vcs.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pathlib from typing import Any, Dict, List, Optional, Tuple, Type diff --git a/tests/unit/test_vcs_mercurial.py b/tests/unit/test_vcs_mercurial.py index d8e8f6cad27..5c1fba63159 100644 --- a/tests/unit/test_vcs_mercurial.py +++ b/tests/unit/test_vcs_mercurial.py @@ -1,6 +1,7 @@ """ Contains functional tests of the Mercurial class. """ +from __future__ import annotations import configparser import os diff --git a/tests/unit/test_wheel.py b/tests/unit/test_wheel.py index 33329fbce05..d7dfd8bf846 100644 --- a/tests/unit/test_wheel.py +++ b/tests/unit/test_wheel.py @@ -1,4 +1,6 @@ """Tests for wheel binary packages and .dist-info.""" +from __future__ import annotations + import csv import logging import os diff --git a/tests/unit/test_wheel_builder.py b/tests/unit/test_wheel_builder.py index 9044f945307..86f96d3d8e1 100644 --- a/tests/unit/test_wheel_builder.py +++ b/tests/unit/test_wheel_builder.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import os from pathlib import Path diff --git a/tools/protected_pip.py b/tools/protected_pip.py index 48230719ee2..bd2f2f80386 100644 --- a/tools/protected_pip.py +++ b/tools/protected_pip.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import pathlib import shutil diff --git a/tools/release/__init__.py b/tools/release/__init__.py index ebd1b901414..3151ca2e587 100644 --- a/tools/release/__init__.py +++ b/tools/release/__init__.py @@ -2,6 +2,7 @@ These are written according to the order they are called in. """ +from __future__ import annotations import contextlib import os diff --git a/tools/release/check_version.py b/tools/release/check_version.py index de3658faacd..963e844bded 100644 --- a/tools/release/check_version.py +++ b/tools/release/check_version.py @@ -1,5 +1,6 @@ """Checks if the version is acceptable, as per this project's release process. """ +from __future__ import annotations import sys from datetime import datetime diff --git a/tools/update-rtd-redirects.py b/tools/update-rtd-redirects.py index abb6473e87f..cdaa11eeed0 100644 --- a/tools/update-rtd-redirects.py +++ b/tools/update-rtd-redirects.py @@ -2,6 +2,8 @@ Relevant API reference: https://docs.readthedocs.io/en/stable/api/v3.html#redirects """ +from __future__ import annotations + import operator import os import sys From e3efa1ddf646abe1e115f4623db4cb6640c9a4a7 Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 13:18:33 -0500 Subject: [PATCH 4/8] Add flake8-type-checking rules to ruff --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index abfa9e0d206..9963a1b2fe9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -168,6 +168,7 @@ select = [ "W", "RUF100", "UP032", + "TCH", ] [tool.ruff.isort] From d7f2cbba7ef830f561daf4a117f42c10e44f7968 Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 13:13:11 -0500 Subject: [PATCH 5/8] TCH001: Move application imports into a type-checking block --- src/pip/_internal/cli/cmdoptions.py | 6 ++++-- src/pip/_internal/cli/req_command.py | 11 ++++++----- src/pip/_internal/commands/__init__.py | 5 +++-- src/pip/_internal/commands/debug.py | 6 ++++-- src/pip/_internal/commands/index.py | 8 +++++--- src/pip/_internal/commands/list.py | 2 +- src/pip/_internal/distributions/__init__.py | 8 ++++++-- src/pip/_internal/distributions/base.py | 9 +++++---- src/pip/_internal/distributions/installed.py | 8 +++++--- src/pip/_internal/distributions/sdist.py | 8 +++++--- src/pip/_internal/distributions/wheel.py | 6 ++++-- src/pip/_internal/index/collector.py | 3 ++- src/pip/_internal/index/package_finder.py | 11 ++++++----- src/pip/_internal/models/candidate.py | 6 +++++- src/pip/_internal/models/installation_report.py | 6 ++++-- src/pip/_internal/models/selection_prefs.py | 5 +++-- src/pip/_internal/network/auth.py | 4 +++- src/pip/_internal/network/download.py | 8 +++++--- src/pip/_internal/network/lazy_wheel.py | 6 ++++-- src/pip/_internal/network/session.py | 3 ++- src/pip/_internal/network/xmlrpc.py | 3 ++- src/pip/_internal/operations/check.py | 6 ++++-- .../operations/install/editable_legacy.py | 6 ++++-- src/pip/_internal/operations/prepare.py | 14 ++++++++------ src/pip/_internal/req/constructors.py | 6 ++++-- src/pip/_internal/req/req_file.py | 2 +- src/pip/_internal/req/req_install.py | 16 ++++++++++++++-- src/pip/_internal/req/req_set.py | 6 ++++-- src/pip/_internal/req/req_uninstall.py | 17 +++++++++++++++-- src/pip/_internal/resolution/base.py | 6 ++++-- src/pip/_internal/resolution/legacy/resolver.py | 14 ++++++++------ .../resolution/resolvelib/candidates.py | 5 +++-- .../_internal/resolution/resolvelib/factory.py | 11 ++++++----- .../_internal/resolution/resolvelib/provider.py | 3 ++- .../_internal/resolution/resolvelib/reporter.py | 5 +++-- .../resolution/resolvelib/requirements.py | 6 +++++- .../_internal/resolution/resolvelib/resolver.py | 12 +++++++----- src/pip/_internal/self_outdated_check.py | 8 +++++--- src/pip/_internal/utils/direct_url_helpers.py | 6 ++++-- src/pip/_internal/vcs/versioncontrol.py | 3 ++- src/pip/_internal/wheel_builder.py | 6 ++++-- tests/functional/test_cli.py | 4 +++- tests/functional/test_completion.py | 4 ++-- tests/functional/test_configuration.py | 7 +++++-- tests/functional/test_debug.py | 6 ++++-- tests/functional/test_fast_deps.py | 6 ++++-- tests/functional/test_freeze.py | 5 ++++- tests/functional/test_hash.py | 4 +++- tests/functional/test_help.py | 5 ++++- tests/functional/test_index.py | 6 +++++- tests/functional/test_inspect.py | 4 +++- tests/functional/test_install_cleanup.py | 4 +++- tests/functional/test_install_config.py | 8 +++++--- tests/functional/test_install_index.py | 4 +++- tests/functional/test_install_report.py | 5 +++-- tests/functional/test_install_requested.py | 5 ++++- tests/functional/test_install_user.py | 5 ++++- tests/functional/test_new_resolver.py | 5 +++-- tests/functional/test_new_resolver_target.py | 6 ++++-- tests/functional/test_new_resolver_user.py | 5 ++++- tests/functional/test_no_color.py | 4 +++- tests/functional/test_pep660.py | 5 +++-- tests/functional/test_pep668.py | 6 ++++-- tests/functional/test_pip_runner_script.py | 5 ++++- tests/functional/test_python_option.py | 4 +++- tests/functional/test_search.py | 2 +- tests/functional/test_uninstall_user.py | 5 ++++- tests/functional/test_warning.py | 4 +++- tests/lib/__init__.py | 5 +++-- tests/lib/direct_url.py | 6 ++++-- tests/unit/resolution_resolvelib/conftest.py | 8 +++++--- .../unit/resolution_resolvelib/test_provider.py | 2 +- .../resolution_resolvelib/test_requirement.py | 10 ++++++---- .../unit/resolution_resolvelib/test_resolver.py | 8 +++++--- tests/unit/test_commands.py | 6 ++++-- tests/unit/test_network_lazy_wheel.py | 6 ++++-- tests/unit/test_operations_prepare.py | 6 ++++-- tests/unit/test_pep517.py | 5 ++++- tests/unit/test_req.py | 6 ++++-- tests/unit/test_req_file.py | 5 +++-- tests/unit/test_resolution_legacy_resolver.py | 6 ++++-- tests/unit/test_utils_unpacking.py | 6 ++++-- tests/unit/test_utils_wheel.py | 6 ++++-- tests/unit/test_vcs.py | 6 ++++-- 84 files changed, 349 insertions(+), 171 deletions(-) diff --git a/src/pip/_internal/cli/cmdoptions.py b/src/pip/_internal/cli/cmdoptions.py index f470f080270..b75cd2d3d2c 100644 --- a/src/pip/_internal/cli/cmdoptions.py +++ b/src/pip/_internal/cli/cmdoptions.py @@ -18,11 +18,10 @@ from functools import partial from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values from textwrap import dedent -from typing import Any, Callable, Dict, Optional, Tuple +from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Tuple from pip._vendor.packaging.utils import canonicalize_name -from pip._internal.cli.parser import ConfigOptionParser from pip._internal.exceptions import CommandError from pip._internal.locations import USER_CACHE_DIR, get_src_prefix from pip._internal.models.format_control import FormatControl @@ -31,6 +30,9 @@ from pip._internal.utils.hashes import STRONG_HASHES from pip._internal.utils.misc import strtobool +if TYPE_CHECKING: + from pip._internal.cli.parser import ConfigOptionParser + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py index e1afd6a81de..35cf5bea186 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -13,7 +13,6 @@ from optparse import Values from typing import TYPE_CHECKING, Any, List, Optional, Tuple -from pip._internal.cache import WheelCache from pip._internal.cli import cmdoptions from pip._internal.cli.base_command import Command from pip._internal.cli.command_context import CommandContextMixIn @@ -21,9 +20,7 @@ from pip._internal.index.collector import LinkCollector from pip._internal.index.package_finder import PackageFinder from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython from pip._internal.network.session import PipSession -from pip._internal.operations.build.build_tracker import BuildTracker from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.constructors import ( install_req_from_editable, @@ -32,8 +29,6 @@ install_req_from_req_string, ) from pip._internal.req.req_file import parse_requirements -from pip._internal.req.req_install import InstallRequirement -from pip._internal.resolution.base import BaseResolver from pip._internal.self_outdated_check import pip_self_version_check from pip._internal.utils.temp_dir import ( TempDirectory, @@ -45,6 +40,12 @@ if TYPE_CHECKING: from ssl import SSLContext + from pip._internal.cache import WheelCache + from pip._internal.models.target_python import TargetPython + from pip._internal.operations.build.build_tracker import BuildTracker + from pip._internal.req.req_install import InstallRequirement + from pip._internal.resolution.base import BaseResolver + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/__init__.py b/src/pip/_internal/commands/__init__.py index 8d85b6c8486..0d31d3cde0f 100644 --- a/src/pip/_internal/commands/__init__.py +++ b/src/pip/_internal/commands/__init__.py @@ -5,9 +5,10 @@ import importlib from collections import namedtuple -from typing import Any, Dict, Optional +from typing import TYPE_CHECKING, Any, Dict, Optional -from pip._internal.cli.base_command import Command +if TYPE_CHECKING: + from pip._internal.cli.base_command import Command CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary") diff --git a/src/pip/_internal/commands/debug.py b/src/pip/_internal/commands/debug.py index a5558b0ddff..f67291dde34 100644 --- a/src/pip/_internal/commands/debug.py +++ b/src/pip/_internal/commands/debug.py @@ -7,7 +7,7 @@ import sys from optparse import Values from types import ModuleType -from typing import Any, Dict, List, Optional +from typing import TYPE_CHECKING, Any, Dict, List, Optional import pip._vendor from pip._vendor.certifi import where @@ -17,11 +17,13 @@ from pip._internal.cli.base_command import Command from pip._internal.cli.cmdoptions import make_target_python from pip._internal.cli.status_codes import SUCCESS -from pip._internal.configuration import Configuration from pip._internal.metadata import get_environment from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import get_pip_version +if TYPE_CHECKING: + from pip._internal.configuration import Configuration + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/index.py b/src/pip/_internal/commands/index.py index 716619f435e..8c761d26265 100644 --- a/src/pip/_internal/commands/index.py +++ b/src/pip/_internal/commands/index.py @@ -2,7 +2,7 @@ import logging from optparse import Values -from typing import Any, Iterable, List, Optional, Union +from typing import TYPE_CHECKING, Any, Iterable, List, Optional, Union from pip._vendor.packaging.version import LegacyVersion, Version @@ -14,10 +14,12 @@ from pip._internal.index.collector import LinkCollector from pip._internal.index.package_finder import PackageFinder from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.network.session import PipSession from pip._internal.utils.misc import write_output +if TYPE_CHECKING: + from pip._internal.models.target_python import TargetPython + from pip._internal.network.session import PipSession + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/list.py b/src/pip/_internal/commands/list.py index 5f616fc13ef..6a2660e76ff 100644 --- a/src/pip/_internal/commands/list.py +++ b/src/pip/_internal/commands/list.py @@ -15,12 +15,12 @@ from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution, get_environment from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.network.session import PipSession from pip._internal.utils.compat import stdlib_pkgs from pip._internal.utils.misc import tabulate, write_output if TYPE_CHECKING: from pip._internal.metadata.base import DistributionVersion + from pip._internal.network.session import PipSession class _DistWithLatestInfo(BaseDistribution): """Give the distribution object a couple of extra fields. diff --git a/src/pip/_internal/distributions/__init__.py b/src/pip/_internal/distributions/__init__.py index 387cccd0a5c..95210785e0b 100644 --- a/src/pip/_internal/distributions/__init__.py +++ b/src/pip/_internal/distributions/__init__.py @@ -1,9 +1,13 @@ from __future__ import annotations -from pip._internal.distributions.base import AbstractDistribution +from typing import TYPE_CHECKING + from pip._internal.distributions.sdist import SourceDistribution from pip._internal.distributions.wheel import WheelDistribution -from pip._internal.req.req_install import InstallRequirement + +if TYPE_CHECKING: + from pip._internal.distributions.base import AbstractDistribution + from pip._internal.req.req_install import InstallRequirement def make_distribution_for_install_requirement( diff --git a/src/pip/_internal/distributions/base.py b/src/pip/_internal/distributions/base.py index 9d5632e80ca..1d30906bbe9 100644 --- a/src/pip/_internal/distributions/base.py +++ b/src/pip/_internal/distributions/base.py @@ -1,11 +1,12 @@ from __future__ import annotations import abc -from typing import Optional +from typing import TYPE_CHECKING, Optional -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata.base import BaseDistribution -from pip._internal.req import InstallRequirement +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + from pip._internal.metadata.base import BaseDistribution + from pip._internal.req import InstallRequirement class AbstractDistribution(metaclass=abc.ABCMeta): diff --git a/src/pip/_internal/distributions/installed.py b/src/pip/_internal/distributions/installed.py index 33bcb9db726..f066cb836f6 100644 --- a/src/pip/_internal/distributions/installed.py +++ b/src/pip/_internal/distributions/installed.py @@ -1,10 +1,12 @@ from __future__ import annotations -from typing import Optional +from typing import TYPE_CHECKING, Optional from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution + +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + from pip._internal.metadata import BaseDistribution class InstalledDistribution(AbstractDistribution): diff --git a/src/pip/_internal/distributions/sdist.py b/src/pip/_internal/distributions/sdist.py index fcda5380ffc..1f3035c9a15 100644 --- a/src/pip/_internal/distributions/sdist.py +++ b/src/pip/_internal/distributions/sdist.py @@ -1,15 +1,17 @@ from __future__ import annotations import logging -from typing import Iterable, Optional, Set, Tuple +from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple from pip._internal.build_env import BuildEnvironment from pip._internal.distributions.base import AbstractDistribution from pip._internal.exceptions import InstallationError -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution from pip._internal.utils.subprocess import runner_with_spinner_message +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + from pip._internal.metadata import BaseDistribution + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/distributions/wheel.py b/src/pip/_internal/distributions/wheel.py index 357a9505d9d..d72cef22257 100644 --- a/src/pip/_internal/distributions/wheel.py +++ b/src/pip/_internal/distributions/wheel.py @@ -1,17 +1,19 @@ from __future__ import annotations -from typing import Optional +from typing import TYPE_CHECKING, Optional from pip._vendor.packaging.utils import canonicalize_name from pip._internal.distributions.base import AbstractDistribution -from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import ( BaseDistribution, FilesystemWheel, get_wheel_distribution, ) +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + class WheelDistribution(AbstractDistribution): """Represents a wheel distribution. diff --git a/src/pip/_internal/index/collector.py b/src/pip/_internal/index/collector.py index 5750d2208c8..d0820639c3a 100644 --- a/src/pip/_internal/index/collector.py +++ b/src/pip/_internal/index/collector.py @@ -35,7 +35,6 @@ from pip._internal.exceptions import NetworkConnectionError from pip._internal.models.link import Link from pip._internal.models.search_scope import SearchScope -from pip._internal.network.session import PipSession from pip._internal.network.utils import raise_for_status from pip._internal.utils.filetypes import is_archive_file from pip._internal.utils.misc import redact_auth_from_url @@ -45,6 +44,8 @@ if TYPE_CHECKING: from typing import Protocol + + from pip._internal.network.session import PipSession else: Protocol = object diff --git a/src/pip/_internal/index/package_finder.py b/src/pip/_internal/index/package_finder.py index 3b0d772f553..84dc592459a 100644 --- a/src/pip/_internal/index/package_finder.py +++ b/src/pip/_internal/index/package_finder.py @@ -23,15 +23,10 @@ from pip._internal.index.collector import LinkCollector, parse_links from pip._internal.models.candidate import InstallationCandidate from pip._internal.models.format_control import FormatControl -from pip._internal.models.link import Link -from pip._internal.models.search_scope import SearchScope -from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.models.target_python import TargetPython from pip._internal.models.wheel import Wheel -from pip._internal.req import InstallRequirement from pip._internal.utils._log import getLogger from pip._internal.utils.filetypes import WHEEL_EXTENSION -from pip._internal.utils.hashes import Hashes from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import build_netloc from pip._internal.utils.packaging import check_requires_python @@ -40,6 +35,12 @@ if TYPE_CHECKING: from pip._vendor.typing_extensions import TypeGuard + from pip._internal.models.link import Link + from pip._internal.models.search_scope import SearchScope + from pip._internal.models.selection_prefs import SelectionPreferences + from pip._internal.req import InstallRequirement + from pip._internal.utils.hashes import Hashes + __all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"] diff --git a/src/pip/_internal/models/candidate.py b/src/pip/_internal/models/candidate.py index 68351f1b3bd..88efb4e2b8f 100644 --- a/src/pip/_internal/models/candidate.py +++ b/src/pip/_internal/models/candidate.py @@ -1,10 +1,14 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from pip._vendor.packaging.version import parse as parse_version -from pip._internal.models.link import Link from pip._internal.utils.models import KeyBasedCompareMixin +if TYPE_CHECKING: + from pip._internal.models.link import Link + class InstallationCandidate(KeyBasedCompareMixin): """Represents a potential "candidate" for installation.""" diff --git a/src/pip/_internal/models/installation_report.py b/src/pip/_internal/models/installation_report.py index d63c9fcf017..3f9d6f15e5f 100644 --- a/src/pip/_internal/models/installation_report.py +++ b/src/pip/_internal/models/installation_report.py @@ -1,11 +1,13 @@ from __future__ import annotations -from typing import Any, Dict, Sequence +from typing import TYPE_CHECKING, Any, Dict, Sequence from pip._vendor.packaging.markers import default_environment from pip import __version__ -from pip._internal.req.req_install import InstallRequirement + +if TYPE_CHECKING: + from pip._internal.req.req_install import InstallRequirement class InstallationReport: diff --git a/src/pip/_internal/models/selection_prefs.py b/src/pip/_internal/models/selection_prefs.py index 74a1b469ee5..c6505e30852 100644 --- a/src/pip/_internal/models/selection_prefs.py +++ b/src/pip/_internal/models/selection_prefs.py @@ -1,8 +1,9 @@ from __future__ import annotations -from typing import Optional +from typing import TYPE_CHECKING, Optional -from pip._internal.models.format_control import FormatControl +if TYPE_CHECKING: + from pip._internal.models.format_control import FormatControl class SelectionPreferences: diff --git a/src/pip/_internal/network/auth.py b/src/pip/_internal/network/auth.py index c4176e53396..64cb503df2c 100644 --- a/src/pip/_internal/network/auth.py +++ b/src/pip/_internal/network/auth.py @@ -30,7 +30,9 @@ remove_auth_from_url, split_auth_netloc_from_url, ) -from pip._internal.vcs.versioncontrol import AuthInfo + +if typing.TYPE_CHECKING: + from pip._internal.vcs.versioncontrol import AuthInfo logger = getLogger(__name__) diff --git a/src/pip/_internal/network/download.py b/src/pip/_internal/network/download.py index c674eb3f6eb..dff2b47e4c7 100644 --- a/src/pip/_internal/network/download.py +++ b/src/pip/_internal/network/download.py @@ -6,19 +6,21 @@ import logging import mimetypes import os -from typing import Iterable, Optional, Tuple +from typing import TYPE_CHECKING, Iterable, Optional, Tuple from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response from pip._internal.cli.progress_bars import get_download_progress_renderer from pip._internal.exceptions import NetworkConnectionError from pip._internal.models.index import PyPI -from pip._internal.models.link import Link from pip._internal.network.cache import is_from_cache -from pip._internal.network.session import PipSession from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext +if TYPE_CHECKING: + from pip._internal.models.link import Link + from pip._internal.network.session import PipSession + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/network/lazy_wheel.py b/src/pip/_internal/network/lazy_wheel.py index 8d399012b20..1b748beec4b 100644 --- a/src/pip/_internal/network/lazy_wheel.py +++ b/src/pip/_internal/network/lazy_wheel.py @@ -6,16 +6,18 @@ from bisect import bisect_left, bisect_right from contextlib import contextmanager from tempfile import NamedTemporaryFile -from typing import Any, Dict, Generator, List, Optional, Tuple +from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Tuple from zipfile import BadZipFile, ZipFile from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response from pip._internal.metadata import BaseDistribution, MemoryWheel, get_wheel_distribution -from pip._internal.network.session import PipSession from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks +if TYPE_CHECKING: + from pip._internal.network.session import PipSession + class HTTPRangeRequestUnsupported(Exception): pass diff --git a/src/pip/_internal/network/session.py b/src/pip/_internal/network/session.py index eac2e5a1efb..58381c8d3d0 100644 --- a/src/pip/_internal/network/session.py +++ b/src/pip/_internal/network/session.py @@ -40,7 +40,6 @@ from pip import __version__ from pip._internal.metadata import get_default_environment -from pip._internal.models.link import Link from pip._internal.network.auth import MultiDomainBasicAuth from pip._internal.network.cache import SafeFileCache @@ -55,6 +54,8 @@ from pip._vendor.urllib3.poolmanager import PoolManager + from pip._internal.models.link import Link + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/network/xmlrpc.py b/src/pip/_internal/network/xmlrpc.py index 3646a2e4ac3..0f40a0a520c 100644 --- a/src/pip/_internal/network/xmlrpc.py +++ b/src/pip/_internal/network/xmlrpc.py @@ -8,7 +8,6 @@ from typing import TYPE_CHECKING, Tuple from pip._internal.exceptions import NetworkConnectionError -from pip._internal.network.session import PipSession from pip._internal.network.utils import raise_for_status if TYPE_CHECKING: @@ -16,6 +15,8 @@ from _typeshed import SizedBuffer + from pip._internal.network.session import PipSession + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/operations/check.py b/src/pip/_internal/operations/check.py index 38745527879..7e1e0b22593 100644 --- a/src/pip/_internal/operations/check.py +++ b/src/pip/_internal/operations/check.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -from typing import Callable, Dict, List, NamedTuple, Optional, Set, Tuple +from typing import TYPE_CHECKING, Callable, Dict, List, NamedTuple, Optional, Set, Tuple from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.specifiers import LegacySpecifier @@ -13,9 +13,11 @@ from pip._internal.distributions import make_distribution_for_install_requirement from pip._internal.metadata import get_default_environment from pip._internal.metadata.base import DistributionVersion -from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.deprecation import deprecated +if TYPE_CHECKING: + from pip._internal.req.req_install import InstallRequirement + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/operations/install/editable_legacy.py b/src/pip/_internal/operations/install/editable_legacy.py index 80c182bd613..2f61855c5c2 100644 --- a/src/pip/_internal/operations/install/editable_legacy.py +++ b/src/pip/_internal/operations/install/editable_legacy.py @@ -3,13 +3,15 @@ from __future__ import annotations import logging -from typing import Optional, Sequence +from typing import TYPE_CHECKING, Optional, Sequence -from pip._internal.build_env import BuildEnvironment from pip._internal.utils.logging import indent_log from pip._internal.utils.setuptools_build import make_setuptools_develop_args from pip._internal.utils.subprocess import call_subprocess +if TYPE_CHECKING: + from pip._internal.build_env import BuildEnvironment + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index e19b90637b2..f3a7ba1db22 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -9,7 +9,7 @@ import os import shutil from pathlib import Path -from typing import Dict, Iterable, List, Optional +from typing import TYPE_CHECKING, Dict, Iterable, List, Optional from pip._vendor.packaging.utils import canonicalize_name @@ -24,19 +24,14 @@ NetworkConnectionError, VcsHashUnsupported, ) -from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution, get_metadata_distribution from pip._internal.models.direct_url import ArchiveInfo -from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel from pip._internal.network.download import BatchDownloader, Downloader from pip._internal.network.lazy_wheel import ( HTTPRangeRequestUnsupported, dist_from_wheel_url, ) -from pip._internal.network.session import PipSession -from pip._internal.operations.build.build_tracker import BuildTracker -from pip._internal.req.req_install import InstallRequirement from pip._internal.utils._log import getLogger from pip._internal.utils.direct_url_helpers import ( direct_url_for_editable, @@ -54,6 +49,13 @@ from pip._internal.utils.unpacking import unpack_file from pip._internal.vcs import vcs +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + from pip._internal.models.link import Link + from pip._internal.network.session import PipSession + from pip._internal.operations.build.build_tracker import BuildTracker + from pip._internal.req.req_install import InstallRequirement + logger = getLogger(__name__) diff --git a/src/pip/_internal/req/constructors.py b/src/pip/_internal/req/constructors.py index 5afb3e19fcc..9f569220b05 100644 --- a/src/pip/_internal/req/constructors.py +++ b/src/pip/_internal/req/constructors.py @@ -13,7 +13,7 @@ import logging import os import re -from typing import Collection, Dict, List, Optional, Set, Tuple, Union +from typing import TYPE_CHECKING, Collection, Dict, List, Optional, Set, Tuple, Union from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.requirements import InvalidRequirement, Requirement @@ -23,7 +23,6 @@ from pip._internal.models.index import PyPI, TestPyPI from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel -from pip._internal.req.req_file import ParsedRequirement from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.filetypes import is_archive_file from pip._internal.utils.misc import is_installable_dir @@ -31,6 +30,9 @@ from pip._internal.utils.urls import path_to_url from pip._internal.vcs import is_url, vcs +if TYPE_CHECKING: + from pip._internal.req.req_file import ParsedRequirement + __all__ = [ "install_req_from_editable", "install_req_from_line", diff --git a/src/pip/_internal/req/req_file.py b/src/pip/_internal/req/req_file.py index 086d2d26667..e64e0925a79 100644 --- a/src/pip/_internal/req/req_file.py +++ b/src/pip/_internal/req/req_file.py @@ -25,7 +25,6 @@ from pip._internal.cli import cmdoptions from pip._internal.exceptions import InstallationError, RequirementsFileParseError from pip._internal.models.search_scope import SearchScope -from pip._internal.network.session import PipSession from pip._internal.network.utils import raise_for_status from pip._internal.utils.encoding import auto_decode from pip._internal.utils.urls import get_url_scheme @@ -36,6 +35,7 @@ from typing import NoReturn from pip._internal.index.package_finder import PackageFinder + from pip._internal.network.session import PipSession __all__ = ["parse_requirements"] diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 0affa3228f6..44e65664b68 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -9,7 +9,17 @@ import zipfile from optparse import Values from pathlib import Path -from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union +from typing import ( + TYPE_CHECKING, + Any, + Collection, + Dict, + Iterable, + List, + Optional, + Sequence, + Union, +) from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.requirements import Requirement @@ -29,7 +39,6 @@ get_wheel_distribution, ) from pip._internal.metadata.base import FilesystemWheel -from pip._internal.models.direct_url import DirectUrl from pip._internal.models.link import Link from pip._internal.operations.build.metadata import generate_metadata from pip._internal.operations.build.metadata_editable import generate_editable_metadata @@ -61,6 +70,9 @@ from pip._internal.utils.virtualenv import running_under_virtualenv from pip._internal.vcs import vcs +if TYPE_CHECKING: + from pip._internal.models.direct_url import DirectUrl + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/req/req_set.py b/src/pip/_internal/req/req_set.py index 8b0ce79f161..a0edd6d1de0 100644 --- a/src/pip/_internal/req/req_set.py +++ b/src/pip/_internal/req/req_set.py @@ -2,15 +2,17 @@ import logging from collections import OrderedDict -from typing import Dict, List +from typing import TYPE_CHECKING, Dict, List from pip._vendor.packaging.specifiers import LegacySpecifier from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.version import LegacyVersion -from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.deprecation import deprecated +if TYPE_CHECKING: + from pip._internal.req.req_install import InstallRequirement + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/req/req_uninstall.py b/src/pip/_internal/req/req_uninstall.py index f5c2447e48d..005991134f0 100644 --- a/src/pip/_internal/req/req_uninstall.py +++ b/src/pip/_internal/req/req_uninstall.py @@ -5,11 +5,21 @@ import sys import sysconfig from importlib.util import cache_from_source -from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Generator, + Iterable, + List, + Optional, + Set, + Tuple, +) from pip._internal.exceptions import UninstallationError from pip._internal.locations import get_bin_prefix, get_bin_user -from pip._internal.metadata import BaseDistribution from pip._internal.utils.compat import WINDOWS from pip._internal.utils.egg_link import egg_link_path_from_location from pip._internal.utils.logging import getLogger, indent_log @@ -17,6 +27,9 @@ from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory from pip._internal.utils.virtualenv import running_under_virtualenv +if TYPE_CHECKING: + from pip._internal.metadata import BaseDistribution + logger = getLogger(__name__) diff --git a/src/pip/_internal/resolution/base.py b/src/pip/_internal/resolution/base.py index 2ff082392d0..c53239dcd31 100644 --- a/src/pip/_internal/resolution/base.py +++ b/src/pip/_internal/resolution/base.py @@ -1,9 +1,11 @@ from __future__ import annotations -from typing import Callable, List, Optional +from typing import TYPE_CHECKING, Callable, List, Optional from pip._internal.req.req_install import InstallRequirement -from pip._internal.req.req_set import RequirementSet + +if TYPE_CHECKING: + from pip._internal.req.req_set import RequirementSet InstallRequirementProvider = Callable[ [str, Optional[InstallRequirement]], InstallRequirement diff --git a/src/pip/_internal/resolution/legacy/resolver.py b/src/pip/_internal/resolution/legacy/resolver.py index d6c22f58c1a..fb19d00e77c 100644 --- a/src/pip/_internal/resolution/legacy/resolver.py +++ b/src/pip/_internal/resolution/legacy/resolver.py @@ -18,12 +18,11 @@ import sys from collections import defaultdict from itertools import chain -from typing import DefaultDict, Iterable, List, Optional, Set, Tuple +from typing import TYPE_CHECKING, DefaultDict, Iterable, List, Optional, Set, Tuple from pip._vendor.packaging import specifiers from pip._vendor.packaging.requirements import Requirement -from pip._internal.cache import WheelCache from pip._internal.exceptions import ( BestVersionAlreadyInstalled, DistributionNotFound, @@ -33,11 +32,7 @@ NoneMetadataError, UnsupportedPythonVersion, ) -from pip._internal.index.package_finder import PackageFinder -from pip._internal.metadata import BaseDistribution -from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel -from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.req_install import ( InstallRequirement, check_invalid_constraint_type, @@ -51,6 +46,13 @@ from pip._internal.utils.misc import normalize_version_info from pip._internal.utils.packaging import check_requires_python +if TYPE_CHECKING: + from pip._internal.cache import WheelCache + from pip._internal.index.package_finder import PackageFinder + from pip._internal.metadata import BaseDistribution + from pip._internal.models.link import Link + from pip._internal.operations.prepare import RequirementPreparer + logger = logging.getLogger(__name__) DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]] diff --git a/src/pip/_internal/resolution/resolvelib/candidates.py b/src/pip/_internal/resolution/resolvelib/candidates.py index 1ff751e2563..e24e51456b2 100644 --- a/src/pip/_internal/resolution/resolvelib/candidates.py +++ b/src/pip/_internal/resolution/resolvelib/candidates.py @@ -12,20 +12,21 @@ InstallationSubprocessError, MetadataInconsistent, ) -from pip._internal.metadata import BaseDistribution from pip._internal.models.link import Link, links_equivalent from pip._internal.models.wheel import Wheel from pip._internal.req.constructors import ( install_req_from_editable, install_req_from_line, ) -from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.direct_url_helpers import direct_url_from_link from pip._internal.utils.misc import normalize_version_info from .base import Candidate, CandidateVersion, Requirement, format_name if TYPE_CHECKING: + from pip._internal.metadata import BaseDistribution + from pip._internal.req.req_install import InstallRequirement + from .factory import Factory logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py index cc90b5fd887..e0fba63d88f 100644 --- a/src/pip/_internal/resolution/resolvelib/factory.py +++ b/src/pip/_internal/resolution/resolvelib/factory.py @@ -25,7 +25,6 @@ from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._vendor.resolvelib import ResolutionImpossible -from pip._internal.cache import CacheEntry, WheelCache from pip._internal.exceptions import ( DistributionNotFound, InstallationError, @@ -33,11 +32,9 @@ UnsupportedPythonVersion, UnsupportedWheel, ) -from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution, get_default_environment from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel -from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.constructors import ( install_req_drop_extras, install_req_from_link_and_ireq, @@ -46,9 +43,7 @@ InstallRequirement, check_invalid_constraint_type, ) -from pip._internal.resolution.base import InstallRequirementProvider from pip._internal.utils.compatibility_tags import get_supported -from pip._internal.utils.hashes import Hashes from pip._internal.utils.packaging import get_requirement from pip._internal.utils.virtualenv import running_under_virtualenv @@ -74,6 +69,12 @@ if TYPE_CHECKING: from typing import Protocol + from pip._internal.cache import CacheEntry, WheelCache + from pip._internal.index.package_finder import PackageFinder + from pip._internal.operations.prepare import RequirementPreparer + from pip._internal.resolution.base import InstallRequirementProvider + from pip._internal.utils.hashes import Hashes + class ConflictCause(Protocol): requirement: RequiresPythonRequirement parent: Candidate diff --git a/src/pip/_internal/resolution/resolvelib/provider.py b/src/pip/_internal/resolution/resolvelib/provider.py index fc8ae549096..e3e9b39d6a1 100644 --- a/src/pip/_internal/resolution/resolvelib/provider.py +++ b/src/pip/_internal/resolution/resolvelib/provider.py @@ -17,12 +17,13 @@ from .base import Candidate, Constraint, Requirement from .candidates import REQUIRES_PYTHON_IDENTIFIER -from .factory import Factory if TYPE_CHECKING: from pip._vendor.resolvelib.providers import Preference from pip._vendor.resolvelib.resolvers import RequirementInformation + from .factory import Factory + PreferenceInformation = RequirementInformation[Requirement, Candidate] _ProviderBase = AbstractProvider[Requirement, Candidate, str] diff --git a/src/pip/_internal/resolution/resolvelib/reporter.py b/src/pip/_internal/resolution/resolvelib/reporter.py index d6ed739d39e..3c872d6c033 100644 --- a/src/pip/_internal/resolution/resolvelib/reporter.py +++ b/src/pip/_internal/resolution/resolvelib/reporter.py @@ -2,11 +2,12 @@ from collections import defaultdict from logging import getLogger -from typing import Any, DefaultDict +from typing import TYPE_CHECKING, Any, DefaultDict from pip._vendor.resolvelib.reporters import BaseReporter -from .base import Candidate, Requirement +if TYPE_CHECKING: + from .base import Candidate, Requirement logger = getLogger(__name__) diff --git a/src/pip/_internal/resolution/resolvelib/requirements.py b/src/pip/_internal/resolution/resolvelib/requirements.py index a0f3b6e3544..2d90d538596 100644 --- a/src/pip/_internal/resolution/resolvelib/requirements.py +++ b/src/pip/_internal/resolution/resolvelib/requirements.py @@ -1,13 +1,17 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._internal.req.constructors import install_req_drop_extras -from pip._internal.req.req_install import InstallRequirement from .base import Candidate, CandidateLookup, Requirement, format_name +if TYPE_CHECKING: + from pip._internal.req.req_install import InstallRequirement + class ExplicitRequirement(Requirement): def __init__(self, candidate: Candidate) -> None: diff --git a/src/pip/_internal/resolution/resolvelib/resolver.py b/src/pip/_internal/resolution/resolvelib/resolver.py index e2dcff52bbe..49d7aab4759 100644 --- a/src/pip/_internal/resolution/resolvelib/resolver.py +++ b/src/pip/_internal/resolution/resolvelib/resolver.py @@ -11,11 +11,7 @@ from pip._vendor.resolvelib import Resolver as RLResolver from pip._vendor.resolvelib.structs import DirectedGraph -from pip._internal.cache import WheelCache -from pip._internal.index.package_finder import PackageFinder -from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.constructors import install_req_extend_extras -from pip._internal.req.req_install import InstallRequirement from pip._internal.req.req_set import RequirementSet from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider from pip._internal.resolution.resolvelib.provider import PipProvider @@ -25,12 +21,18 @@ ) from pip._internal.utils.packaging import get_requirement -from .base import Candidate, Requirement from .factory import Factory if TYPE_CHECKING: from pip._vendor.resolvelib.resolvers import Result as RLResult + from pip._internal.cache import WheelCache + from pip._internal.index.package_finder import PackageFinder + from pip._internal.operations.prepare import RequirementPreparer + from pip._internal.req.req_install import InstallRequirement + + from .base import Candidate, Requirement + Result = RLResult[Requirement, Candidate, str] diff --git a/src/pip/_internal/self_outdated_check.py b/src/pip/_internal/self_outdated_check.py index ff6be9cf3b8..c1cfd1eda94 100644 --- a/src/pip/_internal/self_outdated_check.py +++ b/src/pip/_internal/self_outdated_check.py @@ -9,7 +9,7 @@ import os.path import sys from dataclasses import dataclass -from typing import Any, Callable, Dict, Optional +from typing import TYPE_CHECKING, Any, Callable, Dict, Optional from pip._vendor.packaging.version import parse as parse_version from pip._vendor.rich.console import Group @@ -19,9 +19,7 @@ from pip._internal.index.collector import LinkCollector from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import get_default_environment -from pip._internal.metadata.base import DistributionVersion from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.network.session import PipSession from pip._internal.utils.compat import WINDOWS from pip._internal.utils.entrypoints import ( get_best_invocation_for_this_pip, @@ -30,6 +28,10 @@ from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace from pip._internal.utils.misc import ensure_dir +if TYPE_CHECKING: + from pip._internal.metadata.base import DistributionVersion + from pip._internal.network.session import PipSession + _WEEK = datetime.timedelta(days=7) logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/utils/direct_url_helpers.py b/src/pip/_internal/utils/direct_url_helpers.py index bd31f223cc3..9d0146ac0cd 100644 --- a/src/pip/_internal/utils/direct_url_helpers.py +++ b/src/pip/_internal/utils/direct_url_helpers.py @@ -1,12 +1,14 @@ from __future__ import annotations -from typing import Optional +from typing import TYPE_CHECKING, Optional from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo -from pip._internal.models.link import Link from pip._internal.utils.urls import path_to_url from pip._internal.vcs import vcs +if TYPE_CHECKING: + from pip._internal.models.link import Link + def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: str) -> str: """Convert a DirectUrl to a pip requirement string.""" diff --git a/src/pip/_internal/vcs/versioncontrol.py b/src/pip/_internal/vcs/versioncontrol.py index 40184fe585d..875ceb1e034 100644 --- a/src/pip/_internal/vcs/versioncontrol.py +++ b/src/pip/_internal/vcs/versioncontrol.py @@ -20,7 +20,6 @@ Union, ) -from pip._internal.cli.spinners import SpinnerInterface from pip._internal.exceptions import BadCommand, InstallationError from pip._internal.utils.misc import ( HiddenText, @@ -46,6 +45,8 @@ # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7. from typing import Literal + from pip._internal.cli.spinners import SpinnerInterface + __all__ = ["vcs"] diff --git a/src/pip/_internal/wheel_builder.py b/src/pip/_internal/wheel_builder.py index 7db14e8fd38..e898d06cac9 100644 --- a/src/pip/_internal/wheel_builder.py +++ b/src/pip/_internal/wheel_builder.py @@ -6,12 +6,11 @@ import os.path import re import shutil -from typing import Iterable, List, Optional, Tuple +from typing import TYPE_CHECKING, Iterable, List, Optional, Tuple from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version from pip._vendor.packaging.version import InvalidVersion, Version -from pip._internal.cache import WheelCache from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel from pip._internal.metadata import FilesystemWheel, get_wheel_distribution from pip._internal.models.link import Link @@ -28,6 +27,9 @@ from pip._internal.utils.urls import path_to_url from pip._internal.vcs import vcs +if TYPE_CHECKING: + from pip._internal.cache import WheelCache + logger = logging.getLogger(__name__) _egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE) diff --git a/tests/functional/test_cli.py b/tests/functional/test_cli.py index eb5d7b3435a..5049e362a9b 100644 --- a/tests/functional/test_cli.py +++ b/tests/functional/test_cli.py @@ -3,10 +3,12 @@ from __future__ import annotations from textwrap import dedent +from typing import TYPE_CHECKING import pytest -from tests.lib import PipTestEnvironment +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment @pytest.mark.parametrize( diff --git a/tests/functional/test_completion.py b/tests/functional/test_completion.py index d18119dbf2a..5d9c512eb8b 100644 --- a/tests/functional/test_completion.py +++ b/tests/functional/test_completion.py @@ -7,10 +7,10 @@ import pytest -from tests.lib import PipTestEnvironment, ScriptFactory, TestData, TestPipResult - if TYPE_CHECKING: from typing import Protocol + + from tests.lib import PipTestEnvironment, ScriptFactory, TestData, TestPipResult else: # TODO: Protocol was introduced in Python 3.8. Remove this branch when # dropping support for Python 3.7. diff --git a/tests/functional/test_configuration.py b/tests/functional/test_configuration.py index f22a9f55c6a..7b54147bd73 100644 --- a/tests/functional/test_configuration.py +++ b/tests/functional/test_configuration.py @@ -4,12 +4,15 @@ import re import textwrap +from typing import TYPE_CHECKING from pip._internal.cli.status_codes import ERROR from pip._internal.configuration import CONFIG_BASENAME, get_configuration_files -from tests.lib import PipTestEnvironment from tests.lib.configuration_helpers import ConfigurationMixin, kinds -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment + from tests.lib.venv import VirtualEnvironment def test_no_options_passed_should_error(script: PipTestEnvironment) -> None: diff --git a/tests/functional/test_debug.py b/tests/functional/test_debug.py index d53ba9d14a4..5904df4642e 100644 --- a/tests/functional/test_debug.py +++ b/tests/functional/test_debug.py @@ -1,14 +1,16 @@ from __future__ import annotations import re -from typing import List +from typing import TYPE_CHECKING, List import pytest from pip._vendor.packaging.version import Version from pip._internal.commands.debug import create_vendor_txt_map from pip._internal.utils import compatibility_tags -from tests.lib import PipTestEnvironment + +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment @pytest.mark.parametrize( diff --git a/tests/functional/test_fast_deps.py b/tests/functional/test_fast_deps.py index 0a934f26263..b928376e612 100644 --- a/tests/functional/test_fast_deps.py +++ b/tests/functional/test_fast_deps.py @@ -6,13 +6,15 @@ import pathlib import re from os.path import basename -from typing import Iterable +from typing import TYPE_CHECKING, Iterable from pip._vendor.packaging.utils import canonicalize_name from pytest import mark from pip._internal.utils.misc import hash_file -from tests.lib import PipTestEnvironment, TestData, TestPipResult + +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment, TestData, TestPipResult def pip(script: PipTestEnvironment, command: str, requirement: str) -> TestPipResult: diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py index d05206d7c43..4e422341a8d 100644 --- a/tests/functional/test_freeze.py +++ b/tests/functional/test_freeze.py @@ -6,6 +6,7 @@ import textwrap from doctest import ELLIPSIS, OutputChecker from pathlib import Path +from typing import TYPE_CHECKING import pytest from pip._vendor.packaging.utils import canonicalize_name @@ -25,7 +26,9 @@ wheel, ) from tests.lib.direct_url import get_created_direct_url_path -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from tests.lib.venv import VirtualEnvironment distribute_re = re.compile("^distribute==[0-9.]+\n", re.MULTILINE) diff --git a/tests/functional/test_hash.py b/tests/functional/test_hash.py index 928e9badd19..ce7aca2e659 100644 --- a/tests/functional/test_hash.py +++ b/tests/functional/test_hash.py @@ -2,8 +2,10 @@ from __future__ import annotations from pathlib import Path +from typing import TYPE_CHECKING -from tests.lib import PipTestEnvironment +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment def test_basic_hash(script: PipTestEnvironment, tmpdir: Path) -> None: diff --git a/tests/functional/test_help.py b/tests/functional/test_help.py index 88a029f19b2..62818915d2c 100644 --- a/tests/functional/test_help.py +++ b/tests/functional/test_help.py @@ -1,5 +1,6 @@ from __future__ import annotations +from typing import TYPE_CHECKING from unittest.mock import Mock import pytest @@ -7,7 +8,9 @@ from pip._internal.cli.status_codes import ERROR, SUCCESS from pip._internal.commands import commands_dict, create_command from pip._internal.exceptions import CommandError -from tests.lib import InMemoryPip, PipTestEnvironment + +if TYPE_CHECKING: + from tests.lib import InMemoryPip, PipTestEnvironment def test_run_method_should_return_success_when_finds_command_name() -> None: diff --git a/tests/functional/test_index.py b/tests/functional/test_index.py index f4ad7cfd8d7..d3719841b07 100644 --- a/tests/functional/test_index.py +++ b/tests/functional/test_index.py @@ -1,10 +1,14 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import pytest from pip._internal.cli.status_codes import ERROR, SUCCESS from pip._internal.commands import create_command -from tests.lib import PipTestEnvironment + +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment @pytest.mark.network diff --git a/tests/functional/test_inspect.py b/tests/functional/test_inspect.py index a0c2c2f949f..41bc9569b5f 100644 --- a/tests/functional/test_inspect.py +++ b/tests/functional/test_inspect.py @@ -1,10 +1,12 @@ from __future__ import annotations import json +from typing import TYPE_CHECKING import pytest -from tests.lib import PipTestEnvironment, ScriptFactory, TestData +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment, ScriptFactory, TestData @pytest.fixture(scope="session") diff --git a/tests/functional/test_install_cleanup.py b/tests/functional/test_install_cleanup.py index 414a86b4278..f520e3c5811 100644 --- a/tests/functional/test_install_cleanup.py +++ b/tests/functional/test_install_cleanup.py @@ -1,10 +1,12 @@ from __future__ import annotations from os.path import exists +from typing import TYPE_CHECKING import pytest -from tests.lib import PipTestEnvironment, TestData +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment, TestData @pytest.mark.network diff --git a/tests/functional/test_install_config.py b/tests/functional/test_install_config.py index 10a85eb1703..ca98a0857d5 100644 --- a/tests/functional/test_install_config.py +++ b/tests/functional/test_install_config.py @@ -6,11 +6,10 @@ import tempfile import textwrap from pathlib import Path -from typing import Callable, List +from typing import TYPE_CHECKING, Callable, List import pytest -from tests.lib import CertFactory, PipTestEnvironment, ScriptFactory, TestData from tests.lib.server import ( MockServer, authorization_response, @@ -19,7 +18,10 @@ package_page, server_running, ) -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from tests.lib import CertFactory, PipTestEnvironment, ScriptFactory, TestData + from tests.lib.venv import VirtualEnvironment TEST_PYPI_INITOOLS = "https://test.pypi.org/simple/initools/" diff --git a/tests/functional/test_install_index.py b/tests/functional/test_install_index.py index 43e4ec55582..09b623a3358 100644 --- a/tests/functional/test_install_index.py +++ b/tests/functional/test_install_index.py @@ -2,8 +2,10 @@ import shutil import textwrap +from typing import TYPE_CHECKING -from tests.lib import PipTestEnvironment, TestData +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment, TestData def test_find_links_relative_path(script: PipTestEnvironment, data: TestData) -> None: diff --git a/tests/functional/test_install_report.py b/tests/functional/test_install_report.py index d36927367c0..6ea40dfb33d 100644 --- a/tests/functional/test_install_report.py +++ b/tests/functional/test_install_report.py @@ -3,12 +3,13 @@ import json import textwrap from pathlib import Path -from typing import Any, Dict, Tuple +from typing import TYPE_CHECKING, Any, Dict, Tuple import pytest from packaging.utils import canonicalize_name -from ..lib import PipTestEnvironment, TestData +if TYPE_CHECKING: + from ..lib import PipTestEnvironment, TestData def _install_dict(report: Dict[str, Any]) -> Dict[str, Any]: diff --git a/tests/functional/test_install_requested.py b/tests/functional/test_install_requested.py index 760ce7a77ee..9b0e3a968d2 100644 --- a/tests/functional/test_install_requested.py +++ b/tests/functional/test_install_requested.py @@ -1,8 +1,11 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import pytest -from tests.lib import PipTestEnvironment, TestData, TestPipResult +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment, TestData, TestPipResult def _assert_requested_present( diff --git a/tests/functional/test_install_user.py b/tests/functional/test_install_user.py index f9302245d16..ecbe4c52f4b 100644 --- a/tests/functional/test_install_user.py +++ b/tests/functional/test_install_user.py @@ -7,6 +7,7 @@ import textwrap from os.path import curdir, isdir, isfile from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -18,7 +19,9 @@ pyversion, # noqa: F401 ) from tests.lib.local_repos import local_checkout -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from tests.lib.venv import VirtualEnvironment def _patch_dist_in_site_packages(virtualenv: VirtualEnvironment) -> None: diff --git a/tests/functional/test_new_resolver.py b/tests/functional/test_new_resolver.py index a08300a288c..63f3f65e957 100644 --- a/tests/functional/test_new_resolver.py +++ b/tests/functional/test_new_resolver.py @@ -9,7 +9,6 @@ import pytest from packaging.utils import canonicalize_name -from tests.conftest import ScriptFactory from tests.lib import ( PipTestEnvironment, create_basic_sdist_for_package, @@ -17,12 +16,14 @@ create_test_package_with_setup, ) from tests.lib.direct_url import get_created_direct_url -from tests.lib.venv import VirtualEnvironment from tests.lib.wheel import make_wheel if TYPE_CHECKING: from typing import Protocol + from tests.conftest import ScriptFactory + from tests.lib.venv import VirtualEnvironment + MakeFakeWheel = Callable[[str, str, str], pathlib.Path] diff --git a/tests/functional/test_new_resolver_target.py b/tests/functional/test_new_resolver_target.py index 80656f065e8..110625fcc83 100644 --- a/tests/functional/test_new_resolver_target.py +++ b/tests/functional/test_new_resolver_target.py @@ -1,14 +1,16 @@ from __future__ import annotations from pathlib import Path -from typing import Callable, Optional +from typing import TYPE_CHECKING, Callable, Optional import pytest from pip._internal.cli.status_codes import ERROR, SUCCESS -from tests.lib import PipTestEnvironment from tests.lib.wheel import make_wheel +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment + MakeFakeWheel = Callable[[str], str] diff --git a/tests/functional/test_new_resolver_user.py b/tests/functional/test_new_resolver_user.py index 1df6fa62981..df93384131e 100644 --- a/tests/functional/test_new_resolver_user.py +++ b/tests/functional/test_new_resolver_user.py @@ -2,11 +2,14 @@ import os import textwrap +from typing import TYPE_CHECKING import pytest from tests.lib import PipTestEnvironment, create_basic_wheel_for_package -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from tests.lib.venv import VirtualEnvironment @pytest.mark.usefixtures("enable_user_site") diff --git a/tests/functional/test_no_color.py b/tests/functional/test_no_color.py index 4b7b982b300..cf5d604a3ee 100644 --- a/tests/functional/test_no_color.py +++ b/tests/functional/test_no_color.py @@ -7,10 +7,12 @@ import shutil import subprocess import sys +from typing import TYPE_CHECKING import pytest -from tests.lib import PipTestEnvironment +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment @pytest.mark.skipif(shutil.which("script") is None, reason="no 'script' executable") diff --git a/tests/functional/test_pep660.py b/tests/functional/test_pep660.py index bf6fedaf541..92f143de403 100644 --- a/tests/functional/test_pep660.py +++ b/tests/functional/test_pep660.py @@ -2,11 +2,12 @@ import os from pathlib import Path -from typing import Any, Dict +from typing import TYPE_CHECKING, Any, Dict import tomli_w -from tests.lib import PipTestEnvironment +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment SETUP_PY = """ from setuptools import setup diff --git a/tests/functional/test_pep668.py b/tests/functional/test_pep668.py index 90ea79629db..b9dfc2248c2 100644 --- a/tests/functional/test_pep668.py +++ b/tests/functional/test_pep668.py @@ -3,12 +3,14 @@ import json import pathlib import textwrap -from typing import List +from typing import TYPE_CHECKING, List import pytest from tests.lib import PipTestEnvironment, create_basic_wheel_for_package -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from tests.lib.venv import VirtualEnvironment @pytest.fixture() diff --git a/tests/functional/test_pip_runner_script.py b/tests/functional/test_pip_runner_script.py index 548a50a7082..8e463f3cca4 100644 --- a/tests/functional/test_pip_runner_script.py +++ b/tests/functional/test_pip_runner_script.py @@ -2,9 +2,12 @@ import os from pathlib import Path +from typing import TYPE_CHECKING from pip import __version__ -from tests.lib import PipTestEnvironment + +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment def test_runner_work_in_environments_with_no_pip( diff --git a/tests/functional/test_python_option.py b/tests/functional/test_python_option.py index 1cb16674b8a..8fa217cc391 100644 --- a/tests/functional/test_python_option.py +++ b/tests/functional/test_python_option.py @@ -3,9 +3,11 @@ import json import os from pathlib import Path +from typing import TYPE_CHECKING from venv import EnvBuilder -from tests.lib import PipTestEnvironment, TestData +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment, TestData def test_python_interpreter( diff --git a/tests/functional/test_search.py b/tests/functional/test_search.py index 9445be882ae..0a3721ed6cc 100644 --- a/tests/functional/test_search.py +++ b/tests/functional/test_search.py @@ -9,10 +9,10 @@ from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS from pip._internal.commands import create_command from pip._internal.commands.search import highest_version, print_results, transform_hits -from tests.lib import PipTestEnvironment if TYPE_CHECKING: from pip._internal.commands.search import TransformedHit + from tests.lib import PipTestEnvironment def test_version_compare() -> None: diff --git a/tests/functional/test_uninstall_user.py b/tests/functional/test_uninstall_user.py index da2cef1b3fd..60f65884f26 100644 --- a/tests/functional/test_uninstall_user.py +++ b/tests/functional/test_uninstall_user.py @@ -4,14 +4,17 @@ from __future__ import annotations from os.path import isdir, isfile, normcase +from typing import TYPE_CHECKING import pytest from tests.functional.test_install_user import _patch_dist_in_site_packages from tests.lib import PipTestEnvironment, TestData, assert_all_changes -from tests.lib.venv import VirtualEnvironment from tests.lib.wheel import make_wheel +if TYPE_CHECKING: + from tests.lib.venv import VirtualEnvironment + @pytest.mark.usefixtures("enable_user_site") class Tests_UninstallUserSite: diff --git a/tests/functional/test_warning.py b/tests/functional/test_warning.py index fccde022ab6..45fc7bfe53f 100644 --- a/tests/functional/test_warning.py +++ b/tests/functional/test_warning.py @@ -4,10 +4,12 @@ import sys import textwrap from pathlib import Path +from typing import TYPE_CHECKING import pytest -from tests.lib import PipTestEnvironment +if TYPE_CHECKING: + from tests.lib import PipTestEnvironment @pytest.fixture diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py index de48a3fb4bc..863e6126b38 100644 --- a/tests/lib/__init__.py +++ b/tests/lib/__init__.py @@ -41,15 +41,16 @@ from pip._internal.locations import get_major_minor_version from pip._internal.models.search_scope import SearchScope from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython from pip._internal.network.session import PipSession from pip._internal.utils.egg_link import _egg_link_names -from tests.lib.venv import VirtualEnvironment from tests.lib.wheel import make_wheel if TYPE_CHECKING: from typing import Literal, Protocol + from pip._internal.models.target_python import TargetPython + from tests.lib.venv import VirtualEnvironment + ResolverVariant = Literal["resolvelib", "legacy"] else: # TODO: Remove this branch when dropping support for Python 3.7. Protocol = object # Protocol was introduced in Python 3.8. diff --git a/tests/lib/direct_url.py b/tests/lib/direct_url.py index 025d2f43a5e..e9e55c9577c 100644 --- a/tests/lib/direct_url.py +++ b/tests/lib/direct_url.py @@ -3,10 +3,12 @@ import os import re from pathlib import Path -from typing import Optional +from typing import TYPE_CHECKING, Optional from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl -from tests.lib import TestPipResult + +if TYPE_CHECKING: + from tests.lib import TestPipResult def get_created_direct_url_path(result: TestPipResult, pkg: str) -> Optional[Path]: diff --git a/tests/unit/resolution_resolvelib/conftest.py b/tests/unit/resolution_resolvelib/conftest.py index bdf7df84133..8b869addace 100644 --- a/tests/unit/resolution_resolvelib/conftest.py +++ b/tests/unit/resolution_resolvelib/conftest.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Iterator +from typing import TYPE_CHECKING, Iterator import pytest @@ -14,12 +14,14 @@ from pip._internal.models.selection_prefs import SelectionPreferences from pip._internal.network.session import PipSession from pip._internal.operations.build.build_tracker import get_build_tracker -from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.constructors import install_req_from_line from pip._internal.resolution.resolvelib.factory import Factory from pip._internal.resolution.resolvelib.provider import PipProvider from pip._internal.utils.temp_dir import TempDirectory, global_tempdir_manager -from tests.lib import TestData + +if TYPE_CHECKING: + from pip._internal.operations.prepare import RequirementPreparer + from tests.lib import TestData @pytest.fixture diff --git a/tests/unit/resolution_resolvelib/test_provider.py b/tests/unit/resolution_resolvelib/test_provider.py index e8e14ab82e4..eccb821274b 100644 --- a/tests/unit/resolution_resolvelib/test_provider.py +++ b/tests/unit/resolution_resolvelib/test_provider.py @@ -7,11 +7,11 @@ from pip._internal.models.candidate import InstallationCandidate from pip._internal.models.link import Link from pip._internal.req.constructors import install_req_from_req_string -from pip._internal.resolution.resolvelib.factory import Factory from pip._internal.resolution.resolvelib.provider import PipProvider from pip._internal.resolution.resolvelib.requirements import SpecifierRequirement if TYPE_CHECKING: + from pip._internal.resolution.resolvelib.factory import Factory from pip._internal.resolution.resolvelib.provider import PreferenceInformation diff --git a/tests/unit/resolution_resolvelib/test_requirement.py b/tests/unit/resolution_resolvelib/test_requirement.py index 1a2a732cf26..63c694a400d 100644 --- a/tests/unit/resolution_resolvelib/test_requirement.py +++ b/tests/unit/resolution_resolvelib/test_requirement.py @@ -2,15 +2,17 @@ import os from pathlib import Path -from typing import Iterator, List, Tuple +from typing import TYPE_CHECKING, Iterator, List, Tuple import pytest from pip._vendor.resolvelib import BaseReporter, Resolver from pip._internal.resolution.resolvelib.base import Candidate, Constraint, Requirement -from pip._internal.resolution.resolvelib.factory import Factory -from pip._internal.resolution.resolvelib.provider import PipProvider -from tests.lib import TestData + +if TYPE_CHECKING: + from pip._internal.resolution.resolvelib.factory import Factory + from pip._internal.resolution.resolvelib.provider import PipProvider + from tests.lib import TestData # NOTE: All tests are prefixed `test_rlr` (for "test resolvelib resolver"). # This helps select just these tests using pytest's `-k` option, and diff --git a/tests/unit/resolution_resolvelib/test_resolver.py b/tests/unit/resolution_resolvelib/test_resolver.py index 8364990d530..5a3f6ca9eb2 100644 --- a/tests/unit/resolution_resolvelib/test_resolver.py +++ b/tests/unit/resolution_resolvelib/test_resolver.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Dict, List, Optional, Set, Tuple, cast +from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast from unittest import mock import pytest @@ -8,8 +8,6 @@ from pip._vendor.resolvelib.resolvers import Result from pip._vendor.resolvelib.structs import DirectedGraph -from pip._internal.index.package_finder import PackageFinder -from pip._internal.operations.prepare import RequirementPreparer from pip._internal.req.constructors import install_req_from_line from pip._internal.req.req_set import RequirementSet from pip._internal.resolution.resolvelib.resolver import ( @@ -17,6 +15,10 @@ get_topological_weights, ) +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + from pip._internal.operations.prepare import RequirementPreparer + @pytest.fixture() def resolver(preparer: RequirementPreparer, finder: PackageFinder) -> Resolver: diff --git a/tests/unit/test_commands.py b/tests/unit/test_commands.py index da01feee626..d82dff14ed9 100644 --- a/tests/unit/test_commands.py +++ b/tests/unit/test_commands.py @@ -1,11 +1,10 @@ from __future__ import annotations -from typing import Callable, List +from typing import TYPE_CHECKING, Callable, List from unittest import mock import pytest -from pip._internal.cli.base_command import Command from pip._internal.cli.req_command import ( IndexGroupCommand, RequirementCommand, @@ -13,6 +12,9 @@ ) from pip._internal.commands import commands_dict, create_command +if TYPE_CHECKING: + from pip._internal.cli.base_command import Command + # These are the expected names of the commands whose classes inherit from # IndexGroupCommand. EXPECTED_INDEX_GROUP_COMMANDS = ["download", "index", "install", "list", "wheel"] diff --git a/tests/unit/test_network_lazy_wheel.py b/tests/unit/test_network_lazy_wheel.py index 6ece2243ab1..824e6017b2f 100644 --- a/tests/unit/test_network_lazy_wheel.py +++ b/tests/unit/test_network_lazy_wheel.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Iterator +from typing import TYPE_CHECKING, Iterator from pip._vendor.packaging.version import Version from pytest import fixture, mark, raises @@ -11,9 +11,11 @@ dist_from_wheel_url, ) from pip._internal.network.session import PipSession -from tests.lib import TestData from tests.lib.server import MockServer, file_response +if TYPE_CHECKING: + from tests.lib import TestData + MYPY_0_782_WHL = ( "https://files.pythonhosted.org/packages/9d/65/" "b96e844150ce18b9892b155b780248955ded13a2581d31872e7daa90a503/" diff --git a/tests/unit/test_operations_prepare.py b/tests/unit/test_operations_prepare.py index 300a0364d1a..d8e3ab0768e 100644 --- a/tests/unit/test_operations_prepare.py +++ b/tests/unit/test_operations_prepare.py @@ -5,7 +5,7 @@ from pathlib import Path from shutil import rmtree from tempfile import mkdtemp -from typing import Any, Dict +from typing import TYPE_CHECKING, Any, Dict from unittest.mock import Mock, patch import pytest @@ -16,9 +16,11 @@ from pip._internal.network.session import PipSession from pip._internal.operations.prepare import unpack_url from pip._internal.utils.hashes import Hashes -from tests.lib import TestData from tests.lib.requests_mocks import MockResponse +if TYPE_CHECKING: + from tests.lib import TestData + def test_unpack_url_with_urllib_response_without_content_type(data: TestData) -> None: """ diff --git a/tests/unit/test_pep517.py b/tests/unit/test_pep517.py index 706c29ea987..d4217fbad49 100644 --- a/tests/unit/test_pep517.py +++ b/tests/unit/test_pep517.py @@ -3,12 +3,15 @@ import os from pathlib import Path from textwrap import dedent +from typing import TYPE_CHECKING import pytest from pip._internal.exceptions import InstallationError, InvalidPyProjectBuildRequires from pip._internal.req import InstallRequirement -from tests.lib import TestData + +if TYPE_CHECKING: + from tests.lib import TestData @pytest.mark.parametrize( diff --git a/tests/unit/test_req.py b/tests/unit/test_req.py index 409fd3210d3..7810d94612e 100644 --- a/tests/unit/test_req.py +++ b/tests/unit/test_req.py @@ -8,7 +8,7 @@ import tempfile from functools import partial from pathlib import Path -from typing import Iterator, Optional, Set, Tuple, cast +from typing import TYPE_CHECKING, Iterator, Optional, Set, Tuple, cast from unittest import mock import pytest @@ -24,7 +24,6 @@ InvalidWheelFilename, PreviousBuildDirError, ) -from pip._internal.index.package_finder import PackageFinder from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo from pip._internal.models.link import Link from pip._internal.network.session import PipSession @@ -50,6 +49,9 @@ from pip._internal.resolution.legacy.resolver import Resolver from tests.lib import TestData, make_test_finder, requirements_file, wheel +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + def get_processed_req_from_line( line: str, fname: str = "file", lineno: int = 1 diff --git a/tests/unit/test_req_file.py b/tests/unit/test_req_file.py index eb438db1902..580f65eb5cf 100644 --- a/tests/unit/test_req_file.py +++ b/tests/unit/test_req_file.py @@ -13,7 +13,6 @@ import pip._internal.req.req_file # this will be monkeypatched from pip._internal.exceptions import InstallationError, RequirementsFileParseError -from pip._internal.index.package_finder import PackageFinder from pip._internal.models.format_control import FormatControl from pip._internal.network.session import PipSession from pip._internal.req.constructors import ( @@ -28,11 +27,13 @@ parse_requirements, preprocess, ) -from pip._internal.req.req_install import InstallRequirement from tests.lib import TestData, make_test_finder, requirements_file if TYPE_CHECKING: from typing import Protocol + + from pip._internal.index.package_finder import PackageFinder + from pip._internal.req.req_install import InstallRequirement else: # Protocol was introduced in Python 3.8. Protocol = object diff --git a/tests/unit/test_resolution_legacy_resolver.py b/tests/unit/test_resolution_legacy_resolver.py index 96f93e4c27c..efc1eeaa01a 100644 --- a/tests/unit/test_resolution_legacy_resolver.py +++ b/tests/unit/test_resolution_legacy_resolver.py @@ -3,7 +3,7 @@ import email.message import logging import os -from typing import List, Optional, Type, TypeVar, cast +from typing import TYPE_CHECKING, List, Optional, Type, TypeVar, cast from unittest import mock import pytest @@ -16,7 +16,6 @@ UnsupportedPythonVersion, ) from pip._internal.metadata import BaseDistribution -from pip._internal.models.candidate import InstallationCandidate from pip._internal.req.constructors import install_req_from_line from pip._internal.req.req_set import RequirementSet from pip._internal.resolution.legacy.resolver import ( @@ -26,6 +25,9 @@ from tests.lib import TestData, make_test_finder from tests.lib.index import make_mock_candidate +if TYPE_CHECKING: + from pip._internal.models.candidate import InstallationCandidate + T = TypeVar("T") diff --git a/tests/unit/test_utils_unpacking.py b/tests/unit/test_utils_unpacking.py index 0f29df2a9bb..dc975d6b11a 100644 --- a/tests/unit/test_utils_unpacking.py +++ b/tests/unit/test_utils_unpacking.py @@ -10,13 +10,15 @@ import time import zipfile from pathlib import Path -from typing import List, Tuple +from typing import TYPE_CHECKING, List, Tuple import pytest from pip._internal.exceptions import InstallationError from pip._internal.utils.unpacking import is_within_directory, untar_file, unzip_file -from tests.lib import TestData + +if TYPE_CHECKING: + from tests.lib import TestData class TestUnpackArchives: diff --git a/tests/unit/test_utils_wheel.py b/tests/unit/test_utils_wheel.py index 4fa470611db..bc94db92649 100644 --- a/tests/unit/test_utils_wheel.py +++ b/tests/unit/test_utils_wheel.py @@ -5,14 +5,16 @@ from email import message_from_string from io import BytesIO from pathlib import Path -from typing import Callable, Iterator +from typing import TYPE_CHECKING, Callable, Iterator from zipfile import ZipFile import pytest from pip._internal.exceptions import UnsupportedWheel from pip._internal.utils import wheel -from tests.lib import TestData + +if TYPE_CHECKING: + from tests.lib import TestData _ZipDir = Callable[[Path], ZipFile] diff --git a/tests/unit/test_vcs.py b/tests/unit/test_vcs.py index 9fdac652fcb..4afb908b3f1 100644 --- a/tests/unit/test_vcs.py +++ b/tests/unit/test_vcs.py @@ -2,14 +2,13 @@ import os import pathlib -from typing import Any, Dict, List, Optional, Tuple, Type +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Type from unittest import TestCase, mock import pytest from pip._internal.exceptions import BadCommand, InstallationError from pip._internal.utils.misc import HiddenText, hide_url, hide_value -from pip._internal.utils.subprocess import CommandArgs from pip._internal.vcs import make_vcs_requirement_url from pip._internal.vcs.bazaar import Bazaar from pip._internal.vcs.git import Git, RemoteNotValidError, looks_like_hash @@ -18,6 +17,9 @@ from pip._internal.vcs.versioncontrol import RevOptions, VersionControl from tests.lib import is_svn_installed, need_svn +if TYPE_CHECKING: + from pip._internal.utils.subprocess import CommandArgs + @pytest.mark.skipif( "CI" not in os.environ, reason="Subversion is only required under CI" From f67269acf4c55472db4450b360d8a6bfe97d63fa Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 13:14:54 -0500 Subject: [PATCH 6/8] TCH002: Move third-party imports into a type-checking block --- docs/pip_sphinxext.py | 6 ++++-- src/pip/_internal/commands/index.py | 4 ++-- src/pip/_internal/exceptions.py | 5 +++-- src/pip/_internal/index/collector.py | 3 ++- src/pip/_internal/index/package_finder.py | 2 +- src/pip/_internal/metadata/base.py | 3 ++- src/pip/_internal/metadata/pkg_resources.py | 15 +++++++++++++-- src/pip/_internal/models/target_python.py | 7 ++++--- src/pip/_internal/network/auth.py | 3 ++- src/pip/_internal/network/cache.py | 6 ++++-- src/pip/_internal/network/session.py | 2 +- src/pip/_internal/req/req_install.py | 7 ++++--- src/pip/_internal/resolution/legacy/resolver.py | 3 ++- src/pip/_internal/resolution/resolvelib/base.py | 6 ++++-- .../_internal/resolution/resolvelib/factory.py | 5 +++-- .../resolution/resolvelib/requirements.py | 3 ++- .../_internal/resolution/resolvelib/resolver.py | 2 +- src/pip/_internal/utils/misc.py | 5 ++++- tests/conftest.py | 5 ++--- tools/release/__init__.py | 5 +++-- 20 files changed, 63 insertions(+), 34 deletions(-) diff --git a/docs/pip_sphinxext.py b/docs/pip_sphinxext.py index 06d3db22f2c..f076d73fb2a 100644 --- a/docs/pip_sphinxext.py +++ b/docs/pip_sphinxext.py @@ -6,17 +6,19 @@ import re import sys from textwrap import dedent -from typing import Dict, Iterable, Iterator, List, Optional, Union +from typing import TYPE_CHECKING, Dict, Iterable, Iterator, List, Optional, Union from docutils import nodes, statemachine from docutils.parsers import rst from docutils.statemachine import StringList, ViewList -from sphinx.application import Sphinx from pip._internal.cli import cmdoptions from pip._internal.commands import commands_dict, create_command from pip._internal.req.req_file import SUPPORTED_OPTIONS +if TYPE_CHECKING: + from sphinx.application import Sphinx + class PipNewsInclude(rst.Directive): required_arguments = 1 diff --git a/src/pip/_internal/commands/index.py b/src/pip/_internal/commands/index.py index 8c761d26265..88a817f1a65 100644 --- a/src/pip/_internal/commands/index.py +++ b/src/pip/_internal/commands/index.py @@ -4,8 +4,6 @@ from optparse import Values from typing import TYPE_CHECKING, Any, Iterable, List, Optional, Union -from pip._vendor.packaging.version import LegacyVersion, Version - from pip._internal.cli import cmdoptions from pip._internal.cli.req_command import IndexGroupCommand from pip._internal.cli.status_codes import ERROR, SUCCESS @@ -17,6 +15,8 @@ from pip._internal.utils.misc import write_output if TYPE_CHECKING: + from pip._vendor.packaging.version import LegacyVersion, Version + from pip._internal.models.target_python import TargetPython from pip._internal.network.session import PipSession diff --git a/src/pip/_internal/exceptions.py b/src/pip/_internal/exceptions.py index 3cd9cfeb29e..5342c145671 100644 --- a/src/pip/_internal/exceptions.py +++ b/src/pip/_internal/exceptions.py @@ -16,8 +16,6 @@ from itertools import chain, groupby, repeat from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union -from pip._vendor.requests.models import Request, Response -from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult from pip._vendor.rich.markup import escape from pip._vendor.rich.text import Text @@ -25,6 +23,9 @@ from hashlib import _Hash from typing import Literal + from pip._vendor.requests.models import Request, Response + from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult + from pip._internal.metadata import BaseDistribution from pip._internal.req.req_install import InstallRequirement diff --git a/src/pip/_internal/index/collector.py b/src/pip/_internal/index/collector.py index d0820639c3a..5e553cb7d28 100644 --- a/src/pip/_internal/index/collector.py +++ b/src/pip/_internal/index/collector.py @@ -29,7 +29,6 @@ ) from pip._vendor import requests -from pip._vendor.requests import Response from pip._vendor.requests.exceptions import RetryError, SSLError from pip._internal.exceptions import NetworkConnectionError @@ -45,6 +44,8 @@ if TYPE_CHECKING: from typing import Protocol + from pip._vendor.requests import Response + from pip._internal.network.session import PipSession else: Protocol = object diff --git a/src/pip/_internal/index/package_finder.py b/src/pip/_internal/index/package_finder.py index 84dc592459a..0027c046030 100644 --- a/src/pip/_internal/index/package_finder.py +++ b/src/pip/_internal/index/package_finder.py @@ -9,7 +9,6 @@ from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union from pip._vendor.packaging import specifiers -from pip._vendor.packaging.tags import Tag from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.version import _BaseVersion from pip._vendor.packaging.version import parse as parse_version @@ -33,6 +32,7 @@ from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS if TYPE_CHECKING: + from pip._vendor.packaging.tags import Tag from pip._vendor.typing_extensions import TypeGuard from pip._internal.models.link import Link diff --git a/src/pip/_internal/metadata/base.py b/src/pip/_internal/metadata/base.py index 87657401309..6265907bd86 100644 --- a/src/pip/_internal/metadata/base.py +++ b/src/pip/_internal/metadata/base.py @@ -24,7 +24,6 @@ Union, ) -from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._vendor.packaging.version import LegacyVersion, Version @@ -45,6 +44,8 @@ if TYPE_CHECKING: from typing import Protocol + + from pip._vendor.packaging.requirements import Requirement else: Protocol = object diff --git a/src/pip/_internal/metadata/pkg_resources.py b/src/pip/_internal/metadata/pkg_resources.py index 2b7a7aa65b6..ab2781e9105 100644 --- a/src/pip/_internal/metadata/pkg_resources.py +++ b/src/pip/_internal/metadata/pkg_resources.py @@ -5,10 +5,18 @@ import logging import os import zipfile -from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional +from typing import ( + TYPE_CHECKING, + Collection, + Iterable, + Iterator, + List, + Mapping, + NamedTuple, + Optional, +) from pip._vendor import pkg_resources -from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._vendor.packaging.version import parse as parse_version @@ -26,6 +34,9 @@ Wheel, ) +if TYPE_CHECKING: + from pip._vendor.packaging.requirements import Requirement + __all__ = ["NAME", "Distribution", "Environment"] logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/models/target_python.py b/src/pip/_internal/models/target_python.py index 4f729e97fa3..94fea04d204 100644 --- a/src/pip/_internal/models/target_python.py +++ b/src/pip/_internal/models/target_python.py @@ -1,13 +1,14 @@ from __future__ import annotations import sys -from typing import List, Optional, Set, Tuple - -from pip._vendor.packaging.tags import Tag +from typing import TYPE_CHECKING, List, Optional, Set, Tuple from pip._internal.utils.compatibility_tags import get_supported, version_info_to_nodot from pip._internal.utils.misc import normalize_version_info +if TYPE_CHECKING: + from pip._vendor.packaging.tags import Tag + class TargetPython: diff --git a/src/pip/_internal/network/auth.py b/src/pip/_internal/network/auth.py index 64cb503df2c..72d1cb71e98 100644 --- a/src/pip/_internal/network/auth.py +++ b/src/pip/_internal/network/auth.py @@ -19,7 +19,6 @@ from typing import Any, Dict, List, NamedTuple, Optional, Tuple from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth -from pip._vendor.requests.models import Request, Response from pip._vendor.requests.utils import get_netrc_auth from pip._internal.utils.logging import getLogger @@ -32,6 +31,8 @@ ) if typing.TYPE_CHECKING: + from pip._vendor.requests.models import Request, Response + from pip._internal.vcs.versioncontrol import AuthInfo logger = getLogger(__name__) diff --git a/src/pip/_internal/network/cache.py b/src/pip/_internal/network/cache.py index 705eba2781a..4beeac2b8c4 100644 --- a/src/pip/_internal/network/cache.py +++ b/src/pip/_internal/network/cache.py @@ -5,15 +5,17 @@ import os from contextlib import contextmanager from datetime import datetime -from typing import BinaryIO, Generator, Optional, Union +from typing import TYPE_CHECKING, BinaryIO, Generator, Optional, Union from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache from pip._vendor.cachecontrol.caches import SeparateBodyFileCache -from pip._vendor.requests.models import Response from pip._internal.utils.filesystem import adjacent_tmp_file, replace from pip._internal.utils.misc import ensure_dir +if TYPE_CHECKING: + from pip._vendor.requests.models import Response + def is_from_cache(response: Response) -> bool: return getattr(response, "from_cache", False) diff --git a/src/pip/_internal/network/session.py b/src/pip/_internal/network/session.py index 58381c8d3d0..15d398bd6a2 100644 --- a/src/pip/_internal/network/session.py +++ b/src/pip/_internal/network/session.py @@ -35,7 +35,6 @@ from pip._vendor.requests.adapters import HTTPAdapter as _BaseHTTPAdapter from pip._vendor.requests.models import PreparedRequest, Response from pip._vendor.requests.structures import CaseInsensitiveDict -from pip._vendor.urllib3.connectionpool import ConnectionPool from pip._vendor.urllib3.exceptions import InsecureRequestWarning from pip import __version__ @@ -52,6 +51,7 @@ if TYPE_CHECKING: from ssl import SSLContext + from pip._vendor.urllib3.connectionpool import ConnectionPool from pip._vendor.urllib3.poolmanager import PoolManager from pip._internal.models.link import Link diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 44e65664b68..4d7a55f476c 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -21,13 +21,10 @@ Union, ) -from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.version import Version from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment from pip._internal.exceptions import InstallationError, PreviousBuildDirError @@ -71,6 +68,10 @@ from pip._internal.vcs import vcs if TYPE_CHECKING: + from pip._vendor.packaging.markers import Marker + from pip._vendor.packaging.specifiers import SpecifierSet + from pip._vendor.pyproject_hooks import BuildBackendHookCaller + from pip._internal.models.direct_url import DirectUrl logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/resolution/legacy/resolver.py b/src/pip/_internal/resolution/legacy/resolver.py index fb19d00e77c..7ba62b9923c 100644 --- a/src/pip/_internal/resolution/legacy/resolver.py +++ b/src/pip/_internal/resolution/legacy/resolver.py @@ -21,7 +21,6 @@ from typing import TYPE_CHECKING, DefaultDict, Iterable, List, Optional, Set, Tuple from pip._vendor.packaging import specifiers -from pip._vendor.packaging.requirements import Requirement from pip._internal.exceptions import ( BestVersionAlreadyInstalled, @@ -47,6 +46,8 @@ from pip._internal.utils.packaging import check_requires_python if TYPE_CHECKING: + from pip._vendor.packaging.requirements import Requirement + from pip._internal.cache import WheelCache from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution diff --git a/src/pip/_internal/resolution/resolvelib/base.py b/src/pip/_internal/resolution/resolvelib/base.py index cdc48794bf1..eefcd965fdf 100644 --- a/src/pip/_internal/resolution/resolvelib/base.py +++ b/src/pip/_internal/resolution/resolvelib/base.py @@ -1,15 +1,17 @@ from __future__ import annotations -from typing import FrozenSet, Iterable, Optional, Tuple, Union +from typing import TYPE_CHECKING, FrozenSet, Iterable, Optional, Tuple, Union from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName from pip._vendor.packaging.version import LegacyVersion, Version from pip._internal.models.link import Link, links_equivalent from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.hashes import Hashes +if TYPE_CHECKING: + from pip._vendor.packaging.utils import NormalizedName + CandidateLookup = Tuple[Optional["Candidate"], Optional[InstallRequirement]] CandidateVersion = Union[LegacyVersion, Version] diff --git a/src/pip/_internal/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py index e0fba63d88f..e48795037a5 100644 --- a/src/pip/_internal/resolution/resolvelib/factory.py +++ b/src/pip/_internal/resolution/resolvelib/factory.py @@ -21,9 +21,7 @@ ) from pip._vendor.packaging.requirements import InvalidRequirement -from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name -from pip._vendor.resolvelib import ResolutionImpossible from pip._internal.exceptions import ( DistributionNotFound, @@ -69,6 +67,9 @@ if TYPE_CHECKING: from typing import Protocol + from pip._vendor.packaging.specifiers import SpecifierSet + from pip._vendor.resolvelib import ResolutionImpossible + from pip._internal.cache import CacheEntry, WheelCache from pip._internal.index.package_finder import PackageFinder from pip._internal.operations.prepare import RequirementPreparer diff --git a/src/pip/_internal/resolution/resolvelib/requirements.py b/src/pip/_internal/resolution/resolvelib/requirements.py index 2d90d538596..54e7f15732c 100644 --- a/src/pip/_internal/resolution/resolvelib/requirements.py +++ b/src/pip/_internal/resolution/resolvelib/requirements.py @@ -2,7 +2,6 @@ from typing import TYPE_CHECKING -from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._internal.req.constructors import install_req_drop_extras @@ -10,6 +9,8 @@ from .base import Candidate, CandidateLookup, Requirement, format_name if TYPE_CHECKING: + from pip._vendor.packaging.specifiers import SpecifierSet + from pip._internal.req.req_install import InstallRequirement diff --git a/src/pip/_internal/resolution/resolvelib/resolver.py b/src/pip/_internal/resolution/resolvelib/resolver.py index 49d7aab4759..5d73ee2688c 100644 --- a/src/pip/_internal/resolution/resolvelib/resolver.py +++ b/src/pip/_internal/resolution/resolvelib/resolver.py @@ -9,7 +9,6 @@ from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible from pip._vendor.resolvelib import Resolver as RLResolver -from pip._vendor.resolvelib.structs import DirectedGraph from pip._internal.req.constructors import install_req_extend_extras from pip._internal.req.req_set import RequirementSet @@ -25,6 +24,7 @@ if TYPE_CHECKING: from pip._vendor.resolvelib.resolvers import Result as RLResult + from pip._vendor.resolvelib.structs import DirectedGraph from pip._internal.cache import WheelCache from pip._internal.index.package_finder import PackageFinder diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py index f7fff449672..69925a9b847 100644 --- a/src/pip/_internal/utils/misc.py +++ b/src/pip/_internal/utils/misc.py @@ -19,6 +19,7 @@ from pathlib import Path from types import FunctionType, TracebackType from typing import ( + TYPE_CHECKING, Any, BinaryIO, Callable, @@ -37,7 +38,6 @@ cast, ) -from pip._vendor.packaging.requirements import Requirement from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed @@ -47,6 +47,9 @@ from pip._internal.utils.compat import WINDOWS from pip._internal.utils.virtualenv import running_under_virtualenv +if TYPE_CHECKING: + from pip._vendor.packaging.requirements import Requirement + __all__ = [ "rmtree", "display_path", diff --git a/tests/conftest.py b/tests/conftest.py index 6dfa0646e7d..2b335256a55 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -37,11 +37,8 @@ # Config will be available from the public API in pytest >= 7.0.0: # https://github.com/pytest-dev/pytest/commit/88d84a57916b592b070f4201dc84f0286d1f9fef -from _pytest.config import Config - # Parser will be available from the public API in pytest >= 7.0.0: # https://github.com/pytest-dev/pytest/commit/538b5c24999e9ebb4fab43faabc8bcc28737bcdf -from _pytest.config.argparsing import Parser from installer import install from installer.destinations import SchemeDictionaryDestination from installer.sources import WheelFile @@ -62,6 +59,8 @@ from tests.lib.venv import VirtualEnvironment, VirtualEnvironmentType if TYPE_CHECKING: + from _pytest.config import Config + from _pytest.config.argparsing import Parser from pip._vendor.typing_extensions import Self diff --git a/tools/release/__init__.py b/tools/release/__init__.py index 3151ca2e587..6a9b9009c00 100644 --- a/tools/release/__init__.py +++ b/tools/release/__init__.py @@ -9,9 +9,10 @@ import pathlib import subprocess import tempfile -from typing import Iterator, List, Optional, Set +from typing import TYPE_CHECKING, Iterator, List, Optional, Set -from nox.sessions import Session +if TYPE_CHECKING: + from nox.sessions import Session def get_version_from_arguments(session: Session) -> Optional[str]: From f2fa680f77172aabbfaf04ddceb912b9bfec4e32 Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 13:16:53 -0500 Subject: [PATCH 7/8] TCH003: Move standard library imports into a type-checking block --- src/pip/_internal/build_env.py | 3 ++- src/pip/_internal/cli/req_command.py | 2 +- src/pip/_internal/commands/cache.py | 6 ++++-- src/pip/_internal/commands/check.py | 6 ++++-- src/pip/_internal/commands/completion.py | 6 ++++-- src/pip/_internal/commands/configuration.py | 6 ++++-- src/pip/_internal/commands/debug.py | 5 +++-- src/pip/_internal/commands/download.py | 6 ++++-- src/pip/_internal/commands/freeze.py | 6 ++++-- src/pip/_internal/commands/hash.py | 6 ++++-- src/pip/_internal/commands/help.py | 6 ++++-- src/pip/_internal/commands/index.py | 3 ++- src/pip/_internal/commands/inspect.py | 6 ++++-- src/pip/_internal/commands/list.py | 3 ++- src/pip/_internal/commands/search.py | 2 +- src/pip/_internal/commands/show.py | 14 ++++++++++++-- src/pip/_internal/commands/uninstall.py | 6 ++++-- src/pip/_internal/commands/wheel.py | 6 ++++-- src/pip/_internal/exceptions.py | 2 +- src/pip/_internal/index/collector.py | 2 +- src/pip/_internal/locations/_distutils.py | 6 ++++-- src/pip/_internal/metadata/_json.py | 6 ++++-- src/pip/_internal/metadata/base.py | 2 +- src/pip/_internal/metadata/importlib/_compat.py | 6 ++++-- src/pip/_internal/network/cache.py | 3 ++- src/pip/_internal/operations/install/wheel.py | 2 +- src/pip/_internal/req/req_install.py | 5 +++-- src/pip/_internal/self_outdated_check.py | 3 ++- src/pip/_internal/utils/logging.py | 6 ++++-- src/pip/_internal/utils/temp_dir.py | 5 ++++- src/pip/_internal/utils/wheel.py | 6 ++++-- tests/functional/test_broken_stdout.py | 6 ++++-- tests/functional/test_completion.py | 2 +- tests/functional/test_config_settings.py | 6 ++++-- tests/functional/test_download.py | 6 ++++-- tests/functional/test_fast_deps.py | 3 ++- tests/functional/test_freeze.py | 3 ++- tests/functional/test_hash.py | 3 ++- tests/functional/test_install_compat.py | 5 ++++- tests/functional/test_install_config.py | 3 ++- tests/functional/test_install_report.py | 3 ++- tests/functional/test_install_reqs.py | 2 +- tests/functional/test_install_upgrade.py | 5 ++++- tests/functional/test_install_user.py | 3 ++- tests/functional/test_install_vcs_git.py | 6 ++++-- tests/functional/test_list.py | 5 ++++- tests/functional/test_pep517.py | 6 ++++-- tests/functional/test_pep660.py | 3 ++- tests/functional/test_pep668.py | 3 ++- tests/functional/test_pip_runner_script.py | 3 ++- tests/functional/test_python_option.py | 3 ++- tests/functional/test_show.py | 5 ++++- tests/functional/test_uninstall.py | 6 ++++-- tests/functional/test_vcs_bazaar.py | 5 ++++- tests/functional/test_vcs_git.py | 6 ++++-- tests/functional/test_vcs_subversion.py | 5 ++++- tests/functional/test_warning.py | 3 ++- tests/functional/test_wheel.py | 5 ++++- tests/lib/direct_url.py | 3 ++- tests/lib/git_submodule_helpers.py | 6 ++++-- tests/lib/options_helpers.py | 6 ++++-- tests/lib/server.py | 3 ++- tests/lib/test_wheel.py | 7 +++++-- .../resolution_resolvelib/test_requirement.py | 3 ++- tests/unit/test_base_command.py | 8 +++++--- tests/unit/test_cache.py | 5 ++++- tests/unit/test_collector.py | 6 ++++-- tests/unit/test_compat.py | 5 ++++- tests/unit/test_direct_url_helpers.py | 5 ++++- tests/unit/test_exceptions.py | 6 ++++-- tests/unit/test_format_control.py | 6 ++++-- tests/unit/test_locations.py | 6 ++++-- tests/unit/test_network_cache.py | 6 ++++-- tests/unit/test_network_session.py | 6 ++++-- tests/unit/test_operations_prepare.py | 3 ++- tests/unit/test_pep517.py | 3 ++- tests/unit/test_req_file.py | 4 ++-- tests/unit/test_req_install.py | 5 ++++- tests/unit/test_req_uninstall.py | 6 ++++-- tests/unit/test_self_check_outdated.py | 6 ++++-- tests/unit/test_utils.py | 16 ++++++++++++++-- tests/unit/test_utils_temp_dir.py | 6 ++++-- tests/unit/test_utils_unpacking.py | 3 ++- tests/unit/test_utils_virtualenv.py | 6 ++++-- tests/unit/test_vcs_mercurial.py | 5 ++++- tests/unit/test_wheel.py | 8 +++++--- tests/unit/test_wheel_builder.py | 6 ++++-- tools/protected_pip.py | 6 ++++-- 88 files changed, 301 insertions(+), 135 deletions(-) diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 530fa868589..47fb879eb55 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -9,7 +9,6 @@ import sys import textwrap from collections import OrderedDict -from types import TracebackType from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union from pip._vendor.certifi import where @@ -24,6 +23,8 @@ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds if TYPE_CHECKING: + from types import TracebackType + from pip._internal.index.package_finder import PackageFinder logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py index 35cf5bea186..773d0a734bf 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -10,7 +10,6 @@ import os import sys from functools import partial -from optparse import Values from typing import TYPE_CHECKING, Any, List, Optional, Tuple from pip._internal.cli import cmdoptions @@ -38,6 +37,7 @@ from pip._internal.utils.virtualenv import running_under_virtualenv if TYPE_CHECKING: + from optparse import Values from ssl import SSLContext from pip._internal.cache import WheelCache diff --git a/src/pip/_internal/commands/cache.py b/src/pip/_internal/commands/cache.py index 8f33539b5a4..7cf7a57a06d 100644 --- a/src/pip/_internal/commands/cache.py +++ b/src/pip/_internal/commands/cache.py @@ -2,8 +2,7 @@ import os import textwrap -from optparse import Values -from typing import Any, List +from typing import TYPE_CHECKING, Any, List from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import ERROR, SUCCESS @@ -11,6 +10,9 @@ from pip._internal.utils import filesystem from pip._internal.utils.logging import getLogger +if TYPE_CHECKING: + from optparse import Values + logger = getLogger(__name__) diff --git a/src/pip/_internal/commands/check.py b/src/pip/_internal/commands/check.py index 7146b3fbc20..4f2420d712b 100644 --- a/src/pip/_internal/commands/check.py +++ b/src/pip/_internal/commands/check.py @@ -1,8 +1,7 @@ from __future__ import annotations import logging -from optparse import Values -from typing import List +from typing import TYPE_CHECKING, List from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import ERROR, SUCCESS @@ -13,6 +12,9 @@ ) from pip._internal.utils.misc import write_output +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/completion.py b/src/pip/_internal/commands/completion.py index 8676ef8abdd..8f27e4569a5 100644 --- a/src/pip/_internal/commands/completion.py +++ b/src/pip/_internal/commands/completion.py @@ -2,13 +2,15 @@ import sys import textwrap -from optparse import Values -from typing import List +from typing import TYPE_CHECKING, List from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import SUCCESS from pip._internal.utils.misc import get_prog +if TYPE_CHECKING: + from optparse import Values + BASE_COMPLETION = """ # pip {shell} completion start{script}# pip {shell} completion end """ diff --git a/src/pip/_internal/commands/configuration.py b/src/pip/_internal/commands/configuration.py index 30da9532126..b0b7d7c08dc 100644 --- a/src/pip/_internal/commands/configuration.py +++ b/src/pip/_internal/commands/configuration.py @@ -3,8 +3,7 @@ import logging import os import subprocess -from optparse import Values -from typing import Any, List, Optional +from typing import TYPE_CHECKING, Any, List, Optional from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import ERROR, SUCCESS @@ -18,6 +17,9 @@ from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import get_prog, write_output +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/debug.py b/src/pip/_internal/commands/debug.py index f67291dde34..2987e6073d9 100644 --- a/src/pip/_internal/commands/debug.py +++ b/src/pip/_internal/commands/debug.py @@ -5,8 +5,6 @@ import logging import os import sys -from optparse import Values -from types import ModuleType from typing import TYPE_CHECKING, Any, Dict, List, Optional import pip._vendor @@ -22,6 +20,9 @@ from pip._internal.utils.misc import get_pip_version if TYPE_CHECKING: + from optparse import Values + from types import ModuleType + from pip._internal.configuration import Configuration logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/download.py b/src/pip/_internal/commands/download.py index 687bfe25faf..80e4f365cbb 100644 --- a/src/pip/_internal/commands/download.py +++ b/src/pip/_internal/commands/download.py @@ -2,8 +2,7 @@ import logging import os -from optparse import Values -from typing import List +from typing import TYPE_CHECKING, List from pip._internal.cli import cmdoptions from pip._internal.cli.cmdoptions import make_target_python @@ -14,6 +13,9 @@ from pip._internal.utils.misc import ensure_dir, normalize_path, write_output from pip._internal.utils.temp_dir import TempDirectory +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/freeze.py b/src/pip/_internal/commands/freeze.py index 2181f7614c4..87d40778af4 100644 --- a/src/pip/_internal/commands/freeze.py +++ b/src/pip/_internal/commands/freeze.py @@ -1,8 +1,7 @@ from __future__ import annotations import sys -from optparse import Values -from typing import AbstractSet, List +from typing import TYPE_CHECKING, AbstractSet, List from pip._internal.cli import cmdoptions from pip._internal.cli.base_command import Command @@ -10,6 +9,9 @@ from pip._internal.operations.freeze import freeze from pip._internal.utils.compat import stdlib_pkgs +if TYPE_CHECKING: + from optparse import Values + def _should_suppress_build_backends() -> bool: return sys.version_info < (3, 12) diff --git a/src/pip/_internal/commands/hash.py b/src/pip/_internal/commands/hash.py index 814d389648a..0c96128856e 100644 --- a/src/pip/_internal/commands/hash.py +++ b/src/pip/_internal/commands/hash.py @@ -3,14 +3,16 @@ import hashlib import logging import sys -from optparse import Values -from typing import List +from typing import TYPE_CHECKING, List from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import ERROR, SUCCESS from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES from pip._internal.utils.misc import read_chunks, write_output +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/help.py b/src/pip/_internal/commands/help.py index 7540fec1625..81524e43d95 100644 --- a/src/pip/_internal/commands/help.py +++ b/src/pip/_internal/commands/help.py @@ -1,12 +1,14 @@ from __future__ import annotations -from optparse import Values -from typing import List +from typing import TYPE_CHECKING, List from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import SUCCESS from pip._internal.exceptions import CommandError +if TYPE_CHECKING: + from optparse import Values + class HelpCommand(Command): """Show help for commands""" diff --git a/src/pip/_internal/commands/index.py b/src/pip/_internal/commands/index.py index 88a817f1a65..01e7961686a 100644 --- a/src/pip/_internal/commands/index.py +++ b/src/pip/_internal/commands/index.py @@ -1,7 +1,6 @@ from __future__ import annotations import logging -from optparse import Values from typing import TYPE_CHECKING, Any, Iterable, List, Optional, Union from pip._internal.cli import cmdoptions @@ -15,6 +14,8 @@ from pip._internal.utils.misc import write_output if TYPE_CHECKING: + from optparse import Values + from pip._vendor.packaging.version import LegacyVersion, Version from pip._internal.models.target_python import TargetPython diff --git a/src/pip/_internal/commands/inspect.py b/src/pip/_internal/commands/inspect.py index af32cf828a1..f1194bf5a85 100644 --- a/src/pip/_internal/commands/inspect.py +++ b/src/pip/_internal/commands/inspect.py @@ -1,8 +1,7 @@ from __future__ import annotations import logging -from optparse import Values -from typing import Any, Dict, List +from typing import TYPE_CHECKING, Any, Dict, List from pip._vendor.packaging.markers import default_environment from pip._vendor.rich import print_json @@ -15,6 +14,9 @@ from pip._internal.utils.compat import stdlib_pkgs from pip._internal.utils.urls import path_to_url +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/list.py b/src/pip/_internal/commands/list.py index 6a2660e76ff..0471792e69c 100644 --- a/src/pip/_internal/commands/list.py +++ b/src/pip/_internal/commands/list.py @@ -2,7 +2,6 @@ import json import logging -from optparse import Values from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast from pip._vendor.packaging.utils import canonicalize_name @@ -19,6 +18,8 @@ from pip._internal.utils.misc import tabulate, write_output if TYPE_CHECKING: + from optparse import Values + from pip._internal.metadata.base import DistributionVersion from pip._internal.network.session import PipSession diff --git a/src/pip/_internal/commands/search.py b/src/pip/_internal/commands/search.py index 854924c6004..d357eca6bc9 100644 --- a/src/pip/_internal/commands/search.py +++ b/src/pip/_internal/commands/search.py @@ -6,7 +6,6 @@ import textwrap import xmlrpc.client from collections import OrderedDict -from optparse import Values from typing import TYPE_CHECKING, Dict, List, Optional from pip._vendor.packaging.version import parse as parse_version @@ -22,6 +21,7 @@ from pip._internal.utils.misc import write_output if TYPE_CHECKING: + from optparse import Values from typing import TypedDict class TransformedHit(TypedDict): diff --git a/src/pip/_internal/commands/show.py b/src/pip/_internal/commands/show.py index 5d5ce310898..4153e2869f5 100644 --- a/src/pip/_internal/commands/show.py +++ b/src/pip/_internal/commands/show.py @@ -1,8 +1,15 @@ from __future__ import annotations import logging -from optparse import Values -from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional +from typing import ( + TYPE_CHECKING, + Generator, + Iterable, + Iterator, + List, + NamedTuple, + Optional, +) from pip._vendor.packaging.utils import canonicalize_name @@ -11,6 +18,9 @@ from pip._internal.metadata import BaseDistribution, get_default_environment from pip._internal.utils.misc import write_output +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/uninstall.py b/src/pip/_internal/commands/uninstall.py index 6e74fe7f57e..b5573d421c3 100644 --- a/src/pip/_internal/commands/uninstall.py +++ b/src/pip/_internal/commands/uninstall.py @@ -1,8 +1,7 @@ from __future__ import annotations import logging -from optparse import Values -from typing import List +from typing import TYPE_CHECKING, List from pip._vendor.packaging.utils import canonicalize_name @@ -21,6 +20,9 @@ protect_pip_from_modification_on_windows, ) +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/commands/wheel.py b/src/pip/_internal/commands/wheel.py index feef2c914c5..535651f4466 100644 --- a/src/pip/_internal/commands/wheel.py +++ b/src/pip/_internal/commands/wheel.py @@ -3,8 +3,7 @@ import logging import os import shutil -from optparse import Values -from typing import List +from typing import TYPE_CHECKING, List from pip._internal.cache import WheelCache from pip._internal.cli import cmdoptions @@ -20,6 +19,9 @@ from pip._internal.utils.temp_dir import TempDirectory from pip._internal.wheel_builder import build, should_build_for_wheel_command +if TYPE_CHECKING: + from optparse import Values + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/exceptions.py b/src/pip/_internal/exceptions.py index 5342c145671..d5124ce3e3e 100644 --- a/src/pip/_internal/exceptions.py +++ b/src/pip/_internal/exceptions.py @@ -10,7 +10,6 @@ import contextlib import locale import logging -import pathlib import re import sys from itertools import chain, groupby, repeat @@ -20,6 +19,7 @@ from pip._vendor.rich.text import Text if TYPE_CHECKING: + import pathlib from hashlib import _Hash from typing import Literal diff --git a/src/pip/_internal/index/collector.py b/src/pip/_internal/index/collector.py index 5e553cb7d28..86957469361 100644 --- a/src/pip/_internal/index/collector.py +++ b/src/pip/_internal/index/collector.py @@ -13,7 +13,6 @@ import urllib.parse import urllib.request from html.parser import HTMLParser -from optparse import Values from typing import ( TYPE_CHECKING, Callable, @@ -42,6 +41,7 @@ from .sources import CandidatesFromPage, LinkSource, build_source if TYPE_CHECKING: + from optparse import Values from typing import Protocol from pip._vendor.requests import Response diff --git a/src/pip/_internal/locations/_distutils.py b/src/pip/_internal/locations/_distutils.py index aec7e685989..d70a43d539a 100644 --- a/src/pip/_internal/locations/_distutils.py +++ b/src/pip/_internal/locations/_distutils.py @@ -19,11 +19,10 @@ import logging import os import sys -from distutils.cmd import Command as DistutilsCommand from distutils.command.install import SCHEME_KEYS from distutils.command.install import install as distutils_install_command from distutils.sysconfig import get_python_lib -from typing import Dict, List, Optional, Union, cast +from typing import TYPE_CHECKING, Dict, List, Optional, Union, cast from pip._internal.models.scheme import Scheme from pip._internal.utils.compat import WINDOWS @@ -31,6 +30,9 @@ from .base import get_major_minor_version +if TYPE_CHECKING: + from distutils.cmd import Command as DistutilsCommand + logger = logging.getLogger(__name__) diff --git a/src/pip/_internal/metadata/_json.py b/src/pip/_internal/metadata/_json.py index f545dc2e6b7..f77c0a49715 100644 --- a/src/pip/_internal/metadata/_json.py +++ b/src/pip/_internal/metadata/_json.py @@ -2,8 +2,10 @@ from __future__ import annotations from email.header import Header, decode_header, make_header -from email.message import Message -from typing import Any, Dict, List, Union +from typing import TYPE_CHECKING, Any, Dict, List, Union + +if TYPE_CHECKING: + from email.message import Message METADATA_FIELDS = [ # Name, Multiple-Use diff --git a/src/pip/_internal/metadata/base.py b/src/pip/_internal/metadata/base.py index 6265907bd86..1ab3e57f561 100644 --- a/src/pip/_internal/metadata/base.py +++ b/src/pip/_internal/metadata/base.py @@ -1,7 +1,6 @@ from __future__ import annotations import csv -import email.message import functools import json import logging @@ -43,6 +42,7 @@ from ._json import msg_to_json if TYPE_CHECKING: + import email.message from typing import Protocol from pip._vendor.packaging.requirements import Requirement diff --git a/src/pip/_internal/metadata/importlib/_compat.py b/src/pip/_internal/metadata/importlib/_compat.py index eaed4624f2f..9dd4c0f9ca8 100644 --- a/src/pip/_internal/metadata/importlib/_compat.py +++ b/src/pip/_internal/metadata/importlib/_compat.py @@ -1,7 +1,9 @@ from __future__ import annotations -import importlib.metadata -from typing import Any, Optional, Protocol, cast +from typing import TYPE_CHECKING, Any, Optional, Protocol, cast + +if TYPE_CHECKING: + import importlib.metadata class BadMetadata(ValueError): diff --git a/src/pip/_internal/network/cache.py b/src/pip/_internal/network/cache.py index 4beeac2b8c4..2bedcc6bd02 100644 --- a/src/pip/_internal/network/cache.py +++ b/src/pip/_internal/network/cache.py @@ -4,7 +4,6 @@ import os from contextlib import contextmanager -from datetime import datetime from typing import TYPE_CHECKING, BinaryIO, Generator, Optional, Union from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache @@ -14,6 +13,8 @@ from pip._internal.utils.misc import ensure_dir if TYPE_CHECKING: + from datetime import datetime + from pip._vendor.requests.models import Response diff --git a/src/pip/_internal/operations/install/wheel.py b/src/pip/_internal/operations/install/wheel.py index 5e35d19d911..6817f59a059 100644 --- a/src/pip/_internal/operations/install/wheel.py +++ b/src/pip/_internal/operations/install/wheel.py @@ -14,7 +14,6 @@ import sys import warnings from base64 import urlsafe_b64encode -from email.message import Message from itertools import chain, filterfalse, starmap from typing import ( IO, @@ -61,6 +60,7 @@ from pip._internal.utils.wheel import parse_wheel if TYPE_CHECKING: + from email.message import Message from typing import Protocol class File(Protocol): diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 4d7a55f476c..338c3be2793 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -7,8 +7,6 @@ import sys import uuid import zipfile -from optparse import Values -from pathlib import Path from typing import ( TYPE_CHECKING, Any, @@ -68,6 +66,9 @@ from pip._internal.vcs import vcs if TYPE_CHECKING: + from optparse import Values + from pathlib import Path + from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.pyproject_hooks import BuildBackendHookCaller diff --git a/src/pip/_internal/self_outdated_check.py b/src/pip/_internal/self_outdated_check.py index c1cfd1eda94..e13bfca0a4d 100644 --- a/src/pip/_internal/self_outdated_check.py +++ b/src/pip/_internal/self_outdated_check.py @@ -5,7 +5,6 @@ import hashlib import json import logging -import optparse import os.path import sys from dataclasses import dataclass @@ -29,6 +28,8 @@ from pip._internal.utils.misc import ensure_dir if TYPE_CHECKING: + import optparse + from pip._internal.metadata.base import DistributionVersion from pip._internal.network.session import PipSession diff --git a/src/pip/_internal/utils/logging.py b/src/pip/_internal/utils/logging.py index 7503438b580..d89a21968cd 100644 --- a/src/pip/_internal/utils/logging.py +++ b/src/pip/_internal/utils/logging.py @@ -8,9 +8,8 @@ import sys import threading from dataclasses import dataclass -from io import TextIOWrapper from logging import Filter -from typing import Any, ClassVar, Generator, List, Optional, TextIO, Type +from typing import TYPE_CHECKING, Any, ClassVar, Generator, List, Optional, TextIO, Type from pip._vendor.rich.console import ( Console, @@ -30,6 +29,9 @@ from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX from pip._internal.utils.misc import ensure_dir +if TYPE_CHECKING: + from io import TextIOWrapper + _log_state = threading.local() subprocess_logger = getLogger("pip.subprocessor") diff --git a/src/pip/_internal/utils/temp_dir.py b/src/pip/_internal/utils/temp_dir.py index ce3aee3e1a1..72fe09515db 100644 --- a/src/pip/_internal/utils/temp_dir.py +++ b/src/pip/_internal/utils/temp_dir.py @@ -7,8 +7,8 @@ import tempfile import traceback from contextlib import ExitStack, contextmanager -from pathlib import Path from typing import ( + TYPE_CHECKING, Any, Callable, Dict, @@ -21,6 +21,9 @@ from pip._internal.utils.misc import enum, rmtree +if TYPE_CHECKING: + from pathlib import Path + logger = logging.getLogger(__name__) _T = TypeVar("_T", bound="TempDirectory") diff --git a/src/pip/_internal/utils/wheel.py b/src/pip/_internal/utils/wheel.py index e3d3ae0587b..249048bb37e 100644 --- a/src/pip/_internal/utils/wheel.py +++ b/src/pip/_internal/utils/wheel.py @@ -3,15 +3,17 @@ from __future__ import annotations import logging -from email.message import Message from email.parser import Parser -from typing import Tuple +from typing import TYPE_CHECKING, Tuple from zipfile import BadZipFile, ZipFile from pip._vendor.packaging.utils import canonicalize_name from pip._internal.exceptions import UnsupportedWheel +if TYPE_CHECKING: + from email.message import Message + VERSION_COMPATIBLE = (1, 0) diff --git a/tests/functional/test_broken_stdout.py b/tests/functional/test_broken_stdout.py index 7e130e50bcd..3b454c81109 100644 --- a/tests/functional/test_broken_stdout.py +++ b/tests/functional/test_broken_stdout.py @@ -2,8 +2,10 @@ import os import subprocess -from pathlib import Path -from typing import List, Tuple +from typing import TYPE_CHECKING, List, Tuple + +if TYPE_CHECKING: + from pathlib import Path _BROKEN_STDOUT_RETURN_CODE = 120 diff --git a/tests/functional/test_completion.py b/tests/functional/test_completion.py index 5d9c512eb8b..2b0b659b52d 100644 --- a/tests/functional/test_completion.py +++ b/tests/functional/test_completion.py @@ -2,12 +2,12 @@ import os import sys -from pathlib import Path from typing import TYPE_CHECKING, Tuple, Union import pytest if TYPE_CHECKING: + from pathlib import Path from typing import Protocol from tests.lib import PipTestEnvironment, ScriptFactory, TestData, TestPipResult diff --git a/tests/functional/test_config_settings.py b/tests/functional/test_config_settings.py index 201d89c9a1e..ede471e953a 100644 --- a/tests/functional/test_config_settings.py +++ b/tests/functional/test_config_settings.py @@ -2,13 +2,15 @@ import json import tarfile -from pathlib import Path -from typing import List, Optional, Tuple +from typing import TYPE_CHECKING, List, Optional, Tuple from zipfile import ZipFile from pip._internal.utils.urls import path_to_url from tests.lib import PipTestEnvironment, create_basic_sdist_for_package +if TYPE_CHECKING: + from pathlib import Path + PYPROJECT_TOML = """\ [build-system] requires = [] diff --git a/tests/functional/test_download.py b/tests/functional/test_download.py index f55ca60bd7d..e15431e35ca 100644 --- a/tests/functional/test_download.py +++ b/tests/functional/test_download.py @@ -1,13 +1,12 @@ from __future__ import annotations -import http.server import os import re import shutil import textwrap from hashlib import sha256 from pathlib import Path -from typing import Callable, List, Tuple +from typing import TYPE_CHECKING, Callable, List, Tuple import pytest @@ -23,6 +22,9 @@ ) from tests.lib.server import MockServer, file_response +if TYPE_CHECKING: + import http.server + def fake_wheel(data: TestData, wheel_path: str) -> None: wheel_name = os.path.basename(wheel_path) diff --git a/tests/functional/test_fast_deps.py b/tests/functional/test_fast_deps.py index b928376e612..28c628e928e 100644 --- a/tests/functional/test_fast_deps.py +++ b/tests/functional/test_fast_deps.py @@ -3,7 +3,6 @@ import fnmatch import json import os -import pathlib import re from os.path import basename from typing import TYPE_CHECKING, Iterable @@ -14,6 +13,8 @@ from pip._internal.utils.misc import hash_file if TYPE_CHECKING: + import pathlib + from tests.lib import PipTestEnvironment, TestData, TestPipResult diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py index 4e422341a8d..88e53d3c012 100644 --- a/tests/functional/test_freeze.py +++ b/tests/functional/test_freeze.py @@ -5,7 +5,6 @@ import sys import textwrap from doctest import ELLIPSIS, OutputChecker -from pathlib import Path from typing import TYPE_CHECKING import pytest @@ -28,6 +27,8 @@ from tests.lib.direct_url import get_created_direct_url_path if TYPE_CHECKING: + from pathlib import Path + from tests.lib.venv import VirtualEnvironment distribute_re = re.compile("^distribute==[0-9.]+\n", re.MULTILINE) diff --git a/tests/functional/test_hash.py b/tests/functional/test_hash.py index ce7aca2e659..5a5cf86d431 100644 --- a/tests/functional/test_hash.py +++ b/tests/functional/test_hash.py @@ -1,10 +1,11 @@ """Tests for the ``pip hash`` command""" from __future__ import annotations -from pathlib import Path from typing import TYPE_CHECKING if TYPE_CHECKING: + from pathlib import Path + from tests.lib import PipTestEnvironment diff --git a/tests/functional/test_install_compat.py b/tests/functional/test_install_compat.py index 7dbf142bebe..bd8e9376ba2 100644 --- a/tests/functional/test_install_compat.py +++ b/tests/functional/test_install_compat.py @@ -5,7 +5,7 @@ from __future__ import annotations import os -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -16,6 +16,9 @@ pyversion, ) +if TYPE_CHECKING: + from pathlib import Path + @pytest.mark.network def test_debian_egg_name_workaround( diff --git a/tests/functional/test_install_config.py b/tests/functional/test_install_config.py index ca98a0857d5..19e0c2b70f4 100644 --- a/tests/functional/test_install_config.py +++ b/tests/functional/test_install_config.py @@ -5,7 +5,6 @@ import sys import tempfile import textwrap -from pathlib import Path from typing import TYPE_CHECKING, Callable, List import pytest @@ -20,6 +19,8 @@ ) if TYPE_CHECKING: + from pathlib import Path + from tests.lib import CertFactory, PipTestEnvironment, ScriptFactory, TestData from tests.lib.venv import VirtualEnvironment diff --git a/tests/functional/test_install_report.py b/tests/functional/test_install_report.py index 6ea40dfb33d..06d488c958a 100644 --- a/tests/functional/test_install_report.py +++ b/tests/functional/test_install_report.py @@ -2,13 +2,14 @@ import json import textwrap -from pathlib import Path from typing import TYPE_CHECKING, Any, Dict, Tuple import pytest from packaging.utils import canonicalize_name if TYPE_CHECKING: + from pathlib import Path + from ..lib import PipTestEnvironment, TestData diff --git a/tests/functional/test_install_reqs.py b/tests/functional/test_install_reqs.py index 11c480a36db..d005d370984 100644 --- a/tests/functional/test_install_reqs.py +++ b/tests/functional/test_install_reqs.py @@ -3,7 +3,6 @@ import json import os import textwrap -from pathlib import Path from typing import TYPE_CHECKING, Any import pytest @@ -21,6 +20,7 @@ from tests.lib.local_repos import local_checkout if TYPE_CHECKING: + from pathlib import Path from typing import Protocol else: Protocol = object diff --git a/tests/functional/test_install_upgrade.py b/tests/functional/test_install_upgrade.py index e07a209d744..4c5f88dc830 100644 --- a/tests/functional/test_install_upgrade.py +++ b/tests/functional/test_install_upgrade.py @@ -4,7 +4,7 @@ import os import sys import textwrap -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -18,6 +18,9 @@ from tests.lib.local_repos import local_checkout from tests.lib.wheel import make_wheel +if TYPE_CHECKING: + from pathlib import Path + @pytest.mark.network def test_no_upgrade_unless_requested(script: PipTestEnvironment) -> None: diff --git a/tests/functional/test_install_user.py b/tests/functional/test_install_user.py index ecbe4c52f4b..b9a2b70d3f6 100644 --- a/tests/functional/test_install_user.py +++ b/tests/functional/test_install_user.py @@ -6,7 +6,6 @@ import os import textwrap from os.path import curdir, isdir, isfile -from pathlib import Path from typing import TYPE_CHECKING import pytest @@ -21,6 +20,8 @@ from tests.lib.local_repos import local_checkout if TYPE_CHECKING: + from pathlib import Path + from tests.lib.venv import VirtualEnvironment diff --git a/tests/functional/test_install_vcs_git.py b/tests/functional/test_install_vcs_git.py index 01309ea6022..e165b39a725 100644 --- a/tests/functional/test_install_vcs_git.py +++ b/tests/functional/test_install_vcs_git.py @@ -1,7 +1,6 @@ from __future__ import annotations -from pathlib import Path -from typing import Optional +from typing import TYPE_CHECKING, Optional import pytest @@ -18,6 +17,9 @@ ) from tests.lib.local_repos import local_checkout +if TYPE_CHECKING: + from pathlib import Path + def _get_editable_repo_dir(script: PipTestEnvironment, package_name: str) -> Path: """ diff --git a/tests/functional/test_list.py b/tests/functional/test_list.py index 85111d3fec1..5efbcead4d6 100644 --- a/tests/functional/test_list.py +++ b/tests/functional/test_list.py @@ -2,7 +2,7 @@ import json import os -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -17,6 +17,9 @@ ) from tests.lib.direct_url import get_created_direct_url_path +if TYPE_CHECKING: + from pathlib import Path + @pytest.fixture(scope="session") def simple_script( diff --git a/tests/functional/test_pep517.py b/tests/functional/test_pep517.py index 17b529abfe3..c3e70aff2c3 100644 --- a/tests/functional/test_pep517.py +++ b/tests/functional/test_pep517.py @@ -1,8 +1,7 @@ from __future__ import annotations import os -from pathlib import Path -from typing import Any, Dict, List, Optional, Tuple +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple import pytest import tomli_w @@ -16,6 +15,9 @@ make_test_finder, ) +if TYPE_CHECKING: + from pathlib import Path + def make_project( tmpdir: Path, diff --git a/tests/functional/test_pep660.py b/tests/functional/test_pep660.py index 92f143de403..6311b9cd61d 100644 --- a/tests/functional/test_pep660.py +++ b/tests/functional/test_pep660.py @@ -1,12 +1,13 @@ from __future__ import annotations import os -from pathlib import Path from typing import TYPE_CHECKING, Any, Dict import tomli_w if TYPE_CHECKING: + from pathlib import Path + from tests.lib import PipTestEnvironment SETUP_PY = """ diff --git a/tests/functional/test_pep668.py b/tests/functional/test_pep668.py index b9dfc2248c2..2ed96b6320f 100644 --- a/tests/functional/test_pep668.py +++ b/tests/functional/test_pep668.py @@ -1,7 +1,6 @@ from __future__ import annotations import json -import pathlib import textwrap from typing import TYPE_CHECKING, List @@ -10,6 +9,8 @@ from tests.lib import PipTestEnvironment, create_basic_wheel_for_package if TYPE_CHECKING: + import pathlib + from tests.lib.venv import VirtualEnvironment diff --git a/tests/functional/test_pip_runner_script.py b/tests/functional/test_pip_runner_script.py index 8e463f3cca4..817c6905b4c 100644 --- a/tests/functional/test_pip_runner_script.py +++ b/tests/functional/test_pip_runner_script.py @@ -1,12 +1,13 @@ from __future__ import annotations import os -from pathlib import Path from typing import TYPE_CHECKING from pip import __version__ if TYPE_CHECKING: + from pathlib import Path + from tests.lib import PipTestEnvironment diff --git a/tests/functional/test_python_option.py b/tests/functional/test_python_option.py index 8fa217cc391..303c15db55b 100644 --- a/tests/functional/test_python_option.py +++ b/tests/functional/test_python_option.py @@ -2,11 +2,12 @@ import json import os -from pathlib import Path from typing import TYPE_CHECKING from venv import EnvBuilder if TYPE_CHECKING: + from pathlib import Path + from tests.lib import PipTestEnvironment, TestData diff --git a/tests/functional/test_show.py b/tests/functional/test_show.py index f5678c2a2cd..06826c43d8f 100644 --- a/tests/functional/test_show.py +++ b/tests/functional/test_show.py @@ -1,9 +1,9 @@ from __future__ import annotations import os -import pathlib import re import textwrap +from typing import TYPE_CHECKING from pip import __version__ from pip._internal.commands.show import search_packages_info @@ -15,6 +15,9 @@ pyversion, ) +if TYPE_CHECKING: + import pathlib + def test_basic_show(script: PipTestEnvironment) -> None: """ diff --git a/tests/functional/test_uninstall.py b/tests/functional/test_uninstall.py index 378864e1cd9..218a174afa6 100644 --- a/tests/functional/test_uninstall.py +++ b/tests/functional/test_uninstall.py @@ -5,9 +5,8 @@ import sys import textwrap from os.path import join, normpath -from pathlib import Path from tempfile import mkdtemp -from typing import Any, Iterator +from typing import TYPE_CHECKING, Any, Iterator from unittest.mock import Mock import pytest @@ -23,6 +22,9 @@ ) from tests.lib.local_repos import local_checkout, local_repo +if TYPE_CHECKING: + from pathlib import Path + @pytest.mark.network def test_basic_uninstall(script: PipTestEnvironment) -> None: diff --git a/tests/functional/test_vcs_bazaar.py b/tests/functional/test_vcs_bazaar.py index dcb253c4c74..ddcb71f074b 100644 --- a/tests/functional/test_vcs_bazaar.py +++ b/tests/functional/test_vcs_bazaar.py @@ -5,7 +5,7 @@ import os import sys -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -13,6 +13,9 @@ from pip._internal.vcs.versioncontrol import RemoteNotFoundError from tests.lib import PipTestEnvironment, is_bzr_installed, need_bzr +if TYPE_CHECKING: + from pathlib import Path + @pytest.mark.skipif( sys.platform == "win32" or "CI" not in os.environ, diff --git a/tests/functional/test_vcs_git.py b/tests/functional/test_vcs_git.py index 27c693dc2cd..28d50bf89cf 100644 --- a/tests/functional/test_vcs_git.py +++ b/tests/functional/test_vcs_git.py @@ -5,8 +5,7 @@ import logging import os -import pathlib -from typing import List, Optional, Tuple +from typing import TYPE_CHECKING, List, Optional, Tuple from unittest.mock import Mock, patch import pytest @@ -16,6 +15,9 @@ from pip._internal.vcs.git import Git, RemoteNotFoundError from tests.lib import PipTestEnvironment, _create_test_package, _git_commit +if TYPE_CHECKING: + import pathlib + def test_get_backend_for_scheme() -> None: assert vcs.get_backend_for_scheme("git+https") is vcs.get_backend("Git") diff --git a/tests/functional/test_vcs_subversion.py b/tests/functional/test_vcs_subversion.py index 1cb07a586af..5c1787b59cd 100644 --- a/tests/functional/test_vcs_subversion.py +++ b/tests/functional/test_vcs_subversion.py @@ -1,6 +1,6 @@ from __future__ import annotations -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -8,6 +8,9 @@ from pip._internal.vcs.versioncontrol import RemoteNotFoundError from tests.lib import PipTestEnvironment, _create_svn_repo, need_svn +if TYPE_CHECKING: + from pathlib import Path + @need_svn def test_get_remote_url__no_remote(script: PipTestEnvironment, tmpdir: Path) -> None: diff --git a/tests/functional/test_warning.py b/tests/functional/test_warning.py index 45fc7bfe53f..1f82423cde4 100644 --- a/tests/functional/test_warning.py +++ b/tests/functional/test_warning.py @@ -3,12 +3,13 @@ import os import sys import textwrap -from pathlib import Path from typing import TYPE_CHECKING import pytest if TYPE_CHECKING: + from pathlib import Path + from tests.lib import PipTestEnvironment diff --git a/tests/functional/test_wheel.py b/tests/functional/test_wheel.py index e2ef0e17256..0b4387cb41c 100644 --- a/tests/functional/test_wheel.py +++ b/tests/functional/test_wheel.py @@ -4,7 +4,7 @@ import os import re import sys -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -15,6 +15,9 @@ pyversion, ) +if TYPE_CHECKING: + from pathlib import Path + def add_files_to_dist_directory(folder: Path) -> None: (folder / "dist").mkdir(parents=True) diff --git a/tests/lib/direct_url.py b/tests/lib/direct_url.py index e9e55c9577c..4d4bd28cbeb 100644 --- a/tests/lib/direct_url.py +++ b/tests/lib/direct_url.py @@ -2,12 +2,13 @@ import os import re -from pathlib import Path from typing import TYPE_CHECKING, Optional from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl if TYPE_CHECKING: + from pathlib import Path + from tests.lib import TestPipResult diff --git a/tests/lib/git_submodule_helpers.py b/tests/lib/git_submodule_helpers.py index b279642145f..2ef523666e5 100644 --- a/tests/lib/git_submodule_helpers.py +++ b/tests/lib/git_submodule_helpers.py @@ -2,11 +2,13 @@ import os import textwrap -from pathlib import Path -from typing import Tuple +from typing import TYPE_CHECKING, Tuple from tests.lib import PipTestEnvironment, _create_main_file, _git_commit +if TYPE_CHECKING: + from pathlib import Path + def _create_test_package_submodule(env: PipTestEnvironment) -> Path: env.scratch_path.joinpath("version_pkg_submodule").mkdir() diff --git a/tests/lib/options_helpers.py b/tests/lib/options_helpers.py index cd73ad83a7f..7b86178a64c 100644 --- a/tests/lib/options_helpers.py +++ b/tests/lib/options_helpers.py @@ -2,13 +2,15 @@ """ from __future__ import annotations -from optparse import Values -from typing import List, Tuple +from typing import TYPE_CHECKING, List, Tuple from pip._internal.cli import cmdoptions from pip._internal.cli.base_command import Command from pip._internal.commands import CommandInfo, commands_dict +if TYPE_CHECKING: + from optparse import Values + class FakeCommand(Command): def main( # type: ignore[override] diff --git a/tests/lib/server.py b/tests/lib/server.py index b95ad6d40ff..03fbf473028 100644 --- a/tests/lib/server.py +++ b/tests/lib/server.py @@ -1,6 +1,5 @@ from __future__ import annotations -import pathlib import ssl import threading from base64 import b64encode @@ -15,6 +14,8 @@ from .compat import blocked_signals if TYPE_CHECKING: + import pathlib + from _typeshed.wsgi import StartResponse, WSGIApplication, WSGIEnvironment Body = Iterable[bytes] diff --git a/tests/lib/test_wheel.py b/tests/lib/test_wheel.py index 5de79eac118..f26cfcb63af 100644 --- a/tests/lib/test_wheel.py +++ b/tests/lib/test_wheel.py @@ -4,9 +4,8 @@ import csv from email import message_from_string -from email.message import Message from functools import partial -from pathlib import Path +from typing import TYPE_CHECKING from zipfile import ZipFile from tests.lib.wheel import ( @@ -18,6 +17,10 @@ message_from_dict, ) +if TYPE_CHECKING: + from email.message import Message + from pathlib import Path + def test_message_from_dict_one_value() -> None: message = message_from_dict({"a": "1"}) diff --git a/tests/unit/resolution_resolvelib/test_requirement.py b/tests/unit/resolution_resolvelib/test_requirement.py index 63c694a400d..b17a6a4133e 100644 --- a/tests/unit/resolution_resolvelib/test_requirement.py +++ b/tests/unit/resolution_resolvelib/test_requirement.py @@ -1,7 +1,6 @@ from __future__ import annotations import os -from pathlib import Path from typing import TYPE_CHECKING, Iterator, List, Tuple import pytest @@ -10,6 +9,8 @@ from pip._internal.resolution.resolvelib.base import Candidate, Constraint, Requirement if TYPE_CHECKING: + from pathlib import Path + from pip._internal.resolution.resolvelib.factory import Factory from pip._internal.resolution.resolvelib.provider import PipProvider from tests.lib import TestData diff --git a/tests/unit/test_base_command.py b/tests/unit/test_base_command.py index 340705c6b7f..7c42b38ea59 100644 --- a/tests/unit/test_base_command.py +++ b/tests/unit/test_base_command.py @@ -3,9 +3,7 @@ import logging import os import time -from optparse import Values -from pathlib import Path -from typing import Callable, Iterator, List, NoReturn, Optional +from typing import TYPE_CHECKING, Callable, Iterator, List, NoReturn, Optional from unittest.mock import Mock, patch import pytest @@ -16,6 +14,10 @@ from pip._internal.utils.logging import BrokenStdoutLoggingError from pip._internal.utils.temp_dir import TempDirectory +if TYPE_CHECKING: + from optparse import Values + from pathlib import Path + @pytest.fixture def fixed_time() -> Iterator[None]: diff --git a/tests/unit/test_cache.py b/tests/unit/test_cache.py index 1e21cb7c7be..3891ca345a5 100644 --- a/tests/unit/test_cache.py +++ b/tests/unit/test_cache.py @@ -1,7 +1,7 @@ from __future__ import annotations import os -from pathlib import Path +from typing import TYPE_CHECKING from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version @@ -9,6 +9,9 @@ from pip._internal.models.link import Link from pip._internal.utils.misc import ensure_dir +if TYPE_CHECKING: + from pathlib import Path + def test_falsey_path_none() -> None: wc = WheelCache("") diff --git a/tests/unit/test_collector.py b/tests/unit/test_collector.py index 589d8eb326a..6903dad7b49 100644 --- a/tests/unit/test_collector.py +++ b/tests/unit/test_collector.py @@ -6,9 +6,8 @@ import os import re import uuid -from pathlib import Path from textwrap import dedent -from typing import Dict, List, Optional, Tuple +from typing import TYPE_CHECKING, Dict, List, Optional, Tuple from unittest import mock import pytest @@ -39,6 +38,9 @@ from pip._internal.network.session import PipSession from tests.lib import TestData, make_test_link_collector +if TYPE_CHECKING: + from pathlib import Path + ACCEPT = ", ".join( [ "application/vnd.pypi.simple.v1+json", diff --git a/tests/unit/test_compat.py b/tests/unit/test_compat.py index 94c8657aa7b..6ad0fdbc422 100644 --- a/tests/unit/test_compat.py +++ b/tests/unit/test_compat.py @@ -1,12 +1,15 @@ from __future__ import annotations import os -from pathlib import Path +from typing import TYPE_CHECKING import pytest from pip._internal.utils.compat import get_path_uid +if TYPE_CHECKING: + from pathlib import Path + def test_get_path_uid() -> None: path = os.getcwd() diff --git a/tests/unit/test_direct_url_helpers.py b/tests/unit/test_direct_url_helpers.py index 36c8a4ba5d4..1eb89add11f 100644 --- a/tests/unit/test_direct_url_helpers.py +++ b/tests/unit/test_direct_url_helpers.py @@ -2,7 +2,7 @@ import os from functools import partial -from pathlib import Path +from typing import TYPE_CHECKING from unittest import mock from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo @@ -13,6 +13,9 @@ ) from pip._internal.vcs.git import Git +if TYPE_CHECKING: + from pathlib import Path + def test_as_pep440_requirement_archive() -> None: direct_url = DirectUrl( diff --git a/tests/unit/test_exceptions.py b/tests/unit/test_exceptions.py index 36be7bcab5e..92198f6566d 100644 --- a/tests/unit/test_exceptions.py +++ b/tests/unit/test_exceptions.py @@ -4,16 +4,18 @@ import io import locale import logging -import pathlib import sys import textwrap -from typing import Optional, Tuple +from typing import TYPE_CHECKING, Optional, Tuple import pytest from pip._vendor import rich from pip._internal.exceptions import DiagnosticPipError, ExternallyManagedEnvironment +if TYPE_CHECKING: + import pathlib + class TestDiagnosticPipErrorCreation: def test_fails_without_reference(self) -> None: diff --git a/tests/unit/test_format_control.py b/tests/unit/test_format_control.py index a85d00b0013..f8b76c589e6 100644 --- a/tests/unit/test_format_control.py +++ b/tests/unit/test_format_control.py @@ -1,7 +1,6 @@ from __future__ import annotations -from optparse import Values -from typing import FrozenSet, List, Set +from typing import TYPE_CHECKING, FrozenSet, List, Set import pytest @@ -10,6 +9,9 @@ from pip._internal.cli.status_codes import SUCCESS from pip._internal.models.format_control import FormatControl +if TYPE_CHECKING: + from optparse import Values + class SimpleCommand(Command): def __init__(self) -> None: diff --git a/tests/unit/test_locations.py b/tests/unit/test_locations.py index 15fe1724dbf..b2993d7e168 100644 --- a/tests/unit/test_locations.py +++ b/tests/unit/test_locations.py @@ -10,14 +10,16 @@ import sys import sysconfig import tempfile -from pathlib import Path -from typing import Any, Dict +from typing import TYPE_CHECKING, Any, Dict from unittest.mock import Mock import pytest from pip._internal.locations import SCHEME_KEYS, _should_use_sysconfig, get_scheme +if TYPE_CHECKING: + from pathlib import Path + if sys.platform == "win32": pwd = Mock() else: diff --git a/tests/unit/test_network_cache.py b/tests/unit/test_network_cache.py index 7310b5f2613..d501388b837 100644 --- a/tests/unit/test_network_cache.py +++ b/tests/unit/test_network_cache.py @@ -1,8 +1,7 @@ from __future__ import annotations import os -from pathlib import Path -from typing import Iterator +from typing import TYPE_CHECKING, Iterator from unittest.mock import Mock import pytest @@ -10,6 +9,9 @@ from pip._internal.network.cache import SafeFileCache +if TYPE_CHECKING: + from pathlib import Path + @pytest.fixture(scope="function") def cache_tmpdir(tmpdir: Path) -> Iterator[Path]: diff --git a/tests/unit/test_network_session.py b/tests/unit/test_network_session.py index 78421c5ad10..ede35845397 100644 --- a/tests/unit/test_network_session.py +++ b/tests/unit/test_network_session.py @@ -2,8 +2,7 @@ import logging import os -from pathlib import Path -from typing import Any, List, Optional +from typing import TYPE_CHECKING, Any, List, Optional from urllib.parse import urlparse from urllib.request import getproxies @@ -14,6 +13,9 @@ from pip._internal.models.link import Link from pip._internal.network.session import CI_ENVIRONMENT_VARIABLES, PipSession +if TYPE_CHECKING: + from pathlib import Path + def get_user_agent() -> str: return PipSession().headers["User-Agent"] diff --git a/tests/unit/test_operations_prepare.py b/tests/unit/test_operations_prepare.py index d8e3ab0768e..57f3982c6d5 100644 --- a/tests/unit/test_operations_prepare.py +++ b/tests/unit/test_operations_prepare.py @@ -2,7 +2,6 @@ import os import shutil -from pathlib import Path from shutil import rmtree from tempfile import mkdtemp from typing import TYPE_CHECKING, Any, Dict @@ -19,6 +18,8 @@ from tests.lib.requests_mocks import MockResponse if TYPE_CHECKING: + from pathlib import Path + from tests.lib import TestData diff --git a/tests/unit/test_pep517.py b/tests/unit/test_pep517.py index d4217fbad49..28098824a6e 100644 --- a/tests/unit/test_pep517.py +++ b/tests/unit/test_pep517.py @@ -1,7 +1,6 @@ from __future__ import annotations import os -from pathlib import Path from textwrap import dedent from typing import TYPE_CHECKING @@ -11,6 +10,8 @@ from pip._internal.req import InstallRequirement if TYPE_CHECKING: + from pathlib import Path + from tests.lib import TestData diff --git a/tests/unit/test_req_file.py b/tests/unit/test_req_file.py index 580f65eb5cf..1f7ab484865 100644 --- a/tests/unit/test_req_file.py +++ b/tests/unit/test_req_file.py @@ -4,8 +4,6 @@ import logging import os import textwrap -from optparse import Values -from pathlib import Path from typing import TYPE_CHECKING, Any, Iterator, List, Optional, Tuple, Union from unittest import mock @@ -30,6 +28,8 @@ from tests.lib import TestData, make_test_finder, requirements_file if TYPE_CHECKING: + from optparse import Values + from pathlib import Path from typing import Protocol from pip._internal.index.package_finder import PackageFinder diff --git a/tests/unit/test_req_install.py b/tests/unit/test_req_install.py index 05fdf4976f1..1de9457845e 100644 --- a/tests/unit/test_req_install.py +++ b/tests/unit/test_req_install.py @@ -2,7 +2,7 @@ import os import tempfile -from pathlib import Path +from typing import TYPE_CHECKING import pytest from pip._vendor.packaging.requirements import Requirement @@ -14,6 +14,9 @@ ) from pip._internal.req.req_install import InstallRequirement +if TYPE_CHECKING: + from pathlib import Path + class TestInstallRequirementBuildDirectory: # no need to test symlinks on Windows diff --git a/tests/unit/test_req_uninstall.py b/tests/unit/test_req_uninstall.py index 1e44092b9de..f872dea4a07 100644 --- a/tests/unit/test_req_uninstall.py +++ b/tests/unit/test_req_uninstall.py @@ -2,8 +2,7 @@ import os import sys -from pathlib import Path -from typing import Iterator, List, Optional, Tuple +from typing import TYPE_CHECKING, Iterator, List, Optional, Tuple from unittest.mock import Mock import pytest @@ -20,6 +19,9 @@ ) from tests.lib import create_file +if TYPE_CHECKING: + from pathlib import Path + # Pretend all files are local, so UninstallPathSet accepts files in the tmpdir, # outside the virtualenv diff --git a/tests/unit/test_self_check_outdated.py b/tests/unit/test_self_check_outdated.py index bc77aa0c41f..9850fe81afc 100644 --- a/tests/unit/test_self_check_outdated.py +++ b/tests/unit/test_self_check_outdated.py @@ -6,8 +6,7 @@ import os import sys from optparse import Values -from pathlib import Path -from typing import Optional +from typing import TYPE_CHECKING, Optional from unittest.mock import ANY, Mock, patch import pytest @@ -16,6 +15,9 @@ from pip._internal import self_outdated_check +if TYPE_CHECKING: + from pathlib import Path + @pytest.mark.parametrize( ["key", "expected"], diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 144384b3f71..c0ccc4e5ac6 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -11,8 +11,17 @@ import sys import time from io import BytesIO -from pathlib import Path -from typing import Any, Callable, Iterator, List, NoReturn, Optional, Tuple, Type +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Iterator, + List, + NoReturn, + Optional, + Tuple, + Type, +) from unittest.mock import Mock, patch import pytest @@ -52,6 +61,9 @@ ) from pip._internal.utils.setuptools_build import make_setuptools_shim_args +if TYPE_CHECKING: + from pathlib import Path + class Tests_EgglinkPath: "util.egg_link_path_from_location() tests" diff --git a/tests/unit/test_utils_temp_dir.py b/tests/unit/test_utils_temp_dir.py index 3d903bb072e..f62b5eb551a 100644 --- a/tests/unit/test_utils_temp_dir.py +++ b/tests/unit/test_utils_temp_dir.py @@ -4,8 +4,7 @@ import os import stat import tempfile -from pathlib import Path -from typing import Any, Iterator, Optional, Union +from typing import TYPE_CHECKING, Any, Iterator, Optional, Union from unittest import mock import pytest @@ -21,6 +20,9 @@ tempdir_registry, ) +if TYPE_CHECKING: + from pathlib import Path + # No need to test symlinked directories on Windows @pytest.mark.skipif("sys.platform == 'win32'") diff --git a/tests/unit/test_utils_unpacking.py b/tests/unit/test_utils_unpacking.py index dc975d6b11a..57aec73abfc 100644 --- a/tests/unit/test_utils_unpacking.py +++ b/tests/unit/test_utils_unpacking.py @@ -9,7 +9,6 @@ import tempfile import time import zipfile -from pathlib import Path from typing import TYPE_CHECKING, List, Tuple import pytest @@ -18,6 +17,8 @@ from pip._internal.utils.unpacking import is_within_directory, untar_file, unzip_file if TYPE_CHECKING: + from pathlib import Path + from tests.lib import TestData diff --git a/tests/unit/test_utils_virtualenv.py b/tests/unit/test_utils_virtualenv.py index 1bd4f9ee0d1..0055ae830fa 100644 --- a/tests/unit/test_utils_virtualenv.py +++ b/tests/unit/test_utils_virtualenv.py @@ -4,13 +4,15 @@ import os import site import sys -from pathlib import Path -from typing import List, Optional +from typing import TYPE_CHECKING, List, Optional import pytest from pip._internal.utils import virtualenv +if TYPE_CHECKING: + from pathlib import Path + @pytest.mark.parametrize( "real_prefix, base_prefix, expected", diff --git a/tests/unit/test_vcs_mercurial.py b/tests/unit/test_vcs_mercurial.py index 5c1fba63159..72fbe476f32 100644 --- a/tests/unit/test_vcs_mercurial.py +++ b/tests/unit/test_vcs_mercurial.py @@ -5,12 +5,15 @@ import configparser import os -from pathlib import Path +from typing import TYPE_CHECKING from pip._internal.utils.misc import hide_url from pip._internal.vcs.mercurial import Mercurial from tests.lib import need_mercurial +if TYPE_CHECKING: + from pathlib import Path + @need_mercurial def test_mercurial_switch_updates_config_file_when_found(tmpdir: Path) -> None: diff --git a/tests/unit/test_wheel.py b/tests/unit/test_wheel.py index d7dfd8bf846..8d351a49e8a 100644 --- a/tests/unit/test_wheel.py +++ b/tests/unit/test_wheel.py @@ -4,12 +4,10 @@ import csv import logging import os -import pathlib import sys import textwrap from email import message_from_string -from pathlib import Path -from typing import Dict, List, Optional, Tuple, cast +from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, cast from unittest.mock import patch import pytest @@ -36,6 +34,10 @@ from tests.lib import DATA_DIR, TestData, assert_paths_equal from tests.lib.wheel import make_wheel +if TYPE_CHECKING: + import pathlib + from pathlib import Path + def call_get_legacy_build_wheel_path( caplog: pytest.LogCaptureFixture, names: List[str] diff --git a/tests/unit/test_wheel_builder.py b/tests/unit/test_wheel_builder.py index 86f96d3d8e1..9cfadb4cd60 100644 --- a/tests/unit/test_wheel_builder.py +++ b/tests/unit/test_wheel_builder.py @@ -2,8 +2,7 @@ import logging import os -from pathlib import Path -from typing import Optional, cast +from typing import TYPE_CHECKING, Optional, cast import pytest @@ -14,6 +13,9 @@ from pip._internal.vcs.git import Git from tests.lib import _create_test_package +if TYPE_CHECKING: + from pathlib import Path + @pytest.mark.parametrize( "s, expected", diff --git a/tools/protected_pip.py b/tools/protected_pip.py index bd2f2f80386..1aad8fc77d9 100644 --- a/tools/protected_pip.py +++ b/tools/protected_pip.py @@ -1,12 +1,14 @@ from __future__ import annotations import os -import pathlib import shutil import subprocess import sys from glob import glob -from typing import Iterable, Union +from typing import TYPE_CHECKING, Iterable, Union + +if TYPE_CHECKING: + import pathlib VIRTUAL_ENV = os.environ["VIRTUAL_ENV"] TOX_PIP_DIR = os.path.join(VIRTUAL_ENV, "pip") From 39a910af6663ca07516acbff80a01351daa4a8ef Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Thu, 25 Jan 2024 14:04:46 -0500 Subject: [PATCH 8/8] Fix test importing Link from the wrong module --- tests/unit/test_finder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_finder.py b/tests/unit/test_finder.py index 3630b462826..6aaef203147 100644 --- a/tests/unit/test_finder.py +++ b/tests/unit/test_finder.py @@ -14,10 +14,10 @@ from pip._internal.index.package_finder import ( CandidateEvaluator, InstallationCandidate, - Link, LinkEvaluator, LinkType, ) +from pip._internal.models.link import Link from pip._internal.models.target_python import TargetPython from pip._internal.req.constructors import install_req_from_line from tests.lib import TestData, make_test_finder