|
1 | 1 | import base64 |
2 | 2 | import os |
3 | 3 | from pathlib import Path |
4 | | -from typing import Final |
| 4 | +from typing import Any, Final, cast |
5 | 5 |
|
6 | 6 | import yaml |
7 | 7 | from dotenv import load_dotenv |
@@ -38,14 +38,18 @@ def convert_dict_str_to_int(original_dict: dict[str, int]) -> dict[int, int]: |
38 | 38 | config = yaml.safe_load(config_file.read_text()) |
39 | 39 | config_example = yaml.safe_load(config_file_example.read_text()) |
40 | 40 |
|
41 | | -missing_keys = set(config_example.keys()) - set(config.keys()) |
42 | | -if missing_keys: |
43 | | - logger.warning(f"The config file is missing the following keys: {', '.join(missing_keys)}. ") |
44 | | - logger.warning( |
45 | | - "This has been automatically fixed by adding the missing keys with their default values TO THE LOADED CONFIG.", |
46 | | - ) |
47 | | - for key in missing_keys: |
48 | | - config[key] = config_example[key] |
| 41 | + |
| 42 | +# Recursively merge defaults into user config (fills nested missing keys too) |
| 43 | +def merge_defaults(user: dict[str, Any], default: dict[str, Any]) -> None: |
| 44 | + for key, default_val in default.items(): |
| 45 | + if key not in user: |
| 46 | + user[key] = default_val |
| 47 | + logger.warning(f"Added missing config key: {key}") |
| 48 | + elif isinstance(default_val, dict) and isinstance(user.get(key), dict): |
| 49 | + merge_defaults(user[key], cast(dict[str, Any], default_val)) |
| 50 | + |
| 51 | + |
| 52 | +merge_defaults(config, config_example) |
49 | 53 |
|
50 | 54 |
|
51 | 55 | class Config: |
|
0 commit comments