ISUCONのサンプルアプリケーションのフレームワークだったKossyを単独ディストリビューションにして、いくつか機能追加した。ただしテストはないのでアルファクオリティ。
https://github.com/kazeburo/Kossy
Plack、Router::Simple、Text::Xslateがベースで、独自のvalidatorが付いている程度のそれほど特徴はないsinatra風フレームワークです。それでもツールや管理画面を作るのに楽だと思う。
スケルトンを作るスクリプトが付いたのでそれを使うサンプル。
% kossy-setup MyApp
% cd MyApp
% plackup app.psgi
これだけでアプリケーションが起動。
生成されたファイルツリーは
% tree
.
├── Makefile.PL
├── app.psgi
├── lib
│ ├── MyApp
│ │ └── Web.pm
│ └── MyApp.pm
├── public
│ ├── css
│ ├── images
│ └── js
├── t
│ └── 00_compile.t
└── views
├── base.tx
└── index.tx
lib/MyApp/Web.pmがアプリケーションのクラス、public以下に静的ファイル。views以下にテンプレートを置きます。Web.pmの中身を見ると以下のようになっています。
package MyApp::Web;
use strict;
use warnings;
use utf8;
use Kossy;
filter 'set_title' => sub {
my $app = shift;
sub {
my ( $self, $c ) = @_;
$c->stash->{site_name} = __PACKAGE__;
$app->($self,$c);
}
};
get '/' => [qw/set_title/] => sub {
my ( $self, $c ) = @_;
$c->render('index.tx', { greeting => "Hello!" });
};
get '/json' => sub {
my ( $self, $c ) = @_;
my $result = $c->req->validator([
'q' => {
default => 'Hello',
rule => [
[['CHOICE',qw/Hello Bye/],'Hello or Bye']
],
}
]);
$c->render_json({ greeting => $result->valid->get('q') });
};
1;
filter はアプリケーション内ミドルウェアのような機能です。Plack::Middleware同様、$appをラップして動作します。使うにはdispacherの第二引数に配列のリファレンスとして指定します。
dispacherはget(head)とpostがサポート。
get 'url' => [フィルター指定] => code
という形式でアプリケーションを構築して行きます。codeにはMyAppのオブジェクトとKossy::Connectionのオブジェクトが渡されます。MyAppのオブジェクトはアプリケーションのプロセスが死ぬまで有効、Kossy::Connectionのオブジェクトはリクエスト単位になるので、その辺で使い分けができると思う。
その他のクラスやvalidatorの使い方はPodに書いてみたりしているので、興味があれば見て頂けたらと思います。Kossyはもうすこしアプリケーションを作ってみながら機能追加して行く予定です。