PlaggerLDR 改造
簡易認証追加と server.pl -d
のときだけデバッグモードになるように
Index: lib/PlaggerLDR/Controller/API.pm
===================================================================
--- lib/PlaggerLDR/Controller/API.pm (revision 1819)
+++ lib/PlaggerLDR/Controller/API.pm (working copy)
@@ -12,8 +12,9 @@
my $module = first { $_->{module} eq 'Store::DBIC' } @{$config->{plugins}};
my $schema = Plagger::Schema::SQLite->connect(@{$module->{config}->{connect_info}});
-sub default : Private {
+sub auto : Private {
my($self, $c) = @_;
+ $c->user;
}
sub subs : Local {
Index: lib/PlaggerLDR.pm
===================================================================
--- lib/PlaggerLDR.pm (revision 1819)
+++ lib/PlaggerLDR.pm (working copy)
@@ -3,21 +3,45 @@
use strict;
use warnings;
-use Catalyst qw/-Debug/;
+use Catalyst qw(
+ Authentication
+ Authentication::Credential::Password
+ Authentication::Store::Minimal
+ Session
+ Session::State::Cookie
+ Session::Store::FastMmap
+);
+
__PACKAGE__->config(
name => 'PlaggerLDR',
'View::JSON' => {
expose_stash => 'json',
},
+ authentication => {
+ users => {
+ your_username => { password => 'your_password', },
+ },
+ },
);
__PACKAGE__->setup;
sub default : Private {
my ( $self, $c ) = @_;
- # Hello World
- $c->response->body( $c->welcome_message );
+ $c->login(
+ $c->req->params->{u},
+ $c->req->params->{p},
+ );
+
+ $c->res->status(404);
}
1;
Plugin::Flavour
mmm..
Root コントローラ #2
今までのルートコントローラは MyApp.pm 自体だった。
でもこれだと YAPC でちょろっと話したように Catalyst は自分自身も Plugin も MyApp の親としてロードされるようになっているため、ルートコントローラと Catalyst 自身やプラグインの名前空間が干渉する。
いわゆる sub login 問題ですが、普通に prepare とかいうアクション定義すると Catalyst の prepare 呼ばれなくなってアボンとかいうことになってて、かなり微妙な感じだった。
なので 5.66 から MyApp::Controller::Root に外付けできるようになった。一応まえと同じ書き方でも動くけど、Root.pm 推奨という流れ。
とか書いておいてみる。
Root コントローラ
いつの話題だよw
API関係
現在 Catalyst::Plugin::RPC
という RPC の統合プラグインを作成してます。
以下のような感じ。
use Catalyst qw/
RPC
RPC::Serializer::URIQuery
RPC::Serializer::XML
RPC::Serializer::JSON
/;
などと RPC と一緒に使いたいプロトコルのシリアライザをロードしておくと
# endpoint
sub rpc : Global {
my ( $self, $c ) = @_;
$c->rpc;
}
sub echo : RPC('myapp.echo') {
my ( $self, $c, @args ) = @_;
@args;
}
というような RPC アクションが利用できるようになるというものです。
deserializer はリクエストの Content-Type から自動的に判別されるため、同じアクションを複数のプロトコルで共有できます。(このあたりはmiyagawaさんインスパイア)
serializer はデフォルトでは deserializer と同じになりますが、format=json などとクエリで渡し指定することも可能となっています。
Plugin::Flavour と組み合わせて /rpc.js 等とアクセスすれば Serializer::JSON が使われるようにもできますかね。これはどうしようかな。
とりあえず今はRPCプラグイン本体を大まかに実装して、sri のコードコピペして Serializer::XML 作って XMLRPC のみ動くようになった段階。
なんか同じようなことしてる人がいるっぽいので情報共有もかねて書いてみるw
フィードバックフィードバック!
Catalyst::Plugin::DebugScreen
とか作った。自分用。
$c->debug が偽のときでも DebugScreen を出したかったのだけど、今の cat の実装だと無理っぽかったので。
Catalyst::Plugin::StackTrace と Catalyst::Engine からのコピペに、おまけで Template で自分で DebugScreen を定義できるようにしただけのやつ。
Catalyst::Plugin::Flavour 0.03pre
あぷ。新機能のドキュメント、テスト書いてないので Developer release にしておいてみる(ぉ
いままでは flavour とはいうものの Blosxom とは違い最初のパスを flavour としていたのを、Blosxom 互換な拡張子による方法に対応。
設定で、flavour, flavours_except が定義されていない場合この互換モードになるようにしておいた。
あと最初のパスを flavour にするモードの場合に、いままでは
flavours => [ 'html', 'rss', 'js', ]
などとして定義したものだけを flavour として扱うということをしていたけど、
flavours_except => [ 'about', 'login', ]
などと、特定のパス以外はすべて flavour として扱うオプションも追加。これではてなっぽいアプリが簡単に作れるかね。
あと、date_flavour 機能もつけた。
これは /2005/04/08 などのような日付っぽいURLにアクセスされた場合、$c->flavour->(year|month|day)
に日付を格納し、その日付部分をパスから除く。
この機能はデフォルトONで date_flavour => 0 とすればOFFにできる。
一気に機能追加しすぎてドキュメント書くのがあれすぎる。
しかも日本語の説明でも上記みたいに意味不明になっちゃうのに英語だとどうなっちゃうんだ、という。
JavaScript や CSS の query に自動で最終更新時間をつける Catalyst Plugin
川o・-・)<2nd life - JavaScript や CSS の query に自動で最終更新時間をつける Rails Plugin
インスパイア。
package Catalyst::Plugin::URI::MtimeQuery;
sub uri_for {
my $c = shift;
my $res = $c->NEXT::uri_for(@_);
if ( $res =~ /\.(css|js|swf)$/ ) {
my $base = $c->req->base;
my ($path) = $res =~ m!^$base/(.*)!;
my $file = $c->path_to( 'root', split '/', $path );
if ( $file->stat && -f _ && -r _ ) {
$res .= '?' . $file->stat->mtime;
}
}
$res;
}
1;
Catalyst では CSS や Javascript の読み込みは [% c.uri_for('/js/prototype.js') %]
などのように記述することが多いのですが、上記プラグインをロードしておくと、css|js|swf の場合は自動で更新時間が付くようになります。試してないけど。
上のは設定きめうちなんだけどその理由は config の設定キー名思いつかなかったからという。。
あと、swf は普通にクエリを渡して使うことが多いのでこのままだとあまり使えない。
Authentication::Store::HTTP #2
0.04 で変なことしないで実装した。ロードする順番もいつでもOK。
trunk にあるコードは get_user にすべてのパラメータを渡してくれるようになっているのでそもそも昨日からの悩みは無用だったらしい。と、 nothingmuch が教えてくれた。