From 5e8784c645beac6fdc6df9bd51d969646e145dc6 Mon Sep 17 00:00:00 2001 From: mayeut Date: Sat, 18 Jun 2022 13:31:25 +0200 Subject: [PATCH] Fix prefix version matching 0-padding shall only be applied on the prospective version, before shortening, in order to get the correct shortened prospective version. --- packaging/specifiers.py | 18 ++++++++---------- tests/test_specifiers.py | 6 ++++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packaging/specifiers.py b/packaging/specifiers.py index bbd64175..7543c0a8 100644 --- a/packaging/specifiers.py +++ b/packaging/specifiers.py @@ -385,7 +385,7 @@ def _compare_equal(self, prospective: Version, spec: str) -> bool: # We need special logic to handle prefix matching if spec.endswith(".*"): # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) + normalized_prospective = canonicalize_version(prospective.public) # Get the normalized version string ignoring the trailing .* normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) # Split the spec out by dots, and pretend that there is an implicit @@ -395,20 +395,18 @@ def _compare_equal(self, prospective: Version, spec: str) -> bool: # Split the prospective version out by dots, and pretend that there # is an implicit dot in between a release segment and a pre-release # segment. - split_prospective = _version_split(str(prospective)) + split_prospective = _version_split(normalized_prospective) + + # 0-pad the prospective version before shortening it to get the correct + # shortened version. + padded_prospective, _ = _pad_version(split_prospective, split_spec) # Shorten the prospective version to be the same length as the spec # so that we can determine if the specifier is a prefix of the # prospective version or not. - shortened_prospective = split_prospective[: len(split_spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - padded_spec, padded_prospective = _pad_version( - split_spec, shortened_prospective - ) + shortened_prospective = padded_prospective[: len(split_spec)] - return padded_prospective == padded_spec + return shortened_prospective == split_spec else: # Convert our spec string into a Version spec_version = Version(spec) diff --git a/tests/test_specifiers.py b/tests/test_specifiers.py index a5cb9ce0..104fac9b 100644 --- a/tests/test_specifiers.py +++ b/tests/test_specifiers.py @@ -307,8 +307,11 @@ def test_comparison_non_specifier(self): ("2b1.dev1", "==2.*"), ("2c1", "==2.*"), ("2c1.post1.dev1", "==2.*"), + ("2c1.post1.dev1", "==2.0.*"), ("2rc1", "==2.*"), + ("2rc1", "==2.0.*"), ("2", "==2.*"), + ("2", "==2.0.*"), ("2", "==0!2.*"), ("0!2", "==2.*"), ("2.0", "==2.*"), @@ -405,8 +408,11 @@ def test_comparison_non_specifier(self): ("2b1.dev1", "!=2.*"), ("2c1", "!=2.*"), ("2c1.post1.dev1", "!=2.*"), + ("2c1.post1.dev1", "!=2.0.*"), ("2rc1", "!=2.*"), + ("2rc1", "!=2.0.*"), ("2", "!=2.*"), + ("2", "!=2.0.*"), ("2.0", "!=2.*"), ("2.0.0", "!=2.*"), # Test the greater than equal operation