class JSONAPI::Deserializable::Resource
Attributes
attr_blocks[RW]
default_attr_block[RW]
default_has_many_rel_block[RW]
default_has_one_rel_block[RW]
has_many_rel_blocks[RW]
has_one_rel_blocks[RW]
id_block[RW]
key_formatter[RW]
type_block[RW]
reverse_mapping[R]
Public Class Methods
call(payload)
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 34 def self.call(payload) new(payload).to_h end
inherited(klass)
click to toggle source
Calls superclass method
# File lib/jsonapi/deserializable/resource.rb, line 21 def self.inherited(klass) super klass.type_block = type_block klass.id_block = id_block klass.attr_blocks = attr_blocks.dup klass.has_one_rel_blocks = has_one_rel_blocks.dup klass.has_many_rel_blocks = has_many_rel_blocks.dup klass.default_attr_block = default_attr_block klass.default_has_one_rel_block = default_has_one_rel_block klass.default_has_many_rel_block = default_has_many_rel_block klass.key_formatter = key_formatter end
new(payload, root: '/data')
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 38 def initialize(payload, root: '/data') @data = payload || {} @root = root @type = @data['type'] @id = @data['id'] @attributes = @data['attributes'] || {} @relationships = @data['relationships'] || {} deserialize! freeze end
Public Instance Methods
to_hash()
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 50 def to_hash @hash end
Also aliased as: to_h
Private Instance Methods
deserialize!()
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 65 def deserialize! @reverse_mapping = {} hashes = [deserialize_type, deserialize_id, deserialize_attrs, deserialize_rels] @hash = hashes.reduce({}, :merge) end
deserialize_attr(key, val)
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 96 def deserialize_attr(key, val) block = self.class.attr_blocks[key] || self.class.default_attr_block return {} unless block hash = block.call(val, self.class.key_formatter.call(key)) register_mappings(hash.keys, "/attributes/#{key}") hash end
deserialize_attrs()
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 90 def deserialize_attrs @attributes .map { |key, val| deserialize_attr(key, val) } .reduce({}, :merge) end
deserialize_has_many_rel(key, val)
click to toggle source
rubocop: disable Metrics/AbcSize
# File lib/jsonapi/deserializable/resource.rb, line 134 def deserialize_has_many_rel(key, val) block = self.class.has_many_rel_blocks[key] || self.class.default_has_many_rel_block return {} unless block && val['data'].is_a?(Array) ids = val['data'].map { |ri| ri['id'] } types = val['data'].map { |ri| ri['type'] } hash = block.call(val, ids, types, self.class.key_formatter.call(key)) register_mappings(hash.keys, "/relationships/#{key}") hash end
deserialize_has_one_rel(key, val)
click to toggle source
rubocop: disable Metrics/AbcSize
# File lib/jsonapi/deserializable/resource.rb, line 120 def deserialize_has_one_rel(key, val) block = self.class.has_one_rel_blocks[key] || self.class.default_has_one_rel_block return {} unless block id = val['data'] && val['data']['id'] type = val['data'] && val['data']['type'] hash = block.call(val, id, type, self.class.key_formatter.call(key)) register_mappings(hash.keys, "/relationships/#{key}") hash end
deserialize_id()
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 81 def deserialize_id block = self.class.id_block return {} unless @id && block hash = block.call(@id) register_mappings(hash.keys, '/id') hash end
deserialize_rel(key, val)
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 111 def deserialize_rel(key, val) if val['data'].is_a?(Array) deserialize_has_many_rel(key, val) else deserialize_has_one_rel(key, val) end end
deserialize_rels()
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 105 def deserialize_rels @relationships .map { |key, val| deserialize_rel(key, val) } .reduce({}, :merge) end
deserialize_type()
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 72 def deserialize_type block = self.class.type_block return {} unless block hash = block.call(@type) register_mappings(hash.keys, '/type') hash end
register_mappings(keys, path)
click to toggle source
# File lib/jsonapi/deserializable/resource.rb, line 59 def register_mappings(keys, path) keys.each do |k| @reverse_mapping[k] = @root + path end end