2012-07-01から1ヶ月間の記事一覧

ctrl+cでrackサーバーをシャットダウンする

Rack.version == 1.1で、 require 'rack' Rack::Handler::WEBrick.run HelloRack.new, :Port => 9292 とするとctrl+cでサーバーがシャットダウンできないので、次のように書き換えてシャットダウンできるようにしています。 rackアプリは設定ファイル(hello.…

Rails::Initializable::Collectionのtsort_each

tsort(トポロジカルソート)は主に依存関係の解決に利用されるようです。この処理の前には、あの処理をやっておくというように指示すると、tsortはその条件に合うようにソートします。次のコードはRailsの初期化処理とほぼ同じ実装で、:afterまたは:beforeで…

コントローラーとビューの連携

本物は色々なモジュールに分かれてたり、継承してたりするわけですが、究極に単純化するとコントローラーがview_contextというオブジェクトを持っていて、renderを呼ぶタイミングでTemplateクラスを通してerbファイルがコンパイルされて、ソースはview_conte…

Validations#validatesの簡易版を実装

ActiveSupport::(Callbacks, Concern)のいい加減なのができたので、validatesのいい加減なのを作ってみました。

複数のモジュールにあるStaticeMethodsを1つのクラスのクラスメソッドにまとめる

1つ前までのConcernではうまくいかないので修正。これでほぼrailsのConcernと同じです。 解説 まずMとM2はConcernをextendしたときに@dependenciesが定義されます。"include M"で、M.append_feachers(M2)が呼ばれます。M2は@dependenciesをinstance variable…

callbacksの簡易版を実装

いやぁ、Ruby on Rails Guilds:Get Startedをやってみて、validationまわりがどうなっているのか気になったので読んでみました。validatesはActive SupportのCallbacksモジュールのset_callbackでValidatorオブジェクトがvalidateをコールするのをvalid?を実…

1つのモジュールの中で特異メソッドとインスタンスメソッドを定義して、クラスに引き渡す方法

active supportを使うと、次のようになります。 require 'active_support/concern' module M extend ActiveSupport::Concern def method2 puts "method2" end module ClassMethods def method1 puts "method1" end end end class C include M end C.method1 …

Rakeを実装してみました

rubyのライブラリの再実装シリーズ第二弾。第一弾はunit/testでした。なんか、文章書くのも大変なので、githubにmyrakeという名前で公開しました。commitはこまめにしているので、最初のcommitから読んでいけば開発の追体験?ができます。現在のところRakefil…

testモジュールのtest_supportを使えば、重いテストが一目瞭然

unittest.mainをテストランナーに使うと、途中経過では'.'が書き込まれるだけで、どこのテストの実行で詰まっているのか、よくわかりません。test_support.run_unittestはテストクラスの登録は手動にはなりますが、現在実行中のテストメソッドが何なのか知ら…

assertはOオプションでスキップされる

知ってました?多分知らないのは恥ずかしいことだと思いますが、知りませんでした。 # assert.py #!/usr/bin/env python2.7 assert(0) print 'skiped assert(0)' を使って、実験してみます。 $ python assert.py Traceback (most recent call last): File "a…

テストケースのロードを自動化した

テストコードを今まで個別に実行してましたが、ファイルが増えてきた(20くらい)ので、メタクラス(TestMeta)を使って、テストケースを自動で集めて一度にすべてalltests.pyで実行するようにしました。 #!/usr/bin/env python2.7 # alltests.py from test impo…