Skip to content

Commit 315f444

Browse files
committed
Change != to not allow invalid versions
1 parent 8a7f903 commit 315f444

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
@@ -638,9 +638,6 @@ def filter(
638638
version, self.version
639639
):
640640
yield version
641-
# != operator: non-version strings pass through (they're "not equal")
642-
elif self.operator == "!=":
643-
yield version
644641
elif operator_callable(parsed_version, self.version):
645642
# If it's not a prerelease or prereleases are allowed, yield it directly
646643
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
@@ -520,15 +520,14 @@ def test_specifiers(self, version: str, spec_str: str, expected: bool) -> None:
520520
("spec_str", "version", "expected"),
521521
[
522522
("==1.0", "not a valid version", False),
523+
("==1.*", "not a valid version", False),
523524
(">=1.0", "not a valid version", False),
524525
(">1.0", "not a valid version", False),
525526
("<=1.0", "not a valid version", False),
526527
("<1.0", "not a valid version", False),
527528
("~=1.0", "not a valid version", False),
528-
# Test invalid versions with != (should pass as "not equal")
529-
("!=1.0", "not a valid version", True),
530-
("!=1.0", "not a valid version", True),
531-
("!=2.0.*", "not a valid version", True),
529+
("!=1.0", "not a valid version", False),
530+
("!=1.*", "not a valid version", False),
532531
# Test with arbitrary equality (===)
533532
("===invalid", "invalid", True),
534533
("===foobar", "invalid", False),
@@ -757,24 +756,24 @@ def test_specifiers_prereleases(
757756
["foobar"],
758757
),
759758
("===1.0", None, None, ["1.0", "foobar", "invalid", "1.0.0"], ["1.0"]),
760-
# Test != with invalid versions (should pass through as "not equal")
761-
("!=1.0", None, None, ["invalid", "foobar"], ["invalid", "foobar"]),
762-
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["invalid", "2.0"]),
759+
# Test != with invalid versions (should not pass as versions are not valid)
760+
("!=1.0", None, None, ["invalid", "foobar"], []),
761+
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["2.0"]),
763762
(
764763
"!=2.0.*",
765764
None,
766765
None,
767766
["invalid", "foobar", "2.0"],
768-
["invalid", "foobar"],
767+
[]
769768
),
770-
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
769+
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0"]),
771770
# Test that !== ignores prereleases parameter for non-PEP 440 versions
772-
("!=1.0", None, True, ["invalid", "foobar"], ["invalid", "foobar"]),
773-
("!=1.0", None, False, ["invalid", "foobar"], ["invalid", "foobar"]),
774-
("!=1.0", True, None, ["invalid", "foobar"], ["invalid", "foobar"]),
775-
("!=1.0", False, None, ["invalid", "foobar"], ["invalid", "foobar"]),
776-
("!=1.0", True, True, ["invalid", "foobar"], ["invalid", "foobar"]),
777-
("!=1.0", False, False, ["invalid", "foobar"], ["invalid", "foobar"]),
771+
("!=1.0", None, True, ["invalid", "foobar"], []),
772+
("!=1.0", None, False, ["invalid", "foobar"], []),
773+
("!=1.0", True, None, ["invalid", "foobar"], []),
774+
("!=1.0", False, None, ["invalid", "foobar"], []),
775+
("!=1.0", True, True, ["invalid", "foobar"], []),
776+
("!=1.0", False, False, ["invalid", "foobar"], []),
778777
# Test that === ignores prereleases parameter for non-PEP 440 versions
779778
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
780779
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
@@ -1126,7 +1125,7 @@ def test_specifier_contains_installed_prereleases(
11261125
("===1.0", None, None, ["1.0", "1.0+downstream1"], ["1.0"]),
11271126
# Test === combined with other operators (arbitrary string)
11281127
(">=1.0,===foobar", None, None, ["foobar", "1.0", "2.0"], []),
1129-
("!= 2.0,===foobar", None, None, ["foobar", "2.0", "bar"], ["foobar"]),
1128+
("!=2.0,===foobar", None, None, ["foobar", "2.0", "bar"], []),
11301129
# Test === combined with other operators (version string)
11311130
(">=1.0,===1.5", None, None, ["1.0", "1.5", "2.0"], ["1.5"]),
11321131
(">=2.0,===1.5", None, None, ["1.0", "1.5", "2.0"], []),
@@ -1141,23 +1140,23 @@ def test_specifier_contains_installed_prereleases(
11411140
("===1.0", None, None, ["1.0", "foobar", "invalid", "1.0.0"], ["1.0"]),
11421141
(">=1.0,===1.5", None, None, ["1.5", "foobar", "invalid"], ["1.5"]),
11431142
# Test != with invalid versions (should pass through as "not equal")
1144-
("!=1.0", None, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1145-
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["invalid", "2.0"]),
1143+
("!=1.0", None, None, ["invalid", "foobar"], []),
1144+
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["2.0"]),
11461145
(
11471146
"!=2.0.*",
11481147
None,
11491148
None,
11501149
["invalid", "foobar", "2.0"],
1151-
["invalid", "foobar"],
1150+
[],
11521151
),
1153-
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
1152+
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0"]),
11541153
# Test != with invalid versions combined with other operators
11551154
(
11561155
"!=1.0,!=2.0",
11571156
None,
11581157
None,
11591158
["invalid", "1.0", "2.0", "3.0"],
1160-
["invalid", "3.0"],
1159+
["3.0"],
11611160
),
11621161
(
11631162
">=1.0,!=2.0",
@@ -1166,13 +1165,6 @@ def test_specifier_contains_installed_prereleases(
11661165
["invalid", "1.0", "2.0", "3.0"],
11671166
["1.0", "3.0"],
11681167
),
1169-
# Test that != ignores prereleases parameter for non-PEP 440 versions
1170-
("!=1.0", None, True, ["invalid", "foobar"], ["invalid", "foobar"]),
1171-
("!=1.0", None, False, ["invalid", "foobar"], ["invalid", "foobar"]),
1172-
("!=1.0", True, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1173-
("!=1.0", False, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1174-
("!=1.0", True, True, ["invalid", "foobar"], ["invalid", "foobar"]),
1175-
("!=1.0", False, False, ["invalid", "foobar"], ["invalid", "foobar"]),
11761168
# Test that === ignores prereleases parameter for non-PEP 440 versions
11771169
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
11781170
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
@@ -1589,19 +1581,19 @@ def test_contains_rejects_invalid_specifier(
15891581
("1.0", "===1.0+downstream1", False),
15901582
("1.0+downstream1", "===1.0", False),
15911583
# Test === combined with other operators (arbitrary string)
1592-
("foobar", "===foobar,!=1.0", True),
1584+
("foobar", "===foobar,!=1.0", False),
15931585
("1.0", "===foobar,!=1.0", False),
15941586
("foobar", ">=1.0,===foobar", False),
15951587
# Test === combined with other operators (version string)
15961588
("1.5", ">=1.0,===1.5", True),
15971589
("1.5", ">=2.0,===1.5", False), # Doesn't meet >=2.0
15981590
("2.5", ">=1.0,===2.5", True),
1599-
# Test != with invalid versions (should pass as "not equal")
1600-
("invalid", "!=1.0", True),
1601-
("foobar", "!=1.0", True),
1602-
("invalid", "!=2.0.*", True),
1591+
# Test != with invalid versions (should not pass as not valid versions)
1592+
("invalid", "!=1.0", False),
1593+
("foobar", "!=1.0", False),
1594+
("invalid", "!=2.0.*", False),
16031595
# Test != with invalid versions combined with other operators
1604-
("invalid", "!=1.0,!=2.0", True),
1596+
("invalid", "!=1.0,!=2.0", False),
16051597
("foobar", ">=1.0,!=2.0", False),
16061598
("1.5", ">=1.0,!=2.0", True),
16071599
],

0 commit comments

Comments
 (0)