class Pocus::Resource

Base class for API resources.

Attributes

path[RW]
primary_key[RW]
parent[RW]
path[R]

Public Class Methods

associations() click to toggle source
# File lib/pocus/resource.rb, line 21
def associations
  @associations ||= {}
end
has_many(name, options = {}) click to toggle source
# File lib/pocus/resource.rb, line 25
def has_many(name, options = {})
  attr_accessor(name)
  associations[name] = options
end
new(attributes) click to toggle source
# File lib/pocus/resource.rb, line 39
def initialize(attributes)
  assign_attributes(attributes)
  self.class.associations.each_pair do |name, options|
    send("#{name}=", Association.new(self, name, options))
  end
end
tag() click to toggle source
# File lib/pocus/resource.rb, line 30
def tag
  name.split('::').last.downcase
end
tag_multiple() click to toggle source
# File lib/pocus/resource.rb, line 34
def tag_multiple
  tag.concat('s')
end

Public Instance Methods

assign_attributes(attributes) click to toggle source
# File lib/pocus/resource.rb, line 46
def assign_attributes(attributes)
  attributes.each do |ck, v|
    k = underscore(ck)
    self.class.__send__(:attr_accessor, k) unless respond_to?(k)
    send("#{k}=", v)
  end
end
delete() click to toggle source
# File lib/pocus/resource.rb, line 54
def delete
  session.send_request('DELETE', path) == []
end
Also aliased as: destroy
destroy()
Alias for: delete
fields() click to toggle source
# File lib/pocus/resource.rb, line 59
def fields
  field_names.reduce(Hash[]) do |hash, field_name|
    hash.tap { |h| h[camelize field_name] = send field_name }
  end
end
get(request_path, klass) click to toggle source

Fetch and instantiate a single resource from a path.

# File lib/pocus/resource.rb, line 66
def get(request_path, klass)
  response = session.send_request('GET', path + request_path)
  data = response.fetch(klass.tag)
  resource = klass.new(data.merge(parent: self))
  resource.assign_errors(response)
  resource
end
get_multiple(request_path, klass, filters = {}) click to toggle source
# File lib/pocus/resource.rb, line 74
def get_multiple(request_path, klass, filters = {})
  request_data = URI.encode_www_form(camelize_fields filters)
  response = session.send_request('GET', path + request_path + '?' + request_data)
  data = response.fetch(klass.tag_multiple) || []
  resources = data.map { |fields| klass.new(fields.merge(parent: self)) }
  ResponseArray.new(resources, response['errors'], response['warnings'])
end
id() click to toggle source
# File lib/pocus/resource.rb, line 82
def id
  send self.class.primary_key
end
logger() click to toggle source
# File lib/pocus/resource.rb, line 86
def logger
  session.logger
end
marshal_dump() click to toggle source
# File lib/pocus/resource.rb, line 125
def marshal_dump
  instance_variables.each_with_object({}) { |k, h| h[k[1..-1]] = send(k[1..-1]) }
end
marshal_load(attributes) click to toggle source
# File lib/pocus/resource.rb, line 129
def marshal_load(attributes)
  assign_attributes(attributes)
end
post() click to toggle source
# File lib/pocus/resource.rb, line 94
def post
  response = session.send_request('POST', path, fields)
  assign_attributes(response.fetch(self.class.tag))
  assign_errors(response)
  self
rescue UnexpectedHttpResponse => e
  response = JSON.parse(e.response.body)
  response['errors'] || response['warnings'] or raise
  assign_errors(response)
  self
end
post_multiple(request_path, klass, fields_multiple) click to toggle source
# File lib/pocus/resource.rb, line 106
def post_multiple(request_path, klass, fields_multiple)
  data = fields_multiple.map { |fields| camelize_fields(fields) }
  response = session.send_request('POST', path + request_path, data)
  resources = response.fetch(klass.tag_multiple).map { |fields| klass.new(fields.merge(parent: self)) }
  ResponseArray.new(resources, response['errors'], response['warnings'])
end
reload() click to toggle source

Fetch and update this resource from a path.

# File lib/pocus/resource.rb, line 114
def reload
  response = session.send_request('GET', path)
  assign_attributes(response.fetch(self.class.tag))
  assign_errors(response)
  self
end
session() click to toggle source
# File lib/pocus/resource.rb, line 121
def session
  parent.session
end

Protected Instance Methods

assign_errors(response) click to toggle source
# File lib/pocus/resource.rb, line 167
def assign_errors(response)
  assign_attributes(errors: response['errors'] || [], warnings: response['warnings'] || [])
end
camelize(str) click to toggle source
# File lib/pocus/resource.rb, line 140
def camelize(str)
  return str.to_s unless str.to_s.include?('_')
  parts = str.to_s.split('_')
  first = parts.shift
  first + parts.each(&:capitalize!).join
end
camelize_fields(hash) click to toggle source
# File lib/pocus/resource.rb, line 147
def camelize_fields(hash)
  hash.reduce({}) do |h, e|
    h[camelize e[0]] = e[1]
    h
  end
end
camelize_filters(hash) click to toggle source
# File lib/pocus/resource.rb, line 154
def camelize_filters(hash)
  hash.reduce({}) do |h, e|
    key = camelize(e[0])
    h[key] = e[1]
    h[key + 'SearchType'] = 'eq'
    h
  end
end
field_names() click to toggle source
# File lib/pocus/resource.rb, line 163
def field_names
  instance_variables.map { |n| n.to_s.sub('@', '').to_sym } - [:session, :parent, :path]
end
required(attributes, attr_names) click to toggle source
# File lib/pocus/resource.rb, line 135
def required(attributes, attr_names)
  missing = attr_names - attributes.keys
  fail "missing required atrributes: #{missing.inspect}" if missing.any?
end
underscore(camel_cased_word) click to toggle source
# File lib/pocus/resource.rb, line 171
def underscore(camel_cased_word)
  camel_cased_word.to_s.dup.tap do |word|
    word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
    word.downcase!
  end
end