This commit is contained in:
q0w 2023-11-21 10:47:50 -05:00 committed by GitHub
commit 5a59bfca5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 84 additions and 5 deletions

1
news/11157.feature.rst Normal file
View File

@ -0,0 +1 @@
Add ``--ignore-packages`` flag to ``pip check`` to ignore specific packages.

View File

@ -1,6 +1,8 @@
import functools
import logging
import operator
from optparse import Values
from typing import List
from typing import Callable, List, Optional
from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import ERROR, SUCCESS
@ -20,10 +22,36 @@ class CheckCommand(Command):
usage = """
%prog [options]"""
def add_options(self) -> None:
self.cmd_opts.add_option(
"--ignore-packages",
dest="ignore_packages",
action="append",
default=[],
help="Ignore packages.",
)
self.cmd_opts.add_option(
"--recursive-ignore",
dest="recursive_ignore",
action="store_true",
default=False,
help="Ignore sub-dependencies.",
)
self.parser.insert_option_group(0, self.cmd_opts)
def run(self, options: Values, args: List[str]) -> int:
package_set, parsing_probs = create_package_set_from_installed()
warn_legacy_versions_and_specifiers(package_set)
missing, conflicting = check_package_set(package_set)
should_ignore: Optional[Callable[[str], bool]] = (
functools.partial(operator.contains, options.ignore_packages)
if options.ignore_packages
else None
)
missing, conflicting = check_package_set(
package_set,
should_ignore,
should_ignore if options.recursive_ignore else None,
)
for project_name in missing:
version = package_set[project_name].version

View File

@ -52,12 +52,17 @@ def create_package_set_from_installed() -> Tuple[PackageSet, bool]:
def check_package_set(
package_set: PackageSet, should_ignore: Optional[Callable[[str], bool]] = None
package_set: PackageSet,
should_ignore: Optional[Callable[[str], bool]] = None,
should_ignore_dependencies: Optional[Callable[[str], bool]] = None,
) -> CheckResult:
"""Check if a package set is consistent
If should_ignore is passed, it should be a callable that takes a
package name and returns a boolean.
If should_ignore/should_ignore_dependencies is passed, it should
be a callable that takes a package name and returns a boolean.
should_ignore_dependencies should be used to filter out dependencies
of packages specified in package_set.
"""
warn_legacy_versions_and_specifiers(package_set)
@ -76,6 +81,10 @@ def check_package_set(
for req in package_detail.dependencies:
name = canonicalize_name(req.name)
if should_ignore_dependencies and should_ignore_dependencies(name):
logger.debug("%s was ignored because --recursive-ignore is set", name)
continue
# Check if it's missing
if name not in package_set:
missed = True

View File

@ -309,3 +309,44 @@ def test_check_include_work_dir_pkg(script: PipTestEnvironment) -> None:
expected_lines = ("simple 1.0 requires missing, which is not installed.",)
assert matches_expected_lines(result.stdout, expected_lines)
assert result.returncode == 1
def test_check_ignore_packages(script: PipTestEnvironment) -> None:
package_a_path = create_test_package_with_setup(
script,
name="package_A",
version="1.0",
install_requires=["missing>=1.0"],
)
# Without dependency
result = script.pip("install", "--no-index", package_a_path, "--no-deps")
assert "Successfully installed package-A-1.0" in result.stdout, str(result)
result = script.pip("check", "--ignore-packages=package-a")
expected_lines = ("No broken requirements found.",)
assert matches_expected_lines(result.stdout, expected_lines)
assert result.returncode == 0
result = script.pip("check", "--ignore-packages=missing", expect_error=True)
expected_lines = ("package-a 1.0 requires missing, which is not installed.",)
assert matches_expected_lines(result.stdout, expected_lines)
assert result.returncode == 1
def test_check_ignore_packages_recursive(script: PipTestEnvironment) -> None:
package_a_path = create_test_package_with_setup(
script,
name="package_A",
version="1.0",
install_requires=["missing>=1.0"],
)
# Without dependency
result = script.pip("install", "--no-index", package_a_path, "--no-deps")
assert "Successfully installed package-A-1.0" in result.stdout, str(result)
result = script.pip("check", "--ignore-packages=missing", "--recursive-ignore")
expected_lines = ("No broken requirements found.",)
assert matches_expected_lines(result.stdout, expected_lines)
assert result.returncode == 0