diff --git a/news/5175.bugfix b/news/5175.bugfix new file mode 100644 index 00000000000..5072bd4c9a2 --- /dev/null +++ b/news/5175.bugfix @@ -0,0 +1 @@ +Fix `PackageFinder.find_all_candidates` to respect the `allow_all_prereleases` parameter diff --git a/src/pip/_internal/index.py b/src/pip/_internal/index.py index 876fff2213f..cd88ac4642c 100644 --- a/src/pip/_internal/index.py +++ b/src/pip/_internal/index.py @@ -613,10 +613,11 @@ def find_all_candidates(self, project_name): ) # This is an intentional priority ordering - return ( - file_versions + find_links_versions + page_versions + - dependency_versions - ) + all_candidates = file_versions + find_links_versions + page_versions + dependency_versions + if (not self.allow_all_prereleases): + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + return (all_candidates) def find_requirement(self, req, upgrade): """Try to find a Link matching req diff --git a/tests/unit/test_finder.py b/tests/unit/test_finder.py index 05ebed3b560..f27bec850dc 100644 --- a/tests/unit/test_finder.py +++ b/tests/unit/test_finder.py @@ -463,6 +463,44 @@ def test_finder_installs_pre_releases(data): link = finder.find_requirement(req, False) assert link.url == "https://foo/bar-2.0b1.tar.gz" +def test_finder_does_not_return_pre_release_candidates(data): + """ + Test PackageFinder finds pre-releases if asked to. + """ + + req = install_req_from_line("bar", None) + + # using a local index (that has pre & dev releases) + finder = PackageFinder( + [], [data.index_url("pre")], + allow_all_prereleases=False, + session=PipSession(), + ) + for candidate in finder.find_all_candidates("bar"): + assert not candidate.version.is_prerelease + + # using find-links + links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"] + finder = PackageFinder( + links, [], + allow_all_prereleases=False, + session=PipSession(), + ) + + with patch.object(finder, "_get_pages", lambda x, y: []): + for candidate in finder.find_all_candidates("bar"): + assert not candidate.version.is_prerelease + + links.reverse() + finder = PackageFinder( + links, [], + allow_all_prereleases=True, + session=PipSession(), + ) + + with patch.object(finder, "_get_pages", lambda x, y: []): + for candidate in finder.find_all_candidates("bar"): + assert not candidate.version.is_prerelease def test_finder_installs_dev_releases(data): """ @@ -492,14 +530,14 @@ def test_finder_installs_pre_releases_with_version_spec(): with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) - assert link.url == "https://foo/bar-2.0b1.tar.gz" + assert link.url == "https://foo/bar-1.0.tar.gz" links.reverse() finder = PackageFinder(links, [], session=PipSession()) with patch.object(finder, "_get_pages", lambda x, y: []): link = finder.find_requirement(req, False) - assert link.url == "https://foo/bar-2.0b1.tar.gz" + assert link.url == "https://foo/bar-1.0.tar.gz" class test_link_package_versions(object):