2009-12-23 01:03:23 +00:00
|
|
|
require "fileutils"
|
|
|
|
|
2009-09-26 02:32:28 +00:00
|
|
|
module Rails
|
2010-01-21 22:14:20 +00:00
|
|
|
class Application < Engine
|
2009-11-03 01:19:03 +00:00
|
|
|
include Initializable
|
2009-10-07 22:21:19 +00:00
|
|
|
|
2009-10-08 19:14:57 +00:00
|
|
|
class << self
|
2010-01-21 22:14:20 +00:00
|
|
|
alias :configure :class_eval
|
|
|
|
delegate :initialize!, :load_tasks, :load_generators, :to => :instance
|
2009-10-16 23:58:35 +00:00
|
|
|
|
2009-12-24 01:11:17 +00:00
|
|
|
private :new
|
|
|
|
def instance
|
|
|
|
@instance ||= new
|
2009-11-03 01:19:03 +00:00
|
|
|
end
|
|
|
|
|
2009-10-08 19:14:57 +00:00
|
|
|
def config
|
2010-01-21 22:14:20 +00:00
|
|
|
@config ||= Configuration.new(root)
|
|
|
|
end
|
|
|
|
|
|
|
|
def root
|
|
|
|
@root ||= find_root_with_file_flag("config.ru", Dir.pwd)
|
|
|
|
end
|
|
|
|
|
|
|
|
def inherited(base)
|
|
|
|
super
|
|
|
|
Railtie.plugins.delete(base)
|
2009-10-08 19:14:57 +00:00
|
|
|
end
|
2009-09-29 00:57:36 +00:00
|
|
|
|
2009-12-22 02:15:27 +00:00
|
|
|
def routes
|
|
|
|
ActionController::Routing::Routes
|
|
|
|
end
|
2009-11-03 01:19:03 +00:00
|
|
|
end
|
2009-09-29 00:57:36 +00:00
|
|
|
|
2010-01-21 22:14:20 +00:00
|
|
|
delegate :routes, :to => :'self.class'
|
2009-12-14 23:54:41 +00:00
|
|
|
attr_reader :route_configuration_files
|
|
|
|
|
2009-11-03 01:19:03 +00:00
|
|
|
def initialize
|
2009-12-24 01:11:17 +00:00
|
|
|
require_environment
|
2009-11-24 21:03:24 +00:00
|
|
|
Rails.application ||= self
|
2009-12-14 23:54:41 +00:00
|
|
|
@route_configuration_files = []
|
2009-12-22 00:35:54 +00:00
|
|
|
end
|
|
|
|
|
2009-12-24 01:11:17 +00:00
|
|
|
def initialize!
|
|
|
|
run_initializers(self)
|
|
|
|
self
|
2009-11-03 01:19:03 +00:00
|
|
|
end
|
2010-01-21 22:14:20 +00:00
|
|
|
|
2009-12-14 23:54:41 +00:00
|
|
|
def routes_changed_at
|
|
|
|
routes_changed_at = nil
|
|
|
|
|
|
|
|
route_configuration_files.each do |config|
|
|
|
|
config_changed_at = File.stat(config).mtime
|
|
|
|
|
|
|
|
if routes_changed_at.nil? || config_changed_at > routes_changed_at
|
|
|
|
routes_changed_at = config_changed_at
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
routes_changed_at
|
|
|
|
end
|
|
|
|
|
|
|
|
def reload_routes!
|
2010-01-21 22:14:20 +00:00
|
|
|
routes = Rails::Application.routes
|
2009-12-14 23:54:41 +00:00
|
|
|
routes.disable_clear_and_finalize = true
|
|
|
|
|
|
|
|
routes.clear!
|
|
|
|
route_configuration_files.each { |config| load(config) }
|
|
|
|
routes.finalize!
|
|
|
|
|
|
|
|
nil
|
|
|
|
ensure
|
|
|
|
routes.disable_clear_and_finalize = false
|
|
|
|
end
|
|
|
|
|
2010-01-21 22:14:20 +00:00
|
|
|
|
|
|
|
def require_environment
|
|
|
|
require config.environment_path
|
|
|
|
rescue LoadError
|
|
|
|
end
|
|
|
|
|
2009-12-24 01:11:17 +00:00
|
|
|
def load_tasks
|
|
|
|
require "rails/tasks"
|
2009-12-27 22:18:07 +00:00
|
|
|
plugins.each { |p| p.load_tasks }
|
2009-12-29 00:21:48 +00:00
|
|
|
# Load all application tasks
|
|
|
|
# TODO: extract out the path to the rake tasks
|
2009-12-24 01:11:17 +00:00
|
|
|
Dir["#{root}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
|
|
|
|
task :environment do
|
|
|
|
$rails_rake_task = true
|
|
|
|
initialize!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-01-19 17:43:09 +00:00
|
|
|
def load_generators
|
|
|
|
plugins.each { |p| p.load_generators }
|
|
|
|
end
|
|
|
|
|
2009-11-07 01:21:39 +00:00
|
|
|
def initializers
|
2010-01-07 20:00:35 +00:00
|
|
|
initializers = Bootstrap.new(self).initializers
|
2009-11-07 01:21:39 +00:00
|
|
|
plugins.each { |p| initializers += p.initializers }
|
2010-01-07 20:00:35 +00:00
|
|
|
initializers += super
|
2009-11-07 01:21:39 +00:00
|
|
|
initializers
|
|
|
|
end
|
|
|
|
|
2010-01-17 06:21:35 +00:00
|
|
|
# TODO: Fix this method. It loads all railties independent if :all is given
|
|
|
|
# or not, otherwise frameworks are never loaded.
|
2009-11-07 01:21:39 +00:00
|
|
|
def plugins
|
|
|
|
@plugins ||= begin
|
2010-01-06 05:37:40 +00:00
|
|
|
plugin_names = (config.plugins || [:all]).map { |p| p.to_sym }
|
2010-01-17 06:21:35 +00:00
|
|
|
Railtie.plugins.map(&:new) + Plugin.all(plugin_names, config.paths.vendor.plugins)
|
2009-11-07 01:21:39 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-01-16 22:14:35 +00:00
|
|
|
def app
|
|
|
|
@app ||= begin
|
|
|
|
reload_routes!
|
|
|
|
middleware.build(routes)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2009-11-03 01:19:03 +00:00
|
|
|
def call(env)
|
2010-01-21 15:50:11 +00:00
|
|
|
env["action_dispatch.parameter_filter"] = config.filter_parameters
|
2010-01-16 22:14:35 +00:00
|
|
|
app.call(env)
|
2009-10-07 22:21:19 +00:00
|
|
|
end
|
|
|
|
|
2010-01-21 22:14:20 +00:00
|
|
|
initializer :build_middleware_stack, :after => :load_application_initializers do
|
|
|
|
app
|
2009-10-09 01:12:28 +00:00
|
|
|
end
|
|
|
|
|
2010-01-21 22:14:20 +00:00
|
|
|
initializer :add_builtin_route do |app|
|
|
|
|
if Rails.env.development?
|
|
|
|
app.route_configuration_files << File.join(RAILTIES_PATH, 'builtin', 'routes.rb')
|
|
|
|
end
|
2010-01-16 22:14:35 +00:00
|
|
|
end
|
|
|
|
|
2009-10-09 01:12:28 +00:00
|
|
|
# Fires the user-supplied after_initialize block (Configuration#after_initialize)
|
2010-01-21 22:14:20 +00:00
|
|
|
initializer :after_initialize, :after => :build_middleware_stack do
|
2009-12-24 01:11:17 +00:00
|
|
|
config.after_initialize_blocks.each do |block|
|
2009-10-17 21:38:21 +00:00
|
|
|
block.call
|
2009-10-09 01:12:28 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Disable dependency loading during request cycle
|
|
|
|
initializer :disable_dependency_loading do
|
2009-12-24 01:11:17 +00:00
|
|
|
if config.cache_classes && !config.dependency_loading
|
2009-10-09 01:12:28 +00:00
|
|
|
ActiveSupport::Dependencies.unhook!
|
|
|
|
end
|
|
|
|
end
|
2009-09-26 02:32:28 +00:00
|
|
|
end
|
|
|
|
end
|