Ruby 2.0.0 で WAF を作ってみた
Rack にのる WAF を Ruby 2.0.0 の機能を使って実装してみた。無理に 2.0 の機能を使おうとして逆にひどいことになってる箇所とか結構あるので、あんまり満足してないけどとりあえずやりたかったことはできたし満足してる。
コードは Github にある。名前は Lote にした。 Living on the Edge 。そのまま。 rubygems.org に上がる予定はゼロです。そんなに作りこむ気もない。
もの自体は clone して rackup すると起動する。先に bundle install しないとダメか。当たり前だけど Ruby 2.0.0-preview1 以外で動作検証はしてない。
やりたかったこと
- Refinements を使ってみたい
- keyword arguments を使ってみたい
という2点のみが動機。テスト全然書いてなくて Write and Run で試してるのでバグいっぱいありそう。
使った所の解説を少しする。
Refinements
主に Lote::Util
で使ってる。あとは Rack::Response
と Rack::Request
を改造するのにも使ってる。コード位置的には lib/lote/util.rb とかになる。
一時的にメソッドの挙動を切り替えられるのは面白いし、普通に便利。「こうなってたほうが使いやすいんだけど、やると他のところで大変なことになるよな……」とかの葛藤がなくなるのはいいことだとおもう。使いすぎ注意。
Keyword Arguments
これを見た時に一番最初に思ったのは「やった!これで Rails のコントローラーのアクションに欲しいパラメータを書ける!!」だった。今回の Lote もこれがやりたくて実装したようなもん。実際には app/controller/home_controller.rb みたいな書き方になる。
引数がなかった時のデフォルト値もちゃんとできるし、すげー便利。サイコー。
ただまぁ、取る予定のないキーワード引数とかが来ると普通に Arguments Error で例外を吐くので、そのへんなんとかするために Lote::Util Method#call_with_safe_parameters で黒魔術している。最悪なのでマジなんとかしたい。どっかにオプションとかないもんかな。
まぁ、とりあえず動いているし、面白かったのでよしとする。 rspec が早いとこ Refinements のテストをうまく書けるようになると幸せが加速して良い感じだと思う。