Skip to content

Commit f48fd2a

Browse files
beaubyNullVoxPopuli
authored andcommitted
Extract IncludeTree. (#1685)
1 parent f2cb497 commit f48fd2a

File tree

14 files changed

+49
-227
lines changed

14 files changed

+49
-227
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Fixes:
1414

1515
Misc:
1616
- [#1734](https://github.com/rails-api/active_model_serializers/pull/1734) Adds documentation for conditional attribute (@lambda2)
17+
- [#1685](https://github.com/rails-api/active_model_serializers/pull/1685) Replace `IncludeTree` with `IncludeDirective` from the jsonapi gem.
1718

1819
### [v0.10.0 (2016-05-17)](https://github.com/rails-api/active_model_serializers/compare/4a2d9853ba7...v0.10.0)
1920

active_model_serializers.gemspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ Gem::Specification.new do |spec|
4242
# 'minitest'
4343
# 'thread_safe'
4444

45+
spec.add_runtime_dependency 'jsonapi', '~> 0.1.1.beta2'
46+
4547
spec.add_development_dependency 'activerecord', rails_versions
4648
# arel
4749
# activesupport

docs/jsonapi/schema.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Example supported requests
2828
- Relationships
2929
- GET /articles/1/relationships/comments
3030
- GET /articles/1/relationships/author
31-
- Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `ActiveModel::Serializer::IncludeTree`
31+
- Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `JSONAPI::IncludeDirective`
3232
- GET /articles/1?`include`=comments
3333
- GET /articles/1?`include`=comments.author
3434
- GET /articles/1?`include`=author,comments.author

lib/active_model/serializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
require 'thread_safe'
2+
require 'jsonapi/include_directive'
23
require 'active_model/serializer/collection_serializer'
34
require 'active_model/serializer/array_serializer'
45
require 'active_model/serializer/error_serializer'
56
require 'active_model/serializer/errors_serializer'
6-
require 'active_model/serializer/include_tree'
77
require 'active_model/serializer/associations'
88
require 'active_model/serializer/attributes'
99
require 'active_model/serializer/caching'

lib/active_model/serializer/associations.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,18 +78,18 @@ def associate(reflection)
7878
end
7979
end
8080

81-
# @param [IncludeTree] include_tree (defaults to the
82-
# default_includes config value when not provided)
81+
# @param [JSONAPI::IncludeDirective] include_directive (defaults to the
82+
# +default_include_directive+ config value when not provided)
8383
# @return [Enumerator<Association>]
8484
#
85-
def associations(include_tree = ActiveModelSerializers.default_include_tree)
85+
def associations(include_directive = ActiveModelSerializers.default_include_directive)
8686
return unless object
8787

8888
Enumerator.new do |y|
8989
self.class._reflections.each do |reflection|
9090
next if reflection.excluded?(self)
9191
key = reflection.options.fetch(:key, reflection.name)
92-
next unless include_tree.key?(key)
92+
next unless include_directive.key?(key)
9393
y.yield reflection.build_association(self, instance_options)
9494
end
9595
end

lib/active_model/serializer/caching.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,10 @@ def fragment_cache_enabled?
163163

164164
# Read cache from cache_store
165165
# @return [Hash]
166-
def cache_read_multi(collection_serializer, adapter_instance, include_tree)
166+
def cache_read_multi(collection_serializer, adapter_instance, include_directive)
167167
return {} if ActiveModelSerializers.config.cache_store.blank?
168168

169-
keys = object_cache_keys(collection_serializer, adapter_instance, include_tree)
169+
keys = object_cache_keys(collection_serializer, adapter_instance, include_directive)
170170

171171
return {} if keys.blank?
172172

@@ -176,15 +176,15 @@ def cache_read_multi(collection_serializer, adapter_instance, include_tree)
176176
# Find all cache_key for the collection_serializer
177177
# @param serializers [ActiveModel::Serializer::CollectionSerializer]
178178
# @param adapter_instance [ActiveModelSerializers::Adapter::Base]
179-
# @param include_tree [ActiveModel::Serializer::IncludeTree]
179+
# @param include_directive [JSONAPI::IncludeDirective]
180180
# @return [Array] all cache_key of collection_serializer
181-
def object_cache_keys(collection_serializer, adapter_instance, include_tree)
181+
def object_cache_keys(collection_serializer, adapter_instance, include_directive)
182182
cache_keys = []
183183

184184
collection_serializer.each do |serializer|
185185
cache_keys << object_cache_key(serializer, adapter_instance)
186186

187-
serializer.associations(include_tree).each do |association|
187+
serializer.associations(include_directive).each do |association|
188188
if association.serializer.respond_to?(:each)
189189
association.serializer.each do |sub_serializer|
190190
cache_keys << object_cache_key(sub_serializer, adapter_instance)

lib/active_model_serializers.rb

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,10 @@ def self.location_of_caller
3131
[file, lineno]
3232
end
3333

34-
# Memoized default include tree
35-
# @return [ActiveModel::Serializer::IncludeTree]
36-
def self.default_include_tree
37-
@default_include_tree ||= ActiveModel::Serializer::IncludeTree
38-
.from_include_args(config.default_includes)
34+
# Memoized default include directive
35+
# @return [JSONAPI::IncludeDirective]
36+
def self.default_include_directive
37+
@default_include_directive ||= JSONAPI::IncludeDirective.new(config.default_includes, allow_wildcard: true)
3938
end
4039

4140
require 'active_model/serializer/version'

lib/active_model_serializers/adapter/attributes.rb

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ class Attributes < Base
44
def initialize(serializer, options = {})
55
super
66
@cached_attributes = options[:cache_attributes] || {}
7-
@include_tree =
8-
if options[:include]
9-
ActiveModel::Serializer::IncludeTree.from_include_args(options[:include])
7+
@include_directive =
8+
if options[:include_directive]
9+
options[:include_directive]
10+
elsif options[:include]
11+
JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
1012
else
11-
ActiveModelSerializers.default_include_tree
13+
ActiveModelSerializers.default_include_directive
1214
end
1315
end
1416

@@ -26,8 +28,8 @@ def serializable_hash(options = nil)
2628

2729
def serializable_hash_for_collection(options)
2830
cache_attributes
29-
30-
serializer.map { |s| Attributes.new(s, instance_options).serializable_hash(options) }
31+
opts = instance_options.merge(include_directive: @include_directive)
32+
serializer.map { |s| Attributes.new(s, opts).serializable_hash(options) }
3133
end
3234

3335
def serializable_hash_for_single_resource(options)
@@ -38,7 +40,7 @@ def serializable_hash_for_single_resource(options)
3840

3941
def resource_relationships(options)
4042
relationships = {}
41-
serializer.associations(@include_tree).each do |association|
43+
serializer.associations(@include_directive).each do |association|
4244
relationships[association.key] ||= relationship_value_for(association, options)
4345
end
4446

@@ -49,7 +51,7 @@ def relationship_value_for(association, options)
4951
return association.options[:virtual_value] if association.options[:virtual_value]
5052
return unless association.serializer && association.serializer.object
5153

52-
opts = instance_options.merge(include: @include_tree[association.key])
54+
opts = instance_options.merge(include_directive: @include_directive[association.key])
5355
relationship_value = Attributes.new(association.serializer, opts).serializable_hash(options)
5456

5557
if association.options[:polymorphic] && relationship_value
@@ -64,7 +66,7 @@ def relationship_value_for(association, options)
6466
def cache_attributes
6567
return if @cached_attributes.present?
6668

67-
@cached_attributes = ActiveModel::Serializer.cache_read_multi(serializer, self, @include_tree)
69+
@cached_attributes = ActiveModel::Serializer.cache_read_multi(serializer, self, @include_directive)
6870
end
6971

7072
def resource_object_for(options)

lib/active_model_serializers/adapter/json_api.rb

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class JsonApi < Base
3333

3434
def initialize(serializer, options = {})
3535
super
36-
@include_tree = ActiveModel::Serializer::IncludeTree.from_include_args(options[:include])
36+
@include_directive = JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
3737
@fieldset = options[:fieldset] || ActiveModel::Serializer::Fieldset.new(options.delete(:fields))
3838
end
3939

@@ -232,7 +232,7 @@ def resource_objects_for(serializers)
232232
@included = []
233233
@resource_identifiers = Set.new
234234
serializers.each { |serializer| process_resource(serializer, true) }
235-
serializers.each { |serializer| process_relationships(serializer, @include_tree) }
235+
serializers.each { |serializer| process_relationships(serializer, @include_directive) }
236236

237237
[@primary, @included]
238238
end
@@ -251,21 +251,21 @@ def process_resource(serializer, primary)
251251
true
252252
end
253253

254-
def process_relationships(serializer, include_tree)
255-
serializer.associations(include_tree).each do |association|
256-
process_relationship(association.serializer, include_tree[association.key])
254+
def process_relationships(serializer, include_directive)
255+
serializer.associations(include_directive).each do |association|
256+
process_relationship(association.serializer, include_directive[association.key])
257257
end
258258
end
259259

260-
def process_relationship(serializer, include_tree)
260+
def process_relationship(serializer, include_directive)
261261
if serializer.respond_to?(:each)
262-
serializer.each { |s| process_relationship(s, include_tree) }
262+
serializer.each { |s| process_relationship(s, include_directive) }
263263
return
264264
end
265265
return unless serializer && serializer.object
266266
return unless process_resource(serializer, false)
267267

268-
process_relationships(serializer, include_tree)
268+
process_relationships(serializer, include_directive)
269269
end
270270

271271
# {http://jsonapi.org/format/#document-resource-object-attributes Document Resource Object Attributes}
@@ -429,8 +429,10 @@ def resource_object_for(serializer)
429429
# meta: meta
430430
# }.reject! {|_,v| v.nil? }
431431
def relationships_for(serializer, requested_associations)
432-
include_tree = ActiveModel::Serializer::IncludeTree.from_include_args(requested_associations)
433-
serializer.associations(include_tree).each_with_object({}) do |association, hash|
432+
include_directive = JSONAPI::IncludeDirective.new(
433+
requested_associations,
434+
allow_wildcard: true)
435+
serializer.associations(include_directive).each_with_object({}) do |association, hash|
434436
hash[association.key] = Relationship.new(
435437
serializer,
436438
association.serializer,

test/action_controller/json/include_test.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -226,19 +226,19 @@ def expected_deep_include_response
226226
}
227227
end
228228

229-
def with_default_includes(include_tree)
229+
def with_default_includes(include_directive)
230230
original = ActiveModelSerializers.config.default_includes
231-
ActiveModelSerializers.config.default_includes = include_tree
232-
clear_include_tree_cache
231+
ActiveModelSerializers.config.default_includes = include_directive
232+
clear_include_directive_cache
233233
yield
234234
ensure
235235
ActiveModelSerializers.config.default_includes = original
236-
clear_include_tree_cache
236+
clear_include_directive_cache
237237
end
238238

239-
def clear_include_tree_cache
239+
def clear_include_directive_cache
240240
ActiveModelSerializers
241-
.instance_variable_set(:@default_include_tree, nil)
241+
.instance_variable_set(:@default_include_directive, nil)
242242
end
243243
end
244244
end

0 commit comments

Comments
 (0)