class Bluepine::Serializer

user_schema = Attributes.create(:object) do

string :username
string :email

end

user = <any object>

resolver = Resolver.new(schemas: [user_schema, …]) serializer.serialize(user_schema, user)

Constants

InvalidPredicate

Public Class Methods

new(resolver = nil) click to toggle source
# File lib/bluepine/serializer.rb, line 16
def initialize(resolver = nil)
  @resolver = resolver
end

Public Instance Methods

normalize_attribute(attribute, object, options = {}) click to toggle source

Override to make it accepts 3 arguments

# File lib/bluepine/serializer.rb, line 21
def normalize_attribute(attribute, object, options = {})
  super(attribute, options)
end
visit_array(attribute, object, options = {}) click to toggle source
# File lib/bluepine/serializer.rb, line 66
def visit_array(attribute, object, options = {})
  as = attribute.of

  Array(object).map do |item|
    # item#serialize_as will be used when of: option is not specified.
    # e.g. ListSerializer.schema has `array :data`
    # as = attribute.of || (item.serialize_as if item.respond_to?(:serialize_as))
    unless as.kind_of?(Symbol)
      item
    else
      visit(as, item, options)
    end
  end
end
visit_attribute(attribute, object, options = {}) click to toggle source

catch all

# File lib/bluepine/serializer.rb, line 26
def visit_attribute(attribute, object, options = {})
  attribute.serialize(attribute.value(object))
end
visit_object(attribute, object, options = {}) click to toggle source
# File lib/bluepine/serializer.rb, line 60
def visit_object(attribute, object, options = {})
  visit_object_handler(attribute, object) do |attr, value, attrs|
    attrs[attr.name] = visit(attr, value, options)
  end
end
visit_schema(attribute, object, options = {}) click to toggle source
# File lib/bluepine/serializer.rb, line 81
def visit_schema(attribute, object, options = {})
  attribute = resolver.schema(attribute.of)

  visit_object(attribute, object, options)
end

Private Instance Methods

execute_predicate(predicate, object) click to toggle source
# File lib/bluepine/serializer.rb, line 114
def execute_predicate(predicate, object)
  case predicate
  when Symbol
    get(object, predicate)
  when Proc
    predicate.call(object)
  else
    raise InvalidPredicate
  end
end
get(object, name) click to toggle source
# File lib/bluepine/serializer.rb, line 89
def get(object, name)
  object.respond_to?(name) ? object.send(name) : object&.fetch(name, nil)
end
serializable?(attr, object) click to toggle source
# File lib/bluepine/serializer.rb, line 104
def serializable?(attr, object)
  return unless attr.serializable?

  # check predicate :if and :unless
  return execute_predicate(attr.if, object)      if attr.if
  return !execute_predicate(attr.unless, object) if attr.unless

  true
end
visit_object_handler(attribute, object) { |attr, value, attrs| ... } click to toggle source
# File lib/bluepine/serializer.rb, line 93
def visit_object_handler(attribute, object)
  attribute.attributes.values.each_with_object({}) do |attr, attrs|
    next unless serializable?(attr, object)

    # get value for each field
    value = get(object, attr.method)

    yield(attr, value, attrs)
  end
end