63 lines
2.2 KiB
Python
63 lines
2.2 KiB
Python
"""Résolution du fichier de configuration externe éditable (dictionnaires.yml).
|
|
|
|
En frozen (PyInstaller), la config doit vivre À CÔTÉ de l'exécutable pour que
|
|
l'établissement puisse l'éditer sans recompiler ; on copie la version embarquée
|
|
au premier lancement si elle est absente. En développement, on pointe directement
|
|
la config du dépôt. Aligné sur le pattern V5
|
|
(``Pseudonymisation_Gui_V5._resolve_config``), best-effort (jamais de crash).
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import shutil
|
|
import sys
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
_CONFIG_RELATIVE = Path("config") / "dictionnaires.yml"
|
|
|
|
|
|
def _frozen() -> bool:
|
|
return bool(getattr(sys, "frozen", False))
|
|
|
|
|
|
def _bundled_config() -> Path:
|
|
"""Config embarquée : ``_MEIPASS`` en frozen, racine du dépôt en dev."""
|
|
if _frozen():
|
|
base = Path(getattr(sys, "_MEIPASS"))
|
|
else:
|
|
base = Path(__file__).resolve().parent.parent
|
|
return base / _CONFIG_RELATIVE
|
|
|
|
|
|
def resolve_user_config_path() -> Optional[Path]:
|
|
"""Chemin du ``dictionnaires.yml`` éditable par l'utilisateur.
|
|
|
|
- dev : la config du dépôt (éditable en place) ; on ne crée jamais le fichier
|
|
(contrairement à la V5) : si absent, on renvoie ``None`` (le moteur retombe
|
|
sur sa config par défaut) ;
|
|
- frozen : ``<dossier de l'exe>/config/dictionnaires.yml`` ; copie la version
|
|
embarquée au premier lancement si absente, sans jamais écraser une config
|
|
existante (perso établissement).
|
|
|
|
Renvoie ``None`` si rien n'est résoluble (le moteur retombe alors sur sa
|
|
config runtime par défaut).
|
|
"""
|
|
if not _frozen():
|
|
bundled = _bundled_config()
|
|
return bundled if bundled.exists() else None
|
|
|
|
user_cfg = Path(sys.executable).resolve().parent / _CONFIG_RELATIVE
|
|
if user_cfg.exists():
|
|
return user_cfg
|
|
try:
|
|
user_cfg.parent.mkdir(parents=True, exist_ok=True)
|
|
shutil.copyfile(_bundled_config(), user_cfg)
|
|
return user_cfg
|
|
except Exception as exc:
|
|
log.warning("copie de la configuration externe échouée (%s) : %s", user_cfg, exc)
|
|
bundled = _bundled_config()
|
|
return bundled if bundled.exists() else None
|