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..f076d73fb2a 100644 --- a/docs/pip_sphinxext.py +++ b/docs/pip_sphinxext.py @@ -1,21 +1,24 @@ """pip sphinx extensions""" +from __future__ import annotations import optparse import pathlib 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/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 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/pyproject.toml b/pyproject.toml index 7496a08ee2c..9963a1b2fe9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -168,6 +168,7 @@ select = [ "W", "RUF100", "UP032", + "TCH", ] [tool.ruff.isort] @@ -175,6 +176,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 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..47fb879eb55 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 @@ -8,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 @@ -23,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/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..b75cd2d3d2c 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 @@ -17,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 @@ -30,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/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..773d0a734bf 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -4,15 +4,14 @@ 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 import sys from functools import partial -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 @@ -20,9 +19,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, @@ -31,8 +28,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, @@ -42,8 +37,15 @@ 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 + 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/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..0d31d3cde0f 100644 --- a/src/pip/_internal/commands/__init__.py +++ b/src/pip/_internal/commands/__init__.py @@ -1,12 +1,14 @@ """ Package containing all pip commands """ +from __future__ import annotations 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/cache.py b/src/pip/_internal/commands/cache.py index 328336152cc..7cf7a57a06d 100644 --- a/src/pip/_internal/commands/cache.py +++ b/src/pip/_internal/commands/cache.py @@ -1,7 +1,8 @@ +from __future__ import annotations + 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 @@ -9,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 5efd0a34160..4f2420d712b 100644 --- a/src/pip/_internal/commands/check.py +++ b/src/pip/_internal/commands/check.py @@ -1,6 +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 @@ -11,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 9e89e279883..8f27e4569a5 100644 --- a/src/pip/_internal/commands/completion.py +++ b/src/pip/_internal/commands/completion.py @@ -1,12 +1,16 @@ +from __future__ import annotations + 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 1a1dc6b6cd8..b0b7d7c08dc 100644 --- a/src/pip/_internal/commands/configuration.py +++ b/src/pip/_internal/commands/configuration.py @@ -1,8 +1,9 @@ +from __future__ import annotations + 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 @@ -16,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 7e5271c9886..2987e6073d9 100644 --- a/src/pip/_internal/commands/debug.py +++ b/src/pip/_internal/commands/debug.py @@ -1,11 +1,11 @@ +from __future__ import annotations + import importlib.resources import locale import logging import os 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 @@ -15,11 +15,16 @@ 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 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 54247a78a65..80e4f365cbb 100644 --- a/src/pip/_internal/commands/download.py +++ b/src/pip/_internal/commands/download.py @@ -1,7 +1,8 @@ +from __future__ import annotations + 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 @@ -12,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 fd9d88a8b01..87d40778af4 100644 --- a/src/pip/_internal/commands/freeze.py +++ b/src/pip/_internal/commands/freeze.py @@ -1,6 +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 @@ -8,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 042dac813e7..0c96128856e 100644 --- a/src/pip/_internal/commands/hash.py +++ b/src/pip/_internal/commands/hash.py @@ -1,14 +1,18 @@ +from __future__ import annotations + 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 62066318b74..81524e43d95 100644 --- a/src/pip/_internal/commands/help.py +++ b/src/pip/_internal/commands/help.py @@ -1,10 +1,14 @@ -from optparse import Values -from typing import List +from __future__ import annotations + +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 f55e9e49974..01e7961686a 100644 --- a/src/pip/_internal/commands/index.py +++ b/src/pip/_internal/commands/index.py @@ -1,8 +1,7 @@ -import logging -from optparse import Values -from typing import Any, Iterable, List, Optional, Union +from __future__ import annotations -from pip._vendor.packaging.version import LegacyVersion, Version +import logging +from typing import TYPE_CHECKING, Any, Iterable, List, Optional, Union from pip._internal.cli import cmdoptions from pip._internal.cli.req_command import IndexGroupCommand @@ -12,10 +11,16 @@ 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 optparse import Values + + from pip._vendor.packaging.version import LegacyVersion, Version + + 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/inspect.py b/src/pip/_internal/commands/inspect.py index 27c8fa3d5b6..f1194bf5a85 100644 --- a/src/pip/_internal/commands/inspect.py +++ b/src/pip/_internal/commands/inspect.py @@ -1,6 +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 @@ -13,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/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..0471792e69c 100644 --- a/src/pip/_internal/commands/list.py +++ b/src/pip/_internal/commands/list.py @@ -1,6 +1,7 @@ +from __future__ import annotations + 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 @@ -13,12 +14,14 @@ 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 optparse import Values + 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/commands/search.py b/src/pip/_internal/commands/search.py index 03ed925b246..d357eca6bc9 100644 --- a/src/pip/_internal/commands/search.py +++ b/src/pip/_internal/commands/search.py @@ -1,10 +1,11 @@ +from __future__ import annotations + import logging import shutil import sys 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 @@ -20,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 3f10701f6b2..4153e2869f5 100644 --- a/src/pip/_internal/commands/show.py +++ b/src/pip/_internal/commands/show.py @@ -1,6 +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 @@ -9,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 f198fc313ff..b5573d421c3 100644 --- a/src/pip/_internal/commands/uninstall.py +++ b/src/pip/_internal/commands/uninstall.py @@ -1,6 +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 @@ -19,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 ed578aa2500..535651f4466 100644 --- a/src/pip/_internal/commands/wheel.py +++ b/src/pip/_internal/commands/wheel.py @@ -1,8 +1,9 @@ +from __future__ import annotations + 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 @@ -18,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/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..95210785e0b 100644 --- a/src/pip/_internal/distributions/__init__.py +++ b/src/pip/_internal/distributions/__init__.py @@ -1,7 +1,13 @@ -from pip._internal.distributions.base import AbstractDistribution +from __future__ import annotations + +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 6fb0d7b7772..1d30906bbe9 100644 --- a/src/pip/_internal/distributions/base.py +++ b/src/pip/_internal/distributions/base.py @@ -1,9 +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 ab8d53be740..f066cb836f6 100644 --- a/src/pip/_internal/distributions/installed.py +++ b/src/pip/_internal/distributions/installed.py @@ -1,8 +1,12 @@ -from typing import Optional +from __future__ import annotations + +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 15ff42b7b15..1f3035c9a15 100644 --- a/src/pip/_internal/distributions/sdist.py +++ b/src/pip/_internal/distributions/sdist.py @@ -1,13 +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 eb16e25cbcc..d72cef22257 100644 --- a/src/pip/_internal/distributions/wheel.py +++ b/src/pip/_internal/distributions/wheel.py @@ -1,15 +1,19 @@ -from typing import Optional +from __future__ import annotations + +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/exceptions.py b/src/pip/_internal/exceptions.py index 5007a622d82..d5124ce3e3e 100644 --- a/src/pip/_internal/exceptions.py +++ b/src/pip/_internal/exceptions.py @@ -4,26 +4,28 @@ 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 import locale import logging -import pathlib import re import sys 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 if TYPE_CHECKING: + import pathlib 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 b3e293ea3a5..86957469361 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 @@ -12,7 +13,6 @@ import urllib.parse import urllib.request from html.parser import HTMLParser -from optparse import Values from typing import ( TYPE_CHECKING, Callable, @@ -28,13 +28,11 @@ ) 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 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 @@ -43,7 +41,12 @@ from .sources import CandidatesFromPage, LinkSource, build_source if TYPE_CHECKING: + from optparse import Values 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 ec9ebc36718..0027c046030 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 @@ -8,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 @@ -22,23 +22,25 @@ 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 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 + 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/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..d70a43d539a 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): @@ -17,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 @@ -29,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/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..f77c0a49715 100644 --- a/src/pip/_internal/metadata/_json.py +++ b/src/pip/_internal/metadata/_json.py @@ -1,8 +1,11 @@ # 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 -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 92491244108..1ab3e57f561 100644 --- a/src/pip/_internal/metadata/base.py +++ b/src/pip/_internal/metadata/base.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import csv -import email.message import functools import json import logging @@ -22,7 +23,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 @@ -42,7 +42,10 @@ from ._json import msg_to_json if TYPE_CHECKING: + import email.message from typing import Protocol + + from pip._vendor.packaging.requirements import Requirement else: Protocol = object 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..9dd4c0f9ca8 100644 --- a/src/pip/_internal/metadata/importlib/_compat.py +++ b/src/pip/_internal/metadata/importlib/_compat.py @@ -1,5 +1,9 @@ -import importlib.metadata -from typing import Any, Optional, Protocol, cast +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional, Protocol, cast + +if TYPE_CHECKING: + import importlib.metadata class BadMetadata(ValueError): 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..ab2781e9105 100644 --- a/src/pip/_internal/metadata/pkg_resources.py +++ b/src/pip/_internal/metadata/pkg_resources.py @@ -1,12 +1,22 @@ +from __future__ import annotations + import email.message import email.parser 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 @@ -24,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/candidate.py b/src/pip/_internal/models/candidate.py index 9184a902aef..88efb4e2b8f 100644 --- a/src/pip/_internal/models/candidate.py +++ b/src/pip/_internal/models/candidate.py @@ -1,8 +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/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..3f9d6f15e5f 100644 --- a/src/pip/_internal/models/installation_report.py +++ b/src/pip/_internal/models/installation_report.py @@ -1,9 +1,13 @@ -from typing import Any, Dict, Sequence +from __future__ import annotations + +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/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..c6505e30852 100644 --- a/src/pip/_internal/models/selection_prefs.py +++ b/src/pip/_internal/models/selection_prefs.py @@ -1,6 +1,9 @@ -from typing import Optional +from __future__ import annotations -from pip._internal.models.format_control import FormatControl +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + from pip._internal.models.format_control import FormatControl class SelectionPreferences: diff --git a/src/pip/_internal/models/target_python.py b/src/pip/_internal/models/target_python.py index 67ea5da73a5..94fea04d204 100644 --- a/src/pip/_internal/models/target_python.py +++ b/src/pip/_internal/models/target_python.py @@ -1,11 +1,14 @@ -import sys -from typing import List, Optional, Set, Tuple +from __future__ import annotations -from pip._vendor.packaging.tags import Tag +import sys +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/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..72d1cb71e98 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 @@ -17,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 @@ -28,7 +29,11 @@ remove_auth_from_url, split_auth_netloc_from_url, ) -from pip._internal.vcs.versioncontrol import AuthInfo + +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 4d0fb545dc2..2bedcc6bd02 100644 --- a/src/pip/_internal/network/cache.py +++ b/src/pip/_internal/network/cache.py @@ -1,18 +1,22 @@ """HTTP cache implementation. """ +from __future__ import annotations 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 datetime import datetime + + 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/download.py b/src/pip/_internal/network/download.py index d1d43541e6b..dff2b47e4c7 100644 --- a/src/pip/_internal/network/download.py +++ b/src/pip/_internal/network/download.py @@ -1,22 +1,26 @@ """Download files with progress indicators. """ +from __future__ import annotations + import email.message 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 82ec50d5106..1b748beec4b 100644 --- a/src/pip/_internal/network/lazy_wheel.py +++ b/src/pip/_internal/network/lazy_wheel.py @@ -1,20 +1,23 @@ """Lazy ZIP over HTTP""" +from __future__ import annotations __all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"] 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 887dc14e796..15d398bd6a2 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 @@ -34,12 +35,10 @@ 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__ 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 @@ -52,8 +51,11 @@ 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 + logger = logging.getLogger(__name__) 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..0f40a0a520c 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 @@ -7,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: @@ -15,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 1b7fd7ab7fd..7e1e0b22593 100644 --- a/src/pip/_internal/operations/check.py +++ b/src/pip/_internal/operations/check.py @@ -1,8 +1,9 @@ """Validation of dependencies of packages """ +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 @@ -12,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/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..2f61855c5c2 100644 --- a/src/pip/_internal/operations/install/editable_legacy.py +++ b/src/pip/_internal/operations/install/editable_legacy.py @@ -1,13 +1,17 @@ """Legacy editable installation process, i.e. `setup.py develop`. """ +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/install/wheel.py b/src/pip/_internal/operations/install/wheel.py index f67180c9e65..6817f59a059 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 @@ -13,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, @@ -60,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/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 956717d1e52..f3a7ba1db22 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -3,12 +3,13 @@ # The following comment should be removed at some point in the future. # mypy: strict-optional=False +from __future__ import annotations import mimetypes 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 @@ -23,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, @@ -53,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/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..9f569220b05 100644 --- a/src/pip/_internal/req/constructors.py +++ b/src/pip/_internal/req/constructors.py @@ -7,12 +7,13 @@ These are meant to be used elsewhere within pip to create instances of InstallRequirement. """ +from __future__ import annotations import copy 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 @@ -22,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 @@ -30,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 f717c1ccc79..e64e0925a79 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 @@ -24,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 @@ -35,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 b61a219df68..338c3be2793 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 @@ -5,17 +7,22 @@ import sys import uuid 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 -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 @@ -27,7 +34,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 @@ -59,6 +65,16 @@ from pip._internal.utils.virtualenv import running_under_virtualenv 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 + + 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 1bf73d595f6..a0edd6d1de0 100644 --- a/src/pip/_internal/req/req_set.py +++ b/src/pip/_internal/req/req_set.py @@ -1,14 +1,18 @@ +from __future__ import annotations + 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 707fde1b2b9..005991134f0 100644 --- a/src/pip/_internal/req/req_uninstall.py +++ b/src/pip/_internal/req/req_uninstall.py @@ -1,13 +1,25 @@ +from __future__ import annotations + import functools import os 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 @@ -15,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 42dade18c1e..c53239dcd31 100644 --- a/src/pip/_internal/resolution/base.py +++ b/src/pip/_internal/resolution/base.py @@ -1,7 +1,11 @@ -from typing import Callable, List, Optional +from __future__ import annotations + +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 5ddb848a9bc..7ba62b9923c 100644 --- a/src/pip/_internal/resolution/legacy/resolver.py +++ b/src/pip/_internal/resolution/legacy/resolver.py @@ -12,17 +12,16 @@ # The following comment should be removed at some point in the future. # mypy: strict-optional=False +from __future__ import annotations import logging 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, @@ -32,11 +31,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, @@ -50,6 +45,15 @@ from pip._internal.utils.misc import normalize_version_info 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 + 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/base.py b/src/pip/_internal/resolution/resolvelib/base.py index 9c0ef5ca7b9..eefcd965fdf 100644 --- a/src/pip/_internal/resolution/resolvelib/base.py +++ b/src/pip/_internal/resolution/resolvelib/base.py @@ -1,13 +1,17 @@ -from typing import FrozenSet, Iterable, Optional, Tuple, Union +from __future__ import annotations + +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/candidates.py b/src/pip/_internal/resolution/resolvelib/candidates.py index 4125cda2b7c..e24e51456b2 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 @@ -10,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 4adeb4309ce..e48795037a5 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 @@ -19,11 +21,8 @@ ) 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.cache import CacheEntry, WheelCache from pip._internal.exceptions import ( DistributionNotFound, InstallationError, @@ -31,11 +30,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, @@ -44,9 +41,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 @@ -72,6 +67,15 @@ 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 + 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/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..e3e9b39d6a1 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 ( @@ -15,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 12adeff7b6e..3c872d6c033 100644 --- a/src/pip/_internal/resolution/resolvelib/reporter.py +++ b/src/pip/_internal/resolution/resolvelib/reporter.py @@ -1,10 +1,13 @@ +from __future__ import annotations + 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 4af4a9f25a6..54e7f15732c 100644 --- a/src/pip/_internal/resolution/resolvelib/requirements.py +++ b/src/pip/_internal/resolution/resolvelib/requirements.py @@ -1,11 +1,18 @@ -from pip._vendor.packaging.specifiers import SpecifierSet +from __future__ import annotations + +from typing import TYPE_CHECKING + 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._vendor.packaging.specifiers import SpecifierSet + + 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 c12beef0b2a..5d73ee2688c 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 @@ -7,13 +9,8 @@ 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.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 @@ -23,11 +20,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._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.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 0f64ae0e614..e13bfca0a4d 100644 --- a/src/pip/_internal/self_outdated_check.py +++ b/src/pip/_internal/self_outdated_check.py @@ -1,13 +1,14 @@ +from __future__ import annotations + import datetime import functools import hashlib import json import logging -import optparse 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 @@ -17,9 +18,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, @@ -28,6 +27,12 @@ from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace 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 + _WEEK = datetime.timedelta(days=7) logger = logging.getLogger(__name__) 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..9d0146ac0cd 100644 --- a/src/pip/_internal/utils/direct_url_helpers.py +++ b/src/pip/_internal/utils/direct_url_helpers.py @@ -1,10 +1,14 @@ -from typing import Optional +from __future__ import annotations + +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/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..d89a21968cd 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 @@ -6,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, @@ -28,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/misc.py b/src/pip/_internal/utils/misc.py index 1ad3f6162a2..69925a9b847 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 @@ -17,6 +19,7 @@ from pathlib import Path from types import FunctionType, TracebackType from typing import ( + TYPE_CHECKING, Any, BinaryIO, Callable, @@ -35,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 @@ -45,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/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..72fe09515db 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 @@ -5,8 +7,8 @@ import tempfile import traceback from contextlib import ExitStack, contextmanager -from pathlib import Path from typing import ( + TYPE_CHECKING, Any, Callable, Dict, @@ -19,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/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..249048bb37e 100644 --- a/src/pip/_internal/utils/wheel.py +++ b/src/pip/_internal/utils/wheel.py @@ -1,16 +1,19 @@ """Support functions for working with wheel files. """ +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/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..875ceb1e034 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 @@ -19,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, @@ -45,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 b1debe3496c..e898d06cac9 100644 --- a/src/pip/_internal/wheel_builder.py +++ b/src/pip/_internal/wheel_builder.py @@ -1,16 +1,16 @@ """Orchestrator for building wheels from InstallRequirements. """ +from __future__ import annotations import logging 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 @@ -27,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/conftest.py b/tests/conftest.py index c5bf4bb9567..2b335256a55 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import compileall import contextlib import fnmatch @@ -35,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 @@ -60,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/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..3b454c81109 100644 --- a/tests/functional/test_broken_stdout.py +++ b/tests/functional/test_broken_stdout.py @@ -1,7 +1,11 @@ +from __future__ import annotations + 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_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..5049e362a9b 100644 --- a/tests/functional/test_cli.py +++ b/tests/functional/test_cli.py @@ -1,10 +1,14 @@ """Basic CLI functionality checks. """ +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 4be033583ca..2b0b659b52d 100644 --- a/tests/functional/test_completion.py +++ b/tests/functional/test_completion.py @@ -1,14 +1,16 @@ +from __future__ import annotations + import os import sys -from pathlib import Path from typing import TYPE_CHECKING, Tuple, Union import pytest -from tests.lib import PipTestEnvironment, ScriptFactory, TestData, TestPipResult - if TYPE_CHECKING: + from pathlib import Path 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_config_settings.py b/tests/functional/test_config_settings.py index f3975de2af5..ede471e953a 100644 --- a/tests/functional/test_config_settings.py +++ b/tests/functional/test_config_settings.py @@ -1,12 +1,16 @@ +from __future__ import annotations + 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_configuration.py b/tests/functional/test_configuration.py index b3de3f697b0..7b54147bd73 100644 --- a/tests/functional/test_configuration.py +++ b/tests/functional/test_configuration.py @@ -1,13 +1,18 @@ """Tests for the config command """ +from __future__ import annotations + 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 77d4bea335f..5904df4642e 100644 --- a/tests/functional/test_debug.py +++ b/tests/functional/test_debug.py @@ -1,12 +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_download.py b/tests/functional/test_download.py index 555a1163f42..e15431e35ca 100644 --- a/tests/functional/test_download.py +++ b/tests/functional/test_download.py @@ -1,11 +1,12 @@ -import http.server +from __future__ import annotations + 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 @@ -21,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 9e529c0891e..28c628e928e 100644 --- a/tests/functional/test_fast_deps.py +++ b/tests/functional/test_fast_deps.py @@ -1,16 +1,21 @@ +from __future__ import annotations + import fnmatch import json import os -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: + import pathlib + + 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 b7af974ea61..88e53d3c012 100644 --- a/tests/functional/test_freeze.py +++ b/tests/functional/test_freeze.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import os import re import sys 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 @@ -23,7 +25,11 @@ wheel, ) from tests.lib.direct_url import get_created_direct_url_path -from tests.lib.venv import VirtualEnvironment + +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 0422f73ffa5..5a5cf86d431 100644 --- a/tests/functional/test_hash.py +++ b/tests/functional/test_hash.py @@ -1,7 +1,12 @@ """Tests for the ``pip hash`` command""" -from pathlib import Path +from __future__ import annotations -from tests.lib import PipTestEnvironment +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from pathlib import Path + + 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 75414214a93..62818915d2c 100644 --- a/tests/functional/test_help.py +++ b/tests/functional/test_help.py @@ -1,3 +1,6 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING from unittest.mock import Mock import pytest @@ -5,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 43b8f09c311..d3719841b07 100644 --- a/tests/functional/test_index.py +++ b/tests/functional/test_index.py @@ -1,8 +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 f6690fb1fb1..41bc9569b5f 100644 --- a/tests/functional/test_inspect.py +++ b/tests/functional/test_inspect.py @@ -1,8 +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.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..f520e3c5811 100644 --- a/tests/functional/test_install_cleanup.py +++ b/tests/functional/test_install_cleanup.py @@ -1,8 +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_compat.py b/tests/functional/test_install_compat.py index 6c809e75307..bd8e9376ba2 100644 --- a/tests/functional/test_install_compat.py +++ b/tests/functional/test_install_compat.py @@ -2,8 +2,10 @@ Tests for compatibility workarounds. """ +from __future__ import annotations + import os -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -14,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 7f418067f97..19e0c2b70f4 100644 --- a/tests/functional/test_install_config.py +++ b/tests/functional/test_install_config.py @@ -1,14 +1,14 @@ +from __future__ import annotations + import os import ssl import sys 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, @@ -17,7 +17,12 @@ package_page, server_running, ) -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from pathlib import Path + + 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_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..09b623a3358 100644 --- a/tests/functional/test_install_index.py +++ b/tests/functional/test_install_index.py @@ -1,7 +1,11 @@ +from __future__ import annotations + 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 a1e7f8375d9..06d488c958a 100644 --- a/tests/functional/test_install_report.py +++ b/tests/functional/test_install_report.py @@ -1,12 +1,16 @@ +from __future__ import annotations + 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 pathlib import Path + + from ..lib import PipTestEnvironment, TestData def _install_dict(report: Dict[str, Any]) -> Dict[str, Any]: diff --git a/tests/functional/test_install_reqs.py b/tests/functional/test_install_reqs.py index 993f25a2abf..d005d370984 100644 --- a/tests/functional/test_install_reqs.py +++ b/tests/functional/test_install_reqs.py @@ -1,7 +1,8 @@ +from __future__ import annotations + import json import os import textwrap -from pathlib import Path from typing import TYPE_CHECKING, Any import pytest @@ -19,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_requested.py b/tests/functional/test_install_requested.py index 2c5cad9fcc8..9b0e3a968d2 100644 --- a/tests/functional/test_install_requested.py +++ b/tests/functional/test_install_requested.py @@ -1,6 +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_upgrade.py b/tests/functional/test_install_upgrade.py index 6556fcdf599..4c5f88dc830 100644 --- a/tests/functional/test_install_upgrade.py +++ b/tests/functional/test_install_upgrade.py @@ -1,8 +1,10 @@ +from __future__ import annotations + import itertools import os import sys import textwrap -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -16,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 3cae4a467e9..b9a2b70d3f6 100644 --- a/tests/functional/test_install_user.py +++ b/tests/functional/test_install_user.py @@ -1,10 +1,12 @@ """ tests specific to "pip install --user" """ +from __future__ import annotations + import os import textwrap from os.path import curdir, isdir, isfile -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -16,7 +18,11 @@ pyversion, # noqa: F401 ) from tests.lib.local_repos import local_checkout -from tests.lib.venv import VirtualEnvironment + +if TYPE_CHECKING: + from pathlib import Path + + from tests.lib.venv import VirtualEnvironment def _patch_dist_in_site_packages(virtualenv: VirtualEnvironment) -> None: diff --git a/tests/functional/test_install_vcs_git.py b/tests/functional/test_install_vcs_git.py index e59b269a61f..e165b39a725 100644 --- a/tests/functional/test_install_vcs_git.py +++ b/tests/functional/test_install_vcs_git.py @@ -1,5 +1,6 @@ -from pathlib import Path -from typing import Optional +from __future__ import annotations + +from typing import TYPE_CHECKING, Optional import pytest @@ -16,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_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..5efbcead4d6 100644 --- a/tests/functional/test_list.py +++ b/tests/functional/test_list.py @@ -1,6 +1,8 @@ +from __future__ import annotations + import json import os -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -15,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_new_resolver.py b/tests/functional/test_new_resolver.py index afe07cbf3ec..63f3f65e957 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 @@ -7,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, @@ -15,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_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..110625fcc83 100644 --- a/tests/functional/test_new_resolver_target.py +++ b/tests/functional/test_new_resolver_target.py @@ -1,12 +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 4cd06311348..df93384131e 100644 --- a/tests/functional/test_new_resolver_user.py +++ b/tests/functional/test_new_resolver_user.py @@ -1,10 +1,15 @@ +from __future__ import annotations + 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 4094bdd167a..cf5d604a3ee 100644 --- a/tests/functional/test_no_color.py +++ b/tests/functional/test_no_color.py @@ -1,14 +1,18 @@ """ Test specific for the --no-color option """ +from __future__ import annotations + import os 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_pep517.py b/tests/functional/test_pep517.py index 78a6c2bbc6c..c3e70aff2c3 100644 --- a/tests/functional/test_pep517.py +++ b/tests/functional/test_pep517.py @@ -1,6 +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 @@ -14,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 8418b26894c..6311b9cd61d 100644 --- a/tests/functional/test_pep660.py +++ b/tests/functional/test_pep660.py @@ -1,10 +1,14 @@ +from __future__ import annotations + 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 pathlib import Path + + 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 3c1085668fc..2ed96b6320f 100644 --- a/tests/functional/test_pep668.py +++ b/tests/functional/test_pep668.py @@ -1,12 +1,17 @@ +from __future__ import annotations + 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: + import pathlib + + 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 f2f879b824d..817c6905b4c 100644 --- a/tests/functional/test_pip_runner_script.py +++ b/tests/functional/test_pip_runner_script.py @@ -1,8 +1,14 @@ +from __future__ import annotations + import os -from pathlib import Path +from typing import TYPE_CHECKING from pip import __version__ -from tests.lib import PipTestEnvironment + +if TYPE_CHECKING: + from pathlib import Path + + 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 ecfd819eb7c..303c15db55b 100644 --- a/tests/functional/test_python_option.py +++ b/tests/functional/test_python_option.py @@ -1,9 +1,14 @@ +from __future__ import annotations + 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 pathlib import Path + + 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 3f784e5dd1c..0a3721ed6cc 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 @@ -7,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_show.py b/tests/functional/test_show.py index 05fccbbe327..06826c43d8f 100644 --- a/tests/functional/test_show.py +++ b/tests/functional/test_show.py @@ -1,7 +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 @@ -13,6 +15,9 @@ pyversion, ) +if TYPE_CHECKING: + import pathlib + def test_basic_show(script: PipTestEnvironment) -> None: """ 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..218a174afa6 100644 --- a/tests/functional/test_uninstall.py +++ b/tests/functional/test_uninstall.py @@ -1,11 +1,12 @@ +from __future__ import annotations + import logging import os 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 @@ -21,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_uninstall_user.py b/tests/functional/test_uninstall_user.py index 0bf2e6d4180..60f65884f26 100644 --- a/tests/functional/test_uninstall_user.py +++ b/tests/functional/test_uninstall_user.py @@ -1,15 +1,20 @@ """ tests specific to uninstalling --user installs """ +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_vcs_bazaar.py b/tests/functional/test_vcs_bazaar.py index 63955d6e701..ddcb71f074b 100644 --- a/tests/functional/test_vcs_bazaar.py +++ b/tests/functional/test_vcs_bazaar.py @@ -1,10 +1,11 @@ """ Contains functional tests of the Bazaar class. """ +from __future__ import annotations import os import sys -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -12,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 da4d9583f0f..28d50bf89cf 100644 --- a/tests/functional/test_vcs_git.py +++ b/tests/functional/test_vcs_git.py @@ -1,10 +1,11 @@ """ Contains functional tests of the Git class. """ +from __future__ import annotations + 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 @@ -14,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_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..5c1787b59cd 100644 --- a/tests/functional/test_vcs_subversion.py +++ b/tests/functional/test_vcs_subversion.py @@ -1,4 +1,6 @@ -from pathlib import Path +from __future__ import annotations + +from typing import TYPE_CHECKING import pytest @@ -6,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 c47443ca903..1f82423cde4 100644 --- a/tests/functional/test_warning.py +++ b/tests/functional/test_warning.py @@ -1,11 +1,16 @@ +from __future__ import annotations + import os import sys import textwrap -from pathlib import Path +from typing import TYPE_CHECKING import pytest -from tests.lib import PipTestEnvironment +if TYPE_CHECKING: + from pathlib import Path + + from tests.lib import PipTestEnvironment @pytest.fixture diff --git a/tests/functional/test_wheel.py b/tests/functional/test_wheel.py index b1183fc830b..0b4387cb41c 100644 --- a/tests/functional/test_wheel.py +++ b/tests/functional/test_wheel.py @@ -1,8 +1,10 @@ """'pip wheel' tests""" +from __future__ import annotations + import os import re import sys -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -13,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/__init__.py b/tests/lib/__init__.py index ea755c83812..863e6126b38 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 @@ -39,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/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..4d4bd28cbeb 100644 --- a/tests/lib/direct_url.py +++ b/tests/lib/direct_url.py @@ -1,10 +1,15 @@ +from __future__ import annotations + 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 pathlib import Path + + from tests.lib import TestPipResult def get_created_direct_url_path(result: TestPipResult, pkg: str) -> Optional[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..2ef523666e5 100644 --- a/tests/lib/git_submodule_helpers.py +++ b/tests/lib/git_submodule_helpers.py @@ -1,10 +1,14 @@ +from __future__ import annotations + 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/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..7b86178a64c 100644 --- a/tests/lib/options_helpers.py +++ b/tests/lib/options_helpers.py @@ -1,13 +1,16 @@ """Provides helper classes for testing option handling in pip """ +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/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..03fbf473028 100644 --- a/tests/lib/server.py +++ b/tests/lib/server.py @@ -1,4 +1,5 @@ -import pathlib +from __future__ import annotations + import ssl import threading from base64 import b64encode @@ -13,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_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..f26cfcb63af 100644 --- a/tests/lib/test_wheel.py +++ b/tests/lib/test_wheel.py @@ -1,10 +1,11 @@ """Tests for wheel helper. """ +from __future__ import annotations + 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 ( @@ -16,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/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..8b869addace 100644 --- a/tests/unit/resolution_resolvelib/conftest.py +++ b/tests/unit/resolution_resolvelib/conftest.py @@ -1,4 +1,6 @@ -from typing import Iterator +from __future__ import annotations + +from typing import TYPE_CHECKING, Iterator import pytest @@ -12,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 ab1dc74caa3..eccb821274b 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 @@ -5,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 b8cd13cb566..b17a6a4133e 100644 --- a/tests/unit/resolution_resolvelib/test_requirement.py +++ b/tests/unit/resolution_resolvelib/test_requirement.py @@ -1,14 +1,19 @@ +from __future__ import annotations + 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 pathlib import Path + + 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 87c2b5f3533..5a3f6ca9eb2 100644 --- a/tests/unit/resolution_resolvelib/test_resolver.py +++ b/tests/unit/resolution_resolvelib/test_resolver.py @@ -1,4 +1,6 @@ -from typing import Dict, List, Optional, Set, Tuple, cast +from __future__ import annotations + +from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast from unittest import mock import pytest @@ -6,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 ( @@ -15,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_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..7c42b38ea59 100644 --- a/tests/unit/test_base_command.py +++ b/tests/unit/test_base_command.py @@ -1,9 +1,9 @@ +from __future__ import annotations + 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 @@ -14,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 d0fee69c39b..3891ca345a5 100644 --- a/tests/unit/test_cache.py +++ b/tests/unit/test_cache.py @@ -1,5 +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 @@ -7,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_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..6903dad7b49 100644 --- a/tests/unit/test_collector.py +++ b/tests/unit/test_collector.py @@ -1,12 +1,13 @@ +from __future__ import annotations + import itertools import json import logging 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 @@ -37,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_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..d82dff14ed9 100644 --- a/tests/unit/test_commands.py +++ b/tests/unit/test_commands.py @@ -1,9 +1,10 @@ -from typing import Callable, List +from __future__ import annotations + +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, @@ -11,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_compat.py b/tests/unit/test_compat.py index b7f46ca9000..6ad0fdbc422 100644 --- a/tests/unit/test_compat.py +++ b/tests/unit/test_compat.py @@ -1,10 +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_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..1eb89add11f 100644 --- a/tests/unit/test_direct_url_helpers.py +++ b/tests/unit/test_direct_url_helpers.py @@ -1,6 +1,8 @@ +from __future__ import annotations + 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 @@ -11,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 6510b569e5f..92198f6566d 100644 --- a/tests/unit/test_exceptions.py +++ b/tests/unit/test_exceptions.py @@ -1,18 +1,21 @@ """Tests the presentation style of exceptions.""" +from __future__ import annotations 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_finder.py b/tests/unit/test_finder.py index 3404d1498e3..6aaef203147 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 @@ -12,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 diff --git a/tests/unit/test_format_control.py b/tests/unit/test_format_control.py index 33a03729db5..f8b76c589e6 100644 --- a/tests/unit/test_format_control.py +++ b/tests/unit/test_format_control.py @@ -1,5 +1,6 @@ -from optparse import Values -from typing import FrozenSet, List, Set +from __future__ import annotations + +from typing import TYPE_CHECKING, FrozenSet, List, Set import pytest @@ -8,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_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..b2993d7e168 100644 --- a/tests/unit/test_locations.py +++ b/tests/unit/test_locations.py @@ -2,20 +2,24 @@ locations.py tests """ +from __future__ import annotations + import getpass import os import shutil 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_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..d501388b837 100644 --- a/tests/unit/test_network_cache.py +++ b/tests/unit/test_network_cache.py @@ -1,6 +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 @@ -8,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_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..824e6017b2f 100644 --- a/tests/unit/test_network_lazy_wheel.py +++ b/tests/unit/test_network_lazy_wheel.py @@ -1,4 +1,6 @@ -from typing import Iterator +from __future__ import annotations + +from typing import TYPE_CHECKING, Iterator from pip._vendor.packaging.version import Version from pytest import fixture, mark, raises @@ -9,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_network_session.py b/tests/unit/test_network_session.py index 2bb9317b762..ede35845397 100644 --- a/tests/unit/test_network_session.py +++ b/tests/unit/test_network_session.py @@ -1,7 +1,8 @@ +from __future__ import annotations + 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 @@ -12,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_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..57f3982c6d5 100644 --- a/tests/unit/test_operations_prepare.py +++ b/tests/unit/test_operations_prepare.py @@ -1,9 +1,10 @@ +from __future__ import annotations + import os import shutil -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 @@ -14,9 +15,13 @@ 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 pathlib import Path + + from tests.lib import TestData + def test_unpack_url_with_urllib_response_without_content_type(data: TestData) -> None: """ 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..28098824a6e 100644 --- a/tests/unit/test_pep517.py +++ b/tests/unit/test_pep517.py @@ -1,12 +1,18 @@ +from __future__ import annotations + 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 pathlib import Path + + from tests.lib import TestData @pytest.mark.parametrize( 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..7810d94612e 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 @@ -6,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 @@ -22,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 @@ -48,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 94ccfb98d86..1f7ab484865 100644 --- a/tests/unit/test_req_file.py +++ b/tests/unit/test_req_file.py @@ -1,9 +1,9 @@ +from __future__ import annotations + import collections 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 @@ -11,7 +11,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 ( @@ -26,11 +25,15 @@ 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 optparse import Values + from pathlib import Path 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_req_install.py b/tests/unit/test_req_install.py index 4bb71a743aa..1de9457845e 100644 --- a/tests/unit/test_req_install.py +++ b/tests/unit/test_req_install.py @@ -1,6 +1,8 @@ +from __future__ import annotations + import os import tempfile -from pathlib import Path +from typing import TYPE_CHECKING import pytest from pip._vendor.packaging.requirements import Requirement @@ -12,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 6a846e20272..f872dea4a07 100644 --- a/tests/unit/test_req_uninstall.py +++ b/tests/unit/test_req_uninstall.py @@ -1,7 +1,8 @@ +from __future__ import annotations + 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 @@ -18,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_resolution_legacy_resolver.py b/tests/unit/test_resolution_legacy_resolver.py index b2f93b3d4f5..efc1eeaa01a 100644 --- a/tests/unit/test_resolution_legacy_resolver.py +++ b/tests/unit/test_resolution_legacy_resolver.py @@ -1,7 +1,9 @@ +from __future__ import annotations + 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 @@ -14,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 ( @@ -24,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_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..9850fe81afc 100644 --- a/tests/unit/test_self_check_outdated.py +++ b/tests/unit/test_self_check_outdated.py @@ -1,11 +1,12 @@ +from __future__ import annotations + import datetime import json import logging 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 @@ -14,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_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..c0ccc4e5ac6 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 @@ -9,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 @@ -50,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_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..f62b5eb551a 100644 --- a/tests/unit/test_utils_temp_dir.py +++ b/tests/unit/test_utils_temp_dir.py @@ -1,9 +1,10 @@ +from __future__ import annotations + import itertools 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 @@ -19,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 1f0b59dbd6b..57aec73abfc 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 @@ -7,14 +9,17 @@ import tempfile 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 pathlib import Path + + from tests.lib import TestData class TestUnpackArchives: diff --git a/tests/unit/test_utils_virtualenv.py b/tests/unit/test_utils_virtualenv.py index 94461c6d89e..0055ae830fa 100644 --- a/tests/unit/test_utils_virtualenv.py +++ b/tests/unit/test_utils_virtualenv.py @@ -1,14 +1,18 @@ +from __future__ import annotations + import logging 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_utils_wheel.py b/tests/unit/test_utils_wheel.py index 4e8e72be64a..bc94db92649 100644 --- a/tests/unit/test_utils_wheel.py +++ b/tests/unit/test_utils_wheel.py @@ -1,16 +1,20 @@ +from __future__ import annotations + import os from contextlib import ExitStack 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 a52a6217e77..4afb908b3f1 100644 --- a/tests/unit/test_vcs.py +++ b/tests/unit/test_vcs.py @@ -1,13 +1,14 @@ +from __future__ import annotations + 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 @@ -16,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" diff --git a/tests/unit/test_vcs_mercurial.py b/tests/unit/test_vcs_mercurial.py index d8e8f6cad27..72fbe476f32 100644 --- a/tests/unit/test_vcs_mercurial.py +++ b/tests/unit/test_vcs_mercurial.py @@ -1,15 +1,19 @@ """ Contains functional tests of the Mercurial class. """ +from __future__ import annotations 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 33329fbce05..8d351a49e8a 100644 --- a/tests/unit/test_wheel.py +++ b/tests/unit/test_wheel.py @@ -1,13 +1,13 @@ """Tests for wheel binary packages and .dist-info.""" +from __future__ import annotations + 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 @@ -34,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 9044f945307..9cfadb4cd60 100644 --- a/tests/unit/test_wheel_builder.py +++ b/tests/unit/test_wheel_builder.py @@ -1,7 +1,8 @@ +from __future__ import annotations + import logging import os -from pathlib import Path -from typing import Optional, cast +from typing import TYPE_CHECKING, Optional, cast import pytest @@ -12,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 48230719ee2..1aad8fc77d9 100644 --- a/tools/protected_pip.py +++ b/tools/protected_pip.py @@ -1,10 +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") diff --git a/tools/release/__init__.py b/tools/release/__init__.py index ebd1b901414..6a9b9009c00 100644 --- a/tools/release/__init__.py +++ b/tools/release/__init__.py @@ -2,15 +2,17 @@ These are written according to the order they are called in. """ +from __future__ import annotations import contextlib import os 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]: 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