Representerのインターフェース


Exercismのウェブサイトとのやり取りは、すべて自動で行われます。 Representerの役割はただ1つ、解答を受け取り、そのrepresentationを返すことだけです。 詳しくははじめにを参照してください。

実行

  • Representerは、実行可能なスクリプトを用意する必要があります。詳しくはdocker.mdを参照してください。
  • スクリプトは3つのパラメーターを受け取ります:
    • 演習のスラッグ(例:two-fer)。
    • 提出されたファイルが入っているディレクトリへのパス(末尾にスラッシュが付きます)。
    • 出力ディレクトリへのパス(末尾にスラッシュが付きます)。このディレクトリには書き込みができます。
  • スクリプトは、出力ディレクトリにrepresentation.txtファイルを書き込まなければなりません。
  • スクリプトは、出力ディレクトリにrepresentation.jsonファイルを書き込まなければなりません。
  • スクリプトは、出力ディレクトリにmapping.jsonファイルを書き込まなければなりません。

実行時間の上限

Representerは、1つの解答につき20秒間、マシンのリソースを100%使うことができます。 20秒を過ぎると、プロセスは停止され、タイムアウトとして報告されます。

Note

タイムアウトになる可能性を減らすために、パフォーマンスのベストプラクティスに従うことを強くおすすめします。

出力形式

representation.txt

representation.txtファイルには、何らかの標準化されたrepresentationが入ります。このrepresentationはさまざまな形をとりますが、通常はASTです:

s(:class,
  s(:const, nil, :PLACEHOLDER_1), nil,
  s(:begin,
    s(:def, :PLACEHOLDER_2,
      s(:args),
      s(:begin,
        s(:lvasgn, :PLACEHOLDER_3,
          s(:str, "foo")),
        s(:lvasgn, :PLACEHOLDER_4,
          s(:str, "foo")),
        s(:return,
          s(:lvar, :PLACEHOLDER_3)))),
    s(:def, :PLACEHOLDER_3,
      s(:args),
      s(:const, nil, :PLACEHOLDER_1))))

representationは、(正規化された)ソースコードそのものでもかまいません:

class PLACEHOLDER_1
  def PLACEHOLDER_2
    PLACEHOLDER_3 = "foo"
    PLACEHOLDER_4 = "foo"
    return PLACEHOLDER_3
  end

  def PLACEHOLDER_3
    PLACEHOLDER_1
  end
end

mapping.json

mapping.jsonファイルは、プレースホルダーを元の値に対応づけます:

{
  "PLACEHOLDER_1": "TwoFer",
  "PLACEHOLDER_2": "two_fer",
  "PLACEHOLDER_3": "foo",
  "PLACEHOLDER_4": "bar"
}

重要なのは、スコープに関係なく、同じ名前はすべて同じプレースホルダーに置き換えなければならないという点です。

representation.json

representation.jsonファイルにはメタデータが入ります:

  • version:Representerのバージョン番号(デフォルトは1)

例:

{ "version": 2 }