jsonapi-serializers 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/jsonapi-serializers/serializer.rb +11 -9
- data/lib/jsonapi-serializers/version.rb +1 -1
- data/spec/serializer_spec.rb +31 -2
- data/spec/support/serializers.rb +22 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd3e1e9535b28c3bd4aa6649bce141d36c312edc
|
4
|
+
data.tar.gz: 44a9e5b6079c4b8fc61a871f28e63914df7b6d94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a70aa04850d27c037bed576a368f74d76b4e8eda1ef40b65b933e04b1abcf2151245026461114dd19fe61b3f0e13265a9ba513e7606acbe4d10927d20bc48d87
|
7
|
+
data.tar.gz: d41530712d4454f0e73dead332a0e657853fe74d5f3a1f1ee2c400b7fb7c150d57e074af0c628b30106ced93ef2ed41d5c44a98d90fe195964ec37be2a369ecf
|
@@ -28,6 +28,7 @@ module JSONAPI
|
|
28
28
|
|
29
29
|
def initialize(object, options = {})
|
30
30
|
@object = object
|
31
|
+
@options = options
|
31
32
|
@context = options[:context] || {}
|
32
33
|
@base_url = options[:base_url]
|
33
34
|
|
@@ -110,7 +111,7 @@ module JSONAPI
|
|
110
111
|
# http://jsonapi.org/format/#document-structure-resource-relationships
|
111
112
|
data[formatted_attribute_name]['data'] = nil
|
112
113
|
else
|
113
|
-
related_object_serializer = JSONAPI::Serializer.find_serializer(object)
|
114
|
+
related_object_serializer = JSONAPI::Serializer.find_serializer(object, @options)
|
114
115
|
data[formatted_attribute_name]['data'] = {
|
115
116
|
'type' => related_object_serializer.type.to_s,
|
116
117
|
'id' => related_object_serializer.id.to_s,
|
@@ -138,7 +139,7 @@ module JSONAPI
|
|
138
139
|
data[formatted_attribute_name]['data'] = []
|
139
140
|
objects = has_many_relationship(attribute_name, attr_data) || []
|
140
141
|
objects.each do |obj|
|
141
|
-
related_object_serializer = JSONAPI::Serializer.find_serializer(obj)
|
142
|
+
related_object_serializer = JSONAPI::Serializer.find_serializer(obj, @options)
|
142
143
|
data[formatted_attribute_name]['data'] << {
|
143
144
|
'type' => related_object_serializer.type.to_s,
|
144
145
|
'id' => related_object_serializer.id.to_s,
|
@@ -221,8 +222,8 @@ module JSONAPI
|
|
221
222
|
class_name.constantize
|
222
223
|
end
|
223
224
|
|
224
|
-
def self.find_serializer(object)
|
225
|
-
find_serializer_class(object).new(object)
|
225
|
+
def self.find_serializer(object, options)
|
226
|
+
find_serializer_class(object).new(object, options)
|
226
227
|
end
|
227
228
|
|
228
229
|
def self.serialize(objects, options = {})
|
@@ -298,12 +299,13 @@ module JSONAPI
|
|
298
299
|
objects.compact.each do |obj|
|
299
300
|
# Use the mutability of relationship_data as the return datastructure to take advantage
|
300
301
|
# of the internal special merging logic.
|
301
|
-
find_recursive_relationships(obj, inclusion_tree, relationship_data)
|
302
|
+
find_recursive_relationships(obj, inclusion_tree, relationship_data, passthrough_options)
|
302
303
|
end
|
303
304
|
|
304
305
|
result['included'] = relationship_data.map do |_, data|
|
305
306
|
included_passthrough_options = {}
|
306
307
|
included_passthrough_options[:base_url] = passthrough_options[:base_url]
|
308
|
+
included_passthrough_options[:context] = passthrough_options[:context]
|
307
309
|
included_passthrough_options[:serializer] = find_serializer_class(data[:object])
|
308
310
|
included_passthrough_options[:include_linkages] = data[:include_linkages]
|
309
311
|
serialize_primary(data[:object], included_passthrough_options)
|
@@ -358,12 +360,12 @@ module JSONAPI
|
|
358
360
|
# ['users', '1'] => {object: <User>, include_linkages: []},
|
359
361
|
# ['users', '2'] => {object: <User>, include_linkages: []},
|
360
362
|
# }
|
361
|
-
def self.find_recursive_relationships(root_object, root_inclusion_tree, results)
|
363
|
+
def self.find_recursive_relationships(root_object, root_inclusion_tree, results, options)
|
362
364
|
root_inclusion_tree.each do |attribute_name, child_inclusion_tree|
|
363
365
|
# Skip the sentinal value, but we need to preserve it for siblings.
|
364
366
|
next if attribute_name == :_include
|
365
367
|
|
366
|
-
serializer = JSONAPI::Serializer.find_serializer(root_object)
|
368
|
+
serializer = JSONAPI::Serializer.find_serializer(root_object, options)
|
367
369
|
unformatted_attr_name = serializer.unformat_name(attribute_name).to_sym
|
368
370
|
|
369
371
|
# We know the name of this relationship, but we don't know where it is stored internally.
|
@@ -409,7 +411,7 @@ module JSONAPI
|
|
409
411
|
# If it is not set, that indicates that this is an inner path and not a leaf and will
|
410
412
|
# be followed by the recursion below.
|
411
413
|
objects.each do |obj|
|
412
|
-
obj_serializer = JSONAPI::Serializer.find_serializer(obj)
|
414
|
+
obj_serializer = JSONAPI::Serializer.find_serializer(obj, options)
|
413
415
|
# Use keys of ['posts', '1'] for the results to enforce uniqueness.
|
414
416
|
# Spec: A compound document MUST NOT include more than one resource object for each
|
415
417
|
# type and id pair.
|
@@ -443,7 +445,7 @@ module JSONAPI
|
|
443
445
|
if !child_inclusion_tree.empty?
|
444
446
|
# For each object we just loaded, find all deeper recursive relationships.
|
445
447
|
objects.each do |obj|
|
446
|
-
find_recursive_relationships(obj, child_inclusion_tree, results)
|
448
|
+
find_recursive_relationships(obj, child_inclusion_tree, results, options)
|
447
449
|
end
|
448
450
|
end
|
449
451
|
end
|
data/spec/serializer_spec.rb
CHANGED
@@ -753,7 +753,7 @@ describe JSONAPI::Serializer do
|
|
753
753
|
describe 'if/unless handling with contexts' do
|
754
754
|
it 'can be used to show/hide attributes' do
|
755
755
|
post = create(:post)
|
756
|
-
options = {serializer: MyApp::
|
756
|
+
options = {serializer: MyApp::PostSerializerWithContext}
|
757
757
|
|
758
758
|
options[:context] = {show_body: false}
|
759
759
|
data = JSONAPI::Serializer.serialize(post, options)
|
@@ -794,7 +794,36 @@ describe JSONAPI::Serializer do
|
|
794
794
|
end
|
795
795
|
end
|
796
796
|
describe 'context' do
|
797
|
-
|
797
|
+
it 'is passed through all relationship serializers' do
|
798
|
+
# Force long_comments to be serialized by the context-sensitive serializer.
|
799
|
+
expect_any_instance_of(MyApp::LongComment).to receive(:jsonapi_serializer_class_name)
|
800
|
+
.at_least(:once)
|
801
|
+
.and_return('MyApp::LongCommentsSerializerWithContext')
|
802
|
+
|
803
|
+
user = create(:user, name: 'Long Comment Author -- Should Not Be Serialized')
|
804
|
+
long_comment = create(:long_comment, user: user)
|
805
|
+
post = create(:post, :with_author, long_comments: [long_comment])
|
806
|
+
|
807
|
+
context = {show_body: false, show_comments_user: false}
|
808
|
+
expected_data = {
|
809
|
+
'data' => serialize_primary(post, {
|
810
|
+
serializer: MyApp::PostSerializerWithContext,
|
811
|
+
include_linkages: ['long-comments'],
|
812
|
+
context: context,
|
813
|
+
}),
|
814
|
+
'included' => [
|
815
|
+
serialize_primary(long_comment, {
|
816
|
+
serializer: MyApp::LongCommentsSerializerWithContext,
|
817
|
+
context: context,
|
818
|
+
}),
|
819
|
+
],
|
820
|
+
}
|
821
|
+
includes = ['long-comments']
|
822
|
+
actual_data = JSONAPI::Serializer.serialize(post, context: context, include: includes)
|
823
|
+
# Multiple expectations for better diff output for debugging.
|
824
|
+
expect(actual_data['data']).to eq(expected_data['data'])
|
825
|
+
expect(actual_data['included']).to eq(expected_data['included'])
|
826
|
+
expect(actual_data).to eq(expected_data)
|
798
827
|
end
|
799
828
|
end
|
800
829
|
|
data/spec/support/serializers.rb
CHANGED
@@ -21,6 +21,11 @@ module MyApp
|
|
21
21
|
attr_accessor :body
|
22
22
|
attr_accessor :user
|
23
23
|
attr_accessor :post
|
24
|
+
|
25
|
+
# Just a copy of the default implementation, we need this to exist to be able to stub in tests.
|
26
|
+
def jsonapi_serializer_class_name
|
27
|
+
'MyApp::LongCommentSerializer'
|
28
|
+
end
|
24
29
|
end
|
25
30
|
|
26
31
|
class User
|
@@ -108,7 +113,7 @@ module MyApp
|
|
108
113
|
end
|
109
114
|
end
|
110
115
|
|
111
|
-
class
|
116
|
+
class PostSerializerWithContext < PostSerializer
|
112
117
|
attribute :body, if: :show_body?, unless: :hide_body?
|
113
118
|
|
114
119
|
def show_body?
|
@@ -120,6 +125,22 @@ module MyApp
|
|
120
125
|
end
|
121
126
|
end
|
122
127
|
|
128
|
+
class LongCommentsSerializerWithContext
|
129
|
+
include JSONAPI::Serializer
|
130
|
+
|
131
|
+
attribute :body, if: :show_body?
|
132
|
+
has_one :user, if: :show_comments_user?
|
133
|
+
|
134
|
+
def show_body?
|
135
|
+
context.fetch(:show_body, true)
|
136
|
+
end
|
137
|
+
|
138
|
+
def show_comments_user?
|
139
|
+
context.fetch(:show_comments_user, true)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
|
123
144
|
class PostSerializerWithoutLinks
|
124
145
|
include JSONAPI::Serializer
|
125
146
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi-serializers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Fotinakis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|