From fa1d9a884c0d5b70c97442e3360ac98ca5fa4340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 12 Dec 2011 22:51:33 +0100 Subject: Speed up development by only reloading classes if dependencies files changed. This can be turned off by setting `config.reload_classes_only_on_change` to false. Extensions like Active Record should add their respective files like db/schema.rb and db/structure.sql to `config.watchable_files` if they want their changes to affect classes reloading. Thanks to https://github.com/paneq/active_reload and Pastorino for the inspiration. <3 --- .../lib/active_support/file_update_checker.rb | 43 +++++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) (limited to 'activesupport/lib/active_support/file_update_checker.rb') diff --git a/activesupport/lib/active_support/file_update_checker.rb b/activesupport/lib/active_support/file_update_checker.rb index 77bc5388d6..4137bbf6a0 100644 --- a/activesupport/lib/active_support/file_update_checker.rb +++ b/activesupport/lib/active_support/file_update_checker.rb @@ -39,30 +39,53 @@ module ActiveSupport @paths = paths @glob = compile_glob(@paths.extract_options!) @block = block + @updated_at = nil @last_update_at = calculate ? updated_at : nil end - def updated_at - all = [] - all.concat @paths - all.concat Dir[@glob] if @glob - all.map { |path| File.mtime(path) }.max + # Check if any of the entries were updated. If so, the updated_at + # value is cached until flush! is called. + def updated? + current_updated_at = updated_at + if @last_update_at != current_updated_at + @updated_at = updated_at + true + else + false + end end + # Flush the cache so updated? is calculated again + def flush! + @updated_at = nil + end + + # Execute the block given if updated. This call + # always flush the cache. def execute_if_updated - current_update_at = self.updated_at - if @last_update_at != current_update_at - @last_update_at = current_update_at + if updated? + @last_update_at = updated_at @block.call true else false end + ensure + flush! end private - def compile_glob(hash) + def updated_at #:nodoc: + @updated_at || begin + all = [] + all.concat @paths + all.concat Dir[@glob] if @glob + all.map { |path| File.mtime(path) }.max + end + end + + def compile_glob(hash) #:nodoc: return if hash.empty? globs = [] hash.each do |key, value| @@ -71,7 +94,7 @@ module ActiveSupport "{#{globs.join(",")}}" end - def compile_ext(array) + def compile_ext(array) #:nodoc: array = Array.wrap(array) return if array.empty? ".{#{array.join(",")}}" -- cgit v1.2.3