Separate bootstrap settings from runtime overrides with a dedicated runtime settings manager
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user