From 8f6218c587043737d683f33bbb85d743a0cefd0a Mon Sep 17 00:00:00 2001 From: Adam Stanton Date: Sun, 10 Feb 2013 09:06:24 -0800 Subject: [PATCH 1/5] Create DefaultSerializer so that as_json uses same interface. This is to ensure that PORO's as_json is called if no serializer is specified. Original behaviour was that serializable_hash was being called, overriding the as_json method. --- active_model_serializers.gemspec | 1 + lib/active_model/array_serializer.rb | 11 ++++++++++- test/array_serializer_test.rb | 3 +-- test/test_fakes.rb | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/active_model_serializers.gemspec b/active_model_serializers.gemspec index 2128b44a..c1298bc6 100644 --- a/active_model_serializers.gemspec +++ b/active_model_serializers.gemspec @@ -20,5 +20,6 @@ Gem::Specification.new do |gem| gem.add_dependency 'activemodel', '>= 3.0' gem.add_development_dependency "rails", ">= 3.0" gem.add_development_dependency "pry" + gem.add_development_dependency "pry-nav" gem.add_development_dependency "simplecov" end diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index b55f7dd2..a3b1ba38 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -1,6 +1,15 @@ require "active_support/core_ext/class/attribute" module ActiveModel + class DefaultSerializer + attr_reader :object + def initialize(object) + @object = object + end + def serializable_hash + @object.as_json + end + end # Active Model Array Serializer # # It serializes an Array, checking if each element that implements @@ -30,7 +39,7 @@ module ActiveModel if serializer serializer.new(item, @options) else - item + DefaultSerializer.new(item) end end end diff --git a/test/array_serializer_test.rb b/test/array_serializer_test.rb index 152defc2..a238eae7 100644 --- a/test/array_serializer_test.rb +++ b/test/array_serializer_test.rb @@ -12,7 +12,7 @@ class ArraySerializerTest < ActiveModel::TestCase serializer = array.active_model_serializer.new(array, :scope => {:scope => true}) assert_equal([ { :model => "Model" }, - { :last_name => "Valim", :ok => true, :first_name => "Jose", :scope => true }, + { :first_name => "Jose", :last_name => "Valim", :ok => true, :scope => true }, { :title => "Comment1" } ], serializer.as_json) end @@ -51,5 +51,4 @@ class ArraySerializerTest < ActiveModel::TestCase { :title => "Post2" } ], serializer.as_json) end - end diff --git a/test/test_fakes.rb b/test/test_fakes.rb index 73d57088..789fde92 100644 --- a/test/test_fakes.rb +++ b/test/test_fakes.rb @@ -68,7 +68,7 @@ class MyUserSerializer < ActiveModel::Serializer end end -class CommentSerializer +class CommentSerializer < ActiveModel::Serializer def initialize(comment, options={}) @object = comment end From c4fcf96eb4940cd168cb748a72bf2d478b3c437e Mon Sep 17 00:00:00 2001 From: Adam Stanton Date: Sun, 10 Feb 2013 09:49:11 -0800 Subject: [PATCH 2/5] Move DefaultSerializer from array_serializer.rb to serializer.rb --- lib/active_model/array_serializer.rb | 9 --------- lib/active_model/serializer.rb | 16 ++++++++++++++++ test/test_fakes.rb | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index a3b1ba38..e3dc6ca0 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -1,15 +1,6 @@ require "active_support/core_ext/class/attribute" module ActiveModel - class DefaultSerializer - attr_reader :object - def initialize(object) - @object = object - end - def serializable_hash - @object.as_json - end - end # Active Model Array Serializer # # It serializes an Array, checking if each element that implements diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b070664c..25a4d63f 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -387,4 +387,20 @@ module ActiveModel ActiveSupport::Notifications.instrument(event_name, payload, &block) end end + + # DefaultSerializer + # + # Provides a constant interface for all items, particularly + # for ArraySerializer. + class DefaultSerializer + attr_reader :object, :options + + def initialize(object, options={}) + @object, @options = object, options + end + + def serializable_hash + @object.as_json + end + end end diff --git a/test/test_fakes.rb b/test/test_fakes.rb index 789fde92..73d57088 100644 --- a/test/test_fakes.rb +++ b/test/test_fakes.rb @@ -68,7 +68,7 @@ class MyUserSerializer < ActiveModel::Serializer end end -class CommentSerializer < ActiveModel::Serializer +class CommentSerializer def initialize(comment, options={}) @object = comment end From e470b09c6edcd0f7cc7025240c90fee7fafb3cf4 Mon Sep 17 00:00:00 2001 From: Adam Stanton Date: Mon, 11 Feb 2013 06:03:48 -0800 Subject: [PATCH 3/5] Remove pry-nav from gemspec. --- active_model_serializers.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/active_model_serializers.gemspec b/active_model_serializers.gemspec index c1298bc6..2128b44a 100644 --- a/active_model_serializers.gemspec +++ b/active_model_serializers.gemspec @@ -20,6 +20,5 @@ Gem::Specification.new do |gem| gem.add_dependency 'activemodel', '>= 3.0' gem.add_development_dependency "rails", ">= 3.0" gem.add_development_dependency "pry" - gem.add_development_dependency "pry-nav" gem.add_development_dependency "simplecov" end From b4616d737c1b7246fb49290351cf1d0801ed6d31 Mon Sep 17 00:00:00 2001 From: Adam Stanton Date: Mon, 11 Feb 2013 07:04:59 -0800 Subject: [PATCH 4/5] Restore order of fields in hash to original order. --- test/array_serializer_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/array_serializer_test.rb b/test/array_serializer_test.rb index a238eae7..d3001ac1 100644 --- a/test/array_serializer_test.rb +++ b/test/array_serializer_test.rb @@ -12,7 +12,7 @@ class ArraySerializerTest < ActiveModel::TestCase serializer = array.active_model_serializer.new(array, :scope => {:scope => true}) assert_equal([ { :model => "Model" }, - { :first_name => "Jose", :last_name => "Valim", :ok => true, :scope => true }, + { :last_name => "Valim", :ok => true, :first_name => "Jose", :scope => true }, { :title => "Comment1" } ], serializer.as_json) end From 5a55a6831ae78e62ed0d347358e3fb94cea0c0d7 Mon Sep 17 00:00:00 2001 From: Adam Stanton Date: Wed, 6 Mar 2013 11:48:50 -0800 Subject: [PATCH 5/5] Remove line break on the conditional statement. --- lib/active_model/array_serializer.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index a7701578..e92ad04a 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -31,8 +31,7 @@ module ActiveModel serializer = item.active_model_serializer end - serializable = serializer ? serializer.new(item, @options) - : DefaultSerializer.new(item) + serializable = serializer ? serializer.new(item, @options) : DefaultSerializer.new(item) if serializable.respond_to?(:serializable_hash) serializable.serializable_hash