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
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