マニフェスト @ PettanStandard

ぺったんRサーバーのシステム構成をjson形式のテキストファイルで目録にしたもの。これによって各種クライアントアプリケーションがぺったんRサーバーと連係できるようになる。

WebサービスはMVCで構成される。このうち、Viewの良し悪しは好みによって分かれる。通常のWebサービスはAPIを提供し、ユーザーは好みのUIを備えたクライアントを選択して利用する。サーバのAPIが安定していれば、より良いサービスを提供できる。しかしながら、ぺったんRは管理者の方針によって機能を自由に追加、削除できるので、必ずしもAPIが安定しているとは言えない。そこで、 APIと、それをcallした時の結果を配信する形にして安定化を図る試みがマニフェストである。

マニフェストの種類

マニフェストにはグローバルマニフェストとローカルマニフェストの二種類がある。

グローバルマニフェストはこれを守らないと、クライアントが正しく動作しない性質のもの。例えばリソース名称(APIのURL)やモデルの構造など。この扱いを間違えると入力値を間違えて送信するなど、サーバとうまく連携できない。

ローカルマニフェストは外観に関係するもの。サーバが出力するページは、この設定をもとに生成される。設定通りに振る舞うことで、サーバと同じページを作ることができる。しかし、クライアントは必ずしもこれに従わなければならないわけでは無い。 この設定を無視して独自のデザインしても良い。

グローバルマニフェスト

サーバから/manifest.jsonを取得するとグローバルマニフェストを入手できる。

ペタナイズドアイテムについて

ペタナイズドアイテムとは AboutItem

ペタナイズドアイテムのマニフェスト ManifestItem

マニフェストのモデルは、拡張モデルも含めたすべてのモデルを記述している。つまり、クライアントが利用可能なリソースとしてのモデルのマニフェストと拡張データを展開するためのマニフェストとの区別がない。また、リソースごとのふるまいの違いを区別する方法もないので、モデルとは別にマニフェストを用意した。

コントローラについて

コントローラとは AboutController

コントローラのマニフェスト ManifestController

モデルについて

モデルとは AboutModel

モデルのマニフェスト ManifestModel

システム定数について

システム定数とは AboutSystemResources

システム定数のマニフェスト ManifestSystemResources

ローカルマニフェスト

サーバから/local_manifest.jsonを取得するとローカルマニフェストを入手できる。

ファイラーについて

ファイラーとは AboutFiler

ファイラーのマニフェスト ManifestFiler

プロファイラーについて

プロファイラーとは AboutProfiler

プロファイラーのマニフェスト ManifestProfiler

リストグループについて

リストグループとは AboutListGroup

モデルが搭載している一覧取得メソッドが設定されているが、、この情報だけでは期待する一覧を取得することができない。そもそも一覧を取得するためのロジックを外部のクライアントが知る必要がないのである。クライアントはapiを叩けば一覧が返ることさえわかればよいのである。よって、モデルのマニフェストではは詳細なロジックについての設定は記述されない。そこを補足するための設定が、このマニフェストである。

リストグループのマニフェスト ManifestListGroup

入力フォームについて

入力フォームとは AboutForm

大雑把な入力フォームであれば、モデルのマニフェストから生成することは十分に可能である。しかしながら、使い勝手の良い見やすいフォームを表示しようと思うと、それなりな配慮が必要である。そこを補足するための設定が、このマニフェストである。

入力フォームのマニフェスト ManifestForm

バケットについて

ネストしたエレメントの入力フォームを実現するためにバケットという単位を設けてみたが、あまりうまくいきそうにないので取り消した。今残っているのは残骸である。

国際化について

ManifestBase

Locmare

Local Manifest Renderを省略した。

マニフェストおよびローカルマニフェストは、ユーザに提供する画面を作り出すために定義したものなので、最終的にはそれを出力するための仕組みが必要。Locmareは、マニフェストで定義されたものを、画面に描画したり実行したりする。レンダラとかついているけど、描画しないものもある。

ブーストについて LocmareBooster

ファイラーについて LocmareFiler

プロファイラーについて LocmareProfiler

リストグループについて LocmareListGroup

入力フォームについて LocmareForm

共通するお約束

なお、テンプレートはJavaScriptで動くことを考慮して、移植性の高い形にしておくのが理想と思われる。今回はbackboneとアンダースコアを利用することを念頭に実装した。

テンプレートにはロジックを書くこともできるが、テンプレート内で条件分岐を繰り返すと、かえって処理を複雑にしてしまう。テンプレートには、極力ロジックを埋めこまない前提で、分岐処理はManifestViewのテンプレートファイル切り替えで行うようにしたい。

テンプレートは基本的には一つのディレクトリに収められるが、条件分岐で切り替えられるテンプレートについては、一つ下の階層のディレクトリに収める。

例えば、testブロックがfooとbarのどちらかの部品を表示するとき、テンプレートの配置は次のようになる。

test.html.erb
test/
    foo.html.erb
    bar.html.erb

Railsでの実装

マニフェストの読み込み

マニフェストは頻繁に変更されるものではないので、サーバ起動時に読み込んでおく。グローバルマニフェスト、ローカルマニフェストともに読み込む。マニフェストに従ってペタナイズを行い、システムリソースを必要に応じて書き換える。

かなり注意

Railsは、サーバ起動時の環境設定の順序がけっこう複雑なので、マニフェストを読み込む順番に気を付けないと期待したように動作しない。

アプリケーションを起動する時、ルートの記述から行う。ルートの設定ではライセンスグループや吹き出しテンプレートをマニフェストから動的に読み込むので、必ずマニフェストを先に読み込まなければならない。具体的にはrbでアプリケーションのconfigurationを行う前に読み込む。

しかし、この段階では、マニフェストの初期化に必要な情報が全く設定されていないので、マニフェストを準備することはできない。つまり、マニフェストの起動にはアプリケーションのconfigが必要だが、それを実行するにはマニフェストが必要という問題になる。

そこで、ルーティングに必要な情報(システムリソース)だけを先に読み込んで、仮のインスタンスを作成しておき、アプリケーションのconfigが完了した後、別途マニフェストを初期化する。