diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb index 32797ee657..1a993a25cb 100644 --- a/railties/lib/rails/application.rb +++ b/railties/lib/rails/application.rb @@ -53,7 +53,6 @@ module Rails autoload :Bootstrap, 'rails/application/bootstrap' autoload :Configuration, 'rails/application/configuration' autoload :Finisher, 'rails/application/finisher' - autoload :Railties, 'rails/application/railties' autoload :RoutesReloader, 'rails/application/routes_reloader' class << self @@ -83,27 +82,15 @@ module Rails @queue = nil end - # This method is called just after an application inherits from Rails::Application, - # allowing the developer to load classes in lib and use them during application - # configuration. - # - # class MyApplication < Rails::Application - # require "my_backend" # in lib/my_backend - # config.i18n.backend = MyBackend - # end - # - # Notice this method takes into consideration the default root path. So if you - # are changing config.root inside your application definition or having a custom - # Rails application, you will need to add lib to $LOAD_PATH on your own in case - # you need to load files in lib/ during the application configuration as well. - def add_lib_to_load_path! #:nodoc: - path = File.join config.root, 'lib' - $LOAD_PATH.unshift(path) if File.exists?(path) + def initialized? + @initialized end - def require_environment! #:nodoc: - environment = paths["config/environment"].existent.first - require environment if environment + # Implements call according to the Rack API. It simples + # dispatch the request to the underlying middleware stack. + def call(env) + env["ORIGINAL_FULLPATH"] = build_original_fullpath(env) + super(env) end # Reload application routes regardless if they changed or not. @@ -111,37 +98,6 @@ module Rails routes_reloader.reload! end - def routes_reloader #:nodoc: - @routes_reloader ||= RoutesReloader.new - end - - # Returns an array of file paths appended with a hash of directories-extensions - # suitable for ActiveSupport::FileUpdateChecker API. - def watchable_args - files, dirs = config.watchable_files.dup, config.watchable_dirs.dup - - ActiveSupport::Dependencies.autoload_paths.each do |path| - dirs[path.to_s] = [:rb] - end - - [files, dirs] - end - - # Initialize the application passing the given group. By default, the - # group is :default but sprockets precompilation passes group equals - # to assets if initialize_on_precompile is false to avoid booting the - # whole app. - def initialize!(group=:default) #:nodoc: - raise "Application has been already initialized." if @initialized - run_initializers(group, self) - @initialized = true - self - end - - def initialized? - @initialized - end - # Load the application and its railties tasks and invoke the registered hooks. # Check Rails::Railtie.rake_tasks for more info. def load_tasks(app=self) @@ -179,6 +135,59 @@ module Rails }) end + ## Rails internal API + + # This method is called just after an application inherits from Rails::Application, + # allowing the developer to load classes in lib and use them during application + # configuration. + # + # class MyApplication < Rails::Application + # require "my_backend" # in lib/my_backend + # config.i18n.backend = MyBackend + # end + # + # Notice this method takes into consideration the default root path. So if you + # are changing config.root inside your application definition or having a custom + # Rails application, you will need to add lib to $LOAD_PATH on your own in case + # you need to load files in lib/ during the application configuration as well. + def add_lib_to_load_path! #:nodoc: + path = File.join config.root, 'lib' + $LOAD_PATH.unshift(path) if File.exists?(path) + end + + def require_environment! #:nodoc: + environment = paths["config/environment"].existent.first + require environment if environment + end + + def routes_reloader #:nodoc: + @routes_reloader ||= RoutesReloader.new + end + + # Returns an array of file paths appended with a hash of + # directories-extensions suitable for ActiveSupport::FileUpdateChecker + # API. + def watchable_args #:nodoc: + files, dirs = config.watchable_files.dup, config.watchable_dirs.dup + + ActiveSupport::Dependencies.autoload_paths.each do |path| + dirs[path.to_s] = [:rb] + end + + [files, dirs] + end + + # Initialize the application passing the given group. By default, the + # group is :default but sprockets precompilation passes group equals + # to assets if initialize_on_precompile is false to avoid booting the + # whole app. + def initialize!(group=:default) #:nodoc: + raise "Application has been already initialized." if @initialized + run_initializers(group, self) + @initialized = true + self + end + # Returns the ordered railties for this application considering railties_order. def ordered_railties #:nodoc: @ordered_railties ||= begin @@ -192,7 +201,7 @@ module Rails end end - all = (railties.all - order) + all = (railties - order) all.push(self) unless (all + order).include?(self) order.push(:all) unless order.include?(:all) @@ -216,11 +225,11 @@ module Rails @queue ||= build_queue end - def build_queue # :nodoc: + def build_queue #:nodoc: config.queue.new end - def to_app + def to_app #:nodoc: self end @@ -228,20 +237,20 @@ module Rails config.helpers_paths end - def call(env) - env["ORIGINAL_FULLPATH"] = build_original_fullpath(env) - super(env) + def railties #:nodoc: + @railties ||= Rails::Railtie.subclasses.map(&:instance) + + Rails::Engine.subclasses.map(&:instance) end protected alias :build_middleware_stack :app - def reload_dependencies? + def reload_dependencies? #:nodoc: config.reload_classes_only_on_change != true || reloaders.map(&:updated?).any? end - def default_middleware_stack + def default_middleware_stack #:nodoc: ActionDispatch::MiddlewareStack.new.tap do |middleware| if rack_cache = config.action_controller.perform_caching && config.action_dispatch.rack_cache require "action_dispatch/http/rack_cache" @@ -315,7 +324,7 @@ module Rails def initialize_runner #:nodoc: end - def build_original_fullpath(env) + def build_original_fullpath(env) #:nodoc: path_info = env["PATH_INFO"] query_string = env["QUERY_STRING"] script_name = env["SCRIPT_NAME"] diff --git a/railties/lib/rails/application/railties.rb b/railties/lib/rails/application/railties.rb deleted file mode 100644 index f20a9689de..0000000000 --- a/railties/lib/rails/application/railties.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'rails/engine/railties' - -module Rails - class Application < Engine - class Railties < Rails::Engine::Railties - def all(&block) - @all ||= railties + engines - @all.each(&block) if block - @all - end - end - end -end diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index 806b553b81..7db602279a 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -2,7 +2,6 @@ require 'rails/railtie' require 'active_support/core_ext/module/delegation' require 'pathname' require 'rbconfig' -require 'rails/engine/railties' module Rails # Rails::Engine allows you to wrap a specific Rails application or subset of @@ -338,7 +337,6 @@ module Rails # config.railties_order = [Blog::Engine, :main_app, :all] class Engine < Railtie autoload :Configuration, "rails/engine/configuration" - autoload :Railties, "rails/engine/railties" def initialize @_all_autoload_paths = nil @@ -354,7 +352,7 @@ module Rails def load_generators(app=self) initialize_generators - railties.all { |r| r.load_generators(app) } + railties.each { |r| r.load_generators(app) } Rails::Generators.configure!(app.config.generators) super self @@ -417,9 +415,11 @@ module Rails # Finds engine with given path def find(path) expanded_path = File.expand_path path - Rails::Engine::Railties.engines.find { |engine| - File.expand_path(engine.root) == expanded_path - } + Rails::Engine.subclasses.each do |klass| + engine = klass.instance + return engine if File.expand_path(engine.root) == expanded_path + end + nil end end @@ -427,23 +427,23 @@ module Rails delegate :engine_name, :isolated?, :to => "self.class" def load_tasks(app=self) - railties.all { |r| r.load_tasks(app) } + railties.each { |r| r.load_tasks(app) } super paths["lib/tasks"].existent.sort.each { |ext| load(ext) } end def load_console(app=self) - railties.all { |r| r.load_console(app) } + railties.each { |r| r.load_console(app) } super end def load_runner(app=self) - railties.all { |r| r.load_runner(app) } + railties.each { |r| r.load_runner(app) } super end def eager_load! - railties.all(&:eager_load!) + railties.each(&:eager_load!) config.eager_load_paths.each do |load_path| matcher = /\A#{Regexp.escape(load_path)}\/(.*)\.rb\Z/ @@ -454,7 +454,7 @@ module Rails end def railties - @railties ||= self.class::Railties.new(config) + @railties ||= [] end def helpers @@ -507,7 +507,7 @@ module Rails end def ordered_railties - railties.all + [self] + railties + [self] end def initializers diff --git a/railties/lib/rails/engine/railties.rb b/railties/lib/rails/engine/railties.rb deleted file mode 100644 index 033d9c4180..0000000000 --- a/railties/lib/rails/engine/railties.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Rails - class Engine < Railtie - class Railties - # TODO Write tests for this behavior extracted from Application - def initialize(config) - @config = config - end - - def all(&block) - @all ||= [] - @all.each(&block) if block - @all - end - - def self.railties - @railties ||= ::Rails::Railtie.subclasses.map(&:instance) - end - - def self.engines - @engines ||= ::Rails::Engine.subclasses.map(&:instance) - end - - delegate :railties, :engines, :to => "self.class" - end - end -end diff --git a/railties/test/isolation/abstract_unit.rb b/railties/test/isolation/abstract_unit.rb index 800b1c90f0..6071cd3f39 100644 --- a/railties/test/isolation/abstract_unit.rb +++ b/railties/test/isolation/abstract_unit.rb @@ -273,24 +273,18 @@ end # Create a scope and build a fixture rails app Module.new do extend TestHelpers::Paths + # Build a rails app - if File.exist?(app_template_path) - FileUtils.rm_rf(app_template_path) - end + FileUtils.rm_rf(app_template_path) FileUtils.mkdir(app_template_path) environment = File.expand_path('../../../../load_paths', __FILE__) - if File.exist?("#{environment}.rb") - require_environment = "-r #{environment}" - end + require_environment = "-r #{environment}" `#{Gem.ruby} #{require_environment} #{RAILS_FRAMEWORK_ROOT}/railties/bin/rails new #{app_template_path}` + File.open("#{app_template_path}/config/boot.rb", 'w') do |f| - if require_environment - f.puts "Dir.chdir('#{File.dirname(environment)}') do" - f.puts " require '#{environment}'" - f.puts "end" - end + f.puts "require '#{environment}'" f.puts "require 'rails/all'" end end unless defined?(RAILS_ISOLATED_ENGINE)