-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Objectif
Implémenter un mode "watch" qui garde Python chargé et les fixtures SESSION vivantes entre les runs, éliminant le temps de démarrage Python à chaque modification de fichier.
Valeur clé : Zero Startup Time - l'utilisateur sauvegarde, les tests tournent en ~10ms au lieu de 1-2s.
Contexte
pytest est conçu comme un script "One-Shot" : il démarre, exécute, meurt. Pour faire du watch avec pytest (pytest-watch), chaque sauvegarde relance un nouveau processus Python → réimporte tout → reconnecte la DB → lance le test. Résultat : 1-2s de latence même pour un petit test.
ProTest, grâce à son EventBus et sa boucle asyncio, peut fonctionner comme un serveur. Il reste en mémoire, les fixtures SESSION (DB, HTTP client) restent vivantes, et on ne relance que les fonctions de test.
Décisions d'Architecture
| Aspect | Décision |
|---|---|
| Rechargement | Targeted Module Invalidation (del sys.modules[name]) |
| Granularité | Re-run TOUS les tests (MVP, pas de smart mapping) |
| Fixtures SESSION | Teardown + recréer si leur fichier source change |
| Erreurs syntaxe | Afficher l'erreur, attendre la prochaine modif |
Structure Proposée
protest/watch/
├── __init__.py
├── runner.py # WatchRunner - orchestrateur principal
├── watcher.py # FileWatcher - détection async des changements (watchfiles)
├── reloader.py # ModuleReloader - invalidation sys.modules
└── interrupt.py # WatchInterruptHandler - gestion Ctrl+C simplifiée
CLI
protest run demo:session --watch
protest run demo:session -w --watch-paths ./src ./tests --debounce 300Fichiers à Modifier
| Fichier | Action |
|---|---|
protest/core/session.py |
Ajouter reset_for_rerun(), full_reload() |
protest/di/container.py |
Ajouter clear_session_cache() |
protest/execution/interrupt.py |
Ajouter reset() |
protest/cli/main.py |
Ajouter --watch flags |
protest/events/types.py |
Ajouter 5 nouveaux events (WATCH_STARTED, etc.) |
protest/plugin.py |
Ajouter 5 hooks on_watch_* |
pyproject.toml |
Ajouter watchfiles>=0.20 en optional dep |
Ordre d'Implémentation
- Setup module watch + dépendance
- FileWatcher basique
- WatchInterruptHandler
- WatchRunner MVP (full reload chaque run) → Zero Startup Time
- CLI integration
- Tests MVP
- ModuleReloader (reload ciblé)
- Session.reset_for_rerun() (fixtures persistantes)
- FixtureContainer.clear_session_cache()
- InterruptHandler.reset()
- Watch Events
- Rich reporter watch display
Non-inclus dans MVP (Future)
- Smart test selection (re-run seulement tests affectés)
- Coverage-based dependency tracking (style testmon)
- Clear screen entre runs
- Sound notification on failure
Priorité
Post-v0 - Feature avancée pour différencier ProTest de pytest. Le core doit être stable avant.
📋 Plan détaillé disponible dans .claude/plans/snug-baking-leaf.md