aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/file_watcher.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/file_watcher.rb')
-rw-r--r--activesupport/lib/active_support/file_watcher.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/file_watcher.rb b/activesupport/lib/active_support/file_watcher.rb
new file mode 100644
index 0000000000..046a5a0309
--- /dev/null
+++ b/activesupport/lib/active_support/file_watcher.rb
@@ -0,0 +1,41 @@
+module ActiveSupport
+ class FileWatcher
+ class Backend
+ def initialize(path, watcher)
+ @watcher = watcher
+ @path = path
+ end
+
+ def trigger(files)
+ @watcher.trigger(files)
+ end
+ end
+
+ def initialize
+ @regex_matchers = {}
+ end
+
+ def watch(path, &block)
+ return watch_regex(path, &block) if path.is_a?(Regexp)
+ raise "Paths must be regular expressions. #{path.inspect} is a #{path.class}"
+ end
+
+ def watch_regex(regex, &block)
+ @regex_matchers[regex] = block
+ end
+
+ def trigger(files)
+ trigger_files = Hash.new { |h,k| h[k] = Hash.new { |h2,k2| h2[k2] = [] } }
+
+ files.each do |file, state|
+ @regex_matchers.each do |regex, block|
+ trigger_files[block][state] << file if file =~ regex
+ end
+ end
+
+ trigger_files.each do |block, payload|
+ block.call payload
+ end
+ end
+ end
+end