class SimpleJsonapi::SerializerInferrer

Identifies the serializer class that should be used for a resource or error object.

Attributes

namespace[R]

@!attribute [r] namespace

@return [String]

Public Class Methods

new(explicit_mappings: nil, namespace: nil, &block) click to toggle source

@param explicit_mappings [Hash{Class => Class}] A mapping of resource classes to serializer classes @param namespace [String] A namespace in which to search for serializer classes @yieldparam object [Object] The resource or error @yieldreturn [Class] A serializer class

# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 38
def initialize(explicit_mappings: nil, namespace: nil, &block)
  @explicit_mappings = {}
  @explicit_mappings.merge!(explicit_mappings) if explicit_mappings

  @namespace = namespace
  @infer_proc = block
end
wrap(serializer) click to toggle source

@param serializer [SerializerInferrer,Serializer,ErrorSerializer,nil] @return [SerializerInferrer]

# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 23
def self.wrap(serializer)
  if serializer.is_a?(SerializerInferrer)
    serializer
  elsif serializer.present?
    klass = serializer_class(serializer)
    SerializerInferrer.new { |_resource| klass }
  else
    SimpleJsonapi.serializer_inferrer
  end
end

Private Class Methods

serializer_class(serializer) click to toggle source
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 125
def self.serializer_class(serializer)
  case serializer
  when Class
    serializer
  else
    serializer.to_s.constantize
  end
end

Public Instance Methods

add(resource_class, serializer_class) click to toggle source

@param resource_class [Class] @param serializer_class [Class] @return [void]

# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 60
def add(resource_class, serializer_class)
  @explicit_mappings[resource_class.name] = serializer_class
end
default_serializer() click to toggle source

@return [Class,nil]

# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 74
def default_serializer
  unless defined?(@default_serializer)
    begin
      @default_serializer = infer(nil)
    rescue SerializerInferenceError
      @default_serializer = nil
    end
  end
  @default_serializer
end
default_serializer?() click to toggle source
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 85
def default_serializer?
  default_serializer != nil
end
infer(resource) click to toggle source

@param resource [Object] @return [Class] A serializer class @raise [SerializerInferenceError] if a serializer isn't found

# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 67
def infer(resource)
  serializer = (@infer_proc || default_infer_proc).call(resource)
  raise SerializerInferenceError.new(resource) unless serializer
  serializer
end
merge(explicit_mappings) click to toggle source

@param explicit_mappings [Hash{Class => Class}] @return [self]

# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 50
def merge(explicit_mappings)
  explicit_mappings.each do |resource_class, serializer_class|
    add(resource_class, serializer_class)
  end
  self
end

Private Instance Methods

default_infer_proc() click to toggle source
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 91
def default_infer_proc
  @default_infer_proc ||= proc do |resource|
    serializer = nil

    resource.class.ancestors.find do |ancestor|
      serializer = find_serializer_by_name(ancestor.name)
    end

    serializer
  end
end
find_serializer_by_name(name) click to toggle source
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 103
def find_serializer_by_name(name)
  if @explicit_mappings.key?(name)
    @explicit_mappings[name]
  else
    serializer_name_for_class_name(name).safe_constantize
  end
end
prefix(resource_class_name) click to toggle source
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 115
def prefix(resource_class_name)
  if namespace.blank?
    ""
  elsif resource_class_name.starts_with?("#{namespace}::")
    ""
  else
    "#{namespace}::"
  end
end
serializer_name_for_class_name(resource_class_name) click to toggle source
# File lib/simple_jsonapi/helpers/serializer_inferrer.rb, line 111
def serializer_name_for_class_name(resource_class_name)
  "#{prefix(resource_class_name)}#{resource_class_name}Serializer"
end