module Sinatra::Drumkit

Constants

VERSION

Public Instance Methods

rhythm(app_dir: nil, model_dir: nil, controller_dir: nil, namespace: Sinatra::Drumkit) click to toggle source
# File lib/sinatra/drumkit.rb, line 7
def rhythm(app_dir: nil, model_dir: nil, controller_dir: nil,
           namespace: Sinatra::Drumkit)

  app_dir ||= File.join(root, 'app')
  model_dir ||= File.join(app_dir, 'models')
  controller_dir ||= File.join(app_dir, 'controllers')

  model_module = model_autoloader(model_dir)
  namespace.const_set(:Model, model_module)

  load_controllers(controller_dir)
end

Private Instance Methods

load_controllers(load_dir) click to toggle source
# File lib/sinatra/drumkit.rb, line 43
def load_controllers(load_dir)
  Dir[::File.join(load_dir, '**/*.rb')].each do |file|
    instance_eval(File.read(file), file)
  end
end
model_autoloader(load_dir) click to toggle source
# File lib/sinatra/drumkit.rb, line 22
def model_autoloader(load_dir)
  Module.new do
    define_singleton_method(
      :const_missing, lambda { |const|
        @searched ||= {}
        raise "Class not found: #{const}" if @searched[const]
        filename = const.to_s
                     .gsub('::', '/')
                     .gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
                     .gsub(/([a-z\d])([A-Z])/, '\1_\2')
                     .downcase
        filepath = File.join(load_dir, "#{filename}.rb")
        raise("Class file \"#{filepath}\" for #{const}") unless File.readable?(filepath)
        require filepath
        @searched[const] = true
        const_get(const) || raise("Class not found: #{const}")
      }
    )
  end
end