Generate: improve logging capture (#3484)
This commit is contained in:
		
							parent
							
								
									76804d295b
								
							
						
					
					
						commit
						c478e55d7a
					
				
							
								
								
									
										38
									
								
								Generate.py
								
								
								
								
							
							
						
						
									
										38
									
								
								Generate.py
								
								
								
								
							| 
						 | 
					@ -1,10 +1,12 @@
 | 
				
			||||||
from __future__ import annotations
 | 
					from __future__ import annotations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import argparse
 | 
					import argparse
 | 
				
			||||||
 | 
					import copy
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import random
 | 
					import random
 | 
				
			||||||
import string
 | 
					import string
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
import urllib.parse
 | 
					import urllib.parse
 | 
				
			||||||
import urllib.request
 | 
					import urllib.request
 | 
				
			||||||
from collections import Counter
 | 
					from collections import Counter
 | 
				
			||||||
| 
						 | 
					@ -15,21 +17,16 @@ import ModuleUpdate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ModuleUpdate.update()
 | 
					ModuleUpdate.update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import copy
 | 
					 | 
				
			||||||
import Utils
 | 
					import Utils
 | 
				
			||||||
import Options
 | 
					import Options
 | 
				
			||||||
from BaseClasses import seeddigits, get_seed, PlandoOptions
 | 
					from BaseClasses import seeddigits, get_seed, PlandoOptions
 | 
				
			||||||
from Main import main as ERmain
 | 
					 | 
				
			||||||
from settings import get_settings
 | 
					 | 
				
			||||||
from Utils import parse_yamls, version_tuple, __version__, tuplize_version
 | 
					from Utils import parse_yamls, version_tuple, __version__, tuplize_version
 | 
				
			||||||
from worlds.alttp.EntranceRandomizer import parse_arguments
 | 
					 | 
				
			||||||
from worlds.AutoWorld import AutoWorldRegister
 | 
					 | 
				
			||||||
from worlds import failed_world_loads
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def mystery_argparse():
 | 
					def mystery_argparse():
 | 
				
			||||||
    options = get_settings()
 | 
					    from settings import get_settings
 | 
				
			||||||
    defaults = options.generator
 | 
					    settings = get_settings()
 | 
				
			||||||
 | 
					    defaults = settings.generator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    parser = argparse.ArgumentParser(description="CMD Generation Interface, defaults come from host.yaml.")
 | 
					    parser = argparse.ArgumentParser(description="CMD Generation Interface, defaults come from host.yaml.")
 | 
				
			||||||
    parser.add_argument('--weights_file_path', default=defaults.weights_file_path,
 | 
					    parser.add_argument('--weights_file_path', default=defaults.weights_file_path,
 | 
				
			||||||
| 
						 | 
					@ -41,7 +38,7 @@ def mystery_argparse():
 | 
				
			||||||
    parser.add_argument('--seed', help='Define seed number to generate.', type=int)
 | 
					    parser.add_argument('--seed', help='Define seed number to generate.', type=int)
 | 
				
			||||||
    parser.add_argument('--multi', default=defaults.players, type=lambda value: max(int(value), 1))
 | 
					    parser.add_argument('--multi', default=defaults.players, type=lambda value: max(int(value), 1))
 | 
				
			||||||
    parser.add_argument('--spoiler', type=int, default=defaults.spoiler)
 | 
					    parser.add_argument('--spoiler', type=int, default=defaults.spoiler)
 | 
				
			||||||
    parser.add_argument('--outputpath', default=options.general_options.output_path,
 | 
					    parser.add_argument('--outputpath', default=settings.general_options.output_path,
 | 
				
			||||||
                        help="Path to output folder. Absolute or relative to cwd.")  # absolute or relative to cwd
 | 
					                        help="Path to output folder. Absolute or relative to cwd.")  # absolute or relative to cwd
 | 
				
			||||||
    parser.add_argument('--race', action='store_true', default=defaults.race)
 | 
					    parser.add_argument('--race', action='store_true', default=defaults.race)
 | 
				
			||||||
    parser.add_argument('--meta_file_path', default=defaults.meta_file_path)
 | 
					    parser.add_argument('--meta_file_path', default=defaults.meta_file_path)
 | 
				
			||||||
| 
						 | 
					@ -61,20 +58,21 @@ def mystery_argparse():
 | 
				
			||||||
    if not os.path.isabs(args.meta_file_path):
 | 
					    if not os.path.isabs(args.meta_file_path):
 | 
				
			||||||
        args.meta_file_path = os.path.join(args.player_files_path, args.meta_file_path)
 | 
					        args.meta_file_path = os.path.join(args.player_files_path, args.meta_file_path)
 | 
				
			||||||
    args.plando: PlandoOptions = PlandoOptions.from_option_string(args.plando)
 | 
					    args.plando: PlandoOptions = PlandoOptions.from_option_string(args.plando)
 | 
				
			||||||
    return args, options
 | 
					    return args
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_seed_name(random_source) -> str:
 | 
					def get_seed_name(random_source) -> str:
 | 
				
			||||||
    return f"{random_source.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits)
 | 
					    return f"{random_source.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main(args=None, callback=ERmain):
 | 
					def main(args=None):
 | 
				
			||||||
    if not args:
 | 
					    if not args:
 | 
				
			||||||
        args, options = mystery_argparse()
 | 
					        args = mystery_argparse()
 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        options = get_settings()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    seed = get_seed(args.seed)
 | 
					    seed = get_seed(args.seed)
 | 
				
			||||||
 | 
					    # __name__ == "__main__" check so unittests that already imported worlds don't trip this.
 | 
				
			||||||
 | 
					    if __name__ == "__main__" and "worlds" in sys.modules:
 | 
				
			||||||
 | 
					        raise Exception("Worlds system should not be loaded before logging init.")
 | 
				
			||||||
    Utils.init_logging(f"Generate_{seed}", loglevel=args.log_level)
 | 
					    Utils.init_logging(f"Generate_{seed}", loglevel=args.log_level)
 | 
				
			||||||
    random.seed(seed)
 | 
					    random.seed(seed)
 | 
				
			||||||
    seed_name = get_seed_name(random)
 | 
					    seed_name = get_seed_name(random)
 | 
				
			||||||
| 
						 | 
					@ -143,6 +141,9 @@ def main(args=None, callback=ERmain):
 | 
				
			||||||
        raise Exception(f"No weights found. "
 | 
					        raise Exception(f"No weights found. "
 | 
				
			||||||
                        f"Provide a general weights file ({args.weights_file_path}) or individual player files. "
 | 
					                        f"Provide a general weights file ({args.weights_file_path}) or individual player files. "
 | 
				
			||||||
                        f"A mix is also permitted.")
 | 
					                        f"A mix is also permitted.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    from worlds.AutoWorld import AutoWorldRegister
 | 
				
			||||||
 | 
					    from worlds.alttp.EntranceRandomizer import parse_arguments
 | 
				
			||||||
    erargs = parse_arguments(['--multi', str(args.multi)])
 | 
					    erargs = parse_arguments(['--multi', str(args.multi)])
 | 
				
			||||||
    erargs.seed = seed
 | 
					    erargs.seed = seed
 | 
				
			||||||
    erargs.plando_options = args.plando
 | 
					    erargs.plando_options = args.plando
 | 
				
			||||||
| 
						 | 
					@ -234,7 +235,8 @@ def main(args=None, callback=ERmain):
 | 
				
			||||||
        with open(os.path.join(args.outputpath if args.outputpath else ".", f"generate_{seed_name}.yaml"), "wt") as f:
 | 
					        with open(os.path.join(args.outputpath if args.outputpath else ".", f"generate_{seed_name}.yaml"), "wt") as f:
 | 
				
			||||||
            yaml.dump(important, f)
 | 
					            yaml.dump(important, f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return callback(erargs, seed)
 | 
					    from Main import main as ERmain
 | 
				
			||||||
 | 
					    return ERmain(erargs, seed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def read_weights_yamls(path) -> Tuple[Any, ...]:
 | 
					def read_weights_yamls(path) -> Tuple[Any, ...]:
 | 
				
			||||||
| 
						 | 
					@ -359,6 +361,8 @@ def update_weights(weights: dict, new_weights: dict, update_type: str, name: str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def roll_meta_option(option_key, game: str, category_dict: Dict) -> Any:
 | 
					def roll_meta_option(option_key, game: str, category_dict: Dict) -> Any:
 | 
				
			||||||
 | 
					    from worlds import AutoWorldRegister
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not game:
 | 
					    if not game:
 | 
				
			||||||
        return get_choice(option_key, category_dict)
 | 
					        return get_choice(option_key, category_dict)
 | 
				
			||||||
    if game in AutoWorldRegister.world_types:
 | 
					    if game in AutoWorldRegister.world_types:
 | 
				
			||||||
| 
						 | 
					@ -436,10 +440,13 @@ def handle_option(ret: argparse.Namespace, game_weights: dict, option_key: str,
 | 
				
			||||||
    except Exception as e:
 | 
					    except Exception as e:
 | 
				
			||||||
        raise Options.OptionError(f"Error generating option {option_key} in {ret.game}") from e
 | 
					        raise Options.OptionError(f"Error generating option {option_key} in {ret.game}") from e
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
 | 
					        from worlds import AutoWorldRegister
 | 
				
			||||||
        player_option.verify(AutoWorldRegister.world_types[ret.game], ret.name, plando_options)
 | 
					        player_option.verify(AutoWorldRegister.world_types[ret.game], ret.name, plando_options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.bosses):
 | 
					def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.bosses):
 | 
				
			||||||
 | 
					    from worlds import AutoWorldRegister
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if "linked_options" in weights:
 | 
					    if "linked_options" in weights:
 | 
				
			||||||
        weights = roll_linked_options(weights)
 | 
					        weights = roll_linked_options(weights)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -466,6 +473,7 @@ def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret.game = get_choice("game", weights)
 | 
					    ret.game = get_choice("game", weights)
 | 
				
			||||||
    if ret.game not in AutoWorldRegister.world_types:
 | 
					    if ret.game not in AutoWorldRegister.world_types:
 | 
				
			||||||
 | 
					        from worlds import failed_world_loads
 | 
				
			||||||
        picks = Utils.get_fuzzy_results(ret.game, list(AutoWorldRegister.world_types) + failed_world_loads, limit=1)[0]
 | 
					        picks = Utils.get_fuzzy_results(ret.game, list(AutoWorldRegister.world_types) + failed_world_loads, limit=1)[0]
 | 
				
			||||||
        if picks[0] in failed_world_loads:
 | 
					        if picks[0] in failed_world_loads:
 | 
				
			||||||
            raise Exception(f"No functional world found to handle game {ret.game}. "
 | 
					            raise Exception(f"No functional world found to handle game {ret.game}. "
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								Utils.py
								
								
								
								
							
							
						
						
									
										1
									
								
								Utils.py
								
								
								
								
							| 
						 | 
					@ -553,6 +553,7 @@ def init_logging(name: str, loglevel: typing.Union[str, int] = logging.INFO, wri
 | 
				
			||||||
        f"Archipelago ({__version__}) logging initialized"
 | 
					        f"Archipelago ({__version__}) logging initialized"
 | 
				
			||||||
        f" on {platform.platform()}"
 | 
					        f" on {platform.platform()}"
 | 
				
			||||||
        f" running Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"
 | 
					        f" running Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"
 | 
				
			||||||
 | 
					        f"{' (frozen)' if is_frozen() else ''}"
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue