1
1
import logging
2
2
import sys
3
3
4
- from pip ._vendor .contextlib2 import suppress
5
4
from pip ._vendor .packaging .specifiers import InvalidSpecifier , SpecifierSet
6
5
from pip ._vendor .packaging .utils import canonicalize_name
7
6
from pip ._vendor .packaging .version import Version
8
7
9
8
from pip ._internal .exceptions import HashError , MetadataInconsistent
10
- from pip ._internal .network .lazy_wheel import (
11
- HTTPRangeRequestUnsupported ,
12
- dist_from_wheel_url ,
13
- )
9
+ from pip ._internal .models .wheel import Wheel
14
10
from pip ._internal .req .constructors import (
15
11
install_req_from_editable ,
16
12
install_req_from_line ,
17
13
)
18
14
from pip ._internal .req .req_install import InstallRequirement
19
- from pip ._internal .utils .logging import indent_log
20
15
from pip ._internal .utils .misc import dist_is_editable , normalize_version_info
21
16
from pip ._internal .utils .packaging import get_requires_python
22
17
from pip ._internal .utils .typing import MYPY_CHECK_RUNNING
@@ -147,7 +142,6 @@ def __init__(
147
142
self ._name = name
148
143
self ._version = version
149
144
self ._dist = None # type: Optional[Distribution]
150
- self ._prepared = False
151
145
152
146
def __repr__ (self ):
153
147
# type: () -> str
@@ -203,12 +197,11 @@ def _prepare_distribution(self):
203
197
# type: () -> Distribution
204
198
raise NotImplementedError ("Override in subclass" )
205
199
206
- def _check_metadata_consistency (self ):
207
- # type: () -> None
200
+ def _check_metadata_consistency (self , dist ):
201
+ # type: (Distribution ) -> None
208
202
"""Check for consistency of project name and version of dist."""
209
203
# TODO: (Longer term) Rather than abort, reject this candidate
210
204
# and backtrack. This would need resolvelib support.
211
- dist = self ._dist # type: Distribution
212
205
name = canonicalize_name (dist .project_name )
213
206
if self ._name is not None and self ._name != name :
214
207
raise MetadataInconsistent (self ._ireq , "name" , dist .project_name )
@@ -218,45 +211,23 @@ def _check_metadata_consistency(self):
218
211
219
212
def _prepare (self ):
220
213
# type: () -> None
221
- if self ._prepared :
214
+ if self ._dist is not None :
222
215
return
223
216
try :
224
- self . _dist = self ._prepare_distribution ()
217
+ dist = self ._prepare_distribution ()
225
218
except HashError as e :
226
219
e .req = self ._ireq
227
220
raise
228
221
229
- assert self ._dist is not None , "Distribution already installed"
230
- self ._check_metadata_consistency ()
231
- self ._prepared = True
232
-
233
- def _fetch_metadata (self ):
234
- # type: () -> None
235
- """Fetch metadata, using lazy wheel if possible."""
236
- preparer = self ._factory .preparer
237
- use_lazy_wheel = self ._factory .use_lazy_wheel
238
- remote_wheel = self ._link .is_wheel and not self ._link .is_file
239
- if use_lazy_wheel and remote_wheel and not preparer .require_hashes :
240
- assert self ._name is not None
241
- logger .info ('Collecting %s' , self ._ireq .req or self ._ireq )
242
- # If HTTPRangeRequestUnsupported is raised, fallback silently.
243
- with indent_log (), suppress (HTTPRangeRequestUnsupported ):
244
- logger .info (
245
- 'Obtaining dependency information from %s %s' ,
246
- self ._name , self ._version ,
247
- )
248
- url = self ._link .url .split ('#' , 1 )[0 ]
249
- session = preparer .downloader ._session
250
- self ._dist = dist_from_wheel_url (self ._name , url , session )
251
- self ._check_metadata_consistency ()
252
- if self ._dist is None :
253
- self ._prepare ()
222
+ assert dist is not None , "Distribution already installed"
223
+ self ._check_metadata_consistency (dist )
224
+ self ._dist = dist
254
225
255
226
@property
256
227
def dist (self ):
257
228
# type: () -> Distribution
258
229
if self ._dist is None :
259
- self ._fetch_metadata ()
230
+ self ._prepare ()
260
231
return self ._dist
261
232
262
233
def _get_requires_python_specifier (self ):
@@ -309,6 +280,20 @@ def __init__(
309
280
logger .debug ("Using cached wheel link: %s" , cache_entry .link )
310
281
link = cache_entry .link
311
282
ireq = make_install_req_from_link (link , template )
283
+ assert ireq .link == link
284
+ if ireq .link .is_wheel and not ireq .link .is_file :
285
+ wheel = Wheel (ireq .link .filename )
286
+ wheel_name = canonicalize_name (wheel .name )
287
+ assert name == wheel_name , (
288
+ "{!r} != {!r} for wheel" .format (name , wheel_name )
289
+ )
290
+ # Version may not be present for PEP 508 direct URLs
291
+ if version is not None :
292
+ assert str (version ) == wheel .version , (
293
+ "{!r} != {!r} for wheel {}" .format (
294
+ version , wheel .version , name
295
+ )
296
+ )
312
297
313
298
if (cache_entry is not None and
314
299
cache_entry .persistent and
0 commit comments