Skip to content

Commit 6140248

Browse files
committed
Make empty specifier set consistent on pre-releases of non PEP-440 versions
1 parent 92cf198 commit 6140248

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
@@ -991,8 +991,8 @@ def filter(
991991
return (
992992
item
993993
for item in iterable
994-
if (version := _coerce_version(item)) is not None
995-
and not version.is_prerelease
994+
if (version := _coerce_version(item)) is None
995+
or not version.is_prerelease
996996
)
997997

998998
# 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
@@ -697,6 +697,20 @@ def test_specifiers_prereleases(
697697
["invalid", "foobar"],
698698
),
699699
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
700+
# Test that !== ignores prereleases parameter for non-PEP 440 versions
701+
("!=1.0", None, True, ["invalid", "foobar"], ["invalid", "foobar"]),
702+
("!=1.0", None, False, ["invalid", "foobar"], ["invalid", "foobar"]),
703+
("!=1.0", True, None, ["invalid", "foobar"], ["invalid", "foobar"]),
704+
("!=1.0", False, None, ["invalid", "foobar"], ["invalid", "foobar"]),
705+
("!=1.0", True, True, ["invalid", "foobar"], ["invalid", "foobar"]),
706+
("!=1.0", False, False, ["invalid", "foobar"], ["invalid", "foobar"]),
707+
# Test that === ignores prereleases parameter for non-PEP 440 versions
708+
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
709+
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
710+
("===foobar", True, None, ["foobar", "foo"], ["foobar"]),
711+
("===foobar", False, None, ["foobar", "foo"], ["foobar"]),
712+
("===foobar", True, True, ["foobar", "foo"], ["foobar"]),
713+
("===foobar", False, False, ["foobar", "foo"], ["foobar"]),
700714
],
701715
)
702716
def test_specifier_filter(
@@ -789,6 +803,16 @@ def test_empty_specifier(self, version):
789803
assert parse(version) in spec
790804
assert spec.contains(parse(version))
791805

806+
@pytest.mark.parametrize(
807+
"prereleases",
808+
[None, False, True],
809+
)
810+
def test_empty_specifier_arbitrary_string(self, prereleases):
811+
"""Test empty SpecifierSet accepts arbitrary strings."""
812+
813+
spec = SpecifierSet("", prereleases=prereleases)
814+
assert spec.contains("foobar")
815+
792816
def test_create_from_specifiers(self):
793817
spec_strs = [">=1.0", "!=1.1", "!=1.2", "<2.0"]
794818
specs = [Specifier(s) for s in spec_strs]
@@ -1012,13 +1036,13 @@ def test_specifier_contains_installed_prereleases(
10121036
(">=1.0,<=2.0", False, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]),
10131037
(">=1.0,<=2.0dev", True, False, ["1.0", "1.5a1"], ["1.0"]),
10141038
(">=1.0,<=2.0dev", False, True, ["1.0", "1.5a1"], ["1.0", "1.5a1"]),
1015-
# Test that invalid versions are discarded
1039+
# Test that invalid versions are accepted by empty SpecifierSet
10161040
("", None, None, ["invalid version"], ["invalid version"]),
1017-
("", None, False, ["invalid version"], []),
1018-
("", False, None, ["invalid version"], []),
1041+
("", None, False, ["invalid version"], ["invalid version"]),
1042+
("", False, None, ["invalid version"], ["invalid version"]),
10191043
("", None, None, ["1.0", "invalid version"], ["1.0", "invalid version"]),
1020-
("", None, False, ["1.0", "invalid version"], ["1.0"]),
1021-
("", False, None, ["1.0", "invalid version"], ["1.0"]),
1044+
("", None, False, ["1.0", "invalid version"], ["1.0", "invalid version"]),
1045+
("", False, None, ["1.0", "invalid version"], ["1.0", "invalid version"]),
10221046
# Test arbitrary equality (===)
10231047
("===foobar", None, None, ["foobar", "foo", "bar"], ["foobar"]),
10241048
("===foobar", None, None, ["foo", "bar"], []),
@@ -1068,6 +1092,20 @@ def test_specifier_contains_installed_prereleases(
10681092
["invalid", "1.0", "2.0", "3.0"],
10691093
["1.0", "3.0"],
10701094
),
1095+
# Test that != ignores prereleases parameter for non-PEP 440 versions
1096+
("!=1.0", None, True, ["invalid", "foobar"], ["invalid", "foobar"]),
1097+
("!=1.0", None, False, ["invalid", "foobar"], ["invalid", "foobar"]),
1098+
("!=1.0", True, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1099+
("!=1.0", False, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1100+
("!=1.0", True, True, ["invalid", "foobar"], ["invalid", "foobar"]),
1101+
("!=1.0", False, False, ["invalid", "foobar"], ["invalid", "foobar"]),
1102+
# Test that === ignores prereleases parameter for non-PEP 440 versions
1103+
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
1104+
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
1105+
("===foobar", True, None, ["foobar", "foo"], ["foobar"]),
1106+
("===foobar", False, None, ["foobar", "foo"], ["foobar"]),
1107+
("===foobar", True, True, ["foobar", "foo"], ["foobar"]),
1108+
("===foobar", False, False, ["foobar", "foo"], ["foobar"]),
10711109
],
10721110
)
10731111
def test_specifier_filter(

0 commit comments

Comments
 (0)