Skip to content

Commit d53336d

Browse files
committed
Make empty specifier set consistent on pre-releases of non PEP-440 versions
1 parent 5bbfe0f commit d53336d

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/packaging/specifiers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,8 +1029,8 @@ def filter(
10291029
return (
10301030
item
10311031
for item in iterable
1032-
if (version := _coerce_version(item)) is not None
1033-
and not version.is_prerelease
1032+
if (version := _coerce_version(item)) is None
1033+
or not version.is_prerelease
10341034
)
10351035

10361036
# Finally if prereleases is None, apply PEP 440 logic:

tests/test_specifiers.py

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,20 @@ def test_specifiers_prereleases(
764764
["invalid", "foobar"],
765765
),
766766
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
767+
# Test that !== ignores prereleases parameter for non-PEP 440 versions
768+
("!=1.0", None, True, ["invalid", "foobar"], ["invalid", "foobar"]),
769+
("!=1.0", None, False, ["invalid", "foobar"], ["invalid", "foobar"]),
770+
("!=1.0", True, None, ["invalid", "foobar"], ["invalid", "foobar"]),
771+
("!=1.0", False, None, ["invalid", "foobar"], ["invalid", "foobar"]),
772+
("!=1.0", True, True, ["invalid", "foobar"], ["invalid", "foobar"]),
773+
("!=1.0", False, False, ["invalid", "foobar"], ["invalid", "foobar"]),
774+
# Test that === ignores prereleases parameter for non-PEP 440 versions
775+
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
776+
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
777+
("===foobar", True, None, ["foobar", "foo"], ["foobar"]),
778+
("===foobar", False, None, ["foobar", "foo"], ["foobar"]),
779+
("===foobar", True, True, ["foobar", "foo"], ["foobar"]),
780+
("===foobar", False, False, ["foobar", "foo"], ["foobar"]),
767781
],
768782
)
769783
def test_specifier_filter(
@@ -861,6 +875,16 @@ def test_empty_specifier(self, version: str) -> None:
861875
assert parse(version) in spec
862876
assert spec.contains(parse(version))
863877

878+
@pytest.mark.parametrize(
879+
"prereleases",
880+
[None, False, True],
881+
)
882+
def test_empty_specifier_arbitrary_string(self, prereleases):
883+
"""Test empty SpecifierSet accepts arbitrary strings."""
884+
885+
spec = SpecifierSet("", prereleases=prereleases)
886+
assert spec.contains("foobar")
887+
864888
def test_create_from_specifiers(self) -> None:
865889
spec_strs = [">=1.0", "!=1.1", "!=1.2", "<2.0"]
866890
specs = [Specifier(s) for s in spec_strs]
@@ -1078,13 +1102,13 @@ def test_specifier_contains_installed_prereleases(
10781102
(">=1.0,<=2.0", False, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]),
10791103
(">=1.0,<=2.0dev", True, False, ["1.0", "1.5a1"], ["1.0"]),
10801104
(">=1.0,<=2.0dev", False, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]),
1081-
# Test that invalid versions are discarded
1105+
# Test that invalid versions are accepted by empty SpecifierSet
10821106
("", None, None, ["invalid version"], ["invalid version"]),
1083-
("", None, False, ["invalid version"], []),
1084-
("", False, None, ["invalid version"], []),
1107+
("", None, False, ["invalid version"], ["invalid version"]),
1108+
("", False, None, ["invalid version"], ["invalid version"]),
10851109
("", None, None, ["1.0", "invalid version"], ["1.0", "invalid version"]),
1086-
("", None, False, ["1.0", "invalid version"], ["1.0"]),
1087-
("", False, None, ["1.0", "invalid version"], ["1.0"]),
1110+
("", None, False, ["1.0", "invalid version"], ["1.0", "invalid version"]),
1111+
("", False, None, ["1.0", "invalid version"], ["1.0", "invalid version"]),
10881112
# Test arbitrary equality (===)
10891113
("===foobar", None, None, ["foobar", "foo", "bar"], ["foobar"]),
10901114
("===foobar", None, None, ["foo", "bar"], []),
@@ -1134,6 +1158,20 @@ def test_specifier_contains_installed_prereleases(
11341158
["invalid", "1.0", "2.0", "3.0"],
11351159
["1.0", "3.0"],
11361160
),
1161+
# Test that != ignores prereleases parameter for non-PEP 440 versions
1162+
("!=1.0", None, True, ["invalid", "foobar"], ["invalid", "foobar"]),
1163+
("!=1.0", None, False, ["invalid", "foobar"], ["invalid", "foobar"]),
1164+
("!=1.0", True, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1165+
("!=1.0", False, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1166+
("!=1.0", True, True, ["invalid", "foobar"], ["invalid", "foobar"]),
1167+
("!=1.0", False, False, ["invalid", "foobar"], ["invalid", "foobar"]),
1168+
# Test that === ignores prereleases parameter for non-PEP 440 versions
1169+
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
1170+
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
1171+
("===foobar", True, None, ["foobar", "foo"], ["foobar"]),
1172+
("===foobar", False, None, ["foobar", "foo"], ["foobar"]),
1173+
("===foobar", True, True, ["foobar", "foo"], ["foobar"]),
1174+
("===foobar", False, False, ["foobar", "foo"], ["foobar"]),
11371175
],
11381176
)
11391177
def test_specifier_filter(

0 commit comments

Comments
 (0)