module Sinatra::Reloader
Sinatra::Reloader
Extension to reload modified files. Useful during development, since it will automatically require files defining routes, filters, error handlers and inline templates, with every incoming request, but only if they have been updated.
Usage
Classic Application
To enable the reloader in a classic application all you need to do is require it:
require "sinatra" require "sinatra/reloader" if development? # Your classic application code goes here...
Modular Application
To enable the reloader in a modular application all you need to do is require it, and then, register it:
require "sinatra/base" require "sinatra/reloader" class MyApp < Sinatra::Base configure :development do register Sinatra::Reloader end # Your modular application code goes here... end
Using the Reloader in Other Environments
By default, the reloader is only enabled for the development environment. Similar to registering the reloader in a modular application, a classic application requires manually enabling the extension for it to be available in a non-development environment.
require "sinatra" require "sinatra/reloader" configure :production do enable :reloader end
Changing the Reloading Policy
You can refine the reloading policy with also_reload
and
dont_reload
, to customize which files should, and should not,
be reloaded, respectively.
Classic Application
Simply call the methods:
require "sinatra" require "sinatra/reloader" if development? also_reload '/path/to/some/file' dont_reload '/path/to/other/file' # Your classic application code goes here...
Modular Application
Call the methods inside the configure
block:
require "sinatra/base" require "sinatra/reloader" class MyApp < Sinatra::Base configure :development do register Sinatra::Reloader also_reload '/path/to/some/file' dont_reload '/path/to/other/file' end # Your modular application code goes here... end
Public Class Methods
Reloads the modified files, adding, updating and removing the needed elements.
# File lib/sinatra/reloader.rb, line 233 def self.perform(klass) Watcher::List.for(klass).updated.each do |watcher| klass.set(:inline_templates, watcher.path) if watcher.inline_templates? watcher.elements.each { |element| klass.deactivate(element) } $LOADED_FEATURES.delete(watcher.path) require watcher.path watcher.update end end
When the extension is registered it extends the Sinatra application klass
with the
modules BaseMethods
and ExtensionMethods
and
defines a before filter to perform
the reload of the modified
files.
# File lib/sinatra/reloader.rb, line 209 def self.registered(klass) @reloader_loaded_in ||= {} return if @reloader_loaded_in[klass] @reloader_loaded_in[klass] = true klass.extend BaseMethods klass.extend ExtensionMethods klass.set(:reloader) { klass.development? } klass.set(:reload_templates) { klass.reloader? } klass.before do if klass.reloader? if Reloader.thread_safe? Thread.exclusive { Reloader.perform(klass) } else Reloader.perform(klass) end end end klass.set(:inline_templates, klass.app_file) if klass == Sinatra::Application end
Indicates whether or not we can and need to run thread-safely.
# File lib/sinatra/reloader.rb, line 244 def self.thread_safe? Thread and Thread.list.size > 1 and Thread.respond_to?(:exclusive) end