From 5b9279d1e397199e8665f8c9e34c6e5a4501e264 Mon Sep 17 00:00:00 2001 From: David Hotham Date: Thu, 5 Mar 2026 22:14:13 +0000 Subject: [PATCH] Fix group_includes overwrite losing PEP 735 includes When a group appeared in both [dependency-groups] (with include-group) and [tool.poetry.group] (with include-groups), the direct = assignment overwrote the PEP 735 includes. Use .setdefault().extend() to merge both sets, so cycle detection sees all include paths. --- src/poetry/core/factory.py | 4 ++-- tests/test_factory.py | 49 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index 8eeda9394..d2d81382c 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -804,9 +804,9 @@ def _validate_dependency_groups( normalized_group_name = canonicalize_name(group_name) original_names[normalized_group_name].add(group_name) if include_groups := group_config.get("include-groups", []): - group_includes[normalized_group_name] = [ + group_includes.setdefault(normalized_group_name, []).extend( canonicalize_name(name) for name in include_groups - ] + ) for normed_name, names in original_names.items(): if len(names) > 1: diff --git a/tests/test_factory.py b/tests/test_factory.py index ddf149d97..1cfaa24c3 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -2057,3 +2057,52 @@ def test_create_poetry_with_optional_dependency_group( assert len(poetry.package.all_requires) == 1 assert poetry.package.has_dependency_group("dev") assert poetry.package.dependency_group("dev").is_optional() is optional + + +def test_pep735_includes_not_overwritten_by_poetry_includes( + temporary_directory: Path, +) -> None: + """PEP 735 include-group entries must not be lost when [tool.poetry.group] + also defines include-groups for the same group. + + Setup: + [dependency-groups] dev includes testing (PEP 735) + [tool.poetry.group.dev] includes utils (poetry) + [dependency-groups] testing includes dev (PEP 735) + The poetry-side include (dev -> utils) must not erase the PEP 735 one. + """ + content = """\ +[project] +name = "my-package" +version = "1.2.3" + +[dependency-groups] +dev = [ + {include-group = "testing"}, + "black", +] +testing = [ + {include-group = "dev"}, + "pytest", +] +utils = [ + "mypy", +] + +[tool.poetry.group.dev] +include-groups = [ + "utils", +] +""" + + expected = """\ +The Poetry configuration is invalid: + - Cyclic dependency group include in dev: testing -> dev + - Cyclic dependency group include in testing: dev -> testing +""" + assert_invalid_group_including( + toml_data=content, + expected_error=expected, + error_type=RuntimeError, + temporary_directory=temporary_directory, + )