module Siresta

Constants

DATE
DEFAULT_API_YAML
VERSION

Public Class Methods

api(opts = {}) click to toggle source

generate an API (Sinatra::Base subclass) based on a YAML description

# File lib/siresta/api.rb, line 163
def self.api(opts = {})
  api = Class.new ApiBase
  Spec.walk api_spec(opts), {
    root: -> (info) {
      api.class_eval do
        enable :sessions if info[:sessions]   # TODO
        set :name   , info[:name]
        set :version, info[:version]
      end
      api
    },
    resource: -> (info) {
      api.class_eval do
        info[:methods].each do |m|
          formats = info[:specs][m][:formats]
          symfmts = Hash[formats.map { |k,v| [k,v.map(&:to_sym)] }]
          _gen_route m.to_sym, info[:path], symfmts,
            info[:specs][m]['pipeline'], info[:specs][m][m].to_sym
        end
      end
      nil
    },
    subresource: -> (_) {}, parametrized_subresource: -> (_) {},
  }
end
api_spec(opts = {}) click to toggle source

get (cached) API spec @param [Hash] opts options @option opts [String] :data YAML data, or: @option opts [String] :file file name

# File lib/siresta/spec.rb, line 69
def self.api_spec(opts = {})
  if opts[:data]
    YAML.load opts[:data]
  else
    file = opts[:file] || DEFAULT_API_YAML
    (@api_spec ||= {})[file] ||= api_spec data: File.read(file)
  end
end
client(opts = {}) click to toggle source

generate a client (Excon wrapper) based on a YAML description

# File lib/siresta/client.rb, line 29
def self.client(opts = {})
  opts_       = opts.dup
  http_client = opts_.delete(:http_client) || Excon
  Spec.walk api_spec(opts_), {
    root: -> (info) {
      info[:res].class_eval do
        define_method(:name)    { info[:name]     }
        define_method(:version) { info[:version]  }
      end
      info[:res]
    },
    resource: -> (info) {
      res = Class.new Client::Resource
      res.class_eval do
        info[:methods].map(&:to_sym).each do |m|
          # resource.{get,post,put,delete}
          define_method(m) do |*params, &b|
            # TODO: quoting
            http_client.send m, url, *params, &b
          end
        end
      end
      res
    },
    subresource: -> (info) {
      info[:res].class_eval do
        # resource.some_route
        define_method(info[:route].to_sym) do
          info[:sub].new url, info[:route]
        end
      end
    },
    parametrized_subresource: -> (info) {
      info[:res].class_eval do
        # resource[some_param]
        define_method(:[]) { |param| info[:sub].new url, param }
      end
    },
  }
end
env() click to toggle source

environment

# File lib/siresta/env.rb, line 3
def self.env
  ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
end
routes(opts = {}) click to toggle source

get routes from YAML description

# File lib/siresta/routes.rb, line 16
def self.routes(opts = {})
  routes = []
  Spec.walk api_spec(opts), {
    resource: -> (info) {
      info[:methods].each do |m|
        routes << [m.upcase, info[:path], info[:specs][m]['desc']]
      end
      nil
    },
    root: -> (_) {}, subresource: -> (_) {},
    parametrized_subresource: -> (_) {},
  }
  routes
end