Skip to content

Commit

Permalink
wip: implement PEP 660 hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
finswimmer committed Jul 3, 2021
1 parent 58138c5 commit fb420d6
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 5 deletions.
14 changes: 14 additions & 0 deletions poetry/core/masonry/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,17 @@ def build_sdist(
path = SdistBuilder(poetry).build(Path(sdist_directory))

return path.name


def build_editable(
wheel_directory: str,
config_settings: Optional[Dict[str, Any]] = None,
metadata_directory: Optional[str] = None,
) -> str:
poetry = Factory().create_poetry(Path(".").resolve(), with_dev=False)

return WheelBuilder.make_in(poetry, Path(wheel_directory), editable=True)


get_requires_for_build_editable = get_requires_for_build_wheel
prepare_metadata_for_build_editable = prepare_metadata_for_build_wheel
39 changes: 34 additions & 5 deletions poetry/core/masonry/builders/wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
from ..utils.helpers import escape_name
from ..utils.helpers import escape_version
from ..utils.helpers import normalize_file_permissions
from ..utils.package_include import PackageInclude
from .builder import Builder
from .sdist import SdistBuilder

Expand All @@ -54,6 +55,7 @@ def __init__(
target_dir: Optional[Path] = None,
original: Optional[Path] = None,
executable: Optional[str] = None,
editable: bool = False,
) -> None:
super(WheelBuilder, self).__init__(poetry, executable=executable)

Expand All @@ -62,6 +64,7 @@ def __init__(
self._target_dir = target_dir or (self._poetry.file.parent / "dist")
if original:
self._original_path = original.parent
self._editable = editable

@classmethod
def make_in(
Expand All @@ -70,9 +73,14 @@ def make_in(
directory: Optional[Path] = None,
original: Optional[Path] = None,
executable: Optional[str] = None,
editable: bool = False,
) -> str:
wb = WheelBuilder(
poetry, target_dir=directory, original=original, executable=executable
poetry,
target_dir=directory,
original=original,
executable=executable,
editable=editable,
)
wb.build()

Expand Down Expand Up @@ -100,12 +108,16 @@ def build(self) -> None:
with zipfile.ZipFile(
fd_file, mode="w", compression=zipfile.ZIP_DEFLATED
) as zip_file:
if not self._poetry.package.build_should_generate_setup():
self._build(zip_file)
self._copy_module(zip_file)
if not self._editable:
if not self._poetry.package.build_should_generate_setup():
self._build(zip_file)
self._copy_module(zip_file)
else:
self._copy_module(zip_file)
self._build(zip_file)
else:
self._copy_module(zip_file)
self._build(zip_file)
self._add_pth(zip_file)

self._copy_file_scripts(zip_file)
self._write_metadata(zip_file)
Expand All @@ -118,6 +130,23 @@ def build(self) -> None:

logger.info("Built {}".format(self.wheel_filename))

def _add_pth(self, wheel: zipfile.ZipFile) -> None:
paths = set()
for include in self._module.includes:
if isinstance(include, PackageInclude) and (
include.is_module() or include.is_package()
):
paths.add(include.base.resolve().as_posix())

content = ""
for path in paths:
content += path + os.linesep

pth_file = Path(self._module.name).with_suffix(".pth")

with self._write_to_zip(wheel, str(pth_file)) as f:
f.write(content)

def _build(self, wheel: zipfile.ZipFile) -> None:
if self._package.build_script:
if not self._poetry.package.build_should_generate_setup():
Expand Down
21 changes: 21 additions & 0 deletions tests/masonry/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import os
import platform
import sys
import zipfile

from contextlib import contextmanager
from pathlib import Path
Expand Down Expand Up @@ -214,3 +215,23 @@ def test_prepare_metadata_for_build_wheel_with_bad_path_dep_succeeds():
):
api.prepare_metadata_for_build_wheel(tmp_dir)
assert "does not exist" in str(err.value)


def test_build_editable_wheel():
pkg_dir = Path(fixtures) / "complete"

with temporary_directory() as tmp_dir, cwd(pkg_dir):
filename = api.build_editable(tmp_dir)
wheel_pth = Path(tmp_dir) / filename

validate_wheel_contents(
name="my_package",
version="1.2.3",
path=str(wheel_pth),
)

with zipfile.ZipFile(wheel_pth) as z:
namelist = z.namelist()

assert "my_package.pth" in namelist
assert pkg_dir.as_posix() == z.read("my_package.pth").decode().strip()

0 comments on commit fb420d6

Please sign in to comment.