Class: Ixtlan::Babel::Factory

Inherits:
Object
  • Object
show all
Defined in:
lib/ixtlan/babel/factory.rb

Defined Under Namespace

Classes: EmptyArraySerializer

Constant Summary collapse

NANOSECONDS_IN_DAY =
86400*10**6
TIME_TO_S =
Proc.new do |t|
  t.strftime('%Y-%m-%dT%H:%M:%S.') + ("%06d" % t.usec) + t.strftime('%z')
end
DATE_TIME_TO_S =
Proc.new do |dt|
  dt.strftime('%Y-%m-%dT%H:%M:%S.') + ("%06d" % (dt.sec_fraction * NANOSECONDS_IN_DAY ) )[0..6] + dt.strftime('%z')
end
DEFAULT_MAP =
{
  'DateTime' => DATE_TIME_TO_S,
  'ActiveSupport::TimeWithZone' => TIME_TO_S,
  'Time' => TIME_TO_S
}

Instance Method Summary collapse

Constructor Details

#initialize(custom_serializers = {}) ⇒ Factory

Returns a new instance of Factory.



48
49
50
51
# File 'lib/ixtlan/babel/factory.rb', line 48

def initialize(custom_serializers = {})
  @map = DEFAULT_MAP.dup
  @map.merge!(custom_serializers)
end

Instance Method Details

#add(clazz, &block) ⇒ Object



53
54
55
# File 'lib/ixtlan/babel/factory.rb', line 53

def add( clazz, &block )
  @map[ clazz.to_s ] = block
end

#const_retrieve(const) ⇒ Object



84
85
86
87
88
89
90
# File 'lib/ixtlan/babel/factory.rb', line 84

def const_retrieve( const )
  obj = Object
  const.split(/::/).each do |part|
    obj = obj.const_get( part )
  end
  obj
end

#new(resource) ⇒ Object



75
76
77
78
# File 'lib/ixtlan/babel/factory.rb', line 75

def new( resource )
  warn 'DEPRECATED use new_serializer instead'
  new_serializer( resource )
end

#new_filter(clazz) ⇒ Object



80
81
82
# File 'lib/ixtlan/babel/factory.rb', line 80

def new_filter( clazz )
  const_retrieve( "#{clazz}Filter" ).new( clazz )
end

#new_serializer(resource) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/ixtlan/babel/factory.rb', line 57

def new_serializer( resource )
  if resource.respond_to?(:model)
    model = resource.model
  elsif resource.respond_to?( :collect) && !resource.respond_to?( :to_hash)
    if resource.empty?
      return EmptyArraySerializer.new
    else
      r = resource.first
      model = r.respond_to?( :model ) ? r.model : r.class
    end
  else
    model = resource.class
  end
  ser = const_retrieve( "#{model}Serializer" ).new( resource )
  ser.add_custom_serializers( @map )
  ser
end