From 23cae9c9e35cb46676570166ddea31c0a3daaef7 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Mon, 14 Mar 2022 22:07:11 -0400 Subject: [PATCH 1/5] There should be a way to marry up the pipenv package index restrictions to the Pip resolver so that it does not openly scan indexes that are package restricted. --- src/pip/_internal/index/collector.py | 5 +++++ src/pip/_internal/models/search_scope.py | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/pip/_internal/index/collector.py b/src/pip/_internal/index/collector.py index e6e9469af1a..ff175347de7 100644 --- a/src/pip/_internal/index/collector.py +++ b/src/pip/_internal/index/collector.py @@ -518,9 +518,11 @@ def __init__( self, session: PipSession, search_scope: SearchScope, + index_lookup: dict = None, ) -> None: self.search_scope = search_scope self.session = session + self.index_lookup = index_lookup if index_lookup else {} @classmethod def create( @@ -528,6 +530,7 @@ def create( session: PipSession, options: Values, suppress_no_index: bool = False, + index_lookup: dict = None, ) -> "LinkCollector": """ :param session: The Session to use to make requests. @@ -548,10 +551,12 @@ def create( search_scope = SearchScope.create( find_links=find_links, index_urls=index_urls, + index_lookup=index_lookup ) link_collector = LinkCollector( session=session, search_scope=search_scope, + index_lookup=index_lookup ) return link_collector diff --git a/src/pip/_internal/models/search_scope.py b/src/pip/_internal/models/search_scope.py index e4e54c2f4c6..b67f10cfbf6 100644 --- a/src/pip/_internal/models/search_scope.py +++ b/src/pip/_internal/models/search_scope.py @@ -20,13 +20,14 @@ class SearchScope: Encapsulates the locations that pip is configured to search. """ - __slots__ = ["find_links", "index_urls"] + __slots__ = ["find_links", "index_urls", "index_lookup"] @classmethod def create( cls, find_links: List[str], index_urls: List[str], + index_lookup: dict = None, ) -> "SearchScope": """ Create a SearchScope object after normalizing the `find_links`. @@ -60,15 +61,18 @@ def create( return cls( find_links=built_find_links, index_urls=index_urls, + index_lookup=index_lookup, ) def __init__( self, find_links: List[str], index_urls: List[str], + index_lookup: dict = None, ) -> None: self.find_links = find_links self.index_urls = index_urls + self.index_lookup = index_lookup if index_lookup else {} def get_formatted_locations(self) -> str: lines = [] @@ -126,4 +130,7 @@ def mkurl_pypi_url(url: str) -> str: loc = loc + "/" return loc - return [mkurl_pypi_url(url) for url in self.index_urls] + index_urls = self.index_urls + if project_name in self.index_lookup: + index_urls = [self.index_lookup[project_name]] + return [mkurl_pypi_url(url) for url in index_urls] From 9bfc91b120c62a6fc0392a5f372a24dbb96c772c Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Tue, 15 Mar 2022 11:34:45 -0400 Subject: [PATCH 2/5] change type hint of index_lookup and run precommit hooks on all files. --- src/pip/_internal/index/collector.py | 12 ++++-------- src/pip/_internal/models/search_scope.py | 6 +++--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/pip/_internal/index/collector.py b/src/pip/_internal/index/collector.py index ff175347de7..8897ee6a61d 100644 --- a/src/pip/_internal/index/collector.py +++ b/src/pip/_internal/index/collector.py @@ -518,7 +518,7 @@ def __init__( self, session: PipSession, search_scope: SearchScope, - index_lookup: dict = None, + index_lookup: Optional[Dict[str, str]] = None, ) -> None: self.search_scope = search_scope self.session = session @@ -530,7 +530,7 @@ def create( session: PipSession, options: Values, suppress_no_index: bool = False, - index_lookup: dict = None, + index_lookup: Optional[Dict[str, str]] = None, ) -> "LinkCollector": """ :param session: The Session to use to make requests. @@ -549,14 +549,10 @@ def create( find_links = options.find_links or [] search_scope = SearchScope.create( - find_links=find_links, - index_urls=index_urls, - index_lookup=index_lookup + find_links=find_links, index_urls=index_urls, index_lookup=index_lookup ) link_collector = LinkCollector( - session=session, - search_scope=search_scope, - index_lookup=index_lookup + session=session, search_scope=search_scope, index_lookup=index_lookup ) return link_collector diff --git a/src/pip/_internal/models/search_scope.py b/src/pip/_internal/models/search_scope.py index b67f10cfbf6..bb9183180c3 100644 --- a/src/pip/_internal/models/search_scope.py +++ b/src/pip/_internal/models/search_scope.py @@ -3,7 +3,7 @@ import os import posixpath import urllib.parse -from typing import List +from typing import Dict, List, Optional from pip._vendor.packaging.utils import canonicalize_name @@ -27,7 +27,7 @@ def create( cls, find_links: List[str], index_urls: List[str], - index_lookup: dict = None, + index_lookup: Optional[Dict[str, str]] = None, ) -> "SearchScope": """ Create a SearchScope object after normalizing the `find_links`. @@ -68,7 +68,7 @@ def __init__( self, find_links: List[str], index_urls: List[str], - index_lookup: dict = None, + index_lookup: Optional[Dict[str, str]] = None, ) -> None: self.find_links = find_links self.index_urls = index_urls From e862bc9c4e19447215946269739e40621cef271a Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Mon, 26 Jun 2023 20:25:28 -0400 Subject: [PATCH 3/5] Correction to account for vcs only (no index urls) --- src/pip/_internal/models/search_scope.py | 2 +- tests/unit/test_search_scope.py | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/pip/_internal/models/search_scope.py b/src/pip/_internal/models/search_scope.py index 6da070aa81b..b67f32bee8d 100644 --- a/src/pip/_internal/models/search_scope.py +++ b/src/pip/_internal/models/search_scope.py @@ -136,6 +136,6 @@ def mkurl_pypi_url(url: str) -> str: index_urls = self.index_urls if project_name in self.index_lookup: index_urls = [self.index_lookup[project_name]] - else: + elif self.index_urls: index_urls = [self.index_urls[0]] return [mkurl_pypi_url(url) for url in index_urls] diff --git a/tests/unit/test_search_scope.py b/tests/unit/test_search_scope.py index d8128341659..213bff5739b 100644 --- a/tests/unit/test_search_scope.py +++ b/tests/unit/test_search_scope.py @@ -25,8 +25,8 @@ def test_get_formatted_locations_basic_auth(self) -> None: assert "links-user:****@page.domain.com" in result assert "links-pass" not in result - def test_get_index_urls_locations(self) -> None: - """Check that the canonical name is on all indexes""" + def test_get_index_urls_location_default(self) -> None: + """Check that the default index url is used when no index is specified.""" search_scope = SearchScope( find_links=[], index_urls=["file://index1/", "file://index2"], @@ -35,7 +35,17 @@ def test_get_index_urls_locations(self) -> None: req = install_req_from_line("Complex_Name") assert req.name is not None actual = search_scope.get_index_urls_locations(req.name) - assert actual == [ - "file://index1/complex-name/", - "file://index2/complex-name/", - ] + assert actual == ["file://index1/complex-name/"] + + def test_get_index_urls_location_specified(self) -> None: + """Check that the specified index url is used.""" + search_scope = SearchScope( + find_links=[], + index_urls=["file://index1/", "file://index2"], + no_index=False, + index_lookup={"complex-name": "file://index2"}, + ) + req = install_req_from_line("Complex_Name") + assert req.name is not None + actual = search_scope.get_index_urls_locations(req.name) + assert actual == ["file://index2/complex-name/"] From b1d2bf902c19e03bde0c70ab2d355f796dd5903a Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Mon, 26 Jun 2023 21:08:45 -0400 Subject: [PATCH 4/5] fix test --- tests/unit/test_search_scope.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_search_scope.py b/tests/unit/test_search_scope.py index 213bff5739b..20261771fdd 100644 --- a/tests/unit/test_search_scope.py +++ b/tests/unit/test_search_scope.py @@ -43,7 +43,7 @@ def test_get_index_urls_location_specified(self) -> None: find_links=[], index_urls=["file://index1/", "file://index2"], no_index=False, - index_lookup={"complex-name": "file://index2"}, + index_lookup={"complex_name": "file://index2"}, ) req = install_req_from_line("Complex_Name") assert req.name is not None From 39cc4aaf973058bb60474803762244b8d922fb65 Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Mon, 26 Jun 2023 21:35:06 -0400 Subject: [PATCH 5/5] fix test expectation --- tests/unit/test_search_scope.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/test_search_scope.py b/tests/unit/test_search_scope.py index 20261771fdd..2c7f79bb42e 100644 --- a/tests/unit/test_search_scope.py +++ b/tests/unit/test_search_scope.py @@ -43,7 +43,7 @@ def test_get_index_urls_location_specified(self) -> None: find_links=[], index_urls=["file://index1/", "file://index2"], no_index=False, - index_lookup={"complex_name": "file://index2"}, + index_lookup={"Complex_Name": "file://index2"}, ) req = install_req_from_line("Complex_Name") assert req.name is not None