Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bump pip minimum version to >= 22.2 #1729

Merged
merged 2 commits into from
Nov 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 3 additions & 21 deletions piptools/_compat/pip_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@


__all__ = [
"get_build_tracker",
"update_env_context_manager",
"dist_requires",
"uses_pkg_resources",
"Distribution",
Expand All @@ -38,33 +36,17 @@ 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
# (and later), but is overridable. `select_backend` returns what's being used.


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()
Expand Down
58 changes: 9 additions & 49 deletions piptools/repositories/pypi.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import contextlib
import hashlib
import itertools
import logging
import optparse
import os
from contextlib import contextmanager
Expand All @@ -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
Expand All @@ -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 (
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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]:
Expand Down
13 changes: 5 additions & 8 deletions piptools/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 (
Expand Down Expand Up @@ -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(
Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down