Skip to content

Commit

Permalink
Add find_requirement() wrapper in legacy resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
uranusjr committed Apr 24, 2020
1 parent daff811 commit cdc9954
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 38 deletions.
6 changes: 3 additions & 3 deletions src/pip/_internal/index/package_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -889,11 +889,11 @@ def find_best_candidate(
return candidate_evaluator.compute_best_candidate(candidates)

def find_requirement(self, req, upgrade):
# type: (InstallRequirement, bool) -> Optional[Link]
# type: (InstallRequirement, bool) -> Optional[InstallationCandidate]
"""Try to find a Link matching req
Expects req, an InstallRequirement and upgrade, a boolean
Returns a Link if found,
Returns a InstallationCandidate if found,
Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise
"""
hashes = req.hashes(trust_internet=False)
Expand Down Expand Up @@ -967,7 +967,7 @@ def _format_versions(cand_iter):
best_candidate.version,
_format_versions(best_candidate_result.iter_applicable()),
)
return best_candidate.link
return best_candidate


def _find_name_version_sep(fragment, canonical_name):
Expand Down
13 changes: 11 additions & 2 deletions src/pip/_internal/resolution/legacy/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
from pip._internal.cache import WheelCache
from pip._internal.distributions import AbstractDistribution
from pip._internal.index.package_finder import PackageFinder
from pip._internal.models.link import Link
from pip._internal.operations.prepare import RequirementPreparer
from pip._internal.req.req_install import InstallRequirement
from pip._internal.resolution.base import InstallRequirementProvider
Expand Down Expand Up @@ -260,6 +261,14 @@ def _check_skip_installed(self, req_to_install):
self._set_req_to_reinstall(req_to_install)
return None

def _find_requirement_link(self, req):
# type: (InstallRequirement) -> Optional[Link]
upgrade = self._is_upgrade_allowed(req)
best_candidate = self.finder.find_requirement(req, upgrade)
if not best_candidate:
return None
return best_candidate.link

def _populate_link(self, req):
# type: (InstallRequirement) -> None
"""Ensure that if a link can be found for this, that it is found.
Expand All @@ -274,9 +283,9 @@ def _populate_link(self, req):
mismatches. Furthermore, cached wheels at present have undeterministic
contents due to file modification times.
"""
upgrade = self._is_upgrade_allowed(req)

if req.link is None:
req.link = self.finder.find_requirement(req, upgrade)
req.link = self._find_requirement_link(req)

if self.wheel_cache is None or self.preparer.require_hashes:
return
Expand Down
67 changes: 34 additions & 33 deletions tests/unit/test_finder.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def test_no_mpkg(data):
req = install_req_from_line("pkgwithmpkg")
found = finder.find_requirement(req, False)

assert found.url.endswith("pkgwithmpkg-1.0.tar.gz"), found
assert found.link.url.endswith("pkgwithmpkg-1.0.tar.gz"), found


def test_no_partial_name_match(data):
Expand All @@ -57,7 +57,7 @@ def test_no_partial_name_match(data):
req = install_req_from_line("gmpy")
found = finder.find_requirement(req, False)

assert found.url.endswith("gmpy-1.15.tar.gz"), found
assert found.link.url.endswith("gmpy-1.15.tar.gz"), found


def test_tilde():
Expand All @@ -79,23 +79,23 @@ def test_duplicates_sort_ok(data):
req = install_req_from_line("duplicate")
found = finder.find_requirement(req, False)

assert found.url.endswith("duplicate-1.0.tar.gz"), found
assert found.link.url.endswith("duplicate-1.0.tar.gz"), found


def test_finder_detects_latest_find_links(data):
"""Test PackageFinder detects latest using find-links"""
req = install_req_from_line('simple', None)
finder = make_test_finder(find_links=[data.find_links])
link = finder.find_requirement(req, False)
assert link.url.endswith("simple-3.0.tar.gz")
found = finder.find_requirement(req, False)
assert found.link.url.endswith("simple-3.0.tar.gz")


def test_incorrect_case_file_index(data):
"""Test PackageFinder detects latest using wrong case"""
req = install_req_from_line('dinner', None)
finder = make_test_finder(index_urls=[data.find_links3])
link = finder.find_requirement(req, False)
assert link.url.endswith("Dinner-2.0.tar.gz")
found = finder.find_requirement(req, False)
assert found.link.url.endswith("Dinner-2.0.tar.gz")


@pytest.mark.network
Expand Down Expand Up @@ -180,7 +180,7 @@ def test_find_wheel_supported(self, data, monkeypatch):
finder = make_test_finder(find_links=[data.find_links])
found = finder.find_requirement(req, True)
assert (
found.url.endswith("simple.dist-0.1-py2.py3-none-any.whl")
found.link.url.endswith("simple.dist-0.1-py2.py3-none-any.whl")
), found

def test_wheel_over_sdist_priority(self, data):
Expand All @@ -191,7 +191,8 @@ def test_wheel_over_sdist_priority(self, data):
req = install_req_from_line("priority")
finder = make_test_finder(find_links=[data.find_links])
found = finder.find_requirement(req, True)
assert found.url.endswith("priority-1.0-py2.py3-none-any.whl"), found
assert found.link.url.endswith("priority-1.0-py2.py3-none-any.whl"), \
found

def test_existing_over_wheel_priority(self, data):
"""
Expand Down Expand Up @@ -292,8 +293,8 @@ def test_finder_priority_file_over_page(data):
assert all(version.link.scheme == 'https'
for version in all_versions[1:]), all_versions

link = finder.find_requirement(req, False)
assert link.url.startswith("file://")
found = finder.find_requirement(req, False)
assert found.link.url.startswith("file://")


def test_finder_priority_nonegg_over_eggfragments():
Expand All @@ -306,19 +307,19 @@ def test_finder_priority_nonegg_over_eggfragments():
assert all_versions[0].link.url.endswith('tar.gz')
assert all_versions[1].link.url.endswith('#egg=bar-1.0')

link = finder.find_requirement(req, False)
found = finder.find_requirement(req, False)

assert link.url.endswith('tar.gz')
assert found.link.url.endswith('tar.gz')

links.reverse()

finder = make_no_network_finder(links)
all_versions = finder.find_all_candidates(req.name)
assert all_versions[0].link.url.endswith('tar.gz')
assert all_versions[1].link.url.endswith('#egg=bar-1.0')
link = finder.find_requirement(req, False)
found = finder.find_requirement(req, False)

assert link.url.endswith('tar.gz')
assert found.link.url.endswith('tar.gz')


def test_finder_only_installs_stable_releases(data):
Expand All @@ -330,21 +331,21 @@ def test_finder_only_installs_stable_releases(data):

# using a local index (that has pre & dev releases)
finder = make_test_finder(index_urls=[data.index_url("pre")])
link = finder.find_requirement(req, False)
assert link.url.endswith("bar-1.0.tar.gz"), link.url
found = finder.find_requirement(req, False)
assert found.link.url.endswith("bar-1.0.tar.gz"), found.link.url

# using find-links
links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"]

finder = make_no_network_finder(links)
link = finder.find_requirement(req, False)
assert link.url == "https://foo/bar-1.0.tar.gz"
found = finder.find_requirement(req, False)
assert found.link.url == "https://foo/bar-1.0.tar.gz"

links.reverse()

finder = make_no_network_finder(links)
link = finder.find_requirement(req, False)
assert link.url == "https://foo/bar-1.0.tar.gz"
found = finder.find_requirement(req, False)
assert found.link.url == "https://foo/bar-1.0.tar.gz"


def test_finder_only_installs_data_require(data):
Expand Down Expand Up @@ -383,21 +384,21 @@ def test_finder_installs_pre_releases(data):
index_urls=[data.index_url("pre")],
allow_all_prereleases=True,
)
link = finder.find_requirement(req, False)
assert link.url.endswith("bar-2.0b1.tar.gz"), link.url
found = finder.find_requirement(req, False)
assert found.link.url.endswith("bar-2.0b1.tar.gz"), found.link.url

# using find-links
links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"]

finder = make_no_network_finder(links, allow_all_prereleases=True)
link = finder.find_requirement(req, False)
assert link.url == "https://foo/bar-2.0b1.tar.gz"
found = finder.find_requirement(req, False)
assert found.link.url == "https://foo/bar-2.0b1.tar.gz"

links.reverse()

finder = make_no_network_finder(links, allow_all_prereleases=True)
link = finder.find_requirement(req, False)
assert link.url == "https://foo/bar-2.0b1.tar.gz"
found = finder.find_requirement(req, False)
assert found.link.url == "https://foo/bar-2.0b1.tar.gz"


def test_finder_installs_dev_releases(data):
Expand All @@ -412,8 +413,8 @@ def test_finder_installs_dev_releases(data):
index_urls=[data.index_url("dev")],
allow_all_prereleases=True,
)
link = finder.find_requirement(req, False)
assert link.url.endswith("bar-2.0.dev1.tar.gz"), link.url
found = finder.find_requirement(req, False)
assert found.link.url.endswith("bar-2.0.dev1.tar.gz"), found.link.url


def test_finder_installs_pre_releases_with_version_spec():
Expand All @@ -424,14 +425,14 @@ def test_finder_installs_pre_releases_with_version_spec():
links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"]

finder = make_no_network_finder(links)
link = finder.find_requirement(req, False)
assert link.url == "https://foo/bar-2.0b1.tar.gz"
found = finder.find_requirement(req, False)
assert found.link.url == "https://foo/bar-2.0b1.tar.gz"

links.reverse()

finder = make_no_network_finder(links)
link = finder.find_requirement(req, False)
assert link.url == "https://foo/bar-2.0b1.tar.gz"
found = finder.find_requirement(req, False)
assert found.link.url == "https://foo/bar-2.0b1.tar.gz"


class TestLinkEvaluator(object):
Expand Down

0 comments on commit cdc9954

Please sign in to comment.