From 37114e9d5b7219c1b990bb426759a97bbc6d6b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sat, 13 Jun 2015 14:54:51 -0300 Subject: [PATCH 01/14] removing unnecessary root parameter on fragment cache --- lib/active_model/serializer/adapter.rb | 2 +- lib/active_model/serializer/adapter/fragment_cache.rb | 3 +-- test/adapter/fragment_cache_test.rb | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index bc658ba2..b8e6bbcd 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -48,7 +48,7 @@ module ActiveModel yield end elsif is_fragment_cached? - FragmentCache.new(self, @cached_serializer, @options, @root).fetch + FragmentCache.new(self, @cached_serializer, @options).fetch else yield end diff --git a/lib/active_model/serializer/adapter/fragment_cache.rb b/lib/active_model/serializer/adapter/fragment_cache.rb index 2b7596a4..231ddaed 100644 --- a/lib/active_model/serializer/adapter/fragment_cache.rb +++ b/lib/active_model/serializer/adapter/fragment_cache.rb @@ -5,8 +5,7 @@ module ActiveModel attr_reader :serializer - def initialize(adapter, serializer, options, root) - @root = root + def initialize(adapter, serializer, options) @options = options @adapter = adapter @serializer = serializer diff --git a/test/adapter/fragment_cache_test.rb b/test/adapter/fragment_cache_test.rb index 69303557..d249637a 100644 --- a/test/adapter/fragment_cache_test.rb +++ b/test/adapter/fragment_cache_test.rb @@ -8,7 +8,7 @@ module ActiveModel @role = Role.new(name: 'Great Author', description:nil) @role.author = [@author] @role_serializer = RoleSerializer.new(@role) - @role_hash = FragmentCache.new(RoleSerializer.adapter.new(@role_serializer), @role_serializer, {}, nil) + @role_hash = FragmentCache.new(RoleSerializer.adapter.new(@role_serializer), @role_serializer, {}) end def test_fragment_fetch_with_virtual_attributes From 5932da64efacc60b986a967d8dd465a0039654d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sat, 13 Jun 2015 15:02:11 -0300 Subject: [PATCH 02/14] creating flatten_json adapter --- lib/active_model/serializer/adapter.rb | 2 +- .../serializer/adapter/flatten_json.rb | 18 ++++++++++++++++++ lib/active_model/serializer/adapter/json.rb | 6 +----- 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 lib/active_model/serializer/adapter/flatten_json.rb diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index b8e6bbcd..ca1995fd 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -82,7 +82,7 @@ module ActiveModel end def root - @options.fetch(:root) { serializer.json_key } + serializer.json_key end def include_meta(json) diff --git a/lib/active_model/serializer/adapter/flatten_json.rb b/lib/active_model/serializer/adapter/flatten_json.rb new file mode 100644 index 00000000..bbcd023a --- /dev/null +++ b/lib/active_model/serializer/adapter/flatten_json.rb @@ -0,0 +1,18 @@ +require 'active_model/serializer/adapter/json/fragment_cache' + +module ActiveModel + class Serializer + class Adapter + class FlattenJson < Json + def serializable_hash(options = {}) + super + @result + end + end + + def fragment_cache(cached_hash, non_cached_hash) + Json::FragmentCache.new().fragment_cache(cached_hash, non_cached_hash) + end + end + end +end diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index 88c49d6c..ebd021d5 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -37,11 +37,7 @@ module ActiveModel @result = @core.merge @hash end - if root - @result = { root => @result } - else - @result - end + { root => @result } end end From c8fcb60a5d0a9c5cea4efb0688505cf1ab7d58f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sat, 13 Jun 2015 15:21:53 -0300 Subject: [PATCH 03/14] addung fragment_cache method to Adapter::Json --- lib/active_model/serializer/adapter/json.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index ebd021d5..11076229 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -39,10 +39,11 @@ module ActiveModel { root => @result } end - end - def fragment_cache(cached_hash, non_cached_hash) - Json::FragmentCache.new().fragment_cache(cached_hash, non_cached_hash) + def fragment_cache(cached_hash, non_cached_hash) + Json::FragmentCache.new().fragment_cache(cached_hash, non_cached_hash) + end + end end end From 1c3a180a20fac9e07f7281529700f7c6b33adbbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sat, 13 Jun 2015 15:22:43 -0300 Subject: [PATCH 04/14] disable root as flag option --- lib/active_model/serializer.rb | 12 ++---------- lib/active_model/serializer/adapter/flatten_json.rb | 6 +++--- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 18a44da0..9079b030 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -145,14 +145,6 @@ module ActiveModel adapter_class end - def self._root - @@root ||= false - end - - def self._root=(root) - @@root = root - end - def self.root_name name.demodulize.underscore.sub(/_serializer$/, '') if name end @@ -162,7 +154,7 @@ module ActiveModel def initialize(object, options = {}) @object = object @options = options - @root = options[:root] || (self.class._root ? self.class.root_name : false) + @root = options[:root] @meta = options[:meta] @meta_key = options[:meta_key] @scope = options[:scope] @@ -176,7 +168,7 @@ module ActiveModel end def json_key - if root == true || root.nil? + if root.nil? self.class.root_name else root diff --git a/lib/active_model/serializer/adapter/flatten_json.rb b/lib/active_model/serializer/adapter/flatten_json.rb index bbcd023a..397a53b8 100644 --- a/lib/active_model/serializer/adapter/flatten_json.rb +++ b/lib/active_model/serializer/adapter/flatten_json.rb @@ -8,10 +8,10 @@ module ActiveModel super @result end - end - def fragment_cache(cached_hash, non_cached_hash) - Json::FragmentCache.new().fragment_cache(cached_hash, non_cached_hash) + def root + false + end end end end From a0753cb0bcbf476de014b73d337d721d84b36fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sun, 14 Jun 2015 03:25:00 -0300 Subject: [PATCH 05/14] autoloading new flatten son adapter --- lib/active_model/serializer/adapter.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index ca1995fd..fc942755 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -5,6 +5,7 @@ module ActiveModel class Adapter extend ActiveSupport::Autoload autoload :Json + autoload :FlattenJson autoload :Null autoload :JsonApi @@ -82,7 +83,7 @@ module ActiveModel end def root - serializer.json_key + serializer.json_key.to_sym end def include_meta(json) From 2bf91a0c0e5c146451b793793c5bdbf5406e5f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sun, 14 Jun 2015 03:25:20 -0300 Subject: [PATCH 06/14] updating adapters to follow new root logic --- lib/active_model/serializer/adapter/flatten_json.rb | 2 -- lib/active_model/serializer/adapter/json_api.rb | 1 - lib/active_model/serializer/array_serializer.rb | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/active_model/serializer/adapter/flatten_json.rb b/lib/active_model/serializer/adapter/flatten_json.rb index 397a53b8..17cff8f5 100644 --- a/lib/active_model/serializer/adapter/flatten_json.rb +++ b/lib/active_model/serializer/adapter/flatten_json.rb @@ -1,5 +1,3 @@ -require 'active_model/serializer/adapter/json/fragment_cache' - module ActiveModel class Serializer class Adapter diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index 8028a075..39e6815c 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -6,7 +6,6 @@ module ActiveModel class JsonApi < Adapter def initialize(serializer, options = {}) super - serializer.root = true @hash = { data: [] } if fields = options.delete(:fields) diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index a5f7b6a1..f88a101a 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -21,7 +21,7 @@ module ActiveModel end def json_key - @objects.first.json_key if @objects.first + @objects.first.json_key.pluralize if @objects.first end def root=(root) From b2f1947d4aa7eb0d7657fa685dfabae3687f86ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sun, 14 Jun 2015 17:24:48 -0300 Subject: [PATCH 07/14] removing unseless root method --- lib/active_model/serializer/adapter.rb | 2 +- lib/active_model/serializer/adapter/flatten_json.rb | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index fc942755..5d33650e 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -87,7 +87,7 @@ module ActiveModel end def include_meta(json) - json[meta_key] = meta if meta && root + json[meta_key] = meta if meta json end end diff --git a/lib/active_model/serializer/adapter/flatten_json.rb b/lib/active_model/serializer/adapter/flatten_json.rb index 17cff8f5..87b3ea8c 100644 --- a/lib/active_model/serializer/adapter/flatten_json.rb +++ b/lib/active_model/serializer/adapter/flatten_json.rb @@ -6,10 +6,6 @@ module ActiveModel super @result end - - def root - false - end end end end From 8e1214b4c5ae5c5ae27f0b1531ac5fc6e9d8e256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Mon, 15 Jun 2015 02:48:39 -0300 Subject: [PATCH 08/14] force to use flattenJson when dealing with ArraySerializer --- lib/active_model/serializer/adapter/json.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index 11076229..e6dff0dd 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -6,7 +6,7 @@ module ActiveModel class Json < Adapter def serializable_hash(options = {}) if serializer.respond_to?(:each) - @result = serializer.map{|s| self.class.new(s).serializable_hash } + @result = serializer.map{|s| FlattenJson.new(s).serializable_hash } else @hash = {} From 2e465079714eddfcce9813c4cf340a6272458115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Mon, 15 Jun 2015 02:50:06 -0300 Subject: [PATCH 09/14] avoiding nil cases when dynamically creating a class --- lib/active_model/serializer/adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index 5d33650e..9c95f5ee 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -83,7 +83,7 @@ module ActiveModel end def root - serializer.json_key.to_sym + serializer.json_key.to_sym if serializer.json_key end def include_meta(json) From 1ea5608e789b66c7295bb0b8c02db825207d3ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Mon, 15 Jun 2015 13:39:36 -0300 Subject: [PATCH 10/14] updating tests to match new adapters structure --- lib/action_controller/serialization.rb | 2 +- lib/active_model/serializer/adapter.rb | 3 ++- .../serializer/array_serializer.rb | 4 +-- lib/active_model/serializer/fieldset.rb | 2 +- .../explicit_serializer_test.rb | 10 +++----- test/action_controller/serialization_test.rb | 25 ++++++++++++------- test/adapter/json/belongs_to_test.rb | 6 ++--- test/adapter/json/collection_test.rb | 8 +++--- test/adapter/json/has_many_test.rb | 2 +- test/adapter/json_api/collection_test.rb | 1 - test/adapter/json_test.rb | 2 +- test/adapter_test.rb | 2 +- test/serializers/adapter_for_test.rb | 2 +- test/serializers/attribute_test.rb | 4 +-- test/serializers/configuration_test.rb | 2 +- test/serializers/meta_test.rb | 16 ++++++------ test/test_helper.rb | 1 + 17 files changed, 49 insertions(+), 43 deletions(-) diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index 6fcb5df7..415167ef 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -6,7 +6,7 @@ module ActionController include ActionController::Renderers - ADAPTER_OPTION_KEYS = [:include, :fields, :root, :adapter] + ADAPTER_OPTION_KEYS = [:include, :fields, :adapter] included do class_attribute :_serialization_scope diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index 9c95f5ee..0cbab9d3 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -22,7 +22,8 @@ module ActiveModel def as_json(options = {}) hash = serializable_hash(options) - include_meta(hash) + include_meta(hash) unless self.class == FlattenJson + hash end def self.create(resource, options = {}) diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index f88a101a..b05cb1dd 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -7,8 +7,6 @@ module ActiveModel attr_reader :meta, :meta_key def initialize(objects, options = {}) - options.merge!(root: nil) - @objects = objects.map do |object| serializer_class = options.fetch( :serializer, @@ -21,7 +19,7 @@ module ActiveModel end def json_key - @objects.first.json_key.pluralize if @objects.first + @objects.first.json_key if @objects.first end def root=(root) diff --git a/lib/active_model/serializer/fieldset.rb b/lib/active_model/serializer/fieldset.rb index a09fad18..911dac25 100644 --- a/lib/active_model/serializer/fieldset.rb +++ b/lib/active_model/serializer/fieldset.rb @@ -12,7 +12,7 @@ module ActiveModel end def fields_for(serializer) - key = serializer.json_key || serializer.class.root_name + key = serializer.json_key fields[key.to_sym] end diff --git a/test/action_controller/explicit_serializer_test.rb b/test/action_controller/explicit_serializer_test.rb index d4cbdb4d..126db5c7 100644 --- a/test/action_controller/explicit_serializer_test.rb +++ b/test/action_controller/explicit_serializer_test.rb @@ -77,12 +77,10 @@ module ActionController get :render_array_using_explicit_serializer assert_equal 'application/json', @response.content_type - expected = { - 'paginated' => [ - { 'name' => 'Name 1' }, - { 'name' => 'Name 2' } - ] - } + expected = [ + { 'name' => 'Name 1' }, + { 'name' => 'Name 2' } + ] assert_equal expected.to_json, @response.body end diff --git a/test/action_controller/serialization_test.rb b/test/action_controller/serialization_test.rb index ff646a97..5fc4c529 100644 --- a/test/action_controller/serialization_test.rb +++ b/test/action_controller/serialization_test.rb @@ -10,13 +10,17 @@ module ActionController end def render_using_custom_root - @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) - render json: @profile, root: "custom_root" + with_adapter ActiveModel::Serializer::Adapter::Json do + @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) + render json: @profile, root: "custom_root" + end end def render_using_custom_root_and_meta - @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) - render json: @profile, root: "custom_root", meta: { total: 10 } + with_adapter ActiveModel::Serializer::Adapter::Json do + @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) + render json: @profile, root: "custom_root", meta: { total: 10 } + end end def render_using_default_adapter_root @@ -34,11 +38,13 @@ module ActionController end def render_array_using_custom_root_and_meta - array = [ - Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }), - Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' }) - ] - render json: array, root: "custom_root", meta: { total: 10 } + with_adapter ActiveModel::Serializer::Adapter::Json do + array = [ + Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }), + Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' }) + ] + render json: array, root: "custom_root", meta: { total: 10 } + end end def render_array_using_implicit_serializer @@ -219,6 +225,7 @@ module ActionController def test_render_array_using_custom_root_and_meta get :render_array_using_custom_root_and_meta + assert_equal 'application/json', @response.content_type expected = { custom_root: [ diff --git a/test/adapter/json/belongs_to_test.rb b/test/adapter/json/belongs_to_test.rb index 1252fe38..1d20d1c9 100644 --- a/test/adapter/json/belongs_to_test.rb +++ b/test/adapter/json/belongs_to_test.rb @@ -25,21 +25,21 @@ module ActiveModel end def test_includes_post - assert_equal({id: 42, title: 'New Post', body: 'Body'}, @adapter.serializable_hash[:post]) + assert_equal({id: 42, title: 'New Post', body: 'Body'}, @adapter.serializable_hash[:comment][:post]) end def test_include_nil_author serializer = PostSerializer.new(@anonymous_post) adapter = ActiveModel::Serializer::Adapter::Json.new(serializer) - assert_equal({title: "Hello!!", body: "Hello, world!!", id: 43, comments: [], blog: {id: 999, name: "Custom blog"}, author: nil}, adapter.serializable_hash) + assert_equal({post: {title: "Hello!!", body: "Hello, world!!", id: 43, comments: [], blog: {id: 999, name: "Custom blog"}, author: nil}}, adapter.serializable_hash) end def test_include_nil_author_with_specified_serializer serializer = PostPreviewSerializer.new(@anonymous_post) adapter = ActiveModel::Serializer::Adapter::Json.new(serializer) - assert_equal({title: "Hello!!", body: "Hello, world!!", id: 43, comments: [], author: nil}, adapter.serializable_hash) + assert_equal({posts: {title: "Hello!!", body: "Hello, world!!", id: 43, comments: [], author: nil}}, adapter.serializable_hash) end end end diff --git a/test/adapter/json/collection_test.rb b/test/adapter/json/collection_test.rb index d91fb2b6..018a6b23 100644 --- a/test/adapter/json/collection_test.rb +++ b/test/adapter/json/collection_test.rb @@ -28,16 +28,16 @@ module ActiveModel @serializer = ArraySerializer.new([@blog], serializer: CustomBlogSerializer) @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer) - expected = [{ + expected = {custom_blog:[{ id: 1, special_attribute: "Special", articles: [{id: 1,title: "Hello!!", body: "Hello, world!!"}, {id: 2, title: "New Post", body: "Body"}] - }] + }]} assert_equal expected, @adapter.serializable_hash end def test_include_multiple_posts - expected = [{ + expected = { post: [{ title: "Hello!!", body: "Hello, world!!", id: 1, @@ -63,7 +63,7 @@ module ActiveModel id: 999, name: "Custom blog" } - }] + }]} assert_equal expected, @adapter.serializable_hash end end diff --git a/test/adapter/json/has_many_test.rb b/test/adapter/json/has_many_test.rb index b73af9f5..19fe16cd 100644 --- a/test/adapter/json/has_many_test.rb +++ b/test/adapter/json/has_many_test.rb @@ -26,7 +26,7 @@ module ActiveModel assert_equal([ {id: 1, body: 'ZOMG A COMMENT'}, {id: 2, body: 'ZOMG ANOTHER COMMENT'} - ], @adapter.serializable_hash[:comments]) + ], @adapter.serializable_hash[:post][:comments]) end end end diff --git a/test/adapter/json_api/collection_test.rb b/test/adapter/json_api/collection_test.rb index f17285fa..f0d4eff1 100644 --- a/test/adapter/json_api/collection_test.rb +++ b/test/adapter/json_api/collection_test.rb @@ -86,7 +86,6 @@ module ActiveModel } } ] - assert_equal(expected, @adapter.serializable_hash[:data]) end diff --git a/test/adapter/json_test.rb b/test/adapter/json_test.rb index 52c9d8fb..efc4c834 100644 --- a/test/adapter/json_test.rb +++ b/test/adapter/json_test.rb @@ -25,7 +25,7 @@ module ActiveModel assert_equal([ {id: 1, body: 'ZOMG A COMMENT'}, {id: 2, body: 'ZOMG ANOTHER COMMENT'} - ], @adapter.serializable_hash[:comments]) + ], @adapter.serializable_hash[:post][:comments]) end end end diff --git a/test/adapter_test.rb b/test/adapter_test.rb index d76559d5..7268c386 100644 --- a/test/adapter_test.rb +++ b/test/adapter_test.rb @@ -31,7 +31,7 @@ module ActiveModel def test_create_adapter adapter = ActiveModel::Serializer::Adapter.create(@serializer) - assert_equal ActiveModel::Serializer::Adapter::Json, adapter.class + assert_equal ActiveModel::Serializer::Adapter::FlattenJson, adapter.class end def test_create_adapter_with_override diff --git a/test/serializers/adapter_for_test.rb b/test/serializers/adapter_for_test.rb index 60641080..507b6bf1 100644 --- a/test/serializers/adapter_for_test.rb +++ b/test/serializers/adapter_for_test.rb @@ -11,7 +11,7 @@ module ActiveModel def test_returns_default_adapter adapter = ActiveModel::Serializer.adapter - assert_equal ActiveModel::Serializer::Adapter::Json, adapter + assert_equal ActiveModel::Serializer::Adapter::FlattenJson, adapter end def test_overwrite_adapter_with_symbol diff --git a/test/serializers/attribute_test.rb b/test/serializers/attribute_test.rb index b75df48c..1b52216a 100644 --- a/test/serializers/attribute_test.rb +++ b/test/serializers/attribute_test.rb @@ -15,13 +15,13 @@ module ActiveModel def test_json_serializable_hash adapter = ActiveModel::Serializer::Adapter::Json.new(@blog_serializer) - assert_equal({:id=>1, :title=>"AMS Hints"}, adapter.serializable_hash) + assert_equal({alternate_blog: { id:1, title:"AMS Hints"}}, adapter.serializable_hash) end def test_attribute_inheritance_with_key inherited_klass = Class.new(AlternateBlogSerializer) blog_serializer = inherited_klass.new(@blog) - adapter = ActiveModel::Serializer::Adapter::Json.new(blog_serializer) + adapter = ActiveModel::Serializer::Adapter::FlattenJson.new(blog_serializer) assert_equal({:id=>1, :title=>"AMS Hints"}, adapter.serializable_hash) end diff --git a/test/serializers/configuration_test.rb b/test/serializers/configuration_test.rb index 9c6c5fea..e623cde9 100644 --- a/test/serializers/configuration_test.rb +++ b/test/serializers/configuration_test.rb @@ -8,7 +8,7 @@ module ActiveModel end def test_default_adapter - assert_equal :json, ActiveModel::Serializer.config.adapter + assert_equal :flatten_json, ActiveModel::Serializer.config.adapter end end end diff --git a/test/serializers/meta_test.rb b/test/serializers/meta_test.rb index 2ec90611..b6201574 100644 --- a/test/serializers/meta_test.rb +++ b/test/serializers/meta_test.rb @@ -12,9 +12,10 @@ module ActiveModel end def test_meta_is_present_with_root - adapter = load_adapter(root: "blog", meta: {total: 10}) + serializer = AlternateBlogSerializer.new(@blog, root: "blog", meta: {total: 10}) + adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog') expected = { - "blog" => { + blog: { id: 1, title: "AMS Hints" }, @@ -35,9 +36,10 @@ module ActiveModel end def test_meta_key_is_used - adapter = load_adapter(root: "blog", meta: {total: 10}, meta_key: "haha_meta") + serializer = AlternateBlogSerializer.new(@blog, root: 'blog', meta: {total: 10}, meta_key: "haha_meta") + adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog') expected = { - "blog" => { + blog: { id: 1, title: "AMS Hints" }, @@ -50,7 +52,7 @@ module ActiveModel def test_meta_is_not_present_on_arrays_without_root serializer = ArraySerializer.new([@blog], meta: {total: 10}) - adapter = ActiveModel::Serializer::Adapter::Json.new(serializer) + adapter = ActiveModel::Serializer::Adapter::FlattenJson.new(serializer) expected = [{ id: 1, name: "AMS Hints", @@ -71,7 +73,7 @@ module ActiveModel serializer = ArraySerializer.new([@blog], meta: {total: 10}, meta_key: "haha_meta") adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog') expected = { - 'blog' => [{ + blog: [{ id: 1, name: "AMS Hints", writer: { @@ -98,7 +100,7 @@ module ActiveModel options.partition { |k, _| ActionController::Serialization::ADAPTER_OPTION_KEYS.include? k }.map { |h| Hash[h] } serializer = AlternateBlogSerializer.new(@blog, serializer_opts) - ActiveModel::Serializer::Adapter::Json.new(serializer, adapter_opts) + ActiveModel::Serializer::Adapter::FlattenJson.new(serializer, adapter_opts) end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index a8b48355..be06c505 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -20,6 +20,7 @@ class Foo < Rails::Application config.active_support.test_order = :random config.logger = Logger.new(nil) ActionController::Base.cache_store = :memory_store + ActiveModel::Serializer.config.adapter = :flatten_json end end FileUtils.mkdir_p(File.expand_path('../../tmp/cache', __FILE__)) From d061b2e9f468df91863ca663afe9c58ce26fd445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Mon, 15 Jun 2015 13:49:24 -0300 Subject: [PATCH 11/14] enabling flatten json as default adapter --- lib/active_model/serializer/configuration.rb | 2 +- test/test_helper.rb | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/active_model/serializer/configuration.rb b/lib/active_model/serializer/configuration.rb index ef57262c..86df706e 100644 --- a/lib/active_model/serializer/configuration.rb +++ b/lib/active_model/serializer/configuration.rb @@ -6,7 +6,7 @@ module ActiveModel included do |base| base.config.array_serializer = ActiveModel::Serializer::ArraySerializer - base.config.adapter = :json + base.config.adapter = :flatten_json end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index be06c505..a8b48355 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -20,7 +20,6 @@ class Foo < Rails::Application config.active_support.test_order = :random config.logger = Logger.new(nil) ActionController::Base.cache_store = :memory_store - ActiveModel::Serializer.config.adapter = :flatten_json end end FileUtils.mkdir_p(File.expand_path('../../tmp/cache', __FILE__)) From 329691276a1bb2827f20bceda5d15fd79a08d3dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Mon, 15 Jun 2015 15:58:39 -0300 Subject: [PATCH 12/14] disabling custom root option --- lib/active_model/serializer.rb | 6 +--- test/action_controller/serialization_test.rb | 34 -------------------- 2 files changed, 1 insertion(+), 39 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 9079b030..1e59cc23 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -168,11 +168,7 @@ module ActiveModel end def json_key - if root.nil? - self.class.root_name - else - root - end + self.class.root_name end def id diff --git a/test/action_controller/serialization_test.rb b/test/action_controller/serialization_test.rb index 5fc4c529..12a75f2d 100644 --- a/test/action_controller/serialization_test.rb +++ b/test/action_controller/serialization_test.rb @@ -173,20 +173,6 @@ module ActionController assert_equal expected.to_json, @response.body end - def test_render_using_custom_root - get :render_using_custom_root - - assert_equal 'application/json', @response.content_type - assert_equal '{"custom_root":{"name":"Name 1","description":"Description 1"}}', @response.body - end - - def test_render_using_custom_root_and_meta - get :render_using_custom_root_and_meta - - assert_equal 'application/json', @response.content_type - assert_equal '{"custom_root":{"name":"Name 1","description":"Description 1"},"meta":{"total":10}}', @response.body - end - def test_render_using_default_root get :render_using_default_adapter_root @@ -223,26 +209,6 @@ module ActionController assert_equal expected.to_json, @response.body end - def test_render_array_using_custom_root_and_meta - get :render_array_using_custom_root_and_meta - - assert_equal 'application/json', @response.content_type - - expected = { custom_root: [ - { - name: 'Name 1', - description: 'Description 1', - }, - { - name: 'Name 2', - description: 'Description 2', - }], - meta: { total: 10 } - } - - assert_equal expected.to_json, @response.body - end - def test_render_array_using_implicit_serializer get :render_array_using_implicit_serializer assert_equal 'application/json', @response.content_type From 65e0d79195bf74cd6226d606de02570be7f58b82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Mon, 15 Jun 2015 15:59:01 -0300 Subject: [PATCH 13/14] pluralising root key when using arraySerializer --- lib/active_model/serializer/array_serializer.rb | 2 +- lib/active_model/serializer/fieldset.rb | 2 +- test/adapter/json/collection_test.rb | 4 ++-- test/serializers/meta_test.rb | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index b05cb1dd..71c7ab44 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -19,7 +19,7 @@ module ActiveModel end def json_key - @objects.first.json_key if @objects.first + @objects.first.json_key.pluralize if @objects.first end def root=(root) diff --git a/lib/active_model/serializer/fieldset.rb b/lib/active_model/serializer/fieldset.rb index 911dac25..3ff42bed 100644 --- a/lib/active_model/serializer/fieldset.rb +++ b/lib/active_model/serializer/fieldset.rb @@ -13,7 +13,7 @@ module ActiveModel def fields_for(serializer) key = serializer.json_key - fields[key.to_sym] + fields[key.to_sym] || fields[key.pluralize.to_sym] end private diff --git a/test/adapter/json/collection_test.rb b/test/adapter/json/collection_test.rb index 018a6b23..54bc5431 100644 --- a/test/adapter/json/collection_test.rb +++ b/test/adapter/json/collection_test.rb @@ -28,7 +28,7 @@ module ActiveModel @serializer = ArraySerializer.new([@blog], serializer: CustomBlogSerializer) @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer) - expected = {custom_blog:[{ + expected = {custom_blogs:[{ id: 1, special_attribute: "Special", articles: [{id: 1,title: "Hello!!", body: "Hello, world!!"}, {id: 2, title: "New Post", body: "Body"}] @@ -37,7 +37,7 @@ module ActiveModel end def test_include_multiple_posts - expected = { post: [{ + expected = { posts: [{ title: "Hello!!", body: "Hello, world!!", id: 1, diff --git a/test/serializers/meta_test.rb b/test/serializers/meta_test.rb index b6201574..802049eb 100644 --- a/test/serializers/meta_test.rb +++ b/test/serializers/meta_test.rb @@ -12,10 +12,10 @@ module ActiveModel end def test_meta_is_present_with_root - serializer = AlternateBlogSerializer.new(@blog, root: "blog", meta: {total: 10}) + serializer = AlternateBlogSerializer.new(@blog, meta: {total: 10}) adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog') expected = { - blog: { + alternate_blog: { id: 1, title: "AMS Hints" }, @@ -39,7 +39,7 @@ module ActiveModel serializer = AlternateBlogSerializer.new(@blog, root: 'blog', meta: {total: 10}, meta_key: "haha_meta") adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog') expected = { - blog: { + alternate_blog: { id: 1, title: "AMS Hints" }, @@ -73,7 +73,7 @@ module ActiveModel serializer = ArraySerializer.new([@blog], meta: {total: 10}, meta_key: "haha_meta") adapter = ActiveModel::Serializer::Adapter::Json.new(serializer, root: 'blog') expected = { - blog: [{ + blogs: [{ id: 1, name: "AMS Hints", writer: { From e321cb366d094a665a97692f2198fc9f7be1a3f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Tue, 16 Jun 2015 06:23:02 -0300 Subject: [PATCH 14/14] Getting root key from AR::Relation --- lib/active_model/serializer/array_serializer.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index 71c7ab44..174e16fc 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -7,7 +7,8 @@ module ActiveModel attr_reader :meta, :meta_key def initialize(objects, options = {}) - @objects = objects.map do |object| + @resource = objects + @objects = objects.map do |object| serializer_class = options.fetch( :serializer, ActiveModel::Serializer.serializer_for(object) @@ -19,7 +20,11 @@ module ActiveModel end def json_key - @objects.first.json_key.pluralize if @objects.first + if @objects.first + @objects.first.json_key.pluralize + else + @resource.name.downcase.pluralize if @resource.try(:name) + end end def root=(root)