refactor: one refusal for profile-blind narrowings

generate_pack and verify each held a copy of the refusal added for MiSTer
and BizHawk. without_profile_blind in common.py is the one both read.
This commit is contained in:
Abdessamad Derraz committed 2026-11-06 15:23:13 +01:00
1 parent 8a48156830
commit 537f814d4a
3 files changed
+49 -66

No files matched your search

+21 -5
View File
@@ -2761,20 +2761,26 @@ def preferred_profile(index: dict[str, set[str]], name: str) -> str | None:
return name if name in claimants else sorted(claimants)[0]
def profile_blind_platforms(
def without_profile_blind(
platforms: list[str],
flags: list[str],
platforms_dir: str,
profiles: dict[str, dict],
target_cores: dict[str, set[str] | None] | None = None,
target_cores: dict[str, set[str] | None] | None,
is_all: bool,
) -> list[str]:
"""Platforms that run no core a profile describes.
"""The platforms a narrowing read from profiles can apply to.
Regions, search order and game data are read from the profiles of the
cores a platform runs. MiSTer and BizHawk declare `cores: []`: a
--region, --one-per-slot or --no-game-data pack of theirs withdrew
nothing while its name and README said it had.
nothing while its name and README said it had. A named platform is
refused (exit 1). Under --all it is left out with a notice. generate_pack
and verify both read this.
"""
return [
if not flags:
return platforms
blind = [
name for name in platforms
if not resolve_platform_cores(
load_platform_config(name, platforms_dir),
@@ -2782,6 +2788,16 @@ def profile_blind_platforms(
target_cores=(target_cores or {}).get(name),
)
]
for name in blind:
message = (
f"{name} runs no core a profile describes, and {', '.join(flags)} "
"reads the profiles"
)
if not is_all:
print(f"ERROR: {message}: drop {', '.join(flags)}", file=sys.stderr)
sys.exit(1)
print(f" {message}: left out")
return [name for name in platforms if name not in blind]
def resolve_platform_cores(
+14 -39
View File
@@ -75,7 +75,7 @@ from common import (
load_database,
load_emulator_profiles,
load_platform_config,
profile_blind_platforms,
without_profile_blind,
MANUFACTURER_PREFIXES,
require_yaml,
ProfileSelectionError,
@@ -3099,42 +3099,6 @@ def _pack_label(source: str, required_only: bool) -> str:
return f"[source={source}, required]" if required_only else f"[source={source}]"
def _without_profile_blind(
args: argparse.Namespace,
platforms: list[str],
emu_profiles: dict,
target_cores_cache: dict[str, set[str] | None],
) -> list[str]:
"""Refuse a narrowing read from profiles on a platform that runs none.
Named, the platform is refused. Under --all it is left out with a
notice, as an empty truth pack is under --all-variants.
"""
flags = [
flag for flag, given in (
("--region", getattr(args, "regions", None)),
("--one-per-slot", getattr(args, "one_per_slot", False)),
("--no-game-data", getattr(args, "no_game_data", False)),
) if given
]
if not flags:
return platforms
blind = profile_blind_platforms(
platforms, args.platforms_dir, emu_profiles,
target_cores_cache if args.target else None,
)
for name in blind:
message = (
f"{name} runs no core a profile describes, and {', '.join(flags)} "
"reads the profiles"
)
if not args.all:
print(f"ERROR: {message}: drop {', '.join(flags)}", file=sys.stderr)
sys.exit(1)
print(f" {message}: left out")
return [name for name in platforms if name not in blind]
def _truth_layer_is_empty(
platform: str, platforms_dir: str, emu_profiles: dict, target_cores: set[str] | None
) -> bool:
@@ -3846,8 +3810,19 @@ def _main(held: contextlib.ExitStack) -> None:
platforms = _platforms_with_systems(
args, platforms, system_filter, emu_profiles, target_cores_cache
)
platforms = _without_profile_blind(
args, platforms, emu_profiles, target_cores_cache
platforms = without_profile_blind(
platforms,
[
flag for flag, given in (
("--region", getattr(args, "regions", None)),
("--one-per-slot", getattr(args, "one_per_slot", False)),
("--no-game-data", getattr(args, "no_game_data", False)),
) if given
],
args.platforms_dir,
emu_profiles,
target_cores_cache if args.target else None,
args.all,
)
data_registry = load_data_dir_registry(args.platforms_dir)
+14 -22
View File
@@ -65,7 +65,7 @@ from common import (
load_database,
load_emulator_profiles,
load_platform_config,
profile_blind_platforms,
without_profile_blind,
resolve_system_arg,
print_platform_listing,
select_systems,
@@ -3020,27 +3020,19 @@ def _main(held: contextlib.ExitStack) -> None:
# generate_pack refuses these on a platform whose cores no profile
# describes, and the report answers the same request the same way.
flags = [
flag for flag, given in (
("--region", requested_regions),
("--no-game-data", getattr(args, "no_game_data", False)),
) if given
]
if flags:
blind = profile_blind_platforms(
platforms, args.platforms_dir, emu_profiles,
target_cores_cache if args.target else None,
)
for name in blind:
message = (
f"{name} runs no core a profile describes, and "
f"{', '.join(flags)} reads the profiles"
)
if not args.all:
print(f"ERROR: {message}: drop {', '.join(flags)}", file=sys.stderr)
sys.exit(1)
print(f" {message}: left out")
platforms = [name for name in platforms if name not in blind]
platforms = without_profile_blind(
platforms,
[
flag for flag, given in (
("--region", requested_regions),
("--no-game-data", getattr(args, "no_game_data", False)),
) if given
],
args.platforms_dir,
emu_profiles,
target_cores_cache if args.target else None,
args.all,
)
# Group identical platforms (same function as generate_pack)
groups = group_identical_platforms(