Der Hauptzweck von configlet ist das Linting: Es wird geprüft, ob die Konfigurationsdateien eines Tracks korrekt aufgebaut sind, und zwar sowohl syntaktisch als auch semantisch. Falsch konfigurierte Tracks werden unter Umständen nicht korrekt synchronisiert, sehen auf der Website falsch aus oder bieten eine suboptimale Nutzererfahrung. Deshalb spielen die Prüfungen von configlet eine wichtige Rolle dabei, die Integrität von Exercism zu wahren.
Mit dem Befehl lint kannst du einen Track linten.
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]
Das sind die Linting-Regeln, die geprüft werden.
Der Linter sollte prüfen, ob alle erforderlichen Dateien vorhanden sind. Die übungsunabhängigen Dateien, die vorhanden sein müssen, sind:
config.jsondocs/ABOUT.mddocs/INSTALLATION.mddocs/LEARNING.mddocs/RESOURCES.mddocs/SNIPPET.txtdocs/TESTS.mdexercises/shared/.docs/help.mdexercises/shared/.docs/tests.mdDie Dateien, die spezifisch für Konzeptübungen sind und vorhanden sein müssen, sind:
exercises/concept/<slug>/.docs/hints.mdexercises/concept/<slug>/.docs/instructions.mdexercises/concept/<slug>/.docs/introduction.mdexercises/concept/<slug>/.meta/config.jsonEine ähnliche Liste wird es für Praxisübungen geben, aber die Spezifikation dafür haben wir noch nicht festgelegt.
Jedes in der config.json aufgeführte Konzept sollte die folgenden Dateien haben:
concepts/<slug>/about.mdconcepts/<slug>/introduction.mdconcepts/<slug>/links.jsonDie Datei config.json sollte die folgenden Prüfungen bestehen:
"language" ist erforderlich"language" muss ein nicht-leerer String¹ mit einer Länge <= 255 sein"slug" ist erforderlich"slug" muss ein kebab-case-String² mit einer Länge <= 255 sein"active" ist erforderlich"active" muss ein boolescher Wert sein"blurb" ist erforderlich"blurb" muss ein nicht-leerer String¹ mit einer Länge <= 400 sein"version" ist erforderlich"version" muss die Ganzzahl 3 sein"status.concept_exercises" ist erforderlich"status.concept_exercises" muss ein boolescher Wert sein"status.test_runner" ist erforderlich"status.test_runner" muss ein boolescher Wert sein"status.representer" ist erforderlich"status.representer" muss ein boolescher Wert sein"status.analyzer" ist erforderlich"status.analyzer" muss ein boolescher Wert sein"online_editor.indent_style" ist erforderlich"online_editor.indent_style" muss der String space oder tab sein"online_editor.indent_size" ist erforderlich"online_editor.indent_size" muss eine Ganzzahl >= 0 und <= 8 sein"online_editor.highlightjs_language" ist optional"online_editor.highlightjs_language" muss ein nicht-leerer String¹ sein"files" ist optional"files" muss ein Objekt sein"files.solution" ist optional"files.solution" muss ein Array sein"files.solution" müssen gültige Muster⁵ sein"files.solution" dürfen keine Duplikate enthalten"files.test" ist optional"files.test" muss ein Array sein"files.test" müssen gültige Muster⁵ sein"files.test" dürfen keine Duplikate enthalten"files.example" ist optional"files.example" muss ein Array sein"files.example" müssen gültige Muster⁵ sein"files.example" dürfen keine Duplikate enthalten"files.exemplar" ist optional"files.exemplar" muss ein Array sein"files.exemplar" müssen gültige Muster⁵ sein"files.exemplar" dürfen keine Duplikate enthalten"files.editor" ist optional"files.editor" muss ein Array sein"files.editor" müssen gültige Muster⁵ sein"files.editor" dürfen keine Duplikate enthalten"files.invalidator" ist optional"files.invalidator" muss ein Array sein"files.invalidator" müssen gültige Muster⁵ sein"files.invalidator" dürfen keine Duplikate enthalten"files.solution", "files.test", "files.example", "files.exemplar", "files.editor" oder "files.invalidator" aufgeführt werden (keine Überschneidung)
d oder plsql ist, dürfen sich die Dateien in "files.solution" und "files.test" überschneiden"files.example und "files.exemplar" dürfen sich überschneiden"test_runner.average_run_time" ist erforderlich, wenn "status.test_runner" gleich true ist"test_runner.average_run_time" muss eine Ganzzahl > 0 sein"approaches.snippet_extension" ist erforderlich, wenn der Track einen oder mehrere Ansätze hat"approaches.snippet_extension" muss ein nicht-leerer String¹ sein"exercises" ist erforderlich"exercises.concept" ist erforderlich"exercises.concept" muss ein Array sein"exercises.concept[].slug" ist erforderlich"exercises.concept[].slug" muss ein kebab-case-String² mit einer Länge <= 255 sein"exercises.concept[].slug" muss in "exercises.concept[].slug" eindeutig sein und darf nicht in "exercises.practice[].slug" vorkommen"exercises.concept[].name" ist erforderlich"exercises.concept[].name" muss ein Title-Case-String³ mit einer Länge <= 255 sein"exercises.concept[].uuid" ist erforderlich"exercises.concept[].uuid" muss ein eindeutiger UUID-String der Version 4⁶ sein"exercises.concept[].uuid" darf sich für die jeweilige Übung niemals ändern"exercises.concept[].concepts" ist erforderlich"exercises.concept[].concepts" muss ein nicht-leeres Array aus Strings sein, wenn "exercises.concept[].status" nicht gleich deprecated ist"exercises.concept[].concepts" muss ein leeres Array sein, wenn "exercises.concept[].status" gleich deprecated ist"exercises.concept[].concepts" müssen kebab-case-Strings² sein"exercises.concept[].concepts" dürfen keine Duplikate enthalten"exercises.concept[].concepts" dürfen in der Eigenschaft "concepts" keiner anderen Konzeptübung vorkommen"exercises.concept[].concepts" müssen mit der Eigenschaft "concepts.slug" eines der Konzepte übereinstimmen"exercises.concept[].prerequisites" ist erforderlich"exercises.concept[].prerequisites" muss ein nicht-leeres Array aus Strings sein, wenn "exercises.concept[].status" nicht gleich deprecated ist, mit Ausnahme von genau einer Übung, die darf als Wert ein leeres Array haben"exercises.concept[].prerequisites" muss ein leeres Array sein, wenn "exercises.concept[].status" gleich deprecated ist"exercises.concept[].prerequisites" müssen kebab-case-Strings² sein"exercises.concept[].prerequisites" dürfen keine Duplikate enthalten"exercises.concept[].prerequisites" müssen mit den Werten der Eigenschaft "concepts" einer anderen Konzeptübung übereinstimmen"exercises.concept[].prerequisites" dürfen keinem der Werte in der Eigenschaft "exercises.concept[].concepts" der Übung entsprechen"exercises.concept[].prerequisites" müssen mit der Eigenschaft "concepts.slug" eines der Konzepte übereinstimmen"exercises.concept[].concepts" und "exercises.concept[].prerequisites" dürfen keine Zyklen bestehen"exercises.concept[].status" ist optional"exercises.concept[].status" muss der String wip, beta, active oder deprecated sein"exercises.practice" ist erforderlich"exercises.practice" muss ein Array sein"exercises.practice[].slug" ist erforderlich"exercises.practice[].slug" muss ein kebab-case-String² mit einer Länge <= 255 sein"exercises.practice[].slug" muss in "exercises.practice[].slug" eindeutig sein und darf nicht in "exercises.concept[].slug" vorkommen"exercises.practice[].slug" geben, der der String hello-world ist"exercises.practice[].name" ist erforderlich"exercises.practice[].name" muss ein Title-Case-String³ mit einer Länge <= 255 sein"exercises.practice[].uuid" ist erforderlich"exercises.practice[].uuid" muss ein eindeutiger UUID-String der Version 4⁶ sein"exercises.practice[].uuid" darf sich für die jeweilige Übung niemals ändern"exercises.practice[].difficulty" ist erforderlich"exercises.practice[].difficulty" muss eine Ganzzahl >= 1 und <= 10 sein"exercises.practice[].practices" ist erforderlich"exercises.practice[].practices" muss ein nicht-leeres Array aus Strings sein, wenn "exercises.practice[].status" nicht gleich deprecated ist"exercises.practice[].practices" muss ein leeres Array sein, wenn "exercises.practice[].status" gleich deprecated ist"exercises.practice[].practices" müssen kebab-case-Strings² sein"exercises.practice[].practices" dürfen keine Duplikate enthalten"exercises.practice[].practices" müssen mit der Eigenschaft "concepts[].slug" eines der Konzepte übereinstimmen"exercises.practice[].practices" dürfen sich auf den Slug eines einzelnen Konzepts höchstens 10 Mal beziehen (über alle Übungen hinweg)"exercises.practice[].prerequisites" ist erforderlich"exercises.practice[].prerequisites" muss ein nicht-leeres Array aus Strings sein, wenn "exercises.practice[].status" nicht gleich deprecated ist"exercises.practice[].prerequisites" muss ein leeres Array sein, wenn "exercises.practice[].status" gleich deprecated ist"exercises.practice[].prerequisites" muss ein leeres Array sein, wenn "exercises.practice[].slug" gleich hello-world ist"exercises.practice[].prerequisites" müssen kebab-case-Strings² sein"exercises.practice[].prerequisites" dürfen keine Duplikate enthalten"exercises.practice[].prerequisites" müssen mit den Werten von "exercises.concept[].concepts" einer Konzeptübung übereinstimmen"exercises.practice[].prerequisites" müssen mit der Eigenschaft "concepts[].slug" eines der Konzepte übereinstimmen"exercises.practice[].status" ist optional"exercises.practice[].status" muss der String wip, beta, active oder deprecated sein"exercises.practice[].status" muss, wenn "exercises.practice[].slug" gleich hello-world ist, entweder weggelassen werden oder der String active sein"exercises.foregone" ist optional"exercises.foregone" muss ein Array sein"exercises.foregone" müssen kebab-case-Strings² sein"exercises.foregone" dürfen keine Duplikate enthalten"exercises.foregone" dürfen keinem der Slugs von Konzept- oder Praxisübungen entsprechen"concepts" ist erforderlich"concepts" muss ein Array sein"concepts[].uuid" ist erforderlich"concepts[].uuid" muss ein eindeutiger UUID-String der Version 4⁶ sein"concepts[].uuid" darf sich für das jeweilige Konzept niemals ändern"concepts[].slug" ist erforderlich"concepts[].slug" muss ein kebab-case-String² mit einer Länge <= 255 sein"concepts[].name" ist erforderlich"concepts[].name" muss ein Title-Case-String³ mit einer Länge <= 255 sein"concepts[].tags" ist optional"concepts[].tags.all" ist optional, es sei denn, "concepts[].tags.any" ist leer"concepts[].tags.all" muss ein Array sein"concepts[].tags.all" müssen nicht-leere Tag⁷-Strings mit einer Länge <= 255 sein"concepts[].tags.all" dürfen keine Duplikate enthalten"concepts[].tags.any" ist optional, es sei denn, "concepts[].tags.all" ist leer"concepts[].tags.any" muss ein Array sein"concepts[].tags.any" müssen nicht-leere Tag⁷-Strings mit einer Länge <= 255 sein"concepts[].tags.any" dürfen keine Duplikate enthalten"concepts[].tags.not" ist optional"concepts[].tags.not" muss ein Array sein"concepts[].tags.not" müssen nicht-leere Tag⁷-Strings mit einer Länge <= 255 sein"concepts[].tags.not" dürfen keine Duplikate enthalten"concepts" muss eine Datei concept/<concepts.slug>/about.md haben. Die Linting-Regeln für diese Datei sind unten angegeben."concepts" muss eine Datei concept/<concepts.slug>/introduction.md haben. Die Linting-Regeln für diese Datei sind unten angegeben."concepts" muss eine Datei concept/<concepts.slug>/links.json haben. Die Linting-Regeln für diese Datei sind unten angegeben."key_features" ist optional"key_features" muss ein Array mit der Länge = 6 sein"key_features[].icon" ist erforderlich"key_features[].icon" muss einen der vordefinierten Icon-Werte verwenden"key_features[].title" ist erforderlich"key_features[].title" muss ein Sentence-Case-String⁴ mit einer Länge <= 25 sein"key_features[].content" ist erforderlich"key_features[].content" muss ein nicht-leerer String¹ mit einer Länge <= 100 sein"tags" ist erforderlich"tags" muss ein Array aus Strings sein"tags" dürfen keine Duplikate enthalten"tags" müssen einen der vordefinierten Tag-Werte verwenden"blurb" ist erforderlich"blurb" muss ein nicht-leerer String¹ mit einer Länge <= 350 sein"source" ist optional"source" muss ein nicht-leerer String¹ sein"source_url" ist optional"source_url" muss eine URL sein"authors" ist erforderlich"authors" muss ein nicht-leeres Array sein"authors" müssen nicht-leere Strings¹ sein"authors" dürfen keine Duplikate enthalten"authors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"contributors" ist optional"contributors" muss ein Array sein"contributors" müssen nicht-leere Strings¹ sein"contributors" dürfen keine Duplikate enthalten"contributors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"authors" oder "contributors" aufgeführt werden (keine Überschneidung)"files.solution" ist erforderlich"files.solution" muss ein nicht-leeres Array sein"files.solution" dürfen keine Duplikate enthalten"files.test" ist erforderlich"files.test" muss ein nicht-leeres Array sein"files.test" dürfen keine Duplikate enthalten"files.exemplar" ist erforderlich"files.exemplar" muss ein nicht-leeres Array sein"files.exemplar" dürfen keine Duplikate enthalten"files.editor" ist optional"files.editor" muss ein Array sein"files.editor" dürfen keine Duplikate enthalten"files.invalidator" ist optional"files.invalidator" muss ein Array sein"files.invalidator" dürfen keine Duplikate enthalten"files.solution" aufgeführten Dateien müssen existieren"files.test" aufgeführten Dateien müssen existieren"files.exemplar" aufgeführten Dateien müssen existieren"files.editor" aufgeführten Dateien müssen existieren"files.invalidator" aufgeführten Dateien müssen existieren"files.solution", "files.test", "files.exemplar" oder "files.invalidator" aufgeführt werden (keine Überschneidung)
d oder plsql ist, dürfen sich die Dateien in "files.solution" und "files.test" überschneiden"forked_from" ist optional"forked_from" muss ein Array sein"forked_from" müssen Strings im Format <track-slug>/<exercise-slug> sein (z. B. fsharp/bird-watcher)"forked_from" müssen auf tatsächlich implementierte Übungen verweisen"forked_from" dürfen keine Duplikate enthalten"language_versions" ist optional"language_versions" muss ein String sein"representer.version" ist optional"representer.version" muss eine Ganzzahl >= 1 sein"icon" ist optional"icon" muss ein kebab-case-String² sein## General oder ## X. <task> lauten, wobei X der Aufgabennummer in der Überschrift der instructions.md entspricht## 1. Do X
"concepts.slug" eines der Konzepte in der config.json des Tracks übereinstimmen."blurb" ist erforderlich"blurb" muss ein nicht-leerer String¹ mit einer Länge <= 350 sein"source" ist optional"source" muss ein nicht-leerer String¹ sein"source_url" ist optional"source_url" muss eine URL sein"authors" ist optional"authors" muss ein Array sein"authors" müssen nicht-leere Strings¹ sein"authors" dürfen keine Duplikate enthalten"authors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"contributors" ist optional"contributors" muss ein Array sein"contributors" müssen nicht-leere Strings¹ sein"contributors" dürfen keine Duplikate enthalten"contributors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"authors" oder "contributors" aufgeführt werden (keine Überschneidung)"files.solution" ist erforderlich"files.solution" muss ein nicht-leeres Array sein"files.solution" dürfen keine Duplikate enthalten"files.test" ist erforderlich"files.test" muss ein nicht-leeres Array sein"files.test" dürfen keine Duplikate enthalten"files.example" ist erforderlich"files.example" muss ein nicht-leeres Array sein"files.example" dürfen keine Duplikate enthalten"files.editor" ist optional"files.editor" muss ein Array sein"files.editor" dürfen keine Duplikate enthalten"files.invalidator" ist optional"files.invalidator" muss ein Array sein"files.invalidator" dürfen keine Duplikate enthalten"files.solution" aufgeführten Dateien müssen existieren"files.test" aufgeführten Dateien müssen existieren"files.example" aufgeführten Dateien müssen existieren"files.editor" aufgeführten Dateien müssen existieren"files.invalidator" aufgeführten Dateien müssen existieren"files.solution", "files.test", "files.example oder "files.invalidator" aufgeführt werden (keine Überschneidung)
d oder plsql ist, dürfen sich die Dateien in "files.solution" und "files.test" überschneiden"language_versions" ist optional"language_versions" muss ein String sein"test_runner" ist optional"test_runner" muss ein boolescher Wert sein"representer.version" ist optional"representer.version" muss eine Ganzzahl >= 1 sein"icon" ist optional"icon" muss ein kebab-case-String² seinintroduction.md oder ein benachbartes Verzeichnis"introduction.authors" ist optional"introduction.authors" muss ein Array sein"introduction.authors" müssen nicht-leere Strings¹ sein"introduction.authors" dürfen keine Duplikate enthalten"introduction.authors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"introduction.authors" nicht leer ist, muss es eine nicht-leere introduction.md-Datei geben"introduction.contributors" ist optional"introduction.contributors" muss ein Array sein"introduction.contributors" müssen nicht-leere Strings¹ sein"introduction.contributors" dürfen keine Duplikate enthalten"introduction.contributors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"introduction.contributors" nicht leer ist, muss es eine nicht-leere introduction.md-Datei geben"introduction.authors" oder "introduction.contributors" aufgeführt werden (keine Überschneidung)"approaches" ist optional, es sei denn, es gibt ein benachbartes Verzeichnis (das die Dateien des Ansatzes enthält)"approaches" muss ein Array aus Objekten sein"approaches[].uuid" ist erforderlich"approaches[].uuid" muss ein eindeutiger UUID-String der Version 4⁶ sein"approaches[].uuid" darf sich für das jeweilige Konzept niemals ändern"approaches[].slug" ist erforderlich"approaches[].slug" muss ein kebab-case-String² mit einer Länge <= 255 sein"approaches[].slug" muss eine entsprechende nicht-leere Datei <slug>/content.md haben"approaches[].slug" muss eine entsprechende nicht-leere Datei <slug>/snippet.txt haben"approaches[].title" ist erforderlich"approaches[].title" muss ein Title-Case-String³ mit einer Länge <= 255 sein"approaches[].blurb" ist erforderlich"approaches[].blurb" muss ein nicht-leerer String¹ mit einer Länge <= 350 sein"approaches[].authors" ist erforderlich"approaches[].authors" muss ein nicht-leeres Array sein"approaches[].authors" müssen nicht-leere Strings¹ sein"approaches[].authors" dürfen keine Duplikate enthalten"approaches[].authors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"approaches[].contributors" ist optional"approaches[].contributors" muss ein Array sein"approaches[].contributors" müssen nicht-leere Strings¹ sein"approaches[].contributors" dürfen keine Duplikate enthalten"approaches[].contributors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"approaches[].authors" oder "approaches[].contributors" aufgeführt werden (keine Überschneidung)"approaches[].tags" ist optional"approaches[].tags.all" ist optional, es sei denn, "approaches[].tags.any" ist leer"approaches[].tags.all" muss ein Array sein"approaches[].tags.all" müssen nicht-leere Tag⁷-Strings mit einer Länge <= 255 sein"approaches[].tags.all" dürfen keine Duplikate enthalten"approaches[].tags.any" ist optional, es sei denn, "approaches[].tags.all" ist leer"approaches[].tags.any" muss ein Array sein"approaches[].tags.any" müssen nicht-leere Tag⁷-Strings mit einer Länge <= 255 sein"approaches[].tags.any" dürfen keine Duplikate enthalten"approaches[].tags.not" ist optional"approaches[].tags.not" muss ein Array sein"approaches[].tags.not" müssen nicht-leere Tag⁷-Strings mit einer Länge <= 255 sein"approaches[].tags.not" dürfen keine Duplikate enthalten"approaches[].slug" in der Datei .approaches/config.json existiert"approaches[].slug" in der Datei .approaches/config.json existiertapproaches.snippet_extension in der config.json des Tracks entnommen"articles" ist optional, es sei denn, es gibt ein benachbartes Verzeichnis (das die Dateien des Artikels enthält)"articles" muss ein Array aus Objekten sein"articles[].uuid" ist erforderlich"articles[].uuid" muss ein eindeutiger UUID-String der Version 4⁶ sein"articles[].uuid" darf sich für das jeweilige Konzept niemals ändern"articles[].slug" ist erforderlich"articles[].slug" muss ein kebab-case-String² mit einer Länge <= 255 sein"articles[].slug" muss eine entsprechende nicht-leere Datei <slug>/content.md haben"articles[].slug" muss eine entsprechende nicht-leere Datei <slug>/snippet.md haben"articles[].title" ist erforderlich"articles[].title" muss ein Title-Case-String³ mit einer Länge <= 255 sein"articles[].blurb" ist erforderlich"articles[].blurb" muss ein nicht-leerer String¹ mit einer Länge <= 350 sein"articles[].authors" ist erforderlich"articles[].authors" muss ein nicht-leeres Array sein"articles[].authors" müssen nicht-leere Strings¹ sein"articles[].authors" dürfen keine Duplikate enthalten"articles[].authors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"articles[].contributors" ist optional"articles[].contributors" muss ein Array sein"articles[].contributors" müssen nicht-leere Strings¹ sein"articles[].contributors" dürfen keine Duplikate enthalten"articles[].contributors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"articles[].authors" oder "articles[].contributors" aufgeführt werden (keine Überschneidung)"articles[].slug" in der Datei .articles/config.json existiert"articles[].slug" in der Datei .articles/config.json existiert"[].url" ist erforderlich"[].url" muss eine URL sein"[].description" ist erforderlich"[].description" muss ein nicht-leerer String¹ sein"[].icon_url" ist optional"[].icon_url" muss eine URL sein"blurb" ist erforderlich"blurb" muss ein nicht-leerer String¹ mit einer Länge <= 350 sein"authors" ist erforderlich"authors" muss ein Array sein"authors" müssen nicht-leere Strings¹ sein"authors" dürfen keine Duplikate enthalten"authors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"contributors" ist optional"contributors" muss ein Array sein"contributors" müssen nicht-leere Strings¹ sein"contributors" dürfen keine Duplikate enthalten"contributors" werden ohne Beachtung der Groß-/Kleinschreibung behandelt"authors" oder "contributors" aufgeführt werden (keine Überschneidung)Nicht-leerer String: ein String, der mindestens ein Zeichen enthält, das kein Leerzeichen ist.
kebab-case-String: ein String, der nur Zeichen aus dem Bereich [a-z0-9] enthält, die optional durch Bindestriche getrennt sind (z. B. „two-fer“). Er muss dem regulären Ausdruck entsprechen: ^[a-z0-9]+(-[a-z0-9]+)*$
Title-Case-String: ein nicht-leerer String, der den folgenden Richtlinien des Chicago Manual of Style folgt:
Sentence-Case-String: ein nicht-leerer String, der den folgenden Richtlinien folgt:
Gültiges files-Muster: Ein nicht-leerer String¹, der den Ort einer in einer Übung verwendeten Datei relativ zum Verzeichnis der Übung angibt. Ein Muster kann einen der folgenden Platzhalter verwenden:
%{kebab_slug}: der Übungs-Slug im kebab-case-Format (z. B. bit-manipulation)%{snake_slug}: der Übungs-Slug im snake_case-Format (z. B. bit_manipulation)%{camel_slug}: der Übungs-Slug im camelCase-Format (z. B. bitManipulation)%{pascal_slug}: der Übungs-Slug im PascalCase-Format (z. B. BitManipulation)Eindeutiger UUID-String der Version 4: Ein String, der alle folgenden Bedingungen erfüllt:
config.json auf Track-Ebene eines bestimmten Exercism-Tracksconfig.json auf Track-Ebene eines anderen Exercism-Trackscanonical-data.json-Datei unter https://github.com/exercism/problem-specifications^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
Zum Beispiel hat die folgende UUID die korrekte Form:
d334ffe3-657e-4725-a950-290b284b6d9f
Mit configlet uuid kannst du eine passende UUID generieren.
Gültiger Analyzer-tag: Ein nicht-leerer String¹ im Format <category>:<thing>.
Der Wert von <category> muss einer der folgenden sein:
paradigm (z. B. paradigm:functional)technique (z. B. technique:recursion)construct (z. B. construct:bitwise-and)uses (z. B. uses:DateTime.add_seconds)Der Wert von <thing> muss ein nicht-leerer String¹ sein.