Понятное сообщение при сломанном config.toml

Дублированный раздел ронял обновление трассировкой tomllib. Теперь
ConfigError объясняет по-русски, что раздел объявлен дважды и какие
разделы должны встречаться ровно один раз.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-08-16 01:53:56 +05:00
co-authored by Claude Opus 5
parent 2f2df7d390
commit 4f6897855a
3 changed files with 54 additions and 4 deletions
+18 -2
View File
@@ -10,7 +10,11 @@ import tomllib
from dataclasses import dataclass, field
from pathlib import Path
__all__ = ["Settings", "load_settings", "BASE_DIR"]
__all__ = ["Settings", "load_settings", "BASE_DIR", "ConfigError"]
class ConfigError(RuntimeError):
"""Настройки прочитать не удалось. Текст рассчитан на чтение человеком."""
# Корень пакета: при запуске из ZIP это папка, куда его распаковали.
BASE_DIR = Path(os.environ.get("TALKSCORE_ASR_HOME") or Path(__file__).resolve().parent.parent)
@@ -144,7 +148,19 @@ def load_settings(config_path: Path | None = None) -> Settings:
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(_DEFAULT_CONFIG.format(token=secrets.token_urlsafe(32)), encoding="utf-8")
data = tomllib.loads(path.read_text(encoding="utf-8"))
try:
data = tomllib.loads(path.read_text(encoding="utf-8"))
except tomllib.TOMLDecodeError as exc:
# Самая частая причина - раздел объявлен дважды: настройки дописывали
# блоками, и рядом со старым [security] появился второй.
raise ConfigError(
f"не удалось прочитать {path}\n"
f" {exc}\n\n"
" Скорее всего, один и тот же раздел объявлен дважды.\n"
" Каждый раздел ([server], [security], [processing], [webhook], [update])\n"
" должен встречаться в файле ровно один раз, а все его настройки -\n"
" идти внутри него одним блоком."
) from exc
server = data.get("server", {})
security = data.get("security", {})
proc = data.get("processing", {})