class Opi::API

Attributes

logger[R]

Public Class Methods

helpers(&block) click to toggle source
# File lib/opi/api.rb, line 14
def helpers(&block)
  # TODO: allow argument to be a module
  mod = Module.new
  mod.class_eval &block
  Context.send :include, mod
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/opi/api.rb, line 10
def method_missing(method, *args, &block)
  root.respond_to?(method) ? root.send(method, *args, &block) : super
end
new(options={}) click to toggle source
# File lib/opi/api.rb, line 25
def initialize(options={})
  puts "* Opi Version: #{Opi::VERSION} initializing".green
  @logger = options[:logger] || Logger.new(STDOUT)
  @logger.level = options[:debug] ? Logger::DEBUG : Logger::INFO
  @router = Router.new(self.class.root)
  @router.routes.collect{|x| @logger.debug "Route: #{x.method} #{x.path}"}
end
root() click to toggle source
# File lib/opi/api.rb, line 6
def root
  @root ||= Resource.new
end

Public Instance Methods

call(env) click to toggle source
# File lib/opi/api.rb, line 33
def call(env)
  logger.debug env.inspect.cyan

  request = Request.new(env)
  response = Response.new

  begin
    Loader.reload!

    route, params = @router.route(request.method, request.path)
    request.params.merge!(params) if params and params.is_a? Hash
    request.params.merge!('splat' => params.join(',')) if params and params.is_a? Array

    start_time = Time.now
    logger.info " Started #{request.method} \"#{request.path}\" for #{request.ip} at #{start_time.strftime('%d %b %H:%M')}"
    logger.info " Parameters: #{request.params}"

    if route
      logger.debug "#{request.method} #{request.path} => #{route.inspect}".green
      context = Context.new(env, logger, route, request, response)
      response = context.run
    else
      logger.debug "#{request.method} #{request.path} => route not found".red
      response.not_found!
    end

  rescue Exception => e
    logger.error "#{e.message.red}\n  #{e.backtrace[0..9].join("\n  ").yellow}"
    response.internal_server_error!(e)
  end

  logger.info " Completed #{response.status} in #{((Time.now - start_time)*1000).round(2)}ms"
  [response.status, response.header, response.body]
end