From 3ded72f72b83c7618a16238017588ab6ecc7cc11 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Sat, 28 Mar 2026 00:45:12 +0100 Subject: [PATCH] feat: add --group-by manufacturer for split packs --- scripts/common.py | 15 +++++++++++++++ scripts/generate_pack.py | 14 ++++++++++++++ tests/test_e2e.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/scripts/common.py b/scripts/common.py index 51ebae21..b269c12f 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -655,6 +655,21 @@ MANUFACTURER_PREFIXES = ( ) +def derive_manufacturer(system_id: str, system_data: dict) -> str: + """Derive manufacturer name for a system. + + Priority: explicit manufacturer field > system ID prefix > 'Other'. + """ + mfr = system_data.get("manufacturer", "") + if mfr and mfr not in ("Various", "Other"): + return mfr.split("|")[0].strip() + s = system_id.lower().replace("_", "-") + for prefix in MANUFACTURER_PREFIXES: + if s.startswith(prefix): + return prefix.rstrip("-").title() + return "Other" + + def _norm_system_id(sid: str) -> str: """Normalize system ID for cross-platform matching. diff --git a/scripts/generate_pack.py b/scripts/generate_pack.py index 791d0940..a382ad58 100644 --- a/scripts/generate_pack.py +++ b/scripts/generate_pack.py @@ -902,6 +902,20 @@ def _system_display_name(system_id: str) -> str: return "_".join(p.title() for p in parts if p) +def _group_systems_by_manufacturer( + systems: dict[str, dict], + db: dict, + bios_dir: str, +) -> dict[str, list[str]]: + """Group system IDs by manufacturer for --split --group-by manufacturer.""" + from common import derive_manufacturer + groups: dict[str, list[str]] = {} + for sid, sys_data in systems.items(): + mfr = derive_manufacturer(sid, sys_data) + groups.setdefault(mfr, []).append(sid) + return groups + + def generate_split_packs( platform_name: str, platforms_dir: str, diff --git a/tests/test_e2e.py b/tests/test_e2e.py index 2410af7f..6a2962c7 100644 --- a/tests/test_e2e.py +++ b/tests/test_e2e.py @@ -1766,5 +1766,41 @@ class TestE2E(unittest.TestCase): self.assertNotIn("bios_a.bin", names) + def test_136_derive_manufacturer(self): + """derive_manufacturer extracts manufacturer correctly.""" + from common import derive_manufacturer + # From system ID prefix + self.assertEqual(derive_manufacturer("sony-playstation", {}), "Sony") + self.assertEqual(derive_manufacturer("nintendo-snes", {}), "Nintendo") + self.assertEqual(derive_manufacturer("sega-saturn", {}), "Sega") + self.assertEqual(derive_manufacturer("atari-5200", {}), "Atari") + # From explicit manufacturer field + self.assertEqual( + derive_manufacturer("3do", {"manufacturer": "Panasonic|GoldStar"}), + "Panasonic", + ) + # Various = skip to prefix check, then Other + self.assertEqual(derive_manufacturer("arcade", {"manufacturer": "Various"}), "Other") + # Fallback + self.assertEqual(derive_manufacturer("dos", {}), "Other") + + def test_137_group_systems_by_manufacturer(self): + """_group_systems_by_manufacturer groups correctly.""" + from generate_pack import _group_systems_by_manufacturer + systems = { + "sony-playstation": {"files": [{"name": "a.bin"}]}, + "sony-psp": {"files": [{"name": "b.bin"}]}, + "nintendo-snes": {"files": [{"name": "c.bin"}]}, + "arcade": {"manufacturer": "Various", "files": [{"name": "d.bin"}]}, + } + groups = _group_systems_by_manufacturer(systems, {}, "") + self.assertIn("Sony", groups) + self.assertEqual(sorted(groups["Sony"]), ["sony-playstation", "sony-psp"]) + self.assertIn("Nintendo", groups) + self.assertEqual(groups["Nintendo"], ["nintendo-snes"]) + self.assertIn("Other", groups) + self.assertEqual(groups["Other"], ["arcade"]) + + if __name__ == "__main__": unittest.main()