Spaces:
Sleeping
Sleeping
File size: 12,682 Bytes
bff1348 a76711b bff1348 a76711b bff1348 3bffe86 2c2bc0f bff1348 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | # Makefile β Picarones
# Usage : make <cible>
# Cibles principales : install, test, demo, serve, build, build-exe, docker-build, clean
.PHONY: all install install-dev install-all test test-cov lint demo serve \
build build-exe docker-build docker-run docker-compose-up clean help
PYTHON := python3
PIP := pip
VENV := .venv
VENV_BIN := $(VENV)/bin
PICARONES := $(VENV_BIN)/picarones
PYTEST := $(VENV_BIN)/pytest
PACKAGE := picarones
# Couleurs
BOLD := \033[1m
GREEN := \033[32m
CYAN := \033[36m
RESET := \033[0m
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Aide
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
help: ## Affiche cette aide
@echo ""
@echo "$(BOLD)Picarones β Commandes disponibles$(RESET)"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*## ' $(MAKEFILE_LIST) \
| sort \
| awk 'BEGIN {FS = ":.*## "}; {printf " $(CYAN)%-18s$(RESET) %s\n", $$1, $$2}'
@echo ""
all: install test ## Installer et tester
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Installation
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
$(VENV):
$(PYTHON) -m venv $(VENV)
install: $(VENV) ## Installe Picarones en mode Γ©ditable (dΓ©pendances de base)
$(VENV_BIN)/pip install --upgrade pip
$(VENV_BIN)/pip install -e .
@echo "$(GREEN)β Installation de base terminΓ©e$(RESET)"
@echo " Activez l'environnement : source $(VENV)/bin/activate"
install-dev: $(VENV) ## Installe avec les dΓ©pendances de dΓ©veloppement (tests, lint)
$(VENV_BIN)/pip install --upgrade pip
$(VENV_BIN)/pip install -e ".[dev]"
@echo "$(GREEN)β Installation dev terminΓ©e$(RESET)"
install-web: $(VENV) ## Installe avec l'interface web (FastAPI + uvicorn)
$(VENV_BIN)/pip install --upgrade pip
$(VENV_BIN)/pip install -e ".[web,dev]"
@echo "$(GREEN)β Installation web terminΓ©e$(RESET)"
install-all: $(VENV) ## Installe avec tous les extras (web, HuggingFace, dev)
$(VENV_BIN)/pip install --upgrade pip
$(VENV_BIN)/pip install -e ".[web,hf,dev]"
@echo "$(GREEN)β Installation complΓ¨te terminΓ©e$(RESET)"
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Tests
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
test: ## Lance la suite de tests complète
$(PYTEST) tests/ -q --tb=short
@echo "$(GREEN)β Tests terminΓ©s$(RESET)"
test-cov: ## Tests avec rapport de couverture HTML
$(PYTEST) tests/ --cov=$(PACKAGE) --cov-report=html --cov-report=term-missing -q
@echo "$(GREEN)β Rapport de couverture : htmlcov/index.html$(RESET)"
test-fast: ## Tests rapides uniquement (exclut les tests lents)
$(PYTEST) tests/ -q --tb=short -x
test-sprint9: ## Tests Sprint 9 uniquement
$(PYTEST) tests/test_sprint9_packaging.py -v
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# QualitΓ© du code
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
lint: ## VΓ©rifie le style du code (configuration lue depuis pyproject.toml)
@# La config ruff vit dans [tool.ruff] de pyproject.toml : cette cible,
@# le job CI et une invocation directe `ruff check` produisent le mΓͺme
@# rΓ©sultat. Lancez avant tout push pour Γ©viter un Γ©chec en PR.
@if command -v ruff > /dev/null 2>&1; then \
ruff check $(PACKAGE)/ tests/; \
elif $(VENV_BIN)/python -m ruff --version > /dev/null 2>&1; then \
$(VENV_BIN)/python -m ruff check $(PACKAGE)/ tests/; \
else \
echo "ruff non installΓ© β installation : pip install ruff"; \
exit 1; \
fi
doc-check: ## Audit de cohΓ©rence README/SPECS/CHANGELOG (Sprint A2)
@# Vérifie que la documentation reflète le code réel : moteurs annoncés
@# ont un adapter, commandes CLI listΓ©es existent, endpoints API
@# documentΓ©s sont exposΓ©s, compteur de tests Γ jour, sprints
@# rΓ©fΓ©rencΓ©s dans CHANGELOG rΓ©solvent. Voir docs/developer/doc-consistency.md.
@# Fallback Python système si .venv/ absent (pattern aligné avec ``lint``).
@if [ -x $(VENV_BIN)/python ]; then \
$(VENV_BIN)/python -m pytest tests/docs/ -q --tb=short --no-header; \
else \
$(PYTHON) -m pytest tests/docs/ -q --tb=short --no-header; \
fi
sync-counters: ## Régénère README/CLAUDE.md avec les compteurs réels (script gen_readme_tables.py)
@if [ -x $(VENV_BIN)/python ]; then \
$(VENV_BIN)/python scripts/gen_readme_tables.py; \
else \
$(PYTHON) scripts/gen_readme_tables.py; \
fi
sync-counters-check: ## CI : Γ©choue si README/CLAUDE.md divergent du code (compteurs tests + tables)
@if [ -x $(VENV_BIN)/python ]; then \
$(VENV_BIN)/python scripts/gen_readme_tables.py --check; \
else \
$(PYTHON) scripts/gen_readme_tables.py --check; \
fi
docs: ## Construit le site mkdocs en mode strict (Γ©choue sur les warnings)
@if [ -x $(VENV_BIN)/python ]; then \
$(VENV_BIN)/python -m mkdocs build --strict; \
else \
$(PYTHON) -m mkdocs build --strict; \
fi
docs-serve: ## Lance mkdocs en mode dev (http://localhost:8000)
@if [ -x $(VENV_BIN)/python ]; then \
$(VENV_BIN)/python -m mkdocs serve; \
else \
$(PYTHON) -m mkdocs serve; \
fi
typecheck: ## VΓ©rification de types avec mypy (si installΓ©)
@$(VENV_BIN)/python -m mypy $(PACKAGE)/ --ignore-missing-imports --no-strict-optional 2>/dev/null \
|| echo "mypy non installΓ© : pip install mypy"
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# DΓ©monstration
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
demo: ## Génère un rapport de démonstration complet (rapport_demo.html)
$(PICARONES) demo --docs 12 --output rapport_demo.html \
--with-history --with-robustness
@echo "$(GREEN)β Rapport demo : rapport_demo.html$(RESET)"
@echo " Ouvrez : file://$(PWD)/rapport_demo.html"
demo-json: ## Génère rapport demo + export JSON
$(PICARONES) demo --docs 12 --output rapport_demo.html --json-output resultats_demo.json
@echo "$(GREEN)β Rapport : rapport_demo.html | JSON : resultats_demo.json$(RESET)"
demo-history: ## DΓ©monstration du suivi longitudinal
$(PICARONES) history --demo --regression
demo-robustness: ## DΓ©monstration de l'analyse de robustesse
mkdir -p /tmp/picarones_demo_corpus
$(PICARONES) robustness \
--corpus /tmp/picarones_demo_corpus \
--engine tesseract \
--demo \
--degradations noise,blur,rotation
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Serveur web
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
serve: ## Lance l'interface web locale (http://localhost:8000)
$(PICARONES) serve --host 127.0.0.1 --port 8000
serve-public: ## Lance le serveur en mode public (0.0.0.0:8000)
$(PICARONES) serve --host 0.0.0.0 --port 8000
serve-dev: ## Lance le serveur en mode dΓ©veloppement (rechargement automatique)
$(PICARONES) serve --reload --verbose
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Build & packaging
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
build: ## Construit la distribution Python (wheel + sdist)
$(VENV_BIN)/pip install --upgrade build
$(VENV_BIN)/python -m build
@echo "$(GREEN)β Distribution : dist/$(RESET)"
build-exe: ## Génère un exécutable standalone avec PyInstaller
@echo "$(CYAN)Construction de l'exΓ©cutable standaloneβ¦$(RESET)"
$(VENV_BIN)/pip install pyinstaller
$(VENV_BIN)/pyinstaller picarones.spec --noconfirm
@echo "$(GREEN)β ExΓ©cutable : dist/picarones/$(RESET)"
build-exe-onefile: ## Génère un exécutable unique (plus lent au démarrage)
$(VENV_BIN)/pip install pyinstaller
$(VENV_BIN)/pyinstaller picarones.spec --noconfirm --onefile
@echo "$(GREEN)β ExΓ©cutable : dist/picarones$(RESET)"
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Docker
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
docker-build: ## Construit l'image Docker Picarones
docker build -t picarones:latest -t picarones:1.0.0 .
@echo "$(GREEN)β Image Docker : picarones:latest$(RESET)"
docker-run: ## Lance Picarones dans Docker (http://localhost:8000)
docker run --rm -p 8000:8000 \
-e OPENAI_API_KEY="$${OPENAI_API_KEY:-}" \
-e ANTHROPIC_API_KEY="$${ANTHROPIC_API_KEY:-}" \
-e MISTRAL_API_KEY="$${MISTRAL_API_KEY:-}" \
-v "$(PWD)/corpus:/app/corpus:ro" \
picarones:latest
docker-compose-up: ## Lance Picarones + Ollama avec Docker Compose
docker compose up -d
@echo "$(GREEN)β Services dΓ©marrΓ©s$(RESET)"
@echo " Picarones : http://localhost:8000"
@echo " Ollama : http://localhost:11434"
docker-compose-down: ## ArrΓͺte les services Docker Compose
docker compose down
docker-compose-logs: ## Affiche les logs Docker Compose
docker compose logs -f picarones
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Nettoyage
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
clean: ## Supprime les fichiers gΓ©nΓ©rΓ©s (cache, build, dist)
find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
find . -type f -name "*.pyc" -delete 2>/dev/null || true
find . -type f -name "*.pyo" -delete 2>/dev/null || true
find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true
rm -rf dist/ build/ .eggs/ htmlcov/ .coverage .pytest_cache/
@echo "$(GREEN)β Nettoyage terminΓ©$(RESET)"
clean-all: clean ## Supprime aussi l'environnement virtuel
rm -rf $(VENV)/
@echo "$(GREEN)β Environnement virtuel supprimΓ©$(RESET)"
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Utilitaires
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
info: ## Affiche les informations de version Picarones
$(PICARONES) info
engines: ## Liste les moteurs OCR disponibles
$(PICARONES) engines
history-demo: ## Affiche l'historique de dΓ©monstration
$(PICARONES) history --demo --regression
changelog: ## Affiche le CHANGELOG
@cat CHANGELOG.md | head -80
version: ## Affiche la version courante
@grep -m1 'version' pyproject.toml | awk '{print $$3}' | tr -d '"'
|