Class: Paymos::Model

Inherits:
Object
  • Object
show all
Defined in:
lib/paymos/models.rb,
sig/paymos.rbs

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**attributes) ⇒ Model

Returns a new instance of Model.

Raises:

  • (ArgumentError)


47
48
49
50
51
52
53
54
55
# File 'lib/paymos/models.rb', line 47

def initialize(**attributes)
  unknown = attributes.keys - self.class.field_names
  raise ArgumentError, "Unknown model fields: #{unknown.join(', ')}" unless unknown.empty?

  self.class.field_names.each do |name|
    instance_variable_set("@#{name}", Model.deep_freeze(attributes[name]))
  end
  freeze
end

Class Attribute Details

.field_namesObject (readonly)

Returns the value of attribute field_names.



28
29
30
# File 'lib/paymos/models.rb', line 28

def field_names
  @field_names
end

.required_namesObject (readonly)

Returns the value of attribute required_names.



28
29
30
# File 'lib/paymos/models.rb', line 28

def required_names
  @required_names
end

Class Method Details

.deep_freeze(value) ⇒ Object



65
66
67
68
69
70
71
72
73
74
# File 'lib/paymos/models.rb', line 65

def self.deep_freeze(value)
  case value
  when Hash
    value.transform_values { |item| deep_freeze(item) }.freeze
  when Array
    value.map { |item| deep_freeze(item) }.freeze
  else
    value.freeze
  end
end

.fields(*names, required: names) ⇒ Object



30
31
32
33
34
# File 'lib/paymos/models.rb', line 30

def fields(*names, required: names)
  @field_names = names.freeze
  @required_names = required.freeze
  attr_reader(*names)
end

.from(value) ⇒ Object

Raises:



36
37
38
39
40
41
42
43
44
# File 'lib/paymos/models.rb', line 36

def from(value)
  raise Error, 'Paymos API response must be a JSON object' unless value.is_a?(Hash)

  attributes = field_names.to_h { |name| [name, value[name.to_s]] }
  missing = required_names.select { |name| attributes[name].nil? }
  raise Error, "Paymos API response is missing: #{missing.join(', ')}" unless missing.empty?

  new(**attributes)
end

Instance Method Details

#[](name) ⇒ Object

Parameters:

  • name (String, Symbol)

Returns:

  • (Object)


57
58
59
# File 'lib/paymos/models.rb', line 57

def [](name)
  public_send(name.to_sym)
end

#to_hHash[Symbol, untyped]

Returns:

  • (Hash[Symbol, untyped])


61
62
63
# File 'lib/paymos/models.rb', line 61

def to_h
  self.class.field_names.to_h { |name| [name, public_send(name)] }
end