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