Skip to content

Commit 6f937df

Browse files
authored
Merge pull request #5004 from pypa/feature/remove-more-pkg_resources
Remove pkg_resources from wheel.
2 parents ae480ff + 1bfd8db commit 6f937df

File tree

3 files changed

+83
-24
lines changed

3 files changed

+83
-24
lines changed

newsfragments/3085.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Replaced more references to pkg_resources with importlib equivalents in wheel odule.

setuptools/_discovery.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import functools
2+
import operator
3+
4+
import packaging.requirements
5+
6+
7+
# from coherent.build.discovery
8+
def extras_from_dep(dep):
9+
try:
10+
markers = packaging.requirements.Requirement(dep).marker._markers
11+
except AttributeError:
12+
markers = ()
13+
return set(
14+
marker[2].value
15+
for marker in markers
16+
if isinstance(marker, tuple) and marker[0].value == 'extra'
17+
)
18+
19+
20+
def extras_from_deps(deps):
21+
"""
22+
>>> extras_from_deps(['requests'])
23+
set()
24+
>>> extras_from_deps(['pytest; extra == "test"'])
25+
{'test'}
26+
>>> sorted(extras_from_deps([
27+
... 'requests',
28+
... 'pytest; extra == "test"',
29+
... 'pytest-cov; extra == "test"',
30+
... 'sphinx; extra=="doc"']))
31+
['doc', 'test']
32+
"""
33+
return functools.reduce(operator.or_, map(extras_from_dep, deps), set())

setuptools/wheel.py

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import re
1010
import zipfile
1111

12+
from packaging.requirements import Requirement
1213
from packaging.tags import sys_tags
1314
from packaging.utils import canonicalize_name
1415
from packaging.version import Version as parse_version
@@ -17,6 +18,8 @@
1718
from setuptools.archive_util import _unpack_zipfile_obj
1819
from setuptools.command.egg_info import _egg_basename, write_requirements
1920

21+
from ._discovery import extras_from_deps
22+
from ._importlib import metadata
2023
from .unicode_utils import _read_utf8_with_fallback
2124

2225
from distutils.util import get_platform
@@ -133,8 +136,6 @@ def _install_as_egg(self, destination_eggdir, zf):
133136

134137
@staticmethod
135138
def _convert_metadata(zf, destination_eggdir, dist_info, egg_info):
136-
import pkg_resources
137-
138139
def get_metadata(name):
139140
with zf.open(posixpath.join(dist_info, name)) as fp:
140141
value = fp.read().decode('utf-8')
@@ -148,30 +149,10 @@ def get_metadata(name):
148149
raise ValueError(f'unsupported wheel format version: {wheel_version}')
149150
# Extract to target directory.
150151
_unpack_zipfile_obj(zf, destination_eggdir)
151-
# Convert metadata.
152152
dist_info = os.path.join(destination_eggdir, dist_info)
153-
dist = pkg_resources.Distribution.from_location(
154-
destination_eggdir,
155-
dist_info,
156-
metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info),
153+
install_requires, extras_require = Wheel._convert_requires(
154+
destination_eggdir, dist_info
157155
)
158-
159-
# Note: Evaluate and strip markers now,
160-
# as it's difficult to convert back from the syntax:
161-
# foobar; "linux" in sys_platform and extra == 'test'
162-
def raw_req(req):
163-
req.marker = None
164-
return str(req)
165-
166-
install_requires = list(map(raw_req, dist.requires()))
167-
extras_require = {
168-
extra: [
169-
req
170-
for req in map(raw_req, dist.requires((extra,)))
171-
if req not in install_requires
172-
]
173-
for extra in dist.extras
174-
}
175156
os.rename(dist_info, egg_info)
176157
os.rename(
177158
os.path.join(egg_info, 'METADATA'),
@@ -190,6 +171,50 @@ def raw_req(req):
190171
os.path.join(egg_info, 'requires.txt'),
191172
)
192173

174+
@staticmethod
175+
def _convert_requires(destination_eggdir, dist_info):
176+
md = metadata.Distribution.at(dist_info).metadata
177+
deps = md.get_all('Requires-Dist') or []
178+
reqs = list(map(Requirement, deps))
179+
180+
extras = extras_from_deps(deps)
181+
182+
# Note: Evaluate and strip markers now,
183+
# as it's difficult to convert back from the syntax:
184+
# foobar; "linux" in sys_platform and extra == 'test'
185+
def raw_req(req):
186+
req = Requirement(str(req))
187+
req.marker = None
188+
return str(req)
189+
190+
def eval(req, **env):
191+
return not req.marker or req.marker.evaluate(env)
192+
193+
def for_extra(req):
194+
try:
195+
markers = req.marker._markers
196+
except AttributeError:
197+
markers = ()
198+
return set(
199+
marker[2].value
200+
for marker in markers
201+
if isinstance(marker, tuple) and marker[0].value == 'extra'
202+
)
203+
204+
install_requires = list(
205+
map(raw_req, filter(eval, itertools.filterfalse(for_extra, reqs)))
206+
)
207+
extras_require = {
208+
extra: list(
209+
map(
210+
raw_req,
211+
(req for req in reqs if for_extra(req) and eval(req, extra=extra)),
212+
)
213+
)
214+
for extra in extras
215+
}
216+
return install_requires, extras_require
217+
193218
@staticmethod
194219
def _move_data_entries(destination_eggdir, dist_data):
195220
"""Move data entries to their correct location."""

0 commit comments

Comments
 (0)