From 766ddd7e210aecb85a68f67140bd15e101c4f6e4 Mon Sep 17 00:00:00 2001 From: finswimmer Date: Mon, 10 Feb 2025 16:40:02 +0100 Subject: [PATCH] feat: Add support for dependency groups which include other groups only --- src/poetry/core/factory.py | 2 +- .../core/json/schemas/poetry-schema.json | 13 ++++++-- tests/test_factory.py | 33 +++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index 40a72f066..381c50680 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -347,7 +347,7 @@ def _configure_package_dependencies( cls._add_package_group_dependencies( package=package, group=group, - dependencies=group_config["dependencies"], + dependencies=group_config.get("dependencies", {}), ) for group_name, group_config in tool_poetry["group"].items(): diff --git a/src/poetry/core/json/schemas/poetry-schema.json b/src/poetry/core/json/schemas/poetry-schema.json index 13cfed94e..55385b92f 100644 --- a/src/poetry/core/json/schemas/poetry-schema.json +++ b/src/poetry/core/json/schemas/poetry-schema.json @@ -171,8 +171,17 @@ "^[a-zA-Z-_.0-9]+$": { "type": "object", "description": "This represents a single dependency group", - "required": [ - "dependencies" + "anyOf": [ + { + "required": [ + "dependencies" + ] + }, + { + "required": [ + "include-groups" + ] + } ], "properties": { "optional": { diff --git a/tests/test_factory.py b/tests/test_factory.py index f75f61cf7..e4c756fcf 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -1291,3 +1291,36 @@ def test_create_poetry_with_unknown_nested_dependency_groups( error_type=ValueError, temporary_directory=temporary_directory, ) + + +def test_create_poetry_with_included_groups_only(temporary_directory: Path) -> None: + pyproject_toml = temporary_directory / "pyproject.toml" + content = """\ +[project] +name = "my-package" +version = "1.2.3" + +[tool.poetry.group.lint.dependencies] +black = "*" + +[tool.poetry.group.testing.dependencies] +pytest = "*" + +[tool.poetry.group.all] +include-groups = [ + "lint", + "testing", +] +""" + pyproject_toml.write_text(content) + + poetry = Factory().create_poetry(temporary_directory) + assert len(poetry.package.all_requires) == 4 + assert [ + (dep.name, ",".join(dep.groups)) for dep in poetry.package.all_requires + ] == [ + ("black", "lint"), + ("pytest", "testing"), + ("black", "all"), + ("pytest", "all"), + ]