Commit 750e31de by Sébastien Eustace

Fix the way packages info are retrieved for legacy repositories

parent 7ac4ee24
# Change Log # Change Log
## [Unreleased]
### Fixed
- Fixed the way packages information are retrieved for legacy repositories.
## [0.12.10] - 2018-11-22 ## [0.12.10] - 2018-11-22
### Fixed ### Fixed
......
...@@ -14,17 +14,11 @@ from requests_toolbelt.multipart import MultipartEncoder, MultipartEncoderMonito ...@@ -14,17 +14,11 @@ from requests_toolbelt.multipart import MultipartEncoder, MultipartEncoderMonito
from poetry.__version__ import __version__ from poetry.__version__ import __version__
from poetry.utils.helpers import normalize_version from poetry.utils.helpers import normalize_version
from poetry.utils.patterns import wheel_file_re
from ..metadata import Metadata from ..metadata import Metadata
wheel_file_re = re.compile(
r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?)
((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
\.whl|\.dist-info)$""",
re.VERBOSE,
)
_has_blake2 = hasattr(hashlib, "blake2b") _has_blake2 = hasattr(hashlib, "blake2b")
......
...@@ -30,7 +30,6 @@ from cachy import CacheManager ...@@ -30,7 +30,6 @@ from cachy import CacheManager
import poetry.packages import poetry.packages
from poetry.locations import CACHE_DIR from poetry.locations import CACHE_DIR
from poetry.masonry.publishing.uploader import wheel_file_re
from poetry.packages import Package from poetry.packages import Package
from poetry.packages import dependency_from_pep_508 from poetry.packages import dependency_from_pep_508
from poetry.packages.utils.link import Link from poetry.packages.utils.link import Link
...@@ -40,6 +39,7 @@ from poetry.semver import VersionConstraint ...@@ -40,6 +39,7 @@ from poetry.semver import VersionConstraint
from poetry.semver import VersionRange from poetry.semver import VersionRange
from poetry.utils._compat import Path from poetry.utils._compat import Path
from poetry.utils.helpers import canonicalize_name from poetry.utils.helpers import canonicalize_name
from poetry.utils.patterns import wheel_file_re
from poetry.version.markers import InvalidMarker from poetry.version.markers import InvalidMarker
from .auth import Auth from .auth import Auth
...@@ -269,6 +269,9 @@ class LegacyRepository(PyPiRepository): ...@@ -269,6 +269,9 @@ class LegacyRepository(PyPiRepository):
release_info = self.get_release_info(name, version) release_info = self.get_release_info(name, version)
package = poetry.packages.Package(name, version, version) package = poetry.packages.Package(name, version, version)
if release_info["requires_python"]:
package.python_versions = release_info["requires_python"]
package.source_type = "legacy" package.source_type = "legacy"
package.source_url = self._url package.source_url = self._url
package.source_reference = self.name package.source_reference = self.name
...@@ -330,7 +333,7 @@ class LegacyRepository(PyPiRepository): ...@@ -330,7 +333,7 @@ class LegacyRepository(PyPiRepository):
"version": version, "version": version,
"summary": "", "summary": "",
"requires_dist": [], "requires_dist": [],
"requires_python": [], "requires_python": None,
"digests": [], "digests": [],
} }
...@@ -346,7 +349,11 @@ class LegacyRepository(PyPiRepository): ...@@ -346,7 +349,11 @@ class LegacyRepository(PyPiRepository):
default_link = links[0] default_link = links[0]
for link in links: for link in links:
if link.is_wheel: if link.is_wheel:
urls["bdist_wheel"] = link.url m = wheel_file_re.match(default_link.filename)
python = m.group("pyver")
platform = m.group("plat")
if python == "py2.py3" and platform == "any":
urls["bdist_wheel"] = default_link.url
elif link.filename.endswith(".tar.gz"): elif link.filename.endswith(".tar.gz"):
urls["sdist"] = link.url urls["sdist"] = link.url
elif ( elif (
...@@ -363,11 +370,7 @@ class LegacyRepository(PyPiRepository): ...@@ -363,11 +370,7 @@ class LegacyRepository(PyPiRepository):
if not urls: if not urls:
if default_link.is_wheel: if default_link.is_wheel:
m = wheel_file_re.match(default_link.filename) urls["bdist_wheel"] = default_link.url
python = m.group("pyver")
platform = m.group("plat")
if python == "py2.py3" and platform == "any":
urls["bdist_wheel"] = default_link.url
elif default_link.filename.endswith(".tar.gz"): elif default_link.filename.endswith(".tar.gz"):
urls["sdist"] = default_link.url urls["sdist"] = default_link.url
elif ( elif (
......
import re
wheel_file_re = re.compile(
r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?)
((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
\.whl|\.dist-info)$""",
re.VERBOSE,
)
...@@ -15,6 +15,9 @@ from poetry.version.markers import parse_marker ...@@ -15,6 +15,9 @@ from poetry.version.markers import parse_marker
from tests.helpers import get_dependency from tests.helpers import get_dependency
from tests.helpers import get_package from tests.helpers import get_package
from tests.repositories.test_legacy_repository import (
MockRepository as MockLegacyRepository,
)
@pytest.fixture() @pytest.fixture()
...@@ -1488,3 +1491,46 @@ def test_solver_can_resolve_wheel_dependencies_with_extras(solver, repo, package ...@@ -1488,3 +1491,46 @@ def test_solver_can_resolve_wheel_dependencies_with_extras(solver, repo, package
assert op.package.version.text == "0.1.0" assert op.package.version.text == "0.1.0"
assert op.package.source_type == "file" assert op.package.source_type == "file"
assert op.package.source_url == path assert op.package.source_url == path
def test_solver_can_solve_with_legacy_repository_using_proper_dists(
package, installed, locked, io
):
repo = MockLegacyRepository()
pool = Pool([repo])
solver = Solver(package, pool, installed, locked, io)
package.add_dependency("isort", "4.3.4")
ops = solver.solve()
check_solver_result(
ops,
[
{"job": "install", "package": get_package("futures", "3.2.0")},
{"job": "install", "package": get_package("isort", "4.3.4")},
],
)
futures = ops[0].package
assert futures.python_versions == ">=2.6, <3"
def test_solver_can_solve_with_legacy_repository_using_proper_python_compatible_dists(
package, installed, locked, io
):
package.python_versions = "^3.7"
repo = MockLegacyRepository()
pool = Pool([repo])
solver = Solver(package, pool, installed, locked, io)
package.add_dependency("isort", "4.3.4")
ops = solver.solve()
check_solver_result(
ops, [{"job": "install", "package": get_package("isort", "4.3.4")}]
)
<!DOCTYPE html>
<html>
<head>
<title>Links for futures</title>
</head>
<body>
<h1>Links for futures</h1>
<a href="https://files.pythonhosted.org/packages/2d/99/b2c4e9d5a30f6471e410a146232b4118e697fa3ffc06d6a65efde84debd0/futures-3.2.0-py2-none-any.whl#sha256=ec0a6cb848cc212002b9828c3e34c675e0c9ff6741dc445cab6fdd4e1085d1f1" data-requires-python="&gt;=2.6, &lt;3">futures-3.2.0-py2-none-any.whl</a><br/>
<a href="https://files.pythonhosted.org/packages/1f/9e/7b2ff7e965fc654592269f2906ade1c7d705f1bf25b7d469fa153f7d19eb/futures-3.2.0.tar.gz#sha256=9ec02aa7d674acb8618afb127e27fde7fc68994c0437ad759fa094a574adb265" data-requires-python="&gt;=2.6, &lt;3">futures-3.2.0.tar.gz</a><br/>
</body>
</html>
<!--SERIAL 3865286-->
<!DOCTYPE html>
<html>
<head>
<title>Links for isort</title>
</head>
<body>
<h1>Links for isort</h1>
<a href="https://files.pythonhosted.org/packages/41/d8/a945da414f2adc1d9e2f7d6e7445b27f2be42766879062a2e63616ad4199/isort-4.3.4-py2-none-any.whl#sha256=ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497">isort-4.3.4-py2-none-any.whl</a><br/>
<a href="https://files.pythonhosted.org/packages/1f/2c/22eee714d7199ae0464beda6ad5fedec8fee6a2f7ffd1e8f1840928fe318/isort-4.3.4-py3-none-any.whl#sha256=1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af">isort-4.3.4-py3-none-any.whl</a><br/>
<a href="https://files.pythonhosted.org/packages/b1/de/a628d16fdba0d38cafb3d7e34d4830f2c9cb3881384ce5c08c44762e1846/isort-4.3.4.tar.gz#sha256=b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8">isort-4.3.4.tar.gz</a><br/>
</body>
</html>
<!--SERIAL 3575149-->
...@@ -136,3 +136,36 @@ def test_find_packages_no_prereleases(): ...@@ -136,3 +136,36 @@ def test_find_packages_no_prereleases():
packages = repo.find_packages("pyyaml") packages = repo.find_packages("pyyaml")
assert len(packages) == 1 assert len(packages) == 1
def test_get_package_information_chooses_correct_distribution():
repo = MockRepository()
package = repo.package("isort", "4.3.4")
assert package.name == "isort"
assert package.version.text == "4.3.4"
assert package.requires == [Dependency("futures", "*")]
futures_dep = package.requires[0]
assert futures_dep.python_versions == "~2.7"
def test_get_package_information_includes_python_requires():
repo = MockRepository()
package = repo.package("futures", "3.2.0")
assert package.name == "futures"
assert package.version.text == "3.2.0"
assert package.python_versions == ">=2.6, <3"
def test_get_package_information_sets_appropriate_python_versions_if_wheels_only():
repo = MockRepository()
package = repo.package("futures", "3.2.0")
assert package.name == "futures"
assert package.version.text == "3.2.0"
assert package.python_versions == ">=2.6, <3"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment