Hatena::ブログ(Diary)

akimatter このページをアンテナに追加 RSSフィード

2012-01-10

developmentを実現したいのでコードを読んでみる#3

| 00:57 |  developmentを実現したいのでコードを読んでみる#3を含むブックマーク  developmentを実現したいのでコードを読んでみる#3のブックマークコメント

昨日は、ActionDispatch::Reloader で使われている ActiveSupport::Callbacks のドキュメントを読みました。

今日はそれが ActionDispatch::Reloader でどう使われているのかを追いかけたいと思います

https://github.com/rails/rails/blob/3-1-stable/actionpack/lib/action_dispatch/middleware/reloader.rb

まず定義されているコールバックは、 :prepare と :cleanup の2つです。

どちらも :scope => :name というオプションが指定されているので、コールバックで呼び出されるのがオブジェクト場合、それぞれ#prepare と #cleanup メソッドが呼び出されます

で、コールバックを登録するのは、 to_prepare と to_cleanup というクラスメソッドです。

なので、to_prepare, to_cleanup, prepare!, cleanup! を呼び出している箇所が分かればいいような予感がします

to_prepare
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*-
Grep started at Wed Jan 11 00:42:47

grep -nr to_prepare actionpack-3.1.3/lib railties-3.1.3/lib
actionpack-3.1.3/lib/action_dispatch/middleware/callbacks.rb:11:      delegate :to_prepare, :to_cleanup, :to => "ActionDispatch::Reloader"
actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:34:    def self.to_prepare(*args, &block)
railties-3.1.3/lib/rails/application/finisher.rb:22:      initializer :add_to_prepare_blocks do
railties-3.1.3/lib/rails/application/finisher.rb:23:        config.to_prepare_blocks.each do |block|
railties-3.1.3/lib/rails/application/finisher.rb:24:          ActionDispatch::Reloader.to_prepare(&block)
railties-3.1.3/lib/rails/application/finisher.rb:59:      # Force routes to be loaded just at the end and add it to to_prepare callbacks
railties-3.1.3/lib/rails/application/finisher.rb:65:        ActionDispatch::Reloader.to_prepare(&reloader)
railties-3.1.3/lib/rails/railtie/configuration.rb:55:      # Array of callbacks defined by #to_prepare.
railties-3.1.3/lib/rails/railtie/configuration.rb:56:      def to_prepare_blocks
railties-3.1.3/lib/rails/railtie/configuration.rb:57:        @@to_prepare_blocks ||= []
railties-3.1.3/lib/rails/railtie/configuration.rb:62:      def to_prepare(&blk)
railties-3.1.3/lib/rails/railtie/configuration.rb:63:        to_prepare_blocks << blk if blk
railties-3.1.3/lib/rails/railtie.rb:77:  #     # Add a to_prepare block which is executed once in production
railties-3.1.3/lib/rails/railtie.rb:79:  #     config.to_prepare do
to_cleanup
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*-
Grep started at Wed Jan 11 00:44:47

grep -nr to_cleanup actionpack-3.1.3/lib railties-3.1.3/lib
actionpack-3.1.3/lib/action_dispatch/middleware/callbacks.rb:11:      delegate :to_prepare, :to_cleanup, :to => "ActionDispatch::Reloader"
actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:40:    def self.to_cleanup(*args, &block)
railties-3.1.3/lib/rails/application/bootstrap.rb:55:        ActionDispatch::Reloader.to_cleanup do

parepare!
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*-
Grep started at Wed Jan 11 00:45:24

grep -nr "prepare!" actionpack-3.1.3/lib railties-3.1.3/lib
actionpack-3.1.3/lib/action_controller/metal/testing.rb:21:      @_response.prepare!
actionpack-3.1.3/lib/action_dispatch/http/response.rb:192:    alias prepare! to_a
actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:23:  # middleware stack, but are executed only when +ActionDispatch::Reloader.prepare!+
actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:45:    def self.prepare!
railties-3.1.3/lib/rails/application/finisher.rb:41:        ActionDispatch::Reloader.prepare!
railties-3.1.3/lib/rails/console/app.rb:30:  ActionDispatch::Reloader.prepare!
cleanup!
-*- mode: grep; default-directory: "~/.rvm/gems/ruby-1.9.2-head@tengine_console/gems/" -*-
Grep started at Wed Jan 11 00:45:58

grep -nr "cleanup!" actionpack-3.1.3/lib railties-3.1.3/lib
actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:24:  # or +ActionDispatch::Reloader.cleanup!+ are called manually.
actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:50:    def self.cleanup!
actionpack-3.1.3/lib/action_dispatch/middleware/reloader.rb:62:        ActionDispatch::Reloader.cleanup!
railties-3.1.3/lib/rails/console/app.rb:29:  ActionDispatch::Reloader.cleanup!

それぞれ調べないといけないんですが、

railties-3.1.3/lib/rails/console/app.rb:29:  ActionDispatch::Reloader.cleanup!
railties-3.1.3/lib/rails/console/app.rb:30:  ActionDispatch::Reloader.prepare!

で、rails consoleでの reload! の実装として使われているのが発見できました。

https://github.com/rails/rails/blob/3-1-stable/railties/lib/rails/console/app.rb

今日ハードな一日だったのでまた明日

rails new --devの使い方

| 02:28 |  rails new --devの使い方を含むブックマーク  rails new --devの使い方のブックマークコメント

$  git clone https://github.com/rails/rails.git
$  cd rails/
$  git branch -r
$  git checkout 3-2-stable
$  cd ..
$  ruby rails/railties/bin/rails new rails3_20120110 --dev

これでcloneしたリポジトリの(3-2-stableブランチ)を参照するrailsアプリが生成できます

http://edgeguides.rubyonrails.org/3_0_release_notes.html#living-on-the-edge

最近読んだ本
  • 情熱プログラマー ソフトウェア開発者の幸せな生き方
  • 禁煙セラピー[セラピーシリーズ]
  • 入門git
  • 入門Git
  • もやしもん(8) (イブニングKC)
  • JRuby 徹底入門
  • 入門Subversion―Windows/Linux対応
  • Ship It! ソフトウェアプロジェクト 成功のための達人式ガイドブック
  • プログラミングRuby 第2版 言語編
  • プログラミングRuby 第2版 ライブラリ編