From 7016e5afbf0d72f3e13b5675a7cf8852ce984d72 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sat, 8 Nov 2025 02:36:28 -0600 Subject: [PATCH] Yaml errors no longer fail silently --- source/classes/CustomSettings.py | 14 +++++--- source/gui/bottom.py | 55 +++++++++++++++++--------------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index 80b23e0d..af34f007 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -577,9 +577,13 @@ class CustomSettings(object): def load_yaml(path): - if os.path.exists(Path(path)): - with open(path, "r", encoding="utf-8") as f: - return yaml.load(f, Loader=yaml.SafeLoader) - elif urllib.parse.urlparse(path).scheme in ['http', 'https']: - return yaml.load(urllib.request.urlopen(path), Loader=yaml.FullLoader) + try: + if os.path.exists(Path(path)): + with open(path, "r", encoding="utf-8") as f: + return yaml.load(f, Loader=yaml.SafeLoader) + elif urllib.parse.urlparse(path).scheme in ['http', 'https']: + return yaml.load(urllib.request.urlopen(path), Loader=yaml.FullLoader) + except yaml.YAMLError as e: + error_msg = f"Error parsing YAML file '{path}':\n{str(e)}" + raise ValueError(error_msg) from e diff --git a/source/gui/bottom.py b/source/gui/bottom.py index 7faf3402..e25c2b2f 100644 --- a/source/gui/bottom.py +++ b/source/gui/bottom.py @@ -77,32 +77,37 @@ def bottom_frame(self, parent, args=None): argsDump['sprite'] = argsDump['sprite'].name save_settings(parent, argsDump, "last.json") - guiargs = create_guiargs(parent) - # get default values for missing parameters - cliargs = ['--multi', str(guiargs.multi)] - if hasattr(guiargs, 'customizer'): - cliargs.extend(['--customizer', str(guiargs.customizer)]) - for k,v in vars(parse_cli(cliargs)).items(): - if k not in vars(guiargs): - setattr(guiargs, k, v) - elif type(v) is dict: # use same settings for every player - players = guiargs.multi if len(v) == 0 else len(v) - setattr(guiargs, k, {player: getattr(guiargs, k) for player in range(1, players + 1)}) - argsDump = vars(guiargs) - - needEnemizer = False - falsey = ["none", "default", False, 0] - for enemizerOption in ["shuffleenemies", "enemy_damage", "shufflebosses", "enemy_health"]: - if enemizerOption in argsDump: - if isinstance(argsDump[enemizerOption], dict): - for playerID,playerSetting in argsDump[enemizerOption].items(): - if not playerSetting in falsey: - needEnemizer = True - elif not argsDump[enemizerOption] in falsey: - needEnemizer = True - seeds = [] - try: + guiargs = create_guiargs(parent) + # get default values for missing parameters + cliargs = ['--multi', str(guiargs.multi)] + if hasattr(guiargs, 'customizer'): + cliargs.extend(['--customizer', str(guiargs.customizer)]) + + for k,v in vars(parse_cli(cliargs)).items(): + if k not in vars(guiargs): + setattr(guiargs, k, v) + elif type(v) is dict: # use same settings for every player + players = guiargs.multi if len(v) == 0 else len(v) + setattr(guiargs, k, {player: getattr(guiargs, k) for player in range(1, players + 1)}) + if guiargs.multi == 1 and guiargs.names.endswith("=="): + # allow settings code thru player names entry + guiargs.code[1] = guiargs.names + guiargs.names = "" + argsDump = vars(guiargs) + + needEnemizer = False + falsey = ["none", "default", False, 0] + for enemizerOption in ["shuffleenemies", "enemy_damage", "shufflebosses", "enemy_health"]: + if enemizerOption in argsDump: + if isinstance(argsDump[enemizerOption], dict): + for playerID,playerSetting in argsDump[enemizerOption].items(): + if not playerSetting in falsey: + needEnemizer = True + elif not argsDump[enemizerOption] in falsey: + needEnemizer = True + seeds = [] + if guiargs.count is not None and guiargs.seed: seed = guiargs.seed for _ in range(guiargs.count):