class Reynard::ObjectBuilder

Defines dynamic classes based on schema and instantiates them for a response.

Public Class Methods

model_class(name, object_type) click to toggle source
# File lib/reynard/object_builder.rb, line 44
def self.model_class(name, object_type)
  model_class_get(name) || model_class_set(name, object_type)
end
model_class_get(name) click to toggle source
# File lib/reynard/object_builder.rb, line 48
def self.model_class_get(name)
  Reynard::Models.const_get(name)
rescue NameError
  nil
end
model_class_set(name, object_type) click to toggle source
# File lib/reynard/object_builder.rb, line 54
def self.model_class_set(name, object_type)
  if object_type == 'array'
    Reynard::Models.const_set(name, Class.new(Array))
  else
    Reynard::Models.const_set(name, Class.new(Reynard::Model))
  end
end
new(media_type:, schema:, http_response:) click to toggle source
# File lib/reynard/object_builder.rb, line 8
def initialize(media_type:, schema:, http_response:)
  @media_type = media_type
  @schema = schema
  @http_response = http_response
end

Public Instance Methods

call() click to toggle source
# File lib/reynard/object_builder.rb, line 30
def call
  if @schema.object_type == 'array'
    array = object_class.new
    data.each { |attributes| array << item_object_class.new(attributes) }
    array
  else
    object_class.new(data)
  end
end
data() click to toggle source
# File lib/reynard/object_builder.rb, line 40
def data
  @data ||= MultiJson.load(@http_response.body)
end
item_object_class() click to toggle source
# File lib/reynard/object_builder.rb, line 22
def item_object_class
  if @schema.item_schema_name
    self.class.model_class(@schema.item_schema_name, 'object')
  else
    OpenStruct
  end
end
object_class() click to toggle source
# File lib/reynard/object_builder.rb, line 14
def object_class
  if @media_type.schema_name
    self.class.model_class(@media_type.schema_name, @schema.object_type)
  else
    OpenStruct
  end
end