Conventions
Flux de travail
Section intitulée « Flux de travail »- Chaque sujet a une issue GitHub, mise à jour au fil de l’implémentation (liste de tâches cochée).
- Une branche par sujet, partant de
master. - Plusieurs petits commits plutôt qu’un seul gros.
- Une pull request liée à l’issue (
Closes #12). La CI doit être verte.
- En anglais, à l’impératif, courts et précis :
Add pantry expiry reminders,Fix Google sign-in missing dependencies (#20). - Un commit = une intention. Le numéro d’issue entre parenthèses quand il y en a une.
- Pas de corps de message verbeux : le pourquoi détaillé va dans l’issue ou la pull request.
Code Python
Section intitulée « Code Python »- Ruff pour le lint et le formatage (100 caractères par ligne, règles
E,F,W,I,B,UP,DJ,S,SIM,RUF).uv run pre-commit installles lance avant chaque commit. - Code lisible plutôt que commenté : un commentaire explique un « pourquoi », jamais un « quoi ». Docstrings d’une ligne pour les fonctions dont le rôle n’est pas évident.
- Logique métier dans des modules dédiés (
services.py,metrics.py,estimator.py), pas dans les vues ni les templates. - Appels aux services ouverts uniquement via
apps/integrations/, avec gestion deServiceError. - Textes visibles en français, identifiants et noms de code en anglais.
- Annotations de type sur les fonctions métier, comme dans le code existant (
Decimal | None,list[Line]).
Templates et front-end
Section intitulée « Templates et front-end »- Classes Tailwind dans les templates ; composants réutilisés (boutons, cartes, badges) déclarés en
@utilitydansassets/app.css. - Aucun script ni style en ligne (bloqués par la CSP). Interactions avec HTMX, comportements dans
static/js/app.jsviadata-*. - Fragments HTMX préfixés par
_(_results.html). - Toute image a un
alt; tout bouton qui ouvre un panneau aaria-expandedetaria-controls.
Rédaction
Section intitulée « Rédaction »- Documentation, interface et issues en français, concises.
- Pas de tiret cadratin : utilisez deux-points, virgules ou parenthèses.
Migrations
Section intitulée « Migrations »- Des migrations nommées selon leur contenu (
0004_recipe_search_text), générées avecmakemigrations --name. - Une donnée à remplir pour les lignes existantes passe par
RunPythondans la même migration (exemple :apps/recipes/migrations/0004_recipe_search_text.py). - La CI échoue s’il manque une migration (
makemigrations --check).

