aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/vendor/rack-1.0/rack/reloader.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-04-22 15:26:03 +0100
committerPratik Naik <pratiknaik@gmail.com>2009-04-22 15:26:03 +0100
commit5f3f100ce2d689480da85abc88e5e940cf90189e (patch)
tree15c1a05a5308a9eea56d7f0889ac46d9cac5b57c /actionpack/lib/action_dispatch/vendor/rack-1.0/rack/reloader.rb
parentd758d996d1b66e2a65640f79f01ce2ac674d7ed5 (diff)
parentca49299434bc764b667cd86846d892e91a150ef3 (diff)
downloadrails-5f3f100ce2d689480da85abc88e5e940cf90189e.tar.gz
rails-5f3f100ce2d689480da85abc88e5e940cf90189e.tar.bz2
rails-5f3f100ce2d689480da85abc88e5e940cf90189e.zip
Merge branch 'master' into active_model
Conflicts: activeresource/lib/active_resource/validations.rb
Diffstat (limited to 'actionpack/lib/action_dispatch/vendor/rack-1.0/rack/reloader.rb')
-rw-r--r--actionpack/lib/action_dispatch/vendor/rack-1.0/rack/reloader.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/vendor/rack-1.0/rack/reloader.rb b/actionpack/lib/action_dispatch/vendor/rack-1.0/rack/reloader.rb
new file mode 100644
index 0000000000..b17d8c0926
--- /dev/null
+++ b/actionpack/lib/action_dispatch/vendor/rack-1.0/rack/reloader.rb
@@ -0,0 +1,64 @@
+require 'thread'
+
+module Rack
+ # Rack::Reloader checks on every request, but at most every +secs+
+ # seconds, if a file loaded changed, and reloads it, logging to
+ # rack.errors.
+ #
+ # It is recommended you use ShowExceptions to catch SyntaxErrors etc.
+
+ class Reloader
+ def initialize(app, secs=10)
+ @app = app
+ @secs = secs # reload every @secs seconds max
+ @last = Time.now
+ end
+
+ def call(env)
+ if Time.now > @last + @secs
+ Thread.exclusive {
+ reload!(env['rack.errors'])
+ @last = Time.now
+ }
+ end
+
+ @app.call(env)
+ end
+
+ def reload!(stderr=$stderr)
+ need_reload = $LOADED_FEATURES.find_all { |loaded|
+ begin
+ if loaded =~ /\A[.\/]/ # absolute filename or 1.9
+ abs = loaded
+ else
+ abs = $LOAD_PATH.map { |path| ::File.join(path, loaded) }.
+ find { |file| ::File.exist? file }
+ end
+
+ if abs
+ ::File.mtime(abs) > @last - @secs rescue false
+ else
+ false
+ end
+ end
+ }
+
+ need_reload.each { |l|
+ $LOADED_FEATURES.delete l
+ }
+
+ need_reload.each { |to_load|
+ begin
+ if require to_load
+ stderr.puts "#{self.class}: reloaded `#{to_load}'"
+ end
+ rescue LoadError, SyntaxError => e
+ raise e # Possibly ShowExceptions
+ end
+ }
+
+ stderr.flush
+ need_reload
+ end
+ end
+end