Add config.file_watcher so developers can provide their own watchers (for instance, hooking on fsevents).

This commit is contained in:
José Valim
2011-12-13 09:19:58 +01:00
parent 148d15d824
commit cd3033eb62
4 changed files with 87 additions and 8 deletions

View File

@@ -82,6 +82,8 @@ NOTE. The +config.asset_path+ configuration is ignored if the asset pipeline is
* +config.encoding+ sets up the application-wide encoding. Defaults to UTF-8.
* +config.file_watcher+ the class used to detect file updates in the filesystem when +config.reload_classes_only_on_change+ is true. Must conform to +ActiveSupport::FileUpdateChecker+ API.
* +config.filter_parameters+ used for filtering out the parameters that you don't want shown in the logs, such as passwords or credit card numbers.
* +config.force_ssl+ forces all requests to be under HTTPS protocol by using +Rack::SSL+ middleware.
@@ -98,7 +100,7 @@ NOTE. The +config.asset_path+ configuration is ignored if the asset pipeline is
* +config.preload_frameworks+ enables or disables preloading all frameworks at startup. Enabled by +config.threadsafe!+. Defaults to +nil+, so is disabled.
* +config.reload_classes_only_on_change+ enables or disables reloading of classes only when tracked files change. By default tracks everything on autoload paths and is set to true.
* +config.reload_classes_only_on_change+ enables or disables reloading of classes only when tracked files change. By default tracks everything on autoload paths and is set to true. If +config.cache_classes+ is true, this option is ignored.
* +config.reload_plugins+ enables or disables plugin reloading. Defaults to false.

View File

@@ -1,5 +1,4 @@
require 'active_support/core_ext/hash/reverse_merge'
require 'active_support/file_update_checker'
require 'fileutils'
require 'rails/plugin'
require 'rails/engine'
@@ -135,7 +134,7 @@ module Rails
end
if config.reload_classes_only_on_change
reloader = ActiveSupport::FileUpdateChecker.new(watchable_args, true, &callback)
reloader = config.file_watcher.new(watchable_args, true, &callback)
self.reloaders << reloader
# We need to set a to_prepare callback regardless of the reloader result, i.e.
# models should be reloaded if any of the reloaders (i18n, routes) were updated.

View File

@@ -1,5 +1,6 @@
require 'active_support/core_ext/string/encoding'
require 'active_support/core_ext/kernel/reporting'
require 'active_support/file_update_checker'
require 'rails/engine/configuration'
module Rails
@@ -7,8 +8,8 @@ module Rails
class Configuration < ::Rails::Engine::Configuration
attr_accessor :allow_concurrency, :asset_host, :asset_path, :assets,
:cache_classes, :cache_store, :consider_all_requests_local,
:dependency_loading, :filter_parameters, :force_ssl, :helpers_paths,
:logger, :log_tags, :preload_frameworks,
:dependency_loading, :file_watcher, :filter_parameters,
:force_ssl, :helpers_paths, :logger, :log_tags, :preload_frameworks,
:railties_order, :relative_url_root, :reload_plugins, :secret_token,
:serve_static_assets, :ssl_options, :static_cache_control, :session_options,
:time_zone, :reload_classes_only_on_change, :whiny_nils
@@ -38,6 +39,7 @@ module Rails
@railties_order = [:all]
@relative_url_root = ENV["RAILS_RELATIVE_URL_ROOT"]
@reload_classes_only_on_change = true
@file_watcher = ActiveSupport::FileUpdateChecker
@assets = ActiveSupport::OrderedOptions.new
@assets.enabled = false

View File

@@ -16,7 +16,7 @@ class LoadingTest < Test::Unit::TestCase
@app ||= Rails.application
end
def test_constants_in_app_are_autoloaded
test "constants in app are autoloaded" do
app_file "app/models/post.rb", <<-MODEL
class Post < ActiveRecord::Base
validates_acceptance_of :title, :accept => "omg"
@@ -33,7 +33,7 @@ class LoadingTest < Test::Unit::TestCase
assert_equal 'omg', p.title
end
def test_models_without_table_do_not_panic_on_scope_definitions_when_loaded
test "models without table do not panic on scope definitions when loaded" do
app_file "app/models/user.rb", <<-MODEL
class User < ActiveRecord::Base
default_scope where(:published => true)
@@ -63,7 +63,7 @@ class LoadingTest < Test::Unit::TestCase
assert ::AppTemplate::Application.config.loaded
end
def test_descendants_are_cleaned_on_each_request_without_cache_classes
test "descendants are cleaned on each request without cache classes" do
add_to_config <<-RUBY
config.cache_classes = false
config.reload_classes_only_on_change = false
@@ -99,6 +99,82 @@ class LoadingTest < Test::Unit::TestCase
assert_raise(RuntimeError) { ::AppTemplate::Application.initialize! }
end
test "reload constants on development" do
add_to_config <<-RUBY
config.cache_classes = false
RUBY
app_file 'config/routes.rb', <<-RUBY
AppTemplate::Application.routes.draw do
match '/c', :to => lambda { |env| [200, {"Content-Type" => "text/plain"}, [User.counter.to_s]] }
end
RUBY
app_file "app/models/user.rb", <<-MODEL
class User
def self.counter; 1; end
end
MODEL
require 'rack/test'
extend Rack::Test::Methods
require "#{rails_root}/config/environment"
sleep(1)
get "/c"
assert_equal "1", last_response.body
app_file "app/models/user.rb", <<-MODEL
class User
def self.counter; 2; end
end
MODEL
get "/c"
assert_equal "2", last_response.body
end
test "does not reload constants on development if custom file watcher always returns false" do
add_to_config <<-RUBY
config.cache_classes = false
config.file_watcher = Class.new do
def initialize(*); end
def updated?; false; end
end
RUBY
app_file 'config/routes.rb', <<-RUBY
AppTemplate::Application.routes.draw do
match '/c', :to => lambda { |env| [200, {"Content-Type" => "text/plain"}, [User.counter.to_s]] }
end
RUBY
app_file "app/models/user.rb", <<-MODEL
class User
def self.counter; 1; end
end
MODEL
require 'rack/test'
extend Rack::Test::Methods
require "#{rails_root}/config/environment"
sleep(1)
get "/c"
assert_equal "1", last_response.body
app_file "app/models/user.rb", <<-MODEL
class User
def self.counter; 2; end
end
MODEL
get "/c"
assert_equal "1", last_response.body
end
protected
def setup_ar!