Skip to content

Commit cdd8df3

Browse files
committed
Parse pkg_resources Dist versions with packaging.version
Due to a mix of bundled and unbundled dependencies, pkg_resources Version class may not be the same as packaging's Version class. See: pypa/setuptools#2052
1 parent e7d6e54 commit cdd8df3

File tree

4 files changed

+15
-6
lines changed

4 files changed

+15
-6
lines changed

news/9e768673-6079-491e-bbe0-d1593952f1c7.trivial.rst

Whitespace-only changes.

src/pip/_internal/metadata/pkg_resources.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from pip._vendor import pkg_resources
55
from pip._vendor.packaging.utils import canonicalize_name
6-
from pip._vendor.packaging.version import _BaseVersion
6+
from pip._vendor.packaging.version import _BaseVersion, parse as parse_version
77

88
from pip._internal.utils import misc # TODO: Move definition here.
99
from pip._internal.utils.packaging import get_installer
@@ -16,6 +16,7 @@ class Distribution(BaseDistribution):
1616
def __init__(self, dist):
1717
# type: (pkg_resources.Distribution) -> None
1818
self._dist = dist
19+
self._version = None
1920

2021
@classmethod
2122
def from_wheel(cls, path, name):
@@ -45,7 +46,9 @@ def canonical_name(self):
4546
@property
4647
def version(self):
4748
# type: () -> _BaseVersion
48-
return self._dist.parsed_version
49+
if self._version is None:
50+
self._version = parse_version(self._dist.version)
51+
return self._version
4952

5053
@property
5154
def installer(self):

src/pip/_internal/resolution/resolvelib/candidates.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet
66
from pip._vendor.packaging.utils import canonicalize_name
77
from pip._vendor.packaging.version import Version, _BaseVersion
8+
from pip._vendor.packaging.version import parse as parse_version
89
from pip._vendor.pkg_resources import Distribution
910

1011
from pip._internal.exceptions import HashError, MetadataInconsistent
@@ -180,7 +181,7 @@ def name(self):
180181
def version(self):
181182
# type: () -> _BaseVersion
182183
if self._version is None:
183-
self._version = self.dist.parsed_version
184+
self._version = parse_version(self.dist.version)
184185
return self._version
185186

186187
def format_for_error(self):
@@ -206,7 +207,8 @@ def _check_metadata_consistency(self, dist):
206207
self._name,
207208
dist.project_name,
208209
)
209-
if self._version is not None and self._version != dist.parsed_version:
210+
parsed_version = parse_version(dist.version)
211+
if self._version is not None and self._version != parsed_version:
210212
raise MetadataInconsistent(
211213
self._ireq,
212214
"version",
@@ -345,6 +347,7 @@ def __init__(
345347
self.dist = dist
346348
self._ireq = make_install_req_from_dist(dist, template)
347349
self._factory = factory
350+
self._version = None
348351

349352
# This is just logging some messages, so we can do it eagerly.
350353
# The returned dist would be exactly the same as self.dist because we
@@ -387,7 +390,9 @@ def name(self):
387390
@property
388391
def version(self):
389392
# type: () -> _BaseVersion
390-
return self.dist.parsed_version
393+
if self._version is None:
394+
self._version = parse_version(self.dist.version)
395+
return self._version
391396

392397
@property
393398
def is_editable(self):

src/pip/_internal/resolution/resolvelib/resolver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple
55

66
from pip._vendor.packaging.utils import canonicalize_name
7+
from pip._vendor.packaging.version import parse as parse_version
78
from pip._vendor.resolvelib import ResolutionImpossible
89
from pip._vendor.resolvelib import Resolver as RLResolver
910
from pip._vendor.resolvelib.resolvers import Result
@@ -139,7 +140,7 @@ def resolve(self, root_reqs, check_supported_wheels):
139140
elif self.factory.force_reinstall:
140141
# The --force-reinstall flag is set -- reinstall.
141142
ireq.should_reinstall = True
142-
elif installed_dist.parsed_version != candidate.version:
143+
elif parse_version(installed_dist.version) != candidate.version:
143144
# The installation is different in version -- reinstall.
144145
ireq.should_reinstall = True
145146
elif candidate.is_editable or dist_is_editable(installed_dist):

0 commit comments

Comments
 (0)