ivy-serializers 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ivy-serializers.gemspec +3 -3
- data/lib/ivy/serializers.rb +0 -1
- data/lib/ivy/serializers/formats/active_model_serializers.rb +14 -1
- data/lib/ivy/serializers/formats/json_api.rb +5 -1
- data/lib/ivy/serializers/version.rb +1 -1
- data/spec/integration/formats/active_model_serializers_spec.rb +134 -18
- data/spec/integration/formats/json_api_spec.rb +334 -108
- metadata +30 -32
- data/lib/ivy/serializers/action_controller/serialization_support.rb +0 -35
- data/lib/ivy/serializers/railtie.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 965769bbd1ab1c1e7345b7767e4ac2f35ced0890
|
4
|
+
data.tar.gz: 8c8b913128925ad947f0810f05cb47d34d7c1f95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ccc6afa7b0b08e61cbb53876c8239192c60683fd54bf707e06e02e34bf2ce2b8ea86b0ad8cc40b6d87471b1ff6e531d1f9f5aed5b0ee0303f3a27631d1bbe0d
|
7
|
+
data.tar.gz: 255b0f79b33bec71c516fadcc0d471abec3e4e685a6b520b508076ac39f70033416813a6438fa54d813638dc6511ed492cd6eada2e44a91c0b4d74ff7ec7bf19
|
data/ivy-serializers.gemspec
CHANGED
@@ -14,11 +14,11 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
15
|
spec.require_paths = ['lib']
|
16
16
|
|
17
|
+
spec.add_dependency 'activesupport', '>= 2.2.1'
|
18
|
+
spec.add_dependency 'hash_generator', '~> 1.1'
|
19
|
+
|
17
20
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
18
21
|
spec.add_development_dependency 'rake'
|
19
22
|
spec.add_development_dependency 'rspec', '~> 3.2.0'
|
20
23
|
spec.add_development_dependency 'simplecov', '~> 0.10.0'
|
21
|
-
|
22
|
-
spec.add_dependency 'activesupport', '>= 2.2.1'
|
23
|
-
spec.add_dependency 'hash_generator', '~> 1.1'
|
24
24
|
end
|
data/lib/ivy/serializers.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_support/inflector'
|
1
2
|
require 'ivy/serializers/formats/json'
|
2
3
|
|
3
4
|
module Ivy
|
@@ -20,10 +21,18 @@ module Ivy
|
|
20
21
|
if options[:polymorphic]
|
21
22
|
@hash_gen.store_array(name) { polymorphic_resources(resources) }
|
22
23
|
else
|
23
|
-
ids(:"#{
|
24
|
+
ids(:"#{singularize(name)}_ids", resources)
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
28
|
+
def primary_resource(primary_resource_name, primary_resource)
|
29
|
+
super(singularize(primary_resource_name).to_sym, primary_resource)
|
30
|
+
end
|
31
|
+
|
32
|
+
def primary_resources(primary_resources_name, primary_resources)
|
33
|
+
super(primary_resources_name, primary_resources)
|
34
|
+
end
|
35
|
+
|
27
36
|
private
|
28
37
|
|
29
38
|
def polymorphic_resource(resource)
|
@@ -34,6 +43,10 @@ module Ivy
|
|
34
43
|
def polymorphic_resources(resources)
|
35
44
|
resources.each { |resource| @hash_gen.push_object { polymorphic_resource(resource) } }
|
36
45
|
end
|
46
|
+
|
47
|
+
def singularize(name)
|
48
|
+
ActiveSupport::Inflector.singularize(name.to_s)
|
49
|
+
end
|
37
50
|
end
|
38
51
|
end
|
39
52
|
end
|
@@ -26,7 +26,11 @@ module Ivy
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def primary_resource(primary_resource_name, primary_resource)
|
29
|
-
|
29
|
+
super(:data, primary_resource)
|
30
|
+
end
|
31
|
+
|
32
|
+
def primary_resources(primary_resources_name, primary_resources)
|
33
|
+
super(:data, primary_resources)
|
30
34
|
end
|
31
35
|
|
32
36
|
def resource(resource)
|
@@ -5,14 +5,24 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
5
5
|
|
6
6
|
describe '#as_json' do
|
7
7
|
let(:registry) { Ivy::Serializers::Registry.new }
|
8
|
-
let(:document) { Ivy::Serializers::Documents.create(registry, :
|
8
|
+
let(:document) { Ivy::Serializers::Documents.create(registry, :posts, resource) }
|
9
9
|
|
10
10
|
subject { format.as_json }
|
11
11
|
|
12
12
|
context 'with default mapping' do
|
13
13
|
let(:post) { double('post', :id => 1) }
|
14
14
|
|
15
|
-
|
15
|
+
context 'for an individual resource' do
|
16
|
+
let(:resource) { post }
|
17
|
+
|
18
|
+
it { should eq(:post => {:id => 1}) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'for a resource collection' do
|
22
|
+
let(:resource) { [post] }
|
23
|
+
|
24
|
+
it { should eq(:posts => [{:id => 1}]) }
|
25
|
+
end
|
16
26
|
end
|
17
27
|
|
18
28
|
context 'with an attribute' do
|
@@ -26,7 +36,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
26
36
|
end
|
27
37
|
end
|
28
38
|
|
29
|
-
|
39
|
+
context 'for an individual resource' do
|
40
|
+
let(:resource) { post }
|
41
|
+
|
42
|
+
it { should eq(:post => {:id => 1, :title => 'title'}) }
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'for a resource collection' do
|
46
|
+
let(:resource) { [post] }
|
47
|
+
|
48
|
+
it { should eq(:posts => [{:id => 1, :title => 'title'}]) }
|
49
|
+
end
|
30
50
|
end
|
31
51
|
|
32
52
|
context 'with a block provided' do
|
@@ -36,7 +56,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
36
56
|
end
|
37
57
|
end
|
38
58
|
|
39
|
-
|
59
|
+
context 'for an individual resource' do
|
60
|
+
let(:resource) { post }
|
61
|
+
|
62
|
+
it { should eq(:post => {:id => 1, :headline => 'title'}) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'for a resource collection' do
|
66
|
+
let(:resource) { [post] }
|
67
|
+
|
68
|
+
it { should eq(:posts => [{:id => 1, :headline => 'title'}]) }
|
69
|
+
end
|
40
70
|
end
|
41
71
|
end
|
42
72
|
|
@@ -53,7 +83,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
53
83
|
end
|
54
84
|
end
|
55
85
|
|
56
|
-
|
86
|
+
context 'for an individual resource' do
|
87
|
+
let(:resource) { post }
|
88
|
+
|
89
|
+
it { should eq(:post => {:author_id => 1, :id => 1}) }
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'for a resource collection' do
|
93
|
+
let(:resource) { [post] }
|
94
|
+
|
95
|
+
it { should eq(:posts => [{:author_id => 1, :id => 1}]) }
|
96
|
+
end
|
57
97
|
end
|
58
98
|
|
59
99
|
context 'with a block provided' do
|
@@ -63,7 +103,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
63
103
|
end
|
64
104
|
end
|
65
105
|
|
66
|
-
|
106
|
+
context 'for an individual resource' do
|
107
|
+
let(:resource) { post }
|
108
|
+
|
109
|
+
it { should eq(:post => {:id => 1, :user_id => 1}) }
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'for a resource collection' do
|
113
|
+
let(:resource) { [post] }
|
114
|
+
|
115
|
+
it { should eq(:posts => [{:id => 1, :user_id => 1}]) }
|
116
|
+
end
|
67
117
|
end
|
68
118
|
|
69
119
|
context 'with the :embed_in_root option' do
|
@@ -73,10 +123,23 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
73
123
|
end
|
74
124
|
end
|
75
125
|
|
76
|
-
|
77
|
-
:
|
78
|
-
|
79
|
-
|
126
|
+
context 'for an individual resource' do
|
127
|
+
let(:resource) { post }
|
128
|
+
|
129
|
+
it { should eq(
|
130
|
+
:authors => [{:id => 1}],
|
131
|
+
:post => {:author_id => 1, :id => 1}
|
132
|
+
) }
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'for a resource collection' do
|
136
|
+
let(:resource) { [post] }
|
137
|
+
|
138
|
+
it { should eq(
|
139
|
+
:authors => [{:id => 1}],
|
140
|
+
:posts => [{:author_id => 1, :id => 1}]
|
141
|
+
) }
|
142
|
+
end
|
80
143
|
end
|
81
144
|
|
82
145
|
context 'with the :polymorphic option' do
|
@@ -86,7 +149,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
86
149
|
end
|
87
150
|
end
|
88
151
|
|
89
|
-
|
152
|
+
context 'for an individual resource' do
|
153
|
+
let(:resource) { post }
|
154
|
+
|
155
|
+
it { should eq(:post => {:author => {:id => 1, :type => 'author'}, :id => 1}) }
|
156
|
+
end
|
157
|
+
|
158
|
+
context 'for a resource collection' do
|
159
|
+
let(:resource) { [post] }
|
160
|
+
|
161
|
+
it { should eq(:posts => [{:author => {:id => 1, :type => 'author'}, :id => 1}]) }
|
162
|
+
end
|
90
163
|
end
|
91
164
|
end
|
92
165
|
|
@@ -103,7 +176,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
103
176
|
end
|
104
177
|
end
|
105
178
|
|
106
|
-
|
179
|
+
context 'for an individual resource' do
|
180
|
+
let(:resource) { post }
|
181
|
+
|
182
|
+
it { should eq(:post => {:comment_ids => [1], :id => 1}) }
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'for a resource collection' do
|
186
|
+
let(:resource) { [post] }
|
187
|
+
|
188
|
+
it { should eq(:posts => [{:comment_ids => [1], :id => 1}]) }
|
189
|
+
end
|
107
190
|
end
|
108
191
|
|
109
192
|
context 'with a block provided' do
|
@@ -113,7 +196,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
113
196
|
end
|
114
197
|
end
|
115
198
|
|
116
|
-
|
199
|
+
context 'for an individual resource' do
|
200
|
+
let(:resource) { post }
|
201
|
+
|
202
|
+
it { should eq(:post => {:id => 1, :reply_ids => [1]}) }
|
203
|
+
end
|
204
|
+
|
205
|
+
context 'for a resource collection' do
|
206
|
+
let(:resource) { [post] }
|
207
|
+
|
208
|
+
it { should eq(:posts => [{:id => 1, :reply_ids => [1]}]) }
|
209
|
+
end
|
117
210
|
end
|
118
211
|
|
119
212
|
context 'with the :embed_in_root option' do
|
@@ -123,10 +216,23 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
123
216
|
end
|
124
217
|
end
|
125
218
|
|
126
|
-
|
127
|
-
:
|
128
|
-
|
129
|
-
|
219
|
+
context 'for an individual resource' do
|
220
|
+
let(:resource) { post }
|
221
|
+
|
222
|
+
it { should eq(
|
223
|
+
:comments => [{:id => 1}],
|
224
|
+
:post => {:comment_ids => [1], :id => 1}
|
225
|
+
) }
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'for a resource collection' do
|
229
|
+
let(:resource) { [post] }
|
230
|
+
|
231
|
+
it { should eq(
|
232
|
+
:comments => [{:id => 1}],
|
233
|
+
:posts => [{:comment_ids => [1], :id => 1}]
|
234
|
+
) }
|
235
|
+
end
|
130
236
|
end
|
131
237
|
|
132
238
|
context 'with the :polymorphic option' do
|
@@ -136,7 +242,17 @@ RSpec.describe Ivy::Serializers::Formats::ActiveModelSerializers do
|
|
136
242
|
end
|
137
243
|
end
|
138
244
|
|
139
|
-
|
245
|
+
context 'for an individual resource' do
|
246
|
+
let(:resource) { post }
|
247
|
+
|
248
|
+
it { should eq(:post => {:comments => [{:id => 1, :type => 'comment'}], :id => 1}) }
|
249
|
+
end
|
250
|
+
|
251
|
+
context 'for a resource collection' do
|
252
|
+
let(:resource) { [post] }
|
253
|
+
|
254
|
+
it { should eq(:posts => [{:comments => [{:id => 1, :type => 'comment'}], :id => 1}]) }
|
255
|
+
end
|
140
256
|
end
|
141
257
|
end
|
142
258
|
end
|
@@ -5,7 +5,7 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
5
5
|
|
6
6
|
describe '#as_json' do
|
7
7
|
let(:registry) { Ivy::Serializers::Registry.new }
|
8
|
-
let(:document) { Ivy::Serializers::Documents.create(registry, :
|
8
|
+
let(:document) { Ivy::Serializers::Documents.create(registry, :posts, resource) }
|
9
9
|
|
10
10
|
subject { format.as_json }
|
11
11
|
|
@@ -13,13 +13,29 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
13
13
|
let(:post_class) { double('Post', :name => 'Post') }
|
14
14
|
let(:post) { double('post', :class => post_class, :id => 1) }
|
15
15
|
|
16
|
-
|
17
|
-
:
|
18
|
-
|
19
|
-
|
20
|
-
:
|
21
|
-
|
22
|
-
|
16
|
+
context 'for an individual resource' do
|
17
|
+
let(:resource) { post }
|
18
|
+
|
19
|
+
it { should eq({
|
20
|
+
:data => {
|
21
|
+
:type => 'post',
|
22
|
+
:id => '1',
|
23
|
+
:links => {}
|
24
|
+
}
|
25
|
+
}) }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'for a resource collection' do
|
29
|
+
let(:resource) { [post] }
|
30
|
+
|
31
|
+
it { should eq({
|
32
|
+
:data => [{
|
33
|
+
:type => 'post',
|
34
|
+
:id => '1',
|
35
|
+
:links => {}
|
36
|
+
}]
|
37
|
+
}) }
|
38
|
+
end
|
23
39
|
end
|
24
40
|
|
25
41
|
context 'with an attribute' do
|
@@ -33,14 +49,31 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
33
49
|
end
|
34
50
|
end
|
35
51
|
|
36
|
-
|
37
|
-
:
|
38
|
-
|
39
|
-
|
40
|
-
:
|
41
|
-
|
42
|
-
|
43
|
-
|
52
|
+
context 'for an individual resource' do
|
53
|
+
let(:resource) { post }
|
54
|
+
|
55
|
+
it { should eq({
|
56
|
+
:data => {
|
57
|
+
:type => 'post',
|
58
|
+
:id => '1',
|
59
|
+
:title => 'title',
|
60
|
+
:links => {}
|
61
|
+
}
|
62
|
+
}) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'for a resource collection' do
|
66
|
+
let(:resource) { [post] }
|
67
|
+
|
68
|
+
it { should eq({
|
69
|
+
:data => [{
|
70
|
+
:type => 'post',
|
71
|
+
:id => '1',
|
72
|
+
:title => 'title',
|
73
|
+
:links => {}
|
74
|
+
}]
|
75
|
+
}) }
|
76
|
+
end
|
44
77
|
end
|
45
78
|
|
46
79
|
context 'with a block provided' do
|
@@ -50,14 +83,31 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
50
83
|
end
|
51
84
|
end
|
52
85
|
|
53
|
-
|
54
|
-
:
|
55
|
-
|
56
|
-
|
57
|
-
:
|
58
|
-
|
59
|
-
|
60
|
-
|
86
|
+
context 'for an individual resource' do
|
87
|
+
let(:resource) { post }
|
88
|
+
|
89
|
+
it { should eq({
|
90
|
+
:data => {
|
91
|
+
:type => 'post',
|
92
|
+
:id => '1',
|
93
|
+
:headline => 'title',
|
94
|
+
:links => {}
|
95
|
+
}
|
96
|
+
}) }
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'for a resource collection' do
|
100
|
+
let(:resource) { [post] }
|
101
|
+
|
102
|
+
it { should eq({
|
103
|
+
:data => [{
|
104
|
+
:type => 'post',
|
105
|
+
:id => '1',
|
106
|
+
:headline => 'title',
|
107
|
+
:links => {}
|
108
|
+
}]
|
109
|
+
}) }
|
110
|
+
end
|
61
111
|
end
|
62
112
|
end
|
63
113
|
|
@@ -74,17 +124,37 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
74
124
|
end
|
75
125
|
end
|
76
126
|
|
77
|
-
|
78
|
-
:
|
79
|
-
|
80
|
-
|
81
|
-
:
|
82
|
-
:
|
83
|
-
|
127
|
+
context 'for an individual resource' do
|
128
|
+
let(:resource) { post }
|
129
|
+
|
130
|
+
it { should eq({
|
131
|
+
:data => {
|
132
|
+
:type => 'post',
|
133
|
+
:id => '1',
|
134
|
+
:links => {
|
135
|
+
:author => {
|
136
|
+
:linkage => {:id => '1', :type => 'author'}
|
137
|
+
}
|
84
138
|
}
|
85
139
|
}
|
86
|
-
}
|
87
|
-
|
140
|
+
}) }
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'for a resource collection' do
|
144
|
+
let(:resource) { [post] }
|
145
|
+
|
146
|
+
it { should eq({
|
147
|
+
:data => [{
|
148
|
+
:type => 'post',
|
149
|
+
:id => '1',
|
150
|
+
:links => {
|
151
|
+
:author => {
|
152
|
+
:linkage => {:id => '1', :type => 'author'}
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}]
|
156
|
+
}) }
|
157
|
+
end
|
88
158
|
end
|
89
159
|
|
90
160
|
context 'with a block provided' do
|
@@ -94,17 +164,37 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
94
164
|
end
|
95
165
|
end
|
96
166
|
|
97
|
-
|
98
|
-
:
|
99
|
-
|
100
|
-
|
101
|
-
:
|
102
|
-
:
|
103
|
-
|
167
|
+
context 'for an individual resource' do
|
168
|
+
let(:resource) { post }
|
169
|
+
|
170
|
+
it { should eq({
|
171
|
+
:data => {
|
172
|
+
:type => 'post',
|
173
|
+
:id => '1',
|
174
|
+
:links => {
|
175
|
+
:user => {
|
176
|
+
:linkage => {:id => '1', :type => 'author'}
|
177
|
+
}
|
104
178
|
}
|
105
179
|
}
|
106
|
-
}
|
107
|
-
|
180
|
+
}) }
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'for a resource collection' do
|
184
|
+
let(:resource) { [post] }
|
185
|
+
|
186
|
+
it { should eq({
|
187
|
+
:data => [{
|
188
|
+
:type => 'post',
|
189
|
+
:id => '1',
|
190
|
+
:links => {
|
191
|
+
:user => {
|
192
|
+
:linkage => {:id => '1', :type => 'author'}
|
193
|
+
}
|
194
|
+
}
|
195
|
+
}]
|
196
|
+
}) }
|
197
|
+
end
|
108
198
|
end
|
109
199
|
|
110
200
|
context 'with the :embed_in_root option' do
|
@@ -114,25 +204,53 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
114
204
|
end
|
115
205
|
end
|
116
206
|
|
117
|
-
|
118
|
-
:
|
119
|
-
|
120
|
-
|
121
|
-
:
|
122
|
-
:
|
123
|
-
|
207
|
+
context 'for an individual resource' do
|
208
|
+
let(:resource) { post }
|
209
|
+
|
210
|
+
it { should eq({
|
211
|
+
:data => {
|
212
|
+
:type => 'post',
|
213
|
+
:id => '1',
|
214
|
+
:links => {
|
215
|
+
:author => {
|
216
|
+
:linkage => {:id => '1', :type => 'author'}
|
217
|
+
}
|
124
218
|
}
|
219
|
+
},
|
220
|
+
|
221
|
+
:included => {
|
222
|
+
:authors => [{
|
223
|
+
:id => '1',
|
224
|
+
:links => {},
|
225
|
+
:type => 'author'
|
226
|
+
}]
|
125
227
|
}
|
126
|
-
}
|
228
|
+
}) }
|
229
|
+
end
|
127
230
|
|
128
|
-
|
129
|
-
|
231
|
+
context 'for a resource collection' do
|
232
|
+
let(:resource) { [post] }
|
233
|
+
|
234
|
+
it { should eq({
|
235
|
+
:data => [{
|
236
|
+
:type => 'post',
|
130
237
|
:id => '1',
|
131
|
-
:links => {
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
238
|
+
:links => {
|
239
|
+
:author => {
|
240
|
+
:linkage => {:id => '1', :type => 'author'}
|
241
|
+
}
|
242
|
+
}
|
243
|
+
}],
|
244
|
+
|
245
|
+
:included => {
|
246
|
+
:authors => [{
|
247
|
+
:id => '1',
|
248
|
+
:links => {},
|
249
|
+
:type => 'author'
|
250
|
+
}]
|
251
|
+
}
|
252
|
+
}) }
|
253
|
+
end
|
136
254
|
end
|
137
255
|
|
138
256
|
context 'with the :polymorphic option' do
|
@@ -142,17 +260,37 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
142
260
|
end
|
143
261
|
end
|
144
262
|
|
145
|
-
|
146
|
-
:
|
147
|
-
|
148
|
-
|
149
|
-
:
|
150
|
-
:
|
151
|
-
|
263
|
+
context 'for an individual resource' do
|
264
|
+
let(:resource) { post }
|
265
|
+
|
266
|
+
it { should eq({
|
267
|
+
:data => {
|
268
|
+
:type => 'post',
|
269
|
+
:id => '1',
|
270
|
+
:links => {
|
271
|
+
:author => {
|
272
|
+
:linkage => {:id => '1', :type => 'author'}
|
273
|
+
}
|
152
274
|
}
|
153
275
|
}
|
154
|
-
}
|
155
|
-
|
276
|
+
}) }
|
277
|
+
end
|
278
|
+
|
279
|
+
context 'for a resource collection' do
|
280
|
+
let(:resource) { [post] }
|
281
|
+
|
282
|
+
it { should eq({
|
283
|
+
:data => [{
|
284
|
+
:type => 'post',
|
285
|
+
:id => '1',
|
286
|
+
:links => {
|
287
|
+
:author => {
|
288
|
+
:linkage => {:id => '1', :type => 'author'}
|
289
|
+
}
|
290
|
+
}
|
291
|
+
}]
|
292
|
+
}) }
|
293
|
+
end
|
156
294
|
end
|
157
295
|
end
|
158
296
|
|
@@ -169,17 +307,37 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
169
307
|
end
|
170
308
|
end
|
171
309
|
|
172
|
-
|
173
|
-
:
|
174
|
-
|
175
|
-
|
176
|
-
:
|
177
|
-
:
|
178
|
-
|
310
|
+
context 'for an individual resource' do
|
311
|
+
let(:resource) { post }
|
312
|
+
|
313
|
+
it { should eq({
|
314
|
+
:data => {
|
315
|
+
:type => 'post',
|
316
|
+
:id => '1',
|
317
|
+
:links => {
|
318
|
+
:comments => {
|
319
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
320
|
+
}
|
179
321
|
}
|
180
322
|
}
|
181
|
-
}
|
182
|
-
|
323
|
+
}) }
|
324
|
+
end
|
325
|
+
|
326
|
+
context 'for a resource collection' do
|
327
|
+
let(:resource) { [post] }
|
328
|
+
|
329
|
+
it { should eq({
|
330
|
+
:data => [{
|
331
|
+
:type => 'post',
|
332
|
+
:id => '1',
|
333
|
+
:links => {
|
334
|
+
:comments => {
|
335
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
336
|
+
}
|
337
|
+
}
|
338
|
+
}]
|
339
|
+
}) }
|
340
|
+
end
|
183
341
|
end
|
184
342
|
|
185
343
|
context 'with a block provided' do
|
@@ -189,17 +347,37 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
189
347
|
end
|
190
348
|
end
|
191
349
|
|
192
|
-
|
193
|
-
:
|
194
|
-
|
195
|
-
|
196
|
-
:
|
197
|
-
:
|
198
|
-
|
350
|
+
context 'for an individual resource' do
|
351
|
+
let(:resource) { post }
|
352
|
+
|
353
|
+
it { should eq({
|
354
|
+
:data => {
|
355
|
+
:type => 'post',
|
356
|
+
:id => '1',
|
357
|
+
:links => {
|
358
|
+
:replies => {
|
359
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
360
|
+
}
|
199
361
|
}
|
200
362
|
}
|
201
|
-
}
|
202
|
-
|
363
|
+
}) }
|
364
|
+
end
|
365
|
+
|
366
|
+
context 'for a resource collection' do
|
367
|
+
let(:resource) { [post] }
|
368
|
+
|
369
|
+
it { should eq({
|
370
|
+
:data => [{
|
371
|
+
:type => 'post',
|
372
|
+
:id => '1',
|
373
|
+
:links => {
|
374
|
+
:replies => {
|
375
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
376
|
+
}
|
377
|
+
}
|
378
|
+
}]
|
379
|
+
}) }
|
380
|
+
end
|
203
381
|
end
|
204
382
|
|
205
383
|
context 'with the :embed_in_root option' do
|
@@ -209,25 +387,53 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
209
387
|
end
|
210
388
|
end
|
211
389
|
|
212
|
-
|
213
|
-
:
|
214
|
-
|
215
|
-
|
216
|
-
:
|
217
|
-
:
|
218
|
-
|
390
|
+
context 'for an individual resource' do
|
391
|
+
let(:resource) { post }
|
392
|
+
|
393
|
+
it { should eq({
|
394
|
+
:data => {
|
395
|
+
:type => 'post',
|
396
|
+
:id => '1',
|
397
|
+
:links => {
|
398
|
+
:comments => {
|
399
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
400
|
+
}
|
219
401
|
}
|
402
|
+
},
|
403
|
+
|
404
|
+
:included => {
|
405
|
+
:comments => [{
|
406
|
+
:type => 'comment',
|
407
|
+
:id => '1',
|
408
|
+
:links => {}
|
409
|
+
}]
|
220
410
|
}
|
221
|
-
}
|
411
|
+
}) }
|
412
|
+
end
|
222
413
|
|
223
|
-
|
224
|
-
|
225
|
-
|
414
|
+
context 'for a resource collection' do
|
415
|
+
let(:resource) { [post] }
|
416
|
+
|
417
|
+
it { should eq({
|
418
|
+
:data => [{
|
419
|
+
:type => 'post',
|
226
420
|
:id => '1',
|
227
|
-
:links => {
|
228
|
-
|
229
|
-
|
230
|
-
|
421
|
+
:links => {
|
422
|
+
:comments => {
|
423
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
424
|
+
}
|
425
|
+
}
|
426
|
+
}],
|
427
|
+
|
428
|
+
:included => {
|
429
|
+
:comments => [{
|
430
|
+
:type => 'comment',
|
431
|
+
:id => '1',
|
432
|
+
:links => {}
|
433
|
+
}]
|
434
|
+
}
|
435
|
+
}) }
|
436
|
+
end
|
231
437
|
end
|
232
438
|
|
233
439
|
context 'with the :polymorphic option' do
|
@@ -237,17 +443,37 @@ RSpec.describe Ivy::Serializers::Formats::JSONAPI do
|
|
237
443
|
end
|
238
444
|
end
|
239
445
|
|
240
|
-
|
241
|
-
:
|
242
|
-
|
243
|
-
|
244
|
-
:
|
245
|
-
:
|
246
|
-
|
446
|
+
context 'for an individual resource' do
|
447
|
+
let(:resource) { post }
|
448
|
+
|
449
|
+
it { should eq({
|
450
|
+
:data => {
|
451
|
+
:type => 'post',
|
452
|
+
:id => '1',
|
453
|
+
:links => {
|
454
|
+
:comments => {
|
455
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
456
|
+
}
|
247
457
|
}
|
248
458
|
}
|
249
|
-
}
|
250
|
-
|
459
|
+
}) }
|
460
|
+
end
|
461
|
+
|
462
|
+
context 'for a resource collection' do
|
463
|
+
let(:resource) { [post] }
|
464
|
+
|
465
|
+
it { should eq({
|
466
|
+
:data => [{
|
467
|
+
:type => 'post',
|
468
|
+
:id => '1',
|
469
|
+
:links => {
|
470
|
+
:comments => {
|
471
|
+
:linkage => [{:id => '1', :type => 'comment'}]
|
472
|
+
}
|
473
|
+
}
|
474
|
+
}]
|
475
|
+
}) }
|
476
|
+
end
|
251
477
|
end
|
252
478
|
end
|
253
479
|
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ivy-serializers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dray Lacy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.2.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.2.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: hash_generator
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,34 +94,6 @@ dependencies:
|
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: 0.10.0
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: activesupport
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 2.2.1
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 2.2.1
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: hash_generator
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '1.1'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '1.1'
|
97
97
|
description:
|
98
98
|
email:
|
99
99
|
- dray@envylabs.com
|
@@ -111,7 +111,6 @@ files:
|
|
111
111
|
- ivy-serializers.gemspec
|
112
112
|
- lib/ivy-serializers.rb
|
113
113
|
- lib/ivy/serializers.rb
|
114
|
-
- lib/ivy/serializers/action_controller/serialization_support.rb
|
115
114
|
- lib/ivy/serializers/attribute.rb
|
116
115
|
- lib/ivy/serializers/documents.rb
|
117
116
|
- lib/ivy/serializers/documents/document.rb
|
@@ -122,7 +121,6 @@ files:
|
|
122
121
|
- lib/ivy/serializers/formats/json.rb
|
123
122
|
- lib/ivy/serializers/formats/json_api.rb
|
124
123
|
- lib/ivy/serializers/mapping.rb
|
125
|
-
- lib/ivy/serializers/railtie.rb
|
126
124
|
- lib/ivy/serializers/registry.rb
|
127
125
|
- lib/ivy/serializers/relationships.rb
|
128
126
|
- lib/ivy/serializers/relationships/belongs_to.rb
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Ivy
|
2
|
-
module Serializers
|
3
|
-
module ActionController
|
4
|
-
module SerializationSupport
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
class SerializerNotFound < ::StandardError
|
8
|
-
end
|
9
|
-
|
10
|
-
included do
|
11
|
-
class_attribute :serializer, :instance_writer => false
|
12
|
-
class_attribute :serialization_format, :instance_writer => false
|
13
|
-
self.serialization_format = Formats::ActiveModelSerializers
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
%w[ _render_option_json _render_with_renderer_json ].each do |renderer_method|
|
19
|
-
define_method(renderer_method) do |resource, options|
|
20
|
-
unless serializer
|
21
|
-
raise SerializerNotFound, "No serializer found in #{self.class.name}"
|
22
|
-
end
|
23
|
-
|
24
|
-
unless resource.kind_of?(::Hash)
|
25
|
-
resource = Documents.create(serializer, controller_name, resource)
|
26
|
-
resource = serialization_format.new(resource)
|
27
|
-
end
|
28
|
-
|
29
|
-
super(resource, options)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'ivy/serializers/action_controller/serialization_support'
|
2
|
-
|
3
|
-
module Ivy
|
4
|
-
module Serializers
|
5
|
-
class Railtie < ::Rails::Railtie
|
6
|
-
initializer 'ivy.serializers.controllers' do
|
7
|
-
ActiveSupport.on_load(:action_controller) do
|
8
|
-
include ::Ivy::Serializers::ActionController::SerializationSupport
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|