Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 311 lines (267 sloc) 10.688 kb
02c5137 José Valim Add view paths to Engine setup.
josevalim authored
1 require 'fileutils'
2fde9d7 José Valim Solve some pendencies.
josevalim authored
2 require 'rails/engine'
dc677f7 tests pass with requiring the frameworks in rails.rb
Carlhuda authored
3
accd9b4 Joshua Peek Restore "Start Rails::Application object
josh authored
4 module Rails
781d0a9 José Valim Add docs for Railtie, Engine, Plugin and Application.
josevalim authored
5 # In Rails 3.0, a Rails::Application object was introduced which is nothing more than
6 # an Engine but with the responsibility of coordinating the whole boot process.
7 #
8 # == Initialization
9 #
dad7fdc Santiago Pastorino Rails::Plugin has gone
spastorino authored
10 # Rails::Application is responsible for executing all railties and engines
eb716f6 Matt Jankowski grammar/tense correction to rails application doc
mjankowski authored
11 # initializers. It also executes some bootstrap initializers (check
781d0a9 José Valim Add docs for Railtie, Engine, Plugin and Application.
josevalim authored
12 # Rails::Application::Bootstrap) and finishing initializers, after all the others
13 # are executed (check Rails::Application::Finisher).
14 #
15 # == Configuration
16 #
17 # Besides providing the same configuration as Rails::Engine and Rails::Railtie,
18 # the application object has several specific configurations, for example
19 # "allow_concurrency", "cache_classes", "consider_all_requests_local", "filter_parameters",
dad7fdc Santiago Pastorino Rails::Plugin has gone
spastorino authored
20 # "logger" and so forth.
781d0a9 José Valim Add docs for Railtie, Engine, Plugin and Application.
josevalim authored
21 #
22 # Check Rails::Application::Configuration to see them all.
23 #
24 # == Routes
25 #
26 # The application object is also responsible for holding the routes and reloading routes
27 # whenever the files change in development.
28 #
45e6028 Yehuda Katz Removing Metal from Rails 3.
wycats authored
29 # == Middlewares
781d0a9 José Valim Add docs for Railtie, Engine, Plugin and Application.
josevalim authored
30 #
45e6028 Yehuda Katz Removing Metal from Rails 3.
wycats authored
31 # The Application is also responsible for building the middleware stack.
9cfeefb Yehuda Katz Reorganized initializers a bit to enable better hooks for common cases w...
wycats authored
32 #
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
33 # == Booting process
34 #
35 # The application is also responsible for setting up and executing the booting
36 # process. From the moment you require "config/application.rb" in your app,
37 # the booting process goes like this:
38 #
39 # 1) require "config/boot.rb" to setup load paths
40 # 2) require railties and engines
41 # 3) Define Rails.application as "class MyApp::Application < Rails::Application"
42 # 4) Run config.before_configuration callbacks
43 # 5) Load config/environments/ENV.rb
44 # 6) Run config.before_initialize callbacks
45 # 7) Run Railtie#initializer defined by railties, engines and application.
11aa167 José Valim Revert "Provide a unique point for running initializers."
josevalim authored
46 # One by one, each engine sets up its load paths, routes and runs its config/initializers/* files.
47 # 9) Custom Railtie#initializers added by railties, engines and applications are executed
48 # 10) Build the middleware stack and run to_prepare callbacks
49 # 11) Run config.before_eager_load and eager_load if cache classes is true
50 # 12) Run config.after_initialize callbacks
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
51 #
7fcf859 José Valim Massive cleanup in Railties and load stack.
josevalim authored
52 class Application < Engine
4f03603 José Valim Break application.rb file in smaller chunks.
josevalim authored
53 autoload :Bootstrap, 'rails/application/bootstrap'
b17e358 José Valim Move configuration to subfolders.
josevalim authored
54 autoload :Configuration, 'rails/application/configuration'
4f03603 José Valim Break application.rb file in smaller chunks.
josevalim authored
55 autoload :Finisher, 'rails/application/finisher'
13d66cd José Valim Extract Railtie load from application.
josevalim authored
56 autoload :Railties, 'rails/application/railties'
3049e64 Piotr Sarnacki Moved Rails::RoutesReloader to Rails::Application::RoutesReloader
drogus authored
57 autoload :RoutesReloader, 'rails/application/routes_reloader'
80130d1 José Valim Extract routes reloading responsibilities from application and load them...
josevalim authored
58
e4d7e50 Moving more initializers into the application object
Carl Lerche authored
59 class << self
7fcf859 José Valim Massive cleanup in Railties and load stack.
josevalim authored
60 def inherited(base)
2fde9d7 José Valim Solve some pendencies.
josevalim authored
61 raise "You cannot have more than one Rails::Application" if Rails.application
7fcf859 José Valim Massive cleanup in Railties and load stack.
josevalim authored
62 super
788fce2 José Valim Create configurable modules and ensure that they are added only on direc...
josevalim authored
63 Rails.application = base.instance
6f83a50 Xavier Noria renames load_(once_)paths to autoload_(once_)paths in dependencies and c...
fxn authored
64 Rails.application.add_lib_to_load_path!
9cfeefb Yehuda Katz Reorganized initializers a bit to enable better hooks for common cases w...
wycats authored
65 ActiveSupport.run_load_hooks(:before_configuration, base.instance)
e4d7e50 Moving more initializers into the application object
Carl Lerche authored
66 end
897164d Conceptually unify instance & global initializers
Yehuda Katz + Carl Lerche authored
67 end
6f6a589 Create the application object from config/environment.rb
Yehuda Katz + Carl Lerche authored
68
adff4a7 Yehuda Katz Initial queue implementation
wycats authored
69 attr_accessor :assets, :sandbox, :queue
52e01fc José Valim Everyone receives app as argument for consistency.
josevalim authored
70 alias_method :sandbox?, :sandbox
fa1d9a8 José Valim Speed up development by only reloading classes if dependencies files cha...
josevalim authored
71 attr_reader :reloaders
52e01fc José Valim Everyone receives app as argument for consistency.
josevalim authored
72
eedbf87 Piotr Sarnacki New way of generating urls for Application from Engine.
drogus authored
73 delegate :default_url_options, :default_url_options=, :to => :routes
74
44f0709 Aaron Patterson dealing with some -w warnings on startup
tenderlove authored
75 def initialize
76 super
77 @initialized = false
fa1d9a8 José Valim Speed up development by only reloading classes if dependencies files cha...
josevalim authored
78 @reloaders = []
44f0709 Aaron Patterson dealing with some -w warnings on startup
tenderlove authored
79 end
80
9e081ca José Valim Improve documentation for add_lib_to_load_paths!
josevalim authored
81 # This method is called just after an application inherits from Rails::Application,
82 # allowing the developer to load classes in lib and use them during application
83 # configuration.
84 #
85 # class MyApplication < Rails::Application
86 # require "my_backend" # in lib/my_backend
87 # config.i18n.backend = MyBackend
88 # end
89 #
90 # Notice this method takes into consideration the default root path. So if you
91 # are changing config.root inside your application definition or having a custom
92 # Rails application, you will need to add lib to $LOAD_PATH on your own in case
93 # you need to load files in lib/ during the application configuration as well.
6f83a50 Xavier Noria renames load_(once_)paths to autoload_(once_)paths in dependencies and c...
fxn authored
94 def add_lib_to_load_path! #:nodoc:
5a0d73f José Valim Add lib to load paths when application is inherited to be able to load l...
josevalim authored
95 path = config.root.join('lib').to_s
96 $LOAD_PATH.unshift(path) if File.exists?(path)
97 end
98
9e081ca José Valim Improve documentation for add_lib_to_load_paths!
josevalim authored
99 def require_environment! #:nodoc:
d649bf1 José Valim Provide a cleaner syntax for paths configuration that does not rely on m...
josevalim authored
100 environment = paths["config/environment"].existent.first
13d66cd José Valim Extract Railtie load from application.
josevalim authored
101 require environment if environment
d982fe2 Replace reopening the class with App.configure as an alias to class_eval
Carlhuda authored
102 end
103
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
104 # Reload application routes regardless if they changed or not.
7b0c592 José Valim reload_routes! is part of the public API and should not be removed.
josevalim authored
105 def reload_routes!
106 routes_reloader.reload!
107 end
108
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
109 def routes_reloader #:nodoc:
3049e64 Piotr Sarnacki Moved Rails::RoutesReloader to Rails::Application::RoutesReloader
drogus authored
110 @routes_reloader ||= RoutesReloader.new
80130d1 José Valim Extract routes reloading responsibilities from application and load them...
josevalim authored
111 end
5f8e48c Joshua Peek Move route reloading into railties
josh authored
112
fa1d9a8 José Valim Speed up development by only reloading classes if dependencies files cha...
josevalim authored
113 # Returns an array of file paths appended with a hash of directories-extensions
114 # suitable for ActiveSupport::FileUpdateChecker API.
115 def watchable_args
516f102 Nathan Broadbent Refactored watchable_args and build_original_fullpath methods in railtie...
ndbroadbent authored
116 files, dirs = config.watchable_files.dup, config.watchable_dirs.dup
fa1d9a8 José Valim Speed up development by only reloading classes if dependencies files cha...
josevalim authored
117
118 ActiveSupport::Dependencies.autoload_paths.each do |path|
119 dirs[path.to_s] = [:rb]
120 end
121
80256ab José Valim FileUpdateChecker should be able to handle deleted files.
josevalim authored
122 [files, dirs]
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
123 end
124
125 # Initialize the application passing the given group. By default, the
126 # group is :default but sprockets precompilation passes group equals
127 # to assets if initialize_on_precompile is false to avoid booting the
128 # whole app.
129 def initialize!(group=:default) #:nodoc:
abeb0ff Piotr Sarnacki Ensure that Rails.application.initialize! is called only once
drogus authored
130 raise "Application has been already initialized." if @initialized
eb367af José Valim `rake assets:precompile` loads the application but does not initialize i...
josevalim authored
131 run_initializers(group, self)
abeb0ff Piotr Sarnacki Ensure that Rails.application.initialize! is called only once
drogus authored
132 @initialized = true
80130d1 José Valim Extract routes reloading responsibilities from application and load them...
josevalim authored
133 self
5f8e48c Joshua Peek Move route reloading into railties
josh authored
134 end
135
4882271 Franck Verrot Rails.initialized? can be called at any time without raising an exceptio...
franckverrot authored
136 def initialized?
137 @initialized
138 end
139
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
140 # Load the application and its railties tasks and invoke the registered hooks.
141 # Check <tt>Rails::Railtie.rake_tasks</tt> for more info.
52e01fc José Valim Everyone receives app as argument for consistency.
josevalim authored
142 def load_tasks(app=self)
788fce2 José Valim Create configurable modules and ensure that they are added only on direc...
josevalim authored
143 initialize_tasks
e461e1b José Valim Ensure application rake tasks and generators are loaded after the ones s...
josevalim authored
144 super
13d66cd José Valim Extract Railtie load from application.
josevalim authored
145 self
94bb331 Jeremy Kemper Shift more responsibility from application class to its singleton instan...
jeremy authored
146 end
147
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
148 # Load the application console and invoke the registered hooks.
149 # Check <tt>Rails::Railtie.console</tt> for more info.
52e01fc José Valim Everyone receives app as argument for consistency.
josevalim authored
150 def load_console(app=self)
594b749 José Valim Streamline generators initialization flow.
josevalim authored
151 initialize_console
52e01fc José Valim Everyone receives app as argument for consistency.
josevalim authored
152 super
fa98eca José Valim Add console hook to force ActiveRecord::Base to be loaded when console s...
josevalim authored
153 self
154 end
155
cd2c31a Vijay Dev A few doc changes
vijaydev authored
156 # Stores some of the Rails initial environment parameters which
157 # will be used by middlewares and engines to configure themselves.
a132229 Piotr Sarnacki Added ability to set asset_path for engines
drogus authored
158 def env_config
159 @env_config ||= super.merge({
6690d66 José Valim Rename config.cookie_secret to config.secret_token and pass it as config...
josevalim authored
160 "action_dispatch.parameter_filter" => config.filter_parameters,
a132229 Piotr Sarnacki Added ability to set asset_path for engines
drogus authored
161 "action_dispatch.secret_token" => config.secret_token,
cd9d28d Sergey Nartimov middlewares should use logger from env
lest authored
162 "action_dispatch.show_exceptions" => config.action_dispatch.show_exceptions,
26e7400 José Valim Fix diagnostics page for routing errors.
josevalim authored
163 "action_dispatch.show_detailed_exceptions" => config.consider_all_requests_local,
fe7d4f0 Sergey Nartimov put backtrace_cleaner to env
lest authored
164 "action_dispatch.logger" => Rails.logger,
165 "action_dispatch.backtrace_cleaner" => Rails.backtrace_cleaner
a132229 Piotr Sarnacki Added ability to set asset_path for engines
drogus authored
166 })
6d6ae08 Start moving the initializers into the application object
Carl Lerche authored
167 end
168
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
169 # Returns the ordered railties for this application considering railties_order.
170 def ordered_railties #:nodoc:
40b19e0 Piotr Sarnacki Allow to change engine's loading priority with config.railties_order=
drogus authored
171 @ordered_railties ||= begin
172 order = config.railties_order.map do |railtie|
173 if railtie == :main_app
174 self
175 elsif railtie.respond_to?(:instance)
176 railtie.instance
177 else
178 railtie
179 end
180 end
181
182 all = (railties.all - order)
183 all.push(self) unless all.include?(self)
184 order.push(:all) unless order.include?(:all)
185
186 index = order.index(:all)
187 order[index] = all
188 order.reverse.flatten
189 end
190 end
191
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
192 def initializers #:nodoc:
e9793c6 Santiago Pastorino Makes this code a bit more clear
spastorino authored
193 Bootstrap.initializers_for(self) +
194 super +
195 Finisher.initializers_for(self)
98240c4 José Valim Get rid of initializers global and create i18n railtie.
josevalim authored
196 end
788fce2 José Valim Create configurable modules and ensure that they are added only on direc...
josevalim authored
197
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
198 def config #:nodoc:
32a5b49 Piotr Sarnacki Move singleton pattern to Railtie and remove Engine::Configurable and Ap...
drogus authored
199 @config ||= Application::Configuration.new(find_root_with_flag("config.ru", Dir.pwd))
200 end
201
adff4a7 Yehuda Katz Initial queue implementation
wycats authored
202 def queue #:nodoc:
203 @queue ||= config.queue.new
204 end
205
8496be7 Guillermo Iguaran Fixing Rails::Server#app under Rack::URLMap
guilleiguaran authored
206 def to_app
207 self
208 end
209
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
210 def helpers_paths #:nodoc:
fd86a1b José Valim Rely on a public contract between railties instead of accessing railtie ...
josevalim authored
211 config.helpers_paths
212 end
213
482ec2a Piotr Sarnacki Add ORIGINAL_FULLPATH to env
drogus authored
214 def call(env)
215 env["ORIGINAL_FULLPATH"] = build_original_fullpath(env)
216 super(env)
217 end
218
2fe70c1 José Valim Booya, sprockets now works from Engines.
josevalim authored
219 protected
220
221 alias :build_middleware_stack :app
612454e Joshua Peek Move sprockets initializers back to application
josh authored
222
fa1d9a8 José Valim Speed up development by only reloading classes if dependencies files cha...
josevalim authored
223 def reload_dependencies?
224 config.reload_classes_only_on_change != true || reloaders.map(&:updated?).any?
225 end
226
19d8c8c José Valim Remove the laziness from the middleware stack.
josevalim authored
227 def default_middleware_stack
228 ActionDispatch::MiddlewareStack.new.tap do |middleware|
2c0c4d7 Prem Sichanugrist Add `config.force_ssl` configuration which will load `Rack::SSL` middlew...
sikachu authored
229 if rack_cache = config.action_controller.perform_caching && config.action_dispatch.rack_cache
230 require "action_dispatch/http/rack_cache"
231 middleware.use ::Rack::Cache, rack_cache
232 end
254ab7d Yehuda Katz First pass at Rack::Cache
wycats authored
233
2c0c4d7 Prem Sichanugrist Add `config.force_ssl` configuration which will load `Rack::SSL` middlew...
sikachu authored
234 if config.force_ssl
9ec63eb Rafael Mendonça França Rack::SSL -> ActionDispatch::SSL
rafaelfranca authored
235 middleware.use ::ActionDispatch::SSL, config.ssl_options
2c0c4d7 Prem Sichanugrist Add `config.force_ssl` configuration which will load `Rack::SSL` middlew...
sikachu authored
236 end
eeb3246 Only add Rack::Cache to the middleware stack if config.action_controller...
Sparky authored
237
55dd060 Piotr Sarnacki Handle files from ActionDispatch::Static with Rack::Sendfile (fixes #522...
drogus authored
238 if config.action_dispatch.x_sendfile_header.present?
239 middleware.use ::Rack::Sendfile, config.action_dispatch.x_sendfile_header
240 end
241
e6369bc Piotr Sarnacki Application's assets should have higher priority than engine's ones
drogus authored
242 if config.serve_static_assets
1ca8123 José Valim Add static_cache_control as configuration option and set a default for t...
josevalim authored
243 middleware.use ::ActionDispatch::Static, paths["public"].first, config.static_cache_control
e6369bc Piotr Sarnacki Application's assets should have higher priority than engine's ones
drogus authored
244 end
2c0c4d7 Prem Sichanugrist Add `config.force_ssl` configuration which will load `Rack::SSL` middlew...
sikachu authored
245
ea14396 Neeraj Singh replace if ! with unless
neerajdotname authored
246 middleware.use ::Rack::Lock unless config.allow_concurrency
19d8c8c José Valim Remove the laziness from the middleware stack.
josevalim authored
247 middleware.use ::Rack::Runtime
e1824c5 José Valim Remove remaining http_only? calls.
josevalim authored
248 middleware.use ::Rack::MethodOverride
afde6fd David Heinemeier Hansson Added X-Request-Id tracking and TaggedLogging to easily log that and oth...
dhh authored
249 middleware.use ::ActionDispatch::RequestId
c83d9a1 José Valim Unify logger and taggedlogging middleware as both address logging concer...
josevalim authored
250 middleware.use ::Rails::Rack::Logger, config.log_tags # must come after Rack::MethodOverride to properly log overridden methods
02127e6 José Valim Allow a custom exceptions app to set.
josevalim authored
251 middleware.use ::ActionDispatch::ShowExceptions, config.exceptions_app || ActionDispatch::PublicExceptions.new(Rails.public_path)
750bb5c José Valim Split ShowExceptions responsibilities in two middlewares.
josevalim authored
252 middleware.use ::ActionDispatch::DebugExceptions
19d8c8c José Valim Remove the laziness from the middleware stack.
josevalim authored
253 middleware.use ::ActionDispatch::RemoteIp, config.action_dispatch.ip_spoofing_check, config.action_dispatch.trusted_proxies
750bb5c José Valim Split ShowExceptions responsibilities in two middlewares.
josevalim authored
254
fa1d9a8 José Valim Speed up development by only reloading classes if dependencies files cha...
josevalim authored
255 unless config.cache_classes
256 app = self
257 middleware.use ::ActionDispatch::Reloader, lambda { app.reload_dependencies? }
258 end
259
435bccd Replace AD::Callbacks.to_prepare with AD::Reloader.to_prepare
John Firebaugh authored
260 middleware.use ::ActionDispatch::Callbacks
e1824c5 José Valim Remove remaining http_only? calls.
josevalim authored
261 middleware.use ::ActionDispatch::Cookies
19d8c8c José Valim Remove the laziness from the middleware stack.
josevalim authored
262
e1824c5 José Valim Remove remaining http_only? calls.
josevalim authored
263 if config.session_store
d6933a1 José Valim config.force_ssl should mark the session as secure.
josevalim authored
264 if config.force_ssl && !config.session_options.key?(:secure)
265 config.session_options[:secure] = true
266 end
19d8c8c José Valim Remove the laziness from the middleware stack.
josevalim authored
267 middleware.use config.session_store, config.session_options
268 middleware.use ::ActionDispatch::Flash
269 end
270
271 middleware.use ::ActionDispatch::ParamsParser
272 middleware.use ::ActionDispatch::Head
74dd8a3 José Valim Move ETag and ConditionalGet logic from AD::Response to the middleware s...
josevalim authored
273 middleware.use ::Rack::ConditionalGet
274 middleware.use ::Rack::ETag, "no-cache"
2c0c4d7 Prem Sichanugrist Add `config.force_ssl` configuration which will load `Rack::SSL` middlew...
sikachu authored
275
e1824c5 José Valim Remove remaining http_only? calls.
josevalim authored
276 if config.action_dispatch.best_standards_support
2c0c4d7 Prem Sichanugrist Add `config.force_ssl` configuration which will load `Rack::SSL` middlew...
sikachu authored
277 middleware.use ::ActionDispatch::BestStandardsSupport, config.action_dispatch.best_standards_support
278 end
19d8c8c José Valim Remove the laziness from the middleware stack.
josevalim authored
279 end
280 end
281
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
282 def initialize_tasks #:nodoc:
e290835 Patrick Quinn Make Rake::DSL methods available within Railtie rake_tasks block
bilts authored
283 self.class.rake_tasks do
284 require "rails/tasks"
285 task :environment do
286 $rails_rake_task = true
287 require_environment!
288 end
788fce2 José Valim Create configurable modules and ensure that they are added only on direc...
josevalim authored
289 end
290 end
291
27f0add José Valim Improve docs for Rails::Application and add routes_reloader_hook and app...
josevalim authored
292 def initialize_console #:nodoc:
d54c778 Akira Matsuda always enable `pp` on the Rails console
amatsuda authored
293 require "pp"
fa98eca José Valim Add console hook to force ActiveRecord::Base to be loaded when console s...
josevalim authored
294 require "rails/console/app"
295 require "rails/console/helpers"
296 end
482ec2a Piotr Sarnacki Add ORIGINAL_FULLPATH to env
drogus authored
297
298 def build_original_fullpath(env)
2d62334 Nathan Broadbent Reverted build_original_fullpath method, as per discussion at https://gi...
ndbroadbent authored
299 path_info = env["PATH_INFO"]
300 query_string = env["QUERY_STRING"]
301 script_name = env["SCRIPT_NAME"]
302
303 if query_string.present?
304 "#{script_name}#{path_info}?#{query_string}"
305 else
306 "#{script_name}#{path_info}"
307 end
482ec2a Piotr Sarnacki Add ORIGINAL_FULLPATH to env
drogus authored
308 end
accd9b4 Joshua Peek Restore "Start Rails::Application object
josh authored
309 end
17a91a6 David Lee Logs should show overridden method; Issue 426
dlee authored
310 end
Something went wrong with that request. Please try again.