|
9 | 9 | import re
|
10 | 10 | import zipfile
|
11 | 11 |
|
| 12 | +from packaging.requirements import Requirement |
12 | 13 | from packaging.tags import sys_tags
|
13 | 14 | from packaging.utils import canonicalize_name
|
14 | 15 | from packaging.version import Version as parse_version
|
|
17 | 18 | from setuptools.archive_util import _unpack_zipfile_obj
|
18 | 19 | from setuptools.command.egg_info import _egg_basename, write_requirements
|
19 | 20 |
|
| 21 | +from ._discovery import extras_from_deps |
| 22 | +from ._importlib import metadata |
20 | 23 | from .unicode_utils import _read_utf8_with_fallback
|
21 | 24 |
|
22 | 25 | from distutils.util import get_platform
|
@@ -170,29 +173,45 @@ def get_metadata(name):
|
170 | 173 |
|
171 | 174 | @staticmethod
|
172 | 175 | 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)) |
174 | 179 |
|
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) |
180 | 181 |
|
181 | 182 | # Note: Evaluate and strip markers now,
|
182 | 183 | # as it's difficult to convert back from the syntax:
|
183 | 184 | # foobar; "linux" in sys_platform and extra == 'test'
|
184 | 185 | def raw_req(req):
|
| 186 | + req = Requirement(str(req)) |
185 | 187 | req.marker = None
|
186 | 188 | return str(req)
|
187 | 189 |
|
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 | + ) |
189 | 207 | 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 |
196 | 215 | }
|
197 | 216 | return install_requires, extras_require
|
198 | 217 |
|
|
0 commit comments