Skip to content

Stratégie d'imports - Projet LMELP

Vue d'ensemble

Le projet LMELP utilise différentes stratégies d'imports selon le contexte, optimisées pour chaque usage.

Stratégies par contexte

📁 nbs/ - Modules principaux

Pattern : Imports directs (même dossier)

# ✅ Dans nbs/mongo.py
from config import get_DB_VARS

Justification : Modules dans le même dossier, imports simples et directs.

📁 scripts/ - Scripts utilitaires

Pattern : Ajout explicite au sys.path

# ✅ Dans scripts/*.py
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../nbs")))
from config import get_RSS_URL

Justification : Scripts ponctuels exécutés depuis différents endroits, besoin de chemin absolu.

📁 ui/ - Interface Streamlit

Pattern : Fonction centralisée add_to_sys_path()

# ✅ Dans ui/pages/*.py  
from ui_tools import add_to_sys_path
add_to_sys_path()
from mongo_episode import Episodes

Justification : Apps Streamlit avec logique réutilisable, fonction centralisée dans ui_tools.py.

📁 tests/ - Tests unitaires

Pattern : Imports explicites avec chemin complet

# ✅ Dans tests/unit/*.py
from nbs.config import get_RSS_URL
from nbs.mongo import get_collection

Justification : Isolation maximale, traçabilité claire, pas de modification sys.path.

Avantages de cette approche

Contexte Avantage
nbs/ Simple, pas de configuration
scripts/ Portable, fonctionne de partout
ui/ Centralisé, facile à maintenir
tests/ Isolé, explicite, pas d'effets de bord

Convention de nommage des tests

tests/unit/test_config.py     ← teste nbs/config.py
tests/unit/test_mongo.py      ← teste nbs/mongo.py  
tests/unit/test_llm.py        ← teste nbs/llm.py

Pattern : test_<module>.py teste nbs/<module>.py

Exemples concrets

Import dans un test

# tests/unit/test_config.py
from nbs.config import get_RSS_URL  # ✅ Explicite et clair

def test_get_RSS_URL_with_env_var():
    # Test code...

Import dans un script

# scripts/get_transcription.py
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../nbs")))
from config import get_RSS_URL  # ✅ Après modification sys.path

Import dans Streamlit

# ui/pages/episodes.py
from ui_tools import add_to_sys_path
add_to_sys_path()
from mongo_episode import Episodes  # ✅ Après add_to_sys_path()

Modules nbdev et tests

Les modules générés par nbdev (dans le dossier nbs/) utilisent des imports non relatifs (ex : from mongo import BaseEntity). Pour garantir leur fonctionnement dans les tests et scripts, il faut que le dossier nbs/ soit inclus dans le PYTHONPATH.

Configuration automatique pour les tests

Le fichier tests/conftest.py ajoute automatiquement le dossier nbs/ au PYTHONPATH pour tous les tests :

import sys
import os
nbs_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'nbs'))
if nbs_path not in sys.path:
    sys.path.insert(0, nbs_path)

Bonnes pratiques

  • Ne pas modifier les imports dans les fichiers générés par nbdev.
  • Centraliser la gestion du PYTHONPATH dans la config de test (conftest.py).
  • Pour exécuter les tests manuellement : PYTHONPATH=nbs pytest ...

Références

Évolutions futures

Si le projet grandit, considérer : - Package Python installable : pip install -e . pour développement - Imports absolus partout : from lmelp.config import get_RSS_URL - Structure package standard : src/lmelp/ layout

Pour l'instant, le status quo fonctionne bien et respecte les contraintes de chaque contexte.