module Grape::Formatter::Jsonapi

Public Class Methods

call(object, env) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 7
def call(object, env)
  return object if object.is_a?(String)
  return ::Grape::Json.dump(serialize(object, env)) if serializable?(object)
  return object.to_json if object.respond_to?(:to_json)

  ::Grape::Json.dump(object)
end

Private Class Methods

heterogeneous_collection?(collection) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 61
def heterogeneous_collection?(collection)
  collection.map { |item| item.class.name }.uniq.many?
end
jsonapi_options(env) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 86
def jsonapi_options(env)
  env['jsonapi_serializer_options'] || {}
end
jsonapi_serializable(object, options) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 47
def jsonapi_serializable(object, options)
  serializable_class(object, options)&.new(object, options)
end
serializable?(object) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 17
def serializable?(object)
  return false if object.nil?
  return true if object.respond_to?(:serializable_hash)
  return true if object.is_a?(Hash)

  serializable_collection?(object)
end
serializable_class(object, options) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 69
def serializable_class(object, options)
  klass_name = options['serializer'] || options[:serializer]
  klass_name ||= begin
    object = object.first if object.is_a?(Array)

    "#{(object.try(:model_name) || object.class).name}Serializer"
  end

  klass_name&.safe_constantize
end
serializable_collection(collection, options) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 51
def serializable_collection(collection, options)
  if heterogeneous_collection?(collection)
    collection.map do |o|
      serialize_resource(o, options)
    end
  else
    serialize_resource(collection, options)
  end
end
serializable_collection?(object) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 37
def serializable_collection?(object)
  object.respond_to?(:to_a) && object.all? do |o|
    o.respond_to?(:serializable_hash)
  end
end
serializable_object(object, options) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 43
def serializable_object(object, options)
  jsonapi_serializable(object, options) || object
end
serialize(object, env) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 25
def serialize(object, env)
  if object.respond_to?(:serializable_hash)
    serializable_object(object, jsonapi_options(env)).serializable_hash
  elsif serializable_collection?(object)
    serializable_collection(object, jsonapi_options(env))
  elsif object.is_a?(Hash)
    serialize_each_pair(object, env)
  else
    object
  end
end
serialize_each_pair(object, env) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 80
def serialize_each_pair(object, env)
  h = {}
  object.each_pair { |k, v| h[k] = serialize(v, env) }
  h
end
serialize_resource(resource, options) click to toggle source
# File lib/grape_jsonapi/formatter.rb, line 65
def serialize_resource(resource, options)
  jsonapi_serializable(resource, options)&.serializable_hash || resource.map(&:serializable_hash)
end