mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-10 13:33:24 -05:00
refactor: extract retrodeck key matching helpers
This commit is contained in:
1 parent
52fbea5faa
commit
8a9924f1d8
1 file changed
+41
-30
@@ -25,6 +25,34 @@ MANIFEST = "component_manifest.json"
|
|||||||
PLAIN_LABELS = ("Required", "Optional")
|
PLAIN_LABELS = ("Required", "Optional")
|
||||||
|
|
||||||
|
|
||||||
|
def _systems_of(entry: dict) -> list[str]:
|
||||||
|
"""The systems one entry serves: neogeo.zip is declared once for three."""
|
||||||
|
declared = entry.get("system")
|
||||||
|
if isinstance(declared, list):
|
||||||
|
return [str(s) for s in declared]
|
||||||
|
return [str(declared)] if declared else []
|
||||||
|
|
||||||
|
|
||||||
|
def _md5_set(value: object) -> set[str]:
|
||||||
|
return {m.strip().lower() for m in str(value or "").split(",") if m.strip()}
|
||||||
|
|
||||||
|
|
||||||
|
def _matching_keys(
|
||||||
|
entry: dict, by_key: dict[tuple[str, str], OrderedDict]
|
||||||
|
) -> list[tuple[str, str]]:
|
||||||
|
"""Our keys this platform entry answers to.
|
||||||
|
|
||||||
|
An entry without a system matches ours only when one system alone
|
||||||
|
declares the name.
|
||||||
|
"""
|
||||||
|
name = str(entry.get("filename", ""))
|
||||||
|
systems = _systems_of(entry)
|
||||||
|
if systems:
|
||||||
|
return [(name, s) for s in systems if (name, s) in by_key]
|
||||||
|
named = [k for k in by_key if k[0] == name]
|
||||||
|
return named if len(named) == 1 else []
|
||||||
|
|
||||||
|
|
||||||
class Exporter(BaseExporter):
|
class Exporter(BaseExporter):
|
||||||
"""Write RetroDECK's component manifests, corrected."""
|
"""Write RetroDECK's component manifests, corrected."""
|
||||||
|
|
||||||
@@ -175,41 +203,24 @@ class Exporter(BaseExporter):
|
|||||||
# shares a hash with, never all of them.
|
# shares a hash with, never all of them.
|
||||||
seen_keys: dict[tuple[str, str], int] = {}
|
seen_keys: dict[tuple[str, str], int] = {}
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
declared = entry.get("system")
|
for system in _systems_of(entry):
|
||||||
systems = declared if isinstance(declared, list) else [declared] if declared else []
|
key = (str(entry.get("filename", "")), system)
|
||||||
for system in systems:
|
|
||||||
key = (str(entry.get("filename", "")), str(system))
|
|
||||||
seen_keys[key] = seen_keys.get(key, 0) + 1
|
seen_keys[key] = seen_keys.get(key, 0) + 1
|
||||||
for entry in existing if isinstance(existing, list) else []:
|
for entry in entries:
|
||||||
if not isinstance(entry, dict):
|
keys = _matching_keys(entry, by_key)
|
||||||
continue
|
other_revision = (
|
||||||
name = str(entry.get("filename", ""))
|
keys
|
||||||
declared = entry.get("system")
|
and seen_keys.get(keys[0], 0) > 1
|
||||||
# One entry can serve several systems: neogeo.zip is declared
|
and not _md5_set(entry.get("md5")) & _md5_set(by_key[keys[0]].get("md5"))
|
||||||
# once for neogeo, fbneo and arcade.
|
|
||||||
systems = (
|
|
||||||
[str(s) for s in declared] if isinstance(declared, list)
|
|
||||||
else [str(declared)] if declared else []
|
|
||||||
)
|
)
|
||||||
keys = [(name, s) for s in systems if (name, s) in by_key]
|
if other_revision:
|
||||||
if not systems:
|
merged.append(OrderedDict(entry))
|
||||||
# An entry without a system matches ours only when one
|
corrected.update(keys)
|
||||||
# system alone declares the name.
|
continue
|
||||||
named = [k for k in by_key if k[0] == name]
|
|
||||||
keys = named if len(named) == 1 else []
|
|
||||||
if keys and seen_keys.get(keys[0], 0) > 1:
|
|
||||||
theirs = {m.strip().lower() for m in str(entry.get("md5", "")).split(",") if m.strip()}
|
|
||||||
ours = {
|
|
||||||
m.strip().lower()
|
|
||||||
for m in str(by_key[keys[0]].get("md5", "")).split(",") if m.strip()
|
|
||||||
}
|
|
||||||
if not theirs & ours:
|
|
||||||
merged.append(OrderedDict(entry))
|
|
||||||
corrected.update(keys)
|
|
||||||
continue
|
|
||||||
if not keys:
|
if not keys:
|
||||||
merged.append(OrderedDict(entry))
|
merged.append(OrderedDict(entry))
|
||||||
continue
|
continue
|
||||||
|
declared = entry.get("system")
|
||||||
combined = OrderedDict(entry)
|
combined = OrderedDict(entry)
|
||||||
combined.update(
|
combined.update(
|
||||||
(field, value) for field, value in by_key[keys[0]].items()
|
(field, value) for field, value in by_key[keys[0]].items()
|
||||||
|
|||||||
Reference in new issue
Block a user