diff --git a/packaging/specifiers.py b/packaging/specifiers.py index 9f7dd278..fe09bb1d 100644 --- a/packaging/specifiers.py +++ b/packaging/specifiers.py @@ -516,12 +516,20 @@ def _compare_not_equal(self, prospective, spec): @_require_version_compare def _compare_less_than_equal(self, prospective, spec): # type: (ParsedVersion, str) -> bool - return prospective <= Version(spec) + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) <= Version(spec) @_require_version_compare def _compare_greater_than_equal(self, prospective, spec): # type: (ParsedVersion, str) -> bool - return prospective >= Version(spec) + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) >= Version(spec) @_require_version_compare def _compare_less_than(self, prospective, spec_str): diff --git a/tests/test_specifiers.py b/tests/test_specifiers.py index ee54dc84..6126f365 100644 --- a/tests/test_specifiers.py +++ b/tests/test_specifiers.py @@ -976,3 +976,17 @@ def test_comparison_canonicalizes(self, left, right): def test_comparison_non_specifier(self): assert SpecifierSet("==1.0") != 12 assert not SpecifierSet("==1.0") == 12 + + @pytest.mark.parametrize( + ("version", "specifier", "expected"), + [ + ("1.0.0+local", "==1.0.0", True), + ("1.0.0+local", "!=1.0.0", False), + ("1.0.0+local", "<=1.0.0", True), + ("1.0.0+local", ">=1.0.0", True), + ("1.0.0+local", "<1.0.0", False), + ("1.0.0+local", ">1.0.0", False), + ], + ) + def test_comparison_ignores_local(self, version, specifier, expected): + assert (Version(version) in SpecifierSet(specifier)) == expected