2018-03-17 00:06:18 +01:00
|
|
|
import logging
|
2016-07-28 21:11:53 +02:00
|
|
|
import sys
|
2013-08-18 11:59:44 +02:00
|
|
|
|
2017-06-13 14:17:00 +02:00
|
|
|
import pytest
|
|
|
|
from mock import Mock, patch
|
2019-07-16 09:37:26 +02:00
|
|
|
from pip._vendor.packaging.specifiers import SpecifierSet
|
2019-06-30 21:14:53 +02:00
|
|
|
from pkg_resources import parse_version
|
2013-08-23 13:12:37 +02:00
|
|
|
|
2017-08-31 17:48:18 +02:00
|
|
|
import pip._internal.pep425tags
|
|
|
|
import pip._internal.wheel
|
|
|
|
from pip._internal.exceptions import (
|
2019-07-22 06:45:27 +02:00
|
|
|
BestVersionAlreadyInstalled,
|
|
|
|
DistributionNotFound,
|
2017-08-31 17:48:18 +02:00
|
|
|
)
|
2018-11-05 07:14:47 +01:00
|
|
|
from pip._internal.index import (
|
2019-07-22 06:45:27 +02:00
|
|
|
CandidateEvaluator,
|
|
|
|
InstallationCandidate,
|
|
|
|
Link,
|
|
|
|
LinkEvaluator,
|
2018-11-05 07:14:47 +01:00
|
|
|
)
|
2019-06-09 22:11:16 +02:00
|
|
|
from pip._internal.models.target_python import TargetPython
|
2018-08-21 17:07:40 +02:00
|
|
|
from pip._internal.req.constructors import install_req_from_line
|
2019-06-01 18:45:53 +02:00
|
|
|
from tests.lib import make_test_finder
|
2011-12-16 18:01:23 +01:00
|
|
|
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_no_mpkg(data):
|
2011-12-16 18:01:23 +01:00
|
|
|
"""Finder skips zipfiles with "macosx10" in the name."""
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("pkgwithmpkg")
|
2011-12-16 18:01:23 +01:00
|
|
|
found = finder.find_requirement(req, False)
|
|
|
|
|
|
|
|
assert found.url.endswith("pkgwithmpkg-1.0.tar.gz"), found
|
2012-04-17 01:27:47 +02:00
|
|
|
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_no_partial_name_match(data):
|
2012-04-17 01:27:47 +02:00
|
|
|
"""Finder requires the full project name to match, not just beginning."""
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("gmpy")
|
2012-04-17 01:27:47 +02:00
|
|
|
found = finder.find_requirement(req, False)
|
|
|
|
|
|
|
|
assert found.url.endswith("gmpy-1.15.tar.gz"), found
|
2012-09-10 22:04:00 +02:00
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
|
2017-10-02 19:33:52 +02:00
|
|
|
def test_tilde():
|
2015-03-07 17:56:14 +01:00
|
|
|
"""Finder can accept a path with ~ in it and will normalize it."""
|
2017-08-31 17:48:18 +02:00
|
|
|
with patch('pip._internal.index.os.path.exists', return_value=True):
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=['~/python-pkgs'])
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("gmpy")
|
2015-03-07 17:56:14 +01:00
|
|
|
with pytest.raises(DistributionNotFound):
|
|
|
|
finder.find_requirement(req, False)
|
|
|
|
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_duplicates_sort_ok(data):
|
2012-09-10 22:04:00 +02:00
|
|
|
"""Finder successfully finds one of a set of duplicates in different
|
|
|
|
locations"""
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links, data.find_links2])
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("duplicate")
|
2012-09-10 22:04:00 +02:00
|
|
|
found = finder.find_requirement(req, False)
|
|
|
|
|
|
|
|
assert found.url.endswith("duplicate-1.0.tar.gz"), found
|
2012-09-23 23:58:14 +02:00
|
|
|
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_finder_detects_latest_find_links(data):
|
2012-09-23 23:58:14 +02:00
|
|
|
"""Test PackageFinder detects latest using find-links"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line('simple', None)
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2012-09-23 23:58:14 +02:00
|
|
|
link = finder.find_requirement(req, False)
|
|
|
|
assert link.url.endswith("simple-3.0.tar.gz")
|
|
|
|
|
|
|
|
|
2014-09-12 23:41:53 +02:00
|
|
|
def test_incorrect_case_file_index(data):
|
|
|
|
"""Test PackageFinder detects latest using wrong case"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line('dinner', None)
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(index_urls=[data.find_links3])
|
2014-09-12 23:41:53 +02:00
|
|
|
link = finder.find_requirement(req, False)
|
|
|
|
assert link.url.endswith("Dinner-2.0.tar.gz")
|
|
|
|
|
|
|
|
|
2015-01-15 00:53:15 +01:00
|
|
|
@pytest.mark.network
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_finder_detects_latest_already_satisfied_find_links(data):
|
2014-04-30 07:33:04 +02:00
|
|
|
"""Test PackageFinder detects latest already satisfied using find-links"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line('simple', None)
|
2014-03-26 23:24:19 +01:00
|
|
|
# the latest simple in local pkgs is 3.0
|
2012-09-23 23:58:14 +02:00
|
|
|
latest_version = "3.0"
|
|
|
|
satisfied_by = Mock(
|
2014-01-28 15:17:51 +01:00
|
|
|
location="/path",
|
|
|
|
parsed_version=parse_version(latest_version),
|
|
|
|
version=latest_version
|
|
|
|
)
|
2012-09-23 23:58:14 +02:00
|
|
|
req.satisfied_by = satisfied_by
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2013-08-18 11:59:44 +02:00
|
|
|
|
|
|
|
with pytest.raises(BestVersionAlreadyInstalled):
|
|
|
|
finder.find_requirement(req, True)
|
2012-09-23 23:58:14 +02:00
|
|
|
|
|
|
|
|
2015-01-15 00:53:15 +01:00
|
|
|
@pytest.mark.network
|
2012-09-23 23:58:14 +02:00
|
|
|
def test_finder_detects_latest_already_satisfied_pypi_links():
|
2014-04-30 07:33:04 +02:00
|
|
|
"""Test PackageFinder detects latest already satisfied using pypi links"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line('initools', None)
|
2018-09-16 22:21:09 +02:00
|
|
|
# the latest initools on PyPI is 0.3.1
|
2012-09-23 23:58:14 +02:00
|
|
|
latest_version = "0.3.1"
|
|
|
|
satisfied_by = Mock(
|
2014-01-28 15:17:51 +01:00
|
|
|
location="/path",
|
|
|
|
parsed_version=parse_version(latest_version),
|
2014-02-24 22:52:23 +01:00
|
|
|
version=latest_version,
|
|
|
|
)
|
2012-09-23 23:58:14 +02:00
|
|
|
req.satisfied_by = satisfied_by
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(index_urls=["http://pypi.org/simple/"])
|
2013-08-18 11:59:44 +02:00
|
|
|
|
|
|
|
with pytest.raises(BestVersionAlreadyInstalled):
|
|
|
|
finder.find_requirement(req, True)
|
2012-10-12 10:36:05 +02:00
|
|
|
|
2013-04-02 07:44:46 +02:00
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
class TestWheel:
|
2013-06-28 03:08:25 +02:00
|
|
|
|
2014-08-31 01:52:28 +02:00
|
|
|
def test_skip_invalid_wheel_link(self, caplog, data):
|
2013-11-15 01:35:24 +01:00
|
|
|
"""
|
|
|
|
Test if PackageFinder skips invalid wheel filenames
|
|
|
|
"""
|
2018-03-17 00:06:18 +01:00
|
|
|
caplog.set_level(logging.DEBUG)
|
|
|
|
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("invalid")
|
2014-03-26 23:24:19 +01:00
|
|
|
# data.find_links contains "invalid.whl", which is an invalid wheel
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2013-11-15 01:35:24 +01:00
|
|
|
with pytest.raises(DistributionNotFound):
|
|
|
|
finder.find_requirement(req, True)
|
2014-08-31 01:52:28 +02:00
|
|
|
|
2019-05-26 05:31:41 +02:00
|
|
|
assert 'Skipping link: invalid wheel filename:' in caplog.text
|
2013-11-15 01:35:24 +01:00
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_not_find_wheel_not_supported(self, data, monkeypatch):
|
2013-06-28 03:08:25 +02:00
|
|
|
"""
|
|
|
|
Test not finding an unsupported wheel.
|
|
|
|
"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("simple.dist")
|
2019-06-09 22:11:16 +02:00
|
|
|
target_python = TargetPython()
|
|
|
|
# Make sure no tags will match.
|
|
|
|
target_python._valid_tags = []
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(
|
|
|
|
find_links=[data.find_links],
|
2019-06-09 22:11:16 +02:00
|
|
|
target_python=target_python,
|
2014-05-07 01:25:44 +02:00
|
|
|
)
|
2013-08-18 11:59:44 +02:00
|
|
|
|
|
|
|
with pytest.raises(DistributionNotFound):
|
|
|
|
finder.find_requirement(req, True)
|
2013-06-28 03:08:25 +02:00
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_find_wheel_supported(self, data, monkeypatch):
|
2013-06-28 03:08:25 +02:00
|
|
|
"""
|
|
|
|
Test finding supported wheel.
|
|
|
|
"""
|
2014-01-28 15:17:51 +01:00
|
|
|
monkeypatch.setattr(
|
2017-08-31 17:48:18 +02:00
|
|
|
pip._internal.pep425tags,
|
|
|
|
"get_supported",
|
|
|
|
lambda **kw: [('py2', 'none', 'any')],
|
2014-01-28 15:17:51 +01:00
|
|
|
)
|
2013-08-23 13:12:37 +02:00
|
|
|
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("simple.dist")
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2013-06-28 03:08:25 +02:00
|
|
|
found = finder.find_requirement(req, True)
|
2014-01-28 15:17:51 +01:00
|
|
|
assert (
|
2014-10-09 06:51:14 +02:00
|
|
|
found.url.endswith("simple.dist-0.1-py2.py3-none-any.whl")
|
|
|
|
), found
|
2013-06-28 03:08:25 +02:00
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_wheel_over_sdist_priority(self, data):
|
2013-06-28 03:08:25 +02:00
|
|
|
"""
|
|
|
|
Test wheels have priority over sdists.
|
|
|
|
`test_link_sorting` also covers this at lower level
|
|
|
|
"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("priority")
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2013-06-28 03:08:25 +02:00
|
|
|
found = finder.find_requirement(req, True)
|
|
|
|
assert found.url.endswith("priority-1.0-py2.py3-none-any.whl"), found
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_existing_over_wheel_priority(self, data):
|
2013-06-28 03:08:25 +02:00
|
|
|
"""
|
|
|
|
Test existing install has priority over wheels.
|
|
|
|
`test_link_sorting` also covers this at a lower level
|
|
|
|
"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line('priority', None)
|
2013-06-28 03:08:25 +02:00
|
|
|
latest_version = "1.0"
|
|
|
|
satisfied_by = Mock(
|
2014-01-28 15:17:51 +01:00
|
|
|
location="/path",
|
|
|
|
parsed_version=parse_version(latest_version),
|
2014-02-24 22:52:23 +01:00
|
|
|
version=latest_version,
|
|
|
|
)
|
2013-06-28 03:08:25 +02:00
|
|
|
req.satisfied_by = satisfied_by
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2013-06-28 03:08:25 +02:00
|
|
|
|
2013-08-18 11:59:44 +02:00
|
|
|
with pytest.raises(BestVersionAlreadyInstalled):
|
|
|
|
finder.find_requirement(req, True)
|
2013-06-28 03:08:25 +02:00
|
|
|
|
|
|
|
def test_link_sorting(self):
|
|
|
|
"""
|
|
|
|
Test link sorting
|
|
|
|
"""
|
|
|
|
links = [
|
2014-07-04 00:56:26 +02:00
|
|
|
InstallationCandidate("simple", "2.0", Link('simple-2.0.tar.gz')),
|
|
|
|
InstallationCandidate(
|
|
|
|
"simple",
|
|
|
|
"1.0",
|
2014-01-28 15:17:51 +01:00
|
|
|
Link('simple-1.0-pyT-none-TEST.whl'),
|
2014-07-04 00:56:26 +02:00
|
|
|
),
|
|
|
|
InstallationCandidate(
|
|
|
|
"simple",
|
|
|
|
'1.0',
|
|
|
|
Link('simple-1.0-pyT-TEST-any.whl'),
|
|
|
|
),
|
|
|
|
InstallationCandidate(
|
|
|
|
"simple",
|
2014-01-28 15:17:51 +01:00
|
|
|
'1.0',
|
2014-07-04 00:56:26 +02:00
|
|
|
Link('simple-1.0-pyT-none-any.whl'),
|
|
|
|
),
|
|
|
|
InstallationCandidate(
|
|
|
|
"simple",
|
|
|
|
'1.0',
|
|
|
|
Link('simple-1.0.tar.gz'),
|
2014-01-28 15:17:51 +01:00
|
|
|
),
|
|
|
|
]
|
2019-04-22 12:40:35 +02:00
|
|
|
valid_tags = [
|
2015-06-15 23:36:59 +02:00
|
|
|
('pyT', 'none', 'TEST'),
|
|
|
|
('pyT', 'TEST', 'any'),
|
|
|
|
('pyT', 'none', 'any'),
|
|
|
|
]
|
2019-07-16 09:37:26 +02:00
|
|
|
specifier = SpecifierSet()
|
|
|
|
evaluator = CandidateEvaluator(
|
|
|
|
'my-project', supported_tags=valid_tags, specifier=specifier,
|
|
|
|
)
|
2019-04-22 12:40:35 +02:00
|
|
|
sort_key = evaluator._sort_key
|
|
|
|
results = sorted(links, key=sort_key, reverse=True)
|
|
|
|
results2 = sorted(reversed(links), key=sort_key, reverse=True)
|
2013-06-28 03:08:25 +02:00
|
|
|
|
|
|
|
assert links == results == results2, results2
|
2017-08-31 13:58:02 +02:00
|
|
|
|
|
|
|
def test_link_sorting_wheels_with_build_tags(self):
|
|
|
|
"""Verify build tags affect sorting."""
|
|
|
|
links = [
|
|
|
|
InstallationCandidate(
|
|
|
|
"simplewheel",
|
|
|
|
"2.0",
|
|
|
|
Link("simplewheel-2.0-1-py2.py3-none-any.whl"),
|
|
|
|
),
|
|
|
|
InstallationCandidate(
|
|
|
|
"simplewheel",
|
|
|
|
"2.0",
|
|
|
|
Link("simplewheel-2.0-py2.py3-none-any.whl"),
|
|
|
|
),
|
|
|
|
InstallationCandidate(
|
|
|
|
"simplewheel",
|
|
|
|
"1.0",
|
|
|
|
Link("simplewheel-1.0-py2.py3-none-any.whl"),
|
|
|
|
),
|
|
|
|
]
|
2019-07-14 18:24:59 +02:00
|
|
|
candidate_evaluator = CandidateEvaluator.create('my-project')
|
2019-07-07 05:47:17 +02:00
|
|
|
sort_key = candidate_evaluator._sort_key
|
2019-04-22 12:40:35 +02:00
|
|
|
results = sorted(links, key=sort_key, reverse=True)
|
|
|
|
results2 = sorted(reversed(links), key=sort_key, reverse=True)
|
2017-08-31 13:58:02 +02:00
|
|
|
assert links == results == results2, results2
|
2012-10-12 10:36:05 +02:00
|
|
|
|
2013-04-02 07:44:46 +02:00
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_finder_priority_file_over_page(data):
|
2012-10-11 06:47:27 +02:00
|
|
|
"""Test PackageFinder prefers file links over equivalent page links"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line('gmpy==1.15', None)
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(
|
|
|
|
find_links=[data.find_links],
|
|
|
|
index_urls=["http://pypi.org/simple/"],
|
2014-01-28 15:17:51 +01:00
|
|
|
)
|
2015-12-18 20:29:42 +01:00
|
|
|
all_versions = finder.find_all_candidates(req.name)
|
2015-03-12 22:49:39 +01:00
|
|
|
# 1 file InstallationCandidate followed by all https ones
|
2019-07-20 09:11:22 +02:00
|
|
|
assert all_versions[0].link.scheme == 'file'
|
|
|
|
assert all(version.link.scheme == 'https'
|
2015-03-12 22:49:39 +01:00
|
|
|
for version in all_versions[1:]), all_versions
|
|
|
|
|
2012-10-11 06:47:27 +02:00
|
|
|
link = finder.find_requirement(req, False)
|
|
|
|
assert link.url.startswith("file://")
|
|
|
|
|
|
|
|
|
2012-10-11 07:29:16 +02:00
|
|
|
def test_finder_priority_nonegg_over_eggfragments():
|
|
|
|
"""Test PackageFinder prefers non-egg links over "#egg=" links"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line('bar==1.0', None)
|
2012-10-11 07:29:16 +02:00
|
|
|
links = ['http://foo/bar.py#egg=bar-1.0', 'http://foo/bar-1.0.tar.gz']
|
|
|
|
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
with patch.object(finder, "_get_pages", lambda x, y: []):
|
2015-12-18 20:29:42 +01:00
|
|
|
all_versions = finder.find_all_candidates(req.name)
|
2019-07-20 09:11:22 +02:00
|
|
|
assert all_versions[0].link.url.endswith('tar.gz')
|
|
|
|
assert all_versions[1].link.url.endswith('#egg=bar-1.0')
|
2015-03-12 22:49:39 +01:00
|
|
|
|
2013-08-16 14:04:27 +02:00
|
|
|
link = finder.find_requirement(req, False)
|
|
|
|
|
2012-10-11 07:29:16 +02:00
|
|
|
assert link.url.endswith('tar.gz')
|
|
|
|
|
|
|
|
links.reverse()
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
with patch.object(finder, "_get_pages", lambda x, y: []):
|
2015-12-18 20:29:42 +01:00
|
|
|
all_versions = finder.find_all_candidates(req.name)
|
2019-07-20 09:11:22 +02:00
|
|
|
assert all_versions[0].link.url.endswith('tar.gz')
|
|
|
|
assert all_versions[1].link.url.endswith('#egg=bar-1.0')
|
2013-08-16 14:04:27 +02:00
|
|
|
link = finder.find_requirement(req, False)
|
|
|
|
|
2012-10-11 07:29:16 +02:00
|
|
|
assert link.url.endswith('tar.gz')
|
|
|
|
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_finder_only_installs_stable_releases(data):
|
2013-03-09 17:28:36 +01:00
|
|
|
"""
|
|
|
|
Test PackageFinder only accepts stable versioned releases by default.
|
|
|
|
"""
|
2013-03-12 06:39:17 +01:00
|
|
|
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("bar", None)
|
2012-10-11 07:29:16 +02:00
|
|
|
|
2013-03-12 06:39:17 +01:00
|
|
|
# using a local index (that has pre & dev releases)
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(index_urls=[data.index_url("pre")])
|
2013-03-12 06:39:17 +01:00
|
|
|
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"]
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
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"
|
|
|
|
|
2013-03-09 17:28:36 +01:00
|
|
|
links.reverse()
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
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"
|
2013-03-09 17:28:36 +01:00
|
|
|
|
|
|
|
|
2016-07-28 21:11:53 +02:00
|
|
|
def test_finder_only_installs_data_require(data):
|
|
|
|
"""
|
2016-07-29 18:41:10 +02:00
|
|
|
Test whether the PackageFinder understand data-python-requires
|
|
|
|
|
|
|
|
This can optionally be exposed by a simple-repository to tell which
|
|
|
|
distribution are compatible with which version of Python by adding a
|
|
|
|
data-python-require to the anchor links.
|
|
|
|
|
2018-03-27 12:51:44 +02:00
|
|
|
See pep 503 for more information.
|
2016-07-28 21:11:53 +02:00
|
|
|
"""
|
|
|
|
|
|
|
|
# using a local index (that has pre & dev releases)
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(index_urls=[data.index_url("datarequire")])
|
2016-07-28 21:11:53 +02:00
|
|
|
links = finder.find_all_candidates("fakepackage")
|
|
|
|
|
|
|
|
expected = ['1.0.0', '9.9.9']
|
2017-03-18 19:42:32 +01:00
|
|
|
if (2, 7) < sys.version_info < (3,):
|
2016-07-28 21:11:53 +02:00
|
|
|
expected.append('2.7.0')
|
|
|
|
elif sys.version_info > (3, 3):
|
|
|
|
expected.append('3.3.0')
|
|
|
|
|
2017-12-15 06:56:04 +01:00
|
|
|
assert {str(v.version) for v in links} == set(expected)
|
2016-07-28 21:11:53 +02:00
|
|
|
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_finder_installs_pre_releases(data):
|
2013-03-09 17:28:36 +01:00
|
|
|
"""
|
2013-03-12 06:39:17 +01:00
|
|
|
Test PackageFinder finds pre-releases if asked to.
|
2013-03-09 17:28:36 +01:00
|
|
|
"""
|
2013-03-12 06:39:17 +01:00
|
|
|
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("bar", None)
|
2013-03-09 17:28:36 +01:00
|
|
|
|
2013-03-12 06:39:17 +01:00
|
|
|
# using a local index (that has pre & dev releases)
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(
|
|
|
|
index_urls=[data.index_url("pre")],
|
2014-07-04 00:56:26 +02:00
|
|
|
allow_all_prereleases=True,
|
|
|
|
)
|
2013-03-12 06:39:17 +01:00
|
|
|
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"]
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links, allow_all_prereleases=True)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
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"
|
|
|
|
|
2013-03-09 17:28:36 +01:00
|
|
|
links.reverse()
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links, allow_all_prereleases=True)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
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"
|
2013-03-09 17:28:36 +01:00
|
|
|
|
|
|
|
|
2013-08-23 13:12:37 +02:00
|
|
|
def test_finder_installs_dev_releases(data):
|
2013-03-12 06:39:17 +01:00
|
|
|
"""
|
|
|
|
Test PackageFinder finds dev releases if asked to.
|
|
|
|
"""
|
|
|
|
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("bar", None)
|
2013-03-12 06:39:17 +01:00
|
|
|
|
|
|
|
# using a local index (that has dev releases)
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(
|
|
|
|
index_urls=[data.index_url("dev")],
|
2014-07-04 00:56:26 +02:00
|
|
|
allow_all_prereleases=True,
|
|
|
|
)
|
2013-03-12 06:39:17 +01:00
|
|
|
link = finder.find_requirement(req, False)
|
|
|
|
assert link.url.endswith("bar-2.0.dev1.tar.gz"), link.url
|
|
|
|
|
|
|
|
|
2013-03-09 17:28:36 +01:00
|
|
|
def test_finder_installs_pre_releases_with_version_spec():
|
|
|
|
"""
|
|
|
|
Test PackageFinder only accepts stable versioned releases by default.
|
|
|
|
"""
|
2018-08-21 17:07:40 +02:00
|
|
|
req = install_req_from_line("bar>=0.0.dev0", None)
|
2013-03-09 17:28:36 +01:00
|
|
|
links = ["https://foo/bar-1.0.tar.gz", "https://foo/bar-2.0b1.tar.gz"]
|
|
|
|
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
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"
|
2013-03-09 17:28:36 +01:00
|
|
|
|
|
|
|
links.reverse()
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=links)
|
2013-08-16 14:04:27 +02:00
|
|
|
|
|
|
|
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"
|
2013-04-02 07:44:46 +02:00
|
|
|
|
|
|
|
|
2019-06-30 21:14:53 +02:00
|
|
|
class TestLinkEvaluator(object):
|
2013-10-02 06:33:26 +02:00
|
|
|
|
2019-06-30 21:14:53 +02:00
|
|
|
def make_test_link_evaluator(self, formats):
|
|
|
|
target_python = TargetPython()
|
|
|
|
return LinkEvaluator(
|
|
|
|
project_name='pytest',
|
|
|
|
canonical_name='pytest',
|
|
|
|
formats=formats,
|
|
|
|
target_python=target_python,
|
|
|
|
allow_yanked=True,
|
|
|
|
)
|
2013-10-02 06:33:26 +02:00
|
|
|
|
2019-05-19 19:06:43 +02:00
|
|
|
@pytest.mark.parametrize('url, expected_version', [
|
|
|
|
('http:/yo/pytest-1.0.tar.gz', '1.0'),
|
|
|
|
('http:/yo/pytest-1.0-py2.py3-none-any.whl', '1.0'),
|
|
|
|
])
|
|
|
|
def test_evaluate_link__match(self, url, expected_version):
|
2013-10-02 06:33:26 +02:00
|
|
|
"""Test that 'pytest' archives match for 'pytest'"""
|
2018-11-05 07:14:47 +01:00
|
|
|
link = Link(url)
|
2019-06-30 21:14:53 +02:00
|
|
|
evaluator = self.make_test_link_evaluator(formats=['source', 'binary'])
|
|
|
|
actual = evaluator.evaluate_link(link)
|
2019-05-19 19:06:43 +02:00
|
|
|
assert actual == (True, expected_version)
|
|
|
|
|
|
|
|
@pytest.mark.parametrize('url, expected_msg', [
|
|
|
|
# TODO: Uncomment this test case when #1217 is fixed.
|
|
|
|
# 'http:/yo/pytest-xdist-1.0.tar.gz',
|
|
|
|
('http:/yo/pytest2-1.0.tar.gz',
|
|
|
|
'Missing project version for pytest'),
|
|
|
|
('http:/yo/pytest_xdist-1.0-py2.py3-none-any.whl',
|
|
|
|
'wrong project name (not pytest)'),
|
|
|
|
])
|
|
|
|
def test_evaluate_link__substring_fails(self, url, expected_msg):
|
2018-11-05 07:14:47 +01:00
|
|
|
"""Test that 'pytest<something> archives won't match for 'pytest'."""
|
|
|
|
link = Link(url)
|
2019-06-30 21:14:53 +02:00
|
|
|
evaluator = self.make_test_link_evaluator(formats=['source', 'binary'])
|
|
|
|
actual = evaluator.evaluate_link(link)
|
2019-05-19 19:06:43 +02:00
|
|
|
assert actual == (False, expected_msg)
|
2015-03-09 00:15:27 +01:00
|
|
|
|
|
|
|
|
2017-10-02 19:33:52 +02:00
|
|
|
def test_find_all_candidates_nothing():
|
2015-03-09 00:15:27 +01:00
|
|
|
"""Find nothing without anything"""
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder()
|
2015-12-18 20:29:42 +01:00
|
|
|
assert not finder.find_all_candidates('pip')
|
2015-03-09 00:15:27 +01:00
|
|
|
|
|
|
|
|
2015-12-18 20:29:42 +01:00
|
|
|
def test_find_all_candidates_find_links(data):
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(find_links=[data.find_links])
|
2015-12-18 20:29:42 +01:00
|
|
|
versions = finder.find_all_candidates('simple')
|
2015-03-09 00:15:27 +01:00
|
|
|
assert [str(v.version) for v in versions] == ['3.0', '2.0', '1.0']
|
|
|
|
|
|
|
|
|
2015-12-18 20:29:42 +01:00
|
|
|
def test_find_all_candidates_index(data):
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(index_urls=[data.index_url('simple')])
|
2015-12-18 20:29:42 +01:00
|
|
|
versions = finder.find_all_candidates('simple')
|
2015-03-09 00:15:27 +01:00
|
|
|
assert [str(v.version) for v in versions] == ['1.0']
|
|
|
|
|
|
|
|
|
2015-12-18 20:29:42 +01:00
|
|
|
def test_find_all_candidates_find_links_and_index(data):
|
2019-06-01 18:45:53 +02:00
|
|
|
finder = make_test_finder(
|
|
|
|
find_links=[data.find_links],
|
|
|
|
index_urls=[data.index_url('simple')],
|
|
|
|
)
|
2015-12-18 20:29:42 +01:00
|
|
|
versions = finder.find_all_candidates('simple')
|
2015-03-09 00:15:27 +01:00
|
|
|
# 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']
|