class Radar::API::Resource

Public Class Methods

api_client() click to toggle source
# File lib/radar/api/resource.rb, line 8
def self.api_client
  @api_client ||= Radar::API::Client.new
end
class_name() click to toggle source
# File lib/radar/api/resource.rb, line 12
def self.class_name
  name.split('::')[-1]
end
descendants() click to toggle source
# File lib/radar/api/resource.rb, line 22
def self.descendants
  ObjectSpace.each_object(Class).select do |klass|
    klass < self && klass != Radar::API::NestedResource
  end
end
new(data = {}) click to toggle source
# File lib/radar/api/resource.rb, line 4
def initialize(data = {})
  convert_to_obj(data)
end
resource_base_path(path_base: '/v1/') click to toggle source
# File lib/radar/api/resource.rb, line 16
def self.resource_base_path(path_base: '/v1/')
  raise NotImplementedError, 'Radar::API::Resource is an abstract class' if self == Resource

  path_base + self::RESOURCE_NAME[:plural]
end

Public Instance Methods

to_h() click to toggle source
# File lib/radar/api/resource.rb, line 28
def to_h
  instance_variables.each_with_object({}) do |instance_variable, h|
    key = instance_variable[1..instance_variable.length]
    value = instance_variable_get(instance_variable)
    h[key.to_sym] = build_hash_value_from_attribute_value(value)
  end
end

Private Instance Methods

build_hash_value_from_attribute_value(attr_value) click to toggle source
# File lib/radar/api/resource.rb, line 38
def build_hash_value_from_attribute_value(attr_value)
  return attr_value.to_h if known_resource_class?(attr_value.class)
  return attr_value.map(&:to_h) if collection_of_known_resource_class?(attr_value)

  attr_value
end
build_object(key, value) click to toggle source
# File lib/radar/api/resource.rb, line 61
def build_object(key, value)
  return build_resource_collection(key, value) if nested_resource_collection?(key, value)
  return build_resource(key, value) if nested_resource?(key, value)

  value
end
build_resource(key, resource_attributes) click to toggle source
# File lib/radar/api/resource.rb, line 73
def build_resource(key, resource_attributes)
  resource_class(key).new(resource_attributes)
end
build_resource_collection(key, value) click to toggle source
# File lib/radar/api/resource.rb, line 68
def build_resource_collection(key, value)
  resource_collection = value.map { |resource_attributes| build_resource(key, resource_attributes) }
  instance_variable_set("@#{key}", resource_collection)
end
collection_of_known_resource_class?(object) click to toggle source
# File lib/radar/api/resource.rb, line 45
def collection_of_known_resource_class?(object)
  object.is_a?(Array) && object.all? { |item| known_resource_class?(item.class) }
end
convert_to_obj(hash) click to toggle source
# File lib/radar/api/resource.rb, line 53
def convert_to_obj(hash)
  sanitized_hash(hash).each do |key, value|
    object = build_object(key, value)
    instance_variable_set("@#{key}", object)
    self.class.send(:attr_accessor, key)
  end
end
known_resource_class?(object_class) click to toggle source
# File lib/radar/api/resource.rb, line 49
def known_resource_class?(object_class)
  Radar.api_resources.value?(object_class)
end
nested_resource?(key, value) click to toggle source
# File lib/radar/api/resource.rb, line 81
def nested_resource?(key, value)
  Radar.api_resources.key?(key) && value.is_a?(Hash)
end
nested_resource_collection?(key, value) click to toggle source
# File lib/radar/api/resource.rb, line 77
def nested_resource_collection?(key, value)
  value.is_a?(Array) && value.all? { |obj| nested_resource?(key, obj) }
end
resource_class(resource) click to toggle source
# File lib/radar/api/resource.rb, line 85
def resource_class(resource)
  Radar.api_resources[resource]
end
sanitized_hash(hash) click to toggle source
# File lib/radar/api/resource.rb, line 89
def sanitized_hash(hash)
  hash.tap do |h|
    h.keys.each { |key| h[key.to_snake_case] = h.delete(key) }
  end
end