feat: name each system once, from its own section

siterender.system_name reads the heading of the console section the id spells, then SYSTEM_NAMES, and raises for an id in neither. The emulator intro and the picker titles read it instead of the folder a system's files were voted onto.
This commit is contained in:
Abdessamad Derraz committed 2026-10-23 02:04:06 +02:00
1 parent 2a50bc21f7
commit 72e7507ff9
4 files changed
+695 -10

No files matched your search

+120
View File
@@ -0,0 +1,120 @@
"""One display name per system id (round 2, package P0).
An emulator page listed the folders a system's files were voted onto:
nintendo-gba read "Nintendo Game Boy", camplynx "Arcade", and MAME
"emulated FBNeo". siterender.system_name names a system from the console
section that is its own, then from SYSTEM_NAMES, and raises otherwise.
database.json carries no system id: its files reach a page through their
console folders, so the ids to name are the platforms' and the profiles'.
"""
from __future__ import annotations
import json
import sys
import unittest
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import siterender # noqa: E402
from common import ( # noqa: E402
list_registered_platforms,
load_emulator_profiles,
load_platform_config,
)
from generate_site import _group_by_manufacturer # noqa: E402
def _profile_system_ids(profiles: dict[str, dict]) -> set[str]:
ids: set[str] = set()
for profile in profiles.values():
ids.update(str(sys_id) for sys_id in profile.get("systems") or [])
for entry in profile.get("files") or []:
if not isinstance(entry, dict):
continue
if entry.get("system"):
ids.add(str(entry["system"]))
ids.update(str(sys_id) for sys_id in entry.get("systems") or [])
return ids
class SystemNames(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
with open(REPO_ROOT / "database.json", encoding="utf-8") as handle:
db = json.load(handle)
cls.manufacturers = _group_by_manufacturer(db)
cls.profiles = load_emulator_profiles(
str(REPO_ROOT / "emulators"), skip_aliases=False)
siterender.set_console_sections(
cls.manufacturers, siterender.program_names(cls.profiles))
platforms_dir = str(REPO_ROOT / "platforms")
cls.platform_ids = {
sys_id
for name in list_registered_platforms(platforms_dir, include_archived=True)
for sys_id in load_platform_config(name, platforms_dir).get("systems", {})
}
cls.profile_ids = _profile_system_ids(cls.profiles)
def _all_ids(self) -> set[str]:
return self.platform_ids | self.profile_ids
def test_every_system_id_has_a_name(self) -> None:
unnamed = []
for sys_id in sorted(self._all_ids()):
try:
name = siterender.system_name(sys_id)
except KeyError:
unnamed.append(sys_id)
continue
self.assertTrue(name.strip(), sys_id)
self.assertEqual(unnamed, [], "add these to siterender.SYSTEM_NAMES")
def test_no_name_is_a_manufacturer_page_or_an_emulator(self) -> None:
taken = {name.casefold() for name in self.manufacturers}
taken |= {name.casefold() for name in siterender.program_names(self.profiles)}
clashes = sorted(
(sys_id, siterender.system_name(sys_id))
for sys_id in self._all_ids()
if siterender.system_name(sys_id).casefold() in taken
)
self.assertEqual(clashes, [])
def test_table_entries_are_reached(self) -> None:
"""A table entry an own section shadows is never read, and an entry
no platform or profile names is a leftover."""
shadowed = sorted(
sys_id for sys_id in siterender.SYSTEM_NAMES
if siterender._own_section(sys_id) is not None
)
self.assertEqual(shadowed, [])
unused = sorted(set(siterender.SYSTEM_NAMES) - self._all_ids())
self.assertEqual(unused, [])
def test_names_that_read_a_folder_vote(self) -> None:
self.assertEqual(siterender.system_name("nintendo-gba"), "Nintendo Game Boy Advance")
self.assertEqual(siterender.system_name("camplynx"), "Camputers Lynx")
self.assertEqual(siterender.system_name("atari-lynx"), "Atari Lynx")
self.assertEqual(siterender.system_name("arcade"), "Arcade games")
self.assertEqual(siterender.system_name("sega-naomi"), "Sega NAOMI")
def test_own_section_names_from_its_heading(self) -> None:
self.assertEqual(siterender.system_name("nintendo-snes"), "Nintendo SNES")
self.assertEqual(siterender.system_name("sony-playstation"), "Sony PlayStation")
def test_an_unknown_id_raises(self) -> None:
with self.assertRaises(KeyError):
siterender.system_name("no-such-system-anywhere")
def test_mame_names_systems_not_emulators(self) -> None:
names = {siterender.system_name(s) for s in self.profiles["mame"].get("systems") or []}
self.assertNotIn("FBNeo", names)
self.assertNotIn("Arcade", names)
self.assertFalse(names & siterender.program_names(self.profiles))
if __name__ == "__main__":
unittest.main()