""" App-wide settings: persists to ~/.dbclient/settings.json """ import json import os from pathlib import Path APP_DIR = Path.home() / ".dbclient" SETTINGS_FILE = APP_DIR / "settings.json" DEFAULTS = { "theme": "dark", "font_family": "Consolas", "font_size": 13, "result_page_size": 1000, "query_timeout": 60, "auto_commit": True, "show_row_numbers": True, "word_wrap": False, "max_history": 500, } class Settings: """Thin wrapper around a JSON settings file.""" def __init__(self): self._data: dict = {} self._load() def _load(self) -> None: APP_DIR.mkdir(parents=True, exist_ok=True) if SETTINGS_FILE.exists(): try: with open(SETTINGS_FILE, "r", encoding="utf-8") as f: self._data = json.load(f) except Exception: self._data = {} # Fill in missing defaults for k, v in DEFAULTS.items(): self._data.setdefault(k, v) def save(self) -> None: APP_DIR.mkdir(parents=True, exist_ok=True) with open(SETTINGS_FILE, "w", encoding="utf-8") as f: json.dump(self._data, f, indent=2) def get(self, key: str, fallback=None): return self._data.get(key, DEFAULTS.get(key, fallback)) def set(self, key: str, value) -> None: self._data[key] = value def __getitem__(self, key): return self.get(key) def __setitem__(self, key, value): self.set(key, value) # Singleton _settings: Settings | None = None def get_settings() -> Settings: global _settings if _settings is None: _settings = Settings() return _settings