Skip to content

Commit 8fc075b

Browse files
committed
Change != to not allow invalid versions
1 parent 6140248 commit 8fc075b

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
@@ -601,9 +601,6 @@ def filter(
601601
version, self.version
602602
):
603603
yield version
604-
# != operator: non-version strings pass through (they're "not equal")
605-
elif self.operator == "!=":
606-
yield version
607604
elif operator_callable(parsed_version, self.version):
608605
# If it's not a prerelease or prereleases are allowed, yield it directly
609606
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
@@ -498,15 +498,14 @@ def test_specifiers(self, version, spec, expected):
498498
("spec", "version", "expected"),
499499
[
500500
("==1.0", "not a valid version", False),
501+
("==1.*", "not a valid version", False),
501502
(">=1.0", "not a valid version", False),
502503
(">1.0", "not a valid version", False),
503504
("<=1.0", "not a valid version", False),
504505
("<1.0", "not a valid version", False),
505506
("~=1.0", "not a valid version", False),
506-
# Test invalid versions with != (should pass as "not equal")
507-
("!=1.0", "not a valid version", True),
508-
("!=1.0", "not a valid version", True),
509-
("!=2.0.*", "not a valid version", True),
507+
("!=1.0", "not a valid version", False),
508+
("!=1.*", "not a valid version", False),
510509
# Test with arbitrary equality (===)
511510
("===invalid", "invalid", True),
512511
("===foobar", "invalid", False),
@@ -686,24 +685,24 @@ def test_specifiers_prereleases(
686685
["foobar"],
687686
),
688687
("===1.0", None, None, ["1.0", "foobar", "invalid", "1.0.0"], ["1.0"]),
689-
# Test != with invalid versions (should pass through as "not equal")
690-
("!=1.0", None, None, ["invalid", "foobar"], ["invalid", "foobar"]),
691-
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["invalid", "2.0"]),
688+
# Test != with invalid versions (should not pass as versions are not valid)
689+
("!=1.0", None, None, ["invalid", "foobar"], []),
690+
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["2.0"]),
692691
(
693692
"!=2.0.*",
694693
None,
695694
None,
696695
["invalid", "foobar", "2.0"],
697-
["invalid", "foobar"],
696+
[]
698697
),
699-
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
698+
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0"]),
700699
# 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"]),
700+
("!=1.0", None, True, ["invalid", "foobar"], []),
701+
("!=1.0", None, False, ["invalid", "foobar"], []),
702+
("!=1.0", True, None, ["invalid", "foobar"], []),
703+
("!=1.0", False, None, ["invalid", "foobar"], []),
704+
("!=1.0", True, True, ["invalid", "foobar"], []),
705+
("!=1.0", False, False, ["invalid", "foobar"], []),
707706
# Test that === ignores prereleases parameter for non-PEP 440 versions
708707
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
709708
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
@@ -1052,7 +1051,7 @@ def test_specifier_contains_installed_prereleases(
10521051
("===1.0", None, None, ["1.0", "1.0+downstream1"], ["1.0"]),
10531052
# Test === combined with other operators (arbitrary string)
10541053
(">=1.0,===foobar", None, None, ["foobar", "1.0", "2.0"], []),
1055-
("!= 2.0,===foobar", None, None, ["foobar", "2.0", "bar"], ["foobar"]),
1054+
("!=2.0,===foobar", None, None, ["foobar", "2.0", "bar"], []),
10561055
# Test === combined with other operators (version string)
10571056
(">=1.0,===1.5", None, None, ["1.0", "1.5", "2.0"], ["1.5"]),
10581057
(">=2.0,===1.5", None, None, ["1.0", "1.5", "2.0"], []),
@@ -1067,23 +1066,23 @@ def test_specifier_contains_installed_prereleases(
10671066
("===1.0", None, None, ["1.0", "foobar", "invalid", "1.0.0"], ["1.0"]),
10681067
(">=1.0,===1.5", None, None, ["1.5", "foobar", "invalid"], ["1.5"]),
10691068
# Test != with invalid versions (should pass through as "not equal")
1070-
("!=1.0", None, None, ["invalid", "foobar"], ["invalid", "foobar"]),
1071-
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["invalid", "2.0"]),
1069+
("!=1.0", None, None, ["invalid", "foobar"], []),
1070+
("!=1.0", None, None, ["1.0", "invalid", "2.0"], ["2.0"]),
10721071
(
10731072
"!=2.0.*",
10741073
None,
10751074
None,
10761075
["invalid", "foobar", "2.0"],
1077-
["invalid", "foobar"],
1076+
[],
10781077
),
1079-
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0", "invalid"]),
1078+
("!=2.0.*", None, None, ["1.0", "invalid", "2.0.0"], ["1.0"]),
10801079
# Test != with invalid versions combined with other operators
10811080
(
10821081
"!=1.0,!=2.0",
10831082
None,
10841083
None,
10851084
["invalid", "1.0", "2.0", "3.0"],
1086-
["invalid", "3.0"],
1085+
["3.0"],
10871086
),
10881087
(
10891088
">=1.0,!=2.0",
@@ -1092,13 +1091,6 @@ def test_specifier_contains_installed_prereleases(
10921091
["invalid", "1.0", "2.0", "3.0"],
10931092
["1.0", "3.0"],
10941093
),
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"]),
11021094
# Test that === ignores prereleases parameter for non-PEP 440 versions
11031095
("===foobar", None, True, ["foobar", "foo"], ["foobar"]),
11041096
("===foobar", None, False, ["foobar", "foo"], ["foobar"]),
@@ -1502,19 +1494,19 @@ def test_contains_rejects_invalid_specifier(self, specifier, input):
15021494
("1.0", "===1.0+downstream1", False),
15031495
("1.0+downstream1", "===1.0", False),
15041496
# Test === combined with other operators (arbitrary string)
1505-
("foobar", "===foobar,!=1.0", True),
1497+
("foobar", "===foobar,!=1.0", False),
15061498
("1.0", "===foobar,!=1.0", False),
15071499
("foobar", ">=1.0,===foobar", False),
15081500
# Test === combined with other operators (version string)
15091501
("1.5", ">=1.0,===1.5", True),
15101502
("1.5", ">=2.0,===1.5", False), # Doesn't meet >=2.0
15111503
("2.5", ">=1.0,===2.5", True),
1512-
# Test != with invalid versions (should pass as "not equal")
1513-
("invalid", "!=1.0", True),
1514-
("foobar", "!=1.0", True),
1515-
("invalid", "!=2.0.*", True),
1504+
# Test != with invalid versions (should not pass as not valid versions)
1505+
("invalid", "!=1.0", False),
1506+
("foobar", "!=1.0", False),
1507+
("invalid", "!=2.0.*", False),
15161508
# Test != with invalid versions combined with other operators
1517-
("invalid", "!=1.0,!=2.0", True),
1509+
("invalid", "!=1.0,!=2.0", False),
15181510
("foobar", ">=1.0,!=2.0", False),
15191511
("1.5", ">=1.0,!=2.0", True),
15201512
],

0 commit comments

Comments
 (0)