Skip to content
Browse files

Remove unused responsibilities and add a few load definitions to engines

Since plugins were removed, we can clean up a few methods in engines.
We also use this opportunity to move `load_console`, `load_tasks` and
`load_runner` to Rails::Engine. This means that, if someone wants to
improve script/rails for engines to support console or runner commands,
part of the work is already done.
  • Loading branch information...
1 parent 0470ddc commit 50b6110106a6e467f5e5f6303700522cebc60a9c @josevalim josevalim committed Jun 29, 2012
View
2 activerecord/lib/active_record/railties/databases.rake
@@ -435,7 +435,7 @@ namespace :railties do
task :migrations => :'db:load_config' do
to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map {|n| n.strip }
railties = {}
- Rails.application.railties.all do |railtie|
+ Rails.application.railties.each do |railtie|
next unless to_load == :all || to_load.include?(railtie.railtie_name)
if railtie.respond_to?(:paths) && (path = railtie.paths['db/migrate'].first)
View
130 railties/lib/rails/application.rb
@@ -79,9 +79,11 @@ def initialize
@routes_reloader = nil
@env_config = nil
@ordered_railties = nil
+ @railties = nil
@queue = nil
end
+ # Returns true if the application is initialized.
def initialized?
@initialized
end
@@ -98,30 +100,6 @@ def reload_routes!
routes_reloader.reload!
end
- # Load the application and its railties tasks and invoke the registered hooks.
- # Check <tt>Rails::Railtie.rake_tasks</tt> for more info.
- def load_tasks(app=self)
- initialize_tasks
- super
- self
- end
-
- # Load the application console and invoke the registered hooks.
- # Check <tt>Rails::Railtie.console</tt> for more info.
- def load_console(app=self)
- initialize_console
- super
- self
- end
-
- # Load the application runner and invoke the registered hooks.
- # Check <tt>Rails::Railtie.runner</tt> for more info.
- def load_runner(app=self)
- initialize_runner
- super
- self
- end
-
# Stores some of the Rails initial environment parameters which
# will be used by middlewares and engines to configure themselves.
def env_config
@@ -188,32 +166,9 @@ def initialize!(group=:default) #:nodoc:
self
end
- # Returns the ordered railties for this application considering railties_order.
- def ordered_railties #:nodoc:
- @ordered_railties ||= begin
- order = config.railties_order.map do |railtie|
- if railtie == :main_app
- self
- elsif railtie.respond_to?(:instance)
- railtie.instance
- else
- railtie
- end
- end
-
- all = (railties - order)
- all.push(self) unless (all + order).include?(self)
- order.push(:all) unless order.include?(:all)
-
- index = order.index(:all)
- order[index] = all
- order.reverse.flatten
- end
- end
-
def initializers #:nodoc:
Bootstrap.initializers_for(self) +
- super +
+ railties_initializers(super) +
Finisher.initializers_for(self)
end
@@ -246,6 +201,66 @@ def railties #:nodoc:
alias :build_middleware_stack :app
+ def run_tasks_blocks(app) #:nodoc:
+ railties.each { |r| r.run_tasks_blocks(app) }
+ super
+ require "rails/tasks"
+ task :environment do
+ $rails_rake_task = true
+ require_environment!
+ end
+ end
+
+ def run_generators_blocks(app) #:nodoc:
+ railties.each { |r| r.run_generators_blocks(app) }
+ super
+ end
+
+ def run_runner_blocks(app) #:nodoc:
+ railties.each { |r| r.run_runner_blocks(app) }
+ super
+ end
+
+ def run_console_blocks(app) #:nodoc:
+ railties.each { |r| r.run_console_blocks(app) }
+ super
+ end
+
+ # Returns the ordered railties for this application considering railties_order.
+ def ordered_railties #:nodoc:
+ @ordered_railties ||= begin
+ order = config.railties_order.map do |railtie|
+ if railtie == :main_app
+ self
+ elsif railtie.respond_to?(:instance)
+ railtie.instance
+ else
+ railtie
+ end
+ end
+
+ all = (railties - order)
+ all.push(self) unless (all + order).include?(self)
+ order.push(:all) unless order.include?(:all)
+
+ index = order.index(:all)
+ order[index] = all
+ order.reverse.flatten
+ end
+ end
+
+ def railties_initializers(current) #:nodoc:
+ initializers = []
+ ordered_railties.each do |r|
+ if r == self
+ initializers += current
+ else
+ initializers += r.initializers
+ end
+ end
+ initializers
+ end
+
def reload_dependencies? #:nodoc:
config.reload_classes_only_on_change != true || reloaders.map(&:updated?).any?
end
@@ -305,25 +320,6 @@ def default_middleware_stack #:nodoc:
end
end
- def initialize_tasks #:nodoc:
- self.class.rake_tasks do
- require "rails/tasks"
- task :environment do
- $rails_rake_task = true
- require_environment!
- end
- end
- end
-
- def initialize_console #:nodoc:
- require "pp"
- require "rails/console/app"
- require "rails/console/helpers"
- end
-
- def initialize_runner #:nodoc:
- end
-
def build_original_fullpath(env) #:nodoc:
path_info = env["PATH_INFO"]
query_string = env["QUERY_STRING"]
View
123 railties/lib/rails/engine.rb
@@ -338,26 +338,6 @@ module Rails
class Engine < Railtie
autoload :Configuration, "rails/engine/configuration"
- def initialize
- @_all_autoload_paths = nil
- @_all_load_paths = nil
- @app = nil
- @config = nil
- @env_config = nil
- @helpers = nil
- @railties = nil
- @routes = nil
- super
- end
-
- def load_generators(app=self)
- initialize_generators
- railties.each { |r| r.load_generators(app) }
- Rails::Generators.configure!(app.config.generators)
- super
- self
- end
-
class << self
attr_accessor :called_from, :isolated
alias :isolated? :isolated
@@ -406,7 +386,7 @@ def isolate_namespace(mod)
end
unless mod.respond_to?(:railtie_routes_url_helpers)
- define_method(:railtie_routes_url_helpers) { railtie.routes_url_helpers }
+ define_method(:railtie_routes_url_helpers) { railtie.routes.url_helpers }
end
end
end
@@ -426,25 +406,54 @@ def find(path)
delegate :middleware, :root, :paths, :to => :config
delegate :engine_name, :isolated?, :to => "self.class"
- def load_tasks(app=self)
- railties.each { |r| r.load_tasks(app) }
+ def initialize
+ @_all_autoload_paths = nil
+ @_all_load_paths = nil
+ @app = nil
+ @config = nil
+ @env_config = nil
+ @helpers = nil
+ @routes = nil
super
- paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
end
+ # Load console and invoke the registered hooks.
+ # Check <tt>Rails::Railtie.console</tt> for more info.
def load_console(app=self)
- railties.each { |r| r.load_console(app) }
- super
+ require "pp"
+ require "rails/console/app"
+ require "rails/console/helpers"
+ run_console_blocks(app)
+ self
end
+ # Load Rails runner and invoke the registered hooks.
+ # Check <tt>Rails::Railtie.runner</tt> for more info.
def load_runner(app=self)
- railties.each { |r| r.load_runner(app) }
- super
+ run_runner_blocks(app)
+ self
end
- def eager_load!
- railties.each(&:eager_load!)
+ # Load Rake, railties tasks and invoke the registered hooks.
+ # Check <tt>Rails::Railtie.rake_tasks</tt> for more info.
+ def load_tasks(app=self)
+ require "rake"
+ run_tasks_blocks(app)
+ self
+ end
+ # Load rails generators and invoke the registered hooks.
+ # Check <tt>Rails::Railtie.generators</tt> for more info.
+ def load_generators(app=self)
+ require "rails/generators"
+ run_generators_blocks(app)
+ Rails::Generators.configure!(app.config.generators)
+ self
+ end
+
+ # Eager load the application by loading all ruby
+ # files inside eager_load paths.
+ def eager_load!
config.eager_load_paths.each do |load_path|
matcher = /\A#{Regexp.escape(load_path)}\/(.*)\.rb\Z/
Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
@@ -453,10 +462,7 @@ def eager_load!
end
end
- def railties
- @railties ||= []
- end
-
+ # Returns a module with all the helpers defined for the engine.
def helpers
@helpers ||= begin
helpers = Module.new
@@ -468,35 +474,39 @@ def helpers
end
end
+ # Returns all registered helpers paths.
def helpers_paths
paths["app/helpers"].existent
end
- def routes_url_helpers
- routes.url_helpers
- end
-
+ # Returns the underlying rack application for this engine.
def app
@app ||= begin
config.middleware = config.middleware.merge_into(default_middleware_stack)
config.middleware.build(endpoint)
end
end
+ # Returns the endpoint for this engine. If none is registered,
+ # defaults to an ActionDispatch::Routing::RouteSet.
def endpoint
self.class.endpoint || routes
end
+ # Define the Rack API for this engine.
def call(env)
app.call(env.merge!(env_config))
end
+ # Defines additional Rack env configuration that is added on each call.
def env_config
@env_config ||= {
'action_dispatch.routes' => routes
}
end
+ # Defines the routes for this engine. If a block is given to
+ # routes, it is appended to the engine.
def routes
@routes ||= ActionDispatch::Routing::RouteSet.new.tap do |routes|
routes.draw_paths.concat paths["config/routes"].paths
@@ -506,22 +516,7 @@ def routes
@routes
end
- def ordered_railties
- railties + [self]
- end
-
- def initializers
- initializers = []
- ordered_railties.each do |r|
- if r == self
- initializers += super
- else
- initializers += r.initializers
- end
- end
- initializers
- end
-
+ # Define the configuration object for the engine.
def config
@config ||= Engine::Configuration.new(find_root_with_flag("lib"))
end
@@ -626,27 +621,27 @@ def load_seed
else
Rake::Task["app:railties:install:migrations"].invoke
end
-
end
end
end
end
protected
- def initialize_generators
- require "rails/generators"
+ def run_tasks_blocks(*) #:nodoc:
+ super
+ paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
end
- def routes?
+ def routes? #:nodoc:
@routes
end
- def has_migrations?
+ def has_migrations? #:nodoc:
paths["db/migrate"].existent.any?
end
- def find_root_with_flag(flag, default=nil)
+ def find_root_with_flag(flag, default=nil) #:nodoc:
root_path = self.class.called_from
while root_path && File.directory?(root_path) && !File.exist?("#{root_path}/#{flag}")
@@ -660,19 +655,19 @@ def find_root_with_flag(flag, default=nil)
Pathname.new File.realpath root
end
- def default_middleware_stack
+ def default_middleware_stack #:nodoc:
ActionDispatch::MiddlewareStack.new
end
- def _all_autoload_once_paths
+ def _all_autoload_once_paths #:nodoc:
config.autoload_once_paths
end
- def _all_autoload_paths
+ def _all_autoload_paths #:nodoc:
@_all_autoload_paths ||= (config.autoload_paths + config.eager_load_paths + config.autoload_once_paths).uniq
end
- def _all_load_paths
+ def _all_load_paths #:nodoc:
@_all_load_paths ||= (config.paths.load_paths + _all_autoload_paths).uniq
end
end
View
32 railties/lib/rails/railtie.rb
@@ -181,33 +181,35 @@ def config
def eager_load!
end
- def load_console(app=self)
+ def railtie_namespace
+ @railtie_namespace ||= self.class.parents.detect { |n| n.respond_to?(:railtie_namespace) }
+ end
+
+ protected
+
+ def run_console_blocks(app) #:nodoc:
self.class.console.each { |block| block.call(app) }
end
- def load_runner(app=self)
+ def run_generators_blocks(app) #:nodoc:
+ self.class.generators.each { |block| block.call(app) }
+ end
+
+ def run_runner_blocks(app) #:nodoc:
self.class.runner.each { |block| block.call(app) }
end
- def load_tasks(app=self)
- require 'rake'
+ def run_tasks_blocks(app) #:nodoc:
extend Rake::DSL
- self.class.rake_tasks.each { |block| self.instance_exec(app, &block) }
+ self.class.rake_tasks.each { |block| instance_exec(app, &block) }
- # load also tasks from all superclasses
+ # Load also tasks from all superclasses
klass = self.class.superclass
+
while klass.respond_to?(:rake_tasks)
- klass.rake_tasks.each { |t| self.instance_exec(app, &t) }
+ klass.rake_tasks.each { |t| instance_exec(app, &t) }
klass = klass.superclass
end
end
-
- def load_generators(app=self)
- self.class.generators.each { |block| block.call(app) }
- end
-
- def railtie_namespace
- @railtie_namespace ||= self.class.parents.detect { |n| n.respond_to?(:railtie_namespace) }
- end
end
end
View
2 railties/test/railties/engine_test.rb
@@ -1098,7 +1098,7 @@ def bar
assert_equal "// App's bar js\n;", last_response.body.strip
# ensure that railties are not added twice
- railties = Rails.application.ordered_railties.map(&:class)
+ railties = Rails.application.send(:ordered_railties).map(&:class)
assert_equal railties, railties.uniq
end

0 comments on commit 50b6110

Please sign in to comment.
Something went wrong with that request. Please try again.