From b8f01ba2f325ae52fee419e74c568b41e07e188b Mon Sep 17 00:00:00 2001 From: Tee Parham Date: Sat, 15 Sep 2012 09:31:51 -0700 Subject: [PATCH] move ArraySerializer to separate file --- lib/active_model/array_serializer.rb | 58 ++++++++++++++++++++++++++++ lib/active_model/serializer.rb | 54 -------------------------- lib/active_model_serializers.rb | 1 + 3 files changed, 59 insertions(+), 54 deletions(-) create mode 100644 lib/active_model/array_serializer.rb diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb new file mode 100644 index 00000000..18577963 --- /dev/null +++ b/lib/active_model/array_serializer.rb @@ -0,0 +1,58 @@ +require "active_support/core_ext/class/attribute" + +module ActiveModel + # Active Model Array Serializer + # + # It serializes an Array, checking if each element that implements + # the +active_model_serializer+ method. + # + # To disable serialization of root elements: + # + # ActiveModel::ArraySerializer.root = false + # + class ArraySerializer + attr_reader :object, :options + + class_attribute :root + + def initialize(object, options={}) + @object, @options = object, options + end + + def serializable_array + @object.map do |item| + if @options.has_key? :each_serializer + serializer = @options[:each_serializer] + elsif item.respond_to?(:active_model_serializer) + serializer = item.active_model_serializer + end + + if serializer + serializer.new(item, @options) + else + item + end + end + end + + def as_json(*args) + @options[:hash] = hash = {} + @options[:unique_values] = {} + + array = serializable_array.map do |item| + if item.respond_to?(:serializable_hash) + item.serializable_hash + else + item.as_json + end + end + + if root = @options[:root] + hash.merge!(root => array) + else + array + end + end + end + +end diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 1dbc5fde..a301a7f9 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -27,60 +27,6 @@ module ActiveModel end end - # Active Model Array Serializer - # - # It serializes an Array, checking if each element that implements - # the +active_model_serializer+ method. - # - # To disable serialization of root elements: - # - # ActiveModel::ArraySerializer.root = false - # - class ArraySerializer - attr_reader :object, :options - - class_attribute :root - - def initialize(object, options={}) - @object, @options = object, options - end - - def serializable_array - @object.map do |item| - if @options.has_key? :each_serializer - serializer = @options[:each_serializer] - elsif item.respond_to?(:active_model_serializer) - serializer = item.active_model_serializer - end - - if serializer - serializer.new(item, @options) - else - item - end - end - end - - def as_json(*args) - @options[:hash] = hash = {} - @options[:unique_values] = {} - - array = serializable_array.map do |item| - if item.respond_to?(:serializable_hash) - item.serializable_hash - else - item.as_json - end - end - - if root = @options[:root] - hash.merge!(root => array) - else - array - end - end - end - # Active Model Serializer # # Provides a basic serializer implementation that allows you to easily diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 3d44bac6..bfa1639a 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -2,6 +2,7 @@ require "active_support" require "active_support/core_ext/string/inflections" require "active_support/notifications" require "active_model" +require "active_model/array_serializer" require "active_model/serializer" require "set"