problem-specificationsリポジトリと演習データを同期するExercismトラックの練習問題は、しばしばexercism/problem-specificationsリポジトリの仕様をもとに実装されます。
Exercismでは、たとえその演習がproblem-specificationsに存在していても、すべての演習が特定のファイル(.docs/instructions.mdなど)のコピーをそれぞれ持つことが意図的に求められています。
そのためconfigletにはsyncコマンドがあり、トラック上のそうした練習問題が上流のソースと同期しているかを確認し、更新があれば更新できます。
problem-specificationsから更新できるデータには3種類あります。ドキュメント、メタデータ、テストです。
また、トラックレベルのconfig.jsonファイルから設定できるデータが1種類あります。演習の設定ファイルにあるファイルパスです。
これらのデータ種別の確認と更新については、以下の各セクションで説明しますが、手短にまとめると次のとおりです。
configlet syncが操作するのは、トラックレベルのconfig.jsonファイルに存在する演習だけです。
そのため、トラックに新しい演習を実装していて、configlet syncで初期ファイルを追加したい場合は、まずその演習をトラックレベルのconfig.jsonファイルに追加してください。
まだユーザーに公開する準備ができていない演習なら、statusの値をwipに設定してください。configlet syncはトラックに何も変更せず、すべての演習についてすべてのデータ種別を確認します。--docs、--filepaths、--metadata、--testsのオプションを適宜組み合わせて使います。--updateオプションを使います。--update --yesを使います。--update --tests include --exercise prime-factorsを使います。problem-specificationsリポジトリのダウンロードを省略するには、--offline --prob-specs-dir /path/to/local/problem-specificationsを追加します。configlet syncは更新時に演習の.meta/config.jsonファイルのキーの順序を保とうとすることに注意してください。
同期せずにこれらのファイルを正規の形式で書き出すには、configlet fmtコマンドを使ってください。
ただしconfiglet syncは、必須キー(authors、files、blurb)が欠けている場合は(空の場合もある)それらを追加_します_。
これは「同期らしさ」には欠けますが、より使い勝手が良いです。新しい演習を実装するときに、syncを使ってスターターの.meta/config.jsonファイルを作成できます。configlet syncは仕様にないキーを削除します。
カスタムのキーと値のペアは引き続きサポートされます。customという名前のJSONオブジェクトの中に書く必要があります。configletのリリース4.0.0-alpha.34以前では、syncコマンドはテストだけを操作していたことに注意してください。
syncコマンドは、'problem-specifications'から練習問題のドキュメント、メタデータ、テストを確認または更新するために使えます。
また、トラックの'config.json'から概念演習・練習問題の欠けているfilesの値を確認または設定するのにも使えます。
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)
problem-specificationsリポジトリから派生した練習問題には、problem-specificationsの演習ドキュメントを含む.docs/instructions.mdファイル(および場合によっては.docs/introduction.mdファイルも)がなければなりません。
トラック上のすべての練習問題について、利用可能なドキュメントの更新があるか確認するには(少なくとも1つ更新があれば非ゼロの終了コードで終了します):
configlet sync --docs
すべての練習問題のドキュメントを対話的に更新するには、--updateオプション(短縮形は-u)を追加します:
configlet sync --docs --update
すべての練習問題のドキュメントを非対話的に更新するには、--yesオプション(短縮形は-y)を追加します:
configlet sync --docs --update --yes
1つの練習問題だけを操作するには、--exerciseオプション(短縮形は-e)を使います。
たとえば、prime-factors演習のドキュメントを非対話的に更新するには:
configlet sync --docs -uy -e prime-factors
トラック上のすべての演習には.meta/config.jsonファイルがなければなりません。
problem-specificationsリポジトリから派生した練習問題では、このファイルに、対応する上流のmetadata.tomlファイルに存在するblurb、source、source_urlのキーと値のペアが含まれている必要があります。
すべての練習問題について、利用可能なメタデータの更新があるか確認するには(少なくとも1つ更新があれば非ゼロの終了コードで終了します):
configlet sync --metadata
すべての練習問題のメタデータを対話的に更新するには、--updateオプション(短縮形は-u)を追加します:
configlet sync --metadata --update
すべての練習問題のメタデータを非対話的に更新するには、--yesオプション(短縮形は-y)を追加します:
configlet sync --metadata --update --yes
1つの練習問題だけを操作するには、--exerciseオプション(短縮形は-e)を使います。
たとえば、prime-factors演習のメタデータを非対話的に更新するには:
configlet sync --metadata -uy -e prime-factors
トラックが、problem-specificationsリポジトリにテストデータが存在する演習を実装する場合、その演習には.meta/tests.tomlファイルが_必ず_含まれていなければなりません。
tests.tomlファイルの目的は、どのテストがその演習で実装されているかを追跡することです。
このファイルのテストはUUIDで識別され、各テストには、その演習で実装されているかどうかを示す真偽値が付きます。
tests.tomlファイルは次の形式です。
# 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"
この場合、トラックは利用可能な3つのテストのうち2つを実装することを選んでいます。
トラックが_テストジェネレーター_を使って演習のテストスイートを生成する場合、tests.tomlファイルの内容を使って、生成するテストスイートにどのテストを含めるかを決め_なければなりません_。
すべての練習問題のtests.tomlファイルについて、利用可能なテストの更新があるか確認するには(その演習の正規データに現れるのにtests.tomlにないテストケースが少なくとも1つあれば非ゼロの終了コードで終了します):
configlet sync --tests
すべての練習問題のtests.tomlファイルを対話的に更新するには、--updateオプションを追加します:
configlet sync --tests --update
欠けているテストごとに、それを含めるか除外するかスキップするかを選ぶようユーザーに促し、それに応じて対応するtests.tomlファイルを更新します。
configletは、ユーザーがその演習についての選択を終えると、その演習のtests.tomlファイルを書き込みます。
つまり、プロンプトの途中でconfigletを終了しても(たとえばターミナルでCtrl-Cを押す)、失われる同期の判断は多くとも1つの演習分だけです。
まだ取り込んでいないすべてのテストケースを非対話的に取り込むには、--tests includeを使います。
たとえば、prime-factorsという名前の演習でこれを行うには:
configlet sync --tests include -u -e prime-factors
忘れずに、トラック上でこれらのテストを実際に実装しましょう!
最後に、syncコマンドはproblem-specifications以外のソース、つまりトラックレベルのconfig.jsonファイルからの「同期」も扱います。
すべての概念演習と練習問題には、その演習が使うファイルの(相対)位置を指定するfilesオブジェクトを持つ.meta/config.jsonファイルがなければなりません。
そうしたファイルパスはたいてい単純なパターンに従うので、configletはトラックレベルのconfig.jsonファイルのfilesキーのパターンから、演習レベルの値を設定できます。
トラック上のすべての概念演習と練習問題が、完全に設定されたfilesキーを持つこと(または少なくとも、トラックレベルのfilesキーからは設定できないfilesキーを持つこと)を確認するには:
configlet sync --filepaths
(演習のfilesキーが欠けている、または空の場合、configlet lintもエラーを出すことに注意してください。)
すべての概念演習と練習問題について、演習レベルのfilesキーの空または欠けている値を、トラックレベルのfilesキーのパターンから設定するには:
configlet sync --filepaths --update
これを非対話的に、prime-factorsという名前の1つの演習だけに対して行うには:
configlet sync --filepaths -uy -e prime-factors
syncを使うsyncコマンドは、トラックに新しい演習を追加するときに役立ちます。
problem-specificationsに存在するfooという名前の練習問題を追加する場合、考えられるワークフローの1つは次のとおりです。
config.jsonファイルに、演習fooのエントリーを手動で追加します。
これでその演習がconfiglet syncから見えるようになります。configlet sync --docs --filepaths --metadata -uy -e fooを実行して、その演習のドキュメントと、files、blurb、そしておそらくsourceとsource_urlの値が設定されたスターターの.meta/config.jsonファイルを作成します。.meta/config.jsonファイルを好みに合わせて編集します。
たとえば、authors配列に自分自身を追加します。configlet sync --tests include -u -e fooを実行して、すべてのテストが含まれた.meta/tests.tomlファイルを作成します。.meta/tests.tomlファイルを見て、その演習で実装しないテストケースにinclude = falseを追加します。.meta/tests.tomlに含めたテストに合わせて、その演習のテストを実装します。