/
broot
/
flowee
Обзор
Документация
Войти
/
broot
/
flowee
Код
Пакеты
0
Релизы
2
Аналитика
Безопасность
dev
core/config.py
101 строка
4 KB
broot
Update TODO: mark completed core tasks; normalize dashes across docs and core modules
29 июн 2026, 20:50
29 июн 2026, 20:50
674ff17
Код
Авторство
О чём код?
""" config.py - Загрузка, сохранение и миграция конфигурации Flowee. Формат: JSON-файл config.json в корне проекта. """ import json import os import sys # Текущая версия структуры конфига (увеличивается при изменении набора ключей) LATEST_CONFIG_VERSION = 1 # Значения по умолчанию для всех полей DEFAULTS = { "config_version": LATEST_CONFIG_VERSION, "window_size": "800,600", "window_position": "100,100", "log_level": "INFO", "db_path": "worklog.db", "enable_checked": False, "theme": "dark", "save_interval": 60 } def _get_config_path() -> str: """Возвращает полный путь к config.json (рядом с исполняемым файлом).""" # При запуске из exe (PyInstaller) sys.executable указывает на exe, # иначе - на интерпретатор Python. if getattr(sys, "frozen", False): base_dir = os.path.dirname(sys.executable) else: base_dir = os.path.dirname(os.path.abspath(__file__)) # Если config.py лежит в core/, то поднимаемся на уровень выше (корень проекта) base_dir = os.path.dirname(base_dir) return os.path.join(base_dir, "config.json") def load_config() -> dict: """ Загружает конфигурацию из файла. Если файл отсутствует или повреждён - создаёт новый с параметрами по умолчанию. Применяет миграции, если config_version устарел. """ path = _get_config_path() config = None if os.path.exists(path): try: with open(path, "r", encoding="utf-8") as f: config = json.load(f) except (json.JSONDecodeError, IOError): # Файл повреждён - перезапишем значениями по умолчанию config = None if config is None: config = DEFAULTS.copy() save_config(config) return config # Миграция: добавляем отсутствующие ключи и обновляем версию migrated = _migrate_config(config) if migrated: save_config(config) return config def save_config(config: dict): """Сохраняет конфигурацию в файл.""" path = _get_config_path() with open(path, "w", encoding="utf-8") as f: json.dump(config, f, indent=2, ensure_ascii=False) def _migrate_config(config: dict) -> bool: """ Проверяет config_version и добавляет недостающие ключи из DEFAULTS. Возвращает True, если были изменения. """ current = config.get("config_version", 0) changed = False # Добавляем все ключи, которых нет в текущем конфиге for key, default_value in DEFAULTS.items(): if key not in config: config[key] = default_value changed = True # Обновляем версию до актуальной if current < LATEST_CONFIG_VERSION: config["config_version"] = LATEST_CONFIG_VERSION changed = True # Здесь в будущем можно добавить миграции конкретных полей: # if current < 2: # config["new_field"] = "default_value" # ... return changed