Files
gesthub/docs/04_annexe_A1_qualite_code.md
2026-08-21 09:12:02 +02:00

87 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Annexe A1 — Qualité du code
## Charte de nommage
| Élément | Convention | Exemple réel dans le code |
|---|---|---|
| Fonctions, variables | `snake_case` | `create_annonce`, `fichier_id` |
| Classes / exceptions | `PascalCase` | `AnnonceNotFoundError`, `FileValidationError` |
| Constantes | `UPPER_SNAKE_CASE` | `TITRE_MAX_LEN`, `ALLOWED_EXTENSIONS` |
| Modules | `snake_case` court, un rôle par fichier | `annonce_service.py`, `audit_model.py` |
## Séparation stricte des responsabilités
Architecture en couches routes/ → services/ → models/ (voir Bloc 1 — C3/C4).
Aucune route n'exécute de SQL ; aucun modèle ne connaît la logique HTTP.
## Preuve réelle — exécution de flake8 (2026-08-20)
Commande exécutée : `flake8 --max-line-length=110 --exclude=tests app.py
config.py db.py models routes services init_db.py`
```
(sortie vide — 0 violation)
```
**0 violation PEP8/pyflakes** sur l'ensemble de la couche applicative
(app.py, config.py, db.py, models/, routes/, services/, init_db.py — hors
tests). Rapport complet : `docs/evidence/flake8_output.txt`.
## Preuve réelle — exécution de radon (complexité et documentation)
Commande : `radon cc models services routes app.py db.py -s -a`
```
84 blocs (classes, fonctions, méthodes) analysés.
Complexité moyenne : A (1.70)
```
Une complexité cyclomatique moyenne de 1,70 (grade A) signifie que la
quasi-totalité des fonctions n'a qu'un ou deux chemins d'exécution — cohérent
avec la décomposition en étapes indépendantes (ex. upload de fichiers en
8 fonctions, cf. Bloc 3 — C2).
Commande : `radon raw models services routes app.py db.py -s`
```
Total :
LOC (lignes de code) : 984
Commentaires : 28 lignes ; commentaires + docstrings : 13 % du total (C+M % L)
```
**Taux de documentation interne mesuré : 13 %**, dans la fourchette cible
815 % annoncée dans la Partie 2 (Bloc 1 — C2). Rapport complet :
`docs/evidence/radon_cc_output.txt` et `docs/evidence/radon_raw_output.txt`.
## Taux de réutilisation
Les fonctions de validation et d'autorisation sont centralisées dans
`services/auth_service.py` (décorateurs `require_login`/`require_admin`) et
réutilisées par les 4 blueprints de routes (`annonces`, `fichiers`,
`evenements`, `dashboard`). Les 5 modules de `models/` exposent tous la même
interface (`insert`/`fetch_all`/`get`/`delete`), ce qui a permis d'écrire
`services/` sans dupliquer la logique d'accès aux données.
## Preuve réelle — suite de tests (Bloc 1 — C5, Bloc 3 — C7)
Commande : `pytest tests/ -v` exécutée contre une véritable base MariaDB
10.11 (et non des mocks) :
```
34 passed in 0.5s
```
Répartition : 22 tests unitaires (UT-01 à UT-12, avec variantes), 11 tests
d'intégration (IT-01 à IT-10, avec variante), 6 tests de sécurité (TS-01 à
TS-06). Détail complet dans `docs/evidence/pytest_output.txt` et dans la
Partie 4 (Plan de tests) du présent dossier.
Au cours de l'écriture de cette suite, **3 bugs réels ont été détectés puis
corrigés** grâce aux tests (et non anticipés à l'écriture du code) :
un paramètre par défaut Python évalué à l'import (`Config.UPLOAD_DIR`)
qui ignorait les redirections de répertoire en test, un blueprint Flask
redécoré à chaque création d'application de test, et une confusion entre
"argument non fourni" et "argument explicitement `None`" dans
`is_admin()`. Ce sont des exemples concrets de recherche systématique
d'erreurs (Bloc 1 — C5) et de débogage (Bloc 3 — C5).