Config strictement stricte partout (ruff, mypy --strict, bandit, vulture, import-linter, eslint, stylelint), aucune regle desactivee "pour ne pas casser le build" - l'existant a ete corrige pour la satisfaire plutot que l'inverse. Hooks pre-commit locaux (language: system) bloquants. - Typage mypy --strict propage a tout le moteur (db, screens, auth, core, ai, routes, puis publish/scripts/tests/app.py/build_css.py). - Securite : fuite de handle fichier Windows corrigee dans l'export SCORM (routes/publish/export_scorm.py), CSRF/RNG non-crypto/xAPI documentes (# nosec, # NOSONAR justifies), nouveau db.json_for_script() (echappe "</script>" dans le JSON embarque en <script>, 25 sites). - Architecture : imports circulaires/F811 nettoyes, contrats import-linter respectes, code mort retire (vulture). - Accessibilite : 69 champs de formulaire sans label correctement associe corriges (for/id ou aria-label) sur 11 templates. - ESLint/Stylelint : lot mecanique JS/CSS, regles ajustees puis appliquees (aucune desactivee sans verification individuelle). - Tests : isolation du compte admin partage (nettoyage ponctuel + fixture de teardown automatique en filet de securite), suite complete verte (591 tests Python, 241 tests JS). - SonarQube Community Build self-heberge (Docker + PostgreSQL) : rapport complet analyse point par point, faux positifs documentes. - .gitattributes ajoute (LF force) : core.autocrlf=true sur cette machine faisait echouer ESLint (linebreak-style) via un bug connu de git (checkout "en place" qui ignore l'eol force sur un fichier deja present sur disque - contourne en supprimant puis recreant chaque fichier suivi). djLint (H021, styles inline) volontairement saute pour ce commit - backlog assume, deja documente, traite dans un lot separe. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
81 lines
2.8 KiB
YAML
81 lines
2.8 KiB
YAML
# Hooks locaux (language: system) plutot que les miroirs pre-commit
|
|
# habituels (astral-sh/ruff-pre-commit, pre-commit/mirrors-mypy,
|
|
# pre-commit/mirrors-eslint...) : ce projet a deja un environnement
|
|
# Python (requirements-dev.txt) et un node_modules/ (package.json) bien
|
|
# a lui — repartir sur un environnement ISOLE et RE-TELECHARGE par
|
|
# pre-commit dupliquerait exactement les memes outils/versions pour rien
|
|
# (et serait plus lent, plus fragile hors ligne). Voir CODE_QUALITY.md
|
|
# pour l'installation prealable (`pip install -r requirements-dev.txt`
|
|
# + `npm install`), necessaire pour que ces hooks trouvent les
|
|
# executables.
|
|
#
|
|
# Chaque hook est bloquant (aucune regle desactivee "pour ne pas casser
|
|
# le build", demande explicite) — un commit est refuse si un outil
|
|
# trouve un probleme, jusqu'a ce que la Phase 3 du plan qualite ait
|
|
# nettoye l'existant.
|
|
#
|
|
# eslint/stylelint : entry appelle `node <script.js>` directement plutot
|
|
# que `npx eslint` ou le shim node_modules/.bin/eslint(.cmd) — ces deux
|
|
# dernieres formes font passer pre-commit par cmd.exe pour lancer un
|
|
# executable Windows (.cmd) ou un script a shebang POSIX (#!/bin/sh),
|
|
# et pre-commit resout mal cmd.exe/sh depuis ce contexte (bug constate
|
|
# sous Windows). Appeler `node` directement sur le fichier JS du package
|
|
# evite tout intermediaire shell.
|
|
repos:
|
|
- repo: local
|
|
hooks:
|
|
- id: ruff-check
|
|
name: Ruff (lint Python)
|
|
entry: ruff check
|
|
language: system
|
|
types: [python]
|
|
|
|
- id: ruff-format
|
|
name: Ruff (formatage Python)
|
|
entry: ruff format --check
|
|
language: system
|
|
types: [python]
|
|
|
|
- id: mypy
|
|
name: Mypy (typage strict Python)
|
|
entry: mypy .
|
|
language: system
|
|
types: [python]
|
|
pass_filenames: false
|
|
|
|
- id: vulture
|
|
name: Vulture (code mort Python)
|
|
entry: vulture
|
|
language: system
|
|
pass_filenames: false
|
|
|
|
- id: bandit
|
|
name: Bandit (securite Python)
|
|
entry: bandit -c pyproject.toml -r ai auth core db filters publish routes screens scripts app.py build_css.py
|
|
language: system
|
|
pass_filenames: false
|
|
|
|
- id: import-linter
|
|
name: import-linter (contrats d'architecture Python)
|
|
entry: lint-imports
|
|
language: system
|
|
pass_filenames: false
|
|
|
|
- id: djlint
|
|
name: djLint (templates Jinja)
|
|
entry: djlint templates
|
|
language: system
|
|
pass_filenames: false
|
|
|
|
- id: eslint
|
|
name: ESLint (JS)
|
|
entry: node node_modules/eslint/bin/eslint.js
|
|
language: system
|
|
files: ^static/js/.*\.js$
|
|
|
|
- id: stylelint
|
|
name: Stylelint (CSS)
|
|
entry: node node_modules/stylelint/bin/stylelint.mjs
|
|
language: system
|
|
files: \.css$
|