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 ||= {}