Skip to content

Commit 0e19b82

Browse files
committed
Replace pkg_resources with importlib.metadata and packaging.requirements.
1 parent 95145dd commit 0e19b82

File tree

2 files changed

+65
-13
lines changed

2 files changed

+65
-13
lines changed

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: 32 additions & 13 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
@@ -170,29 +173,45 @@ def get_metadata(name):
170173

171174
@staticmethod
172175
def _convert_requires(destination_eggdir, dist_info):
173-
import pkg_resources
176+
md = metadata.Distribution.at(dist_info).metadata
177+
deps = md.get_all('Requires-Dist') or []
178+
reqs = list(map(Requirement, deps))
174179

175-
dist = pkg_resources.Distribution.from_location(
176-
destination_eggdir,
177-
dist_info,
178-
metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info),
179-
)
180+
extras = extras_from_deps(deps)
180181

181182
# Note: Evaluate and strip markers now,
182183
# as it's difficult to convert back from the syntax:
183184
# foobar; "linux" in sys_platform and extra == 'test'
184185
def raw_req(req):
186+
req = Requirement(str(req))
185187
req.marker = None
186188
return str(req)
187189

188-
install_requires = list(map(raw_req, dist.requires()))
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+
)
189207
extras_require = {
190-
extra: [
191-
req
192-
for req in map(raw_req, dist.requires((extra,)))
193-
if req not in install_requires
194-
]
195-
for extra in dist.extras
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
196215
}
197216
return install_requires, extras_require
198217

0 commit comments

Comments
 (0)