fix: keep a parent config intact under inheritance

This commit is contained in:
Abdessamad Derraz committed 2026-10-16 22:03:16 +02:00
1 parent de08f71c52
commit 1d7b6462e9
2 files changed
+126 -46

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
"""A platform that inherits another one.
The child was merged over the parent's cached config: its overrides rewrote
the parent's systems for the rest of the run, and the parent's registry
fields hid the child's own, so RetroPie loaded as active with RetroArch's
scraper and install block.
"""
from __future__ import annotations
import shutil
import sys
import tempfile
import unittest
from pathlib import Path
import yaml
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import common # noqa: E402
class AChildLeavesItsParentAlone(unittest.TestCase):
def setUp(self):
self.dir = Path(tempfile.mkdtemp(dir=REPO_ROOT / "tmp"))
self.addCleanup(shutil.rmtree, self.dir, True)
self.addCleanup(common._platform_config_cache.clear)
self.addCleanup(common._shared_yml_cache.clear)
files = {
"parent.yml": {"platform": "Parent", "verification_mode": "existence",
"systems": {"sys-a": {"files": [{"name": "a.bin"}]}}},
"child.yml": {"platform": "Child", "inherits": "parent", "overrides": {
"systems": {"sys-a": {"files": [{"name": "child.bin"}]},
"sys-new": {"files": [{"name": "new.bin"}]}}}},
"_registry.yml": {"platforms": {
"parent": {"status": "active", "scraper": "parent", "hash_type": "md5",
"cores": "all_libretro"},
"child": {"status": "archived", "scraper": "child"},
}},
}
for name, data in files.items():
(self.dir / name).write_text(yaml.safe_dump(data))
def load(self, name):
return common.load_platform_config(name, str(self.dir))
def test_the_parent_keeps_its_systems(self):
self.load("parent")
self.load("child")
parent = self.load("parent")
self.assertEqual(list(parent["systems"]), ["sys-a"])
self.assertEqual(parent["systems"]["sys-a"]["files"], [{"name": "a.bin"}])
def test_the_child_reads_its_own_registry_entry_first(self):
self.load("parent")
child = self.load("child")
self.assertEqual((child["status"], child["scraper"]), ("archived", "child"))
# What it does not say comes from its parent's entry.
self.assertEqual((child["hash_type"], child["cores"]), ("md5", "all_libretro"))
self.assertEqual(child["systems"]["sys-a"]["files"], [{"name": "child.bin"}])
if __name__ == "__main__":
unittest.main()