From 2c1f355163e479a092d8703ff100f50478ed284c Mon Sep 17 00:00:00 2001 From: Farzin Kazemzadeh Date: Tue, 30 Jun 2026 10:24:55 +0330 Subject: [PATCH 1/2] fix(generate): handle duplicate containers without folder --- src/composekit/generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/composekit/generate.py b/src/composekit/generate.py index 5353973..80ea167 100755 --- a/src/composekit/generate.py +++ b/src/composekit/generate.py @@ -273,7 +273,7 @@ def main(args: argparse.Namespace) -> None: if name in used_names: number = str(used_names.count(name) + 1) container["name"] = name = f"{name}_{number}" - if container["folder"]: + if container.get("folder"): container["folder"] += number used_names.append(name) From 902325fe707f1c59e98326730bc82f092021c71a Mon Sep 17 00:00:00 2001 From: Farzin Kazemzadeh Date: Tue, 30 Jun 2026 10:31:06 +0330 Subject: [PATCH 2/2] test(generate): cover duplicate containers without folder --- tests/test_generate.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/test_generate.py b/tests/test_generate.py index 126a57f..1969b36 100644 --- a/tests/test_generate.py +++ b/tests/test_generate.py @@ -1,7 +1,12 @@ +import argparse +import tempfile import unittest +from pathlib import Path from typing import Any from unittest.mock import MagicMock +import yaml + from composekit.generate import ( Config, capitalize_name, @@ -10,6 +15,7 @@ get_folder_name, handle_volumes, is_custom_bind, + main, ) @@ -84,6 +90,32 @@ def test_generate_minimal(self) -> None: self.assertEqual(result["restart"], "unless-stopped") self.assertEqual(result["networks"], ["cloud"]) + def test_main_handles_duplicate_containers_without_folder(self) -> None: + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + containers = root / "containers" + composes = root / "composes" + output = root / "docker-compose.yaml" + containers.mkdir() + (containers / "container.yaml").write_text( + "image: nginx\n---\nimage: redis\n" + ) + + args = argparse.Namespace( + config=None, + containers=str(containers), + composes=str(composes), + output=str(output), + commit=False, + ) + + main(args) + + compose = yaml.safe_load((composes / "container.yaml").read_text()) + self.assertEqual( + list(compose["services"].keys()), ["container", "container_2"] + ) + def test_handle_volumes_with_full_capitalize(self) -> None: config = Config() config["bind_path"] = "${BIND_PATH}"