Merge pull request #6562 from cjerdonek/make-test-package-finder

Add make_test_finder() helper function
This commit is contained in:
Chris Jerdonek 2019-06-12 02:10:49 -07:00 committed by GitHub
commit efaabe3bdd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 105 additions and 136 deletions

View File

@ -1,10 +1,8 @@
from pip._vendor import pytoml
from pip._internal.build_env import BuildEnvironment
from pip._internal.download import PipSession
from pip._internal.index import PackageFinder
from pip._internal.req import InstallRequirement
from tests.lib import path_to_url
from tests.lib import make_test_finder, path_to_url
def make_project(tmpdir, requires=[], backend=None):
@ -23,7 +21,7 @@ def test_backend(tmpdir, data):
req = InstallRequirement(None, None, source_dir=project_dir)
req.load_pyproject_toml()
env = BuildEnvironment()
finder = PackageFinder.create([data.backends], [], session=PipSession())
finder = make_test_finder(find_links=[data.backends])
env.install_requirements(finder, ["dummy_backend"], 'normal', "Installing")
conflicting, missing = env.check_requirements(["dummy_backend"])
assert not conflicting and not missing

View File

@ -14,8 +14,16 @@ import pytest
from scripttest import FoundDir, TestFileEnvironment
from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX
from pip._internal.download import PipSession
from pip._internal.index import PackageFinder
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
from tests.lib.path import Path, curdir
if MYPY_CHECK_RUNNING:
from typing import Iterable, List, Optional
from pip._internal.models.target_python import TargetPython
DATA_DIR = Path(__file__).folder.folder.join("data").abspath
SRC_DIR = Path(__file__).abspath.folder.folder.folder
@ -69,6 +77,35 @@ def create_file(path, contents=None):
f.write("\n")
def make_test_finder(
find_links=None, # type: Optional[List[str]]
index_urls=None, # type: Optional[List[str]]
allow_all_prereleases=False, # type: bool
trusted_hosts=None, # type: Optional[Iterable[str]]
session=None, # type: Optional[PipSession]
target_python=None, # type: Optional[TargetPython]
):
# type: (...) -> PackageFinder
"""
Create a PackageFinder for testing purposes.
"""
if find_links is None:
find_links = []
if index_urls is None:
index_urls = []
if session is None:
session = PipSession()
return PackageFinder.create(
find_links,
index_urls,
allow_all_prereleases=allow_all_prereleases,
trusted_hosts=trusted_hosts,
session=session,
target_python=target_python,
)
class TestData(object):
"""
Represents a bundle of pre-created test data.

View File

@ -3,9 +3,7 @@ from textwrap import dedent
import pytest
from pip._internal.build_env import BuildEnvironment
from pip._internal.download import PipSession
from pip._internal.index import PackageFinder
from tests.lib import create_basic_wheel_for_package
from tests.lib import create_basic_wheel_for_package, make_test_finder
def indent(text, prefix):
@ -59,9 +57,7 @@ def test_build_env_allow_empty_requirements_install():
def test_build_env_allow_only_one_install(script):
create_basic_wheel_for_package(script, 'foo', '1.0')
create_basic_wheel_for_package(script, 'bar', '1.0')
finder = PackageFinder.create(
[script.scratch_path], [], session=PipSession(),
)
finder = make_test_finder(find_links=[script.scratch_path])
build_env = BuildEnvironment()
for prefix in ('normal', 'overlay'):
build_env.install_requirements(finder, ['foo'], prefix,

View File

@ -7,20 +7,20 @@ from pkg_resources import Distribution, parse_version
import pip._internal.pep425tags
import pip._internal.wheel
from pip._internal.download import PipSession
from pip._internal.exceptions import (
BestVersionAlreadyInstalled, DistributionNotFound,
)
from pip._internal.index import (
CandidateEvaluator, InstallationCandidate, Link, PackageFinder, Search,
CandidateEvaluator, InstallationCandidate, Link, Search,
)
from pip._internal.models.target_python import TargetPython
from pip._internal.req.constructors import install_req_from_line
from tests.lib import make_test_finder
def test_no_mpkg(data):
"""Finder skips zipfiles with "macosx10" in the name."""
finder = PackageFinder.create([data.find_links], [], session=PipSession())
finder = make_test_finder(find_links=[data.find_links])
req = install_req_from_line("pkgwithmpkg")
found = finder.find_requirement(req, False)
@ -29,7 +29,7 @@ def test_no_mpkg(data):
def test_no_partial_name_match(data):
"""Finder requires the full project name to match, not just beginning."""
finder = PackageFinder.create([data.find_links], [], session=PipSession())
finder = make_test_finder(find_links=[data.find_links])
req = install_req_from_line("gmpy")
found = finder.find_requirement(req, False)
@ -38,9 +38,8 @@ def test_no_partial_name_match(data):
def test_tilde():
"""Finder can accept a path with ~ in it and will normalize it."""
session = PipSession()
with patch('pip._internal.index.os.path.exists', return_value=True):
finder = PackageFinder.create(['~/python-pkgs'], [], session=session)
finder = make_test_finder(find_links=['~/python-pkgs'])
req = install_req_from_line("gmpy")
with pytest.raises(DistributionNotFound):
finder.find_requirement(req, False)
@ -49,11 +48,7 @@ def test_tilde():
def test_duplicates_sort_ok(data):
"""Finder successfully finds one of a set of duplicates in different
locations"""
finder = PackageFinder.create(
[data.find_links, data.find_links2],
[],
session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links, data.find_links2])
req = install_req_from_line("duplicate")
found = finder.find_requirement(req, False)
@ -63,7 +58,7 @@ def test_duplicates_sort_ok(data):
def test_finder_detects_latest_find_links(data):
"""Test PackageFinder detects latest using find-links"""
req = install_req_from_line('simple', None)
finder = PackageFinder.create([data.find_links], [], session=PipSession())
finder = make_test_finder(find_links=[data.find_links])
link = finder.find_requirement(req, False)
assert link.url.endswith("simple-3.0.tar.gz")
@ -71,7 +66,7 @@ def test_finder_detects_latest_find_links(data):
def test_incorrect_case_file_index(data):
"""Test PackageFinder detects latest using wrong case"""
req = install_req_from_line('dinner', None)
finder = PackageFinder.create([], [data.find_links3], session=PipSession())
finder = make_test_finder(index_urls=[data.find_links3])
link = finder.find_requirement(req, False)
assert link.url.endswith("Dinner-2.0.tar.gz")
@ -88,7 +83,7 @@ def test_finder_detects_latest_already_satisfied_find_links(data):
version=latest_version
)
req.satisfied_by = satisfied_by
finder = PackageFinder.create([data.find_links], [], session=PipSession())
finder = make_test_finder(find_links=[data.find_links])
with pytest.raises(BestVersionAlreadyInstalled):
finder.find_requirement(req, True)
@ -106,11 +101,7 @@ def test_finder_detects_latest_already_satisfied_pypi_links():
version=latest_version,
)
req.satisfied_by = satisfied_by
finder = PackageFinder.create(
[],
["http://pypi.org/simple/"],
session=PipSession(),
)
finder = make_test_finder(index_urls=["http://pypi.org/simple/"])
with pytest.raises(BestVersionAlreadyInstalled):
finder.find_requirement(req, True)
@ -126,11 +117,7 @@ class TestWheel:
req = install_req_from_line("invalid")
# data.find_links contains "invalid.whl", which is an invalid wheel
finder = PackageFinder.create(
[data.find_links],
[],
session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
with pytest.raises(DistributionNotFound):
finder.find_requirement(req, True)
@ -144,10 +131,8 @@ class TestWheel:
target_python = TargetPython()
# Make sure no tags will match.
target_python._valid_tags = []
finder = PackageFinder.create(
[data.find_links],
[],
session=PipSession(),
finder = make_test_finder(
find_links=[data.find_links],
target_python=target_python,
)
@ -165,11 +150,7 @@ class TestWheel:
)
req = install_req_from_line("simple.dist")
finder = PackageFinder.create(
[data.find_links],
[],
session=PipSession(),
)
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")
@ -181,11 +162,7 @@ class TestWheel:
`test_link_sorting` also covers this at lower level
"""
req = install_req_from_line("priority")
finder = PackageFinder.create(
[data.find_links],
[],
session=PipSession(),
)
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
@ -202,11 +179,7 @@ class TestWheel:
version=latest_version,
)
req.satisfied_by = satisfied_by
finder = PackageFinder.create(
[data.find_links],
[],
session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
with pytest.raises(BestVersionAlreadyInstalled):
finder.find_requirement(req, True)
@ -271,7 +244,7 @@ class TestWheel:
Link("simplewheel-1.0-py2.py3-none-any.whl"),
),
]
finder = PackageFinder.create([], [], session=PipSession())
finder = make_test_finder()
sort_key = finder.candidate_evaluator._sort_key
results = sorted(links, key=sort_key, reverse=True)
results2 = sorted(reversed(links), key=sort_key, reverse=True)
@ -281,10 +254,9 @@ class TestWheel:
def test_finder_priority_file_over_page(data):
"""Test PackageFinder prefers file links over equivalent page links"""
req = install_req_from_line('gmpy==1.15', None)
finder = PackageFinder.create(
[data.find_links],
["http://pypi.org/simple/"],
session=PipSession(),
finder = make_test_finder(
find_links=[data.find_links],
index_urls=["http://pypi.org/simple/"],
)
all_versions = finder.find_all_candidates(req.name)
# 1 file InstallationCandidate followed by all https ones
@ -301,7 +273,7 @@ def test_finder_priority_nonegg_over_eggfragments():
req = install_req_from_line('bar==1.0', None)
links = ['http://foo/bar.py#egg=bar-1.0', 'http://foo/bar-1.0.tar.gz']
finder = PackageFinder.create(links, [], session=PipSession())
finder = make_test_finder(find_links=links)
with patch.object(finder, "_get_pages", lambda x, y: []):
all_versions = finder.find_all_candidates(req.name)
@ -313,7 +285,7 @@ def test_finder_priority_nonegg_over_eggfragments():
assert link.url.endswith('tar.gz')
links.reverse()
finder = PackageFinder.create(links, [], session=PipSession())
finder = make_test_finder(find_links=links)
with patch.object(finder, "_get_pages", lambda x, y: []):
all_versions = finder.find_all_candidates(req.name)
@ -332,22 +304,20 @@ def test_finder_only_installs_stable_releases(data):
req = install_req_from_line("bar", None)
# using a local index (that has pre & dev releases)
finder = PackageFinder.create(
[], [data.index_url("pre")], session=PipSession(),
)
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
# using find-links
links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"]
finder = PackageFinder.create(links, [], session=PipSession())
finder = make_test_finder(find_links=links)
with patch.object(finder, "_get_pages", lambda x, y: []):
link = finder.find_requirement(req, False)
assert link.url == "https://foo/bar-1.0.tar.gz"
links.reverse()
finder = PackageFinder.create(links, [], session=PipSession())
finder = make_test_finder(find_links=links)
with patch.object(finder, "_get_pages", lambda x, y: []):
link = finder.find_requirement(req, False)
@ -366,9 +336,7 @@ def test_finder_only_installs_data_require(data):
"""
# using a local index (that has pre & dev releases)
finder = PackageFinder.create(
[], [data.index_url("datarequire")], session=PipSession(),
)
finder = make_test_finder(index_urls=[data.index_url("datarequire")])
links = finder.find_all_candidates("fakepackage")
expected = ['1.0.0', '9.9.9']
@ -388,32 +356,23 @@ def test_finder_installs_pre_releases(data):
req = install_req_from_line("bar", None)
# using a local index (that has pre & dev releases)
finder = PackageFinder.create(
[], [data.index_url("pre")],
finder = make_test_finder(
index_urls=[data.index_url("pre")],
allow_all_prereleases=True,
session=PipSession(),
)
link = finder.find_requirement(req, False)
assert link.url.endswith("bar-2.0b1.tar.gz"), link.url
# using find-links
links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"]
finder = PackageFinder.create(
links, [],
allow_all_prereleases=True,
session=PipSession(),
)
finder = make_test_finder(find_links=links, allow_all_prereleases=True)
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"
links.reverse()
finder = PackageFinder.create(
links, [],
allow_all_prereleases=True,
session=PipSession(),
)
finder = make_test_finder(find_links=links, allow_all_prereleases=True)
with patch.object(finder, "_get_pages", lambda x, y: []):
link = finder.find_requirement(req, False)
@ -428,10 +387,9 @@ def test_finder_installs_dev_releases(data):
req = install_req_from_line("bar", None)
# using a local index (that has dev releases)
finder = PackageFinder.create(
[], [data.index_url("dev")],
finder = make_test_finder(
index_urls=[data.index_url("dev")],
allow_all_prereleases=True,
session=PipSession(),
)
link = finder.find_requirement(req, False)
assert link.url.endswith("bar-2.0.dev1.tar.gz"), link.url
@ -444,14 +402,14 @@ def test_finder_installs_pre_releases_with_version_spec():
req = install_req_from_line("bar>=0.0.dev0", None)
links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"]
finder = PackageFinder.create(links, [], session=PipSession())
finder = make_test_finder(find_links=links)
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"
links.reverse()
finder = PackageFinder.create(links, [], session=PipSession())
finder = make_test_finder(find_links=links)
with patch.object(finder, "_get_pages", lambda x, y: []):
link = finder.find_requirement(req, False)
@ -507,8 +465,7 @@ class TestCandidateEvaluator(object):
def test_get_index_urls_locations():
"""Check that the canonical name is on all indexes"""
finder = PackageFinder.create(
[], ['file://index1/', 'file://index2'], session=PipSession())
finder = make_test_finder(index_urls=['file://index1/', 'file://index2'])
locations = finder._get_index_urls_locations(
install_req_from_line('Complex_Name').name)
assert locations == ['file://index1/complex-name/',
@ -517,27 +474,27 @@ def test_get_index_urls_locations():
def test_find_all_candidates_nothing():
"""Find nothing without anything"""
finder = PackageFinder.create([], [], session=PipSession())
finder = make_test_finder()
assert not finder.find_all_candidates('pip')
def test_find_all_candidates_find_links(data):
finder = PackageFinder.create(
[data.find_links], [], session=PipSession())
finder = make_test_finder(find_links=[data.find_links])
versions = finder.find_all_candidates('simple')
assert [str(v.version) for v in versions] == ['3.0', '2.0', '1.0']
def test_find_all_candidates_index(data):
finder = PackageFinder.create(
[], [data.index_url('simple')], session=PipSession())
finder = make_test_finder(index_urls=[data.index_url('simple')])
versions = finder.find_all_candidates('simple')
assert [str(v.version) for v in versions] == ['1.0']
def test_find_all_candidates_find_links_and_index(data):
finder = PackageFinder.create(
[data.find_links], [data.index_url('simple')], session=PipSession())
finder = make_test_finder(
find_links=[data.find_links],
index_urls=[data.index_url('simple')],
)
versions = finder.find_all_candidates('simple')
# first the find-links versions then the page versions
assert [str(v.version) for v in versions] == ['3.0', '2.0', '1.0', '1.0']

View File

@ -12,7 +12,7 @@ from pip._internal.index import (
_egg_info_matches, _find_name_version_sep, _get_html_page,
)
from pip._internal.models.target_python import TargetPython
from tests.lib import CURRENT_PY_VERSION_INFO
from tests.lib import CURRENT_PY_VERSION_INFO, make_test_finder
@pytest.mark.parametrize('requires_python, expected', [
@ -156,9 +156,8 @@ class TestPackageFinder:
"""
target_python = TargetPython(py_version_info=(3, 7, 3))
finder = PackageFinder.create(
[], [], target_python=target_python, session=object(),
[], [], session=object(), target_python=target_python,
)
evaluator = finder.candidate_evaluator
actual_target_python = evaluator._target_python
assert actual_target_python is target_python
@ -169,7 +168,7 @@ def test_sort_locations_file_expand_dir(data):
"""
Test that a file:// dir gets listdir run with expand_dir
"""
finder = PackageFinder.create([data.find_links], [], session=PipSession())
finder = make_test_finder(find_links=[data.find_links])
files, urls = finder._sort_locations([data.find_links], expand_dir=True)
assert files and not urls, (
"files and not urls should have been found at find-links url: %s" %
@ -182,7 +181,7 @@ def test_sort_locations_file_not_find_link(data):
Test that a file:// url dir that's not a find-link, doesn't get a listdir
run
"""
finder = PackageFinder.create([], [], session=PipSession())
finder = make_test_finder()
files, urls = finder._sort_locations([data.index_url("empty_with_pkg")])
assert urls and not files, "urls, but not files should have been found"
@ -191,7 +190,7 @@ def test_sort_locations_non_existing_path():
"""
Test that a non-existing path is ignored.
"""
finder = PackageFinder.create([], [], session=PipSession())
finder = make_test_finder()
files, urls = finder._sort_locations(
[os.path.join('this', 'doesnt', 'exist')])
assert not urls and not files, "nothing should have been found"
@ -297,7 +296,7 @@ class MockLogger(object):
],
)
def test_secure_origin(location, trusted, expected):
finder = PackageFinder.create([], [], session=[], trusted_hosts=trusted)
finder = make_test_finder(trusted_hosts=trusted)
logger = MockLogger()
finder._validate_secure_origin(logger, location)
assert logger.called == expected
@ -315,7 +314,7 @@ def test_get_formatted_locations_basic_auth():
find_links = [
'https://links-user:links-pass@page.domain.com'
]
finder = PackageFinder.create(find_links, index_urls, session=[])
finder = make_test_finder(find_links=find_links, index_urls=index_urls)
result = finder.get_formatted_locations()
assert 'repo-user:****@repo.domain.com' in result

View File

@ -14,7 +14,6 @@ from pip._internal.download import PipSession
from pip._internal.exceptions import (
HashErrors, InstallationError, InvalidWheelFilename, PreviousBuildDirError,
)
from pip._internal.index import PackageFinder
from pip._internal.legacy_resolve import Resolver
from pip._internal.operations.prepare import RequirementPreparer
from pip._internal.req import InstallRequirement, RequirementSet
@ -24,7 +23,9 @@ from pip._internal.req.constructors import (
from pip._internal.req.req_file import process_line
from pip._internal.req.req_tracker import RequirementTracker
from pip._internal.utils.misc import path_to_url
from tests.lib import DATA_DIR, assert_raises_regexp, requirements_file
from tests.lib import (
DATA_DIR, assert_raises_regexp, make_test_finder, requirements_file,
)
def get_processed_req_from_line(line, fname='file', lineno=1):
@ -72,9 +73,7 @@ class TestRequirementSet(object):
req = install_req_from_line('simple')
req.is_direct = True
reqset.add_requirement(req)
finder = PackageFinder.create(
[data.find_links], [], session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
assert_raises_regexp(
PreviousBuildDirError,
@ -96,9 +95,7 @@ class TestRequirementSet(object):
)
req.is_direct = True
reqset.add_requirement(req)
finder = PackageFinder.create(
[data.find_links], [], session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
resolver.resolve(reqset)
# This is hacky but does test both case in py2 and py3
@ -135,11 +132,7 @@ class TestRequirementSet(object):
'packages/source/p/peep/peep-3.1.1.tar.gz',
lineno=4,
))
finder = PackageFinder.create(
[],
['https://pypi.org/simple/'],
session=PipSession(),
)
finder = make_test_finder(index_urls=['https://pypi.org/simple/'])
resolver = self._basic_resolver(finder)
assert_raises_regexp(
HashErrors,
@ -165,9 +158,7 @@ class TestRequirementSet(object):
'simple==1.0', lineno=1
))
finder = PackageFinder.create(
[data.find_links], [], session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
assert_raises_regexp(
@ -185,8 +176,8 @@ class TestRequirementSet(object):
RequirementSet.
"""
req_set = RequirementSet(require_hashes=False)
session = PipSession()
finder = PackageFinder.create([data.find_links], [], session=session)
finder = make_test_finder(find_links=[data.find_links])
session = finder.session
command = InstallCommand()
with requirements_file('--require-hashes', tmpdir) as reqs_file:
options, args = command.parse_args(['-r', reqs_file])
@ -214,9 +205,7 @@ class TestRequirementSet(object):
'file://%s' % (dir_path,),
lineno=2,
))
finder = PackageFinder.create(
[data.find_links], [], session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
sep = os.path.sep
if sep == '\\':
@ -250,9 +239,7 @@ class TestRequirementSet(object):
'123f6a7e44a9115db1ef945d4d92c123dfe21815a06',
lineno=2,
))
finder = PackageFinder.create(
[data.find_links], [], session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
assert_raises_regexp(
HashErrors,
@ -271,9 +258,7 @@ class TestRequirementSet(object):
reqset.add_requirement(get_processed_req_from_line(
'%s --hash=sha256:badbad' % file_url, lineno=1,
))
finder = PackageFinder.create(
[data.find_links], [], session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
assert_raises_regexp(
HashErrors,
@ -289,9 +274,7 @@ class TestRequirementSet(object):
"""Make sure unhashed, unpinned, or otherwise unrepeatable
dependencies get complained about when --require-hashes is on."""
reqset = RequirementSet()
finder = PackageFinder.create(
[data.find_links], [], session=PipSession(),
)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
reqset.add_requirement(get_processed_req_from_line(
'TopoRequires2==0.0.1 ' # requires TopoRequires

View File

@ -11,7 +11,6 @@ from pip._internal.download import PipSession
from pip._internal.exceptions import (
InstallationError, RequirementsFileParseError,
)
from pip._internal.index import PackageFinder
from pip._internal.models.format_control import FormatControl
from pip._internal.req.constructors import (
install_req_from_editable, install_req_from_line,
@ -20,7 +19,7 @@ from pip._internal.req.req_file import (
break_args_options, ignore_comments, join_lines, parse_requirements,
preprocess, process_line, skip_regex,
)
from tests.lib import requirements_file
from tests.lib import make_test_finder, requirements_file
@pytest.fixture
@ -30,7 +29,7 @@ def session():
@pytest.fixture
def finder(session):
return PackageFinder.create([], [], session=session)
return make_test_finder(session=session)
@pytest.fixture