Files
Ustagammon/tests/test_glossary.sh
T
Pierre MARTINandClaude Opus 5.5 85cc034611 Glossaire relié au code dans les deux sens
Fiches Demi-coup (HalfMove) et Plateau (Board) ajoutées ; champ code des
fiches Coup, Jet, Pli, Moteur, Identifiant de position, Videau, Événement de
partie et Partie. tests/test_glossary.sh vérifie que chaque référence
« Glossaire : » du code mène à une fiche qui nomme le type, et que chaque
champ code désigne un type qui renvoie à sa fiche.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:42:08 +01:00

77 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Vérifie les fiches du glossaire (docs/glossaire/, ADR 0008) :
# en-tête avec term et english, titre identique au terme, ligne « En bref »,
# traductions anglaises uniques, chaque fiche présente dans l'index,
# liens « Voir aussi » vers des fiches existantes.
set -euo pipefail
cd "$(dirname "$0")/../docs/glossaire"
errors=0
report() {
echo "$1"
errors=$((errors + 1))
}
for f in *.md; do
[ "$f" = README.md ] && continue
[ "$(sed -n 1p "$f")" = "---" ] || report "$f : l'en-tête doit commencer par ---"
term="$(sed -n 's/^term: //p' "$f")"
english="$(sed -n 's/^english: //p' "$f")"
[ -n "$term" ] || report "$f : champ term absent"
[ -n "$english" ] || report "$f : champ english absent"
grep -qx "# $term" "$f" || report "$f : le titre doit être « # $term »"
grep -qE '^\*\*En bref\*\* : .+' "$f" || report "$f : ligne « **En bref** : » absente"
grep -qF "]($f)" README.md || report "$f : absent de l'index README.md"
while IFS= read -r link; do
[ -f "$link" ] || report "$f : lien vers une fiche inexistante ($link)"
done < <(grep -oE '\]\([^)]+\.md\)' "$f" | sed -E 's/^\]\((.*)\)$/\1/' || true)
done
duplicates="$(find . -name '*.md' ! -name README.md -exec sed -n 's/^english: //p' {} + | sort | uniq -d)"
[ -z "$duplicates" ] || report "traductions anglaises en double : $duplicates"
# Lien glossaire <-> code (ADR 0008), dans les deux sens. Dans le code, un
# commentaire « Glossaire : docs/glossaire/<fiche>.md » désigne le premier
# type exporté qui le suit ; la fiche doit exister et nommer ce type dans son
# champ code. Réciproquement, chaque champ code d'une fiche doit désigner un
# type ainsi relié à elle.
pairs="$(find ../../app/src -name '*.ts' -exec awk '
function flush() { if (ref != "") print ref, "?"; ref = "" }
FNR == 1 { flush() }
match($0, /Glossaire : docs\/glossaire\/[a-z0-9-]+\.md/) {
flush()
ref = substr($0, RSTART + 27, RLENGTH - 27)
next
}
ref != "" && match($0, /^export (interface|type|class|enum) [A-Za-z0-9_]+/) {
n = split(substr($0, RSTART, RLENGTH), words, " ")
print ref, words[n]
ref = ""
}
END { flush() }
' {} +)"
while read -r fiche type; do
[ -n "$fiche" ] || continue
if [ "$type" = "?" ]; then
report "code : référence à $fiche sans type exporté juste après"
elif [ ! -f "$fiche" ]; then
report "code : le type $type renvoie à une fiche inexistante ($fiche)"
elif [ "$(sed -n 's/^code: //p' "$fiche")" != "$type" ]; then
report "$fiche : le type $type y renvoie, mais la fiche n'a pas « code: $type »"
fi
done <<<"$pairs"
for f in *.md; do
[ "$f" = README.md ] && continue
code="$(sed -n 's/^code: //p' "$f")"
[ -n "$code" ] || continue
grep -qx "$f $code" <<<"$pairs" \
|| report "$f : « code: $code » ne désigne aucun type du code qui renvoie à cette fiche"
done
[ "$errors" -eq 0 ]