From 537f814d4aa00d3abac58d3822550a0d2ef1f1e9 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Fri, 6 Nov 2026 15:23:13 +0100 Subject: [PATCH] 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. --- scripts/common.py | 26 ++++++++++++++++---- scripts/generate_pack.py | 53 +++++++++++----------------------------- scripts/verify.py | 36 +++++++++++---------------- 3 files changed, 49 insertions(+), 66 deletions(-) diff --git a/scripts/common.py b/scripts/common.py index 920079775..3031a8b6a 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -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( diff --git a/scripts/generate_pack.py b/scripts/generate_pack.py index ebb3b68f9..153c60b5e 100644 --- a/scripts/generate_pack.py +++ b/scripts/generate_pack.py @@ -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) diff --git a/scripts/verify.py b/scripts/verify.py index 01c29717b..8813ac99f 100644 --- a/scripts/verify.py +++ b/scripts/verify.py @@ -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(