Skip to content

Commit

Permalink
Have the Chef return Paths instead of Links
Browse files Browse the repository at this point in the history
  • Loading branch information
dimbleby authored and radoering committed Jul 3, 2022
1 parent d9eab03 commit 711ddd8
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 65 deletions.
19 changes: 9 additions & 10 deletions src/poetry/installation/chef.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
from pathlib import Path
from typing import TYPE_CHECKING

from poetry.core.packages.utils.link import Link

from poetry.installation.chooser import InvalidWheelName
from poetry.installation.chooser import Wheel


if TYPE_CHECKING:
from poetry.core.packages.utils.link import Link

from poetry.config.config import Config
from poetry.utils.env import Env
Expand All @@ -25,19 +24,19 @@ def __init__(self, config: Config, env: Env) -> None:
Path(config.get("cache-dir")).expanduser().joinpath("artifacts")
)

def get_cached_archive_for_link(self, link: Link) -> Link | None:
def get_cached_archive_for_link(self, link: Link) -> Path | None:
archives = self.get_cached_archives_for_link(link)
if not archives:
return None

candidates: list[tuple[float | None, Link]] = []
candidates: list[tuple[float | None, Path]] = []
for archive in archives:
if not archive.is_wheel:
if archive.suffix != ".whl":
candidates.append((float("inf"), archive))
continue

try:
wheel = Wheel(archive.filename)
wheel = Wheel(archive.name)
except InvalidWheelName:
continue

Expand All @@ -53,16 +52,16 @@ def get_cached_archive_for_link(self, link: Link) -> Link | None:

return min(candidates)[1]

def get_cached_archives_for_link(self, link: Link) -> list[Link]:
def get_cached_archives_for_link(self, link: Link) -> list[Path]:
cache_dir = self.get_cache_directory_for_link(link)

archive_types = ["whl", "tar.gz", "tar.bz2", "bz2", "zip"]
links = []
paths = []
for archive_type in archive_types:
for archive in cache_dir.glob(f"*.{archive_type}"):
links.append(Link(archive.as_uri()))
paths.append(Path(archive))

return links
return paths

def get_cache_directory_for_link(self, link: Link) -> Path:
key_parts = {"url": link.url_without_fragment}
Expand Down
23 changes: 8 additions & 15 deletions src/poetry/installation/executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
from cleo.io.null_io import NullIO
from poetry.core.packages.file_dependency import FileDependency
from poetry.core.packages.utils.link import Link
from poetry.core.packages.utils.utils import url_to_path
from poetry.core.pyproject.toml import PyProjectTOML

from poetry.installation.chef import Chef
Expand Down Expand Up @@ -114,7 +113,7 @@ def verbose(self, verbose: bool = True) -> Executor:
return self

def pip_install(
self, req: Path | Link, upgrade: bool = False, editable: bool = False
self, req: Path, upgrade: bool = False, editable: bool = False
) -> int:
try:
pip_install(req, self._env, upgrade=upgrade, editable=editable)
Expand Down Expand Up @@ -463,7 +462,7 @@ def _install(self, operation: Install | Update) -> int:
if package.source_type == "git":
return self._install_git(operation)

archive: Link | Path
archive: Path
if package.source_type == "file":
archive = self._prepare_file(operation)
elif package.source_type == "url":
Expand Down Expand Up @@ -606,15 +605,15 @@ def _install_git(self, operation: Install | Update) -> int:

return status_code

def _download(self, operation: Install | Update) -> Link | Path:
def _download(self, operation: Install | Update) -> Path:
link = self._chooser.choose_for(operation.package)

return self._download_link(operation, link)

def _download_link(self, operation: Install | Update, link: Link) -> Link | Path:
def _download_link(self, operation: Install | Update, link: Link) -> Path:
package = operation.package

archive: Link | Path | None
archive: Path | None
archive = self._chef.get_cached_archive_for_link(link)
if archive is None:
# No cached distributions was found, so we download and prepare it
Expand All @@ -638,20 +637,14 @@ def _download_link(self, operation: Install | Update, link: Link) -> Link | Path
return archive

@staticmethod
def _validate_archive_hash(archive: Path | Link, package: Package) -> str:
archive_path = (
url_to_path(archive.url) if isinstance(archive, Link) else archive
)
file_dep = FileDependency(
package.name,
archive_path,
)
def _validate_archive_hash(archive: Path, package: Package) -> str:
file_dep = FileDependency(package.name, archive)
archive_hash: str = "sha256:" + file_dep.hash()
known_hashes = {f["hash"] for f in package.files}

if archive_hash not in known_hashes:
raise RuntimeError(
f"Hash for {package} from archive {archive_path.name} not found in"
f"Hash for {package} from archive {archive.name} not found in"
f" known hashes (was: {archive_hash})"
)

Expand Down
6 changes: 1 addition & 5 deletions src/poetry/utils/pip.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

from typing import TYPE_CHECKING

from poetry.core.packages.utils.link import Link
from poetry.core.packages.utils.utils import url_to_path

from poetry.exceptions import PoetryException
from poetry.utils.env import EnvCommandError

Expand All @@ -16,13 +13,12 @@


def pip_install(
path: Path | Link,
path: Path,
environment: Env,
editable: bool = False,
deps: bool = False,
upgrade: bool = False,
) -> int | str:
path = url_to_path(path.url) if isinstance(path, Link) else path
is_wheel = path.suffix == ".whl"

# We disable version check here as we are already pinning to version available in
Expand Down
18 changes: 8 additions & 10 deletions tests/installation/test_chef.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@
[
(
"https://files.python-poetry.org/demo-0.1.0.tar.gz",
"file:///foo/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl",
"/cache/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl",
),
(
"https://example.com/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl",
"file:///foo/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl",
"/cache/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl",
),
],
)
Expand All @@ -50,16 +50,16 @@ def test_get_cached_archive_for_link(
chef,
"get_cached_archives_for_link",
return_value=[
Link("file:///foo/demo-0.1.0-py2.py3-none-any"),
Link("file:///foo/demo-0.1.0.tar.gz"),
Link("file:///foo/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl"),
Link("file:///foo/demo-0.1.0-cp37-cp37-macosx_10_15_x86_64.whl"),
Path("/cache/demo-0.1.0-py2.py3-none-any"),
Path("/cache/demo-0.1.0.tar.gz"),
Path("/cache/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl"),
Path("/cache/demo-0.1.0-cp37-cp37-macosx_10_15_x86_64.whl"),
],
)

archive = chef.get_cached_archive_for_link(Link(link))

assert Link(cached) == archive
assert Path(cached) == archive


def test_get_cached_archives_for_link(config: Config, mocker: MockerFixture):
Expand All @@ -82,9 +82,7 @@ def test_get_cached_archives_for_link(config: Config, mocker: MockerFixture):
)

assert archives
assert set(archives) == {
Link(path.as_uri()) for path in distributions.glob("demo-0.1.0*")
}
assert set(archives) == {Path(path) for path in distributions.glob("demo-0.1.0*")}


def test_get_cache_directory_for_link(config: Config, config_cache_dir: Path):
Expand Down
15 changes: 4 additions & 11 deletions tests/installation/test_executor.py
Original file line number Diff line number Diff line change
Expand Up @@ -436,11 +436,8 @@ def test_executor_should_not_write_pep610_url_references_for_cached_package(
config: Config,
io: BufferedIO,
):
link_cached = Link(
fixture_dir("distributions")
.joinpath("demo-0.1.0-py2.py3-none-any.whl")
.as_uri()
)
link_cached = fixture_dir("distributions") / "demo-0.1.0-py2.py3-none-any.whl"

mocker.patch(
"poetry.installation.executor.Executor._download", return_value=link_cached
)
Expand Down Expand Up @@ -564,12 +561,8 @@ def test_executor_should_use_cached_link_and_hash(
mocker: MockerFixture,
fixture_dir: FixtureDirGetter,
):
# Produce a file:/// URI that is a valid link
link_cached = Link(
fixture_dir("distributions")
.joinpath("demo-0.1.0-py2.py3-none-any.whl")
.as_uri()
)
link_cached = fixture_dir("distributions") / "demo-0.1.0-py2.py3-none-any.whl"

mocker.patch(
"poetry.installation.chef.Chef.get_cached_archive_for_link",
return_value=link_cached,
Expand Down
14 changes: 0 additions & 14 deletions tests/utils/test_pip.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@

import pytest

from poetry.core.packages.utils.link import Link
from poetry.core.packages.utils.utils import path_to_url

from poetry.utils.pip import pip_install


Expand All @@ -28,17 +25,6 @@ def test_pip_install_successful(
assert "Successfully installed demo-0.1.0" in result


def test_pip_install_link(
tmp_dir: str, tmp_venv: VirtualEnv, fixture_dir: FixtureDirGetter
):
file_path = Link(
path_to_url(fixture_dir("distributions/demo-0.1.0-py2.py3-none-any.whl"))
)
result = pip_install(file_path, tmp_venv)

assert "Successfully installed demo-0.1.0" in result


def test_pip_install_with_keyboard_interrupt(
tmp_dir: str,
tmp_venv: VirtualEnv,
Expand Down

0 comments on commit 711ddd8

Please sign in to comment.