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
@@ -133,8 +136,6 @@ def _install_as_egg(self, destination_eggdir, zf):
133
136
134
137
@staticmethod
135
138
def _convert_metadata (zf , destination_eggdir , dist_info , egg_info ):
136
- import pkg_resources
137
-
138
139
def get_metadata (name ):
139
140
with zf .open (posixpath .join (dist_info , name )) as fp :
140
141
value = fp .read ().decode ('utf-8' )
@@ -148,30 +149,10 @@ def get_metadata(name):
148
149
raise ValueError (f'unsupported wheel format version: { wheel_version } ' )
149
150
# Extract to target directory.
150
151
_unpack_zipfile_obj (zf , destination_eggdir )
151
- # Convert metadata.
152
152
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
157
155
)
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
- }
175
156
os .rename (dist_info , egg_info )
176
157
os .rename (
177
158
os .path .join (egg_info , 'METADATA' ),
@@ -190,6 +171,50 @@ def raw_req(req):
190
171
os .path .join (egg_info , 'requires.txt' ),
191
172
)
192
173
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
+
193
218
@staticmethod
194
219
def _move_data_entries (destination_eggdir , dist_data ):
195
220
"""Move data entries to their correct location."""
0 commit comments