class Patchboard::Mapping

Attributes

klass[RW]
name[R]
path[R]
query[R]
resource[R]
template[R]
url[R]

Public Class Methods

new(api, name, definition) click to toggle source
# File lib/patchboard/api.rb, line 90
def initialize(api, name, definition)
  @api = api
  @name = name
  @definition = definition
  @resource = @definition[:resource]
  @query = @definition[:query]
  @url = @definition[:url]
  @path = @definition[:path]
  @template = @definition[:template]

  unless (resource_name = @definition[:resource])
    raise "Mapping does not specify 'resource'"
  end

  unless (@resource = @api.resources[resource_name.to_sym])
    raise "Mapping specifies a resource that is not defined"
  end

  unless (@definition[:url] || @definition[:path] || @definition[:template])
    raise "Mapping is missing any form of URL specification"
  end

end

Public Instance Methods

generate_url(params={}) click to toggle source
# File lib/patchboard/api.rb, line 114
def generate_url(params={})
  if @url
    base = @url
  elsif params[:url]
    base = params[:url]
  elsif @path
    if @api.service_url
      base = [@api.service_url, @path].join("/")
    else
      raise "Tried to generate url from path, but API did not define service_url"
    end
  elsif @template
    raise "Template mappings are not yet implemented in the client"
  end

  if @query
    parts = []
    keys = @query.keys.sort()
    # TODO check query schema
    keys.each do |key|
      if string = (params[key.to_s] || params[key.to_sym])
        parts << "#{CGI::escape(key.to_s)}=#{CGI::escape(string)}"
      end
    end
    if parts.size > 0
      query_string = "?#{parts.join("&")}"
    else
      query_string = ""
    end
    [base, query_string].join()
  else
    base
  end
end