Load settings from config hierarchy + defaults. Merge order: DEFAULT_SETTINGS < global config "settings" < project < local < extra_overrides.
(
*,
config_manager: ConfigManager | None = None,
cwd: str | Path | None = None,
extra_overrides: dict[str, Any] | None = None,
)
| 23 | |
| 24 | |
| 25 | def load_settings( |
| 26 | *, |
| 27 | config_manager: ConfigManager | None = None, |
| 28 | cwd: str | Path | None = None, |
| 29 | extra_overrides: dict[str, Any] | None = None, |
| 30 | ) -> SettingsSchema: |
| 31 | """Load settings from config hierarchy + defaults. |
| 32 | |
| 33 | Merge order: DEFAULT_SETTINGS < global config "settings" < project < local < extra_overrides. |
| 34 | """ |
| 35 | if config_manager is None: |
| 36 | config_manager = ConfigManager(cwd=cwd) |
| 37 | |
| 38 | base = dataclasses.asdict(DEFAULT_SETTINGS) |
| 39 | |
| 40 | # Pull "settings" sub-key from each config level |
| 41 | global_settings = config_manager.load_global().get("settings", {}) |
| 42 | project_settings = config_manager.load_project().get("settings", {}) |
| 43 | local_settings = config_manager.load_local().get("settings", {}) |
| 44 | |
| 45 | merged = base |
| 46 | if global_settings: |
| 47 | merged = _deep_merge(merged, global_settings) |
| 48 | if project_settings: |
| 49 | merged = _deep_merge(merged, project_settings) |
| 50 | if local_settings: |
| 51 | merged = _deep_merge(merged, local_settings) |
| 52 | if extra_overrides: |
| 53 | merged = _deep_merge(merged, extra_overrides) |
| 54 | |
| 55 | return SettingsSchema.from_dict(merged) |
| 56 | |
| 57 | |
| 58 | def get_settings( |