-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmodel.rb
60 lines (50 loc) · 1.41 KB
/
model.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# typed: true
# frozen_string_literal: true
require "json"
module EML
class Model
extend T::Sig
extend T::Helpers
abstract!
sig do
params(
fields: T.any(T::Hash[String, T.untyped], T::Array[String])
).void
end
def self.fields(fields)
const_set(:FIELDS, fields.freeze)
enumerate_fields do |_, local_name|
__send__(:attr_reader, :"#{local_name}")
end
end
sig { void }
def self.enumerate_fields
const_get(:FIELDS).each do |response_name, local_name|
local_name ||= response_name.to_sym
yield(response_name, local_name)
end
end
sig { params(raw_values: T::Hash[String, T.untyped]).void }
def initialize(raw_values)
self.class.enumerate_fields do |response_name, local_name|
value = field_value(response_name, raw_values[response_name])
instance_variable_set(:"@#{local_name}", value)
end
end
sig { returns(T::Hash[Symbol, T.untyped]) }
def to_h
ModelHash.(self)
end
sig { params(_args: T.nilable(Array)).returns(String) }
def to_json(*_args)
to_h.to_json
end
protected
sig { params(name: String, raw_value: T.untyped).returns(T.untyped) }
def field_value(name, raw_value)
return raw_value unless name.match?(/(Date|Time)$/)
return raw_value if raw_value.nil? || raw_value.empty?
Time.parse(raw_value)
end
end
end