class DearInventory::Model

Public Class Methods

define_readers() click to toggle source
# File lib/dear_inventory/model.rb, line 34
def self.define_readers
  enumerate_fields do |_, specifications|
    __send__(:attr_reader, specifications[:name])

    if specifications[:type] == :ResultSet
      alias_method :records, specifications[:name]
    end
  end
end
enumerate_fields() { |response_name, specifications| ... } click to toggle source
# File lib/dear_inventory/model.rb, line 45
def self.enumerate_fields
  const_get(:FIELDS).each do |response_name, specifications|
    yield(response_name, specifications)
  end
end
fields(fields) click to toggle source
# File lib/dear_inventory/model.rb, line 23
def self.fields(fields)
  ancestor = T.must(ancestors[1])
  if ancestor.const_defined?(:FIELDS)
    fields = ancestor.const_get(:FIELDS).merge(fields)
  end
  const_set(:FIELDS, fields.freeze)

  define_readers
end
new(values = nil) click to toggle source
# File lib/dear_inventory/model.rb, line 56
def initialize(values = nil)
  initialize_abstract

  return if values.nil?

  self.class.enumerate_fields do |response_name, specifications|
    value = field_value(response_name, T.must(values), specifications)
    instance_variable_set(:"@#{specifications[:name]}", value)
  end
end
Also aliased as: initialize_abstract

Public Instance Methods

initialize_abstract(values = nil)
Alias for: new
to_h() click to toggle source
# File lib/dear_inventory/model.rb, line 68
def to_h
  {}.tap do |hash|
    self.class.enumerate_fields do |_, specifications|
      key = specifications[:name]
      hash[key] = public_send(key)
    end
  end
end

Private Instance Methods

field_value(response_name, values, specifications) click to toggle source
# File lib/dear_inventory/model.rb, line 88
def field_value(response_name, values, specifications)
  model = T.cast(
    specifications[:model],
    T.nilable(T.class_of(DearInventory::Model))
  )
  value = values[response_name.to_s]
  return if value == ""

  format_value(value, specifications[:type], model)
end
format_value(value, type, model) click to toggle source

rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/MethodLength

# File lib/dear_inventory/model.rb, line 101
def format_value(value, type, model)
  case type
  when :Array, :ResultSet
    initialize_array_values_in_models(value, T.must(model))
  when :BigDecimal
    value.to_d
  when :Date
    ::Date.parse(value) unless value.nil?
  when :DateTime
    ::DateTime.parse(value) unless value.nil?
  when :Hash
    T.must(model).new(value)
  else
    value
  end
end
initialize_array_values_in_models(array, model) click to toggle source
# File lib/dear_inventory/model.rb, line 126
def initialize_array_values_in_models(array, model)
  return if array.nil?

  array.each_with_object([]) do |values, records|
    records << model.new(values)
  end
end