Extract IncludeTree. (#1685)

This commit is contained in:
Lucas Hosseini
2016-05-28 16:07:11 +02:00
committed by L. Preston Sego III
parent f2cb497fe3
commit f48fd2a327
14 changed files with 49 additions and 227 deletions

View File

@@ -1,9 +1,9 @@
require 'thread_safe'
require 'jsonapi/include_directive'
require 'active_model/serializer/collection_serializer'
require 'active_model/serializer/array_serializer'
require 'active_model/serializer/error_serializer'
require 'active_model/serializer/errors_serializer'
require 'active_model/serializer/include_tree'
require 'active_model/serializer/associations'
require 'active_model/serializer/attributes'
require 'active_model/serializer/caching'

View File

@@ -78,18 +78,18 @@ module ActiveModel
end
end
# @param [IncludeTree] include_tree (defaults to the
# default_includes config value when not provided)
# @param [JSONAPI::IncludeDirective] include_directive (defaults to the
# +default_include_directive+ config value when not provided)
# @return [Enumerator<Association>]
#
def associations(include_tree = ActiveModelSerializers.default_include_tree)
def associations(include_directive = ActiveModelSerializers.default_include_directive)
return unless object
Enumerator.new do |y|
self.class._reflections.each do |reflection|
next if reflection.excluded?(self)
key = reflection.options.fetch(:key, reflection.name)
next unless include_tree.key?(key)
next unless include_directive.key?(key)
y.yield reflection.build_association(self, instance_options)
end
end

View File

@@ -163,10 +163,10 @@ module ActiveModel
# Read cache from cache_store
# @return [Hash]
def cache_read_multi(collection_serializer, adapter_instance, include_tree)
def cache_read_multi(collection_serializer, adapter_instance, include_directive)
return {} if ActiveModelSerializers.config.cache_store.blank?
keys = object_cache_keys(collection_serializer, adapter_instance, include_tree)
keys = object_cache_keys(collection_serializer, adapter_instance, include_directive)
return {} if keys.blank?
@@ -176,15 +176,15 @@ module ActiveModel
# Find all cache_key for the collection_serializer
# @param serializers [ActiveModel::Serializer::CollectionSerializer]
# @param adapter_instance [ActiveModelSerializers::Adapter::Base]
# @param include_tree [ActiveModel::Serializer::IncludeTree]
# @param include_directive [JSONAPI::IncludeDirective]
# @return [Array] all cache_key of collection_serializer
def object_cache_keys(collection_serializer, adapter_instance, include_tree)
def object_cache_keys(collection_serializer, adapter_instance, include_directive)
cache_keys = []
collection_serializer.each do |serializer|
cache_keys << object_cache_key(serializer, adapter_instance)
serializer.associations(include_tree).each do |association|
serializer.associations(include_directive).each do |association|
if association.serializer.respond_to?(:each)
association.serializer.each do |sub_serializer|
cache_keys << object_cache_key(sub_serializer, adapter_instance)

View File

@@ -31,11 +31,10 @@ module ActiveModelSerializers
[file, lineno]
end
# Memoized default include tree
# @return [ActiveModel::Serializer::IncludeTree]
def self.default_include_tree
@default_include_tree ||= ActiveModel::Serializer::IncludeTree
.from_include_args(config.default_includes)
# Memoized default include directive
# @return [JSONAPI::IncludeDirective]
def self.default_include_directive
@default_include_directive ||= JSONAPI::IncludeDirective.new(config.default_includes, allow_wildcard: true)
end
require 'active_model/serializer/version'

View File

@@ -4,11 +4,13 @@ module ActiveModelSerializers
def initialize(serializer, options = {})
super
@cached_attributes = options[:cache_attributes] || {}
@include_tree =
if options[:include]
ActiveModel::Serializer::IncludeTree.from_include_args(options[:include])
@include_directive =
if options[:include_directive]
options[:include_directive]
elsif options[:include]
JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
else
ActiveModelSerializers.default_include_tree
ActiveModelSerializers.default_include_directive
end
end
@@ -26,8 +28,8 @@ module ActiveModelSerializers
def serializable_hash_for_collection(options)
cache_attributes
serializer.map { |s| Attributes.new(s, instance_options).serializable_hash(options) }
opts = instance_options.merge(include_directive: @include_directive)
serializer.map { |s| Attributes.new(s, opts).serializable_hash(options) }
end
def serializable_hash_for_single_resource(options)
@@ -38,7 +40,7 @@ module ActiveModelSerializers
def resource_relationships(options)
relationships = {}
serializer.associations(@include_tree).each do |association|
serializer.associations(@include_directive).each do |association|
relationships[association.key] ||= relationship_value_for(association, options)
end
@@ -49,7 +51,7 @@ module ActiveModelSerializers
return association.options[:virtual_value] if association.options[:virtual_value]
return unless association.serializer && association.serializer.object
opts = instance_options.merge(include: @include_tree[association.key])
opts = instance_options.merge(include_directive: @include_directive[association.key])
relationship_value = Attributes.new(association.serializer, opts).serializable_hash(options)
if association.options[:polymorphic] && relationship_value
@@ -64,7 +66,7 @@ module ActiveModelSerializers
def cache_attributes
return if @cached_attributes.present?
@cached_attributes = ActiveModel::Serializer.cache_read_multi(serializer, self, @include_tree)
@cached_attributes = ActiveModel::Serializer.cache_read_multi(serializer, self, @include_directive)
end
def resource_object_for(options)

View File

@@ -33,7 +33,7 @@ module ActiveModelSerializers
def initialize(serializer, options = {})
super
@include_tree = ActiveModel::Serializer::IncludeTree.from_include_args(options[:include])
@include_directive = JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
@fieldset = options[:fieldset] || ActiveModel::Serializer::Fieldset.new(options.delete(:fields))
end
@@ -232,7 +232,7 @@ module ActiveModelSerializers
@included = []
@resource_identifiers = Set.new
serializers.each { |serializer| process_resource(serializer, true) }
serializers.each { |serializer| process_relationships(serializer, @include_tree) }
serializers.each { |serializer| process_relationships(serializer, @include_directive) }
[@primary, @included]
end
@@ -251,21 +251,21 @@ module ActiveModelSerializers
true
end
def process_relationships(serializer, include_tree)
serializer.associations(include_tree).each do |association|
process_relationship(association.serializer, include_tree[association.key])
def process_relationships(serializer, include_directive)
serializer.associations(include_directive).each do |association|
process_relationship(association.serializer, include_directive[association.key])
end
end
def process_relationship(serializer, include_tree)
def process_relationship(serializer, include_directive)
if serializer.respond_to?(:each)
serializer.each { |s| process_relationship(s, include_tree) }
serializer.each { |s| process_relationship(s, include_directive) }
return
end
return unless serializer && serializer.object
return unless process_resource(serializer, false)
process_relationships(serializer, include_tree)
process_relationships(serializer, include_directive)
end
# {http://jsonapi.org/format/#document-resource-object-attributes Document Resource Object Attributes}
@@ -429,8 +429,10 @@ module ActiveModelSerializers
# meta: meta
# }.reject! {|_,v| v.nil? }
def relationships_for(serializer, requested_associations)
include_tree = ActiveModel::Serializer::IncludeTree.from_include_args(requested_associations)
serializer.associations(include_tree).each_with_object({}) do |association, hash|
include_directive = JSONAPI::IncludeDirective.new(
requested_associations,
allow_wildcard: true)
serializer.associations(include_directive).each_with_object({}) do |association, hash|
hash[association.key] = Relationship.new(
serializer,
association.serializer,