mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-17 22:32:31 -05:00
feat: add --group-by manufacturer for split packs
This commit is contained in:
@@ -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:
|
def _norm_system_id(sid: str) -> str:
|
||||||
"""Normalize system ID for cross-platform matching.
|
"""Normalize system ID for cross-platform matching.
|
||||||
|
|
||||||
|
|||||||
@@ -902,6 +902,20 @@ def _system_display_name(system_id: str) -> str:
|
|||||||
return "_".join(p.title() for p in parts if p)
|
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(
|
def generate_split_packs(
|
||||||
platform_name: str,
|
platform_name: str,
|
||||||
platforms_dir: str,
|
platforms_dir: str,
|
||||||
|
|||||||
@@ -1766,5 +1766,41 @@ class TestE2E(unittest.TestCase):
|
|||||||
self.assertNotIn("bios_a.bin", names)
|
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__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user