最初の演習を追加する


各トラックの最初の演習は、とてもシンプルな「Hello, World!」の演習です。

この演習の目的は、すべてが正しくつながっているかをすばやく確認することです。 これにより、ユーザーがプログラミング環境を正しくインストールできているか、テストの実行方法を理解しているか、そしてテストに合格できるかを確認できます。 さらに、Exercismのコマンドラインクライアント(CLI)については、CLIが正しくインストールされ設定されているか、そしてサイトが不要な生成物を含めずに演習に必要な正しいファイルを配信しているかも確認できます。 最後に、CLIを使って演習をダウンロードし、ローカルの開発環境で問題を解き、その解答をサイトに提出するという流れに、ユーザーが慣れているかを確認できます。

言い換えると、まだ言語そのものについて何かを学ぶための演習ではありません。 とにかくシンプルであることを目指します。

また、演習を実装するには多くの要素が関わってくるため、トラックのリポジトリを正しくセットアップするうえで、おそらくここが最も難しい部分になります。

演習を実装する

「Hello, World!」の演習には、いくつかの特別なルールがあります。

  • 常にトラックの最初の演習になります
  • すべてのトラックがこれを実装する必要があります
  • テストファイルにはテストが1つだけ含まれます
  • スタブファイルにはほぼ動作する実装が入っていますが、「Hello, World!」の代わりに「Goodbye, Mars!」を使います
  • prerequisitesがありません
  • practicesがありません

ファイルパスを決める

「Hello, World!」の演習(そして実はExercismの_すべての_演習)には、決まったファイル一式が必要です。

  • ドキュメント:学習者に何をする必要があるかを説明します(自動生成できます)。
  • メタデータ:演習に関するメタデータをExercismに提供します(ほとんど自動生成できます)。
  • テストスイート:解答が正しいかを検証します(トラック固有)。
  • スタブ実装:学習者に開始点を提供します(トラック固有)。
  • 実装例:すべてのテストに合格する実装例を提供します(トラック固有)。
  • 追加ファイル:テストを実行できるようにします(トラック固有、任意)。

「Hello, World!」の演習を作成する前に、トラック固有のファイル名とファイルパス(テストスイート、スタブ実装、実装例、追加ファイル)を決める必要があります。

目安は、その言語で慣用的な名前を使うことです。 強いこだわりがない場合は、より浅いディレクトリ構造を選びましょう。 実装例はCIスクリプトから識別できる必要があるので、すべての演習で使える汎用的なベース名を選ぶとよいでしょう。たとえばexample、sample、reference-solutionなどです。

ファイルパスを設定する

トラック固有のファイルパスを決めたら、ルートのconfig.jsonファイルにあるfilesキーでそれらを設定します。 filesキーはすべての演習のテンプレートとして機能し、これにより各種ツール(このあと少し使います)がファイルの場所を把握できます。 さまざまなプレースホルダーを使うと、演習のスラッグ(ここではhello-world)を簡単に設定できます。

例

トラックがファイル名にパスカルケースを使っている場合、filesキーは次のようになります。

"files": {
  "solution": [
    "%{pascal_slug}.cs"
  ],
  "test": [
    "%{pascal_slug}Tests.cs"
  ],
  "example": [
    ".meta/Example.cs"
  ]
}
Note

実装例のファイルは.metaディレクトリ内に置いてください。

詳しくは、filesキーのドキュメントを参照してください。

ファイルを作成する

ファイルパスのテンプレートを指定したら、トラックのルートディレクトリで次のコマンドを実行すると、「Hello, World!」の演習のファイルをすばやく生成できます。

bin/fetch-configlet
bin/configlet create --practice-exercise hello-world

作者を設定する

サイトに演習の作者として表示されるようにするには、次の手順を行います。

演習の.meta/config.jsonファイルで:

  • authorsキーにGitHubのユーザー名を追加します

これが機能するには、ExercismのアカウントをGitHubに連携する必要があります。 これはサイトの設定ページの連携セクションで行えます。

Note

演習の作者にはレピュテーションも付与されます

スクリプトを使う

新しいトラックのリポジトリでは、bin/add-practice-exerciseスクリプト(ソース)を使って新しい演習を追加できます。

bin/add-exercise -a <github_username> two-fer
Note

このファイルがないトラックのリポジトリで作業している場合は、上のソースリンクから自分のリポジトリにコピーしてかまいません。

演習のコードを実装する

生成されたファイルが作成できたら、次に次のことを行います。

  • テストファイルにテストを追加する
  • 実装例を追加する
  • スタブファイルの内容を定義する

テストを追加する

演習を追加するうえで重要なのが、テストを追加することです。 おおまかに言うと、上記のような演習を実装する方法は2つあります。

  1. 演習のcanonical-data.jsonにあるテストケースを使って、テストを一から実装する
  2. 別のトラックの実装からテストを移植する(ヒント:https://exercism.org/exercises/hello-worldにアクセスすると、どのトラックがその演習を実装済みかを一覧できます)。

「Hello, World!」の演習にはテストケースが1つしかないので、どちらの方法でも問題ありません。

実装例を追加する

実装例のファイルには、テストを解くのに必要なコードを書きます。

スタブを定義する

スタブファイルには、テストに対して_ほぼ_動作する解答を用意しますが、「Hello, World!」というテキストを「Goodbye, Mars!」に置き換えます。 ヒント:実装例をコピーして貼り付け、少し手を加えるだけでかまいません。

演習の作者を更新する

演習ができたら、演習の.meta/config.jsonファイルにある"authors"配列にGitHubのユーザー名を追加してください。 これにより、演習を作成したのがあなたであることが正しく記録されます。

リント

演習が正しく設定されているかを確認するには、configletツールの組み込みのリント機能を使います。

まずはconfigletツールを取得します。そのために2つのスクリプトを用意しています。

  • bin/fetch-configlet:*nixまたはmacOSで使う場合はこれを実行します
  • bin/fetch-configlet.ps1:Windowsで使う場合はこれを実行します

トラックのリポジトリのルートディレクトリでこれらのスクリプトのいずれかを実行すると、bin/configletまたはbin/configlet.exeバイナリがダウンロードされます。

その後、bin/configlet lintを実行すると、演習が正しいかどうかを確認できます。

Note

configletが次のエラーを報告する可能性があります。

The `tags` array is empty:
/path/to/track/config.json

このエラーは公開の準備のステップで修正されるので、次のいずれかを行います。

  • エラーを(今のところ)無視する
  • タグを追加してエラーを修正する
Note

configletワークフローは、mainにプッシュされたとき、またはプルリクエストにプッシュされたときに、自動的にconfiglet lintを実行します。