From eeb0eb8cf80dae44e3015800d2503411fdd24f7f Mon Sep 17 00:00:00 2001 From: David Hotham Date: Sun, 28 Aug 2022 12:44:37 +0100 Subject: [PATCH] simplify handling of extras it's never None, or True, or False: it's just a (possibly-empty) collection of strings --- src/poetry_plugin_export/exporter.py | 5 ++-- src/poetry_plugin_export/walker.py | 35 +++++++++++----------------- tests/test_exporter.py | 19 ++------------- 3 files changed, 19 insertions(+), 40 deletions(-) diff --git a/src/poetry_plugin_export/exporter.py b/src/poetry_plugin_export/exporter.py index 617fa23..8eda1dc 100644 --- a/src/poetry_plugin_export/exporter.py +++ b/src/poetry_plugin_export/exporter.py @@ -14,6 +14,7 @@ if TYPE_CHECKING: + from collections.abc import Collection from pathlib import Path from packaging.utils import NormalizedName @@ -40,14 +41,14 @@ def __init__(self, poetry: Poetry, io: IO) -> None: self._with_hashes = True self._with_credentials = False self._with_urls = True - self._extras: bool | list[NormalizedName] | None = [] + self._extras: Collection[NormalizedName] = () self._groups: Iterable[str] = [MAIN_GROUP] @classmethod def is_format_supported(cls, fmt: str) -> bool: return fmt in cls.EXPORT_METHODS - def with_extras(self, extras: bool | list[NormalizedName] | None) -> Exporter: + def with_extras(self, extras: Collection[NormalizedName]) -> Exporter: self._extras = extras return self diff --git a/src/poetry_plugin_export/walker.py b/src/poetry_plugin_export/walker.py index 8ec5ab9..4d295d7 100644 --- a/src/poetry_plugin_export/walker.py +++ b/src/poetry_plugin_export/walker.py @@ -11,9 +11,9 @@ if TYPE_CHECKING: + from collections.abc import Collection from collections.abc import Iterable from collections.abc import Iterator - from collections.abc import Sequence from packaging.utils import NormalizedName from poetry.core.packages.dependency import Dependency @@ -53,7 +53,7 @@ def get_project_dependency_packages( locker: Locker, project_requires: list[Dependency], project_python_marker: BaseMarker | None = None, - extras: bool | Sequence[NormalizedName] | None = None, + extras: Collection[NormalizedName] = (), ) -> Iterator[DependencyPackage]: # Apply the project python marker to all requirements. if project_python_marker is not None: @@ -67,22 +67,17 @@ def get_project_dependency_packages( repository = locker.locked_repository() # Build a set of all packages required by our selected extras - extra_package_names: set[str] | None = None - - if extras is not True: - locked_extras = { - canonicalize_name(extra): [ - canonicalize_name(dependency) for dependency in dependencies - ] - for extra, dependencies in locker.lock_data.get("extras", {}).items() - } - extra_package_names = set( - get_extra_package_names( - repository.packages, - locked_extras, - extras or (), - ) - ) + locked_extras = { + canonicalize_name(extra): [ + canonicalize_name(dependency) for dependency in dependencies + ] + for extra, dependencies in locker.lock_data.get("extras", {}).items() + } + extra_package_names = get_extra_package_names( + repository.packages, + locked_extras, + extras, + ) # If a package is optional and we haven't opted in to it, do not select selected = [] @@ -92,9 +87,7 @@ def get_project_dependency_packages( except IndexError: continue - if extra_package_names is not None and ( - package.optional and package.name not in extra_package_names - ): + if package.optional and package.name not in extra_package_names: # a package is locked as optional, but is not activated via extras continue diff --git a/tests/test_exporter.py b/tests/test_exporter.py index ee608ac..ed9dc4d 100644 --- a/tests/test_exporter.py +++ b/tests/test_exporter.py @@ -35,6 +35,7 @@ if TYPE_CHECKING: + from collections.abc import Collection from pathlib import Path from packaging.utils import NormalizedName @@ -889,22 +890,6 @@ def test_exporter_exports_requirements_txt_without_optional_packages( @pytest.mark.parametrize( ["extras", "lines"], [ - ( - None, - [f"foo==1.2.3 ; {MARKER_PY}"], - ), - ( - False, - [f"foo==1.2.3 ; {MARKER_PY}"], - ), - ( - True, - [ - f"bar==4.5.6 ; {MARKER_PY}", - f"foo==1.2.3 ; {MARKER_PY}", - f"spam==0.1.0 ; {MARKER_PY}", - ], - ), ( ["feature-bar"], [ @@ -918,7 +903,7 @@ def test_exporter_exports_requirements_txt_without_optional_packages( def test_exporter_exports_requirements_txt_with_optional_packages( tmp_path: Path, poetry: Poetry, - extras: bool | list[NormalizedName] | None, + extras: Collection[NormalizedName], lines: list[str], ) -> None: poetry.locker.mock_lock_data( # type: ignore[attr-defined]