Skip to content

Commit c188d1f

Browse files
authored
Merge pull request #9559 from uranusjr/metadata-from-wheel
Remove direct pkg_resources usage in wheel_builder
2 parents a29cc9d + d16a503 commit c188d1f

File tree

4 files changed

+53
-25
lines changed

4 files changed

+53
-25
lines changed

src/pip/_internal/metadata/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
if MYPY_CHECK_RUNNING:
44
from typing import List, Optional
55

6-
from .base import BaseEnvironment
6+
from .base import BaseDistribution, BaseEnvironment
77

88

99
def get_default_environment():
@@ -30,3 +30,17 @@ def get_environment(paths):
3030
from .pkg_resources import Environment
3131

3232
return Environment.from_paths(paths)
33+
34+
35+
def get_wheel_distribution(wheel_path, canonical_name):
36+
# type: (str, str) -> BaseDistribution
37+
"""Get the representation of the specified wheel's distribution metadata.
38+
39+
This returns a Distribution instance from the chosen backend based on
40+
the given wheel's ``.dist-info`` directory.
41+
42+
:param canonical_name: Normalized project name of the given wheel.
43+
"""
44+
from .pkg_resources import Distribution
45+
46+
return Distribution.from_wheel(wheel_path, canonical_name)

src/pip/_internal/metadata/base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88

99

1010
class BaseDistribution:
11+
@property
12+
def metadata_version(self):
13+
# type: () -> Optional[str]
14+
"""Value of "Metadata-Version:" in the distribution, if available."""
15+
raise NotImplementedError()
16+
1117
@property
1218
def canonical_name(self):
1319
# type: () -> str

src/pip/_internal/metadata/pkg_resources.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import zipfile
2+
13
from pip._vendor import pkg_resources
24
from pip._vendor.packaging.utils import canonicalize_name
35

46
from pip._internal.utils import misc # TODO: Move definition here.
57
from pip._internal.utils.packaging import get_installer
68
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
9+
from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
710

811
from .base import BaseDistribution, BaseEnvironment
912

@@ -18,6 +21,21 @@ def __init__(self, dist):
1821
# type: (pkg_resources.Distribution) -> None
1922
self._dist = dist
2023

24+
@classmethod
25+
def from_wheel(cls, path, name):
26+
# type: (str, str) -> Distribution
27+
with zipfile.ZipFile(path, allowZip64=True) as zf:
28+
dist = pkg_resources_distribution_for_wheel(zf, name, path)
29+
return cls(dist)
30+
31+
@property
32+
def metadata_version(self):
33+
# type: () -> Optional[str]
34+
for line in self._dist.get_metadata_lines(self._dist.PKG_INFO):
35+
if line.lower().startswith("metadata-version:"):
36+
return line.split(":", 1)[-1].strip()
37+
return None
38+
2139
@property
2240
def canonical_name(self):
2341
# type: () -> str

src/pip/_internal/wheel_builder.py

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
import os.path
66
import re
77
import shutil
8-
import zipfile
98

109
from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version
1110
from pip._vendor.packaging.version import InvalidVersion, Version
12-
from pip._vendor.pkg_resources import Distribution
1311

1412
from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel
13+
from pip._internal.metadata import get_wheel_distribution
1514
from pip._internal.models.link import Link
1615
from pip._internal.models.wheel import Wheel
1716
from pip._internal.operations.build.wheel import build_wheel_pep517
@@ -23,7 +22,6 @@
2322
from pip._internal.utils.temp_dir import TempDirectory
2423
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
2524
from pip._internal.utils.urls import path_to_url
26-
from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel
2725
from pip._internal.vcs import vcs
2826

2927
if MYPY_CHECK_RUNNING:
@@ -171,19 +169,6 @@ def _always_true(_):
171169
return True
172170

173171

174-
def _get_metadata_version(dist):
175-
# type: (Distribution) -> Optional[Version]
176-
for line in dist.get_metadata_lines(dist.PKG_INFO):
177-
if line.lower().startswith("metadata-version:"):
178-
value = line.split(":", 1)[-1].strip()
179-
try:
180-
return Version(value)
181-
except InvalidVersion:
182-
msg = "Invalid Metadata-Version: {}".format(value)
183-
raise UnsupportedWheel(msg)
184-
raise UnsupportedWheel("Missing Metadata-Version")
185-
186-
187172
def _verify_one(req, wheel_path):
188173
# type: (InstallRequirement, str) -> None
189174
canonical_name = canonicalize_name(req.name)
@@ -193,20 +178,25 @@ def _verify_one(req, wheel_path):
193178
"Wheel has unexpected file name: expected {!r}, "
194179
"got {!r}".format(canonical_name, w.name),
195180
)
196-
with zipfile.ZipFile(wheel_path, allowZip64=True) as zf:
197-
dist = pkg_resources_distribution_for_wheel(
198-
zf, canonical_name, wheel_path,
199-
)
181+
dist = get_wheel_distribution(wheel_path, canonical_name)
200182
if canonicalize_version(dist.version) != canonicalize_version(w.version):
201183
raise InvalidWheelFilename(
202184
"Wheel has unexpected file name: expected {!r}, "
203-
"got {!r}".format(dist.version, w.version),
185+
"got {!r}".format(str(dist.version), w.version),
204186
)
205-
if (_get_metadata_version(dist) >= Version("1.2")
206-
and not isinstance(dist.parsed_version, Version)):
187+
metadata_version_value = dist.metadata_version
188+
if metadata_version_value is None:
189+
raise UnsupportedWheel("Missing Metadata-Version")
190+
try:
191+
metadata_version = Version(metadata_version_value)
192+
except InvalidVersion:
193+
msg = "Invalid Metadata-Version: {}".format(metadata_version_value)
194+
raise UnsupportedWheel(msg)
195+
if (metadata_version >= Version("1.2")
196+
and not isinstance(dist.version, Version)):
207197
raise UnsupportedWheel(
208198
"Metadata 1.2 mandates PEP 440 version, "
209-
"but {!r} is not".format(dist.version)
199+
"but {!r} is not".format(str(dist.version))
210200
)
211201

212202

0 commit comments

Comments
 (0)