active_model_serializers 0.9.3 → 0.9.8

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 (46) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +107 -0
  3. data/README.md +14 -13
  4. data/lib/action_controller/serialization.rb +9 -1
  5. data/lib/active_model/array_serializer.rb +4 -8
  6. data/lib/active_model/default_serializer.rb +2 -6
  7. data/lib/active_model/serializable.rb +12 -15
  8. data/lib/active_model/serializer.rb +25 -9
  9. data/lib/active_model/serializer/association/has_one.rb +1 -1
  10. data/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb +1 -1
  11. data/lib/active_model/serializer/railtie.rb +4 -0
  12. data/lib/active_model/serializer/version.rb +1 -1
  13. data/lib/active_model_serializers/model/caching.rb +25 -0
  14. data/test/benchmark/app.rb +60 -0
  15. data/test/benchmark/benchmarking_support.rb +67 -0
  16. data/test/benchmark/bm_active_record.rb +41 -0
  17. data/test/benchmark/setup.rb +75 -0
  18. data/test/benchmark/tmp/miniprofiler/mp_timers_6eqewtfgrhitvq5gqm25 +0 -0
  19. data/test/benchmark/tmp/miniprofiler/mp_timers_8083sx03hu72pxz1a4d0 +0 -0
  20. data/test/benchmark/tmp/miniprofiler/mp_timers_fyz2gsml4z0ph9kpoy1c +0 -0
  21. data/test/benchmark/tmp/miniprofiler/mp_timers_hjry5rc32imd42oxoi48 +0 -0
  22. data/test/benchmark/tmp/miniprofiler/mp_timers_m8fpoz2cvt3g9agz0bs3 +0 -0
  23. data/test/benchmark/tmp/miniprofiler/mp_timers_p92m2drnj1i568u3sta0 +0 -0
  24. data/test/benchmark/tmp/miniprofiler/mp_timers_qg52tpca3uesdfguee9i +0 -0
  25. data/test/benchmark/tmp/miniprofiler/mp_timers_s15t1a6mvxe0z7vjv790 +0 -0
  26. data/test/benchmark/tmp/miniprofiler/mp_timers_x8kal3d17nfds6vp4kcj +0 -0
  27. data/test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1 +0 -0
  28. data/test/fixtures/active_record.rb +4 -0
  29. data/test/fixtures/poro.rb +46 -3
  30. data/test/integration/action_controller/namespaced_serialization_test.rb +10 -1
  31. data/test/integration/action_controller/serialization_test.rb +5 -5
  32. data/test/integration/active_record/active_record_test.rb +17 -0
  33. data/test/tmp/app/assets/javascripts/accounts.js +2 -0
  34. data/test/tmp/app/assets/stylesheets/accounts.css +4 -0
  35. data/test/tmp/app/controllers/accounts_controller.rb +2 -0
  36. data/test/tmp/app/helpers/accounts_helper.rb +2 -0
  37. data/test/{serializers/tmp → tmp}/app/serializers/account_serializer.rb +0 -0
  38. data/test/tmp/config/routes.rb +1 -0
  39. data/test/unit/active_model/array_serializer/options_test.rb +16 -0
  40. data/test/unit/active_model/array_serializer/serialization_test.rb +17 -0
  41. data/test/unit/active_model/serializer/associations_test.rb +30 -0
  42. data/test/unit/active_model/serializer/has_many_test.rb +1 -1
  43. data/test/unit/active_model/serializer/has_one_test.rb +14 -0
  44. data/test/unit/active_model/serializer/options_test.rb +8 -0
  45. data/test/unit/active_model/serilizable_test.rb +50 -0
  46. metadata +94 -38
@@ -58,6 +58,22 @@ module ActiveModel
58
58
  end
59
59
  end
60
60
 
61
+ def test_serialization_embedding_ids_in_common_root_key
62
+ post_serializer = AREmbeddedSerializer.new(@post)
63
+
64
+ embed(AREmbeddedSerializer, embed: :ids, embed_in_root: true, embed_in_root_key: :linked) do
65
+ embed(ARCommentSerializer, embed: :ids, embed_in_root: true, embed_in_root_key: :linked) do
66
+ assert_equal({
67
+ 'ar_tags' => [{ name: 'short' },
68
+ { name: 'whiny' },
69
+ { name: 'happy' }],
70
+ 'ar_comments' => [{ body: 'what a dumb post', 'ar_tag_ids' => [3, 2] },
71
+ { body: 'i liked it', 'ar_tag_ids' => [3, 1] }]
72
+ }, post_serializer.as_json[:linked])
73
+ end
74
+ end
75
+ end
76
+
61
77
  private
62
78
 
63
79
  def embed(serializer_class, options = {})
@@ -66,6 +82,7 @@ module ActiveModel
66
82
  serializer_class._associations.each_value do |association|
67
83
  association.embed = options[:embed]
68
84
  association.embed_in_root = options[:embed_in_root]
85
+ association.embed_in_root_key = options[:embed_in_root_key]
69
86
  end
70
87
 
71
88
  yield
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,2 @@
1
+ class AccountsController < ApplicationController
2
+ end
@@ -0,0 +1,2 @@
1
+ module AccountsHelper
2
+ end
@@ -0,0 +1 @@
1
+ Rails.application.routes.draw { }
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class ArraySerializer
5
+ class OptionsTest < Minitest::Test
6
+ def test_custom_options_are_accessible_from_serializer
7
+
8
+ array = [Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
9
+ Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' })]
10
+ serializer = ArraySerializer.new(array, only: [:name], context: {foo: :bar})
11
+
12
+ assert_equal({foo: :bar}, serializer.context)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -35,6 +35,23 @@ module ActiveModel
35
35
  end
36
36
  end
37
37
 
38
+ class CustomSerializerClassTest < Minitest::Test
39
+ def setup
40
+ Object.const_set(:CustomSerializer, Class.new)
41
+ end
42
+
43
+ def teardown
44
+ Object.send(:remove_const, :CustomSerializer)
45
+ end
46
+
47
+ def test_serializer_for_array_returns_appropriate_type
48
+ object = {}
49
+ def object.serializer_class; CustomSerializer; end
50
+
51
+ assert_equal CustomSerializer, Serializer.serializer_for(object)
52
+ end
53
+ end
54
+
38
55
  class ModelSerializationTest < Minitest::Test
39
56
  def test_array_serializer_serializes_models
40
57
  array = [Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
@@ -14,6 +14,36 @@ module ActiveModel
14
14
  assert_equal([:comments],
15
15
  another_inherited_serializer_klass._associations.keys)
16
16
  end
17
+ def test_multiple_nested_associations
18
+ parent = SelfReferencingUserParent.new(name: "The Parent")
19
+ child = SelfReferencingUser.new(name: "The child", parent: parent)
20
+ self_referencing_user_serializer = SelfReferencingUserSerializer.new(child)
21
+ result = self_referencing_user_serializer.as_json
22
+ expected_result = {
23
+ "self_referencing_user"=>{
24
+ :name=>"The child",
25
+ "type_id"=>child.type.object_id,
26
+ "parent_id"=>child.parent.object_id
27
+
28
+ },
29
+ "types"=>[
30
+ {
31
+ :name=>"N1",
32
+ },
33
+ {
34
+ :name=>"N2",
35
+ }
36
+ ],
37
+ "parents"=>[
38
+ {
39
+ :name=>"N1",
40
+ "type_id"=>child.parent.type.object_id,
41
+ "parent_id"=>nil
42
+ }
43
+ ]
44
+ }
45
+ assert_equal(expected_result, result)
46
+ end
17
47
  end
18
48
  end
19
49
  end
@@ -176,7 +176,7 @@ module ActiveModel
176
176
 
177
177
  def test_associations_embedding_objects_using_a_given_array_serializer
178
178
  @association.serializer_from_options = Class.new(ArraySerializer) do
179
- def serializable_object
179
+ def serializable_object(options={})
180
180
  { my_content: ['fake'] }
181
181
  end
182
182
  end
@@ -176,6 +176,20 @@ module ActiveModel
176
176
  }, @user_serializer.as_json)
177
177
  end
178
178
 
179
+ def test_associations_embedding_objects_with_nil_values
180
+ user_info = UserInfo.new
181
+ user_info.instance_eval do
182
+ def user
183
+ nil
184
+ end
185
+ end
186
+ user_info_serializer = UserInfoSerializer.new(user_info)
187
+
188
+ assert_equal({
189
+ 'user_info' => { user: nil }
190
+ }, user_info_serializer.as_json)
191
+ end
192
+
179
193
  def test_associations_embedding_ids_using_embed_namespace
180
194
  @association.embed_namespace = :links
181
195
  @association.embed = :ids
@@ -21,6 +21,9 @@ module ActiveModel
21
21
  serialization_options[:force_the_description]
22
22
  end
23
23
  end
24
+
25
+ @category = Category.new({name: 'Category 1'})
26
+ @category_serializer = CategorySerializer.new(@category)
24
27
  end
25
28
 
26
29
  def test_filtered_attributes_serialization
@@ -29,6 +32,11 @@ module ActiveModel
29
32
  'profile' => { name: 'Name 1', description: forced_description }
30
33
  }, @profile_serializer.as_json(force_the_description: forced_description))
31
34
  end
35
+
36
+ def test_filtered_attributes_serialization_across_association
37
+ assert_equal("'T1'",
38
+ @category_serializer.as_json(highlight_keyword: 'T1')['category'][:posts][0][:title])
39
+ end
32
40
  end
33
41
  end
34
42
  end
@@ -0,0 +1,50 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class SerializableTest
5
+ class InstrumentationTest < Minitest::Test
6
+ def setup
7
+ @events = []
8
+
9
+ @subscriber = ActiveSupport::Notifications.subscribe('!serialize.active_model_serializers') do |name, start, finish, id, payload|
10
+ @events << { name: name, serializer: payload[:serializer] }
11
+ end
12
+ end
13
+
14
+ def teardown
15
+ ActiveSupport::Notifications.unsubscribe(@subscriber) if defined?(@subscriber)
16
+ end
17
+
18
+ def test_instruments_default_serializer
19
+ DefaultSerializer.new(1).as_json
20
+
21
+ assert_equal [{ name: '!serialize.active_model_serializers', serializer: 'ActiveModel::DefaultSerializer' }], @events
22
+ end
23
+
24
+ def test_instruments_serializer
25
+ profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
26
+ serializer = ProfileSerializer.new(profile)
27
+
28
+ serializer.as_json
29
+
30
+ assert_equal [{ name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' }], @events
31
+ end
32
+
33
+ def test_instruments_array_serializer
34
+ profiles = [
35
+ Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1'),
36
+ Profile.new(name: 'Name 2', description: 'Description 2', comments: 'Comments 2')
37
+ ]
38
+ serializer = ArraySerializer.new(profiles)
39
+
40
+ serializer.as_json
41
+
42
+ assert_equal [
43
+ { name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' },
44
+ { name: '!serialize.active_model_serializers', serializer: 'ProfileSerializer' },
45
+ { name: '!serialize.active_model_serializers', serializer: 'ActiveModel::ArraySerializer' }
46
+ ], @events
47
+ end
48
+ end
49
+ end
50
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_model_serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
8
8
  - Yehuda Katz
9
9
  - Santiago Pastorino
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-01-21 00:00:00.000000000 Z
13
+ date: 2020-12-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -26,6 +26,20 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '3.2'
29
+ - !ruby/object:Gem::Dependency
30
+ name: concurrent-ruby
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
29
43
  - !ruby/object:Gem::Dependency
30
44
  name: rails
31
45
  requirement: !ruby/object:Gem::Requirement
@@ -75,6 +89,21 @@ files:
75
89
  - lib/active_model/serializer/version.rb
76
90
  - lib/active_model/serializer_support.rb
77
91
  - lib/active_model_serializers.rb
92
+ - lib/active_model_serializers/model/caching.rb
93
+ - test/benchmark/app.rb
94
+ - test/benchmark/benchmarking_support.rb
95
+ - test/benchmark/bm_active_record.rb
96
+ - test/benchmark/setup.rb
97
+ - test/benchmark/tmp/miniprofiler/mp_timers_6eqewtfgrhitvq5gqm25
98
+ - test/benchmark/tmp/miniprofiler/mp_timers_8083sx03hu72pxz1a4d0
99
+ - test/benchmark/tmp/miniprofiler/mp_timers_fyz2gsml4z0ph9kpoy1c
100
+ - test/benchmark/tmp/miniprofiler/mp_timers_hjry5rc32imd42oxoi48
101
+ - test/benchmark/tmp/miniprofiler/mp_timers_m8fpoz2cvt3g9agz0bs3
102
+ - test/benchmark/tmp/miniprofiler/mp_timers_p92m2drnj1i568u3sta0
103
+ - test/benchmark/tmp/miniprofiler/mp_timers_qg52tpca3uesdfguee9i
104
+ - test/benchmark/tmp/miniprofiler/mp_timers_s15t1a6mvxe0z7vjv790
105
+ - test/benchmark/tmp/miniprofiler/mp_timers_x8kal3d17nfds6vp4kcj
106
+ - test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1
78
107
  - test/fixtures/active_record.rb
79
108
  - test/fixtures/poro.rb
80
109
  - test/fixtures/template.html.erb
@@ -85,13 +114,19 @@ files:
85
114
  - test/integration/generators/resource_generator_test.rb
86
115
  - test/integration/generators/scaffold_controller_generator_test.rb
87
116
  - test/integration/generators/serializer_generator_test.rb
88
- - test/serializers/tmp/app/serializers/account_serializer.rb
89
117
  - test/test_app.rb
90
118
  - test/test_helper.rb
119
+ - test/tmp/app/assets/javascripts/accounts.js
120
+ - test/tmp/app/assets/stylesheets/accounts.css
121
+ - test/tmp/app/controllers/accounts_controller.rb
122
+ - test/tmp/app/helpers/accounts_helper.rb
123
+ - test/tmp/app/serializers/account_serializer.rb
124
+ - test/tmp/config/routes.rb
91
125
  - test/unit/active_model/array_serializer/except_test.rb
92
126
  - test/unit/active_model/array_serializer/key_format_test.rb
93
127
  - test/unit/active_model/array_serializer/meta_test.rb
94
128
  - test/unit/active_model/array_serializer/only_test.rb
129
+ - test/unit/active_model/array_serializer/options_test.rb
95
130
  - test/unit/active_model/array_serializer/root_test.rb
96
131
  - test/unit/active_model/array_serializer/scope_test.rb
97
132
  - test/unit/active_model/array_serializer/serialization_test.rb
@@ -112,11 +147,12 @@ files:
112
147
  - test/unit/active_model/serializer/root_test.rb
113
148
  - test/unit/active_model/serializer/scope_test.rb
114
149
  - test/unit/active_model/serializer/url_helpers_test.rb
150
+ - test/unit/active_model/serilizable_test.rb
115
151
  homepage: https://github.com/rails-api/active_model_serializers
116
152
  licenses:
117
153
  - MIT
118
154
  metadata: {}
119
- post_install_message:
155
+ post_install_message:
120
156
  rdoc_options: []
121
157
  require_paths:
122
158
  - lib
@@ -131,47 +167,67 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
167
  - !ruby/object:Gem::Version
132
168
  version: '0'
133
169
  requirements: []
134
- rubyforge_project:
135
- rubygems_version: 2.2.2
136
- signing_key:
170
+ rubygems_version: 3.1.4
171
+ signing_key:
137
172
  specification_version: 4
138
173
  summary: Bringing consistency and object orientation to model serialization. Works
139
174
  great for client-side MVC frameworks!
140
175
  test_files:
141
- - test/fixtures/active_record.rb
142
- - test/fixtures/poro.rb
143
- - test/fixtures/template.html.erb
144
- - test/integration/action_controller/namespaced_serialization_test.rb
145
- - test/integration/action_controller/serialization_test.rb
146
- - test/integration/action_controller/serialization_test_case_test.rb
147
- - test/integration/active_record/active_record_test.rb
148
- - test/integration/generators/resource_generator_test.rb
149
- - test/integration/generators/scaffold_controller_generator_test.rb
150
- - test/integration/generators/serializer_generator_test.rb
151
- - test/serializers/tmp/app/serializers/account_serializer.rb
152
- - test/test_app.rb
153
- - test/test_helper.rb
154
- - test/unit/active_model/array_serializer/except_test.rb
155
- - test/unit/active_model/array_serializer/key_format_test.rb
156
- - test/unit/active_model/array_serializer/meta_test.rb
157
- - test/unit/active_model/array_serializer/only_test.rb
158
- - test/unit/active_model/array_serializer/root_test.rb
159
- - test/unit/active_model/array_serializer/scope_test.rb
160
- - test/unit/active_model/array_serializer/serialization_test.rb
161
- - test/unit/active_model/default_serializer_test.rb
176
+ - test/benchmark/app.rb
177
+ - test/benchmark/setup.rb
178
+ - test/benchmark/bm_active_record.rb
179
+ - test/benchmark/tmp/miniprofiler/mp_timers_m8fpoz2cvt3g9agz0bs3
180
+ - test/benchmark/tmp/miniprofiler/mp_timers_s15t1a6mvxe0z7vjv790
181
+ - test/benchmark/tmp/miniprofiler/mp_timers_hjry5rc32imd42oxoi48
182
+ - test/benchmark/tmp/miniprofiler/mp_timers_qg52tpca3uesdfguee9i
183
+ - test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1
184
+ - test/benchmark/tmp/miniprofiler/mp_timers_fyz2gsml4z0ph9kpoy1c
185
+ - test/benchmark/tmp/miniprofiler/mp_timers_p92m2drnj1i568u3sta0
186
+ - test/benchmark/tmp/miniprofiler/mp_timers_6eqewtfgrhitvq5gqm25
187
+ - test/benchmark/tmp/miniprofiler/mp_timers_x8kal3d17nfds6vp4kcj
188
+ - test/benchmark/tmp/miniprofiler/mp_timers_8083sx03hu72pxz1a4d0
189
+ - test/benchmark/benchmarking_support.rb
190
+ - test/unit/active_model/serializer/config_test.rb
191
+ - test/unit/active_model/serializer/has_one_test.rb
162
192
  - test/unit/active_model/serializer/associations/build_serializer_test.rb
193
+ - test/unit/active_model/serializer/key_format_test.rb
194
+ - test/unit/active_model/serializer/url_helpers_test.rb
163
195
  - test/unit/active_model/serializer/associations_test.rb
196
+ - test/unit/active_model/serializer/options_test.rb
164
197
  - test/unit/active_model/serializer/attributes_test.rb
165
- - test/unit/active_model/serializer/config_test.rb
166
- - test/unit/active_model/serializer/filter_test.rb
198
+ - test/unit/active_model/serializer/root_test.rb
199
+ - test/unit/active_model/serializer/meta_test.rb
167
200
  - test/unit/active_model/serializer/has_many_polymorphic_test.rb
201
+ - test/unit/active_model/serializer/has_one_polymorphic_test.rb
168
202
  - test/unit/active_model/serializer/has_many_test.rb
169
203
  - test/unit/active_model/serializer/has_one_and_has_many_test.rb
170
- - test/unit/active_model/serializer/has_one_polymorphic_test.rb
171
- - test/unit/active_model/serializer/has_one_test.rb
172
- - test/unit/active_model/serializer/key_format_test.rb
173
- - test/unit/active_model/serializer/meta_test.rb
174
- - test/unit/active_model/serializer/options_test.rb
175
- - test/unit/active_model/serializer/root_test.rb
204
+ - test/unit/active_model/serializer/filter_test.rb
176
205
  - test/unit/active_model/serializer/scope_test.rb
177
- - test/unit/active_model/serializer/url_helpers_test.rb
206
+ - test/unit/active_model/default_serializer_test.rb
207
+ - test/unit/active_model/array_serializer/serialization_test.rb
208
+ - test/unit/active_model/array_serializer/key_format_test.rb
209
+ - test/unit/active_model/array_serializer/options_test.rb
210
+ - test/unit/active_model/array_serializer/only_test.rb
211
+ - test/unit/active_model/array_serializer/root_test.rb
212
+ - test/unit/active_model/array_serializer/except_test.rb
213
+ - test/unit/active_model/array_serializer/meta_test.rb
214
+ - test/unit/active_model/array_serializer/scope_test.rb
215
+ - test/unit/active_model/serilizable_test.rb
216
+ - test/test_app.rb
217
+ - test/integration/action_controller/serialization_test.rb
218
+ - test/integration/action_controller/serialization_test_case_test.rb
219
+ - test/integration/action_controller/namespaced_serialization_test.rb
220
+ - test/integration/active_record/active_record_test.rb
221
+ - test/integration/generators/scaffold_controller_generator_test.rb
222
+ - test/integration/generators/resource_generator_test.rb
223
+ - test/integration/generators/serializer_generator_test.rb
224
+ - test/fixtures/poro.rb
225
+ - test/fixtures/template.html.erb
226
+ - test/fixtures/active_record.rb
227
+ - test/test_helper.rb
228
+ - test/tmp/app/serializers/account_serializer.rb
229
+ - test/tmp/app/controllers/accounts_controller.rb
230
+ - test/tmp/app/assets/javascripts/accounts.js
231
+ - test/tmp/app/assets/stylesheets/accounts.css
232
+ - test/tmp/app/helpers/accounts_helper.rb
233
+ - test/tmp/config/routes.rb