Skip to content

Commit d920881

Browse files
dimblebyradoering
authored andcommitted
simplify handling of extras
it's never None, or True, or False: it's just a (possibly-empty) collection of strings
1 parent 112fdc8 commit d920881

File tree

3 files changed

+19
-40
lines changed

3 files changed

+19
-40
lines changed

src/poetry_plugin_export/exporter.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515

1616
if TYPE_CHECKING:
17+
from collections.abc import Collection
1718
from pathlib import Path
1819

1920
from packaging.utils import NormalizedName
@@ -40,14 +41,14 @@ def __init__(self, poetry: Poetry, io: IO) -> None:
4041
self._with_hashes = True
4142
self._with_credentials = False
4243
self._with_urls = True
43-
self._extras: bool | list[NormalizedName] | None = []
44+
self._extras: Collection[NormalizedName] = ()
4445
self._groups: Iterable[str] = [MAIN_GROUP]
4546

4647
@classmethod
4748
def is_format_supported(cls, fmt: str) -> bool:
4849
return fmt in cls.EXPORT_METHODS
4950

50-
def with_extras(self, extras: bool | list[NormalizedName] | None) -> Exporter:
51+
def with_extras(self, extras: Collection[NormalizedName]) -> Exporter:
5152
self._extras = extras
5253

5354
return self

src/poetry_plugin_export/walker.py

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212

1313
if TYPE_CHECKING:
14+
from collections.abc import Collection
1415
from collections.abc import Iterable
1516
from collections.abc import Iterator
16-
from collections.abc import Sequence
1717

1818
from packaging.utils import NormalizedName
1919
from poetry.core.packages.dependency import Dependency
@@ -53,7 +53,7 @@ def get_project_dependency_packages(
5353
locker: Locker,
5454
project_requires: list[Dependency],
5555
project_python_marker: BaseMarker | None = None,
56-
extras: bool | Sequence[NormalizedName] | None = None,
56+
extras: Collection[NormalizedName] = (),
5757
) -> Iterator[DependencyPackage]:
5858
# Apply the project python marker to all requirements.
5959
if project_python_marker is not None:
@@ -67,22 +67,17 @@ def get_project_dependency_packages(
6767
repository = locker.locked_repository()
6868

6969
# Build a set of all packages required by our selected extras
70-
extra_package_names: set[str] | None = None
71-
72-
if extras is not True:
73-
locked_extras = {
74-
canonicalize_name(extra): [
75-
canonicalize_name(dependency) for dependency in dependencies
76-
]
77-
for extra, dependencies in locker.lock_data.get("extras", {}).items()
78-
}
79-
extra_package_names = set(
80-
get_extra_package_names(
81-
repository.packages,
82-
locked_extras,
83-
extras or (),
84-
)
85-
)
70+
locked_extras = {
71+
canonicalize_name(extra): [
72+
canonicalize_name(dependency) for dependency in dependencies
73+
]
74+
for extra, dependencies in locker.lock_data.get("extras", {}).items()
75+
}
76+
extra_package_names = get_extra_package_names(
77+
repository.packages,
78+
locked_extras,
79+
extras,
80+
)
8681

8782
# If a package is optional and we haven't opted in to it, do not select
8883
selected = []
@@ -92,9 +87,7 @@ def get_project_dependency_packages(
9287
except IndexError:
9388
continue
9489

95-
if extra_package_names is not None and (
96-
package.optional and package.name not in extra_package_names
97-
):
90+
if package.optional and package.name not in extra_package_names:
9891
# a package is locked as optional, but is not activated via extras
9992
continue
10093

tests/test_exporter.py

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636

3737
if TYPE_CHECKING:
38+
from collections.abc import Collection
3839
from pathlib import Path
3940

4041
from packaging.utils import NormalizedName
@@ -889,22 +890,6 @@ def test_exporter_exports_requirements_txt_without_optional_packages(
889890
@pytest.mark.parametrize(
890891
["extras", "lines"],
891892
[
892-
(
893-
None,
894-
[f"foo==1.2.3 ; {MARKER_PY}"],
895-
),
896-
(
897-
False,
898-
[f"foo==1.2.3 ; {MARKER_PY}"],
899-
),
900-
(
901-
True,
902-
[
903-
f"bar==4.5.6 ; {MARKER_PY}",
904-
f"foo==1.2.3 ; {MARKER_PY}",
905-
f"spam==0.1.0 ; {MARKER_PY}",
906-
],
907-
),
908893
(
909894
["feature-bar"],
910895
[
@@ -918,7 +903,7 @@ def test_exporter_exports_requirements_txt_without_optional_packages(
918903
def test_exporter_exports_requirements_txt_with_optional_packages(
919904
tmp_path: Path,
920905
poetry: Poetry,
921-
extras: bool | list[NormalizedName] | None,
906+
extras: Collection[NormalizedName],
922907
lines: list[str],
923908
) -> None:
924909
poetry.locker.mock_lock_data( # type: ignore[attr-defined]

0 commit comments

Comments
 (0)