class Ser::Ializer
Public Class Methods
attribute_names()
click to toggle source
# File lib/ser/ializer.rb, line 92 def attribute_names _attributes.values.map(&:name) end
config()
click to toggle source
# File lib/ser/ializer.rb, line 11 def config @config ||= if equal? Ser::Ializer ::Ializer.config else superclass.config end end
nested(name, options = {}, &block)
click to toggle source
# File lib/ser/ializer.rb, line 39 def nested(name, options = {}, &block) if block deser = create_anon_class deser.class_eval(&block) options[:deser] = deser end add_attribute(Field.new(name, options, config)) end
property(name, options = {}, &block)
click to toggle source
Public DSL
# File lib/ser/ializer.rb, line 27 def property(name, options = {}, &block) return add_attribute(Field.new(name, options, config, &block)) if options[:deser] return default(name, options, &block) unless options[:type] meth = lookup_method(options[:type]) return meth.call(name, options, &block) if meth default(name, options, &block) end
register(method_name, deser, *matchers)
click to toggle source
# File lib/ser/ializer.rb, line 68 def register(method_name, deser, *matchers) raise ArgumentError, 'register should only be called on the Ser::Ializer class' unless self == Ser::Ializer define_singleton_method(method_name) do |name, options = {}, &block| options[:deser] = deser add_attribute Field.new(name, options, config, &block) end matchers.each do |matcher| method_registry[matcher.to_s.to_sym] = method_name end end
register_default(deser)
click to toggle source
# File lib/ser/ializer.rb, line 81 def register_default(deser) define_singleton_method('default') do |name, options = {}, &block| raise ArgumentError, warning_message(name) if config.raise_on_default? puts warning_message(name) if config.warn_on_default? options[:deser] = deser add_attribute Field.new(name, options, config, &block) end end
serialize(object, context = nil)
click to toggle source
End Public DSL
# File lib/ser/ializer.rb, line 56 def serialize(object, context = nil) return serialize_one(object, context) unless valid_enumerable?(object) return [] if object.empty? object.map { |o| serialize_one(o, context) } end
serialize_json(object, context = nil)
click to toggle source
# File lib/ser/ializer.rb, line 64 def serialize_json(object, context = nil) MultiJson.dump(serialize(object, context)) end
setup() { |config| ... }
click to toggle source
# File lib/ser/ializer.rb, line 20 def setup @config = config.dup yield @config end
with(deser)
click to toggle source
# File lib/ser/ializer.rb, line 49 def with(deser) deser._attributes.values.each do |field| add_composed_attribute(field, deser) end end
Protected Class Methods
_attributes()
click to toggle source
# File lib/ser/ializer.rb, line 114 def _attributes @attributes ||= if equal? Ser::Ializer ActiveSupport::HashWithIndifferentAccess.new else superclass._attributes.dup end end
create_anon_class()
click to toggle source
# File lib/ser/ializer.rb, line 98 def create_anon_class Class.new(Ser::Ializer) end
lookup_method(type)
click to toggle source
# File lib/ser/ializer.rb, line 106 def lookup_method(type) method_name = method_registry[type.to_s.to_sym] return nil unless method_name method(method_name) end
method_registry()
click to toggle source
# File lib/ser/ializer.rb, line 102 def method_registry @@method_registry end
Private Class Methods
add_attribute(field)
click to toggle source
# File lib/ser/ializer.rb, line 129 def add_attribute(field) _attributes[field.key] = field define_singleton_method field.name do |object, context| value = field.get_value(object, context) serialize_field(field, value, context) end end
add_composed_attribute(field, deser)
click to toggle source
# File lib/ser/ializer.rb, line 139 def add_composed_attribute(field, deser) _attributes[field.key] = field define_singleton_method field.name do |object, context| deser.public_send(field.name, object, context) end end
fields_for_serialization(context)
click to toggle source
# File lib/ser/ializer.rb, line 169 def fields_for_serialization(context) field_names = fields_names_for_serialization(context) return _attributes.values unless field_names _attributes.values_at(*field_names).compact end
fields_names_for_serialization(context)
click to toggle source
# File lib/ser/ializer.rb, line 177 def fields_names_for_serialization(context) return nil unless context if context.is_a?(Hash) context = context.with_indifferent_access return context[:attributes] || context[:include] end return context.attributes if context.respond_to?(:attributes) nil end
serialize_field(field, value, context)
click to toggle source
# File lib/ser/ializer.rb, line 147 def serialize_field(field, value, context) return nil if value.nil? return field.serialize(value, context) unless valid_enumerable?(value) return nil if value.empty? value.map { |v| field.serialize(v, context) } end
serialize_one(object, context)
click to toggle source
# File lib/ser/ializer.rb, line 157 def serialize_one(object, context) fields_for_serialization(context).each_with_object({}) do |field, data| next unless field.valid_for_context?(object, context) value = public_send(field.name, object, context) next if value.nil? data[field.key] = value end end
valid_enumerable?(object)
click to toggle source
# File lib/ser/ializer.rb, line 190 def valid_enumerable?(object) return true if object.is_a? Array return true if defined?(ActiveRecord) && object.is_a?(ActiveRecord::Relation) false end
warning_message(name)
click to toggle source
# File lib/ser/ializer.rb, line 125 def warning_message(name) "Warning: #{self} using default DeSer for property #{name}" end