Skip to content

Commit 5279967

Browse files
committed
Change != to not allow invalid versions
1 parent d53336d commit 5279967

File tree

2 files changed

+26
-37
lines changed

2 files changed

+26
-37
lines changed

src/packaging/specifiers.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -639,9 +639,6 @@ def filter(
639639
version, self.version
640640
):
641641
yield version
642-
# != operator: non-version strings pass through (they're "not equal")
643-
elif self.operator == "!=":
644-
yield version
645642
elif operator_callable(parsed_version, self.version):
646643
# If it's not a prerelease or prereleases are allowed, yield it directly
647644
if not parsed_version.is_prerelease or include_prereleases:

tests/test_specifiers.py

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -516,15 +516,14 @@ def test_specifiers(self, version: str, spec_str: str, expected: bool) -> None:
516516
("spec_str", "version", "expected"),
517517
[
518518
("==1.0", "not a valid version", False),
519+
("==1.*", "not a valid version", False),
519520
(">=1.0", "not a valid version", False),
520521
(">1.0", "not a valid version", False),
521522
("<=1.0", "not a valid version", False),
522523
("<1.0", "not a valid version", False),
523524
("~=1.0", "not a valid version", False),
524-
# Test invalid versions with != (should pass as "not equal")
525-
("!=1.0", "not a valid version", True),
526-
("!=1.0", "not a valid version", True),
527-
("!=2.0.*", "not a valid version", True),
525+
("!=1.0", "not a valid version", False),
526+
("!=1.*", "not a valid version", False),
528527
# Test with arbitrary equality (===)
529528
("===invalid", "invalid", True),
530529
("===foobar", "invalid", False),
@@ -753,24 +752,24 @@ def test_specifiers_prereleases(
753752
["foobar"],
754753
),
755754
("===1.0", None, None, ["1.0", "foobar", "invalid", "1.0.0"], ["1.0"]),
756-
# Test != with invalid versions (should pass through as "not equal")
757-
("!=1.0", None, None, ["invalid", "foobar"], ["invalid", "foobar"]),
758-
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["invalid", "2.0"]),
755+
# Test != with invalid versions (should not pass as versions are not valid)
756+
("!=1.0", None, None, ["invalid", "foobar"], []),
757+
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["2.0"]),
759758
(
760759
"!=2.0.*",
761760
None,
762761
None,
763762
["invalid", "foobar", "2.0"],
764-
["invalid", "foobar"],
763+
[]
765764
),
766-
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
765+
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0"]),
767766
# 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"]),
767+
("!=1.0", None, True, ["invalid", "foobar"], []),
768+
("!=1.0", None, False, ["invalid", "foobar"], []),
769+
("!=1.0", True, None, ["invalid", "foobar"], []),
770+
("!=1.0", False, None, ["invalid", "foobar"], []),
771+
("!=1.0", True, True, ["invalid", "foobar"], []),
772+
("!=1.0", False, False, ["invalid", "foobar"], []),
774773
# Test that === ignores prereleases parameter for non-PEP 440 versions
775774
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
776775
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
@@ -1118,7 +1117,7 @@ def test_specifier_contains_installed_prereleases(
11181117
("===1.0", None, None, ["1.0", "1.0+downstream1"], ["1.0"]),
11191118
# Test === combined with other operators (arbitrary string)
11201119
(">=1.0,===foobar", None, None, ["foobar", "1.0", "2.0"], []),
1121-
("!= 2.0,===foobar", None, None, ["foobar", "2.0", "bar"], ["foobar"]),
1120+
("!=2.0,===foobar", None, None, ["foobar", "2.0", "bar"], []),
11221121
# Test === combined with other operators (version string)
11231122
(">=1.0,===1.5", None, None, ["1.0", "1.5", "2.0"], ["1.5"]),
11241123
(">=2.0,===1.5", None, None, ["1.0", "1.5", "2.0"], []),
@@ -1133,23 +1132,23 @@ def test_specifier_contains_installed_prereleases(
11331132
("===1.0", None, None, ["1.0", "foobar", "invalid", "1.0.0"], ["1.0"]),
11341133
(">=1.0,===1.5", None, None, ["1.5", "foobar", "invalid"], ["1.5"]),
11351134
# Test != with invalid versions (should pass through as "not equal")
1136-
("!=1.0", None, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1137-
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["invalid", "2.0"]),
1135+
("!=1.0", None, None, ["invalid", "foobar"], []),
1136+
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["2.0"]),
11381137
(
11391138
"!=2.0.*",
11401139
None,
11411140
None,
11421141
["invalid", "foobar", "2.0"],
1143-
["invalid", "foobar"],
1142+
[],
11441143
),
1145-
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
1144+
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0"]),
11461145
# Test != with invalid versions combined with other operators
11471146
(
11481147
"!=1.0,!=2.0",
11491148
None,
11501149
None,
11511150
["invalid", "1.0", "2.0", "3.0"],
1152-
["invalid", "3.0"],
1151+
["3.0"],
11531152
),
11541153
(
11551154
">=1.0,!=2.0",
@@ -1158,13 +1157,6 @@ def test_specifier_contains_installed_prereleases(
11581157
["invalid", "1.0", "2.0", "3.0"],
11591158
["1.0", "3.0"],
11601159
),
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"]),
11681160
# Test that === ignores prereleases parameter for non-PEP 440 versions
11691161
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
11701162
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
@@ -1581,19 +1573,19 @@ def test_contains_rejects_invalid_specifier(
15811573
("1.0", "===1.0+downstream1", False),
15821574
("1.0+downstream1", "===1.0", False),
15831575
# Test === combined with other operators (arbitrary string)
1584-
("foobar", "===foobar,!=1.0", True),
1576+
("foobar", "===foobar,!=1.0", False),
15851577
("1.0", "===foobar,!=1.0", False),
15861578
("foobar", ">=1.0,===foobar", False),
15871579
# Test === combined with other operators (version string)
15881580
("1.5", ">=1.0,===1.5", True),
15891581
("1.5", ">=2.0,===1.5", False), # Doesn't meet >=2.0
15901582
("2.5", ">=1.0,===2.5", True),
1591-
# Test != with invalid versions (should pass as "not equal")
1592-
("invalid", "!=1.0", True),
1593-
("foobar", "!=1.0", True),
1594-
("invalid", "!=2.0.*", True),
1583+
# Test != with invalid versions (should not pass as not valid versions)
1584+
("invalid", "!=1.0", False),
1585+
("foobar", "!=1.0", False),
1586+
("invalid", "!=2.0.*", False),
15951587
# Test != with invalid versions combined with other operators
1596-
("invalid", "!=1.0,!=2.0", True),
1588+
("invalid", "!=1.0,!=2.0", False),
15971589
("foobar", ">=1.0,!=2.0", False),
15981590
("1.5", ">=1.0,!=2.0", True),
15991591
],

0 commit comments

Comments
 (0)