Jokk というライブラリを作った

年始に [twitter:@bathtimefish] さんと [twitter:@kadoppe] さんと食事しながら色々話しをした時に、EasyMock という Node.js のプロダクトが良いという話しを聞いた。
https://github.com/cyberagent-jp/node-easymock


これは何かというと、フロントエンドの開発者とサーバ側の開発者が別の場合、サーバ側がまだ出来てないけど、フロントエンド側がサーバ側から HTTP 経由でデータを欲しい場合がある。
その時にとりあえずダミーで良いからモックデータを返して欲しいという要望があるとする。
いちいちマイクロフレームワークでサーバ立ててとかするんだろうけど、それを簡単にしてくれるという物。
URI のリソースと json ファイルが一対一でマッピングされており、URI にアクセスすると該当の JSON ファイルの中身を応答するという物。
Node.js で作られている。
Web APIの開発に使えるモックサーバ·EasyMock Server MOONGIFT


便利そうだったので見てみたが、ドキュメントが最低限の事しか書かれてないし、config.json や 配信する json ファイルを格納する所を任意に指定とかできなさそう、応答するステータスコードの指定が出来なさそう等色々出てきたので、似たようなものを Python で実装した。
GitHub - heavenshell/py-jokk: RESTful mock api server.


本体に Pull Request せずに Python で似たようなのを作ったのは、Node.js が良くわからなかったからというのが大きい。

使い方

PyPi に登録したので、pip でインストールできる。

$ mkvirtualenv jokk_sample
$ mkdir jokk_sample
$ cd jokk_sample
$ pip install jokk

これで jokk コマンドが使用できる。
Werkzeug を使ってるので必須。
また Werkzeug が現状 Python3 に対応してないので、必然的に Python2.7 までしか動かない。
# Python2.6 も tox のテストで通ってるから多分動く
# Python2.5 以下は未対応

{
  "data": "./data",
  "cors": false,
  "jsonp": true,
  "variables": {
    "server": "http://server.com"
  },
  "routes": [
    "/",
    "/user/<userid>",
    "/user/<userid>/profile",
    "/item"
  ]
}

こんな感じで config.json を作る。

データ格納場所

data がクライアントに応答するファイルを格納する。

クロスドメイン

cors を true にすると Cross-Origin Resource Sharing が有効になる。
jsonp を true にすると jsonp の応答(callback が先頭に追加する)する。

テンプレート変数

variables に値を定義するとその値が応答するファイル内でテンプレートとして動的に追加できる。
また routes で定義した のような変数もテンプレート内で参照できる。

ルーティング

routes にルーティングを定義する。
Werkzeug のルーティングの書き方をする。

ファイルには以下のような命名規則がある。

ルーティングのパス + '_' + HTTP Method + .{json,xml,html,txt}
ルーティング ファイルパス
/ ./data/_get.json
/user/ ./data/user/userid_get.json
/user//profile ./data/user/userid/profile_get.json
/item ./data/item_get.json

レスポンス用のファイル名と同じ形式で .status ファイルを作成し、中身に応答したい HTTP ステータスコードを書くと、それが設定される。

/item ./data/item_post.status

中身が

201

だとすると、レスポンスのステータスコードに 201 が設定される。


ここが EasyMock との一番の違い。
EasyMock は HTTP のステータスコードまで考慮してないっぽい。
RESTful なサーバの場合は HTTP ステータスコードを見てどうこうというのがあると思うので、そこら辺も押さえておきたかった。

起動方法

$ jokk -c config.json
 * Running on http://127.0.0.1:5000/

設定ファイルを指定して起動をし、ブラウザやその他クライアントでアクセスすると、レスポンスファイルが拡張子に応じた mimetype で応答する。

Jokk ってなんて読むの?

Jokk の元ネタはヨックモック(YokuMoku)でヨックモックはスウェーデンの JokkMokk から取ってるそうなので、ヨックと読む。