From edfec6c53e11d787faa8b7f7f6c310eca8cac186 Mon Sep 17 00:00:00 2001 From: "L. Preston Sego III" Date: Mon, 31 Aug 2015 12:12:08 -0400 Subject: [PATCH 1/3] initial refactor to make way for easy feature adding --- lib/active_model/serializer/adapter/json.rb | 47 +++++++++++++-------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index 58704b56e..9b9713545 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -7,34 +7,20 @@ class Json < Adapter def serializable_hash(options = nil) options ||= {} if serializer.respond_to?(:each) - @result = serializer.map { |s| FlattenJson.new(s).serializable_hash(options) } + @result = serialize_array_without_root(serializer, options) else @hash = {} - @core = cache_check(serializer) do - serializer.attributes(options) - end + @core = serialized_attributes_of(serializer, options) serializer.associations.each do |association| serializer = association.serializer opts = association.options if serializer.respond_to?(:each) - array_serializer = serializer - @hash[association.key] = array_serializer.map do |item| - cache_check(item) do - item.attributes(opts) - end - end + @hash[association.key] = serialize_array(serializer, opts) else - @hash[association.key] = - if serializer && serializer.object - cache_check(serializer) do - serializer.attributes(options) - end - elsif opts[:virtual_value] - opts[:virtual_value] - end + @hash[association.key] = serialized_or_virtual_of(serializer, opts) end end @result = @core.merge @hash @@ -43,6 +29,31 @@ def serializable_hash(options = nil) { root => @result } end + def serialize_array_without_root(serializer, options) + serializer.map { |s| FlattenJson.new(s).serializable_hash(options) } + end + + # TODO: what is a virtual value? + def serialized_or_virtual_of(serializer, options) + if serializer && serializer.object + serialized_attributes_of(serializer, options) + elsif options[:virtual_value] + options[:virtual_value] + end + end + + def serialized_attributes_of(item, options) + cache_check(item) do + item.attributes(options) + end + end + + def serialize_array(serializer, options) + serializer.map do |item| + serialized_attributes_of(item, options) + end + end + def fragment_cache(cached_hash, non_cached_hash) Json::FragmentCache.new().fragment_cache(cached_hash, non_cached_hash) end From 8df52d558bcf6d3144606bd6ec2c3858f0144501 Mon Sep 17 00:00:00 2001 From: "L. Preston Sego III" Date: Mon, 31 Aug 2015 15:26:59 -0400 Subject: [PATCH 2/3] refactored a bit more, and matched some method names to that of json_api --- lib/active_model/serializer/adapter/json.rb | 64 ++++++++++++++------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index 9b9713545..ea873b294 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -11,51 +11,73 @@ def serializable_hash(options = nil) else @hash = {} - @core = serialized_attributes_of(serializer, options) + @core = resource_object_for(serializer, options) - serializer.associations.each do |association| - serializer = association.serializer - opts = association.options + add_resource_relationships(serializer) - if serializer.respond_to?(:each) - @hash[association.key] = serialize_array(serializer, opts) - else - @hash[association.key] = serialized_or_virtual_of(serializer, opts) - end - end @result = @core.merge @hash end { root => @result } end + def fragment_cache(cached_hash, non_cached_hash) + Json::FragmentCache.new().fragment_cache(cached_hash, non_cached_hash) + end + + private + + # iterate through the associations on the serializer, + # adding them to @hash as needed (as singular or plural) + def add_resource_relationships(serializer) + serializer.associations.each do |association| + serializer = association.serializer + opts = association.options + + if serializer.respond_to?(:each) + add_relationships(association.key, serializer, opts) + else + add_relationship(association.key, serializer, opts) + end + end + + @hash + end + + # add a singular relationship + def add_relationship(key, serializer, options) + @hash[key] = serialized_or_virtual_of(serializer, options) + end + + # add a many relationship + def add_relationships(key, serializer, options) + @hash[key] = serialize_array(serializer, options) + end + def serialize_array_without_root(serializer, options) serializer.map { |s| FlattenJson.new(s).serializable_hash(options) } end - # TODO: what is a virtual value? + # a virtual value is something that doesn't need a serializer, + # such as a ruby array, or any other raw value def serialized_or_virtual_of(serializer, options) if serializer && serializer.object - serialized_attributes_of(serializer, options) + resource_object_for(serializer, options) elsif options[:virtual_value] options[:virtual_value] end end - def serialized_attributes_of(item, options) - cache_check(item) do - item.attributes(options) - end - end - def serialize_array(serializer, options) serializer.map do |item| - serialized_attributes_of(item, options) + resource_object_for(item, options) end end - def fragment_cache(cached_hash, non_cached_hash) - Json::FragmentCache.new().fragment_cache(cached_hash, non_cached_hash) + def resource_object_for(item, options) + cache_check(item) do + item.attributes(options) + end end end From 4f2ad3ec8c24081da42ce252aaeb76bf9a074cbd Mon Sep 17 00:00:00 2001 From: "L. Preston Sego III" Date: Mon, 31 Aug 2015 20:15:08 -0400 Subject: [PATCH 3/3] rename add_relationship methods to be less awkward --- lib/active_model/serializer/adapter/json.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index ea873b294..805643c30 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -6,6 +6,7 @@ class Adapter class Json < Adapter def serializable_hash(options = nil) options ||= {} + if serializer.respond_to?(:each) @result = serialize_array_without_root(serializer, options) else @@ -35,9 +36,9 @@ def add_resource_relationships(serializer) opts = association.options if serializer.respond_to?(:each) - add_relationships(association.key, serializer, opts) + add_has_many_relationship(association.key, serializer, opts) else - add_relationship(association.key, serializer, opts) + add_singular_relationship(association.key, serializer, opts) end end @@ -45,12 +46,12 @@ def add_resource_relationships(serializer) end # add a singular relationship - def add_relationship(key, serializer, options) + def add_singular_relationship(key, serializer, options) @hash[key] = serialized_or_virtual_of(serializer, options) end # add a many relationship - def add_relationships(key, serializer, options) + def add_has_many_relationship(key, serializer, options) @hash[key] = serialize_array(serializer, options) end