aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails
diff options
context:
space:
mode:
authorCarl Lerche <carllerche@mac.com>2009-10-08 12:14:57 -0700
committerCarl Lerche <carllerche@mac.com>2009-10-08 12:31:09 -0700
commite4d7e5090c928e5b64350be9a1fb3aaf6f968e4c (patch)
tree27fe4309341ed992a1f9ca4867f3db6ee46802eb /railties/lib/rails
parent6d6ae0841c94d3c0ce0c91311028ff7396c44a4a (diff)
downloadrails-e4d7e5090c928e5b64350be9a1fb3aaf6f968e4c.tar.gz
rails-e4d7e5090c928e5b64350be9a1fb3aaf6f968e4c.tar.bz2
rails-e4d7e5090c928e5b64350be9a1fb3aaf6f968e4c.zip
Moving more initializers into the application object
Diffstat (limited to 'railties/lib/rails')
-rw-r--r--railties/lib/rails/application.rb93
-rw-r--r--railties/lib/rails/initializable.rb69
-rw-r--r--railties/lib/rails/initializer.rb47
3 files changed, 121 insertions, 88 deletions
diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb
index 783d45aa65..011a9c489d 100644
--- a/railties/lib/rails/application.rb
+++ b/railties/lib/rails/application.rb
@@ -2,34 +2,39 @@ module Rails
class Application
extend Initializable
- def self.inherited(child)
- child.initializers = initializers.dup
- end
+ class << self
+ def config
+ @config ||= Configuration.new
+ end
- def self.config
- @config ||= Configuration.new
- end
+ # TODO: change the plugin loader to use config
+ alias configuration config
- def self.config=(config)
- @config = config
- end
+ def config=(config)
+ @config = config
+ end
- def self.routes
- ActionController::Routing::Routes
- end
+ def plugin_loader
+ @plugin_loader ||= config.plugin_loader.new(self)
+ end
- def self.middleware
- config.middleware
- end
+ def routes
+ ActionController::Routing::Routes
+ end
- def self.call(env)
- @app ||= middleware.build(routes)
- @app.call(env)
- end
+ def middleware
+ config.middleware
+ end
+
+ def call(env)
+ @app ||= middleware.build(routes)
+ @app.call(env)
+ end
- def self.new
- initializers.run
- self
+ def new
+ initializers.run
+ self
+ end
end
initializer :initialize_rails do
@@ -49,5 +54,49 @@ module Rails
abort %{Your config/boot.rb is outdated: Run "rake rails:update".}
end
end
+
+ # Requires all frameworks specified by the Configuration#frameworks
+ # list. By default, all frameworks (Active Record, Active Support,
+ # Action Pack, Action Mailer, and Active Resource) are loaded.
+ initializer :require_frameworks do
+ begin
+ require 'active_support'
+ require 'active_support/core_ext/kernel/reporting'
+ require 'active_support/core_ext/logger'
+
+ # TODO: This is here to make Sam Ruby's tests pass. Needs discussion.
+ require 'active_support/core_ext/numeric/bytes'
+ config.frameworks.each { |framework| require(framework.to_s) }
+ rescue LoadError => e
+ # Re-raise as RuntimeError because Mongrel would swallow LoadError.
+ raise e.to_s
+ end
+ end
+
+ # Set the paths from which Rails will automatically load source files, and
+ # the load_once paths.
+ initializer :set_autoload_paths do
+ require 'active_support/dependencies'
+ ActiveSupport::Dependencies.load_paths = config.load_paths.uniq
+ ActiveSupport::Dependencies.load_once_paths = config.load_once_paths.uniq
+
+ extra = ActiveSupport::Dependencies.load_once_paths - ActiveSupport::Dependencies.load_paths
+ unless extra.empty?
+ abort <<-end_error
+ load_once_paths must be a subset of the load_paths.
+ Extra items in load_once_paths: #{extra * ','}
+ end_error
+ end
+
+ # Freeze the arrays so future modifications will fail rather than do nothing mysteriously
+ config.load_once_paths.freeze
+ end
+
+ # Adds all load paths from plugins to the global set of load paths, so that
+ # code from plugins can be required (explicitly or automatically via ActiveSupport::Dependencies).
+ initializer :add_plugin_load_paths do
+ require 'active_support/dependencies'
+ plugin_loader.add_plugin_load_paths
+ end
end
end
diff --git a/railties/lib/rails/initializable.rb b/railties/lib/rails/initializable.rb
index 61c98d4f99..4bd5088207 100644
--- a/railties/lib/rails/initializable.rb
+++ b/railties/lib/rails/initializable.rb
@@ -2,20 +2,58 @@ module Rails
module Initializable
# A collection of initializers
- class Collection < ActiveSupport::OrderedHash
- # def initialize_copy(other)
- # super
- # each do |key, value|
- # self[key] = value.dup
- # end
- # end
+ class Collection
+ def initialize(context)
+ @context = context
+ @keys = []
+ @values = {}
+ @ran = false
+ end
def run
+ return self if @ran
each do |key, initializer|
- initializer.run
+ @context.class_eval(&initializer.block)
end
+ @ran = true
self
end
+
+ def [](key)
+ keys, values = merge_with_parent
+ values[key.to_sym]
+ end
+
+ def []=(key, value)
+ key = key.to_sym
+ @keys |= [key]
+ @values[key] = value
+ end
+
+ def each
+ keys, values = merge_with_parent
+ keys.each { |k| yield k, values[k] }
+ self
+ end
+
+ protected
+
+ attr_reader :keys, :values
+
+ private
+
+ def merge_with_parent
+ keys, values = [], {}
+
+ if @context.is_a?(Class) && @context.superclass.is_a?(Initializable)
+ parent = @context.superclass.initializers
+ keys, values = parent.keys, parent.values
+ end
+
+ values = values.merge(@values)
+ return keys | @keys, values
+ end
+
end
class Initializer
@@ -24,24 +62,15 @@ module Rails
def initialize(name, options = {}, &block)
@name, @options, @block = name, options, block
end
-
- def run
- return if @already_ran
- @block.call
- @already_ran = true
- end
end
def initializer(name, options = {}, &block)
- initializers[name] = Initializer.new(name, options, &block)
+ @initializers ||= Collection.new(self)
+ @initializers[name] = Initializer.new(name, options, &block)
end
def initializers
- @initializers ||= Collection.new
- end
-
- def initializers=(initializers)
- @initializers = initializers
+ @initializers ||= Collection.new(self)
end
end
diff --git a/railties/lib/rails/initializer.rb b/railties/lib/rails/initializer.rb
index d3e7f934ea..4487cacf7a 100644
--- a/railties/lib/rails/initializer.rb
+++ b/railties/lib/rails/initializer.rb
@@ -1,6 +1,5 @@
require "pathname"
-require 'active_support/ordered_hash'
require 'rails/initializable'
require 'rails/application'
require 'rails/railties_path'
@@ -117,50 +116,6 @@ module Rails
end
end
- # Requires all frameworks specified by the Configuration#frameworks
- # list. By default, all frameworks (Active Record, Active Support,
- # Action Pack, Action Mailer, and Active Resource) are loaded.
- Initializer.default.add :require_frameworks do
- begin
- require 'active_support'
- require 'active_support/core_ext/kernel/reporting'
- require 'active_support/core_ext/logger'
-
- # TODO: This is here to make Sam Ruby's tests pass. Needs discussion.
- require 'active_support/core_ext/numeric/bytes'
- configuration.frameworks.each { |framework| require(framework.to_s) }
- rescue LoadError => e
- # Re-raise as RuntimeError because Mongrel would swallow LoadError.
- raise e.to_s
- end
- end
-
- # Set the paths from which Rails will automatically load source files, and
- # the load_once paths.
- Initializer.default.add :set_autoload_paths do
- require 'active_support/dependencies'
- ActiveSupport::Dependencies.load_paths = configuration.load_paths.uniq
- ActiveSupport::Dependencies.load_once_paths = configuration.load_once_paths.uniq
-
- extra = ActiveSupport::Dependencies.load_once_paths - ActiveSupport::Dependencies.load_paths
- unless extra.empty?
- abort <<-end_error
- load_once_paths must be a subset of the load_paths.
- Extra items in load_once_paths: #{extra * ','}
- end_error
- end
-
- # Freeze the arrays so future modifications will fail rather than do nothing mysteriously
- configuration.load_once_paths.freeze
- end
-
- # Adds all load paths from plugins to the global set of load paths, so that
- # code from plugins can be required (explicitly or automatically via ActiveSupport::Dependencies).
- Initializer.default.add :add_plugin_load_paths do
- require 'active_support/dependencies'
- plugin_loader.add_plugin_load_paths
- end
-
# Create tmp directories
Initializer.default.add :ensure_tmp_directories_exist do
%w(cache pids sessions sockets).each do |dir_to_make|
@@ -373,7 +328,7 @@ module Rails
Initializer.default.add :initialize_metal do
# TODO: Make Rails and metal work without ActionController
- if defined?(ActionController)
+ if configuration.frameworks.include?(:action_controller)
Rails::Rack::Metal.requested_metals = configuration.metals
Rails::Rack::Metal.metal_paths += plugin_loader.engine_metal_paths