class Surrealist::Serializer

Abstract class to be inherited from

@example Usage

class CatSerializer < Surrealist::Serializer
  json_schema { { age: Integer, age_group: String } }

  def age_group
    age <= 5 ? 'kitten' : 'cat'
  end
end

class Cat
  include Surrealist
  attr_reader :age

  surrealize_with CatSerializer

  def initialize(age)
    @age = age
  end
end

Cat.new(12).surrealize # Checks for schema in CatSerializer (if .surrealize_with is stated)
# => '{ "age": 12, "age_group": "cat" }'

CatSerializer.new(Cat.new(3)).surrealize # explicit usage of CatSerializer
# => '{ "age": 3, "age_group": "kitten" }'

Attributes

context[R]
object[R]

Public Class Methods

method_defined?(method) click to toggle source

Only lookup for methods defined in Surrealist::Serializer subclasses

to prevent invoke of Kernel methods

@param [Symbol] method method to be invoked

@return [Boolean]

Calls superclass method
# File lib/surrealist/serializer.rb, line 58
def method_defined?(method)
  return true if instance_methods(false).include?(method)
  return false if superclass == Surrealist::Serializer

  super
end
new(object, **context) click to toggle source

NOTE: context will work only when using serializer explicitly,

e.g `CatSerializer.new(Cat.new(3), food: CatFood.new)`
And then food will be available inside serializer via `context[:food]`
# File lib/surrealist/serializer.rb, line 76
def initialize(object, **context)
  @object = wrap_hash_into_struct(object)
  @context = context
end
private_method_defined?(method) click to toggle source
Calls superclass method
# File lib/surrealist/serializer.rb, line 65
def private_method_defined?(method)
  return true if private_instance_methods(false).include?(method)
  return false if superclass == Surrealist::Serializer

  super
end
serializer_context(*array) click to toggle source

Defines instance methods that read values from the context hash.

@param [Array<Symbol>] array

an array of symbols which represent method names

@raise ArgumentError if type of argument is not an array of symbols

# File lib/surrealist/serializer.rb, line 41
def serializer_context(*array)
  unless array.all? { |i| i.is_a? Symbol }
    raise ArgumentError, 'Please provide an array of symbols to `.serializer_context`'
  end

  array.each { |method| define_method(method) { context[method] } }
end
Also aliased as: serializer_contexts
serializer_contexts(*array)

Plural form ¯_(ツ)_/¯

Alias for: serializer_context

Public Instance Methods

build_schema(**args) click to toggle source

Passes build_schema to Surrealist

# File lib/surrealist/serializer.rb, line 91
def build_schema(**args)
  if Helper.collection?(object)
    build_collection_schema(args)
  else
    Surrealist.build_schema(instance: self, **args)
  end
end
surrealize(**args) click to toggle source

Checks whether object is a collection or an instance and serializes it

# File lib/surrealist/serializer.rb, line 82
def surrealize(**args)
  if Helper.collection?(object)
    Surrealist.surrealize_collection(object, args.merge(context: context))
  else
    Surrealist.surrealize(instance: self, **args)
  end
end

Private Instance Methods

build_collection_schema(**args) click to toggle source

Maps collection and builds schema for each instance.

# File lib/surrealist/serializer.rb, line 104
def build_collection_schema(**args)
  object.map { |object| self.class.new(object, context).build_schema(args) }
end
method_missing(method, *args, &block) click to toggle source

Methods not found inside serializer will be invoked on the object

Calls superclass method
# File lib/surrealist/serializer.rb, line 109
def method_missing(method, *args, &block)
  return super unless object.respond_to?(method)

  object.public_send(method, *args, &block)
end
respond_to_missing?(method, include_private = false) click to toggle source

Methods not found inside serializer will be invoked on the object

Calls superclass method
# File lib/surrealist/serializer.rb, line 116
def respond_to_missing?(method, include_private = false)
  object.respond_to?(method) || super
end
wrap_hash_into_struct(object) click to toggle source
# File lib/surrealist/serializer.rb, line 120
def wrap_hash_into_struct(object)
  object.instance_of?(Hash) ? OpenStruct.new(object) : object
end