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

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