Eine Practice-Übung in einem Exercism-Track wird oft anhand einer Spezifikation im Repo exercism/problem-specifications implementiert.
Exercism verlangt bewusst, dass jede Übung ihre eigene Kopie bestimmter Dateien hat (wie .docs/instructions.md), auch wenn diese Übung in problem-specifications existiert.
Deshalb hat configlet einen Befehl sync, der prüfen kann, ob solche Practice-Übungen in einem Track mit dieser Upstream-Quelle übereinstimmen, und sie aktualisieren kann, wenn Updates verfügbar sind.
Drei Arten von Daten lassen sich aus problem-specifications aktualisieren: Dokumentation, Metadaten und Tests.
Außerdem gibt es eine Art von Daten, die sich aus der track-weiten config.json-Datei befüllen lässt: Dateipfade in den Konfigurationsdateien der Übungen.
Wie diese Datenarten geprüft und aktualisiert werden, beschreiben wir unten in einzelnen Abschnitten. Hier zunächst eine kurze Übersicht:
configlet sync arbeitet nur mit Übungen, die in der track-weiten config.json-Datei stehen.
Wenn du also eine neue Übung in einem Track implementierst und die ersten Dateien mit configlet sync hinzufügen möchtest, trage die Übung zuerst in die track-weite config.json-Datei ein.
Wenn die Übung noch nicht für Nutzer sichtbar sein soll, setze ihren status-Wert auf wip.configlet sync nimmt keine Änderungen am Track vor und prüft jede Datenart für jede Übung.--docs, --filepaths, --metadata und --tests.--update.--update --yes.--update --tests include --exercise prime-factors.problem-specifications-Repos zu überspringen, füge --offline --prob-specs-dir /path/to/local/problem-specifications hinzu.configlet sync beim Aktualisieren versucht, die Reihenfolge der Schlüssel in den .meta/config.json-Dateien der Übungen beizubehalten.
Um diese Dateien ohne Synchronisierung in eine kanonische Form zu bringen, verwende den Befehl configlet fmt.
Allerdings fügt configlet sync fehlende erforderliche Schlüssel (authors, files, blurb) doch hinzu (möglicherweise leer).
Das ist zwar weniger „sync-artig“, dafür aber bequemer: Wenn du eine neue Übung implementierst, kannst du sync verwenden, um eine anfängliche .meta/config.json-Datei zu erstellen.configlet sync entfernt Schlüssel, die nicht in der Spezifikation stehen.
Eigene Schlüssel-Wert-Paare werden weiterhin unterstützt: Sie müssen in einem JSON-Objekt namens custom stehen.Beachte, dass in den configlet-Versionen 4.0.0-alpha.34 und früher der Befehl sync nur mit Tests arbeitete.
Mit dem Befehl sync kannst du die Dokumentation, Metadaten und Tests von Practice-Übungen aus „problem-specifications“ prüfen oder aktualisieren.
Außerdem kann er fehlende files-Werte für Concept- und Practice-Übungen aus der track-weiten „config.json“ prüfen oder befüllen.
configlet [global-options] sync [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]
Options for sync:
-e, --exercise <slug> Only operate on this exercise
-p, --prob-specs-dir <dir> Use this 'problem-specifications' directory, rather than cloning temporarily
-o, --offline Do not check that the directory specified by --prob-specs-dir is up to date
-u, --update Prompt to update the seen data that are unsynced
-y, --yes Auto-confirm prompts from --update for updating docs, filepaths, and metadata
--docs Sync Practice Exercise '.docs/introduction.md' and '.docs/instructions.md' files
--filepaths Populate empty 'files' values in Concept/Practice exercise '.meta/config.json' files
--metadata Sync Practice Exercise '.meta/config.json' metadata values
--tests [mode] Sync Practice Exercise '.meta/tests.toml' files.
The mode value specifies how missing tests are handled when using --update.
Allowed values: c[hoose], i[nclude], e[xclude] (default: choose)
Eine Practice-Übung, die aus dem Repo problem-specifications abgeleitet ist, muss eine .docs/instructions.md-Datei haben (und möglicherweise zusätzlich eine .docs/introduction.md-Datei), die die Übungsdokumentation aus problem-specifications enthält.
Um jede Practice-Übung im Track auf verfügbare Dokumentations-Updates zu prüfen (mit einem Exit-Code ungleich null, wenn mindestens ein Update verfügbar ist):
configlet sync --docs
Um die Dokumentation für jede Practice-Übung interaktiv zu aktualisieren, füge die Option --update hinzu (kurz -u):
configlet sync --docs --update
Um die Dokumentation für jede Practice-Übung ohne Rückfragen zu aktualisieren, füge die Option --yes hinzu (kurz -y):
configlet sync --docs --update --yes
Um nur eine einzelne Practice-Übung zu bearbeiten, verwende die Option --exercise (kurz -e).
Um zum Beispiel die Dokumentation für die Übung prime-factors ohne Rückfragen zu aktualisieren:
configlet sync --docs -uy -e prime-factors
Jede Übung in einem Track muss eine .meta/config.json-Datei haben.
Bei einer Practice-Übung, die aus dem Repo problem-specifications abgeleitet ist, sollte diese Datei die Schlüssel-Wert-Paare blurb, source und source_url enthalten, die in der entsprechenden metadata.toml-Datei upstream stehen.
Um jede Practice-Übung auf verfügbare Metadaten-Updates zu prüfen (mit einem Exit-Code ungleich null, wenn mindestens ein Update verfügbar ist):
configlet sync --metadata
Um die Metadaten für jede Practice-Übung interaktiv zu aktualisieren, füge die Option --update hinzu (kurz -u):
configlet sync --metadata --update
Um die Metadaten für jede Practice-Übung ohne Rückfragen zu aktualisieren, füge die Option --yes hinzu (kurz -y):
configlet sync --metadata --update --yes
Um nur eine einzelne Practice-Übung zu bearbeiten, verwende die Option --exercise (kurz -e).
Um zum Beispiel die Metadaten für die Übung prime-factors ohne Rückfragen zu aktualisieren:
configlet sync --metadata -uy -e prime-factors
Wenn ein Track eine Übung implementiert, für die Testdaten im problem-specifications-Repo existieren, muss die Übung eine .meta/tests.toml-Datei enthalten.
Ziel der tests.toml-Datei ist es, den Überblick darüber zu behalten, welche Tests von der Übung implementiert werden.
Tests in dieser Datei werden über ihre UUID identifiziert, und jeder Test hat einen booleschen Wert, der angibt, ob er von dieser Übung implementiert wird.
Eine tests.toml-Datei hat folgendes Format:
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.
[1e22cceb-c5e4-4562-9afe-aef07ad1eaf4]
description = "basic"
[79ae3889-a5c0-4b01-baf0-232d31180c08]
description = "lowercase words"
[ec7000a7-3931-4a17-890e-33ca2073a548]
description = "invalid input"
include = false
comment = "excluded because we don't want to add error handling to the exercise"
In diesem Fall hat der Track beschlossen, zwei der drei verfügbaren Tests zu implementieren.
Wenn ein Track einen Testgenerator verwendet, um die Testsuite einer Übung zu erzeugen, muss er den Inhalt der tests.toml-Datei verwenden, um zu bestimmen, welche Tests in die erzeugte Testsuite aufgenommen werden.
Um jede tests.toml-Datei einer Practice-Übung auf verfügbare Test-Updates zu prüfen (mit einem Exit-Code ungleich null, wenn mindestens ein Testfall in den kanonischen Daten der Übung vorkommt, aber nicht in der tests.toml):
configlet sync --tests
Um die tests.toml-Datei für jede Practice-Übung interaktiv zu aktualisieren, füge die Option --update hinzu:
configlet sync --tests --update
Für jeden fehlenden Test wirst du aufgefordert, zu wählen, ob er eingebunden, ausgeschlossen oder übersprungen werden soll, und die entsprechende tests.toml-Datei wird entsprechend aktualisiert.
Configlet schreibt die tests.toml-Datei einer Übung, sobald du alle Entscheidungen für diese Übung getroffen hast.
Das bedeutet, dass du configlet an einer Eingabeaufforderung beenden kannst (zum Beispiel mit Strg-C im Terminal) und höchstens die Synchronisierungsentscheidungen für eine einzige Übung verlierst.
Um ohne Rückfragen jeden noch nicht gesehenen Testfall einzubinden, verwende --tests include.
Um das zum Beispiel für eine Übung namens prime-factors zu tun:
configlet sync --tests include -u -e prime-factors
Denk daran, diese Tests im Track auch tatsächlich zu implementieren!
Schließlich kümmert sich der Befehl sync auch um das „Synchronisieren“ aus einer Quelle, die nicht problem-specifications ist, nämlich der track-weiten config.json-Datei.
Jede Concept-Übung und jede Practice-Übung muss eine .meta/config.json-Datei mit einem files-Objekt haben, das die (relativen) Speicherorte der Dateien angibt, die die Übung verwendet.
Solche Dateipfade folgen meist einem einfachen Muster, sodass configlet die Werte auf Übungsebene aus Mustern im files-Schlüssel der track-weiten config.json-Datei befüllen kann.
Um zu prüfen, ob jede Concept-Übung und jede Practice-Übung im Track einen vollständig befüllten files-Schlüssel hat (oder zumindest einen, der nicht aus dem track-weiten files-Schlüssel befüllt werden kann):
configlet sync --filepaths
(Beachte, dass configlet lint ebenfalls einen Fehler ausgibt, wenn einer Übung der files-Schlüssel fehlt oder leer ist.)
Um leere oder fehlende Werte des files-Schlüssels auf Übungsebene für jede Concept-Übung und jede Practice-Übung aus den Mustern im track-weiten files-Schlüssel zu befüllen:
configlet sync --filepaths --update
Um das ohne Rückfragen und für eine einzelne Übung namens prime-factors zu tun:
configlet sync --filepaths -uy -e prime-factors
sync verwenden, wenn du eine neue Übung zu einem Track hinzufügstDer Befehl sync ist nützlich, wenn du eine neue Übung zu einem Track hinzufügst.
Wenn du eine Practice-Übung namens foo hinzufügst, die in problem-specifications existiert, ist ein möglicher Workflow:
foo in die track-weite config.json-Datei ein.
Dadurch wird die Übung für configlet sync sichtbar.configlet sync --docs --filepaths --metadata -uy -e foo aus, um die Dokumentation der Übung und eine anfängliche .meta/config.json-Datei mit befüllten Werten für files, blurb und vielleicht source und source_url zu erstellen..meta/config.json-Datei der Übung nach Belieben.
Trage dich zum Beispiel selbst in das authors-Array ein.configlet sync --tests include -u -e foo aus, um eine .meta/tests.toml-Datei zu erstellen, in der jeder Test eingebunden ist..meta/tests.toml-Datei an und füge include = false bei jedem Testfall hinzu, den die Übung nicht implementieren wird..meta/tests.toml eingebunden sind.