Skip to content

Commit

Permalink
fix(build-project): rewrite the CLI endpoint when there is relative i…
Browse files Browse the repository at this point in the history
…ncludes matching the namespace (#52)

* fix(build-project): rewrite the CLI endpoint when there is relative includes matching the namespace

* bump version to 1.4.1
  • Loading branch information
DavidVujic committed Mar 7, 2024
1 parent 5ba524a commit 89eb415
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 10 deletions.
30 changes: 26 additions & 4 deletions poetry_multiproject_plugin/components/toml/generate.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Dict, List, Union, cast
from typing import Dict, List, Set, Union, cast

import tomlkit
from tomlkit.toml_document import TOMLDocument
Expand Down Expand Up @@ -40,10 +40,30 @@ def to_valid_dist_packages(
return local + relative_packages


def to_valid_entry(entry: str, top_ns: str) -> str:
def parse_ns_from_relative_package_includes(data: dict) -> Set[str]:
packages = data["tool"]["poetry"]["packages"]
relative_paths = {p.get("include") for p in packages if is_relative(p)}

return {str.replace(p, "/", ".") for p in relative_paths}


def to_valid_entry(entry: str, top_ns: str, data: dict) -> str:
"""Constructing an entry, optionally with a custom top namespace
Appends the custom top namespace when there are relative package includes
that matches the entry point namespace,
and when the custom top namespace isn't already added in configuration.
"""
prefix = f"{top_ns}."
ns_from_package_includes = parse_ns_from_relative_package_includes(data)

contains_ns = any((ns in entry) for ns in ns_from_package_includes)
contains_prefix = prefix in entry

if contains_ns and not contains_prefix:
return f"{prefix}{entry}"

return entry if prefix in entry else f"{prefix}{entry}"
return entry


def generate_valid_dist_project_file(
Expand All @@ -66,7 +86,9 @@ def generate_valid_dist_project_file(
scripts = copy["tool"]["poetry"].get("scripts", {})

if top_ns and scripts:
rewritten_scripts = {k: to_valid_entry(v, top_ns) for k, v in scripts.items()}
rewritten_scripts = {
k: to_valid_entry(v, top_ns, data) for k, v in scripts.items()
}

copy["tool"]["poetry"]["scripts"] = rewritten_scripts

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "poetry-multiproject-plugin"
version = "1.4.0"
version = "1.4.1"
description = "A Poetry plugin that makes it possible to use relative package includes."
authors = ["David Vujic"]
license = "MIT"
Expand Down
26 changes: 21 additions & 5 deletions test/components/toml/generate_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,17 @@
]
[tool.poetry.scripts]
my_cli = "my.console.app:run"
my_cli = "hello.console.app:run"
"""

pyproject_cli_with_local_modules = """\
[tool.poetry]
packages = [
{include = "hello", from = "../world"},
]
[tool.poetry.scripts]
my_cli = "my_local_module.console.app:run"
"""


Expand All @@ -45,16 +55,22 @@ def test_generate_project_file_with_custom_namespace_for_packages():
def test_generate_project_file_with_custom_namespace_in_script_entry_point():
data = generate_toml(pyproject_cli, "xyz")

assert data["tool"]["poetry"]["scripts"] == {"my_cli": "xyz.my.console.app:run"}
assert data["tool"]["poetry"]["scripts"] == {"my_cli": "xyz.hello.console.app:run"}


def test_generate_project_file_with_unchanged_script_entry_point():
data = generate_toml(pyproject_cli, "my")
data = generate_toml(pyproject_cli, "hello")

assert data["tool"]["poetry"]["scripts"] == {"my_cli": "my.console.app:run"}
assert data["tool"]["poetry"]["scripts"] == {"my_cli": "hello.console.app:run"}


def test_generate_project_file_with_unchanged_script_entry_point_when_ns_is_in_path():
data = generate_toml(pyproject_cli, "console")

assert data["tool"]["poetry"]["scripts"] == {"my_cli": "my.console.app:run"}
assert data["tool"]["poetry"]["scripts"] == {"my_cli": "hello.console.app:run"}


def test_generate_project_file_with_unchanged_script_entry_point_using_local_module():
data = generate_toml(pyproject_cli_with_local_modules, "xyz")

assert data["tool"]["poetry"]["scripts"] == {"my_cli": "my_local_module.console.app:run"}

0 comments on commit 89eb415

Please sign in to comment.