class Conglomerate::TreeSerializer

Attributes

object[RW]

Public Class Methods

new(object) click to toggle source
# File lib/conglomerate/tree_serializer.rb, line 3
def initialize(object)
  self.object = object
end

Public Instance Methods

serialize(item = object) click to toggle source
# File lib/conglomerate/tree_serializer.rb, line 7
def serialize(item = object)
  if Conglomerate::Particle === item
    serialize_particle(item)
  elsif Conglomerate::Array === item
    serialize_array(item)
  elsif ::Array === item
    serialize_array(item)
  elsif item.is_a?(Numeric) || item.is_a?(String) || item.nil?
    item
  elsif item.respond_to?(:to_s)
    case item
    when DateTime
      item.to_time.utc.iso8601.sub(/\+00:00$/, "Z")
    when Time
      item.utc.iso8601.sub(/\+00:00$/, "Z")
    when Date
      item.strftime("%Y-%m-%d")
    else
      item
    end
  end
end

Private Instance Methods

cull_attribute(attribute) click to toggle source
# File lib/conglomerate/tree_serializer.rb, line 55
def cull_attribute(attribute)
  (attribute == nil) || (Conglomerate::Array === attribute && attribute.empty?)
end
serialize_array(array) click to toggle source
# File lib/conglomerate/tree_serializer.rb, line 49
def serialize_array(array)
  array.map do |item|
    serialize(item)
  end
end
serialize_particle(particle) click to toggle source
# File lib/conglomerate/tree_serializer.rb, line 34
def serialize_particle(particle)
  attributes = particle.class.attributes

  attributes.inject({}) do |hash, (attr, attr_metadata)|
    hash.tap do |h|
      attribute = particle.send(attr)
      attribute = attr_metadata[:default] if attribute == nil

      unless attr_metadata[:cull] && cull_attribute(attribute)
        h[attr.to_s] = serialize(attribute)
      end
    end
  end
end