configlet lint


Il principale utilizzo di configlet è il linting: controllare se i file di configurazione di una traccia sono strutturati correttamente, sia sintatticamente che semanticamente. Le tracce configurate male potrebbero non sincronizzarsi correttamente, apparire sbagliate sul sito web o offrire un'esperienza utente non ottimale, quindi i controlli di configlet svolgono un ruolo importante nel preservare l'integrità di Exercism.

Utilizzo

Il comando lint può essere usato per fare il linting di una traccia.

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]

Regole

Queste sono le regole di linting che vengono controllate.

Regola: i file obbligatori sono presenti

Il linter dovrebbe controllare se tutti i file obbligatori sono presenti. I file non specifici di un esercizio che devono essere presenti sono:

  • 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

I file specifici degli esercizi concettuali che devono essere presenti sono:

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

Ci sarà un elenco simile per gli esercizi pratici, ma non abbiamo ancora definito la specifica per questo.

Ogni concetto elencato nel config.json dovrebbe avere i seguenti file:

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

Regola: il file config.json è valido

Il file config.json dovrebbe superare i seguenti controlli:

  • Il file deve essere JSON valido
  • La chiave "language" è obbligatoria
  • Il valore di "language" deve essere una stringa non vuota¹ con lunghezza <= 255
  • La chiave "slug" è obbligatoria
  • Il valore di "slug" deve essere una stringa in kebab-case² con lunghezza <= 255
  • La chiave "active" è obbligatoria
  • Il valore di "active" deve essere un booleano
  • La chiave "blurb" è obbligatoria
  • Il valore di "blurb" deve essere una stringa non vuota¹ con lunghezza <= 400
  • La chiave "version" è obbligatoria
  • Il valore di "version" deve essere il numero intero 3
  • La chiave "status.concept_exercises" è obbligatoria
  • Il valore di "status.concept_exercises" deve essere un booleano
  • La chiave "status.test_runner" è obbligatoria
  • Il valore di "status.test_runner" deve essere un booleano
  • La chiave "status.representer" è obbligatoria
  • Il valore di "status.representer" deve essere un booleano
  • La chiave "status.analyzer" è obbligatoria
  • Il valore di "status.analyzer" deve essere un booleano
  • La chiave "online_editor.indent_style" è obbligatoria
  • Il valore di "online_editor.indent_style" deve essere la stringa space o tab
  • La chiave "online_editor.indent_size" è obbligatoria
  • Il valore di "online_editor.indent_size" deve essere un numero intero >= 0 e <= 8
  • La chiave "online_editor.highlightjs_language" è opzionale
  • Il valore di "online_editor.highlightjs_language" deve essere una stringa non vuota¹
  • La chiave "files" è opzionale
  • Il valore di "files" deve essere un oggetto
  • La chiave "files.solution" è opzionale
  • Il valore di "files.solution" deve essere un array
  • I valori di "files.solution" devono essere pattern validi⁵
  • I valori di "files.solution" non devono avere duplicati
  • La chiave "files.test" è opzionale
  • Il valore di "files.test" deve essere un array
  • I valori di "files.test" devono essere pattern validi⁵
  • I valori di "files.test" non devono avere duplicati
  • La chiave "files.example" è opzionale
  • Il valore di "files.example" deve essere un array
  • I valori di "files.example" devono essere pattern validi⁵
  • I valori di "files.example" non devono avere duplicati
  • La chiave "files.exemplar" è opzionale
  • Il valore di "files.exemplar" deve essere un array
  • I valori di "files.exemplar" devono essere pattern validi⁵
  • I valori di "files.exemplar" non devono avere duplicati
  • La chiave "files.editor" è opzionale
  • Il valore di "files.editor" deve essere un array
  • I valori di "files.editor" devono essere pattern validi⁵
  • I valori di "files.editor" non devono avere duplicati
  • La chiave "files.invalidator" è opzionale
  • Il valore di "files.invalidator" deve essere un array
  • I valori di "files.invalidator" devono essere pattern validi⁵
  • I valori di "files.invalidator" non devono avere duplicati
  • I pattern possono essere elencati solo nell'array "files.solution", "files.test", "files.example", "files.exemplar", "files.editor" o "files.invalidator" (nessuna sovrapposizione)
    • Se la traccia è d o plsql, i file di "files.solution" e "files.test" possono sovrapporsi
    • I file di "files.example e "files.exemplar" possono sovrapporsi
  • La chiave "test_runner.average_run_time" è obbligatoria se "status.test_runner" è uguale a true
  • Il valore di "test_runner.average_run_time" deve essere un numero intero > 0
  • La chiave "approaches.snippet_extension" è obbligatoria se la traccia ha uno o più approcci
  • Il valore di "approaches.snippet_extension" deve essere una stringa non vuota¹
  • La chiave "exercises" è obbligatoria
  • La chiave "exercises.concept" è obbligatoria
  • Il valore di "exercises.concept" deve essere un array
  • La chiave "exercises.concept[].slug" è obbligatoria
  • Il valore di "exercises.concept[].slug" deve essere una stringa in kebab-case² con lunghezza <= 255
  • Il valore di "exercises.concept[].slug" deve essere univoco in "exercises.concept[].slug" e non può esistere in "exercises.practice[].slug"
  • La chiave "exercises.concept[].name" è obbligatoria
  • Il valore di "exercises.concept[].name" deve essere una stringa in Title Case³ con lunghezza <= 255
  • La chiave "exercises.concept[].uuid" è obbligatoria
  • Il valore di "exercises.concept[].uuid" deve essere una stringa UUID versione 4 univoca⁶
  • Il valore di "exercises.concept[].uuid" di ogni esercizio non deve mai cambiare
  • La chiave "exercises.concept[].concepts" è obbligatoria
  • Il valore di "exercises.concept[].concepts" deve essere un array non vuoto di stringhe se "exercises.concept[].status" non è uguale a deprecated
  • Il valore di "exercises.concept[].concepts" deve essere un array vuoto se "exercises.concept[].status" è uguale a deprecated
  • I valori di "exercises.concept[].concepts" devono essere stringhe in kebab-case²
  • I valori di "exercises.concept[].concepts" non devono avere duplicati
  • I valori di "exercises.concept[].concepts" non devono trovarsi nella proprietà "concepts" di nessun altro esercizio concettuale
  • I valori di "exercises.concept[].concepts" devono corrispondere alla proprietà "concepts.slug" di uno dei concetti
  • La chiave "exercises.concept[].prerequisites" è obbligatoria
  • Il valore di "exercises.concept[].prerequisites" deve essere un array non vuoto di stringhe se "exercises.concept[].status" non è uguale a deprecated, tranne che per esattamente un esercizio a cui è consentito avere un array vuoto come valore
  • Il valore di "exercises.concept[].prerequisites" deve essere un array vuoto se "exercises.concept[].status" è uguale a deprecated
  • I valori di "exercises.concept[].prerequisites" devono essere stringhe in kebab-case²
  • I valori di "exercises.concept[].prerequisites" non devono avere duplicati
  • I valori di "exercises.concept[].prerequisites" devono corrispondere ai valori della proprietà "concepts" di un altro esercizio concettuale
  • I valori di "exercises.concept[].prerequisites" non devono corrispondere a nessuno dei valori nella proprietà "exercises.concept[].concepts" dell'esercizio
  • I valori di "exercises.concept[].prerequisites" devono corrispondere alla proprietà "concepts.slug" di uno dei concetti
  • Non deve esserci nessun ciclo tra "exercises.concept[].concepts" e "exercises.concept[].prerequisites"
  • La chiave "exercises.concept[].status" è opzionale
  • Il valore di "exercises.concept[].status" deve essere la stringa wip, beta, active o deprecated
  • La chiave "exercises.practice" è obbligatoria
  • Il valore di "exercises.practice" deve essere un array
  • La chiave "exercises.practice[].slug" è obbligatoria
  • Il valore di "exercises.practice[].slug" deve essere una stringa in kebab-case² con lunghezza <= 255
  • Il valore di "exercises.practice[].slug" deve essere univoco in "exercises.practice[].slug" e non può esistere in "exercises.concept[].slug"
  • Deve esserci esattamente un valore di "exercises.practice[].slug" che è la stringa hello-world
  • La chiave "exercises.practice[].name" è obbligatoria
  • Il valore di "exercises.practice[].name" deve essere una stringa in Title Case³ con lunghezza <= 255
  • La chiave "exercises.practice[].uuid" è obbligatoria
  • Il valore di "exercises.practice[].uuid" deve essere una stringa UUID versione 4 univoca⁶
  • Il valore di "exercises.practice[].uuid" di ogni esercizio non deve mai cambiare
  • La chiave "exercises.practice[].difficulty" è obbligatoria
  • Il valore di "exercises.practice[].difficulty" deve essere un numero intero >= 1 e <= 10
  • La chiave "exercises.practice[].practices" è obbligatoria
  • Il valore di "exercises.practice[].practices" deve essere un array non vuoto di stringhe se "exercises.practice[].status" non è uguale a deprecated
  • Il valore di "exercises.practice[].practices" deve essere un array vuoto se "exercises.practice[].status" è uguale a deprecated
  • I valori di "exercises.practice[].practices" devono essere stringhe in kebab-case²
  • I valori di "exercises.practice[].practices" non devono avere duplicati
  • I valori di "exercises.practice[].practices" devono corrispondere alla proprietà "concepts[].slug" di uno dei concetti
  • I valori di "exercises.practice[].practices" devono riferirsi allo slug di un singolo concetto al massimo 10 volte (in tutti gli esercizi)
  • La chiave "exercises.practice[].prerequisites" è obbligatoria
  • Il valore di "exercises.practice[].prerequisites" deve essere un array non vuoto di stringhe se "exercises.practice[].status" non è uguale a deprecated
  • Il valore di "exercises.practice[].prerequisites" deve essere un array vuoto se "exercises.practice[].status" è uguale a deprecated
  • Il valore di "exercises.practice[].prerequisites" deve essere un array vuoto se "exercises.practice[].slug" è uguale a hello-world
  • I valori di "exercises.practice[].prerequisites" devono essere stringhe in kebab-case²
  • I valori di "exercises.practice[].prerequisites" non devono avere duplicati
  • I valori di "exercises.practice[].prerequisites" devono corrispondere ai valori di "exercises.concept[].concepts" di un esercizio concettuale
  • I valori di "exercises.practice[].prerequisites" devono corrispondere alla proprietà "concepts[].slug" di uno dei concetti
  • La chiave "exercises.practice[].status" è opzionale
  • Il valore di "exercises.practice[].status" deve essere la stringa wip, beta, active o deprecated
  • Il valore di "exercises.practice[].status", se "exercises.practice[].slug" è uguale a hello-world, deve essere omesso oppure essere la stringa active
  • La chiave "exercises.foregone" è opzionale
  • Il valore di "exercises.foregone" deve essere un array
  • I valori di "exercises.foregone" devono essere stringhe in kebab-case²
  • I valori di "exercises.foregone" non devono avere duplicati
  • I valori di "exercises.foregone" non devono corrispondere a nessuno degli slug degli esercizi concettuali o pratici
  • La chiave "concepts" è obbligatoria
  • Il valore di "concepts" deve essere un array
  • La chiave "concepts[].uuid" è obbligatoria
  • Il valore di "concepts[].uuid" deve essere una stringa UUID versione 4 univoca⁶
  • Il valore di "concepts[].uuid" di ogni concetto non deve mai cambiare
  • La chiave "concepts[].slug" è obbligatoria
  • Il valore di "concepts[].slug" deve essere una stringa in kebab-case² con lunghezza <= 255
  • La chiave "concepts[].name" è obbligatoria
  • Il valore di "concepts[].name" deve essere una stringa in Title Case³ con lunghezza <= 255
  • La chiave "concepts[].tags" è opzionale
  • La chiave "concepts[].tags.all" è opzionale, a meno che "concepts[].tags.any" sia vuoto
  • Il valore di "concepts[].tags.all" deve essere un array
  • I valori di "concepts[].tags.all" devono essere stringhe tag⁷ non vuote con lunghezza <= 255
  • I valori di "concepts[].tags.all" non devono avere duplicati
  • La chiave "concepts[].tags.any" è opzionale, a meno che "concepts[].tags.all" sia vuoto
  • Il valore di "concepts[].tags.any" deve essere un array
  • I valori di "concepts[].tags.any" devono essere stringhe tag⁷ non vuote con lunghezza <= 255
  • I valori di "concepts[].tags.any" non devono avere duplicati
  • La chiave "concepts[].tags.not" è opzionale
  • Il valore di "concepts[].tags.not" deve essere un array
  • I valori di "concepts[].tags.not" devono essere stringhe tag⁷ non vuote con lunghezza <= 255
  • I valori di "concepts[].tags.not" non devono avere duplicati
  • Ogni valore di "concepts" deve avere un file concept/<concepts.slug>/about.md. Le regole di linting per questo file sono specificate di seguito.
  • Ogni valore di "concepts" deve avere un file concept/<concepts.slug>/introduction.md. Le regole di linting per questo file sono specificate di seguito.
  • Ogni valore di "concepts" deve avere un file concept/<concepts.slug>/links.json. Le regole di linting per questo file sono specificate di seguito.
  • La chiave "key_features" è opzionale
  • Il valore di "key_features" deve essere un array con lunghezza = 6
  • La chiave "key_features[].icon" è obbligatoria
  • Il valore di "key_features[].icon" deve usare uno dei valori di icona predefiniti
  • La chiave "key_features[].title" è obbligatoria
  • Il valore di "key_features[].title" deve essere una stringa in Sentence Case⁴ con lunghezza <= 25
  • La chiave "key_features[].content" è obbligatoria
  • Il valore di "key_features[].content" deve essere una stringa non vuota¹ con lunghezza <= 100
  • La chiave "tags" è obbligatoria
  • Il valore di "tags" deve essere un array di stringhe
  • I valori di "tags" non devono avere duplicati
  • I valori di "tags" devono usare uno dei valori di tag predefiniti

Regola: exercises/concept/<slug>/.meta/config.json è valido

  • Il file deve essere JSON valido
  • La radice JSON deve essere un oggetto
  • La chiave "blurb" è obbligatoria
  • Il valore di "blurb" deve essere una stringa non vuota¹ con lunghezza <= 350
  • La chiave "source" è opzionale
  • Il valore di "source" deve essere una stringa non vuota¹
  • La chiave "source_url" è opzionale
  • Il valore di "source_url" deve essere un URL
  • La chiave "authors" è obbligatoria
  • Il valore di "authors" deve essere un array non vuoto
  • I valori di "authors" devono essere stringhe non vuote¹
  • I valori di "authors" non devono avere duplicati
  • I valori di "authors" sono trattati senza distinzione tra maiuscole e minuscole
  • La chiave "contributors" è opzionale
  • Il valore di "contributors" deve essere un array
  • I valori di "contributors" devono essere stringhe non vuote¹
  • I valori di "contributors" non devono avere duplicati
  • I valori di "contributors" sono trattati senza distinzione tra maiuscole e minuscole
  • Gli utenti possono essere elencati solo nell'array "authors" o "contributors" (nessuna sovrapposizione)
  • La chiave "files.solution" è obbligatoria
  • Il valore di "files.solution" deve essere un array non vuoto
  • I valori di "files.solution" non devono avere duplicati
  • La chiave "files.test" è obbligatoria
  • Il valore di "files.test" deve essere un array non vuoto
  • I valori di "files.test" non devono avere duplicati
  • La chiave "files.exemplar" è obbligatoria
  • Il valore di "files.exemplar" deve essere un array non vuoto
  • I valori di "files.exemplar" non devono avere duplicati
  • La chiave "files.editor" è opzionale
  • Il valore di "files.editor" deve essere un array
  • I valori di "files.editor" non devono avere duplicati
  • La chiave "files.invalidator" è opzionale
  • Il valore di "files.invalidator" deve essere un array
  • I valori di "files.invalidator" non devono avere duplicati
  • I file elencati in "files.solution" devono esistere
  • I file elencati in "files.test" devono esistere
  • I file elencati in "files.exemplar" devono esistere
  • I file elencati in "files.editor" devono esistere
  • I file elencati in "files.invalidator" devono esistere
  • I file possono essere elencati solo nell'array "files.solution", "files.test", "files.exemplar" o "files.invalidator" (nessuna sovrapposizione)
    • Se la traccia è d o plsql, i file di "files.solution" e "files.test" possono sovrapporsi
  • La chiave "forked_from" è opzionale
  • Il valore di "forked_from" deve essere un array
  • I valori di "forked_from" devono essere stringhe formattate come <track-slug>/<exercise-slug> (ad es. fsharp/bird-watcher)
  • I valori di "forked_from" devono riferirsi a esercizi effettivamente implementati
  • I valori di "forked_from" non devono avere duplicati
  • La chiave "language_versions" è opzionale
  • Il valore di "language_versions" deve essere una stringa
  • La chiave "representer.version" è opzionale
  • Il valore di "representer.version" deve essere un numero intero >= 1
  • La chiave "icon" è opzionale
  • Il valore di "icon" deve essere una stringa in kebab-case²

Regola: exercises/concept/<slug>/.docs/hints.md è valido

  • Il Markdown deve essere conforme agli standard Markdown
  • Tutte le intestazioni devono essere ## General oppure ## X. <task>, dove X corrisponde all'intestazione del numero del task nelle instructions.md
  • Tutti i suggerimenti devono essere specificati come elementi di un elenco Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: exercises/concept/<slug>/.docs/instructions.md è valido

  • Il Markdown deve essere conforme agli standard Markdown
  • Tutti i task devono iniziare con un'intestazione di livello due che inizia con un numero seguito da un punto: ## 1. Do X
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: exercises/concept/<slug>/.docs/instructions.md.tpl è valido (se presente)

  • Il concetto di ogni segnaposto di concetto deve corrispondere alla proprietà "concepts.slug" di uno dei concetti nel config.json della traccia.

Regola: exercises/concept/<slug>/.docs/introduction.md è valido

  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: exercises/practice/<slug>/.meta/config.json è valido

  • Il file deve essere JSON valido
  • La radice JSON deve essere un oggetto
  • La chiave "blurb" è obbligatoria
  • Il valore di "blurb" deve essere una stringa non vuota¹ con lunghezza <= 350
  • La chiave "source" è opzionale
  • Il valore di "source" deve essere una stringa non vuota¹
  • La chiave "source_url" è opzionale
  • Il valore di "source_url" deve essere un URL
  • La chiave "authors" è opzionale
  • Il valore di "authors" deve essere un array
  • I valori di "authors" devono essere stringhe non vuote¹
  • I valori di "authors" non devono avere duplicati
  • I valori di "authors" sono trattati senza distinzione tra maiuscole e minuscole
  • La chiave "contributors" è opzionale
  • Il valore di "contributors" deve essere un array
  • I valori di "contributors" devono essere stringhe non vuote¹
  • I valori di "contributors" non devono avere duplicati
  • I valori di "contributors" sono trattati senza distinzione tra maiuscole e minuscole
  • Gli utenti possono essere elencati solo nell'array "authors" o "contributors" (nessuna sovrapposizione)
  • La chiave "files.solution" è obbligatoria
  • Il valore di "files.solution" deve essere un array non vuoto
  • I valori di "files.solution" non devono avere duplicati
  • La chiave "files.test" è obbligatoria
  • Il valore di "files.test" deve essere un array non vuoto
  • I valori di "files.test" non devono avere duplicati
  • La chiave "files.example" è obbligatoria
  • Il valore di "files.example" deve essere un array non vuoto
  • I valori di "files.example" non devono avere duplicati
  • La chiave "files.editor" è opzionale
  • Il valore di "files.editor" deve essere un array
  • I valori di "files.editor" non devono avere duplicati
  • La chiave "files.invalidator" è opzionale
  • Il valore di "files.invalidator" deve essere un array
  • I valori di "files.invalidator" non devono avere duplicati
  • I file elencati in "files.solution" devono esistere
  • I file elencati in "files.test" devono esistere
  • I file elencati in "files.example" devono esistere
  • I file elencati in "files.editor" devono esistere
  • I file elencati in "files.invalidator" devono esistere
  • I file possono essere elencati solo nell'array "files.solution", "files.test", "files.example o "files.invalidator" (nessuna sovrapposizione)
    • Se la traccia è d o plsql, i file di "files.solution" e "files.test" possono sovrapporsi
  • La chiave "language_versions" è opzionale
  • Il valore di "language_versions" deve essere una stringa
  • La chiave "test_runner" è opzionale
  • Il valore di "test_runner" deve essere un booleano
  • La chiave "representer.version" è opzionale
  • Il valore di "representer.version" deve essere un numero intero >= 1
  • La chiave "icon" è opzionale
  • Il valore di "icon" deve essere una stringa in kebab-case²

Regola: exercises/{concept|practice}/<slug>/.approaches/config.json è valido

  • La presenza del file è opzionale, a meno che non ci sia un introduction.md o una directory adiacente
  • Il file deve essere JSON valido
  • La radice JSON deve essere un oggetto
  • La chiave "introduction.authors" è opzionale
  • Il valore di "introduction.authors" deve essere un array
  • I valori di "introduction.authors" devono essere stringhe non vuote¹
  • I valori di "introduction.authors" non devono avere duplicati
  • I valori di "introduction.authors" sono trattati senza distinzione tra maiuscole e minuscole
  • Se l'array "introduction.authors" non è vuoto, deve esserci un file introduction.md non vuoto
  • La chiave "introduction.contributors" è opzionale
  • Il valore di "introduction.contributors" deve essere un array
  • I valori di "introduction.contributors" devono essere stringhe non vuote¹
  • I valori di "introduction.contributors" non devono avere duplicati
  • I valori di "introduction.contributors" sono trattati senza distinzione tra maiuscole e minuscole
  • Se l'array "introduction.contributors" non è vuoto, deve esserci un file introduction.md non vuoto
  • Gli utenti possono essere elencati solo nell'array "introduction.authors" o "introduction.contributors" (nessuna sovrapposizione)
  • La chiave "approaches" è opzionale, a meno che non sia presente una directory adiacente (che contiene i file degli approcci)
  • Il valore di "approaches" deve essere un array di oggetti
  • La chiave "approaches[].uuid" è obbligatoria
  • Il valore di "approaches[].uuid" deve essere una stringa UUID versione 4 univoca⁶
  • Il valore di "approaches[].uuid" di ogni concetto non deve mai cambiare
  • La chiave "approaches[].slug" è obbligatoria
  • Il valore di "approaches[].slug" deve essere una stringa in kebab-case² con lunghezza <= 255
  • Il valore di "approaches[].slug" deve avere un file <slug>/content.md non vuoto corrispondente
  • Il valore di "approaches[].slug" deve avere un file <slug>/snippet.txt non vuoto corrispondente
  • La chiave "approaches[].title" è obbligatoria
  • Il valore di "approaches[].title" deve essere una stringa in Title Case³ con lunghezza <= 255
  • La chiave "approaches[].blurb" è obbligatoria
  • Il valore di "approaches[].blurb" deve essere una stringa non vuota¹ con lunghezza <= 350
  • La chiave "approaches[].authors" è obbligatoria
  • Il valore di "approaches[].authors" deve essere un array non vuoto
  • I valori di "approaches[].authors" devono essere stringhe non vuote¹
  • I valori di "approaches[].authors" non devono avere duplicati
  • I valori di "approaches[].authors" sono trattati senza distinzione tra maiuscole e minuscole
  • La chiave "approaches[].contributors" è opzionale
  • Il valore di "approaches[].contributors" deve essere un array
  • I valori di "approaches[].contributors" devono essere stringhe non vuote¹
  • I valori di "approaches[].contributors" non devono avere duplicati
  • I valori di "approaches[].contributors" sono trattati senza distinzione tra maiuscole e minuscole
  • Gli utenti possono essere elencati solo nell'array "approaches[].authors" o "approaches[].contributors" (nessuna sovrapposizione)
  • La chiave "approaches[].tags" è opzionale
  • La chiave "approaches[].tags.all" è opzionale, a meno che "approaches[].tags.any" sia vuoto
  • Il valore di "approaches[].tags.all" deve essere un array
  • I valori di "approaches[].tags.all" devono essere stringhe tag⁷ non vuote con lunghezza <= 255
  • I valori di "approaches[].tags.all" non devono avere duplicati
  • La chiave "approaches[].tags.any" è opzionale, a meno che "approaches[].tags.all" sia vuoto
  • Il valore di "approaches[].tags.any" deve essere un array
  • I valori di "approaches[].tags.any" devono essere stringhe tag⁷ non vuote con lunghezza <= 255
  • I valori di "approaches[].tags.any" non devono avere duplicati
  • La chiave "approaches[].tags.not" è opzionale
  • Il valore di "approaches[].tags.not" deve essere un array
  • I valori di "approaches[].tags.not" devono essere stringhe tag⁷ non vuote con lunghezza <= 255
  • I valori di "approaches[].tags.not" non devono avere duplicati

Regola: exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/content.md è valido

  • La presenza del file è obbligatoria se esiste una voce "approaches[].slug" corrispondente nel file .approaches/config.json
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/snippet.<snippet-extension> è valido

  • La presenza del file è obbligatoria se esiste una voce "approaches[].slug" corrispondente nel file .approaches/config.json
  • Lo snippet deve avere al massimo 8 righe
  • L'estensione dello snippet è presa dal valore approaches.snippet_extension nel file config.json della traccia

Regola: exercises/{concept|practice}/<slug>/.articles/config.json è valido

  • La presenza del file è opzionale, a meno che non ci sia una directory adiacente
  • Il file deve essere JSON valido
  • La radice JSON deve essere un oggetto
  • La chiave "articles" è opzionale, a meno che non sia presente una directory adiacente (che contiene i file degli articoli)
  • Il valore di "articles" deve essere un array di oggetti
  • La chiave "articles[].uuid" è obbligatoria
  • Il valore di "articles[].uuid" deve essere una stringa UUID versione 4 univoca⁶
  • Il valore di "articles[].uuid" di ogni concetto non deve mai cambiare
  • La chiave "articles[].slug" è obbligatoria
  • Il valore di "articles[].slug" deve essere una stringa in kebab-case² con lunghezza <= 255
  • Il valore di "articles[].slug" deve avere un file <slug>/content.md non vuoto corrispondente
  • Il valore di "articles[].slug" deve avere un file <slug>/snippet.md non vuoto corrispondente
  • La chiave "articles[].title" è obbligatoria
  • Il valore di "articles[].title" deve essere una stringa in Title Case³ con lunghezza <= 255
  • La chiave "articles[].blurb" è obbligatoria
  • Il valore di "articles[].blurb" deve essere una stringa non vuota¹ con lunghezza <= 350
  • La chiave "articles[].authors" è obbligatoria
  • Il valore di "articles[].authors" deve essere un array non vuoto
  • I valori di "articles[].authors" devono essere stringhe non vuote¹
  • I valori di "articles[].authors" non devono avere duplicati
  • I valori di "articles[].authors" sono trattati senza distinzione tra maiuscole e minuscole
  • La chiave "articles[].contributors" è opzionale
  • Il valore di "articles[].contributors" deve essere un array
  • I valori di "articles[].contributors" devono essere stringhe non vuote¹
  • I valori di "articles[].contributors" non devono avere duplicati
  • I valori di "articles[].contributors" sono trattati senza distinzione tra maiuscole e minuscole
  • Gli utenti possono essere elencati solo nell'array "articles[].authors" o "articles[].contributors" (nessuna sovrapposizione)

Regola: exercises/{concept|practice}/<slug>/.articles/<article-slug>/content.md è valido

  • La presenza del file è obbligatoria se esiste una voce "articles[].slug" corrispondente nel file .articles/config.json
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: exercises/{concept|practice}/<slug>/.articles/<article-slug>/snippet.md è valido

  • La presenza del file è obbligatoria se esiste una voce "articles[].slug" corrispondente nel file .articles/config.json
  • Il Markdown deve essere conforme agli standard Markdown
  • Lo snippet deve avere al massimo 8 righe (i marcatori di inizio e fine del blocco di codice vengono ignorati)

Regola: exercises/shared/.docs/debug.md è valido

  • La presenza del file è opzionale
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: exercises/shared/.docs/help.md è valido

  • La presenza del file è obbligatoria
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: exercises/shared/.docs/tests.md è valido

  • La presenza del file è obbligatoria
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: concepts/<slug>/about.md è valido

  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: concepts/<slug>/introduction.md è valido

  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)
  • Il file deve essere JSON valido
  • La radice JSON deve essere un array
  • La proprietà "[].url" è obbligatoria
  • Il valore di "[].url" deve essere un URL
  • La proprietà "[].description" è obbligatoria
  • Il valore di "[].description" deve essere una stringa non vuota¹
  • La proprietà "[].icon_url" è opzionale
  • Il valore di "[].icon_url" deve essere un URL

Regola: concept/<slug>/.meta/config.json è valido

  • Il file deve essere JSON valido
  • La radice JSON deve essere un oggetto
  • La chiave "blurb" è obbligatoria
  • Il valore di "blurb" deve essere una stringa non vuota¹ con lunghezza <= 350
  • La chiave "authors" è obbligatoria
  • Il valore di "authors" deve essere un array
  • I valori di "authors" devono essere stringhe non vuote¹
  • I valori di "authors" non devono avere duplicati
  • I valori di "authors" sono trattati senza distinzione tra maiuscole e minuscole
  • La chiave "contributors" è opzionale
  • Il valore di "contributors" deve essere un array
  • I valori di "contributors" devono essere stringhe non vuote¹
  • I valori di "contributors" non devono avere duplicati
  • I valori di "contributors" sono trattati senza distinzione tra maiuscole e minuscole
  • Gli utenti possono essere elencati solo nell'array "authors" o "contributors" (nessuna sovrapposizione)

Regola: docs/ABOUT.md è valido

  • La presenza del file è obbligatoria
  • Il contenuto del file non deve essere vuoto
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: docs/INSTALLATION.md è valido

  • La presenza del file è obbligatoria
  • Il contenuto del file non deve essere vuoto
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: docs/LEARNING.md è valido

  • La presenza del file è obbligatoria
  • Il contenuto del file non deve essere vuoto
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: docs/RESOURCES.md è valido

  • La presenza del file è obbligatoria
  • Il contenuto del file non deve essere vuoto
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Regola: docs/SNIPPET.txt è valido

  • La presenza del file è obbligatoria
  • Il contenuto del file non deve essere vuoto

Regola: docs/TESTS.md è valido

  • La presenza del file è obbligatoria
  • Il contenuto del file non deve essere vuoto
  • Il Markdown deve essere conforme agli standard Markdown
  • I link devono essere assoluti (i link relativi non sono consentiti)

Glossario

  1. Stringa non vuota: una stringa che contiene almeno un carattere diverso da uno spazio bianco.

  2. Stringa in kebab-case: una stringa che contiene solo caratteri nell'intervallo [a-z0-9], facoltativamente separati da trattini (ad es. «two-fer»). Deve corrispondere all'espressione regolare: ^[a-z0-9]+(-[a-z0-9]+)*$

  3. Stringa in Title Case: una stringa non vuota che segue le linee guida del Chicago Manual of Style riportate di seguito:

    • Metti in maiuscolo la prima e l'ultima parola di titoli e sottotitoli.
    • Metti in maiuscolo le parole «principali» (sostantivi, pronomi, verbi, aggettivi, avverbi e alcune congiunzioni).
    • Scrivi in minuscolo le congiunzioni and, but, for, or e nor.
    • Scrivi in minuscolo gli articoli the, a e an.
    • Scrivi in minuscolo le preposizioni, indipendentemente dalla lunghezza, tranne quando sono accentate, usate in funzione avverbiale o aggettivale, oppure usate come congiunzioni.
    • Scrivi in minuscolo le parole to e as.
    • Scrivi in minuscolo la seconda parte dei nomi di specie latini.
  4. Stringa in Sentence Case: una stringa non vuota che segue le linee guida riportate di seguito:

    • Metti in maiuscolo la prima parola della frase, così come i nomi propri e le altre parole richieste da una regola più specifica.
  5. Pattern files valido: una stringa non vuota¹ che specifica la posizione di un file usato in un esercizio, relativa alla directory dell'esercizio. Un pattern può usare uno dei seguenti segnaposto:

    • %{kebab_slug}: lo slug dell'esercizio in kebab-case (ad es. bit-manipulation)
    • %{snake_slug}: lo slug dell'esercizio in snake_case (ad es. bit_manipulation)
    • %{camel_slug}: lo slug dell'esercizio in camelCase (ad es. bitManipulation)
    • %{pascal_slug}: lo slug dell'esercizio in PascalCase (ad es. BitManipulation)
  6. Stringa UUID versione 4 univoca: una stringa che soddisfa tutte queste condizioni:

    • Esiste una sola volta nel file config.json a livello di traccia di una data traccia di Exercism
    • Non esiste nel file config.json a livello di traccia di nessun'altra traccia di Exercism
    • Non esiste in nessun file canonical-data.json in https://github.com/exercism/problem-specifications
    • Non esiste in nessun altro punto di Exercism
    • Corrisponde all'espressione regolare:
    ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    

    Ad esempio, l'UUID riportato di seguito ha la forma corretta:

    d334ffe3-657e-4725-a950-290b284b6d9f
    

    Puoi eseguire configlet uuid per generare un UUID adatto.

  7. tag dell'analyzer valido: una stringa non vuota¹ formattata come <category>:<thing>. Il valore di <category> deve essere uno dei seguenti:

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

Il valore di <thing> deve essere una stringa non vuota¹.