lib/alba/serializer.rb in alba-0.8.0 vs lib/alba/serializer.rb in alba-0.9.0
- old
+ new
@@ -1,54 +1,51 @@
module Alba
# This module represents how a resource should be serialized.
module Serializer
def self.included(base)
+ super
base.include InstanceMethods
base.extend ClassMethods
end
# Instance methods
module InstanceMethods
def initialize(resource)
- @_opts = self.class._opts || {}
- @_metadata = self.class._metadata || {}
- @_metadata = @_metadata.transform_values { |block| block.call(resource._object) }
- key = case @_opts[:key]
- when true
- resource.key
- else
- @_opts[:key]
- end
- @hash = resource.serializable_hash(with_key: false)
+ @resource = resource
+ @hash = resource.serializable_hash
@hash = {key.to_sym => @hash} if key
# @hash is either Hash or Array
- @hash.is_a?(Hash) ? @hash.merge!(@_metadata.to_h) : @hash << @_metadata
+ @hash.is_a?(Hash) ? @hash.merge!(metadata.to_h) : @hash << metadata
end
def serialize
- fallback = lambda do
- require 'json'
- JSON.dump(@hash)
- end
- case Alba.backend
- when :oj
- begin
- require 'oj'
- -> { Oj.dump(@hash, mode: :strict) }
- rescue LoadError
- fallback
- end
+ Alba.encoder.call(@hash)
+ end
+
+ private
+
+ def key
+ opts = self.class._opts || {}
+ case opts[:key]
+ when true
+ @resource.key
else
- fallback
- end.call
+ opts[:key]
+ end
end
+
+ def metadata
+ metadata = self.class._metadata || {}
+ metadata.transform_values { |block| block.call(@resource.object) }
+ end
end
# Class methods
module ClassMethods
attr_reader :_opts, :_metadata
def inherited(subclass)
+ super
%w[_opts _metadata].each { |name| subclass.instance_variable_set("@#{name}", instance_variable_get("@#{name}")) }
end
def set(key: false)
@_opts ||= {}