active_model_serializers 0.9.0 → 0.10.12

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 (113) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +679 -9
  3. data/MIT-LICENSE +3 -2
  4. data/README.md +195 -753
  5. data/lib/action_controller/serialization.rb +45 -49
  6. data/lib/active_model/serializable_resource.rb +13 -0
  7. data/lib/active_model/serializer.rb +369 -212
  8. data/lib/active_model/serializer/adapter.rb +26 -0
  9. data/lib/active_model/serializer/adapter/attributes.rb +17 -0
  10. data/lib/active_model/serializer/adapter/base.rb +20 -0
  11. data/lib/active_model/serializer/adapter/json.rb +17 -0
  12. data/lib/active_model/serializer/adapter/json_api.rb +17 -0
  13. data/lib/active_model/serializer/adapter/null.rb +17 -0
  14. data/lib/active_model/serializer/array_serializer.rb +14 -0
  15. data/lib/active_model/serializer/association.rb +73 -0
  16. data/lib/active_model/serializer/attribute.rb +27 -0
  17. data/lib/active_model/serializer/belongs_to_reflection.rb +13 -0
  18. data/lib/active_model/serializer/collection_serializer.rb +90 -0
  19. data/lib/active_model/serializer/concerns/caching.rb +305 -0
  20. data/lib/active_model/serializer/error_serializer.rb +16 -0
  21. data/lib/active_model/serializer/errors_serializer.rb +34 -0
  22. data/lib/active_model/serializer/field.rb +92 -0
  23. data/lib/active_model/serializer/fieldset.rb +33 -0
  24. data/lib/active_model/serializer/has_many_reflection.rb +12 -0
  25. data/lib/active_model/serializer/has_one_reflection.rb +9 -0
  26. data/lib/active_model/serializer/lazy_association.rb +99 -0
  27. data/lib/active_model/serializer/link.rb +23 -0
  28. data/lib/active_model/serializer/lint.rb +152 -0
  29. data/lib/active_model/serializer/null.rb +19 -0
  30. data/lib/active_model/serializer/reflection.rb +212 -0
  31. data/lib/active_model/serializer/version.rb +3 -1
  32. data/lib/active_model_serializers.rb +60 -17
  33. data/lib/active_model_serializers/adapter.rb +100 -0
  34. data/lib/active_model_serializers/adapter/attributes.rb +36 -0
  35. data/lib/active_model_serializers/adapter/base.rb +85 -0
  36. data/lib/active_model_serializers/adapter/json.rb +23 -0
  37. data/lib/active_model_serializers/adapter/json_api.rb +535 -0
  38. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +215 -0
  39. data/lib/active_model_serializers/adapter/json_api/error.rb +98 -0
  40. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +51 -0
  41. data/lib/active_model_serializers/adapter/json_api/link.rb +85 -0
  42. data/lib/active_model_serializers/adapter/json_api/meta.rb +39 -0
  43. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +90 -0
  44. data/lib/active_model_serializers/adapter/json_api/relationship.rb +106 -0
  45. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +68 -0
  46. data/lib/active_model_serializers/adapter/null.rb +11 -0
  47. data/lib/active_model_serializers/callbacks.rb +57 -0
  48. data/lib/active_model_serializers/deprecate.rb +56 -0
  49. data/lib/active_model_serializers/deserialization.rb +17 -0
  50. data/lib/active_model_serializers/json_pointer.rb +16 -0
  51. data/lib/active_model_serializers/logging.rb +124 -0
  52. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  53. data/lib/active_model_serializers/model.rb +132 -0
  54. data/lib/active_model_serializers/model/caching.rb +25 -0
  55. data/lib/active_model_serializers/railtie.rb +52 -0
  56. data/lib/active_model_serializers/register_jsonapi_renderer.rb +80 -0
  57. data/lib/active_model_serializers/serializable_resource.rb +84 -0
  58. data/lib/active_model_serializers/serialization_context.rb +41 -0
  59. data/lib/active_model_serializers/test.rb +9 -0
  60. data/lib/active_model_serializers/test/schema.rb +140 -0
  61. data/lib/active_model_serializers/test/serializer.rb +127 -0
  62. data/lib/generators/rails/USAGE +6 -0
  63. data/lib/{active_model/serializer/generators → generators/rails}/resource_override.rb +3 -4
  64. data/lib/{active_model/serializer/generators/serializer → generators/rails}/serializer_generator.rb +6 -5
  65. data/lib/{active_model/serializer/generators/serializer/templates/serializer.rb → generators/rails/templates/serializer.rb.erb} +0 -0
  66. data/lib/grape/active_model_serializers.rb +18 -0
  67. data/lib/grape/formatters/active_model_serializers.rb +34 -0
  68. data/lib/grape/helpers/active_model_serializers.rb +19 -0
  69. data/lib/tasks/rubocop.rake +55 -0
  70. metadata +315 -99
  71. data/CONTRIBUTING.md +0 -20
  72. data/DESIGN.textile +0 -586
  73. data/lib/action_controller/serialization_test_case.rb +0 -79
  74. data/lib/active_model/array_serializer.rb +0 -65
  75. data/lib/active_model/default_serializer.rb +0 -32
  76. data/lib/active_model/serializable.rb +0 -40
  77. data/lib/active_model/serializer/associations.rb +0 -102
  78. data/lib/active_model/serializer/config.rb +0 -31
  79. data/lib/active_model/serializer/generators/serializer/USAGE +0 -9
  80. data/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb +0 -14
  81. data/lib/active_model/serializer/generators/serializer/templates/controller.rb +0 -93
  82. data/lib/active_model/serializer/railtie.rb +0 -10
  83. data/lib/active_model/serializer_support.rb +0 -5
  84. data/test/fixtures/active_record.rb +0 -92
  85. data/test/fixtures/poro.rb +0 -75
  86. data/test/integration/action_controller/serialization_test.rb +0 -287
  87. data/test/integration/action_controller/serialization_test_case_test.rb +0 -61
  88. data/test/integration/active_record/active_record_test.rb +0 -77
  89. data/test/integration/generators/resource_generator_test.rb +0 -26
  90. data/test/integration/generators/scaffold_controller_generator_test.rb +0 -64
  91. data/test/integration/generators/serializer_generator_test.rb +0 -41
  92. data/test/test_app.rb +0 -11
  93. data/test/test_helper.rb +0 -24
  94. data/test/unit/active_model/array_serializer/except_test.rb +0 -18
  95. data/test/unit/active_model/array_serializer/key_format_test.rb +0 -18
  96. data/test/unit/active_model/array_serializer/meta_test.rb +0 -53
  97. data/test/unit/active_model/array_serializer/only_test.rb +0 -18
  98. data/test/unit/active_model/array_serializer/root_test.rb +0 -102
  99. data/test/unit/active_model/array_serializer/scope_test.rb +0 -24
  100. data/test/unit/active_model/array_serializer/serialization_test.rb +0 -199
  101. data/test/unit/active_model/default_serializer_test.rb +0 -13
  102. data/test/unit/active_model/serializer/associations/build_serializer_test.rb +0 -21
  103. data/test/unit/active_model/serializer/associations_test.rb +0 -19
  104. data/test/unit/active_model/serializer/attributes_test.rb +0 -41
  105. data/test/unit/active_model/serializer/config_test.rb +0 -88
  106. data/test/unit/active_model/serializer/filter_test.rb +0 -69
  107. data/test/unit/active_model/serializer/has_many_test.rb +0 -230
  108. data/test/unit/active_model/serializer/has_one_test.rb +0 -207
  109. data/test/unit/active_model/serializer/key_format_test.rb +0 -25
  110. data/test/unit/active_model/serializer/meta_test.rb +0 -39
  111. data/test/unit/active_model/serializer/options_test.rb +0 -15
  112. data/test/unit/active_model/serializer/root_test.rb +0 -117
  113. data/test/unit/active_model/serializer/scope_test.rb +0 -49
@@ -1,230 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- class HasManyTest < Minitest::Test
6
- def setup
7
- @association = PostSerializer._associations[:comments]
8
- @old_association = @association.dup
9
-
10
- @post = Post.new({ title: 'Title 1', body: 'Body 1', date: '1/1/2000' })
11
- @post_serializer = PostSerializer.new(@post)
12
- end
13
-
14
- def teardown
15
- PostSerializer._associations[:comments] = @old_association
16
- end
17
-
18
- def test_associations_definition
19
- assert_equal 1, PostSerializer._associations.length
20
- assert_kind_of Association::HasMany, @association
21
- assert_equal 'comments', @association.name
22
- end
23
-
24
- def test_associations_inheritance
25
- inherited_serializer_klass = Class.new(PostSerializer) do
26
- has_many :some_associations
27
- end
28
- another_inherited_serializer_klass = Class.new(PostSerializer)
29
-
30
- assert_equal(PostSerializer._associations.length + 1,
31
- inherited_serializer_klass._associations.length)
32
- assert_equal(PostSerializer._associations.length,
33
- another_inherited_serializer_klass._associations.length)
34
- end
35
-
36
- def test_associations_embedding_ids_serialization_using_serializable_hash
37
- @association.embed = :ids
38
-
39
- assert_equal({
40
- title: 'Title 1', body: 'Body 1', 'comment_ids' => @post.comments.map { |c| c.object_id }
41
- }, @post_serializer.serializable_hash)
42
- end
43
-
44
- def test_associations_embedding_ids_serialization_using_as_json
45
- @association.embed = :ids
46
-
47
- assert_equal({
48
- 'post' => { title: 'Title 1', body: 'Body 1', 'comment_ids' => @post.comments.map { |c| c.object_id } }
49
- }, @post_serializer.as_json)
50
- end
51
-
52
- def test_associations_embedding_ids_serialization_using_serializable_hash_and_key_from_options
53
- @association.embed = :ids
54
- @association.key = 'key'
55
-
56
- assert_equal({
57
- title: 'Title 1', body: 'Body 1', 'key' => @post.comments.map { |c| c.object_id }
58
- }, @post_serializer.serializable_hash)
59
- end
60
-
61
- def test_associations_embedding_objects_serialization_using_serializable_hash
62
- @association.embed = :objects
63
-
64
- assert_equal({
65
- title: 'Title 1', body: 'Body 1', comments: [{ content: 'C1' }, { content: 'C2' }]
66
- }, @post_serializer.serializable_hash)
67
- end
68
-
69
- def test_associations_embedding_objects_serialization_using_as_json
70
- @association.embed = :objects
71
-
72
- assert_equal({
73
- 'post' => { title: 'Title 1', body: 'Body 1', comments: [{ content: 'C1' }, { content: 'C2' }] }
74
- }, @post_serializer.as_json)
75
- end
76
-
77
- def test_associations_embedding_nil_objects_serialization_using_as_json
78
- @association.embed = :objects
79
- @post.instance_eval do
80
- def comments
81
- [nil]
82
- end
83
- end
84
-
85
- assert_equal({
86
- 'post' => { title: 'Title 1', body: 'Body 1', comments: [nil] }
87
- }, @post_serializer.as_json)
88
- end
89
-
90
- def test_associations_embedding_objects_serialization_using_serializable_hash_and_root_from_options
91
- @association.embed = :objects
92
- @association.embedded_key = 'root'
93
-
94
- assert_equal({
95
- title: 'Title 1', body: 'Body 1', 'root' => [{ content: 'C1' }, { content: 'C2' }]
96
- }, @post_serializer.serializable_hash)
97
- end
98
-
99
- def test_associations_embedding_ids_including_objects_serialization_using_serializable_hash
100
- @association.embed = :ids
101
- @association.embed_in_root = true
102
-
103
- assert_equal({
104
- title: 'Title 1', body: 'Body 1', 'comment_ids' => @post.comments.map { |c| c.object_id }
105
- }, @post_serializer.serializable_hash)
106
- end
107
-
108
- def test_associations_embedding_ids_including_objects_serialization_using_as_json
109
- @association.embed = :ids
110
- @association.embed_in_root = true
111
-
112
- assert_equal({
113
- 'post' => { title: 'Title 1', body: 'Body 1', 'comment_ids' => @post.comments.map { |c| c.object_id } },
114
- comments: [{ content: 'C1' }, { content: 'C2' }]
115
- }, @post_serializer.as_json)
116
- end
117
-
118
- def test_associations_embedding_nothing_including_objects_serialization_using_as_json
119
- @association.embed = nil
120
- @association.embed_in_root = true
121
-
122
- assert_equal({
123
- 'post' => { title: 'Title 1', body: 'Body 1' },
124
- comments: [{ content: 'C1' }, { content: 'C2' }]
125
- }, @post_serializer.as_json)
126
- end
127
-
128
- def test_associations_using_a_given_serializer
129
- @association.embed = :ids
130
- @association.embed_in_root = true
131
- @association.serializer_from_options = Class.new(Serializer) do
132
- def content
133
- object.read_attribute_for_serialization(:content) + '!'
134
- end
135
-
136
- attributes :content
137
- end
138
-
139
- assert_equal({
140
- 'post' => { title: 'Title 1', body: 'Body 1', 'comment_ids' => @post.comments.map { |c| c.object_id } },
141
- comments: [{ content: 'C1!' }, { content: 'C2!' }]
142
- }, @post_serializer.as_json)
143
- end
144
-
145
- def test_associations_embedding_ids_using_a_given_array_serializer
146
- @association.embed = :ids
147
- @association.embed_in_root = true
148
- @association.serializer_from_options = Class.new(ArraySerializer) do
149
- def serializable_object
150
- { my_content: ['fake'] }
151
- end
152
- end
153
-
154
- assert_equal({
155
- 'post' => { title: 'Title 1', body: 'Body 1', 'comment_ids' => @post.comments.map { |c| c.object_id } },
156
- comments: { my_content: ['fake'] }
157
- }, @post_serializer.as_json)
158
- end
159
-
160
- def test_associations_embedding_objects_using_a_given_array_serializer
161
- @association.serializer_from_options = Class.new(ArraySerializer) do
162
- def serializable_object
163
- { my_content: ['fake'] }
164
- end
165
- end
166
-
167
- assert_equal({
168
- 'post' => { title: 'Title 1', body: 'Body 1', comments: { my_content: ['fake'] } }
169
- }, @post_serializer.as_json)
170
- end
171
-
172
- def test_associations_embedding_ids_including_objects_serialization_with_embed_in_root_key
173
- @association.embed_in_root = true
174
- @association.embed_in_root_key = :linked
175
- @association.embed = :ids
176
- assert_equal({
177
- linked: {
178
- comments: [
179
- { content: 'C1' },
180
- { content: 'C2' }
181
- ]
182
- },
183
- 'post' => {
184
- title: 'Title 1', body: 'Body 1',
185
- 'comment_ids' => @post.comments.map(&:object_id)
186
- }
187
- }, @post_serializer.as_json)
188
- end
189
-
190
- def test_associations_embedding_ids_using_embed_namespace_including_object_serialization_with_embed_in_root_key
191
- @association.embed_in_root = true
192
- @association.embed_in_root_key = :linked
193
- @association.embed = :ids
194
- @association.embed_namespace = :links
195
- @association.key = :comments
196
- assert_equal({
197
- linked: {
198
- comments: [
199
- { content: 'C1' },
200
- { content: 'C2' }
201
- ]
202
- },
203
- 'post' => {
204
- title: 'Title 1', body: 'Body 1',
205
- links: {
206
- comments: @post.comments.map(&:object_id)
207
- }
208
- }
209
- }, @post_serializer.as_json)
210
- end
211
-
212
- def test_associations_embedding_objects_using_embed_namespace
213
- @association.embed = :objects
214
- @association.embed_namespace = :links
215
-
216
- assert_equal({
217
- 'post' => {
218
- title: 'Title 1', body: 'Body 1',
219
- links: {
220
- comments: [
221
- { content: 'C1' },
222
- { content: 'C2' }
223
- ]
224
- }
225
- }
226
- }, @post_serializer.as_json)
227
- end
228
- end
229
- end
230
- end
@@ -1,207 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- class HasOneTest < Minitest::Test
6
- def setup
7
- @association = UserSerializer._associations[:profile]
8
- @old_association = @association.dup
9
-
10
- @user = User.new({ name: 'Name 1', email: 'mail@server.com', gender: 'M' })
11
- @user_serializer = UserSerializer.new(@user)
12
- end
13
-
14
- def teardown
15
- UserSerializer._associations[:profile] = @old_association
16
- end
17
-
18
- def test_associations_definition
19
- assert_equal 1, UserSerializer._associations.length
20
- assert_kind_of Association::HasOne, @association
21
- assert_equal 'profile', @association.name
22
- end
23
-
24
- def test_associations_embedding_ids_serialization_using_serializable_hash
25
- @association.embed = :ids
26
-
27
- assert_equal({
28
- name: 'Name 1', email: 'mail@server.com', 'profile_id' => @user.profile.object_id
29
- }, @user_serializer.serializable_hash)
30
- end
31
-
32
- def test_associations_embedding_ids_serialization_using_as_json
33
- @association.embed = :ids
34
-
35
- assert_equal({
36
- 'user' => { name: 'Name 1', email: 'mail@server.com', 'profile_id' => @user.profile.object_id }
37
- }, @user_serializer.as_json)
38
- end
39
-
40
- def test_associations_embedding_ids_serialization_using_serializable_hash_and_key_from_options
41
- @association.embed = :ids
42
- @association.key = 'key'
43
-
44
- assert_equal({
45
- name: 'Name 1', email: 'mail@server.com', 'key' => @user.profile.object_id
46
- }, @user_serializer.serializable_hash)
47
- end
48
-
49
- def test_associations_embedding_objects_serialization_using_serializable_hash
50
- @association.embed = :objects
51
-
52
- assert_equal({
53
- name: 'Name 1', email: 'mail@server.com', profile: { name: 'N1', description: 'D1' }
54
- }, @user_serializer.serializable_hash)
55
- end
56
-
57
- def test_associations_embedding_objects_serialization_using_as_json
58
- @association.embed = :objects
59
-
60
- assert_equal({
61
- 'user' => { name: 'Name 1', email: 'mail@server.com', profile: { name: 'N1', description: 'D1' } }
62
- }, @user_serializer.as_json)
63
- end
64
-
65
- def test_associations_embedding_nil_ids_serialization_using_as_json
66
- @association.embed = :ids
67
- @user.instance_eval do
68
- def profile
69
- nil
70
- end
71
- end
72
-
73
- assert_equal({
74
- 'user' => { name: 'Name 1', email: 'mail@server.com', 'profile_id' => nil }
75
- }, @user_serializer.as_json)
76
- end
77
-
78
- def test_associations_embedding_nil_objects_serialization_using_as_json
79
- @association.embed = :objects
80
- @user.instance_eval do
81
- def profile
82
- nil
83
- end
84
- end
85
-
86
- assert_equal({
87
- 'user' => { name: 'Name 1', email: 'mail@server.com', profile: nil }
88
- }, @user_serializer.as_json)
89
- end
90
-
91
- def test_associations_embedding_objects_serialization_using_serializable_hash_and_root_from_options
92
- @association.embed = :objects
93
- @association.embedded_key = 'root'
94
-
95
- assert_equal({
96
- name: 'Name 1', email: 'mail@server.com', 'root' => { name: 'N1', description: 'D1' }
97
- }, @user_serializer.serializable_hash)
98
- end
99
-
100
- def test_associations_embedding_ids_including_objects_serialization_using_serializable_hash
101
- @association.embed = :ids
102
- @association.embed_in_root = true
103
-
104
- assert_equal({
105
- name: 'Name 1', email: 'mail@server.com', 'profile_id' => @user.profile.object_id
106
- }, @user_serializer.serializable_hash)
107
- end
108
-
109
- def test_associations_embedding_nil_ids_including_objects_serialization_using_as_json
110
- @association.embed = :ids
111
- @association.embed_in_root = true
112
- @user.instance_eval do
113
- def profile
114
- nil
115
- end
116
- end
117
-
118
- assert_equal({
119
- 'user' => { name: 'Name 1', email: 'mail@server.com', 'profile_id' => nil },
120
- 'profiles' => []
121
- }, @user_serializer.as_json)
122
- end
123
-
124
- def test_associations_embedding_ids_including_objects_serialization_using_as_json
125
- @association.embed = :ids
126
- @association.embed_in_root = true
127
-
128
- assert_equal({
129
- 'user' => { name: 'Name 1', email: 'mail@server.com', 'profile_id' => @user.profile.object_id },
130
- 'profiles' => [{ name: 'N1', description: 'D1' }]
131
- }, @user_serializer.as_json)
132
- end
133
-
134
- def test_associations_embedding_ids_using_a_given_serializer
135
- @association.embed = :ids
136
- @association.embed_in_root = true
137
- @association.serializer_from_options = Class.new(Serializer) do
138
- def name
139
- 'fake'
140
- end
141
-
142
- attributes :name
143
- end
144
-
145
- assert_equal({
146
- 'user' => { name: 'Name 1', email: 'mail@server.com', 'profile_id' => @user.profile.object_id },
147
- 'profiles' => [{ name: 'fake' }]
148
- }, @user_serializer.as_json)
149
- end
150
-
151
- def test_associations_embedding_objects_using_a_given_serializer
152
- @association.serializer_from_options = Class.new(Serializer) do
153
- def name
154
- 'fake'
155
- end
156
-
157
- attributes :name
158
- end
159
-
160
- assert_equal({
161
- 'user' => { name: 'Name 1', email: 'mail@server.com', profile: { name: 'fake' } }
162
- }, @user_serializer.as_json)
163
- end
164
-
165
- def test_associations_embedding_ids_using_embed_namespace
166
- @association.embed_namespace = :links
167
- @association.embed = :ids
168
- @association.key = :profile
169
- assert_equal({
170
- 'user' => {
171
- name: 'Name 1', email: 'mail@server.com',
172
- links: {
173
- profile: @user.profile.object_id
174
- }
175
- }
176
- }, @user_serializer.as_json)
177
- end
178
-
179
- def test_asociations_embedding_objects_using_embed_namespace
180
- @association.embed_namespace = :links
181
- @association.embed = :objects
182
- assert_equal({
183
- 'user' => {
184
- name: 'Name 1', email: 'mail@server.com',
185
- links: {
186
- profile: { name: 'N1', description: 'D1' }
187
- }
188
- }
189
- }, @user_serializer.as_json)
190
- end
191
-
192
- def test_associations_embedding_ids_using_embed_namespace_and_embed_in_root_key
193
- @association.embed_in_root = true
194
- @association.embed_in_root_key = :linked
195
- @association.embed = :ids
196
- assert_equal({
197
- 'user' => {
198
- name: 'Name 1', email: 'mail@server.com', 'profile_id' => @user.profile.object_id
199
- },
200
- linked: {
201
- 'profiles' => [ { name: 'N1', description: 'D1' } ]
202
- }
203
- }, @user_serializer.as_json)
204
- end
205
- end
206
- end
207
- end
@@ -1,25 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- class KeyFormatTest < Minitest::Test
6
- def test_lower_camel_format_option
7
- object = WebLog.new({ name: 'Name 1', display_name: 'Display Name 1'})
8
- serializer = WebLogSerializer.new(object, key_format: :lower_camel)
9
-
10
- expected = { name: 'Name 1', displayName: 'Display Name 1' }
11
-
12
- assert_equal expected, serializer.serializable_object
13
- end
14
-
15
- def test_lower_camel_format_serializer
16
- object = WebLog.new({ name: 'Name 1', display_name: 'Display Name 1'})
17
- serializer = WebLogLowerCamelSerializer.new(object)
18
-
19
- expected = { name: 'Name 1', displayName: 'Display Name 1' }
20
-
21
- assert_equal expected, serializer.serializable_object
22
- end
23
- end
24
- end
25
- end