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,36 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class Json
7
+ class HasManyTestTest < Minitest::Test
8
+ def setup
9
+ ActionController::Base.cache_store.clear
10
+ @author = Author.new(id: 1, name: 'Steve K.')
11
+ @post = Post.new(title: 'New Post', body: 'Body')
12
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
13
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
14
+ @post.comments = [@first_comment, @second_comment]
15
+ @post.author = @author
16
+ @first_comment.post = @post
17
+ @second_comment.post = @post
18
+ @blog = Blog.new(id: 1, name: "My Blog!!")
19
+ @post.blog = @blog
20
+
21
+ @serializer = PostSerializer.new(@post)
22
+ @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer)
23
+ end
24
+
25
+ def test_has_many
26
+ assert_equal([
27
+ {id: 1, body: 'ZOMG A COMMENT'},
28
+ {id: 2, body: 'ZOMG ANOTHER COMMENT'}
29
+ ], @adapter.serializable_hash[:comments])
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,147 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class BelongsToTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @author.bio = nil
11
+ @author.roles = []
12
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
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
+ @post.blog = @blog
18
+ @anonymous_post.comments = []
19
+ @anonymous_post.blog = nil
20
+ @comment.post = @post
21
+ @comment.author = nil
22
+ @post.author = @author
23
+ @anonymous_post.author = nil
24
+ @blog = Blog.new(id: 1, name: "My Blog!!")
25
+ @blog.writer = @author
26
+ @blog.articles = [@post, @anonymous_post]
27
+ @author.posts = []
28
+
29
+ @serializer = CommentSerializer.new(@comment)
30
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
31
+ ActionController::Base.cache_store.clear
32
+ end
33
+
34
+ def test_includes_post_id
35
+ expected = { linkage: { type: "posts", id: "42" } }
36
+
37
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:post])
38
+ end
39
+
40
+ def test_includes_linked_post
41
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'post')
42
+ expected = [{
43
+ id: "42",
44
+ type: "posts",
45
+ title: 'New Post',
46
+ body: 'Body',
47
+ links: {
48
+ comments: { linkage: [ { type: "comments", id: "1" } ] },
49
+ blog: { linkage: { type: "blogs", id: "999" } },
50
+ author: { linkage: { type: "authors", id: "1" } }
51
+ }
52
+ }]
53
+ assert_equal expected, @adapter.serializable_hash[:included]
54
+ end
55
+
56
+ def test_limiting_linked_post_fields
57
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'post', fields: {post: [:title]})
58
+ expected = [{
59
+ id: "42",
60
+ type: "posts",
61
+ title: 'New Post',
62
+ links: {
63
+ comments: { linkage: [ { type: "comments", id: "1" } ] },
64
+ blog: { linkage: { type: "blogs", id: "999" } },
65
+ author: { linkage: { type: "authors", id: "1" } }
66
+ }
67
+ }]
68
+ assert_equal expected, @adapter.serializable_hash[:included]
69
+ end
70
+
71
+ def test_include_nil_author
72
+ serializer = PostSerializer.new(@anonymous_post)
73
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
74
+
75
+ assert_equal({comments: { linkage: [] }, blog: { linkage: { type: "blogs", id: "999" } }, author: { linkage: nil }}, adapter.serializable_hash[:data][:links])
76
+ end
77
+
78
+ def test_include_type_for_association_when_different_than_name
79
+ serializer = BlogSerializer.new(@blog)
80
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
81
+ links = adapter.serializable_hash[:data][:links]
82
+ expected = {
83
+ writer: {
84
+ linkage: {
85
+ type: "authors",
86
+ id: "1"
87
+ }
88
+ },
89
+ articles: {
90
+ linkage: [
91
+ {
92
+ type: "posts",
93
+ id: "42"
94
+ },
95
+ {
96
+ type: "posts",
97
+ id: "43"
98
+ }
99
+ ]
100
+ }
101
+ }
102
+ assert_equal expected, links
103
+ end
104
+
105
+ def test_include_linked_resources_with_type_name
106
+ serializer = BlogSerializer.new(@blog)
107
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, include: ['writer', 'articles'])
108
+ linked = adapter.serializable_hash[:included]
109
+ expected = [
110
+ {
111
+ id: "1",
112
+ type: "authors",
113
+ name: "Steve K.",
114
+ links: {
115
+ posts: { linkage: [] },
116
+ roles: { linkage: [] },
117
+ bio: { linkage: nil }
118
+ }
119
+ },{
120
+ id: "42",
121
+ type: "posts",
122
+ title: "New Post",
123
+ body: "Body",
124
+ links: {
125
+ comments: { linkage: [ { type: "comments", id: "1" } ] },
126
+ blog: { linkage: { type: "blogs", id: "999" } },
127
+ author: { linkage: { type: "authors", id: "1" } }
128
+ }
129
+ }, {
130
+ id: "43",
131
+ type: "posts",
132
+ title: "Hello!!",
133
+ body: "Hello, world!!",
134
+ links: {
135
+ comments: { linkage: [] },
136
+ blog: { linkage: { type: "blogs", id: "999" } },
137
+ author: { linkage: nil }
138
+ }
139
+ }
140
+ ]
141
+ assert_equal expected, linked
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,89 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class CollectionTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @author.bio = nil
11
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
12
+ @first_post = Post.new(id: 1, title: 'Hello!!', body: 'Hello, world!!')
13
+ @second_post = Post.new(id: 2, title: 'New Post', body: 'Body')
14
+ @first_post.comments = []
15
+ @second_post.comments = []
16
+ @first_post.blog = @blog
17
+ @second_post.blog = nil
18
+ @first_post.author = @author
19
+ @second_post.author = @author
20
+ @author.posts = [@first_post, @second_post]
21
+
22
+ @serializer = ArraySerializer.new([@first_post, @second_post])
23
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
24
+ ActionController::Base.cache_store.clear
25
+ end
26
+
27
+ def test_include_multiple_posts
28
+ expected = [
29
+ {
30
+ id: "1",
31
+ type: "posts",
32
+ title: "Hello!!",
33
+ body: "Hello, world!!",
34
+ links: {
35
+ comments: { linkage: [] },
36
+ blog: { linkage: { type: "blogs", id: "999" } },
37
+ author: { linkage: { type: "authors", id: "1" } }
38
+ }
39
+ },
40
+ {
41
+ id: "2",
42
+ type: "posts",
43
+ title: "New Post",
44
+ body: "Body",
45
+ links: {
46
+ comments: { linkage: [] },
47
+ blog: { linkage: { type: "blogs", id: "999" } },
48
+ author: { linkage: { type: "authors", id: "1" } }
49
+ }
50
+ }
51
+ ]
52
+
53
+ assert_equal(expected, @adapter.serializable_hash[:data])
54
+ end
55
+
56
+ def test_limiting_fields
57
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, fields: ['title'])
58
+
59
+ expected = [
60
+ {
61
+ id: "1",
62
+ type: "posts",
63
+ title: "Hello!!",
64
+ links: {
65
+ comments: { linkage: [] },
66
+ blog: { linkage: { type: "blogs", id: "999" } },
67
+ author: { linkage: { type: "authors", id: "1" } }
68
+ }
69
+ },
70
+ {
71
+ id: "2",
72
+ type: "posts",
73
+ title: "New Post",
74
+ links: {
75
+ comments: { linkage: [] },
76
+ blog: { linkage: { type: "blogs", id: "999" } },
77
+ author: { linkage: { type: "authors", id: "1" } }
78
+ }
79
+ }
80
+ ]
81
+
82
+ assert_equal(expected, @adapter.serializable_hash[:data])
83
+ end
84
+
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class HasManyEmbedIdsTest < Minitest::Test
8
+ def setup
9
+ @author = Author.new(name: 'Steve K.')
10
+ @author.bio = nil
11
+ @author.roles = nil
12
+ @first_post = Post.new(id: 1, title: 'Hello!!', body: 'Hello, world!!')
13
+ @second_post = Post.new(id: 2, title: 'New Post', body: 'Body')
14
+ @author.posts = [@first_post, @second_post]
15
+ @first_post.author = @author
16
+ @second_post.author = @author
17
+ @first_post.comments = []
18
+ @second_post.comments = []
19
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
20
+ @first_post.blog = @blog
21
+ @second_post.blog = nil
22
+
23
+ @serializer = AuthorSerializer.new(@author)
24
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
25
+ end
26
+
27
+ def test_includes_comment_ids
28
+ expected = {
29
+ linkage: [
30
+ { type: "posts", id: "1"},
31
+ { type: "posts", id: "2"}
32
+ ]
33
+ }
34
+
35
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:posts])
36
+ end
37
+
38
+ def test_no_includes_linked_comments
39
+ assert_nil @adapter.serializable_hash[:linked]
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,98 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ # Test 'has_many :assocs, serializer: AssocXSerializer'
8
+ class HasManyExplicitSerializerTest < Minitest::Test
9
+ def setup
10
+ @post = Post.new(title: 'New Post', body: 'Body')
11
+ @author = Author.new(name: 'Jane Blogger')
12
+ @author.posts = [@post]
13
+ @post.author = @author
14
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
15
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
16
+ @post.comments = [@first_comment, @second_comment]
17
+ @first_comment.post = @post
18
+ @first_comment.author = nil
19
+ @second_comment.post = @post
20
+ @second_comment.author = nil
21
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
22
+ @post.blog = @blog
23
+
24
+ @serializer = PostPreviewSerializer.new(@post)
25
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(
26
+ @serializer,
27
+ include: ['comments', 'author']
28
+ )
29
+ end
30
+
31
+ def test_includes_comment_ids
32
+ expected = {
33
+ linkage: [
34
+ { type: 'comments', id: '1' },
35
+ { type: 'comments', id: '2' }
36
+ ]
37
+ }
38
+
39
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:comments])
40
+ end
41
+
42
+ def test_includes_linked_data
43
+ # If CommentPreviewSerializer is applied correctly the body text will not be present in the output
44
+ expected = [
45
+ {
46
+ id: '1',
47
+ type: 'comments',
48
+ links: {
49
+ post: { linkage: { type: 'posts', id: @post.id.to_s } }
50
+ }
51
+ },
52
+ {
53
+ id: '2',
54
+ type: 'comments',
55
+ links: {
56
+ post: { linkage: { type: 'posts', id: @post.id.to_s } }
57
+ }
58
+ },
59
+ {
60
+ id: @author.id.to_s,
61
+ type: "authors",
62
+ links: {
63
+ posts: { linkage: [ {type: "posts", id: @post.id.to_s } ] }
64
+ }
65
+ }
66
+ ]
67
+
68
+ assert_equal(expected, @adapter.serializable_hash[:included])
69
+ end
70
+
71
+ def test_includes_author_id
72
+ expected = {
73
+ linkage: { type: "authors", id: @author.id.to_s }
74
+ }
75
+
76
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:author])
77
+ end
78
+
79
+ def test_explicit_serializer_with_null_resource
80
+ @post.author = nil
81
+
82
+ expected = { linkage: nil }
83
+
84
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:author])
85
+ end
86
+
87
+ def test_explicit_serializer_with_null_collection
88
+ @post.comments = []
89
+
90
+ expected = { linkage: [] }
91
+
92
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:comments])
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,106 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class Adapter
6
+ class JsonApi
7
+ class HasManyTest < Minitest::Test
8
+ def setup
9
+ ActionController::Base.cache_store.clear
10
+ @author = Author.new(id: 1, name: 'Steve K.')
11
+ @author.posts = []
12
+ @author.bio = nil
13
+ @post = Post.new(id: 1, title: 'New Post', body: 'Body')
14
+ @post_without_comments = Post.new(id: 2, title: 'Second Post', body: 'Second')
15
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
16
+ @first_comment.author = nil
17
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
18
+ @second_comment.author = nil
19
+ @post.comments = [@first_comment, @second_comment]
20
+ @post_without_comments.comments = []
21
+ @first_comment.post = @post
22
+ @second_comment.post = @post
23
+ @post.author = @author
24
+ @post_without_comments.author = nil
25
+ @blog = Blog.new(id: 1, name: "My Blog!!")
26
+ @blog.writer = @author
27
+ @blog.articles = [@post]
28
+ @post.blog = @blog
29
+ @post_without_comments.blog = nil
30
+
31
+ @serializer = PostSerializer.new(@post)
32
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer)
33
+ end
34
+
35
+ def test_includes_comment_ids
36
+ expected = { linkage: [ { type: "comments", id: "1" }, { type: "comments", id: "2" } ] }
37
+
38
+ assert_equal(expected, @adapter.serializable_hash[:data][:links][:comments])
39
+ end
40
+
41
+ def test_includes_linked_comments
42
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'comments')
43
+ expected = [{
44
+ id: "1",
45
+ type: "comments",
46
+ body: 'ZOMG A COMMENT',
47
+ links: {
48
+ post: { linkage: { type: "posts", id: "1" } },
49
+ author: { linkage: nil }
50
+ }
51
+ }, {
52
+ id: "2",
53
+ type: "comments",
54
+ body: 'ZOMG ANOTHER COMMENT',
55
+ links: {
56
+ post: { linkage: { type: "posts", id: "1" } },
57
+ author: { linkage: nil }
58
+ }
59
+ }]
60
+ assert_equal expected, @adapter.serializable_hash[:included]
61
+ end
62
+
63
+ def test_limit_fields_of_linked_comments
64
+ @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'comments', fields: {comment: [:id]})
65
+ expected = [{
66
+ id: "1",
67
+ type: "comments",
68
+ links: {
69
+ post: { linkage: { type: "posts", id: "1" } },
70
+ author: { linkage: nil }
71
+ }
72
+ }, {
73
+ id: "2",
74
+ type: "comments",
75
+ links: {
76
+ post: { linkage: { type: "posts", id: "1" } },
77
+ author: { linkage: nil }
78
+ }
79
+ }]
80
+ assert_equal expected, @adapter.serializable_hash[:included]
81
+ end
82
+
83
+ def test_no_include_linked_if_comments_is_empty
84
+ serializer = PostSerializer.new(@post_without_comments)
85
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
86
+
87
+ assert_nil adapter.serializable_hash[:linked]
88
+ end
89
+
90
+ def test_include_type_for_association_when_different_than_name
91
+ serializer = BlogSerializer.new(@blog)
92
+ adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
93
+ actual = adapter.serializable_hash[:data][:links][:articles]
94
+ expected = {
95
+ linkage: [{
96
+ type: "posts",
97
+ id: "1"
98
+ }]
99
+ }
100
+ assert_equal expected, actual
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end