Skip to content

feat(contrat): doc_url et criteria[].lessons se traduisent dans lab.<lang>.yaml (0.9.3) - #375

Merged
stephrobert merged 1 commit into
mainfrom
feat/doc-url-traduisible
Nov 14, 2026
Merged

stephrobert merged 1 commit into
mainfrom
feat/doc-url-traduisible

Conversation

@stephrobert

Copy link
Copy Markdown
Owner

Summary

Une leçon du site existe dans chaque langue, à une URL qui ne se déduit pas de l'autre : /docs/admin-serveurs/linux/ devient /en/docs/linux/. Or un lab n'avait qu'un doc_url, si bien que guide envoyait un apprenant anglophone sur la page française, et lab.fr.yaml n'y pouvait rien. Mesure du 2026-11-14 : 440 doc_url et 630 leçons de critères ont une version anglaise sur le site.

Ce qui change :

  • doc_url devient traduisible, comme title : lab.yaml porte l'URL anglaise, lab.fr.yaml la française.
  • Les lessons d'un critère se surchargent par id, comme son label.
  • guide, show et list-labs --json rendent l'URL de la langue de la session. Une traduction qui ne donne pas d'URL hérite de l'anglaise.
  • validate-structure relit chaque lab.<lang>.yaml. Il contrôle la forme des URL qu'une traduction substitue, sans compter deux fois une URL héritée.
  • --check-urls interroge aussi les doc_url traduits.
  • doc_url et criteria[].lessons ne sont plus des clés hors contrat dans lab.<lang>.yaml. criteria[].tests y reste refusé.

Aucun catalogue existant ne change : un lab.yaml qui garde son URL française se comporte comme avant. La session du site a validé ce choix, plutôt qu'un champ doc_url_en. Elle adaptera son générateur de catalogue pour lire le doc_url de lab.fr.yaml.

Cette PR passe aussi le moteur en 0.9.3, qui livre en plus #201, #203 et #369, déjà sur main.

Type of change

  • Bug fix
  • New feature
  • Refactor
  • Documentation
  • Chore / tooling
  • Security / supply chain

Checklist

Always

  • ruff check src/dsoxlab tests tests_e2e fuzz scripts passe
  • mypy src/dsoxlab passe (strict, 124 fichiers)
  • pytest passe : 2 316 tests
  • pytest tests_e2e : pas joué en local, la CI le joue
  • Le moteur reste agnostique : aucune logique de domaine, seulement des langues et des URL
  • Aucun chemin personnel codé en dur
  • Essayé sur deux catalogues :
    • terraform-dsoxlab-training (aucune VM) : validate-structure sort en 0 ;
    • linux-dsoxlab-training, sur un clone frais de main : validate-structure sort en 0.

When behavior changes

  • CHANGELOG.md et CHANGELOG.fr.md : entrée ajoutée, et [Unreleased] devient [0.9.3] - 2026-11-14
  • pyproject.toml passe en 0.9.3, et uv.lock est régénéré

When a command or option is added, removed or changed

N/A : aucune commande ni option ne change, seule l'URL rendue dépend de la langue.

  • Le seul nouveau message de journal (traduction illisible, non contrôlée) est en anglais.

When .github/workflows/ is touched

N/A : aucun workflow touché.

When the declarative contract changes

  • docs/contract-v1(.fr).md, docs/catalog-author(.fr).md et schemas/lab.schema.json sont à jour. La section contrat du README.md ne décrit pas lab.<lang>.yaml, donc rien n'y change.
  • N/A pour le corpus de fuzz : aucun champ nouveau, doc_url et lessons existaient déjà.
  • Une valeur mal formée reste dans le contrat du parseur. Des lessons traduites qui ne sont pas une liste sont ignorées, et l'anglais reste. Une traduction illisible est avalée, comme avant.

Tests

tests/test_doc_url_traduit.py : 16 tests. Ils ont été joués contre le code d'avant le changement : 11 échouent. Les 5 autres sont des garde-fous qui doivent passer dans les deux cas (héritage de l'anglais, pas de double signalement, guide en anglais).

test_politique_d_affichage.py::test_les_lecons_ne_se_traduisent_pas affirmait l'ancienne règle. Il est remplacé par test_les_lecons_se_traduisent_mais_pas_les_tests.

Related issues

Suite de #374 (contrat : ce que surcharge lab.<lang>.yaml). Les catalogues passeront leurs URL anglaises dans lab.yaml une fois la 0.9.3 publiée.

🤖 Generated with Claude Code

…lang>.yaml (0.9.3)

Une leçon du site existe dans chaque langue, à une URL qui ne se déduit
pas de l'autre, et un lab n'avait qu'un doc_url : guide envoyait un
apprenant anglophone sur la page française, et lab.fr.yaml n'y pouvait
rien.

- models/lab.py : doc_url rejoint les champs traduisibles ; les leçons
  d'un critère se surchargent par id, comme son libellé ;
  langues_traduites() liste les lab.<lang>.yaml d'un lab.
- validators/contract.py : doc_url et criteria[].lessons ne sont plus
  des clés hors contrat dans lab.<lang>.yaml.
- validators/metadata.py : validate-structure relit chaque traduction et
  contrôle la forme des URL qu'elle substitue, sans compter deux fois une
  URL héritée.
- --check-urls interroge aussi les doc_url traduits.
- Contrat, doc d'auteur, schéma JSON, CHANGELOG EN + FR.

Aucun catalogue existant ne change : un lab.yaml qui garde son URL
française se comporte comme avant. Passage en 0.9.3, qui livre aussi
#201, #203 et #369.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@stephrobert
stephrobert merged commit 30c15a6 into main Nov 14, 2026
20 checks passed
@stephrobert
stephrobert deleted the feat/doc-url-traduisible branch November 14, 2026 14:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant