Skip to content

Commit b3ffd2b

Browse files
committed
feat: add validation for import-names and import-namespaces to prevent duplicates
1 parent 6497c57 commit b3ffd2b

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/poetry/core/factory.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from packaging.licenses import canonicalize_license_expression
1616
from packaging.utils import canonicalize_name
1717

18+
from poetry.core.exceptions import PoetryCoreError
1819
from poetry.core.packages.dependency import Dependency
1920
from poetry.core.packages.dependency_group import DependencyGroup
2021
from poetry.core.utils.helpers import combine_unicode
@@ -323,9 +324,25 @@ def _configure_package_metadata(
323324
)
324325
package.readmes = tuple(root / r for r in custom_readmes if r)
325326

327+
cls._validate_import_names(project)
328+
326329
package.import_names = project.get("import-names")
327330
package.import_namespaces = project.get("import-namespaces")
328331

332+
@classmethod
333+
def _validate_import_names(cls, project: dict[str, Any]) -> None:
334+
import_names = {
335+
name.split(";")[0].strip() for name in project.get("import-names", [])
336+
}
337+
import_namespaces = {
338+
name.split(";")[0].strip() for name in project.get("import-namespaces", [])
339+
}
340+
341+
if duplicates := import_names & import_namespaces:
342+
raise PoetryCoreError(
343+
f"Import names found in both import-names and import-namespaces: {', '.join(duplicates)}"
344+
)
345+
329346
@classmethod
330347
def _configure_entry_points(
331348
cls,

tests/test_factory.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from packaging.utils import canonicalize_name
1414

1515
from poetry.core.constraints.version import parse_constraint
16+
from poetry.core.exceptions import PoetryCoreError
1617
from poetry.core.factory import Factory
1718
from poetry.core.packages.dependency import Dependency
1819
from poetry.core.packages.dependency_group import MAIN_GROUP
@@ -335,6 +336,40 @@ def test_create_poetry_with_import_names() -> None:
335336
assert package.import_namespaces == ["my_package"]
336337

337338

339+
@pytest.mark.parametrize(
340+
["namespace_name", "import_name"],
341+
[
342+
("my_package", "my_package"),
343+
("my_package; private", "my_package"),
344+
("my_package ; private", "my_package"),
345+
("my_package; private", "my_package; private"),
346+
],
347+
)
348+
def test_create_poetry_raise_on_name_in_import_names_and_spaces(
349+
namespace_name: str, import_name: str, tmp_path: Path
350+
) -> None:
351+
content = f"""
352+
[project]
353+
name = "my-package"
354+
version = "1.2.3"
355+
description = "Some description."
356+
requires-python = ">=3.6"
357+
358+
import-namespaces = ["{namespace_name}", "another_package"]
359+
import-names = ["{import_name}"]
360+
361+
dependencies = []
362+
"""
363+
pyproject = tmp_path / "pyproject.toml"
364+
pyproject.write_text(content)
365+
366+
with pytest.raises(
367+
PoetryCoreError,
368+
match="Import names found in both import-names and import-namespaces: my_package",
369+
):
370+
_ = Factory().create_poetry(pyproject)
371+
372+
338373
@pytest.mark.parametrize(
339374
"project", ["sample_project_with_groups", "sample_project_with_groups_new"]
340375
)

0 commit comments

Comments
 (0)