Chemins de sortie explicites, pour un déploiement hors de l'arbre des sources

Deux hypothèses du code ne tiennent plus dès qu'on l'installe ailleurs que
dans son dépôt :

- la racine était déduite de l'emplacement du module. Une installation non
  éditable la fait pointer vers site-packages, et le corpus de data/input/ est
  alors cherché à côté du venv, où il n'est pas. VEILLE_RACINE lève
  l'ambiguïté ; sans elle, le comportement d'avant est conservé.
- l'export JSON était figé sous data/, donc dans le répertoire d'installation.
  Sur YunoHost celui-ci est effacé à chaque mise à jour. VEILLE_DUMP_JSON le
  déplace avec la base et le cache.

Constaté en simulant l'installation, pas en relisant le code : VEILLE_DB était
honorée et VEILLE_DUMP_JSON ignorée, le dump repartant dans l'arbre des
sources.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Cyber Mawonaj
2026-07-25 23:21:26 -04:00
co-authored by Claude Opus 5
parent 6c6a8d9091
commit e27a4eca84
+20 -3
View File
@@ -11,8 +11,17 @@ from pathlib import Path
from dotenv import load_dotenv from dotenv import load_dotenv
# pipeline/chemins.py → pipeline/ → racine du dépôt # pipeline/chemins.py → pipeline/ → racine du dépôt.
RACINE = Path(__file__).resolve().parent.parent #
# Ce calcul suppose que le paquet est exécuté depuis l'arbre des sources, ce qui
# est le cas en développement. Une installation non éditable le met en défaut :
# `__file__` pointe alors vers site-packages, et le corpus de `data/input/` est
# cherché à côté du venv, où il n'est pas.
#
# `VEILLE_RACINE` lève l'ambiguïté. Les déploiements la renseignent ; sans elle,
# le comportement historique est conservé.
_RACINE_PAR_DEFAUT = Path(__file__).resolve().parent.parent
RACINE = Path(os.environ.get("VEILLE_RACINE") or _RACINE_PAR_DEFAUT).resolve()
load_dotenv(RACINE / ".env") load_dotenv(RACINE / ".env")
@@ -43,9 +52,17 @@ CHAPITRES = [chapitre(n) for n in range(11)]
DIMENSIONS = [dimension(n) for n in range(1, 13)] DIMENSIONS = [dimension(n) for n in range(1, 13)]
# ── Sorties ────────────────────────────────────────────────────────────────── # ── Sorties ──────────────────────────────────────────────────────────────────
#
# Les trois chemins de sortie sont configurables par variable d'environnement,
# et acceptent une valeur absolue — `Path("/a") / "/b"` vaut `/b`.
#
# Ce n'est pas de la souplesse gratuite : sur un déploiement YunoHost, la mise
# à jour efface intégralement le répertoire d'installation (`ynh_setup_source
# --full_replace`). Tout ce qui doit survivre — base, cache, export — vit donc
# ailleurs, dans le répertoire de données persistant de l'application.
DONNEES = RACINE / "data" DONNEES = RACINE / "data"
BASE_SQLITE = RACINE / os.environ.get("VEILLE_DB", "data/veille.db") BASE_SQLITE = RACINE / os.environ.get("VEILLE_DB", "data/veille.db")
DUMP_JSON = DONNEES / "textes.json" DUMP_JSON = RACINE / os.environ.get("VEILLE_DUMP_JSON", "data/textes.json")
CACHE_HTTP = RACINE / os.environ.get("VEILLE_CACHE", "data/cache_http") CACHE_HTTP = RACINE / os.environ.get("VEILLE_CACHE", "data/cache_http")
MIGRATIONS = Path(__file__).resolve().parent / "migrations" MIGRATIONS = Path(__file__).resolve().parent / "migrations"