From 226d8e745a0d47efa50633661a2b7fe1859609bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Wed, 27 Jan 2010 17:39:35 +0100 Subject: Refactor MetalLoader and RoutesReloader to rely less on class configuration. Signed-off-by: Carl Lerche --- railties/lib/rails/application.rb | 8 +++- railties/lib/rails/application/finisher.rb | 4 +- railties/lib/rails/application/metal.rb | 46 --------------------- railties/lib/rails/application/metal_loader.rb | 50 +++++++++++++++++++++++ railties/lib/rails/application/routes_reloader.rb | 13 +++--- railties/lib/rails/configuration.rb | 2 +- railties/lib/rails/engine.rb | 8 ++-- 7 files changed, 68 insertions(+), 63 deletions(-) delete mode 100644 railties/lib/rails/application/metal.rb create mode 100644 railties/lib/rails/application/metal_loader.rb (limited to 'railties/lib') diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb index 9e41210119..3ed34f21a6 100644 --- a/railties/lib/rails/application.rb +++ b/railties/lib/rails/application.rb @@ -9,7 +9,7 @@ module Rails autoload :Configurable, 'rails/application/configurable' autoload :Configuration, 'rails/application/configuration' autoload :Finisher, 'rails/application/finisher' - autoload :Metal, 'rails/application/metal' + autoload :MetalLoader, 'rails/application/metal_loader' autoload :Railties, 'rails/application/railties' autoload :RoutesReloader, 'rails/application/routes_reloader' @@ -51,8 +51,12 @@ module Rails @railties ||= Railties.new(config) end + def metal_loader + @metal_laoder ||= MetalLoader.new + end + def routes_reloader - @routes_reloader ||= RoutesReloader.new(config) + @routes_reloader ||= RoutesReloader.new end def reload_routes! diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb index d67420938a..c0b16a0090 100644 --- a/railties/lib/rails/application/finisher.rb +++ b/railties/lib/rails/application/finisher.rb @@ -15,9 +15,9 @@ module Rails end end - initializer :add_builtin_route do + initializer :add_builtin_route do |app| if Rails.env.development? - Rails::Application::RoutesReloader.paths << File.join(RAILTIES_PATH, 'builtin', 'routes.rb') + app.routes_reloader.paths << File.join(RAILTIES_PATH, 'builtin', 'routes.rb') end end diff --git a/railties/lib/rails/application/metal.rb b/railties/lib/rails/application/metal.rb deleted file mode 100644 index 17786dd4ba..0000000000 --- a/railties/lib/rails/application/metal.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'action_dispatch' - -module Rails - class Application - class Metal - def self.paths - @paths ||= [] - end - - def self.metals - @metals ||= [] - end - - def initialize(list=nil) - metals = [] - list = Array(list || :all).map(&:to_sym) - - self.class.paths.each do |path| - matcher = /\A#{Regexp.escape(path)}\/(.*)\.rb\Z/ - Dir.glob("#{path}/**/*.rb").sort.each do |metal_path| - metal = metal_path.sub(matcher, '\1').to_sym - next unless list.include?(metal) || list.include?(:all) - require_dependency metal - metals << metal - end - end - - metals = metals.sort_by do |m| - [list.index(m) || list.index(:all), m.to_s] - end - - @metals = metals.map { |m| m.to_s.camelize.constantize } - self.class.metals.concat(@metals) - end - - def new(app) - ActionDispatch::Cascade.new(@metals, app) - end - - def name - ActionDispatch::Cascade.name - end - alias_method :to_s, :name - end - end -end diff --git a/railties/lib/rails/application/metal_loader.rb b/railties/lib/rails/application/metal_loader.rb new file mode 100644 index 0000000000..c0f2e4f948 --- /dev/null +++ b/railties/lib/rails/application/metal_loader.rb @@ -0,0 +1,50 @@ +require 'action_dispatch' + +module Rails + class Application + class MetalLoader + attr_reader :paths, :metals + + def initialize + @paths, @metals = [], [] + end + + def build_middleware(list=nil) + load_metals!(list) + self + end + + def new(app) + ActionDispatch::Cascade.new(@metals, app) + end + + def name + ActionDispatch::Cascade.name + end + alias :to_s :name + + protected + + def load_metals!(list) + metals = [] + list = Array(list || :all).map(&:to_sym) + + paths.each do |path| + matcher = /\A#{Regexp.escape(path)}\/(.*)\.rb\Z/ + Dir.glob("#{path}/**/*.rb").sort.each do |metal_path| + metal = metal_path.sub(matcher, '\1').to_sym + next unless list.include?(metal) || list.include?(:all) + require_dependency metal + metals << metal + end + end + + metals = metals.sort_by do |m| + [list.index(m) || list.index(:all), m.to_s] + end + + @metals = metals.map { |m| m.to_s.camelize.constantize } + end + end + end +end diff --git a/railties/lib/rails/application/routes_reloader.rb b/railties/lib/rails/application/routes_reloader.rb index fe0cfb7801..fde6211c5d 100644 --- a/railties/lib/rails/application/routes_reloader.rb +++ b/railties/lib/rails/application/routes_reloader.rb @@ -1,19 +1,16 @@ module Rails class Application - # TODO Write tests for this behavior extracted from Application class RoutesReloader - def self.paths - @paths ||= [] - end + attr_reader :paths - def initialize(config) - @config, @last_change_at = config, nil + def initialize + @paths, @last_change_at = [], nil end def changed_at routes_changed_at = nil - self.class.paths.each do |path| + paths.each do |path| config_changed_at = File.stat(path).mtime if routes_changed_at.nil? || config_changed_at > routes_changed_at @@ -29,7 +26,7 @@ module Rails routes.disable_clear_and_finalize = true routes.clear! - self.class.paths.each { |path| load(path) } + paths.each { |path| load(path) } routes.finalize! nil diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb index 0cf39636ac..6d5fa87439 100644 --- a/railties/lib/rails/configuration.rb +++ b/railties/lib/rails/configuration.rb @@ -16,7 +16,7 @@ module Rails middleware.use('::ActionDispatch::Cookies') middleware.use(lambda { ActionController::Base.session_store }, lambda { ActionController::Base.session_options }) middleware.use('::ActionDispatch::Flash', :if => lambda { ActionController::Base.session_store }) - middleware.use(lambda { Rails::Application::Metal.new(Rails.application.config.metals) }, :if => lambda { Rails::Application::Metal.metals.any? }) + middleware.use(lambda { Rails.application.metal_loader.build_middleware(Rails.application.config.metals) }, :if => lambda { Rails.application.metal_loader.metals.any? }) middleware.use('ActionDispatch::ParamsParser') middleware.use('::Rack::MethodOverride') middleware.use('::ActionDispatch::Head') diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index ebbee67cf4..b98393c01a 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -70,9 +70,9 @@ module Rails config.load_once_paths.freeze end - initializer :add_routing_paths do + initializer :add_routing_paths do |app| paths.config.routes.to_a.each do |route| - Rails::Application::RoutesReloader.paths.unshift(route) if File.exists?(route) + app.routes_reloader.paths.unshift(route) if File.exists?(route) end end @@ -98,8 +98,8 @@ module Rails ActionMailer::Base.view_paths.unshift(*views) if defined?(ActionMailer) end - initializer :add_metals do - Rails::Application::Metal.paths.unshift(*paths.app.metals.to_a) + initializer :add_metals do |app| + app.metal_loader.paths.unshift(*paths.app.metals.to_a) end initializer :load_application_initializers do -- cgit v1.2.3