9
9
import os
10
10
import shutil
11
11
12
- from pip ._vendor .contextlib2 import suppress
13
12
from pip ._vendor .packaging .utils import canonicalize_name
14
13
from pip ._vendor .six import PY2
15
14
56
55
from pip ._internal .index .package_finder import PackageFinder
57
56
from pip ._internal .models .link import Link
58
57
from pip ._internal .network .download import Downloader
58
+ from pip ._internal .network .session import PipSession
59
59
from pip ._internal .req .req_install import InstallRequirement
60
60
from pip ._internal .req .req_tracker import RequirementTracker
61
61
from pip ._internal .utils .hashes import Hashes
@@ -332,6 +332,7 @@ def __init__(
332
332
wheel_download_dir , # type: Optional[str]
333
333
build_isolation , # type: bool
334
334
req_tracker , # type: RequirementTracker
335
+ session , # type: PipSession
335
336
downloader , # type: Downloader
336
337
finder , # type: PackageFinder
337
338
require_hashes , # type: bool
@@ -344,6 +345,7 @@ def __init__(
344
345
self .src_dir = src_dir
345
346
self .build_dir = build_dir
346
347
self .req_tracker = req_tracker
348
+ self ._session = session
347
349
self .downloader = downloader
348
350
self .finder = finder
349
351
@@ -459,32 +461,43 @@ def _get_linked_req_hashes(self, req):
459
461
# showing the user what the hash should be.
460
462
return req .hashes (trust_internet = False ) or MissingHashes ()
461
463
462
- def _fetch_metadata ( preparer , link ):
464
+ def _fetch_metadata_using_lazy_wheel ( self , link ):
463
465
# type: (Link) -> Optional[Distribution]
464
- """Fetch metadata, using lazy wheel if possible."""
465
- use_lazy_wheel = preparer .use_lazy_wheel
466
- remote_wheel = link .is_wheel and not link .is_file
467
- if use_lazy_wheel and remote_wheel and not preparer .require_hashes :
468
- wheel = Wheel (link .filename )
469
- name = canonicalize_name (wheel .name )
470
- # If HTTPRangeRequestUnsupported is raised, fallback silently.
471
- with indent_log (), suppress (HTTPRangeRequestUnsupported ):
472
- logger .info (
473
- 'Obtaining dependency information from %s %s' ,
474
- name , wheel .version ,
475
- )
476
- url = link .url .split ('#' , 1 )[0 ]
477
- session = preparer .downloader ._session
478
- return dist_from_wheel_url (name , url , session )
479
- return None
466
+ """Fetch metadata using lazy wheel, if possible."""
467
+ if not self .use_lazy_wheel :
468
+ return None
469
+ if self .require_hashes :
470
+ logger .debug ('Lazy wheel is not used as hash checking is required' )
471
+ return None
472
+ if link .is_file or not link .is_wheel :
473
+ logger .debug (
474
+ 'Lazy wheel is not used as '
475
+ '%r does not points to a remote wheel' ,
476
+ link ,
477
+ )
478
+ return None
479
+
480
+ wheel = Wheel (link .filename )
481
+ name = canonicalize_name (wheel .name )
482
+ logger .info (
483
+ 'Obtaining dependency information from %s %s' ,
484
+ name , wheel .version ,
485
+ )
486
+ url = link .url .split ('#' , 1 )[0 ]
487
+ try :
488
+ return dist_from_wheel_url (name , url , self ._session )
489
+ except HTTPRangeRequestUnsupported :
490
+ logger .debug ('%s does not support range requests' , url )
491
+ return None
480
492
481
493
def prepare_linked_requirement (self , req , parallel_builds = False ):
482
494
# type: (InstallRequirement, bool) -> Distribution
483
495
"""Prepare a requirement to be obtained from req.link."""
484
496
assert req .link
485
497
link = req .link
486
498
self ._log_preparing_link (req )
487
- wheel_dist = self ._fetch_metadata (link )
499
+ with indent_log ():
500
+ wheel_dist = self ._fetch_metadata_using_lazy_wheel (link )
488
501
if wheel_dist is not None :
489
502
req .needs_more_preparation = True
490
503
return wheel_dist
0 commit comments