Class: Supai::Resource

Inherits:
Object
  • Object
show all
Defined in:
lib/supai/resource.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.attr_accessor(*attrs) ⇒ Object



10
11
12
13
14
# File 'lib/supai/resource.rb', line 10

def self.attr_accessor(*attrs)
  @json_attrs ||= []
  @json_attrs += attrs
  super
end

.attr_collections(hash) ⇒ Object



27
28
29
30
31
32
33
34
35
36
# File 'lib/supai/resource.rb', line 27

def self.attr_collections(hash)
  @json_attrs ||= []
  hash.each do |name, klass|
    @json_attrs << name
    attr_reader(name)
    define_method("#{name}=") { |ary|
      instance_variable_set("@#{name}", parse_collection(ary, klass))
    }
  end
end

.attr_objects(hash) ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/supai/resource.rb', line 16

def self.attr_objects(hash)
  @json_attrs ||= []
  hash.each do |name, klass|
    @json_attrs << name
    attr_reader(name)
    define_method("#{name}=") { |obj|
      instance_variable_set("@#{name}", parse_object(obj, klass))
    }
  end
end

.attr_timestamp_accessor(*attrs) ⇒ Object



38
39
40
41
42
43
44
45
46
47
# File 'lib/supai/resource.rb', line 38

def self.attr_timestamp_accessor(*attrs)
  @json_attrs ||= []
  attrs.each do |name|
    @json_attrs << name
    attr_reader(name)
    define_method("#{name}=") { |value|
      instance_variable_set("@#{name}", parse_timestamp(value))
    }
  end
end

.attributesObject



6
7
8
# File 'lib/supai/resource.rb', line 6

def self.attributes
  @json_attrs
end

Instance Method Details

#as_jsonObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/supai/resource.rb', line 49

def as_json
  self.class.attributes.to_h { |attr|
    value = send(attr)
    json_value = case
                 when value.respond_to?(:as_json)
                   value.as_json
                 when value.is_a?(Array)
                   value.map(&:as_json)
                 else
                   value
                 end
    [attr, json_value]
  }
end

#inspectObject



108
109
110
# File 'lib/supai/resource.rb', line 108

def inspect
  "#<#{self.class} #{[@id, @name || @display_name].compact.join(" ")}>"
end

#parse_collection(ary, klass) ⇒ Object



84
85
86
87
88
# File 'lib/supai/resource.rb', line 84

def parse_collection(ary, klass)
  ary.map { |obj|
    parse_object(obj, klass)
  }
end

#parse_object(obj, klass) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/supai/resource.rb', line 90

def parse_object(obj, klass)
  if obj.is_a?(klass)
    obj
  else
    klass.new(obj)
  end
end

#parse_timestamp(value) ⇒ Object



98
99
100
101
102
103
104
105
106
# File 'lib/supai/resource.rb', line 98

def parse_timestamp(value)
  return nil if value.nil?

  if value.is_a? Time
    value
  else
    Time.parse(value)
  end
end

#set_attribute(key, value) ⇒ Object



73
74
75
76
# File 'lib/supai/resource.rb', line 73

def set_attribute(key, value)
  setter = "#{underscore(key)}="
  send(setter, value) if respond_to?(setter)
end

#set_attributes(hash) ⇒ Object



78
79
80
81
82
# File 'lib/supai/resource.rb', line 78

def set_attributes(hash)
  hash.each do |key, value|
    set_attribute(key, value)
  end
end

#underscore(value) ⇒ Object



64
65
66
67
68
69
70
71
# File 'lib/supai/resource.rb', line 64

def underscore(value)
  return value unless /[A-Z-]/.match?(value)
  word = value.to_s.gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
  word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
  word.tr!("-", "_")
  word.downcase!
  word
end