active_model_serializers 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ module ActiveModel
2
+ class Serializer
3
+ VERSION = "0.5.0"
4
+ end
5
+ end
@@ -3,6 +3,17 @@ require "active_support/core_ext/string/inflections"
3
3
  require "active_model"
4
4
  require "active_model/serializer"
5
5
 
6
+ if defined?(Rails)
7
+ module ActiveModel
8
+ class Railtie < Rails::Railtie
9
+ generators do |app|
10
+ Rails::Generators.configure!(app.config.generators)
11
+ require "generators/resource_override"
12
+ end
13
+ end
14
+ end
15
+ end
16
+
6
17
  module ActiveModel::SerializerSupport
7
18
  extend ActiveSupport::Concern
8
19
 
@@ -0,0 +1,13 @@
1
+ require "rails/generators"
2
+ require "rails/generators/rails/resource/resource_generator"
3
+
4
+ module Rails
5
+ module Generators
6
+ ResourceGenerator.class_eval do
7
+ def add_serializer
8
+ invoke "serializer"
9
+ end
10
+ end
11
+ end
12
+ end
13
+
@@ -30,7 +30,7 @@ module Rails
30
30
  # Only works on 3.2
31
31
  # elsif (n = Rails::Generators.namespace) && n.const_defined?(:ApplicationSerializer)
32
32
  # "ApplicationSerializer"
33
- elsif Object.const_defined?(:ApplicationSerializer)
33
+ elsif defined?(:ApplicationSerializer)
34
34
  "ApplicationSerializer"
35
35
  else
36
36
  "ActiveModel::Serializer"
@@ -0,0 +1,392 @@
1
+ require "test_helper"
2
+
3
+ class AssociationTest < ActiveModel::TestCase
4
+ def def_serializer(&block)
5
+ Class.new(ActiveModel::Serializer, &block)
6
+ end
7
+
8
+ class Model
9
+ def initialize(hash={})
10
+ @attributes = hash
11
+ end
12
+
13
+ def read_attribute_for_serialization(name)
14
+ @attributes[name]
15
+ end
16
+
17
+ def as_json(*)
18
+ { :model => "Model" }
19
+ end
20
+
21
+ def method_missing(meth, *args)
22
+ if meth.to_s =~ /^(.*)=$/
23
+ @attributes[$1.to_sym] = args[0]
24
+ elsif @attributes.key?(meth)
25
+ @attributes[meth]
26
+ else
27
+ super
28
+ end
29
+ end
30
+ end
31
+
32
+ def setup
33
+ @post = Model.new(:title => "New Post", :body => "Body")
34
+ @comment = Model.new(:id => 1, :body => "ZOMG A COMMENT")
35
+ @post.comments = [ @comment ]
36
+ @post.comment = @comment
37
+
38
+ @comment_serializer_class = def_serializer do
39
+ attributes :id, :body
40
+ end
41
+
42
+ @post_serializer_class = def_serializer do
43
+ attributes :title, :body
44
+ end
45
+
46
+ @post_serializer = @post_serializer_class.new(@post)
47
+
48
+ @hash = {}
49
+ @root_hash = {}
50
+ end
51
+
52
+ def include!(key, options={})
53
+ @post_serializer.include! key, {
54
+ :embed => :ids,
55
+ :include => true,
56
+ :hash => @root_hash,
57
+ :node => @hash,
58
+ :serializer => @comment_serializer_class
59
+ }.merge(options)
60
+ end
61
+
62
+ def include_bare!(key, options={})
63
+ @post_serializer.include! key, {
64
+ :hash => @root_hash,
65
+ :node => @hash,
66
+ :serializer => @comment_serializer_class
67
+ }.merge(options)
68
+ end
69
+
70
+ class NoDefaults < AssociationTest
71
+ def test_include_bang_has_many_associations
72
+ include! :comments, :value => @post.comments
73
+
74
+ assert_equal({
75
+ :comments => [ 1 ]
76
+ }, @hash)
77
+
78
+ assert_equal({
79
+ :comments => [
80
+ { :id => 1, :body => "ZOMG A COMMENT" }
81
+ ]
82
+ }, @root_hash)
83
+ end
84
+
85
+ def test_include_bang_with_embed_false
86
+ include! :comments, :value => @post.comments, :embed => false
87
+
88
+ assert_equal({}, @hash)
89
+ assert_equal({}, @root_hash)
90
+ end
91
+
92
+ def test_include_bang_with_embed_ids_include_false
93
+ include! :comments, :value => @post.comments, :embed => :ids, :include => false
94
+
95
+ assert_equal({
96
+ :comments => [ 1 ]
97
+ }, @hash)
98
+
99
+ assert_equal({}, @root_hash)
100
+ end
101
+
102
+ def test_include_bang_has_one_associations
103
+ include! :comment, :value => @post.comment
104
+
105
+ assert_equal({
106
+ :comment => 1
107
+ }, @hash)
108
+
109
+ assert_equal({
110
+ :comments => [{ :id => 1, :body => "ZOMG A COMMENT" }]
111
+ }, @root_hash)
112
+ end
113
+ end
114
+
115
+ class DefaultsTest < AssociationTest
116
+ def test_with_default_has_many
117
+ @post_serializer_class.class_eval do
118
+ has_many :comments
119
+ end
120
+
121
+ include! :comments
122
+
123
+ assert_equal({
124
+ :comments => [ 1 ]
125
+ }, @hash)
126
+
127
+ assert_equal({
128
+ :comments => [
129
+ { :id => 1, :body => "ZOMG A COMMENT" }
130
+ ]
131
+ }, @root_hash)
132
+ end
133
+
134
+ def test_with_default_has_one
135
+ @post_serializer_class.class_eval do
136
+ has_one :comment
137
+ end
138
+
139
+ include! :comment
140
+
141
+ assert_equal({
142
+ :comment => 1
143
+ }, @hash)
144
+
145
+ assert_equal({
146
+ :comments => [
147
+ { :id => 1, :body => "ZOMG A COMMENT" }
148
+ ]
149
+ }, @root_hash)
150
+ end
151
+
152
+ def test_with_default_has_many_with_custom_key
153
+ @post_serializer_class.class_eval do
154
+ has_many :comments, :key => :custom_comments
155
+ end
156
+
157
+ include! :comments
158
+
159
+ assert_equal({
160
+ :custom_comments => [ 1 ]
161
+ }, @hash)
162
+
163
+ assert_equal({
164
+ :custom_comments => [
165
+ { :id => 1, :body => "ZOMG A COMMENT" }
166
+ ]
167
+ }, @root_hash)
168
+ end
169
+
170
+ def test_with_default_has_one_with_custom_key
171
+ @post_serializer_class.class_eval do
172
+ has_one :comment, :key => :custom_comment
173
+ end
174
+
175
+ include! :comment
176
+
177
+ assert_equal({
178
+ :custom_comment => 1
179
+ }, @hash)
180
+
181
+ assert_equal({
182
+ :custom_comments => [
183
+ { :id => 1, :body => "ZOMG A COMMENT" }
184
+ ]
185
+ }, @root_hash)
186
+ end
187
+
188
+ def test_with_default_has_one_with_custom_key
189
+ @post_serializer_class.class_eval do
190
+ has_one :comment, :key => :custom_comment
191
+ end
192
+
193
+ include! :comment
194
+
195
+ assert_equal({
196
+ :custom_comment => 1
197
+ }, @hash)
198
+
199
+ assert_equal({
200
+ :custom_comments => [
201
+ { :id => 1, :body => "ZOMG A COMMENT" }
202
+ ]
203
+ }, @root_hash)
204
+ end
205
+
206
+ def test_embed_objects_for_has_many_associations
207
+ @post_serializer_class.class_eval do
208
+ has_many :comments, :embed => :objects
209
+ end
210
+
211
+ include_bare! :comments
212
+
213
+ assert_equal({
214
+ :comments => [
215
+ { :id => 1, :body => "ZOMG A COMMENT" }
216
+ ]
217
+ }, @hash)
218
+
219
+ assert_equal({}, @root_hash)
220
+ end
221
+
222
+ def test_embed_ids_for_has_many_associations
223
+ @post_serializer_class.class_eval do
224
+ has_many :comments, :embed => :ids
225
+ end
226
+
227
+ include_bare! :comments
228
+
229
+ assert_equal({
230
+ :comments => [ 1 ]
231
+ }, @hash)
232
+
233
+ assert_equal({}, @root_hash)
234
+ end
235
+
236
+ def test_embed_false_for_has_many_associations
237
+ @post_serializer_class.class_eval do
238
+ has_many :comments, :embed => false
239
+ end
240
+
241
+ include_bare! :comments
242
+
243
+ assert_equal({}, @hash)
244
+ assert_equal({}, @root_hash)
245
+ end
246
+
247
+ def test_embed_ids_include_true_for_has_many_associations
248
+ @post_serializer_class.class_eval do
249
+ has_many :comments, :embed => :ids, :include => true
250
+ end
251
+
252
+ include_bare! :comments
253
+
254
+ assert_equal({
255
+ :comments => [ 1 ]
256
+ }, @hash)
257
+
258
+ assert_equal({
259
+ :comments => [
260
+ { :id => 1, :body => "ZOMG A COMMENT" }
261
+ ]
262
+ }, @root_hash)
263
+ end
264
+
265
+ def test_embed_ids_for_has_one_associations
266
+ @post_serializer_class.class_eval do
267
+ has_one :comment, :embed => :ids
268
+ end
269
+
270
+ include_bare! :comment
271
+
272
+ assert_equal({
273
+ :comment => 1
274
+ }, @hash)
275
+
276
+ assert_equal({}, @root_hash)
277
+ end
278
+
279
+ def test_embed_false_for_has_one_associations
280
+ @post_serializer_class.class_eval do
281
+ has_one :comment, :embed => false
282
+ end
283
+
284
+ include_bare! :comment
285
+
286
+ assert_equal({}, @hash)
287
+ assert_equal({}, @root_hash)
288
+ end
289
+
290
+ def test_embed_ids_include_true_for_has_one_associations
291
+ @post_serializer_class.class_eval do
292
+ has_one :comment, :embed => :ids, :include => true
293
+ end
294
+
295
+ include_bare! :comment
296
+
297
+ assert_equal({
298
+ :comment => 1
299
+ }, @hash)
300
+
301
+ assert_equal({
302
+ :comments => [
303
+ { :id => 1, :body => "ZOMG A COMMENT" }
304
+ ]
305
+ }, @root_hash)
306
+ end
307
+ end
308
+
309
+ class InclusionTest < AssociationTest
310
+ def setup
311
+ super
312
+
313
+ comment_serializer_class = @comment_serializer_class
314
+
315
+ @post_serializer_class.class_eval do
316
+ root :post
317
+ embed :ids, :include => true
318
+ has_many :comments, :serializer => comment_serializer_class
319
+ end
320
+ end
321
+
322
+ def test_when_it_is_included
323
+ post_serializer = @post_serializer_class.new(
324
+ @post, :include => [:comments]
325
+ )
326
+
327
+ json = post_serializer.as_json
328
+
329
+ assert_equal({
330
+ :post => {
331
+ :title => "New Post",
332
+ :body => "Body",
333
+ :comments => [ 1 ]
334
+ },
335
+ :comments => [
336
+ { :id => 1, :body => "ZOMG A COMMENT" }
337
+ ]
338
+ }, json)
339
+ end
340
+
341
+ def test_when_it_is_not_included
342
+ post_serializer = @post_serializer_class.new(
343
+ @post, :include => []
344
+ )
345
+
346
+ json = post_serializer.as_json
347
+
348
+ assert_equal({
349
+ :post => {
350
+ :title => "New Post",
351
+ :body => "Body",
352
+ :comments => [ 1 ]
353
+ }
354
+ }, json)
355
+ end
356
+
357
+ def test_when_it_is_excluded
358
+ post_serializer = @post_serializer_class.new(
359
+ @post, :exclude => [:comments]
360
+ )
361
+
362
+ json = post_serializer.as_json
363
+
364
+ assert_equal({
365
+ :post => {
366
+ :title => "New Post",
367
+ :body => "Body",
368
+ :comments => [ 1 ]
369
+ }
370
+ }, json)
371
+ end
372
+
373
+ def test_when_it_is_not_excluded
374
+ post_serializer = @post_serializer_class.new(
375
+ @post, :exclude => []
376
+ )
377
+
378
+ json = post_serializer.as_json
379
+
380
+ assert_equal({
381
+ :post => {
382
+ :title => "New Post",
383
+ :body => "Body",
384
+ :comments => [ 1 ]
385
+ },
386
+ :comments => [
387
+ { :id => 1, :body => "ZOMG A COMMENT" }
388
+ ]
389
+ }, json)
390
+ end
391
+ end
392
+ end
@@ -16,12 +16,12 @@ class SerializerGeneratorTest < Rails::Generators::TestCase
16
16
 
17
17
  def test_generates_a_serializer
18
18
  run_generator
19
- assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer/
19
+ assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ApplicationSerializer/
20
20
  end
21
21
 
22
22
  def test_generates_a_namespaced_serializer
23
23
  run_generator ["admin/account"]
24
- assert_file "app/serializers/admin/account_serializer.rb", /class Admin::AccountSerializer < ActiveModel::Serializer/
24
+ assert_file "app/serializers/admin/account_serializer.rb", /class Admin::AccountSerializer < ApplicationSerializer/
25
25
  end
26
26
 
27
27
  def test_uses_application_serializer_if_one_exists
@@ -62,6 +62,6 @@ class SerializerGeneratorTest < Rails::Generators::TestCase
62
62
 
63
63
  def test_with_no_attributes_does_not_add_extra_space
64
64
  run_generator ["account"]
65
- assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ActiveModel::Serializer\nend/
65
+ assert_file "app/serializers/account_serializer.rb", /class AccountSerializer < ApplicationSerializer\nend/
66
66
  end
67
67
  end