configlet lint


L'usage principal de configlet est la vérification : s'assurer que les fichiers de configuration d'un parcours sont correctement structurés, tant sur le plan syntaxique que sémantique. Un parcours mal configuré risque de ne pas se synchroniser correctement, de s'afficher de façon erronée sur le site ou d'offrir une expérience utilisateur perfectible ; les garde-fous de configlet jouent donc un rôle important dans le maintien de l'intégrité d'Exercism.

Utilisation

La commande lint permet de vérifier un parcours.

configlet [global-options] lint [command-options]

Global options:
  -h, --help                   Show this help message and exit
      --version                Show this tool's version information and exit
  -t, --track-dir <dir>        Specify a track directory to use instead of the current directory
  -v, --verbosity <verbosity>  The verbosity of output. Allowed values: q[uiet], n[ormal], d[etailed]

Règles

Voici les règles de vérification appliquées.

Règle : les fichiers requis sont présents

Le linter doit vérifier que tous les fichiers requis sont présents. Les fichiers non spécifiques aux exercices qui doivent être présents sont :

  • config.json
  • docs/ABOUT.md
  • docs/INSTALLATION.md
  • docs/LEARNING.md
  • docs/RESOURCES.md
  • docs/SNIPPET.txt
  • docs/TESTS.md
  • exercises/shared/.docs/help.md
  • exercises/shared/.docs/tests.md

Les fichiers spécifiques aux exercices d'apprentissage qui doivent être présents sont :

  • exercises/concept/<slug>/.docs/hints.md
  • exercises/concept/<slug>/.docs/instructions.md
  • exercises/concept/<slug>/.docs/introduction.md
  • exercises/concept/<slug>/.meta/config.json

Il y aura une liste similaire pour les exercices d'entraînement, mais les spécifications correspondantes n'ont pas encore été définies.

Chaque concept listé dans config.json doit posséder les fichiers suivants :

  • concepts/<slug>/about.md
  • concepts/<slug>/introduction.md
  • concepts/<slug>/links.json

Règle : le fichier config.json est valide

Le fichier config.json doit satisfaire aux vérifications suivantes :

  • Le fichier doit être un JSON valide
  • La clé "language" est requise
  • La valeur de "language" doit être une chaîne non vide¹ d'une longueur <= 255
  • La clé "slug" est requise
  • La valeur de "slug" doit être une chaîne en kebab-case² d'une longueur <= 255
  • La clé "active" est requise
  • La valeur de "active" doit être un booléen
  • La clé "blurb" est requise
  • La valeur de "blurb" doit être une chaîne non vide¹ d'une longueur <= 400
  • La clé "version" est requise
  • La valeur de "version" doit être l'entier 3
  • La clé "status.concept_exercises" est requise
  • La valeur de "status.concept_exercises" doit être un booléen
  • La clé "status.test_runner" est requise
  • La valeur de "status.test_runner" doit être un booléen
  • La clé "status.representer" est requise
  • La valeur de "status.representer" doit être un booléen
  • La clé "status.analyzer" est requise
  • La valeur de "status.analyzer" doit être un booléen
  • La clé "online_editor.indent_style" est requise
  • La valeur de "online_editor.indent_style" doit être la chaîne space ou tab
  • La clé "online_editor.indent_size" est requise
  • La valeur de "online_editor.indent_size" doit être un entier >= 0 et <= 8
  • La clé "online_editor.highlightjs_language" est facultative
  • La valeur de "online_editor.highlightjs_language" doit être une chaîne non vide¹
  • La clé "files" est facultative
  • La valeur de "files" doit être un objet
  • La clé "files.solution" est facultative
  • La valeur de "files.solution" doit être un tableau
  • Les valeurs de "files.solution" doivent être des motifs valides⁵
  • Les valeurs de "files.solution" ne doivent pas contenir de doublons
  • La clé "files.test" est facultative
  • La valeur de "files.test" doit être un tableau
  • Les valeurs de "files.test" doivent être des motifs valides⁵
  • Les valeurs de "files.test" ne doivent pas contenir de doublons
  • La clé "files.example" est facultative
  • La valeur de "files.example" doit être un tableau
  • Les valeurs de "files.example" doivent être des motifs valides⁵
  • Les valeurs de "files.example" ne doivent pas contenir de doublons
  • La clé "files.exemplar" est facultative
  • La valeur de "files.exemplar" doit être un tableau
  • Les valeurs de "files.exemplar" doivent être des motifs valides⁵
  • Les valeurs de "files.exemplar" ne doivent pas contenir de doublons
  • La clé "files.editor" est facultative
  • La valeur de "files.editor" doit être un tableau
  • Les valeurs de "files.editor" doivent être des motifs valides⁵
  • Les valeurs de "files.editor" ne doivent pas contenir de doublons
  • La clé "files.invalidator" est facultative
  • La valeur de "files.invalidator" doit être un tableau
  • Les valeurs de "files.invalidator" doivent être des motifs valides⁵
  • Les valeurs de "files.invalidator" ne doivent pas contenir de doublons
  • Un motif ne peut être listé que dans l'un des tableaux "files.solution", "files.test", "files.example", "files.exemplar", "files.editor" ou "files.invalidator" (pas de chevauchement)
    • Si le parcours est d ou plsql, les fichiers de "files.solution" et "files.test" peuvent se chevaucher
    • Les fichiers de "files.example et "files.exemplar" peuvent se chevaucher
  • La clé "test_runner.average_run_time" est requise si "status.test_runner" est égal à true
  • La valeur de "test_runner.average_run_time" doit être un entier > 0
  • La clé "approaches.snippet_extension" est requise si le parcours possède une ou plusieurs approches
  • La valeur de "approaches.snippet_extension" doit être une chaîne non vide¹
  • La clé "exercises" est requise
  • La clé "exercises.concept" est requise
  • La valeur de "exercises.concept" doit être un tableau
  • La clé "exercises.concept[].slug" est requise
  • La valeur de "exercises.concept[].slug" doit être une chaîne en kebab-case² d'une longueur <= 255
  • La valeur de "exercises.concept[].slug" doit être unique dans "exercises.concept[].slug" et ne peut pas exister dans "exercises.practice[].slug"
  • La clé "exercises.concept[].name" est requise
  • La valeur de "exercises.concept[].name" doit être une chaîne en Title Case³ d'une longueur <= 255
  • La clé "exercises.concept[].uuid" est requise
  • La valeur de "exercises.concept[].uuid" doit être une chaîne UUID de version 4 unique⁶
  • La valeur de "exercises.concept[].uuid" de chaque exercice ne doit jamais changer
  • La clé "exercises.concept[].concepts" est requise
  • La valeur de "exercises.concept[].concepts" doit être un tableau de chaînes non vide si "exercises.concept[].status" n'est pas égal à deprecated
  • La valeur de "exercises.concept[].concepts" doit être un tableau vide si "exercises.concept[].status" est égal à deprecated
  • Les valeurs de "exercises.concept[].concepts" doivent être des chaînes en kebab-case²
  • Les valeurs de "exercises.concept[].concepts" ne doivent pas contenir de doublons
  • Les valeurs de "exercises.concept[].concepts" ne doivent pas figurer dans la propriété "concepts" d'un autre exercice d'apprentissage
  • Les valeurs de "exercises.concept[].concepts" doivent correspondre à la propriété "concepts.slug" de l'un des concepts
  • La clé "exercises.concept[].prerequisites" est requise
  • La valeur de "exercises.concept[].prerequisites" doit être un tableau de chaînes non vide si "exercises.concept[].status" n'est pas égal à deprecated, à l'exception d'exactement un exercice, qui est autorisé à avoir un tableau vide comme valeur
  • La valeur de "exercises.concept[].prerequisites" doit être un tableau vide si "exercises.concept[].status" est égal à deprecated
  • Les valeurs de "exercises.concept[].prerequisites" doivent être des chaînes en kebab-case²
  • Les valeurs de "exercises.concept[].prerequisites" ne doivent pas contenir de doublons
  • Les valeurs de "exercises.concept[].prerequisites" doivent correspondre aux valeurs de la propriété "concepts" d'un autre exercice d'apprentissage
  • Les valeurs de "exercises.concept[].prerequisites" ne doivent correspondre à aucune des valeurs de la propriété "exercises.concept[].concepts" de l'exercice
  • Les valeurs de "exercises.concept[].prerequisites" doivent correspondre à la propriété "concepts.slug" de l'un des concepts
  • Il ne doit pas y avoir de cycle entre "exercises.concept[].concepts" et "exercises.concept[].prerequisites"
  • La clé "exercises.concept[].status" est facultative
  • La valeur de "exercises.concept[].status" doit être la chaîne wip, beta, active ou deprecated
  • La clé "exercises.practice" est requise
  • La valeur de "exercises.practice" doit être un tableau
  • La clé "exercises.practice[].slug" est requise
  • La valeur de "exercises.practice[].slug" doit être une chaîne en kebab-case² d'une longueur <= 255
  • La valeur de "exercises.practice[].slug" doit être unique dans "exercises.practice[].slug" et ne peut pas exister dans "exercises.concept[].slug"
  • Il doit y avoir exactement une valeur de "exercises.practice[].slug" égale à la chaîne hello-world
  • La clé "exercises.practice[].name" est requise
  • La valeur de "exercises.practice[].name" doit être une chaîne en Title Case³ d'une longueur <= 255
  • La clé "exercises.practice[].uuid" est requise
  • La valeur de "exercises.practice[].uuid" doit être une chaîne UUID de version 4 unique⁶
  • La valeur de "exercises.practice[].uuid" de chaque exercice ne doit jamais changer
  • La clé "exercises.practice[].difficulty" est requise
  • La valeur de "exercises.practice[].difficulty" doit être un entier >= 1 et <= 10
  • La clé "exercises.practice[].practices" est requise
  • La valeur de "exercises.practice[].practices" doit être un tableau de chaînes non vide si "exercises.practice[].status" n'est pas égal à deprecated
  • La valeur de "exercises.practice[].practices" doit être un tableau vide si "exercises.practice[].status" est égal à deprecated
  • Les valeurs de "exercises.practice[].practices" doivent être des chaînes en kebab-case²
  • Les valeurs de "exercises.practice[].practices" ne doivent pas contenir de doublons
  • Les valeurs de "exercises.practice[].practices" doivent correspondre à la propriété "concepts[].slug" de l'un des concepts
  • Les valeurs de "exercises.practice[].practices" ne doivent pas référencer le slug d'un même concept plus de 10 fois (tous exercices confondus)
  • La clé "exercises.practice[].prerequisites" est requise
  • La valeur de "exercises.practice[].prerequisites" doit être un tableau de chaînes non vide si "exercises.practice[].status" n'est pas égal à deprecated
  • La valeur de "exercises.practice[].prerequisites" doit être un tableau vide si "exercises.practice[].status" est égal à deprecated
  • La valeur de "exercises.practice[].prerequisites" doit être un tableau vide si "exercises.practice[].slug" est égal à hello-world
  • Les valeurs de "exercises.practice[].prerequisites" doivent être des chaînes en kebab-case²
  • Les valeurs de "exercises.practice[].prerequisites" ne doivent pas contenir de doublons
  • Les valeurs de "exercises.practice[].prerequisites" doivent correspondre aux valeurs de "exercises.concept[].concepts" d'un exercice d'apprentissage
  • Les valeurs de "exercises.practice[].prerequisites" doivent correspondre à la propriété "concepts[].slug" de l'un des concepts
  • La clé "exercises.practice[].status" est facultative
  • La valeur de "exercises.practice[].status" doit être la chaîne wip, beta, active ou deprecated
  • La valeur de "exercises.practice[].status" doit, si "exercises.practice[].slug" est égal à hello-world, être soit omise, soit la chaîne active
  • La clé "exercises.foregone" est facultative
  • La valeur de "exercises.foregone" doit être un tableau
  • Les valeurs de "exercises.foregone" doivent être des chaînes en kebab-case²
  • Les valeurs de "exercises.foregone" ne doivent pas contenir de doublons
  • Les valeurs de "exercises.foregone" ne doivent correspondre à aucun des slugs d'exercice d'apprentissage ou d'entraînement
  • La clé "concepts" est requise
  • La valeur de "concepts" doit être un tableau
  • La clé "concepts[].uuid" est requise
  • La valeur de "concepts[].uuid" doit être une chaîne UUID de version 4 unique⁶
  • La valeur de "concepts[].uuid" de chaque concept ne doit jamais changer
  • La clé "concepts[].slug" est requise
  • La valeur de "concepts[].slug" doit être une chaîne en kebab-case² d'une longueur <= 255
  • La clé "concepts[].name" est requise
  • La valeur de "concepts[].name" doit être une chaîne en Title Case³ d'une longueur <= 255
  • La clé "concepts[].tags" est facultative
  • La clé "concepts[].tags.all" est facultative, sauf si "concepts[].tags.any" est vide
  • La valeur de "concepts[].tags.all" doit être un tableau
  • Les valeurs de "concepts[].tags.all" doivent être des chaînes non vides de type tag⁷ d'une longueur <= 255
  • Les valeurs de "concepts[].tags.all" ne doivent pas contenir de doublons
  • La clé "concepts[].tags.any" est facultative, sauf si "concepts[].tags.all" est vide
  • La valeur de "concepts[].tags.any" doit être un tableau
  • Les valeurs de "concepts[].tags.any" doivent être des chaînes non vides de type tag⁷ d'une longueur <= 255
  • Les valeurs de "concepts[].tags.any" ne doivent pas contenir de doublons
  • La clé "concepts[].tags.not" est facultative
  • La valeur de "concepts[].tags.not" doit être un tableau
  • Les valeurs de "concepts[].tags.not" doivent être des chaînes non vides de type tag⁷ d'une longueur <= 255
  • Les valeurs de "concepts[].tags.not" ne doivent pas contenir de doublons
  • Chaque valeur de "concepts" doit avoir un fichier concept/<concepts.slug>/about.md. Les règles de vérification applicables à ce fichier sont décrites ci-dessous.
  • Chaque valeur de "concepts" doit avoir un fichier concept/<concepts.slug>/introduction.md. Les règles de vérification applicables à ce fichier sont décrites ci-dessous.
  • Chaque valeur de "concepts" doit avoir un fichier concept/<concepts.slug>/links.json. Les règles de vérification applicables à ce fichier sont décrites ci-dessous.
  • La clé "key_features" est facultative
  • La valeur de "key_features" doit être un tableau d'une longueur = 6
  • La clé "key_features[].icon" est requise
  • La valeur de "key_features[].icon" doit utiliser l'une des valeurs d'icône prédéfinies
  • La clé "key_features[].title" est requise
  • La valeur de "key_features[].title" doit être une chaîne en Sentence Case⁴ d'une longueur <= 25
  • La clé "key_features[].content" est requise
  • La valeur de "key_features[].content" doit être une chaîne non vide¹ d'une longueur <= 100
  • La clé "tags" est requise
  • La valeur de "tags" doit être un tableau de chaînes
  • Les valeurs de "tags" ne doivent pas contenir de doublons
  • Les valeurs de "tags" doivent utiliser l'une des valeurs de tag prédéfinies

Règle : le fichier exercises/concept/<slug>/.meta/config.json est valide

  • Le fichier doit être un JSON valide
  • La racine JSON doit être un objet
  • La clé "blurb" est requise
  • La valeur de "blurb" doit être une chaîne non vide¹ d'une longueur <= 350
  • La clé "source" est facultative
  • La valeur de "source" doit être une chaîne non vide¹
  • La clé "source_url" est facultative
  • La valeur de "source_url" doit être une URL
  • La clé "authors" est requise
  • La valeur de "authors" doit être un tableau non vide
  • Les valeurs de "authors" doivent être des chaînes non vides¹
  • Les valeurs de "authors" ne doivent pas contenir de doublons
  • Les valeurs de "authors" sont traitées sans tenir compte de la casse
  • La clé "contributors" est facultative
  • La valeur de "contributors" doit être un tableau
  • Les valeurs de "contributors" doivent être des chaînes non vides¹
  • Les valeurs de "contributors" ne doivent pas contenir de doublons
  • Les valeurs de "contributors" sont traitées sans tenir compte de la casse
  • Un utilisateur ne peut figurer que dans le tableau "authors" ou "contributors" (pas de chevauchement)
  • La clé "files.solution" est requise
  • La valeur de "files.solution" doit être un tableau non vide
  • Les valeurs de "files.solution" ne doivent pas contenir de doublons
  • La clé "files.test" est requise
  • La valeur de "files.test" doit être un tableau non vide
  • Les valeurs de "files.test" ne doivent pas contenir de doublons
  • La clé "files.exemplar" est requise
  • La valeur de "files.exemplar" doit être un tableau non vide
  • Les valeurs de "files.exemplar" ne doivent pas contenir de doublons
  • La clé "files.editor" est facultative
  • La valeur de "files.editor" doit être un tableau
  • Les valeurs de "files.editor" ne doivent pas contenir de doublons
  • La clé "files.invalidator" est facultative
  • La valeur de "files.invalidator" doit être un tableau
  • Les valeurs de "files.invalidator" ne doivent pas contenir de doublons
  • Les fichiers listés dans "files.solution" doivent exister
  • Les fichiers listés dans "files.test" doivent exister
  • Les fichiers listés dans "files.exemplar" doivent exister
  • Les fichiers listés dans "files.editor" doivent exister
  • Les fichiers listés dans "files.invalidator" doivent exister
  • Un fichier ne peut être listé que dans l'un des tableaux "files.solution", "files.test", "files.exemplar" ou "files.invalidator" (pas de chevauchement)
    • Si le parcours est d ou plsql, les fichiers de "files.solution" et "files.test" peuvent se chevaucher
  • La clé "forked_from" est facultative
  • La valeur de "forked_from" doit être un tableau
  • Les valeurs de "forked_from" doivent être des chaînes au format <track-slug>/<exercise-slug> (par ex. fsharp/bird-watcher)
  • Les valeurs de "forked_from" doivent référencer des exercices réellement implémentés
  • Les valeurs de "forked_from" ne doivent pas contenir de doublons
  • La clé "language_versions" est facultative
  • La valeur de "language_versions" doit être une chaîne
  • La clé "representer.version" est facultative
  • La valeur de "representer.version" doit être un entier >= 1
  • La clé "icon" est facultative
  • La valeur de "icon" doit être une chaîne en kebab-case²

Règle : le fichier exercises/concept/<slug>/.docs/hints.md est valide

  • Le Markdown doit être conforme aux normes Markdown
  • Tous les titres doivent être soit ## General, soit ## X. <task>, où X correspond au numéro de tâche du titre dans instructions.md
  • Tous les indices doivent être présentés sous forme d'éléments de liste Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier exercises/concept/<slug>/.docs/instructions.md est valide

  • Le Markdown doit être conforme aux normes Markdown
  • Toutes les tâches doivent commencer par un titre de niveau deux qui débute par un nombre suivi d'un point : ## 1. Do X
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier exercises/concept/<slug>/.docs/instructions.md.tpl est valide (s'il est présent)

  • Le concept de chaque espace réservé de concept doit correspondre à la propriété "concepts.slug" de l'un des concepts du config.json du parcours.

Règle : le fichier exercises/concept/<slug>/.docs/introduction.md est valide

  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier exercises/practice/<slug>/.meta/config.json est valide

  • Le fichier doit être un JSON valide
  • La racine JSON doit être un objet
  • La clé "blurb" est requise
  • La valeur de "blurb" doit être une chaîne non vide¹ d'une longueur <= 350
  • La clé "source" est facultative
  • La valeur de "source" doit être une chaîne non vide¹
  • La clé "source_url" est facultative
  • La valeur de "source_url" doit être une URL
  • La clé "authors" est facultative
  • La valeur de "authors" doit être un tableau
  • Les valeurs de "authors" doivent être des chaînes non vides¹
  • Les valeurs de "authors" ne doivent pas contenir de doublons
  • Les valeurs de "authors" sont traitées sans tenir compte de la casse
  • La clé "contributors" est facultative
  • La valeur de "contributors" doit être un tableau
  • Les valeurs de "contributors" doivent être des chaînes non vides¹
  • Les valeurs de "contributors" ne doivent pas contenir de doublons
  • Les valeurs de "contributors" sont traitées sans tenir compte de la casse
  • Un utilisateur ne peut figurer que dans le tableau "authors" ou "contributors" (pas de chevauchement)
  • La clé "files.solution" est requise
  • La valeur de "files.solution" doit être un tableau non vide
  • Les valeurs de "files.solution" ne doivent pas contenir de doublons
  • La clé "files.test" est requise
  • La valeur de "files.test" doit être un tableau non vide
  • Les valeurs de "files.test" ne doivent pas contenir de doublons
  • La clé "files.example" est requise
  • La valeur de "files.example" doit être un tableau non vide
  • Les valeurs de "files.example" ne doivent pas contenir de doublons
  • La clé "files.editor" est facultative
  • La valeur de "files.editor" doit être un tableau
  • Les valeurs de "files.editor" ne doivent pas contenir de doublons
  • La clé "files.invalidator" est facultative
  • La valeur de "files.invalidator" doit être un tableau
  • Les valeurs de "files.invalidator" ne doivent pas contenir de doublons
  • Les fichiers listés dans "files.solution" doivent exister
  • Les fichiers listés dans "files.test" doivent exister
  • Les fichiers listés dans "files.example" doivent exister
  • Les fichiers listés dans "files.editor" doivent exister
  • Les fichiers listés dans "files.invalidator" doivent exister
  • Un fichier ne peut être listé que dans l'un des tableaux "files.solution", "files.test", "files.example ou "files.invalidator" (pas de chevauchement)
    • Si le parcours est d ou plsql, les fichiers de "files.solution" et "files.test" peuvent se chevaucher
  • La clé "language_versions" est facultative
  • La valeur de "language_versions" doit être une chaîne
  • La clé "test_runner" est facultative
  • La valeur de "test_runner" doit être un booléen
  • La clé "representer.version" est facultative
  • La valeur de "representer.version" doit être un entier >= 1
  • La clé "icon" est facultative
  • La valeur de "icon" doit être une chaîne en kebab-case²

Règle : le fichier exercises/{concept|practice}/<slug>/.approaches/config.json est valide

  • La présence du fichier est facultative, sauf s'il existe un fichier introduction.md ou un répertoire voisin
  • Le fichier doit être un JSON valide
  • La racine JSON doit être un objet
  • La clé "introduction.authors" est facultative
  • La valeur de "introduction.authors" doit être un tableau
  • Les valeurs de "introduction.authors" doivent être des chaînes non vides¹
  • Les valeurs de "introduction.authors" ne doivent pas contenir de doublons
  • Les valeurs de "introduction.authors" sont traitées sans tenir compte de la casse
  • Si le tableau "introduction.authors" n'est pas vide, il doit exister un fichier introduction.md non vide
  • La clé "introduction.contributors" est facultative
  • La valeur de "introduction.contributors" doit être un tableau
  • Les valeurs de "introduction.contributors" doivent être des chaînes non vides¹
  • Les valeurs de "introduction.contributors" ne doivent pas contenir de doublons
  • Les valeurs de "introduction.contributors" sont traitées sans tenir compte de la casse
  • Si le tableau "introduction.contributors" n'est pas vide, il doit exister un fichier introduction.md non vide
  • Un utilisateur ne peut figurer que dans le tableau "introduction.authors" ou "introduction.contributors" (pas de chevauchement)
  • La clé "approaches" est facultative, sauf s'il existe un répertoire voisin (qui contient les fichiers de l'approche)
  • La valeur de "approaches" doit être un tableau d'objets
  • La clé "approaches[].uuid" est requise
  • La valeur de "approaches[].uuid" doit être une chaîne UUID de version 4 unique⁶
  • La valeur de "approaches[].uuid" de chaque concept ne doit jamais changer
  • La clé "approaches[].slug" est requise
  • La valeur de "approaches[].slug" doit être une chaîne en kebab-case² d'une longueur <= 255
  • La valeur de "approaches[].slug" doit avoir un fichier <slug>/content.md non vide correspondant
  • La valeur de "approaches[].slug" doit avoir un fichier <slug>/snippet.txt non vide correspondant
  • La clé "approaches[].title" est requise
  • La valeur de "approaches[].title" doit être une chaîne en Title Case³ d'une longueur <= 255
  • La clé "approaches[].blurb" est requise
  • La valeur de "approaches[].blurb" doit être une chaîne non vide¹ d'une longueur <= 350
  • La clé "approaches[].authors" est requise
  • La valeur de "approaches[].authors" doit être un tableau non vide
  • Les valeurs de "approaches[].authors" doivent être des chaînes non vides¹
  • Les valeurs de "approaches[].authors" ne doivent pas contenir de doublons
  • Les valeurs de "approaches[].authors" sont traitées sans tenir compte de la casse
  • La clé "approaches[].contributors" est facultative
  • La valeur de "approaches[].contributors" doit être un tableau
  • Les valeurs de "approaches[].contributors" doivent être des chaînes non vides¹
  • Les valeurs de "approaches[].contributors" ne doivent pas contenir de doublons
  • Les valeurs de "approaches[].contributors" sont traitées sans tenir compte de la casse
  • Un utilisateur ne peut figurer que dans le tableau "approaches[].authors" ou "approaches[].contributors" (pas de chevauchement)
  • La clé "approaches[].tags" est facultative
  • La clé "approaches[].tags.all" est facultative, sauf si "approaches[].tags.any" est vide
  • La valeur de "approaches[].tags.all" doit être un tableau
  • Les valeurs de "approaches[].tags.all" doivent être des chaînes non vides de type tag⁷ d'une longueur <= 255
  • Les valeurs de "approaches[].tags.all" ne doivent pas contenir de doublons
  • La clé "approaches[].tags.any" est facultative, sauf si "approaches[].tags.all" est vide
  • La valeur de "approaches[].tags.any" doit être un tableau
  • Les valeurs de "approaches[].tags.any" doivent être des chaînes non vides de type tag⁷ d'une longueur <= 255
  • Les valeurs de "approaches[].tags.any" ne doivent pas contenir de doublons
  • La clé "approaches[].tags.not" est facultative
  • La valeur de "approaches[].tags.not" doit être un tableau
  • Les valeurs de "approaches[].tags.not" doivent être des chaînes non vides de type tag⁷ d'une longueur <= 255
  • Les valeurs de "approaches[].tags.not" ne doivent pas contenir de doublons

Règle : le fichier exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/content.md est valide

  • La présence du fichier est requise si une entrée "approaches[].slug" correspondante existe dans le fichier .approaches/config.json
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/snippet.<snippet-extension> est valide

  • La présence du fichier est requise si une entrée "approaches[].slug" correspondante existe dans le fichier .approaches/config.json
  • L'extrait ne doit pas dépasser 8 lignes
  • L'extension de l'extrait est reprise de la valeur approaches.snippet_extension du fichier config.json du parcours

Règle : le fichier exercises/{concept|practice}/<slug>/.articles/config.json est valide

  • La présence du fichier est facultative, sauf s'il existe un répertoire voisin
  • Le fichier doit être un JSON valide
  • La racine JSON doit être un objet
  • La clé "articles" est facultative, sauf s'il existe un répertoire voisin (qui contient les fichiers de l'article)
  • La valeur de "articles" doit être un tableau d'objets
  • La clé "articles[].uuid" est requise
  • La valeur de "articles[].uuid" doit être une chaîne UUID de version 4 unique⁶
  • La valeur de "articles[].uuid" de chaque concept ne doit jamais changer
  • La clé "articles[].slug" est requise
  • La valeur de "articles[].slug" doit être une chaîne en kebab-case² d'une longueur <= 255
  • La valeur de "articles[].slug" doit avoir un fichier <slug>/content.md non vide correspondant
  • La valeur de "articles[].slug" doit avoir un fichier <slug>/snippet.md non vide correspondant
  • La clé "articles[].title" est requise
  • La valeur de "articles[].title" doit être une chaîne en Title Case³ d'une longueur <= 255
  • La clé "articles[].blurb" est requise
  • La valeur de "articles[].blurb" doit être une chaîne non vide¹ d'une longueur <= 350
  • La clé "articles[].authors" est requise
  • La valeur de "articles[].authors" doit être un tableau non vide
  • Les valeurs de "articles[].authors" doivent être des chaînes non vides¹
  • Les valeurs de "articles[].authors" ne doivent pas contenir de doublons
  • Les valeurs de "articles[].authors" sont traitées sans tenir compte de la casse
  • La clé "articles[].contributors" est facultative
  • La valeur de "articles[].contributors" doit être un tableau
  • Les valeurs de "articles[].contributors" doivent être des chaînes non vides¹
  • Les valeurs de "articles[].contributors" ne doivent pas contenir de doublons
  • Les valeurs de "articles[].contributors" sont traitées sans tenir compte de la casse
  • Un utilisateur ne peut figurer que dans le tableau "articles[].authors" ou "articles[].contributors" (pas de chevauchement)

Règle : le fichier exercises/{concept|practice}/<slug>/.articles/<article-slug>/content.md est valide

  • La présence du fichier est requise si une entrée "articles[].slug" correspondante existe dans le fichier .articles/config.json
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier exercises/{concept|practice}/<slug>/.articles/<article-slug>/snippet.md est valide

  • La présence du fichier est requise si une entrée "articles[].slug" correspondante existe dans le fichier .articles/config.json
  • Le Markdown doit être conforme aux normes Markdown
  • L'extrait ne doit pas dépasser 8 lignes (les marqueurs de bloc de code au début et à la fin sont ignorés)

Règle : le fichier exercises/shared/.docs/debug.md est valide

  • La présence du fichier est facultative
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier exercises/shared/.docs/help.md est valide

  • La présence du fichier est requise
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier exercises/shared/.docs/tests.md est valide

  • La présence du fichier est requise
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier concepts/<slug>/about.md est valide

  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier concepts/<slug>/introduction.md est valide

  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)
  • Le fichier doit être un JSON valide
  • La racine JSON doit être un tableau
  • La propriété "[].url" est requise
  • La valeur de "[].url" doit être une URL
  • La propriété "[].description" est requise
  • La valeur de "[].description" doit être une chaîne non vide¹
  • La propriété "[].icon_url" est facultative
  • La valeur de "[].icon_url" doit être une URL

Règle : le fichier concept/<slug>/.meta/config.json est valide

  • Le fichier doit être un JSON valide
  • La racine JSON doit être un objet
  • La clé "blurb" est requise
  • La valeur de "blurb" doit être une chaîne non vide¹ d'une longueur <= 350
  • La clé "authors" est requise
  • La valeur de "authors" doit être un tableau
  • Les valeurs de "authors" doivent être des chaînes non vides¹
  • Les valeurs de "authors" ne doivent pas contenir de doublons
  • Les valeurs de "authors" sont traitées sans tenir compte de la casse
  • La clé "contributors" est facultative
  • La valeur de "contributors" doit être un tableau
  • Les valeurs de "contributors" doivent être des chaînes non vides¹
  • Les valeurs de "contributors" ne doivent pas contenir de doublons
  • Les valeurs de "contributors" sont traitées sans tenir compte de la casse
  • Un utilisateur ne peut figurer que dans le tableau "authors" ou "contributors" (pas de chevauchement)

Règle : le fichier docs/ABOUT.md est valide

  • La présence du fichier est requise
  • Le contenu du fichier ne doit pas être vide
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier docs/INSTALLATION.md est valide

  • La présence du fichier est requise
  • Le contenu du fichier ne doit pas être vide
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier docs/LEARNING.md est valide

  • La présence du fichier est requise
  • Le contenu du fichier ne doit pas être vide
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier docs/RESOURCES.md est valide

  • La présence du fichier est requise
  • Le contenu du fichier ne doit pas être vide
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Règle : le fichier docs/SNIPPET.txt est valide

  • La présence du fichier est requise
  • Le contenu du fichier ne doit pas être vide

Règle : le fichier docs/TESTS.md est valide

  • La présence du fichier est requise
  • Le contenu du fichier ne doit pas être vide
  • Le Markdown doit être conforme aux normes Markdown
  • Les liens doivent être absolus (les liens relatifs ne sont pas autorisés)

Glossaire

  1. Chaîne non vide : une chaîne qui contient au moins un caractère autre qu'un espace.

  2. Chaîne en kebab-case : une chaîne qui ne contient que des caractères de l'intervalle [a-z0-9], éventuellement séparés par des tirets (par ex. « two-fer »). Elle doit correspondre à l'expression régulière : ^[a-z0-9]+(-[a-z0-9]+)*$

  3. Chaîne en Title Case : une chaîne non vide qui suit les règles du Chicago Manual of Style ci-dessous :

    • Mets une majuscule au premier et au dernier mot des titres et des sous-titres.
    • Mets une majuscule aux mots « majeurs » (noms, pronoms, verbes, adjectifs, adverbes et certaines conjonctions).
    • Laisse en minuscules les conjonctions and, but, for, or et nor.
    • Laisse en minuscules les articles the, a et an.
    • Laisse en minuscules les prépositions, quelle que soit leur longueur, sauf lorsqu'elles sont accentuées, employées comme adverbes ou adjectifs, ou utilisées comme conjonctions.
    • Laisse en minuscules les mots to et as.
    • Laisse en minuscules la seconde partie des noms d'espèces latins.
  4. Chaîne en Sentence Case : une chaîne non vide qui suit les règles ci-dessous :

    • Mets une majuscule au premier mot de la phrase, ainsi qu'aux noms propres et aux autres mots lorsque qu'une règle plus spécifique l'exige.
  5. Motif files valide : une chaîne non vide¹ qui désigne l'emplacement d'un fichier utilisé dans un exercice, relativement au répertoire de l'exercice. Un motif peut utiliser l'un des espaces réservés suivants :

    • %{kebab_slug} : le slug d'exercice en kebab-case (par ex. bit-manipulation)
    • %{snake_slug} : le slug d'exercice en snake_case (par ex. bit_manipulation)
    • %{camel_slug} : le slug d'exercice en camelCase (par ex. bitManipulation)
    • %{pascal_slug} : le slug d'exercice en PascalCase (par ex. BitManipulation)
  6. Chaîne UUID de version 4 unique : une chaîne qui remplit toutes les conditions suivantes :

    • Elle n'existe qu'une seule fois dans le fichier config.json au niveau du parcours, pour un parcours Exercism donné
    • Elle n'existe pas dans le fichier config.json au niveau du parcours d'aucun autre parcours Exercism
    • Elle n'existe dans aucun fichier canonical-data.json de https://github.com/exercism/problem-specifications
    • Elle n'existe nulle part ailleurs sur Exercism
    • Elle correspond à l'expression régulière :
    ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    

    Par exemple, l'UUID ci-dessous a la forme correcte :

    d334ffe3-657e-4725-a950-290b284b6d9f
    

    Tu peux exécuter configlet uuid pour générer un UUID approprié.

  7. tag d'analyseur valide : une chaîne non vide¹ au format <category>:<thing>. La valeur de <category> doit être l'une des suivantes :

  • paradigm (par ex. paradigm:functional)
  • technique (par ex. technique:recursion)
  • construct (par ex. construct:bitwise-and)
  • uses (par ex. uses:DateTime.add_seconds)

La valeur de <thing> doit être une chaîne non vide¹.