Class | Rack::Reloader |
In: |
lib/rack/reloader.rb
|
Parent: | Object |
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.
# File lib/rack/reloader.rb, line 11 11: def initialize(app, secs=10) 12: @app = app 13: @secs = secs # reload every @secs seconds max 14: @last = Time.now 15: end
# File lib/rack/reloader.rb, line 17 17: def call(env) 18: if Time.now > @last + @secs 19: Thread.exclusive { 20: reload!(env['rack.errors']) 21: @last = Time.now 22: } 23: end 24: 25: @app.call(env) 26: end
# File lib/rack/reloader.rb, line 28 28: def reload!(stderr=STDERR) 29: need_reload = $LOADED_FEATURES.find_all { |loaded| 30: begin 31: if loaded =~ /\A[.\/]/ # absolute filename or 1.9 32: abs = loaded 33: else 34: abs = $LOAD_PATH.map { |path| ::File.join(path, loaded) }. 35: find { |file| ::File.exist? file } 36: end 37: 38: if abs 39: ::File.mtime(abs) > @last - @secs rescue false 40: else 41: false 42: end 43: end 44: } 45: 46: need_reload.each { |l| 47: $LOADED_FEATURES.delete l 48: } 49: 50: need_reload.each { |to_load| 51: begin 52: if require to_load 53: stderr.puts "#{self.class}: reloaded `#{to_load}'" 54: end 55: rescue LoadError, SyntaxError => e 56: raise e # Possibly ShowExceptions 57: end 58: } 59: 60: stderr.flush 61: need_reload 62: end