Module: Serdee::Attributes::ClassMethods

Included in:
Nested
Defined in:
lib/serdee/attributes.rb

Instance Method Summary collapse

Instance Method Details

#attribute(key, *args, &block) ⇒ Object



81
82
83
84
85
86
# File 'lib/serdee/attributes.rb', line 81

def attribute(key, *args, &block)
  attributes_class.attributes[key] = serializers[key] =
    Attribute.new(key, *args, &block)

  attributes_class.send(:attr_accessor, key)
end

#attributesObject



48
49
50
# File 'lib/serdee/attributes.rb', line 48

def attributes
  @attributes ||= {}
end

#attributes_classObject



77
78
79
# File 'lib/serdee/attributes.rb', line 77

def attributes_class
  self
end

#extract_to(data, obj) ⇒ Object



116
117
118
119
120
121
122
# File 'lib/serdee/attributes.rb', line 116

def extract_to(data, obj)
  return if obj.nil?
  serializers.each do |_key, attribute|
    attribute.extract_to(data, obj)
  end
  obj
end

#from_json(json) ⇒ Object



102
103
104
# File 'lib/serdee/attributes.rb', line 102

def from_json(json)
  of_json(JSON.parse(json))
end

#insert_to(obj, data) ⇒ Object



124
125
126
127
128
129
# File 'lib/serdee/attributes.rb', line 124

def insert_to(obj, data)
  serializers.each do |_key, attribute|
    attribute.insert_to(obj, data)
  end
  data
end

#key_transformObject



73
74
75
# File 'lib/serdee/attributes.rb', line 73

def key_transform
  @key_transform || Serdee.default_key_transform
end

#nested(key, nested_class = nil, &block) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/serdee/attributes.rb', line 88

def nested(key, nested_class = nil, &block)
  serializers[key] = Nested.new(
    attributes_class,
    key,
    nested_class&.serializers,
    &block
  )

  return unless nested_class

  attributes_class.attributes.merge!(nested_class.attributes)
  attributes_class.send(:attr_accessor, *nested_class.attributes.keys)
end

#of_json(json) ⇒ Object



106
107
108
109
110
111
112
113
114
# File 'lib/serdee/attributes.rb', line 106

def of_json(json)
  allocate.tap do |obj|
    data = json.deep_transform_keys do |key|
      key.underscore.to_sym
    end
    extract_to(data, obj)
    obj.deserialized_from = json
  end
end

#serializersObject



52
53
54
# File 'lib/serdee/attributes.rb', line 52

def serializers
  @serializers ||= {}
end

#set_key_transform(transform_name = nil, &block) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/serdee/attributes.rb', line 56

def set_key_transform(transform_name = nil, &block)
  if transform_name
    mapping = {
      camel: :camelize.to_proc,
      camel_lower: ->(key) { key.camelize(:lower) },
      dash: :dasherize.to_proc,
      underscore: :underscore.to_proc
    }

    @key_transform = mapping[transform_name.to_sym]
  elsif block
    @key_transform = block
  else
    raise ArgumentError, "must supply at least transform_name or block"
  end
end