diff --git a/src/compwa_policy/utilities/pyproject/setters.py b/src/compwa_policy/utilities/pyproject/setters.py index 242ed8b9..9762ae06 100644 --- a/src/compwa_policy/utilities/pyproject/setters.py +++ b/src/compwa_policy/utilities/pyproject/setters.py @@ -67,9 +67,11 @@ def _sort_taplo(items: Iterable[str]) -> list[str]: def create_sub_table(config: Mapping[str, Any], dotted_header: str) -> Table: """Create a TOML sub-table through a dotted header key.""" current_table: Any = config - for header in dotted_header.split("."): + header_hierarchy = dotted_header.split(".") + for i, header in enumerate(header_hierarchy, 1): if header not in current_table: - current_table[header] = tomlkit.table() + is_last_header = i == len(header_hierarchy) + current_table[header] = tomlkit.table(is_super_table=not is_last_header) current_table = current_table[header] return current_table diff --git a/tests/utilities/pyproject/test_setters.py b/tests/utilities/pyproject/test_setters.py index 8ae68e4d..50ab2d6c 100644 --- a/tests/utilities/pyproject/test_setters.py +++ b/tests/utilities/pyproject/test_setters.py @@ -155,3 +155,23 @@ def test_create_sub_table(table_key: str): lint = ["ruff"] """) assert new_content.strip() == expected.strip() + + +def test_create_sub_table_with_super_table(): + pyproject = load_pyproject_toml("", modifiable=True) + pixi = create_sub_table(pyproject, "tool.pixi") + pixi["channels"] = ["conda-forge"] + pixi["platforms"] = ["linux-64"] + task_table = create_sub_table(pyproject, "tool.pixi.feature.dev.tasks.test") + task_table["cmd"] = "pytest" + + new_content = tomlkit.dumps(pyproject) + expected = dedent(""" + [tool.pixi] + channels = ["conda-forge"] + platforms = ["linux-64"] + + [tool.pixi.feature.dev.tasks.test] + cmd = "pytest" + """) + assert new_content.strip() == expected.strip()