2010-01-21 19:10:31 -05:00
require 'fileutils'
2012-10-30 23:06:46 -04:00
# FIXME remove DummyKeyGenerator and this require in 4.1
require 'active_support/key_generator'
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
#
2012-01-02 15:49:18 -05:00
# Rails::Application is responsible for executing all railties and engines
2011-07-12 09:37:55 -04:00
# initializers. It also executes some bootstrap initializers (check
2010-02-02 14:05:26 -05:00
# 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
2012-08-01 09:27:57 -04:00
# "cache_classes", "consider_all_requests_local", "filter_parameters",
2012-01-02 15:49:18 -05:00
# "logger" 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
#
2011-12-12 09:18:19 -05:00
# == Booting process
#
# The application is also responsible for setting up and executing the booting
# process. From the moment you require "config/application.rb" in your app,
# the booting process goes like this:
#
# 1) require "config/boot.rb" to setup load paths
# 2) require railties and engines
# 3) Define Rails.application as "class MyApp::Application < Rails::Application"
# 4) Run config.before_configuration callbacks
# 5) Load config/environments/ENV.rb
# 6) Run config.before_initialize callbacks
# 7) Run Railtie#initializer defined by railties, engines and application.
2011-12-13 02:49:04 -05:00
# One by one, each engine sets up its load paths, routes and runs its config/initializers/* files.
2013-03-09 12:42:02 -05:00
# 8) Custom Railtie#initializers added by railties, engines and applications are executed
# 9) Build the middleware stack and run to_prepare callbacks
# 10) Run config.before_eager_load and eager_load! if eager_load is true
# 11) Run config.after_initialize callbacks
2011-12-12 09:18:19 -05: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-23 16:30:17 -05:00
autoload :Configuration , 'rails/application/configuration'
2010-01-23 10:07:20 -05:00
autoload :Finisher , 'rails/application/finisher'
2012-12-19 01:54:09 -05:00
autoload :Railties , 'rails/engine/railties'
2010-09-29 14:05:34 -04:00
autoload :RoutesReloader , 'rails/application/routes_reloader'
2010-01-23 09:05:13 -05:00
2009-10-08 15:14:57 -04:00
class << self
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-11-02 20:19:03 -05:00
end
2009-09-28 20:57:36 -04:00
2012-12-21 18:42:47 -05:00
attr_accessor :assets , :sandbox
2011-05-24 19:37:55 -04:00
alias_method :sandbox? , :sandbox
2011-12-12 16:51:33 -05:00
attr_reader :reloaders
2011-05-24 19:37:55 -04:00
2012-10-14 06:03:39 -04:00
delegate :default_url_options , :default_url_options = , to : :routes
2010-07-08 09:42:40 -04:00
2011-08-24 16:25:11 -04:00
def initialize
super
2012-05-22 19:36:08 -04:00
@initialized = false
@reloaders = [ ]
@routes_reloader = nil
2013-03-19 00:11:01 -04:00
@app_env_config = nil
2012-05-22 19:36:08 -04:00
@ordered_railties = nil
2012-06-29 10:50:51 -04:00
@railties = nil
2011-08-24 16:25:11 -04:00
end
2012-06-29 10:50:51 -04:00
# Returns true if the application is initialized.
2012-06-29 09:25:47 -04:00
def initialized?
@initialized
end
2012-09-15 11:11:54 -04:00
# Implements call according to the Rack API. It simply
# dispatches the request to the underlying middleware stack.
2012-06-29 09:25:47 -04:00
def call ( env )
env [ " ORIGINAL_FULLPATH " ] = build_original_fullpath ( env )
super ( env )
end
# Reload application routes regardless if they changed or not.
def reload_routes!
routes_reloader . reload!
end
2012-09-30 22:34:12 -04:00
# Return the application's KeyGenerator
def key_generator
# number of iterations selected based on consultation with the google security
# team. Details at https://github.com/rails/rails/pull/6952#issuecomment-7661220
2012-11-01 18:23:21 -04:00
@caching_key_generator || = begin
2012-11-02 18:27:51 -04:00
if config . secret_key_base
key_generator = ActiveSupport :: KeyGenerator . new ( config . secret_key_base , iterations : 1000 )
2012-11-01 18:23:21 -04:00
ActiveSupport :: CachingKeyGenerator . new ( key_generator )
else
ActiveSupport :: DummyKeyGenerator . new ( config . secret_token )
end
end
2012-09-30 22:34:12 -04:00
end
2012-06-29 09:25:47 -04:00
# Stores some of the Rails initial environment parameters which
# will be used by middlewares and engines to configure themselves.
2012-07-31 22:26:00 -04:00
# Currently stores:
#
2012-11-01 18:02:09 -04:00
# * "action_dispatch.parameter_filter" => config.filter_parameters
2012-09-30 18:00:44 -04:00
# * "action_dispatch.redirect_filter" => config.filter_redirect
2012-11-16 14:17:08 -05:00
# * "action_dispatch.secret_token" => config.secret_token,
2012-11-01 18:02:09 -04:00
# * "action_dispatch.show_exceptions" => config.action_dispatch.show_exceptions
# * "action_dispatch.show_detailed_exceptions" => config.consider_all_requests_local
# * "action_dispatch.logger" => Rails.logger
# * "action_dispatch.backtrace_cleaner" => Rails.backtrace_cleaner
# * "action_dispatch.key_generator" => key_generator
# * "action_dispatch.http_auth_salt" => config.action_dispatch.http_auth_salt
# * "action_dispatch.signed_cookie_salt" => config.action_dispatch.signed_cookie_salt
# * "action_dispatch.encrypted_cookie_salt" => config.action_dispatch.encrypted_cookie_salt
# * "action_dispatch.encrypted_signed_cookie_salt" => config.action_dispatch.encrypted_signed_cookie_salt
2012-07-31 22:26:00 -04:00
#
2012-06-29 09:25:47 -04:00
def env_config
2013-03-18 23:00:39 -04:00
@app_env_config || = begin
2012-11-02 18:27:51 -04:00
if config . secret_key_base . nil?
2012-12-30 12:43:40 -05:00
ActiveSupport :: Deprecation . warn " You didn't set config.secret_key_base in config/initializers/secret_token.rb file. " +
" This should be used instead of the old deprecated config.secret_token in order to use the new EncryptedCookieStore. " +
" To convert safely to the encrypted store (without losing existing cookies and sessions), see http://guides.rubyonrails.org/upgrading_ruby_on_rails.html # action-pack "
2012-11-02 18:26:11 -04:00
if config . secret_token . blank?
2012-11-02 18:27:51 -04:00
raise " You must set config.secret_key_base in your app's config "
2012-11-02 18:26:11 -04:00
end
2012-11-01 00:20:16 -04:00
end
super . merge ( {
" action_dispatch.parameter_filter " = > config . filter_parameters ,
2012-09-30 18:00:44 -04:00
" action_dispatch.redirect_filter " = > config . filter_redirect ,
2012-11-16 14:17:08 -05:00
" action_dispatch.secret_token " = > config . secret_token ,
2013-03-24 19:20:24 -04:00
" action_dispatch.secret_key_base " = > config . secret_key_base ,
2012-11-01 00:20:16 -04:00
" action_dispatch.show_exceptions " = > config . action_dispatch . show_exceptions ,
" action_dispatch.show_detailed_exceptions " = > config . consider_all_requests_local ,
" action_dispatch.logger " = > Rails . logger ,
" action_dispatch.backtrace_cleaner " = > Rails . backtrace_cleaner ,
2012-11-01 18:02:09 -04:00
" action_dispatch.key_generator " = > key_generator ,
" action_dispatch.http_auth_salt " = > config . action_dispatch . http_auth_salt ,
" action_dispatch.signed_cookie_salt " = > config . action_dispatch . signed_cookie_salt ,
" action_dispatch.encrypted_cookie_salt " = > config . action_dispatch . encrypted_cookie_salt ,
" action_dispatch.encrypted_signed_cookie_salt " = > config . action_dispatch . encrypted_signed_cookie_salt
2012-11-01 00:20:16 -04:00
} )
end
2012-06-29 09:25:47 -04:00
end
## Rails internal API
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:
2012-05-23 18:44:24 -04:00
path = File . join config . root , 'lib'
2010-06-01 18:42:20 -04:00
$LOAD_PATH . unshift ( path ) if File . exists? ( path )
end
2010-06-20 07:03:08 -04:00
def require_environment! #:nodoc:
2010-10-06 11:18:59 -04:00
environment = paths [ " config/environment " ] . existent . first
2010-01-23 10:59:32 -05:00
require environment if environment
2009-12-21 19:35:54 -05:00
end
2011-12-12 09:18:19 -05:00
def routes_reloader #:nodoc:
2010-09-29 14:05:34 -04:00
@routes_reloader || = RoutesReloader . new
2010-01-23 09:05:13 -05:00
end
2009-12-14 18:54:41 -05:00
2012-06-29 09:25:47 -04:00
# Returns an array of file paths appended with a hash of
# directories-extensions suitable for ActiveSupport::FileUpdateChecker
# API.
def watchable_args #:nodoc:
2012-01-14 21:34:51 -05:00
files , dirs = config . watchable_files . dup , config . watchable_dirs . dup
2011-12-12 16:51:33 -05:00
ActiveSupport :: Dependencies . autoload_paths . each do | path |
dirs [ path . to_s ] = [ :rb ]
end
2011-12-13 05:23:21 -05:00
[ files , dirs ]
2011-12-12 09:18:19 -05:00
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:
2010-07-22 06:07:45 -04:00
raise " Application has been already initialized. " if @initialized
2011-09-23 19:56:49 -04:00
run_initializers ( group , self )
2010-07-22 06:07:45 -04:00
@initialized = true
2010-01-23 09:05:13 -05:00
self
2009-12-14 18:54:41 -05:00
end
2011-12-12 09:18:19 -05:00
def initializers #:nodoc:
2010-10-08 10:58:24 -04:00
Bootstrap . initializers_for ( self ) +
2012-06-29 10:50:51 -04:00
railties_initializers ( super ) +
2010-10-08 10:58:24 -04:00
Finisher . initializers_for ( self )
2010-01-22 19:29:29 -05:00
end
2010-01-23 12:41:53 -05:00
2011-12-12 09:18:19 -05:00
def config #:nodoc:
2010-07-19 11:53:14 -04:00
@config || = Application :: Configuration . new ( find_root_with_flag ( " config.ru " , Dir . pwd ) )
end
2012-06-29 09:25:47 -04:00
def to_app #:nodoc:
2011-06-06 16:56:41 -04:00
self
end
2011-12-12 09:18:19 -05:00
def helpers_paths #:nodoc:
2011-11-23 14:06:45 -05:00
config . helpers_paths
end
2011-04-15 12:42:51 -04:00
protected
alias :build_middleware_stack :app
2011-03-29 22:16:44 -04:00
2012-06-29 10:50:51 -04:00
def run_tasks_blocks ( app ) #:nodoc:
railties . each { | r | r . run_tasks_blocks ( app ) }
super
require " rails/tasks "
2012-08-01 09:07:01 -04:00
config = self . config
2012-06-29 10:50:51 -04:00
task :environment do
2012-08-01 09:07:01 -04:00
config . eager_load = false
2012-06-29 10:50:51 -04:00
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
2012-06-29 09:25:47 -04:00
def reload_dependencies? #:nodoc:
2011-12-12 16:51:33 -05:00
config . reload_classes_only_on_change != true || reloaders . map ( & :updated? ) . any?
end
2012-06-29 09:25:47 -04:00
def default_middleware_stack #:nodoc:
2010-05-29 16:29:14 -04:00
ActionDispatch :: MiddlewareStack . new . tap do | middleware |
2012-07-01 23:00:10 -04:00
app = self
2012-10-03 17:43:39 -04:00
2013-03-03 15:20:44 -05:00
if rack_cache = load_rack_cache
2011-03-27 12:55:46 -04:00
require " action_dispatch/http/rack_cache "
middleware . use :: Rack :: Cache , rack_cache
end
2010-09-13 17:03:06 -04:00
2011-03-27 12:55:46 -04:00
if config . force_ssl
2012-03-16 22:22:25 -04:00
middleware . use :: ActionDispatch :: SSL , config . ssl_options
2011-03-27 12:55:46 -04:00
end
2010-09-15 15:58:49 -04:00
2012-03-03 14:05:45 -05:00
if config . action_dispatch . x_sendfile_header . present?
middleware . use :: Rack :: Sendfile , config . action_dispatch . x_sendfile_header
end
2011-02-09 06:14:48 -05:00
if config . serve_static_assets
2011-05-03 07:07:39 -04:00
middleware . use :: ActionDispatch :: Static , paths [ " public " ] . first , config . static_cache_control
2011-02-09 06:14:48 -05:00
end
2011-03-27 12:55:46 -04:00
2013-03-03 15:20:44 -05:00
middleware . use :: Rack :: Lock unless allow_concurrency?
2010-05-29 16:29:14 -04:00
middleware . use :: Rack :: Runtime
2012-03-14 17:58:32 -04:00
middleware . use :: Rack :: MethodOverride
2011-10-19 13:59:33 -04:00
middleware . use :: ActionDispatch :: RequestId
2013-03-03 15:20:44 -05:00
# Must come after Rack::MethodOverride to properly log overridden methods
middleware . use :: Rails :: Rack :: Logger , config . log_tags
middleware . use :: ActionDispatch :: ShowExceptions , show_exceptions_app
2012-07-01 23:00:10 -04:00
middleware . use :: ActionDispatch :: DebugExceptions , app
2010-05-29 16:29:14 -04:00
middleware . use :: ActionDispatch :: RemoteIp , config . action_dispatch . ip_spoofing_check , config . action_dispatch . trusted_proxies
2011-12-01 14:46:18 -05:00
2011-12-12 16:51:33 -05:00
unless config . cache_classes
middleware . use :: ActionDispatch :: Reloader , lambda { app . reload_dependencies? }
end
2010-12-19 18:58:58 -05:00
middleware . use :: ActionDispatch :: Callbacks
2012-03-14 17:58:32 -04:00
middleware . use :: ActionDispatch :: Cookies
2010-05-29 16:29:14 -04:00
2012-03-14 17:58:32 -04:00
if config . session_store
2012-01-12 14:46:54 -05:00
if config . force_ssl && ! config . session_options . key? ( :secure )
config . session_options [ :secure ] = true
end
2010-05-29 16:29:14 -04:00
middleware . use config . session_store , config . session_options
middleware . use :: ActionDispatch :: Flash
end
middleware . use :: ActionDispatch :: ParamsParser
2012-07-23 12:50:48 -04:00
middleware . use :: Rack :: Head
2010-09-22 15:40:14 -04:00
middleware . use :: Rack :: ConditionalGet
middleware . use :: Rack :: ETag , " no-cache "
2010-05-29 16:29:14 -04:00
end
end
2013-03-03 15:20:44 -05:00
def allow_concurrency?
if config . allow_concurrency . nil?
config . cache_classes
else
config . allow_concurrency
end
end
def load_rack_cache
rack_cache = config . action_dispatch . rack_cache
return unless rack_cache
begin
require 'rack/cache'
rescue LoadError = > error
error . message << ' Be sure to add rack-cache to your Gemfile'
raise
end
if rack_cache == true
{
metastore : " rails:/ " ,
entitystore : " rails:/ " ,
verbose : false
}
else
rack_cache
end
end
def show_exceptions_app
config . exceptions_app || ActionDispatch :: PublicExceptions . new ( Rails . public_path )
end
2012-06-29 09:25:47 -04:00
def build_original_fullpath ( env ) #:nodoc:
2012-01-27 20:12:18 -05:00
path_info = env [ " PATH_INFO " ]
query_string = env [ " QUERY_STRING " ]
script_name = env [ " SCRIPT_NAME " ]
if query_string . present?
" #{ script_name } #{ path_info } ? #{ query_string } "
else
" #{ script_name } #{ path_info } "
end
2011-12-20 14:17:17 -05:00
end
2009-09-25 22:32:28 -04:00
end
2011-05-07 04:19:01 -04:00
end