mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-11 20:43:50 -06:00
chore: merge one-of sets
This commit is contained in:
commit
ad424f796b
41 files changed
+1657
-449
No files matched your search
+39
-4
@@ -22,6 +22,8 @@ import zipfile
|
||||
from pathlib import Path
|
||||
from typing import Any, TextIO
|
||||
|
||||
from alternatives import derive_member_requirements
|
||||
|
||||
# Every build script imports this module. verify.py, slots.py, validate_pr.py
|
||||
# and cross_reference.py started under 3.8 and stopped halfway on a
|
||||
# str.removeprefix AttributeError, which named no version.
|
||||
@@ -1267,7 +1269,39 @@ _archive_index: dict[int, tuple[list[dict], int, dict[str | None, list[dict]]]]
|
||||
|
||||
|
||||
def _member(f: dict) -> dict:
|
||||
return {"crc32": str(f["crc32"]).lower(), "required": bool(f.get("required", True))}
|
||||
member = {"crc32": str(f["crc32"]).lower(), "required": bool(f.get("required", True))}
|
||||
if f.get("group"):
|
||||
# One of the members sharing it is enough (alternatives.py).
|
||||
member["group"] = f["group"]
|
||||
return member
|
||||
|
||||
|
||||
def _required_met(members: list[dict], held: Callable[[dict], bool]) -> tuple[int, bool]:
|
||||
"""How many requirements an archive meets, and whether it meets all.
|
||||
|
||||
A required member is one requirement, and so is a required set of
|
||||
alternatives, met when one of its members is held: Odin reads the
|
||||
first of three Hikaru boot ROMs it finds in hikaru.zip.
|
||||
"""
|
||||
from alternatives import groups_of
|
||||
|
||||
met = 0
|
||||
complete = True
|
||||
sets: dict[str, bool] = {}
|
||||
for m in members:
|
||||
if not m["required"]:
|
||||
continue
|
||||
names = groups_of(m)
|
||||
if names:
|
||||
for name in names:
|
||||
sets[name] = sets.get(name, False) or held(m)
|
||||
continue
|
||||
if held(m):
|
||||
met += 1
|
||||
else:
|
||||
complete = False
|
||||
met += sum(sets.values())
|
||||
return met, complete and all(sets.values())
|
||||
|
||||
|
||||
def archive_members(archive: str, files: list[dict]) -> list[dict]:
|
||||
@@ -1316,7 +1350,7 @@ def holds_required_members(path: str, members: list[dict]) -> bool:
|
||||
"""Whether an archive holds every member a profile requires inside it."""
|
||||
crcs = zip_member_crcs(path)
|
||||
names = zip_member_names(path)
|
||||
return all(_member_held(m, crcs, names) for m in members if m["required"])
|
||||
return _required_met(members, lambda m: _member_held(m, crcs, names))[1]
|
||||
|
||||
|
||||
def contents_members(file_entry: dict) -> list[dict]:
|
||||
@@ -1360,8 +1394,8 @@ def _holding_members(paths: list[str], members: list[dict]) -> list[str]:
|
||||
def held(path: str) -> tuple[int, int]:
|
||||
crcs = zip_member_crcs(path)
|
||||
names = zip_member_names(path)
|
||||
found = [m for m in members if _member_held(m, crcs, names)]
|
||||
return sum(1 for m in found if m["required"]), len(found)
|
||||
found = {id(m) for m in members if _member_held(m, crcs, names)}
|
||||
return _required_met(members, lambda m: id(m) in found)[0], len(found)
|
||||
|
||||
scores = {path: held(path) for path in paths}
|
||||
best = max(scores.values(), default=(0, 0))
|
||||
@@ -2337,6 +2371,7 @@ def load_emulator_profiles(
|
||||
if "emulator" not in profile:
|
||||
continue
|
||||
_normalize_hash_fields(profile)
|
||||
derive_member_requirements(profile)
|
||||
profiles[f.stem] = profile
|
||||
_emulator_profiles_cache[cache_key] = profiles
|
||||
return profiles
|
||||
|
||||
Reference in new issue
Block a user