diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000..e7228b0 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,37 @@ +# Formatage et tri des imports de l'OUTILLAGE ERPLibre — script/, test/, +# long_test/ et les scripts de la racine. +# +# ruff et non black : black 24.8.0 ne connaît aucune cible au-delà de py313, +# quand l'outillage tourne sur conf/python-erplibre-version, et son tri +# d'imports remplace isort sans second outil. C'est aussi ce que la norme OCA +# emploie depuis qu'elle a quitté black. +# +# Les modules Odoo n'obéissent PAS à ce fichier : chaque dépôt d'addons porte +# sa propre norme. script/maintenance/format_python.sh aiguille entre les deux. +# +# target-version borne ce que le formateur ÉCRIT, et non ce qui exécute le +# code. py310 et non la version du venv : PEP 758 autorise depuis 3.14 +# « except A, B: » sans parenthèses, et ruff l'écrirait — or les hooks de +# script/git/hooks portent « #!/usr/bin/env python3 » et tournent donc sur le +# Python du système, qu'une distribution livre encore en 3.10. +target-version = "py310" +# 79, la largeur que le dépôt tient déjà. La norme OCA en retient 88, déclarée +# dans les dépôts d'addons qui la suivent. +line-length = 79 + +# Des dépôts SÉPARÉS, rapatriés par Google Repo : ils portent leur propre +# configuration, et les reformater écrirait dans l'historique d'autrui. +# force-exclude : sans lui, l'exclusion ne vaut que pour les fichiers que ruff +# DÉCOUVRE, et un chemin nommé en argument y échappe — or format_python.sh +# passe les fichiers un par un. +force-exclude = true +extend-exclude = [ + "addons", + "odoo*", + "script/OCA_maintainer-tools", + "script/OCA_odoo-module-migrator", +] + +[lint] +# Le tri des imports seul : le lint du dépôt reste décrit par .flake8. +select = ["I"] diff --git a/CHANGELOG.base.md b/CHANGELOG.base.md index d8cab78..3d12634 100644 --- a/CHANGELOG.base.md +++ b/CHANGELOG.base.md @@ -154,6 +154,8 @@ au [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - A VM deployed with the cache upstream cut — QEMU form, Proxmox VE, or `deploy_qemu.py --offline` — has npm's security audit turned off (`NPM_CONFIG_AUDIT=false`): it queries a remote service no cache can replay, and failed on every offline install. An online VM keeps its audit - Verifying a downloaded image no longer needs `--verify`: it runs by default for every distribution that publishes a sum, and `--no-verify` is what skips it — to be kept for offline runs, where a substituted image would otherwise pass unremarked - `--bios` is refused on an image with no BIOS boot sector, and says why. Forced there, it gave a VM reported « running » with a silent console — the very failure that flag exists to avoid elsewhere +- `make format` picks the formatter from each file's context: an Odoo module keeps isort and black on `py37`, the series still supported going down that far, while this repository's own tooling goes through ruff, configured once in `.ruff.toml`. ruff follows CPython's versions, where black 24.8.0 stops at `py313`, and its import sorting replaces isort; it is also what the OCA standard uses since it left black +- The repositories that Google Repo checks out under `script/` are excluded from that formatting, a named path included: reformatting them would write in someone else's history. `target-version` stays at `py310` there, because the git hooks carry `#!/usr/bin/env python3` and a distribution still ships 3.10 — from 3.14 on, ruff would write `except A, B:` without parentheses @@ -170,6 +172,8 @@ au [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Une VM déployée l'amont du cache coupé — formulaire QEMU, Proxmox VE, ou `deploy_qemu.py --offline` — a l'audit de sécurité de npm désactivé (`NPM_CONFIG_AUDIT=false`) : il interroge un service qu'aucun cache ne rejoue, et échouait à chaque installation hors ligne. Une VM en ligne garde son audit - Vérifier une image téléchargée ne demande plus `--verify` : c'est le défaut pour toute distribution qui publie une somme, et `--no-verify` est ce qui la saute — à réserver aux essais hors ligne, où une image substituée passerait autrement sans un mot - `--bios` est refusé sur une image sans secteur d'amorçage BIOS, et dit pourquoi. Forcé là, il donnait une VM « running » à console muette — la panne même que ce drapeau évite ailleurs +- `make format` choisit le formateur d'après le contexte de chaque fichier : un module Odoo garde isort et black en `py37`, la série la plus ancienne encore supportée, quand l'outillage de ce dépôt passe par ruff, réglé une fois dans `.ruff.toml`. ruff suit les versions de CPython, là où black 24.8.0 s'arrête à `py313`, et son tri d'imports remplace isort ; c'est aussi ce qu'emploie la norme OCA depuis qu'elle a quitté black +- Les dépôts que Google Repo rapatrie sous `script/` sont écartés de ce formatage, chemin nommé compris : les reformater écrirait dans l'historique d'autrui. `target-version` y reste à `py310`, parce que les hooks git portent `#!/usr/bin/env python3` et qu'une distribution livre encore 3.10 — à partir de 3.14, ruff écrirait `except A, B:` sans parenthèses ## Fixed diff --git a/CHANGELOG.fr.md b/CHANGELOG.fr.md index f0bc7dd..5729d9c 100644 --- a/CHANGELOG.fr.md +++ b/CHANGELOG.fr.md @@ -77,6 +77,8 @@ au [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Une VM déployée l'amont du cache coupé — formulaire QEMU, Proxmox VE, ou `deploy_qemu.py --offline` — a l'audit de sécurité de npm désactivé (`NPM_CONFIG_AUDIT=false`) : il interroge un service qu'aucun cache ne rejoue, et échouait à chaque installation hors ligne. Une VM en ligne garde son audit - Vérifier une image téléchargée ne demande plus `--verify` : c'est le défaut pour toute distribution qui publie une somme, et `--no-verify` est ce qui la saute — à réserver aux essais hors ligne, où une image substituée passerait autrement sans un mot - `--bios` est refusé sur une image sans secteur d'amorçage BIOS, et dit pourquoi. Forcé là, il donnait une VM « running » à console muette — la panne même que ce drapeau évite ailleurs +- `make format` choisit le formateur d'après le contexte de chaque fichier : un module Odoo garde isort et black en `py37`, la série la plus ancienne encore supportée, quand l'outillage de ce dépôt passe par ruff, réglé une fois dans `.ruff.toml`. ruff suit les versions de CPython, là où black 24.8.0 s'arrête à `py313`, et son tri d'imports remplace isort ; c'est aussi ce qu'emploie la norme OCA depuis qu'elle a quitté black +- Les dépôts que Google Repo rapatrie sous `script/` sont écartés de ce formatage, chemin nommé compris : les reformater écrirait dans l'historique d'autrui. `target-version` y reste à `py310`, parce que les hooks git portent `#!/usr/bin/env python3` et qu'une distribution livre encore 3.10 — à partir de 3.14, ruff écrirait `except A, B:` sans parenthèses ## Corrigé diff --git a/CHANGELOG.md b/CHANGELOG.md index 011a0f0..934c3a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,6 +77,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - A VM deployed with the cache upstream cut — QEMU form, Proxmox VE, or `deploy_qemu.py --offline` — has npm's security audit turned off (`NPM_CONFIG_AUDIT=false`): it queries a remote service no cache can replay, and failed on every offline install. An online VM keeps its audit - Verifying a downloaded image no longer needs `--verify`: it runs by default for every distribution that publishes a sum, and `--no-verify` is what skips it — to be kept for offline runs, where a substituted image would otherwise pass unremarked - `--bios` is refused on an image with no BIOS boot sector, and says why. Forced there, it gave a VM reported « running » with a silent console — the very failure that flag exists to avoid elsewhere +- `make format` picks the formatter from each file's context: an Odoo module keeps isort and black on `py37`, the series still supported going down that far, while this repository's own tooling goes through ruff, configured once in `.ruff.toml`. ruff follows CPython's versions, where black 24.8.0 stops at `py313`, and its import sorting replaces isort; it is also what the OCA standard uses since it left black +- The repositories that Google Repo checks out under `script/` are excluded from that formatting, a named path included: reformatting them would write in someone else's history. `target-version` stays at `py310` there, because the git hooks carry `#!/usr/bin/env python3` and a distribution still ships 3.10 — from 3.14 on, ruff would write `except A, B:` without parentheses ## Fixed diff --git a/Makefile b/Makefile index 3132070..e4f6e8e 100644 --- a/Makefile +++ b/Makefile @@ -222,12 +222,12 @@ format_code_generator_template: .PHONY: format_script format_script: - #.venv.erplibre/bin/isort --profile black -l 79 ./script/ --gitignore - ./script/maintenance/black.sh ./script/ + .venv.erplibre/bin/ruff check --select I --fix ./script/ + .venv.erplibre/bin/ruff format ./script/ .PHONY: format_script_isort_only format_script_isort_only: - .venv.erplibre/bin/isort --profile black -l 79 ./script/ --gitignore + .venv.erplibre/bin/ruff check --select I --fix ./script/ ######### # log # diff --git a/requirement/erplibre_require-ments.txt b/requirement/erplibre_require-ments.txt index dd21a07..eb84a6e 100644 --- a/requirement/erplibre_require-ments.txt +++ b/requirement/erplibre_require-ments.txt @@ -16,6 +16,9 @@ selenium uvloop python-randomword-fr isort +# Formatage et tri des imports de l'outillage : il suit les versions de +# CPython, là où black 24.8.0 s'arrête à py313. Voir .ruff.toml. +ruff pykeepass cryptography keyring diff --git a/script/maintenance/black.sh b/script/maintenance/black.sh index 2205edd..2f04d90 100755 --- a/script/maintenance/black.sh +++ b/script/maintenance/black.sh @@ -2,7 +2,9 @@ Red='\033[0;31m' # Red Color_Off='\033[0m' # Text Reset -# This will format all python file +# Les MODULES ODOO, et eux seuls : les addons des séries encore supportées +# descendent jusqu'à Python 3.7, d'où la cible. L'outillage du dépôt passe par +# ruff — voir format_python.sh, qui aiguille, et .ruff.toml. # argument 1: directory or file to format source ./.venv.erplibre/bin/activate black -l 79 --preview -t py37 "$@" diff --git a/script/maintenance/format_python.sh b/script/maintenance/format_python.sh index d685032..d07141d 100755 --- a/script/maintenance/format_python.sh +++ b/script/maintenance/format_python.sh @@ -1,5 +1,36 @@ #!/usr/bin/env bash -source ./.venv.erplibre/bin/activate -isort --profile black -l 79 "$@" -#./.venv.erplibre/bin/isort --profile black -l 79 "$@" -./script/maintenance/black.sh "$@" +# © 2021-2026 TechnoLibre (http://www.technolibre.ca) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) +# +# Un fichier Python, le formateur de SON contexte. +# +# Un module Odoo et un script d'outillage ne suivent pas la même norme et ne +# tournent pas sur le même interpréteur : les addons vivent dans des dépôts +# séparés, dont la communauté fixe le style, quand script/ n'engage que ce +# dépôt. Un réglage unique servait donc mal les deux. +# +# addons/…, odoo*/addons/… isort + black, cible py37 : les séries d'Odoo +# encore supportées descendent jusque-là. +# tout le reste ruff, réglé par .ruff.toml à la racine. + +VENV="$(xargs < conf/python-erplibre-venv 2> /dev/null)" +RUFF="./${VENV}/bin/ruff" + +for fichier in "$@"; do + case "${fichier}" in + ./addons/* | addons/* | ./odoo*/addons/* | odoo*/addons/*) + "./${VENV}/bin/isort" --profile black -l 79 "${fichier}" + ./script/maintenance/black.sh "${fichier}" + ;; + *) + if [[ ! -x "${RUFF}" ]]; then + echo "ruff absent de ${VENV} : ./script/install/install_erplibre.sh" >&2 + exit 1 + fi + # Le tri des imports d'abord : il déplace des lignes que le formatage + # remet ensuite à la bonne largeur. + "${RUFF}" check --select I --fix --quiet "${fichier}" + "${RUFF}" format --quiet "${fichier}" + ;; + esac +done