class Triton::ApiBase

Constants

ApiNames
DefinedMethods
UnknownCall

Attributes

path[R]

Public Class Methods

call(name, opts={}) click to toggle source
# File lib/triton/api_base.rb, line 15
def self.call(name, opts={})
  DefinedMethods[self][name] = opts
end
execute(name, params={}) click to toggle source
# File lib/triton/api_base.rb, line 23
def self.execute(name, params={})
  new(name, params).execute
end
hostname() click to toggle source
# File lib/triton/api_base.rb, line 27
def self.hostname
  "#{ApiNames[self]}.#{Triton.suffix}"
end
method_missing(snake_case, *args) click to toggle source

 We dynamically map from snake_case to CamelCase here

Calls superclass method
# File lib/triton/api_base.rb, line 32
def self.method_missing(snake_case, *args)
  camel_case = snake_case.to_s.camelise
  if DefinedMethods[self][camel_case]
    execute(camel_case, *args)
  else
    super
  end
end
name=(name) click to toggle source
# File lib/triton/api_base.rb, line 19
def self.name=(name)
  ApiNames[self] = name
end
new(name, params={}) click to toggle source
# File lib/triton/api_base.rb, line 53
def initialize(name, params={})
  @name = name
  @params = params.dup || {}
  @call = DefinedMethods[self.class][name]
  raise UnknownCall, "#{@name} isn't a known API method." unless @call

  @method = @call.fetch(:method, :get).intern
  @path = @call[:path]
  @body_param = @call[:body_param] && @params.delete(@call[:body_param])

  @params.each do |k,v|
    @path = @path.gsub(":#{k.to_s}") do |_|
      @params.delete(k)
      CGI.escape(v.to_s)
    end
  end

  @query_string_params = if @method == :get || !!@body_param
    @params
  else
    [@call.fetch(:querystring, [])].flatten.map do |key|
      value = @params.delete(key.to_s)
      [key, value] if value
    end.compact
  end
end
respond_to_missing?(snake_case, include_all=false) click to toggle source
Calls superclass method
# File lib/triton/api_base.rb, line 41
def self.respond_to_missing?(snake_case, include_all=false)
  camel_case = snake_case.to_s.camelise
  if DefinedMethods[self][camel_case]
    true
  else
    super(snake_case, include_all)
  end
end

Public Instance Methods

execute() click to toggle source
# File lib/triton/api_base.rb, line 80
def execute
  if Triton.test_mode
    raise Triton::TestModeLeak, "Request '#{@name}' leaked when in test mode\n#{request.method.upcase} #{URI.parse(request.url).path}\n#{JSON.pretty_generate(@params)}"
  end
  Triton.logger.debug("#{self.class.name}/#{@name}: #{request.method.upcase} #{URI.parse(request.url).path}\n#{JSON.pretty_generate(@params)}")
  object = parse(request.execute)
  if object.is_a?(Hash)
    IndifferentHash.new.merge!(object)
  else
    object
  end
rescue RestClient::Exception => e
  begin
    payload = JSON.parse(e.response.body)
    raise Triton::RemoteException, payload
  rescue JSON::JSONError
    raise e
  end
end
parse(body) click to toggle source
# File lib/triton/api_base.rb, line 100
def parse(body)
  parser = @call.fetch(:response, :json)
  if parser.respond_to?(:call)
    parser.call(body)
  else
    case parser
    when :json_lines
      body.split("\n").map { |a| JSON.parse(a) }
    when :json
      JSON.parse(body)
    else
      raise ArgumentError, "Unknown parser '#{parser}'"
    end
  end
end
request() click to toggle source
# File lib/triton/api_base.rb, line 116
def request
  @request ||= begin

    # Now generate the payload, unless it's a GET
    payload = if @method == :get
      nil
    elsif !!@body_param
      JSON.generate(@body_param)
    else
      JSON.generate(@params)
    end

    query = @query_string_params.map { |k,v| [CGI.escape(k.to_s), CGI.escape(v.to_s)].join("=")}.join("&")

    url = URI.parse("http://#{self.class.hostname}#{path}")
    if query.length > 0
      url.query = if url.query
        url.query = "#{url.query}&#{query}"
      else
        query
      end
    end

    RestClient::Request.new({
      :method => @method,
      :url    => url.to_s,
      :headers => {
        'Accept'       => 'application/json',
        'Content-Type' => !!payload ? 'application/json' : nil
      },
      :payload => payload
    })
  end
end