1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/railties/lib/rails/application.rb

171 lines
4.6 KiB
Ruby
Raw Normal View History

require 'active_support/core_ext/hash/reverse_merge'
2010-01-21 19:10:31 -05:00
require 'fileutils'
2010-01-23 16:30:17 -05:00
require 'rails/plugin'
2010-01-24 03:00:18 -05:00
require 'rails/engine'
module Rails
# In Rails 3.0, a Rails::Application object was introduced which is nothing more than
# an Engine but with the responsibility of coordinating the whole boot process.
#
# Opposite to Rails::Engine, you can only have one Rails::Application instance
# in your process and both Rails::Application and YourApplication::Application
# points to it.
#
# In other words, Rails::Application is Singleton and whenever you are accessing
# Rails::Application.config or YourApplication::Application.config, you are actually
# accessing YourApplication::Application.instance.config.
#
# == Initialization
#
# Rails::Application is responsible for executing all railties, engines and plugin
# initializers. Besides, it also executed some bootstrap initializers (check
# Rails::Application::Bootstrap) and finishing initializers, after all the others
# are executed (check Rails::Application::Finisher).
#
# == Configuration
#
# Besides providing the same configuration as Rails::Engine and Rails::Railtie,
# the application object has several specific configurations, for example
# "allow_concurrency", "cache_classes", "consider_all_requests_local", "filter_parameters",
# "logger", "metals", "reload_engines", "reload_plugins" and so forth.
#
# Check Rails::Application::Configuration to see them all.
#
# == Routes
#
# The application object is also responsible for holding the routes and reloading routes
# whenever the files change in development.
#
# == Middlewares and metals
#
# The Application is also responsible for building the middleware stack and setting up
# both application and engines metals.
#
class Application < Engine
autoload :Bootstrap, 'rails/application/bootstrap'
2010-01-26 08:58:00 -05:00
autoload :Configurable, 'rails/application/configurable'
2010-01-23 16:30:17 -05:00
autoload :Configuration, 'rails/application/configuration'
autoload :Finisher, 'rails/application/finisher'
autoload :MetalLoader, 'rails/application/metal_loader'
2010-01-23 10:59:32 -05:00
autoload :Railties, 'rails/application/railties'
autoload :RoutesReloader, 'rails/application/routes_reloader'
class << self
private :new
def configure(&block)
class_eval(&block)
end
def instance
if self == Rails::Application
Rails.application
else
@@instance ||= new
end
end
def inherited(base)
2010-01-24 03:00:18 -05:00
raise "You cannot have more than one Rails::Application" if Rails.application
super
Rails.application = base.instance
ActiveSupport.run_load_hooks(:before_configuration, base.instance)
end
def respond_to?(*args)
super || instance.respond_to?(*args)
end
protected
def method_missing(*args, &block)
instance.send(*args, &block)
end
end
delegate :middleware, :metal_loader, :to => :config
def require_environment!
environment = paths.config.environment.to_a.first
2010-01-23 10:59:32 -05:00
require environment if environment
end
def routes
2010-02-24 19:47:43 -05:00
@routes ||= ActionDispatch::Routing::RouteSet.new
2010-01-23 10:59:32 -05:00
end
def railties
@railties ||= Railties.new(config)
end
2009-12-14 18:54:41 -05:00
def routes_reloader
@routes_reloader ||= RoutesReloader.new
2009-12-14 18:54:41 -05:00
end
def reload_routes!
routes_reloader.reload!
end
2009-12-14 18:54:41 -05:00
def initialize!
run_initializers(self)
self
2009-12-14 18:54:41 -05:00
end
def load_tasks
initialize_tasks
2010-01-23 10:59:32 -05:00
railties.all { |r| r.load_tasks }
super
2010-01-23 10:59:32 -05:00
self
end
def load_generators
initialize_generators
2010-01-23 10:59:32 -05:00
railties.all { |r| r.load_generators }
super
2010-01-23 10:59:32 -05:00
self
2009-11-06 20:21:39 -05:00
end
def app
@app ||= config.middleware.build(routes)
end
def call(env)
app.call(env.reverse_merge!(env_defaults))
end
def env_defaults
@env_defaults ||= {
"action_dispatch.parameter_filter" => config.filter_parameters,
"action_dispatch.secret_token" => config.secret_token
}
end
def initializers
initializers = Bootstrap.initializers_for(self)
2010-01-23 10:59:32 -05:00
railties.all { |r| initializers += r.initializers }
initializers += super
initializers += Finisher.initializers_for(self)
initializers
end
protected
def initialize_tasks
require "rails/tasks"
task :environment do
$rails_rake_task = true
require_environment!
end
end
def initialize_generators
require "rails/generators"
end
# Application is always reloadable when config.cache_classes is false.
def reloadable?(app)
true
end
end
end