Heroicsという、JSON Schemaを元にAPIクライアントのコードを自動生成するやつを見た。 Heroicsにはbin/heroics-generateというコマンドラインツールが付いていて、JSON Schemaを解析したあと、 client.erbというERBのテンプレートに解析結果のオブジェクトを渡した結果、client.rbという雑なファイルを生成する。
$ gem install heroics $ heroics-generate SuperAwesomeClient schema.json https://api.example.com > client.rb
Heroicsから生成されるもの
JSON Schemaからこんな感じで使えるやつを生成してくれる。
# client.rb
client = SuperAwesomeClient.connect(api_key)
client.recipe.create("title")
client.recipe.list #=> [...]
client.recipe.show(123)
JSON Schema
普通JSONで書くけど紙面の都合上ちょっと読みにくいのでYAML形式で記述しときます。
---
"$schema": http://json-schema.org/draft-04/hyper-schema
title: Super ultra awesome API
type:
- object
properties:
recipe:
"$ref": "#/definitions/recipe"
definitions:
recipe:
title: Cooking Recipe
type:
- object
properties:
id:
"$ref": "#/definitions/recipe/definitions/_id"
created_at:
"$ref": "#/definitions/recipe/definitions/_created_at"
title:
"$ref": "#/definitions/recipe/definitions/title"
definitions:
id:
description: ID
readOnly: true
type:
- string
created_at:
description: When this object was created
format: date-time
readOnly: true
type:
- string
title:
description: Recipe title
type: "string"
links:
- description: List recipes
href: "/recipes"
method: GET
rel: instances
title: List
- description: Show the recipe
href: "/recipes/({#/definitions/recipe/definitions/id})"
method: GET
rel: self
title: Show
- description: Create a new recipe
href: "/recipes"
method: POST
rel: create
title: Create
schema:
properties:
title:
"$ref": "#/definitions/recipe/definitions/title"
Heroicsが解析するもの
定義されてるオブジェクト一覧を json.properties から持ってきて、それをクラスとして定義する。 また、これらのオブジェクトに定義されているlinksというプロパティから定義されているAPIの情報を知り、 定義したクラスにそのAPIにアクセスするためのメソッドを生やす。このときメソッド名はlinks内のtitleプロパティが利用される。 "$ref": "#/definitions/recipe/definitions/title"や href: "/recipes/({#/definitions/recipe/definitions/id})"というのは JSON Schemaで定められている他のプロパティを参照するための記法。