diff --git a/news/c6182139-edb4-4bf6-bc3f-2d37cb5759ad.trivial b/news/c6182139-edb4-4bf6-bc3f-2d37cb5759ad.trivial new file mode 100644 index 000000000..e69de29bb diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py index 76d83896c..6562fe918 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -238,6 +238,7 @@ class RequirementCommand(IndexGroupCommand): wheel_download_dir=wheel_download_dir, build_isolation=options.build_isolation, req_tracker=req_tracker, + session=session, downloader=downloader, finder=finder, require_hashes=options.require_hashes, diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index ddfa42989..e9e534e32 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -9,7 +9,6 @@ import mimetypes import os import shutil -from pip._vendor.contextlib2 import suppress from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.six import PY2 @@ -56,6 +55,7 @@ if MYPY_CHECK_RUNNING: from pip._internal.index.package_finder import PackageFinder from pip._internal.models.link import Link from pip._internal.network.download import Downloader + from pip._internal.network.session import PipSession from pip._internal.req.req_install import InstallRequirement from pip._internal.req.req_tracker import RequirementTracker from pip._internal.utils.hashes import Hashes @@ -332,6 +332,7 @@ class RequirementPreparer(object): wheel_download_dir, # type: Optional[str] build_isolation, # type: bool req_tracker, # type: RequirementTracker + session, # type: PipSession downloader, # type: Downloader finder, # type: PackageFinder require_hashes, # type: bool @@ -344,6 +345,7 @@ class RequirementPreparer(object): self.src_dir = src_dir self.build_dir = build_dir self.req_tracker = req_tracker + self._session = session self.downloader = downloader self.finder = finder @@ -459,24 +461,34 @@ class RequirementPreparer(object): # showing the user what the hash should be. return req.hashes(trust_internet=False) or MissingHashes() - def _fetch_metadata(preparer, link): + def _fetch_metadata_using_lazy_wheel(self, link): # type: (Link) -> Optional[Distribution] - """Fetch metadata, using lazy wheel if possible.""" - use_lazy_wheel = preparer.use_lazy_wheel - remote_wheel = link.is_wheel and not link.is_file - if use_lazy_wheel and remote_wheel and not preparer.require_hashes: - wheel = Wheel(link.filename) - name = canonicalize_name(wheel.name) - # If HTTPRangeRequestUnsupported is raised, fallback silently. - with indent_log(), suppress(HTTPRangeRequestUnsupported): - logger.info( - 'Obtaining dependency information from %s %s', - name, wheel.version, - ) - url = link.url.split('#', 1)[0] - session = preparer.downloader._session - return dist_from_wheel_url(name, url, session) - return None + """Fetch metadata using lazy wheel, if possible.""" + if not self.use_lazy_wheel: + return None + if self.require_hashes: + logger.debug('Lazy wheel is not used as hash checking is required') + return None + if link.is_file or not link.is_wheel: + logger.debug( + 'Lazy wheel is not used as ' + '%r does not points to a remote wheel', + link, + ) + return None + + wheel = Wheel(link.filename) + name = canonicalize_name(wheel.name) + logger.info( + 'Obtaining dependency information from %s %s', + name, wheel.version, + ) + url = link.url.split('#', 1)[0] + try: + return dist_from_wheel_url(name, url, self._session) + except HTTPRangeRequestUnsupported: + logger.debug('%s does not support range requests', url) + return None def prepare_linked_requirement(self, req, parallel_builds=False): # type: (InstallRequirement, bool) -> Distribution @@ -484,7 +496,8 @@ class RequirementPreparer(object): assert req.link link = req.link self._log_preparing_link(req) - wheel_dist = self._fetch_metadata(link) + with indent_log(): + wheel_dist = self._fetch_metadata_using_lazy_wheel(link) if wheel_dist is not None: req.needs_more_preparation = True return wheel_dist diff --git a/tests/unit/test_req.py b/tests/unit/test_req.py index b8da86399..ff1b51ae4 100644 --- a/tests/unit/test_req.py +++ b/tests/unit/test_req.py @@ -76,6 +76,7 @@ class TestRequirementSet(object): isolated=False, use_pep517=None, ) + session = PipSession() with get_requirement_tracker() as tracker: preparer = RequirementPreparer( @@ -85,7 +86,8 @@ class TestRequirementSet(object): wheel_download_dir=None, build_isolation=True, req_tracker=tracker, - downloader=Downloader(PipSession(), progress_bar="on"), + session=session, + downloader=Downloader(session, progress_bar="on"), finder=finder, require_hashes=require_hashes, use_user_site=False,