d7a58e52fd
lint / lint (push) Successful in 54s
test / integration-docker (pull_request) Successful in 38s
test / unit (pull_request) Successful in 45s
test / integration-firecracker (pull_request) Successful in 3m31s
test / coverage (pull_request) Successful in 18s
test / publish-infra (pull_request) Has been skipped
tracker-policy-pr / check-pr (pull_request) Failing after 6s
Move the DbStore base (db_store), the shared schema-migration base (migrations / TableMigrations), the concrete stores (audit_store, config_store, queue_store), and StoreManager out of the package root into a bot_bottle/store/ package, so persistence lives in one place rather than scattered across the root. Callers use direct submodule imports (from bot_bottle.store.store_manager import StoreManager). Inside the moved modules the relative imports point back up to their non-store siblings (..paths, ..supervise_types) while co-moved siblings stay package-local; the flat-import fallbacks are untouched. The orchestrator's own stores (config_store, secret_store, registry) stay in orchestrator/ and repoint to the moved DbStore / TableMigrations. No behavior change; full unit suite green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
"""SQLite-backed bot-bottle configuration store."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
try:
|
|
from .db_store import DbStore
|
|
from .migrations import TableMigrations
|
|
from ..paths import host_db_path
|
|
except ImportError:
|
|
from db_store import DbStore # type: ignore[import-not-found] # pylint: disable=import-error,no-name-in-module
|
|
from migrations import TableMigrations # type: ignore[import-not-found] # pylint: disable=import-error,no-name-in-module
|
|
from paths import host_db_path # type: ignore[import-not-found] # pylint: disable=import-error,no-name-in-module
|
|
|
|
|
|
DEFAULT_CACHED_IMAGE_STALE_WARNING_DAYS = 1
|
|
|
|
|
|
class ConfigStore(DbStore):
|
|
"""SQLite configuration for host-side bot-bottle settings."""
|
|
|
|
def __init__(self, db_path: Path | None = None) -> None:
|
|
migrations = TableMigrations("config_store", [
|
|
# v1 — host-side bot-bottle settings
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS bot_bottle_config (
|
|
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
cached_image_stale_warning_days INTEGER NOT NULL DEFAULT 1
|
|
)
|
|
""",
|
|
])
|
|
super().__init__(db_path or host_db_path(), migrations)
|
|
|
|
def cached_image_stale_warning_days(self) -> int:
|
|
if not self.db_path.is_file():
|
|
return DEFAULT_CACHED_IMAGE_STALE_WARNING_DAYS
|
|
with self._connect() as conn:
|
|
row = conn.execute(
|
|
"""
|
|
SELECT cached_image_stale_warning_days
|
|
FROM bot_bottle_config
|
|
WHERE id = 1
|
|
""",
|
|
).fetchone()
|
|
if row is None:
|
|
return DEFAULT_CACHED_IMAGE_STALE_WARNING_DAYS
|
|
try:
|
|
return int(row["cached_image_stale_warning_days"])
|
|
except (TypeError, ValueError):
|
|
return DEFAULT_CACHED_IMAGE_STALE_WARNING_DAYS
|
|
|
|
def set_cached_image_stale_warning_days(self, days: int) -> Path:
|
|
with self._connect() as conn:
|
|
conn.execute(
|
|
"""
|
|
INSERT INTO bot_bottle_config (id, cached_image_stale_warning_days)
|
|
VALUES (1, ?)
|
|
ON CONFLICT(id) DO UPDATE SET
|
|
cached_image_stale_warning_days = excluded.cached_image_stale_warning_days
|
|
""",
|
|
(days,),
|
|
)
|
|
self._chmod()
|
|
return self.db_path
|
|
|
|
|
|
__all__ = [
|
|
"DEFAULT_CACHED_IMAGE_STALE_WARNING_DAYS",
|
|
"ConfigStore",
|
|
]
|