From e8fc9f343e173dd0a5ce966c979a5d52b40e8072 Mon Sep 17 00:00:00 2001 From: Albert Tugushev Date: Sun, 13 Nov 2022 15:12:59 +0100 Subject: [PATCH] Bump pip minimum version to `>= 22.2` --- piptools/_compat/pip_compat.py | 24 ++------------ piptools/repositories/pypi.py | 58 ++++++---------------------------- piptools/resolver.py | 13 +++----- setup.cfg | 2 +- tox.ini | 2 +- 5 files changed, 19 insertions(+), 80 deletions(-) diff --git a/piptools/_compat/pip_compat.py b/piptools/_compat/pip_compat.py index 6fe042e6d..3ce5aed1d 100644 --- a/piptools/_compat/pip_compat.py +++ b/piptools/_compat/pip_compat.py @@ -16,8 +16,6 @@ __all__ = [ - "get_build_tracker", - "update_env_context_manager", "dist_requires", "uses_pkg_resources", "Distribution", @@ -38,18 +36,6 @@ def parse_requirements( yield install_req_from_parsed_requirement(parsed_req, isolated=isolated) -if PIP_VERSION[:2] <= (22, 0): - from pip._internal.req.req_tracker import ( - get_requirement_tracker as get_build_tracker, - ) - from pip._internal.req.req_tracker import update_env_context_manager -else: - from pip._internal.operations.build.build_tracker import ( - get_build_tracker, - update_env_context_manager, - ) - - # The Distribution interface has changed between pkg_resources and # importlib.metadata, so this compat layer allows for a consistent access # pattern. In pip 22.1, importlib.metadata became the default on Python 3.11 @@ -57,14 +43,10 @@ def parse_requirements( def _uses_pkg_resources() -> bool: + from pip._internal.metadata import select_backend + from pip._internal.metadata.pkg_resources import Distribution as _Dist - if PIP_VERSION[:2] < (22, 1): - return True - else: - from pip._internal.metadata import select_backend - from pip._internal.metadata.pkg_resources import Distribution as _Dist - - return select_backend().Distribution is _Dist + return select_backend().Distribution is _Dist uses_pkg_resources = _uses_pkg_resources() diff --git a/piptools/repositories/pypi.py b/piptools/repositories/pypi.py index 44099a099..d41f46f64 100644 --- a/piptools/repositories/pypi.py +++ b/piptools/repositories/pypi.py @@ -3,7 +3,6 @@ import contextlib import hashlib import itertools -import logging import optparse import os from contextlib import contextmanager @@ -20,6 +19,7 @@ from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel from pip._internal.network.session import PipSession +from pip._internal.operations.build.build_tracker import get_build_tracker from pip._internal.req import InstallRequirement, RequirementSet from pip._internal.utils.hashes import FAVORITE_HASH from pip._internal.utils.logging import indent_log, setup_logging @@ -30,8 +30,6 @@ from pip._vendor.packaging.version import _BaseVersion from pip._vendor.requests import RequestException, Session -from .._compat import PIP_VERSION -from .._compat.pip_compat import get_build_tracker from ..exceptions import NoCandidateFound from ..logging import log from ..utils import ( @@ -94,7 +92,12 @@ def __init__(self, pip_args: list[str], cache_dir: str): self._cache_dir = normalize_path(str(cache_dir)) self._download_dir = os.path.join(self._cache_dir, "pkgs") - self._setup_logging() + # Default pip's logger is noisy, so decrease it's verbosity + setup_logging( + verbosity=log.verbosity - 1, + no_color=self.options.no_color, + user_log_file=self.options.log, + ) def clear_caches(self) -> None: rmtree(self._download_dir, ignore_errors=True) @@ -173,20 +176,13 @@ def resolve_reqs( "finder": self.finder, "use_user_site": False, "download_dir": download_dir, + "build_tracker": build_tracker, } - - if PIP_VERSION[:2] <= (22, 0): - preparer_kwargs["req_tracker"] = build_tracker - else: - preparer_kwargs["build_tracker"] = build_tracker - preparer = self.command.make_requirement_preparer(**preparer_kwargs) reqset = RequirementSet() ireq.user_supplied = True - if PIP_VERSION[:3] < (22, 1, 1): - reqset.add_requirement(ireq) - elif getattr(ireq, "name", None): + if getattr(ireq, "name", None): reqset.add_named_requirement(ireq) else: reqset.add_unnamed_requirement(ireq) @@ -446,42 +442,6 @@ def _wheel_support_index_min(self: Wheel, tags: list[Tag]) -> int: Wheel.support_index_min = original_support_index_min self._available_candidates_cache = original_cache - def _setup_logging(self) -> None: - """ - Setup pip's logger. Ensure pip is verbose same as pip-tools and sync - pip's log stream with LogContext.stream. This is only necessary for - pip<22.0. - """ - # Default pip's logger is noisy, so decrease it's verbosity - setup_logging( - verbosity=log.verbosity - 1, - no_color=self.options.no_color, - user_log_file=self.options.log, - ) - - if PIP_VERSION[0] >= 22: - return - - # Sync pip's console handler stream with LogContext.stream - logger = logging.getLogger() - for handler in logger.handlers: - if handler.name == "console": # pragma: no branch - assert isinstance(handler, logging.StreamHandler) - handler.stream = log.stream - break - else: # pragma: no cover - # There is always a console handler. This warning would be a signal that - # this block should be removed/revisited, because of pip possibly - # refactored-out logging config. - log.warning("Couldn't find a 'console' logging handler") - - # This import will fail with pip 22.1, but here we're pip<22.0 - from pip._internal.cli.progress_bars import BAR_TYPES - - # Sync pip's progress bars stream with LogContext.stream - for bar_cls in itertools.chain(*BAR_TYPES.values()): - bar_cls.file = log.stream - @contextmanager def open_local_or_remote_file(link: Link, session: Session) -> Iterator[FileStream]: diff --git a/piptools/resolver.py b/piptools/resolver.py index 3a142f6a5..750e6c993 100644 --- a/piptools/resolver.py +++ b/piptools/resolver.py @@ -10,6 +10,10 @@ import click from pip._internal.cache import WheelCache from pip._internal.exceptions import DistributionNotFound +from pip._internal.operations.build.build_tracker import ( + get_build_tracker, + update_env_context_manager, +) from pip._internal.req import InstallRequirement from pip._internal.req.constructors import install_req_from_line from pip._internal.resolution.resolvelib.base import Candidate @@ -24,8 +28,6 @@ from piptools.cache import DependencyCache from piptools.repositories.base import BaseRepository -from ._compat import PIP_VERSION -from ._compat.pip_compat import get_build_tracker, update_env_context_manager from .exceptions import PipToolsError from .logging import log from .utils import ( @@ -554,13 +556,8 @@ def resolve(self, max_rounds: int = 10) -> set[InstallRequirement]: "session": self.session, "finder": self.finder, "use_user_site": False, + "build_tracker": build_tracker, } - - if PIP_VERSION[:2] <= (22, 0): - preparer_kwargs["req_tracker"] = build_tracker - else: - preparer_kwargs["build_tracker"] = build_tracker - preparer = self.command.make_requirement_preparer(**preparer_kwargs) resolver = self.command.make_resolver( diff --git a/setup.cfg b/setup.cfg index 19ab5f81f..589680536 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,7 +34,7 @@ install_requires = # direct dependencies build click >= 7 - pip >= 21.2 + pip >= 22.2 # indirect dependencies setuptools # typically needed when pip-tools invokes setup.py wheel # pip plugin needed by pip-tools diff --git a/tox.ini b/tox.ini index e0ecfa225..18177a09b 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,7 @@ extras = testing coverage: coverage deps = - pipprevious: pip==21.3.* + pipprevious: pip==22.2.* piplatest: pip pipmain: -e git+https://github.com/pypa/pip.git@main#egg=pip setenv =