Skip to content

Commit

Permalink
Prefer platform compatible wheels over source distribution for legacy…
Browse files Browse the repository at this point in the history
… repository dependency resolution
  • Loading branch information
gfjfgj committed Apr 19, 2022
1 parent dca0c56 commit 9e3cb6e
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 6 deletions.
14 changes: 11 additions & 3 deletions src/poetry/repositories/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from abc import ABC
from collections import defaultdict
from packaging.tags import sys_tags, Tag
from pathlib import Path
from typing import TYPE_CHECKING
from urllib.parse import quote
Expand Down Expand Up @@ -143,7 +144,7 @@ def _get_info_from_urls(self, urls: dict[str, list[str]]) -> PackageInfo:
universal_wheel = None
universal_python2_wheel = None
universal_python3_wheel = None
platform_specific_wheels = []
platform_specific_wheels = {}
for wheel in wheels:
link = Link(wheel)
m = wheel_file_re.match(link.filename)
Expand All @@ -163,7 +164,7 @@ def _get_info_from_urls(self, urls: dict[str, list[str]]) -> PackageInfo:
else:
universal_python3_wheel = wheel
else:
platform_specific_wheels.append(wheel)
platform_specific_wheels[Tag(pyver, abi, plat)] = wheel

if universal_wheel is not None:
return self._get_info_from_wheel(universal_wheel)
Expand Down Expand Up @@ -219,9 +220,16 @@ def _get_info_from_urls(self, urls: dict[str, list[str]]) -> PackageInfo:
if universal_python2_wheel:
return self._get_info_from_wheel(universal_python2_wheel)

# Prefer compatible platform wheel over sdist
for tag in sys_tags():
if tag in platform_specific_wheels:
return self._get_info_from_wheel(platform_specific_wheels[tag])

if platform_specific_wheels and "sdist" not in urls:
# Pick the first wheel available and hope for the best
return self._get_info_from_wheel(platform_specific_wheels[0])
return self._get_info_from_wheel(
next(iter(platform_specific_wheels.values()))
)

return self._get_info_from_sdist(urls["sdist"][0])

Expand Down
6 changes: 3 additions & 3 deletions tests/repositories/fixtures/legacy/pyyaml.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<title>Links for python-language-server</title>
<title>Links for PyYAML</title>
</head>
<body>
<h1>Links for python-language-server</h1>
<h1>Links for PyYAML</h1>
<a href="https://files.pythonhosted.org/packages/5c/ed/d6557f70daaaab6ee5cd2f8ccf7bedd63081e522e38679c03840e1acc114/PyYAML-3.13-cp37-cp37m-win32.whl#sha256=e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531">PyYAML-3.13-cp37-cp37m-win32.whl</a><br/>
<a href="https://files.pythonhosted.org/packages/9e/a3/1d13970c3f36777c583f136c136f804d70f500168edc1edea6daa7200769/PyYAML-3.13.tar.gz#sha256=3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf">PyYAML-3.13.tar.gz</a><br/>
<a href="https://files.pythonhosted.org/packages/0f/9d/f98ed0a460dc540f720bbe5c6e076f025595cdfa3e318fad27165db13cf9/PyYAML-4.2b2.tar.gz#sha256=406b717f739e2d00c49873068b71f5454c2420157db51b082d4d2beb17ffffb6">PyYAML-4.2b2.tar.gz</a><br/>
</body>
</html>
<!--SERIAL 4245719-->
<!--SERIAL 11716096-->
50 changes: 50 additions & 0 deletions tests/repositories/test_legacy_repository.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from __future__ import annotations

import distutils.util
import shutil
import sys

from pathlib import Path
from typing import TYPE_CHECKING
Expand All @@ -11,6 +13,7 @@
from poetry.core.packages.dependency import Dependency

from poetry.factory import Factory
from poetry.inspection.info import PackageInfo
from poetry.repositories.exceptions import PackageNotFound
from poetry.repositories.exceptions import RepositoryError
from poetry.repositories.legacy_repository import LegacyRepository
Expand All @@ -26,6 +29,7 @@
import httpretty

from _pytest.monkeypatch import MonkeyPatch
from pytest_mock import MockerFixture


class MockRepository(LegacyRepository):
Expand Down Expand Up @@ -184,6 +188,52 @@ def test_find_packages_only_prereleases_empty_when_not_any():
assert len(packages) == 0


windows_platforms = ["win32", "win-amd64"]


@pytest.mark.parametrize(
"platform",
[distutils.util.get_platform()]
if distutils.util.get_platform() not in windows_platforms
else windows_platforms,
)
@pytest.mark.parametrize(
"sys_version_info",
[sys.version_info]
if distutils.util.get_platform() not in windows_platforms
else [(3, 7, 1), (3, 8, 1)],
)
def test_get_package_dependencies_with_sdist_and_bdist_platform_compatible(
platform: str, sys_version_info: tuple, mocker: MockerFixture
):
get_info_from_wheel = mocker.patch(
"poetry.repositories.legacy_repository.LegacyRepository._get_info_from_wheel"
)
get_info_from_sdist = mocker.patch(
"poetry.repositories.legacy_repository.LegacyRepository._get_info_from_sdist"
)
name, version = "pyyaml", "3.13"
get_info_from_wheel.return_value = PackageInfo(name, version)
get_info_from_sdist.return_value = PackageInfo(name, version)

if platform in windows_platforms:
mocker.patch("distutils.util.get_platform").return_value = platform
mocker.patch("sys.version_info", sys_version_info)

repo = MockRepository()
package = repo.package(name, version)

assert package.name == name
assert package.version.text == version

if platform == "win32" and sys_version_info == (3, 7, 1):
assert get_info_from_wheel.called
assert not get_info_from_sdist.called
else:
assert not get_info_from_wheel.called
assert get_info_from_sdist.called


def test_get_package_information_chooses_correct_distribution():
repo = MockRepository()

Expand Down

0 comments on commit 9e3cb6e

Please sign in to comment.