2010-04-05 04:52:47 -04:00
|
|
|
require 'active_support/core_ext/hash/reverse_merge'
|
2010-06-20 07:37:58 -04:00
|
|
|
require 'active_support/file_update_checker'
|
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'
|
2009-12-22 20:03:23 -05:00
|
|
|
|
2009-09-25 22:32:28 -04:00
|
|
|
module Rails
|
2010-02-02 14:05:26 -05:00
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
# == 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",
|
2010-06-27 18:57:47 -04:00
|
|
|
# "logger", "reload_plugins" and so forth.
|
2010-02-02 14:05:26 -05:00
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
#
|
2010-05-29 14:07:47 -04:00
|
|
|
# == Middlewares
|
2010-02-02 14:05:26 -05:00
|
|
|
#
|
2010-05-29 14:07:47 -04:00
|
|
|
# The Application is also responsible for building the middleware stack.
|
2010-05-15 09:08:55 -04:00
|
|
|
#
|
2010-01-21 17:14:20 -05:00
|
|
|
class Application < Engine
|
2010-01-23 10:07:20 -05:00
|
|
|
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'
|
2010-01-23 10:07:20 -05:00
|
|
|
autoload :Finisher, 'rails/application/finisher'
|
2010-01-23 10:59:32 -05:00
|
|
|
autoload :Railties, 'rails/application/railties'
|
2010-01-23 09:05:13 -05:00
|
|
|
|
2009-10-08 15:14:57 -04:00
|
|
|
class << self
|
2009-12-23 20:11:17 -05:00
|
|
|
private :new
|
2010-03-08 01:34:39 -05:00
|
|
|
|
|
|
|
def configure(&block)
|
|
|
|
class_eval(&block)
|
|
|
|
end
|
2010-01-23 09:05:13 -05:00
|
|
|
|
2009-12-23 20:11:17 -05:00
|
|
|
def instance
|
2010-01-26 06:14:48 -05:00
|
|
|
if self == Rails::Application
|
2010-07-01 11:07:48 -04:00
|
|
|
if Rails.application
|
|
|
|
ActiveSupport::Deprecation.warn "Calling a method in Rails::Application is deprecated, " <<
|
|
|
|
"please call it directly in your application constant #{Rails.application.class.name}.", caller
|
|
|
|
end
|
2010-01-26 06:14:48 -05:00
|
|
|
Rails.application
|
2010-01-24 11:29:38 -05:00
|
|
|
else
|
2010-01-26 06:14:48 -05:00
|
|
|
@@instance ||= new
|
2010-01-24 11:29:38 -05:00
|
|
|
end
|
2009-11-02 20:19:03 -05:00
|
|
|
end
|
|
|
|
|
2010-01-21 17:14:20 -05:00
|
|
|
def inherited(base)
|
2010-01-24 03:00:18 -05:00
|
|
|
raise "You cannot have more than one Rails::Application" if Rails.application
|
2010-01-21 17:14:20 -05:00
|
|
|
super
|
2010-01-23 12:41:53 -05:00
|
|
|
Rails.application = base.instance
|
2010-06-22 17:17:20 -04:00
|
|
|
Rails.application.add_lib_to_load_path!
|
2010-05-15 09:08:55 -04:00
|
|
|
ActiveSupport.run_load_hooks(:before_configuration, base.instance)
|
2009-10-08 15:14:57 -04:00
|
|
|
end
|
2009-09-28 20:57:36 -04:00
|
|
|
|
2010-01-27 15:20:32 -05:00
|
|
|
def respond_to?(*args)
|
|
|
|
super || instance.respond_to?(*args)
|
|
|
|
end
|
|
|
|
|
2010-01-23 09:05:13 -05:00
|
|
|
protected
|
|
|
|
|
|
|
|
def method_missing(*args, &block)
|
|
|
|
instance.send(*args, &block)
|
2009-12-21 21:15:27 -05:00
|
|
|
end
|
2009-11-02 20:19:03 -05:00
|
|
|
end
|
2009-09-28 20:57:36 -04:00
|
|
|
|
2010-05-29 14:07:47 -04:00
|
|
|
delegate :middleware, :to => :config
|
2010-03-26 13:47:55 -04:00
|
|
|
|
2010-06-20 07:03:08 -04:00
|
|
|
# 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.
|
2010-06-22 17:17:20 -04:00
|
|
|
def add_lib_to_load_path! #:nodoc:
|
2010-06-01 18:42:20 -04:00
|
|
|
path = config.root.join('lib').to_s
|
|
|
|
$LOAD_PATH.unshift(path) if File.exists?(path)
|
|
|
|
end
|
|
|
|
|
2010-06-20 07:03:08 -04:00
|
|
|
def require_environment! #:nodoc:
|
2010-04-29 02:39:44 -04:00
|
|
|
environment = paths.config.environment.to_a.first
|
2010-01-23 10:59:32 -05:00
|
|
|
require environment if environment
|
2009-12-21 19:35:54 -05:00
|
|
|
end
|
|
|
|
|
2010-06-20 07:03:08 -04:00
|
|
|
def eager_load! #:nodoc:
|
2010-06-01 18:42:20 -04:00
|
|
|
railties.all(&:eager_load!)
|
|
|
|
super
|
|
|
|
end
|
|
|
|
|
2010-01-23 09:05:13 -05:00
|
|
|
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)
|
2009-11-02 20:19:03 -05:00
|
|
|
end
|
2009-12-14 18:54:41 -05:00
|
|
|
|
2010-01-23 09:05:13 -05:00
|
|
|
def routes_reloader
|
2010-06-20 07:37:58 -04:00
|
|
|
@routes_reloader ||= ActiveSupport::FileUpdateChecker.new([]){ reload_routes! }
|
2009-12-14 18:54:41 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def reload_routes!
|
2010-07-02 02:13:52 -04:00
|
|
|
_routes = self.routes
|
|
|
|
_routes.disable_clear_and_finalize = true
|
|
|
|
_routes.clear!
|
2010-06-20 07:37:58 -04:00
|
|
|
routes_reloader.paths.each { |path| load(path) }
|
2010-07-02 02:13:52 -04:00
|
|
|
ActiveSupport.on_load(:action_controller) { _routes.finalize! }
|
2010-06-20 07:37:58 -04:00
|
|
|
ensure
|
2010-07-02 02:13:52 -04:00
|
|
|
_routes.disable_clear_and_finalize = false
|
2010-01-23 09:05:13 -05:00
|
|
|
end
|
2009-12-14 18:54:41 -05:00
|
|
|
|
2010-01-23 09:05:13 -05:00
|
|
|
def initialize!
|
|
|
|
run_initializers(self)
|
|
|
|
self
|
2009-12-14 18:54:41 -05:00
|
|
|
end
|
|
|
|
|
2009-12-23 20:11:17 -05:00
|
|
|
def load_tasks
|
2010-01-23 12:41:53 -05:00
|
|
|
initialize_tasks
|
2010-01-23 10:59:32 -05:00
|
|
|
railties.all { |r| r.load_tasks }
|
2010-04-26 03:36:13 -04:00
|
|
|
super
|
2010-01-23 10:59:32 -05:00
|
|
|
self
|
2009-12-23 20:11:17 -05:00
|
|
|
end
|
|
|
|
|
2010-01-19 12:43:09 -05:00
|
|
|
def load_generators
|
2010-01-23 12:41:53 -05:00
|
|
|
initialize_generators
|
2010-01-23 10:59:32 -05:00
|
|
|
railties.all { |r| r.load_generators }
|
2010-04-26 03:36:13 -04:00
|
|
|
super
|
2010-01-23 10:59:32 -05:00
|
|
|
self
|
2009-11-06 20:21:39 -05:00
|
|
|
end
|
|
|
|
|
2010-07-17 04:59:41 -04:00
|
|
|
def load_console(sandbox=false)
|
|
|
|
initialize_console(sandbox)
|
|
|
|
railties.all { |r| r.load_console }
|
|
|
|
super()
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
2010-01-16 17:14:35 -05:00
|
|
|
def app
|
2010-05-29 16:29:14 -04:00
|
|
|
@app ||= begin
|
|
|
|
config.middleware = config.middleware.merge_into(default_middleware_stack)
|
|
|
|
config.middleware.build(routes)
|
|
|
|
end
|
2010-01-16 17:14:35 -05:00
|
|
|
end
|
2010-06-20 19:08:50 -04:00
|
|
|
alias :build_middleware_stack :app
|
2010-01-16 17:14:35 -05:00
|
|
|
|
2009-11-02 20:19:03 -05:00
|
|
|
def call(env)
|
2010-04-05 04:52:47 -04:00
|
|
|
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
|
|
|
|
}
|
2009-10-07 18:21:19 -04:00
|
|
|
end
|
|
|
|
|
2010-01-22 19:29:29 -05:00
|
|
|
def initializers
|
2010-01-25 18:08:08 -05:00
|
|
|
initializers = Bootstrap.initializers_for(self)
|
2010-01-23 10:59:32 -05:00
|
|
|
railties.all { |r| initializers += r.initializers }
|
2010-01-25 12:06:39 -05:00
|
|
|
initializers += super
|
2010-01-25 18:08:08 -05:00
|
|
|
initializers += Finisher.initializers_for(self)
|
2010-06-24 05:13:08 -04:00
|
|
|
initializers
|
2010-01-22 19:29:29 -05:00
|
|
|
end
|
2010-01-23 12:41:53 -05:00
|
|
|
|
|
|
|
protected
|
|
|
|
|
2010-05-29 16:29:14 -04:00
|
|
|
def default_middleware_stack
|
|
|
|
ActionDispatch::MiddlewareStack.new.tap do |middleware|
|
|
|
|
middleware.use ::ActionDispatch::Static, paths.public.to_a.first if config.serve_static_assets
|
|
|
|
middleware.use ::Rack::Lock if !config.allow_concurrency
|
|
|
|
middleware.use ::Rack::Runtime
|
|
|
|
middleware.use ::Rails::Rack::Logger
|
|
|
|
middleware.use ::ActionDispatch::ShowExceptions, config.consider_all_requests_local if config.action_dispatch.show_exceptions
|
|
|
|
middleware.use ::ActionDispatch::RemoteIp, config.action_dispatch.ip_spoofing_check, config.action_dispatch.trusted_proxies
|
|
|
|
middleware.use ::Rack::Sendfile, config.action_dispatch.x_sendfile_header
|
|
|
|
middleware.use ::ActionDispatch::Callbacks, !config.cache_classes
|
|
|
|
middleware.use ::ActionDispatch::Cookies
|
|
|
|
|
|
|
|
if config.session_store
|
|
|
|
middleware.use config.session_store, config.session_options
|
|
|
|
middleware.use ::ActionDispatch::Flash
|
|
|
|
end
|
|
|
|
|
|
|
|
middleware.use ::ActionDispatch::ParamsParser
|
|
|
|
middleware.use ::Rack::MethodOverride
|
|
|
|
middleware.use ::ActionDispatch::Head
|
2010-07-27 22:24:56 -04:00
|
|
|
middleware.use ::ActionDispatch::BestStandardsSupport if config.action_dispatch.best_standards_support
|
2010-05-29 16:29:14 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-01-23 12:41:53 -05:00
|
|
|
def initialize_tasks
|
|
|
|
require "rails/tasks"
|
|
|
|
task :environment do
|
|
|
|
$rails_rake_task = true
|
2010-04-29 02:39:44 -04:00
|
|
|
require_environment!
|
2010-01-23 12:41:53 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize_generators
|
|
|
|
require "rails/generators"
|
|
|
|
end
|
2010-07-17 04:59:41 -04:00
|
|
|
|
|
|
|
def initialize_console(sandbox=false)
|
|
|
|
require "rails/console/app"
|
|
|
|
require "rails/console/sandbox" if sandbox
|
|
|
|
require "rails/console/helpers"
|
|
|
|
end
|
2009-09-25 22:32:28 -04:00
|
|
|
end
|
|
|
|
end
|