Separate bootstrap settings from runtime overrides with a dedicated runtime settings manager

This commit is contained in:
2026-04-10 19:31:51 +02:00
parent 9b4cd17e3b
commit 3b6e39ddad
11 changed files with 61 additions and 32 deletions

View File

@@ -29,6 +29,7 @@ _RUNTIME_ATTRIBUTES: frozenset[str] = frozenset(
"server_status",
"pending_recovery",
"last_activation",
"runtime_settings",
}
)
@@ -41,6 +42,7 @@ class RuntimeState:
server_status: ServerStatus = field(default_factory=lambda: ServerStatus(online=False))
pending_recovery: PendingRecovery | None = None
last_activation: ActivationRecord | None = None
runtime_settings: "Settings" | None = None
class ApplicationState(State):
@@ -87,17 +89,32 @@ def get_runtime_state(app: Any) -> RuntimeState:
def get_app_settings(app: Any) -> Settings:
"""Return the current immutable settings from application state."""
"""Return the bootstrap settings loaded at startup."""
settings = getattr(app.state, "settings", None)
if settings is None:
raise AttributeError("Application settings are not available on the app state.")
return settings
def get_effective_settings(app: Any) -> Settings:
"""Return the effective settings for the current application instance."""
runtime_settings = getattr(app.state, "runtime_settings", None)
if runtime_settings is not None:
return runtime_settings
return get_app_settings(app)
def set_runtime_settings(app: Any, settings: Settings) -> None:
"""Store the resolved runtime settings separately from bootstrap config."""
runtime_state = get_runtime_state(app)
runtime_state.runtime_settings = settings
def update_app_settings(app: Any, **overrides: Any) -> None:
"""Update the current application settings immutably."""
"""Update the current effective settings immutably."""
settings = get_app_settings(app)
app.state.settings = settings.model_copy(update=overrides)
updated = settings.model_copy(update=overrides)
set_runtime_settings(app, updated)
def record_activation(app: Any, jail_name: str, at: datetime.datetime | None = None) -> datetime.datetime: