cm-active_model_serializers 0.10.0.rc1.1

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.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.travis.yml +26 -0
  4. data/CHANGELOG.md +8 -0
  5. data/CONTRIBUTING.md +31 -0
  6. data/Gemfile +17 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +326 -0
  9. data/Rakefile +12 -0
  10. data/cm-active_model_serializers.gemspec +26 -0
  11. data/lib/action_controller/serialization.rb +62 -0
  12. data/lib/active_model/serializer.rb +261 -0
  13. data/lib/active_model/serializer/adapter.rb +87 -0
  14. data/lib/active_model/serializer/adapter/fragment_cache.rb +78 -0
  15. data/lib/active_model/serializer/adapter/json.rb +52 -0
  16. data/lib/active_model/serializer/adapter/json/fragment_cache.rb +15 -0
  17. data/lib/active_model/serializer/adapter/json_api.rb +152 -0
  18. data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +22 -0
  19. data/lib/active_model/serializer/adapter/null.rb +11 -0
  20. data/lib/active_model/serializer/array_serializer.rb +32 -0
  21. data/lib/active_model/serializer/configuration.rb +13 -0
  22. data/lib/active_model/serializer/fieldset.rb +40 -0
  23. data/lib/active_model/serializer/version.rb +5 -0
  24. data/lib/active_model_serializers.rb +18 -0
  25. data/lib/generators/serializer/USAGE +6 -0
  26. data/lib/generators/serializer/serializer_generator.rb +37 -0
  27. data/lib/generators/serializer/templates/serializer.rb +8 -0
  28. data/test/action_controller/adapter_selector_test.rb +51 -0
  29. data/test/action_controller/explicit_serializer_test.rb +110 -0
  30. data/test/action_controller/json_api_linked_test.rb +173 -0
  31. data/test/action_controller/serialization_scope_name_test.rb +63 -0
  32. data/test/action_controller/serialization_test.rb +365 -0
  33. data/test/adapter/fragment_cache_test.rb +27 -0
  34. data/test/adapter/json/belongs_to_test.rb +48 -0
  35. data/test/adapter/json/collection_test.rb +73 -0
  36. data/test/adapter/json/has_many_test.rb +36 -0
  37. data/test/adapter/json_api/belongs_to_test.rb +147 -0
  38. data/test/adapter/json_api/collection_test.rb +89 -0
  39. data/test/adapter/json_api/has_many_embed_ids_test.rb +45 -0
  40. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  41. data/test/adapter/json_api/has_many_test.rb +106 -0
  42. data/test/adapter/json_api/has_one_test.rb +59 -0
  43. data/test/adapter/json_api/linked_test.rb +257 -0
  44. data/test/adapter/json_test.rb +34 -0
  45. data/test/adapter/null_test.rb +25 -0
  46. data/test/adapter_test.rb +43 -0
  47. data/test/array_serializer_test.rb +43 -0
  48. data/test/fixtures/poro.rb +213 -0
  49. data/test/serializers/adapter_for_test.rb +50 -0
  50. data/test/serializers/associations_test.rb +127 -0
  51. data/test/serializers/attribute_test.rb +38 -0
  52. data/test/serializers/attributes_test.rb +63 -0
  53. data/test/serializers/cache_test.rb +128 -0
  54. data/test/serializers/configuration_test.rb +15 -0
  55. data/test/serializers/fieldset_test.rb +26 -0
  56. data/test/serializers/generators_test.rb +59 -0
  57. data/test/serializers/meta_test.rb +78 -0
  58. data/test/serializers/options_test.rb +21 -0
  59. data/test/serializers/serializer_for_test.rb +65 -0
  60. data/test/serializers/urls_test.rb +26 -0
  61. data/test/test_helper.rb +38 -0
  62. metadata +195 -0
@@ -0,0 +1,59 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class HasOneTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @bio = Bio.new(id: 43, content: 'AMS Contributor')
11
+ @author.bio = @bio
12
+ @bio.author = @author
13
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
14
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
15
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
16
+ @post.comments = [@comment]
17
+ @anonymous_post.comments = []
18
+ @comment.post = @post
19
+ @comment.author = nil
20
+ @post.author = @author
21
+ @anonymous_post.author = nil
22
+ @blog = Blog.new(id: 1, name: "My Blog!!")
23
+ @blog.writer = @author
24
+ @blog.articles = [@post, @anonymous_post]
25
+ @author.posts = []
26
+ @author.roles = []
27
+
28
+ @serializer = AuthorSerializer.new(@author)
29
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'bio,posts')
30
+ end
31
+
32
+ def test_includes_bio_id
33
+ expected = { linkage: { type: "bios", id: "43" } }
34
+
35
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:bio])
36
+ end
37
+
38
+ def test_includes_linked_bio
39
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'bio')
40
+
41
+ expected = [
42
+ {
43
+ id: "43",
44
+ rating: nil,
45
+ type: "bios",
46
+ content:"AMS Contributor",
47
+ links: {
48
+ author: { linkage: { type: "authors", id: "1" } }
49
+ }
50
+ }
51
+ ]
52
+
53
+ assert_equal(expected, @adapter.serializable_hash[:included])
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,257 @@
1
+ require 'test_helper'
2
+ module ActiveModel
3
+ class Serializer
4
+ class Adapter
5
+ class JsonApi
6
+ class LinkedTest < Minitest::Test
7
+ def setup
8
+ ActionController::Base.cache_store.clear
9
+ @author1 = Author.new(id: 1, name: 'Steve K.')
10
+ @author2 = Author.new(id: 2, name: 'Tenderlove')
11
+ @bio1 = Bio.new(id: 1, content: 'AMS Contributor')
12
+ @bio2 = Bio.new(id: 2, content: 'Rails Contributor')
13
+ @first_post = Post.new(id: 10, title: 'Hello!!', body: 'Hello, world!!')
14
+ @second_post = Post.new(id: 20, title: 'New Post', body: 'Body')
15
+ @third_post = Post.new(id: 30, title: 'Yet Another Post', body: 'Body')
16
+ @blog = Blog.new({ name: 'AMS Blog' })
17
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
18
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
19
+ @first_post.blog = @blog
20
+ @second_post.blog = @blog
21
+ @third_post.blog = nil
22
+ @first_post.comments = [@first_comment, @second_comment]
23
+ @second_post.comments = []
24
+ @third_post.comments = []
25
+ @first_post.author = @author1
26
+ @second_post.author = @author2
27
+ @third_post.author = @author1
28
+ @first_comment.post = @first_post
29
+ @first_comment.author = nil
30
+ @second_comment.post = @first_post
31
+ @second_comment.author = nil
32
+ @author1.posts = [@first_post, @third_post]
33
+ @author1.bio = @bio1
34
+ @author1.roles = []
35
+ @author2.posts = [@second_post]
36
+ @author2.bio = @bio2
37
+ @author2.roles = []
38
+ @bio1.author = @author1
39
+ @bio2.author = @author2
40
+ end
41
+
42
+ def test_include_multiple_posts_and_linked_array
43
+ serializer = ArraySerializer.new([@first_post, @second_post])
44
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
45
+ serializer,
46
+ include: ['author', 'author.bio', 'comments']
47
+ )
48
+ alt_adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
49
+ serializer,
50
+ include: 'author,author.bio,comments'
51
+ )
52
+
53
+ expected = {
54
+ data: [
55
+ {
56
+ id: "10",
57
+ title: "Hello!!",
58
+ body: "Hello, world!!",
59
+ type: "posts",
60
+ links: {
61
+ comments: { linkage: [ { type: "comments", id: '1' }, { type: "comments", id: '2' } ] },
62
+ blog: { linkage: { type: "blogs", id: "999" } },
63
+ author: { linkage: { type: "authors", id: "1" } }
64
+ }
65
+ },
66
+ {
67
+ id: "20",
68
+ title: "New Post",
69
+ body: "Body",
70
+ type: "posts",
71
+ links: {
72
+ comments: { linkage: [] },
73
+ blog: { linkage: { type: "blogs", id: "999" } },
74
+ author: { linkage: { type: "authors", id: "2" } }
75
+ }
76
+ }
77
+ ],
78
+ included: [
79
+ {
80
+ id: "1",
81
+ body: "ZOMG A COMMENT",
82
+ type: "comments",
83
+ links: {
84
+ post: { linkage: { type: "posts", id: "10" } },
85
+ author: { linkage: nil }
86
+ }
87
+ }, {
88
+ id: "2",
89
+ body: "ZOMG ANOTHER COMMENT",
90
+ type: "comments",
91
+ links: {
92
+ post: { linkage: { type: "posts", id: "10" } },
93
+ author: { linkage: nil }
94
+ }
95
+ }, {
96
+ id: "1",
97
+ name: "Steve K.",
98
+ type: "authors",
99
+ links: {
100
+ posts: { linkage: [ { type: "posts", id: "10" }, { type: "posts", id: "30" } ] },
101
+ roles: { linkage: [] },
102
+ bio: { linkage: { type: "bios", id: "1" } }
103
+ }
104
+ }, {
105
+ id: "1",
106
+ rating: nil,
107
+ type: "bios",
108
+ content: "AMS Contributor",
109
+ links: {
110
+ author: { linkage: { type: "authors", id: "1" } }
111
+ }
112
+ }, {
113
+ id: "2",
114
+ name: "Tenderlove",
115
+ type: "authors",
116
+ links: {
117
+ posts: { linkage: [ { type: "posts", id:"20" } ] },
118
+ roles: { linkage: [] },
119
+ bio: { linkage: { type: "bios", id: "2" } }
120
+ }
121
+ }, {
122
+ id: "2",
123
+ rating: nil,
124
+ type: "bios",
125
+ content: "Rails Contributor",
126
+ links: {
127
+ author: { linkage: { type: "authors", id: "2" } }
128
+ }
129
+ }
130
+ ]
131
+ }
132
+ assert_equal expected, adapter.serializable_hash
133
+ assert_equal expected, alt_adapter.serializable_hash
134
+ end
135
+
136
+ def test_include_multiple_posts_and_linked
137
+ serializer = BioSerializer.new @bio1
138
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
139
+ serializer,
140
+ include: ['author', 'author.posts']
141
+ )
142
+ alt_adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
143
+ serializer,
144
+ include: 'author,author.posts'
145
+ )
146
+
147
+ expected = [
148
+ {
149
+ id: "1",
150
+ type: "authors",
151
+ name: "Steve K.",
152
+ links: {
153
+ posts: { linkage: [ { type: "posts", id: "10"}, { type: "posts", id: "30" }] },
154
+ roles: { linkage: [] },
155
+ bio: { linkage: { type: "bios", id: "1" }}
156
+ }
157
+ }, {
158
+ id: "10",
159
+ type: "posts",
160
+ title: "Hello!!",
161
+ body: "Hello, world!!",
162
+ links: {
163
+ comments: { linkage: [ { type: "comments", id: "1"}, { type: "comments", id: "2" }] },
164
+ blog: { linkage: { type: "blogs", id: "999" } },
165
+ author: { linkage: { type: "authors", id: "1" } }
166
+ }
167
+ }, {
168
+ id: "30",
169
+ type: "posts",
170
+ title: "Yet Another Post",
171
+ body: "Body",
172
+ links: {
173
+ comments: { linkage: [] },
174
+ blog: { linkage: { type: "blogs", id: "999" } },
175
+ author: { linkage: { type: "authors", id: "1" } }
176
+ }
177
+ }
178
+ ]
179
+
180
+ assert_equal expected, adapter.serializable_hash[:included]
181
+ assert_equal expected, alt_adapter.serializable_hash[:included]
182
+ end
183
+
184
+ def test_ignore_model_namespace_for_linked_resource_type
185
+ spammy_post = Post.new(id: 123)
186
+ spammy_post.related = [Spam::UnrelatedLink.new(id: 456)]
187
+ serializer = SpammyPostSerializer.new(spammy_post)
188
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
189
+ links = adapter.serializable_hash[:data][:links]
190
+ expected = {
191
+ related: {
192
+ linkage: [{
193
+ type: 'unrelated_links',
194
+ id: '456'
195
+ }]
196
+ }
197
+ }
198
+ assert_equal expected, links
199
+ end
200
+
201
+ def test_multiple_references_to_same_resource
202
+ serializer = ArraySerializer.new([@first_comment, @second_comment])
203
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
204
+ serializer,
205
+ include: ['post']
206
+ )
207
+
208
+ expected = [
209
+ {
210
+ id: "10",
211
+ title: "Hello!!",
212
+ body: "Hello, world!!",
213
+ type: "posts",
214
+ links: {
215
+ comments: {
216
+ linkage: [{type: "comments", id: "1"}, {type: "comments", id: "2"}]
217
+ },
218
+ blog: {
219
+ linkage: {type: "blogs", id: "999"}
220
+ },
221
+ author: {
222
+ linkage: {type: "authors", id: "1"}
223
+ }
224
+ }
225
+ }
226
+ ]
227
+
228
+ assert_equal expected, adapter.serializable_hash[:included]
229
+ end
230
+
231
+ def test_nil_link_with_specified_serializer
232
+ @first_post.author = nil
233
+ serializer = PostPreviewSerializer.new(@first_post)
234
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
235
+ serializer,
236
+ include: ['author']
237
+ )
238
+
239
+ expected = {
240
+ data: {
241
+ id: "10",
242
+ title: "Hello!!",
243
+ body: "Hello, world!!",
244
+ type: "posts",
245
+ links: {
246
+ comments: { linkage: [ { type: "comments", id: '1' }, { type: "comments", id: '2' } ] },
247
+ author: { linkage: nil }
248
+ }
249
+ }
250
+ }
251
+ assert_equal expected, adapter.serializable_hash
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
@@ -0,0 +1,34 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonTest < Minitest::Test
7
+ def setup
8
+ ActionController::Base.cache_store.clear
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @post = Post.new(title: 'New Post', body: 'Body')
11
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
12
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
13
+ @post.comments = [@first_comment, @second_comment]
14
+ @first_comment.post = @post
15
+ @second_comment.post = @post
16
+ @post.author = @author
17
+ @blog = Blog.new(id: 1, name: "My Blog!!")
18
+ @post.blog = @blog
19
+
20
+ @serializer = PostSerializer.new(@post)
21
+ @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer)
22
+ end
23
+
24
+ def test_has_many
25
+ assert_equal([
26
+ {id: 1, body: 'ZOMG A COMMENT'},
27
+ {id: 2, body: 'ZOMG ANOTHER COMMENT'}
28
+ ], @adapter.serializable_hash[:comments])
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class NullTest < Minitest::Test
7
+ def setup
8
+ profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
9
+ serializer = ProfileSerializer.new(profile)
10
+
11
+ @adapter = Null.new(serializer)
12
+ end
13
+
14
+ def test_serializable_hash
15
+ assert_equal({}, @adapter.serializable_hash)
16
+ end
17
+
18
+ def test_it_returns_empty_json
19
+ assert_equal('{}', @adapter.to_json)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class AdapterTest < Minitest::Test
6
+ def setup
7
+ profile = Profile.new
8
+ @serializer = ProfileSerializer.new(profile)
9
+ @adapter = ActiveModel::Serializer::Adapter.new(@serializer)
10
+ end
11
+
12
+ def test_serializable_hash_is_abstract_method
13
+ assert_raises(NotImplementedError) do
14
+ @adapter.serializable_hash(only: [:name])
15
+ end
16
+ end
17
+
18
+ def test_serializer
19
+ assert_equal @serializer, @adapter.serializer
20
+ end
21
+
22
+ def test_adapter_class_for_known_adapter
23
+ klass = ActiveModel::Serializer::Adapter.adapter_class(:json_api)
24
+ assert_equal ActiveModel::Serializer::Adapter::JsonApi, klass
25
+ end
26
+
27
+ def test_adapter_class_for_unknown_adapter
28
+ klass = ActiveModel::Serializer::Adapter.adapter_class(:json_simple)
29
+ assert_nil klass
30
+ end
31
+
32
+ def test_create_adapter
33
+ adapter = ActiveModel::Serializer::Adapter.create(@serializer)
34
+ assert_equal ActiveModel::Serializer::Adapter::Json, adapter.class
35
+ end
36
+
37
+ def test_create_adapter_with_override
38
+ adapter = ActiveModel::Serializer::Adapter.create(@serializer, { adapter: :json_api})
39
+ assert_equal ActiveModel::Serializer::Adapter::JsonApi, adapter.class
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class ArraySerializerTest < Minitest::Test
6
+ def setup
7
+ @comment = Comment.new
8
+ @post = Post.new
9
+ @serializer = ArraySerializer.new([@comment, @post], {some: :options})
10
+ end
11
+
12
+ def test_respond_to_each
13
+ assert_respond_to @serializer, :each
14
+ end
15
+
16
+ def test_each_object_should_be_serialized_with_appropriate_serializer
17
+ serializers = @serializer.to_a
18
+
19
+ assert_kind_of CommentSerializer, serializers.first
20
+ assert_kind_of Comment, serializers.first.object
21
+
22
+ assert_kind_of PostSerializer, serializers.last
23
+ assert_kind_of Post, serializers.last.object
24
+
25
+ assert_equal serializers.last.custom_options[:some], :options
26
+ end
27
+
28
+ def test_serializer_option_not_passed_to_each_serializer
29
+ serializers = ArraySerializer.new([@post], {serializer: PostSerializer}).to_a
30
+
31
+ refute serializers.first.custom_options.key?(:serializer)
32
+ end
33
+
34
+ def test_meta_and_meta_key_attr_readers
35
+ meta_content = {meta: "the meta", meta_key: "the meta key"}
36
+ @serializer = ArraySerializer.new([@comment, @post], meta_content)
37
+
38
+ assert_equal @serializer.meta, "the meta"
39
+ assert_equal @serializer.meta_key, "the meta key"
40
+ end
41
+ end
42
+ end
43
+ end