mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
39d6f9e112
add lazy_load_hooks.rb, which allows us to declare code that should be run at some later time. For instance, this allows us to defer requiring ActiveRecord::Base at boot time purely to apply configuration. Instead, we register a hook that should apply configuration once ActiveRecord::Base is loaded. With these changes, brings down total boot time of a new app to 300ms in production and 400ms in dev. TODO: rename base_hook
46 lines
No EOL
1,020 B
Ruby
46 lines
No EOL
1,020 B
Ruby
module Rails
|
|
class Application
|
|
class RoutesReloader
|
|
attr_reader :paths
|
|
|
|
def initialize
|
|
@paths, @last_change_at = [], nil
|
|
end
|
|
|
|
def changed_at
|
|
routes_changed_at = nil
|
|
|
|
paths.each do |path|
|
|
config_changed_at = File.stat(path).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 = Rails::Application.routes
|
|
routes.disable_clear_and_finalize = true
|
|
|
|
routes.clear!
|
|
paths.each { |path| load(path) }
|
|
ActionController.base_hook { routes.finalize! }
|
|
|
|
nil
|
|
ensure
|
|
routes.disable_clear_and_finalize = false
|
|
end
|
|
|
|
def reload_if_changed
|
|
current_change_at = changed_at
|
|
if @last_change_at != current_change_at
|
|
@last_change_at = current_change_at
|
|
reload!
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end |