active_model_serializers 0.9.7 → 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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +5 -1
- data/README.md +1 -1
- data/lib/action_controller/serialization.rb +9 -1
- data/lib/active_model/serializer/version.rb +1 -1
- data/lib/active_model_serializers/model/caching.rb +25 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_6eqewtfgrhitvq5gqm25 +0 -0
- data/test/benchmark/tmp/miniprofiler/{mp_timers_6b9d32ftlk8v5xy2op05 → mp_timers_8083sx03hu72pxz1a4d0} +0 -0
- data/test/benchmark/tmp/miniprofiler/{mp_timers_3f0bdfx4nib4hxfb5lmq → mp_timers_fyz2gsml4z0ph9kpoy1c} +0 -0
- data/test/benchmark/tmp/miniprofiler/{mp_timers_m78k2w11sd7ba5oh40rw → mp_timers_hjry5rc32imd42oxoi48} +0 -0
- data/test/benchmark/tmp/miniprofiler/{mp_timers_7nlok5ykeley83h8bine → mp_timers_m8fpoz2cvt3g9agz0bs3} +0 -0
- data/test/benchmark/tmp/miniprofiler/{mp_timers_uc1b3hwqrd4q512gy6c9 → mp_timers_p92m2drnj1i568u3sta0} +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_qg52tpca3uesdfguee9i +0 -0
- data/test/benchmark/tmp/miniprofiler/{mp_timers_c3a27vo6uvfijeh105nt → mp_timers_s15t1a6mvxe0z7vjv790} +0 -0
- data/test/benchmark/tmp/miniprofiler/{mp_timers_54wkvaidi0avdc8yawyt → mp_timers_x8kal3d17nfds6vp4kcj} +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1 +0 -0
- data/test/tmp/app/assets/javascripts/accounts.js +2 -0
- data/test/tmp/app/assets/stylesheets/accounts.css +4 -0
- data/test/tmp/app/controllers/accounts_controller.rb +2 -0
- data/test/tmp/app/helpers/accounts_helper.rb +2 -0
- data/test/tmp/app/serializers/account_serializer.rb +1 -1
- data/test/tmp/config/routes.rb +1 -0
- metadata +68 -103
- data/lib/bulk_cache_fetcher.rb +0 -105
- data/test/action_controller/http_cache_test.rb +0 -56
- data/test/action_controller/regression_test.rb +0 -35
- data/test/benchmark/bm_rails_cache.rb +0 -141
- data/test/benchmark/tmp/miniprofiler/mp_timers_16x1i2wkkt8b8zybbfbx +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_3aa299ezxdqvog6sfjzr +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_b36ymkc1vgu5fy9fvm9k +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_eqcbrj14r4c341abi3h6 +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_hqodkd691tbr7sbfdiez +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_j7y5frtod7cw4qc4cear +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_jpxzfgo92l24t7wzt8g1 +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_mkvat4ehphrje9n2hu3t +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_nd3ymt54l1ga22i2brn8 +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_o2dk1yhw6ez9jzxf6p0a +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_p76i310zb4y12iqm5o0n +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_pi3hvrrkfxnxl300wvah +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_q4w5d86flb4u9tsadqvw +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_sfa5nundogo63o056n5y +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_tkjlmqeauf5gur2u5nob +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_tngbj11ilv2i75rqn2d2 +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_u4haqgvgybvc1sb5nihw +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_uwholuf0iix2vvbo2l3c +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_waye238ygft3p4xvppc4 +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_ydwo7p117loo2ky40lk3 +0 -0
- data/test/benchmark/tmp/miniprofiler/mp_timers_zhgmyfizfa8slppitgua +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e9f526564b9458ceea3d9391ddbf81cf996ff713dbb217bcec1c22931b4cd028
|
4
|
+
data.tar.gz: ac5641428e5b17ffa605bc7337f8f77000354a2a47f1a5ed7244ab50cdca84b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af47a8298fbc563716f0c7b4a9e0d92b85243ead1b0ccac561703d17f09574a3e65f280adedbb24ee7d65c0634c4ca343c58aa665628ff75d7e220b89025e91d
|
7
|
+
data.tar.gz: 6974a26799a967fbb8b172092be014deb775909a52cf10cf4e7dc88b5c05c96f6b6acbb3d245f9ad9032c743c2048c1afd8335d3a899c3111f2d6b48015800f7
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
## 0.09.x
|
2
2
|
|
3
|
-
### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.
|
3
|
+
### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.8...0-9-stable)
|
4
|
+
|
5
|
+
### [v0.9.8 (2020-12-10)](https://github.com/rails-api/active_model_serializers/compare/v0.9.7...v0.9.8)
|
6
|
+
|
7
|
+
- [#2373](https://github.com/rails-api/active_model_serializers/pull/2373) Fix Rails 6.0 deprecation warnings. (@supremebeing7)
|
4
8
|
|
5
9
|
### [v0.9.7 (2017-05-01)](https://github.com/rails-api/active_model_serializers/compare/v0.9.6...v0.9.7)
|
6
10
|
|
data/README.md
CHANGED
@@ -85,7 +85,7 @@ it exists, use it to serialize the `Post`.
|
|
85
85
|
|
86
86
|
This also works with `respond_with`, which uses `to_json` under the hood. Also
|
87
87
|
note that any options passed to `render :json` will be passed to your
|
88
|
-
serializer and available as `@
|
88
|
+
serializer and available as `@serialization_options` inside.
|
89
89
|
|
90
90
|
To specify a custom serializer for an object, you can specify the
|
91
91
|
serializer when you render the object:
|
@@ -60,7 +60,15 @@ module ActionController
|
|
60
60
|
private
|
61
61
|
|
62
62
|
def namespace_for_serializer
|
63
|
-
@namespace_for_serializer ||= self.class
|
63
|
+
@namespace_for_serializer ||= namespace_for_class(self.class) unless namespace_for_class(self.class) == Object
|
64
|
+
end
|
65
|
+
|
66
|
+
def namespace_for_class(klass)
|
67
|
+
if Module.method_defined?(:module_parent)
|
68
|
+
klass.module_parent
|
69
|
+
else
|
70
|
+
klass.parent
|
71
|
+
end
|
64
72
|
end
|
65
73
|
|
66
74
|
def default_serializer(resource)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ActiveModelSerializers
|
2
|
+
class Model
|
3
|
+
module Caching
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
attr_writer :updated_at
|
8
|
+
attributes :id
|
9
|
+
end
|
10
|
+
|
11
|
+
# Defaults to the downcased model name and updated_at
|
12
|
+
def cache_key
|
13
|
+
ActiveSupport::Cache.expand_cache_key([
|
14
|
+
self.class.model_name.name.downcase,
|
15
|
+
"#{id}-#{updated_at.strftime('%Y%m%d%H%M%S%9N')}"
|
16
|
+
].compact)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Defaults to the time the serializer file was modified.
|
20
|
+
def updated_at
|
21
|
+
defined?(@updated_at) ? @updated_at : File.mtime(__FILE__)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
Rails.application.routes.draw { }
|
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.
|
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:
|
13
|
+
date: 2020-12-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activemodel
|
@@ -89,42 +89,20 @@ files:
|
|
89
89
|
- lib/active_model/serializer/version.rb
|
90
90
|
- lib/active_model/serializer_support.rb
|
91
91
|
- lib/active_model_serializers.rb
|
92
|
-
- lib/
|
93
|
-
- test/action_controller/http_cache_test.rb
|
94
|
-
- test/action_controller/regression_test.rb
|
92
|
+
- lib/active_model_serializers/model/caching.rb
|
95
93
|
- test/benchmark/app.rb
|
96
94
|
- test/benchmark/benchmarking_support.rb
|
97
95
|
- test/benchmark/bm_active_record.rb
|
98
|
-
- test/benchmark/bm_rails_cache.rb
|
99
96
|
- test/benchmark/setup.rb
|
100
|
-
- test/benchmark/tmp/miniprofiler/
|
101
|
-
- test/benchmark/tmp/miniprofiler/
|
102
|
-
- test/benchmark/tmp/miniprofiler/
|
103
|
-
- test/benchmark/tmp/miniprofiler/
|
104
|
-
- test/benchmark/tmp/miniprofiler/
|
105
|
-
- test/benchmark/tmp/miniprofiler/
|
106
|
-
- test/benchmark/tmp/miniprofiler/
|
107
|
-
- test/benchmark/tmp/miniprofiler/
|
108
|
-
- test/benchmark/tmp/miniprofiler/
|
109
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_hqodkd691tbr7sbfdiez
|
110
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_j7y5frtod7cw4qc4cear
|
111
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_jpxzfgo92l24t7wzt8g1
|
112
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_m78k2w11sd7ba5oh40rw
|
113
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_mkvat4ehphrje9n2hu3t
|
114
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_nd3ymt54l1ga22i2brn8
|
115
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_o2dk1yhw6ez9jzxf6p0a
|
116
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_p76i310zb4y12iqm5o0n
|
117
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_pi3hvrrkfxnxl300wvah
|
118
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_q4w5d86flb4u9tsadqvw
|
119
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_sfa5nundogo63o056n5y
|
120
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_tkjlmqeauf5gur2u5nob
|
121
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_tngbj11ilv2i75rqn2d2
|
122
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_u4haqgvgybvc1sb5nihw
|
123
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_uc1b3hwqrd4q512gy6c9
|
124
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_uwholuf0iix2vvbo2l3c
|
125
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_waye238ygft3p4xvppc4
|
126
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_ydwo7p117loo2ky40lk3
|
127
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_zhgmyfizfa8slppitgua
|
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
|
128
106
|
- test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1
|
129
107
|
- test/fixtures/active_record.rb
|
130
108
|
- test/fixtures/poro.rb
|
@@ -138,7 +116,12 @@ files:
|
|
138
116
|
- test/integration/generators/serializer_generator_test.rb
|
139
117
|
- test/test_app.rb
|
140
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
|
141
123
|
- test/tmp/app/serializers/account_serializer.rb
|
124
|
+
- test/tmp/config/routes.rb
|
142
125
|
- test/unit/active_model/array_serializer/except_test.rb
|
143
126
|
- test/unit/active_model/array_serializer/key_format_test.rb
|
144
127
|
- test/unit/active_model/array_serializer/meta_test.rb
|
@@ -169,7 +152,7 @@ homepage: https://github.com/rails-api/active_model_serializers
|
|
169
152
|
licenses:
|
170
153
|
- MIT
|
171
154
|
metadata: {}
|
172
|
-
post_install_message:
|
155
|
+
post_install_message:
|
173
156
|
rdoc_options: []
|
174
157
|
require_paths:
|
175
158
|
- lib
|
@@ -184,85 +167,67 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
167
|
- !ruby/object:Gem::Version
|
185
168
|
version: '0'
|
186
169
|
requirements: []
|
187
|
-
|
188
|
-
|
189
|
-
signing_key:
|
170
|
+
rubygems_version: 3.1.4
|
171
|
+
signing_key:
|
190
172
|
specification_version: 4
|
191
173
|
summary: Bringing consistency and object orientation to model serialization. Works
|
192
174
|
great for client-side MVC frameworks!
|
193
175
|
test_files:
|
194
|
-
- test/action_controller/http_cache_test.rb
|
195
|
-
- test/action_controller/regression_test.rb
|
196
176
|
- test/benchmark/app.rb
|
197
|
-
- test/benchmark/benchmarking_support.rb
|
198
|
-
- test/benchmark/bm_active_record.rb
|
199
|
-
- test/benchmark/bm_rails_cache.rb
|
200
177
|
- test/benchmark/setup.rb
|
201
|
-
- test/benchmark/
|
202
|
-
- test/benchmark/tmp/miniprofiler/
|
203
|
-
- test/benchmark/tmp/miniprofiler/
|
204
|
-
- test/benchmark/tmp/miniprofiler/
|
205
|
-
- test/benchmark/tmp/miniprofiler/
|
206
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_7nlok5ykeley83h8bine
|
207
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_b36ymkc1vgu5fy9fvm9k
|
208
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_c3a27vo6uvfijeh105nt
|
209
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_eqcbrj14r4c341abi3h6
|
210
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_hqodkd691tbr7sbfdiez
|
211
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_j7y5frtod7cw4qc4cear
|
212
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_jpxzfgo92l24t7wzt8g1
|
213
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_m78k2w11sd7ba5oh40rw
|
214
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_mkvat4ehphrje9n2hu3t
|
215
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_nd3ymt54l1ga22i2brn8
|
216
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_o2dk1yhw6ez9jzxf6p0a
|
217
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_p76i310zb4y12iqm5o0n
|
218
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_pi3hvrrkfxnxl300wvah
|
219
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_q4w5d86flb4u9tsadqvw
|
220
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_sfa5nundogo63o056n5y
|
221
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_tkjlmqeauf5gur2u5nob
|
222
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_tngbj11ilv2i75rqn2d2
|
223
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_u4haqgvgybvc1sb5nihw
|
224
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_uc1b3hwqrd4q512gy6c9
|
225
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_uwholuf0iix2vvbo2l3c
|
226
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_waye238ygft3p4xvppc4
|
227
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_ydwo7p117loo2ky40lk3
|
228
|
-
- test/benchmark/tmp/miniprofiler/mp_timers_zhgmyfizfa8slppitgua
|
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
|
229
183
|
- test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1
|
230
|
-
- test/
|
231
|
-
- test/
|
232
|
-
- test/
|
233
|
-
- test/
|
234
|
-
- test/
|
235
|
-
- test/
|
236
|
-
- test/
|
237
|
-
- test/
|
238
|
-
- test/integration/generators/scaffold_controller_generator_test.rb
|
239
|
-
- test/integration/generators/serializer_generator_test.rb
|
240
|
-
- test/test_app.rb
|
241
|
-
- test/test_helper.rb
|
242
|
-
- test/tmp/app/serializers/account_serializer.rb
|
243
|
-
- test/unit/active_model/array_serializer/except_test.rb
|
244
|
-
- test/unit/active_model/array_serializer/key_format_test.rb
|
245
|
-
- test/unit/active_model/array_serializer/meta_test.rb
|
246
|
-
- test/unit/active_model/array_serializer/only_test.rb
|
247
|
-
- test/unit/active_model/array_serializer/options_test.rb
|
248
|
-
- test/unit/active_model/array_serializer/root_test.rb
|
249
|
-
- test/unit/active_model/array_serializer/scope_test.rb
|
250
|
-
- test/unit/active_model/array_serializer/serialization_test.rb
|
251
|
-
- test/unit/active_model/default_serializer_test.rb
|
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
|
252
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
|
253
195
|
- test/unit/active_model/serializer/associations_test.rb
|
196
|
+
- test/unit/active_model/serializer/options_test.rb
|
254
197
|
- test/unit/active_model/serializer/attributes_test.rb
|
255
|
-
- test/unit/active_model/serializer/
|
256
|
-
- test/unit/active_model/serializer/
|
198
|
+
- test/unit/active_model/serializer/root_test.rb
|
199
|
+
- test/unit/active_model/serializer/meta_test.rb
|
257
200
|
- test/unit/active_model/serializer/has_many_polymorphic_test.rb
|
201
|
+
- test/unit/active_model/serializer/has_one_polymorphic_test.rb
|
258
202
|
- test/unit/active_model/serializer/has_many_test.rb
|
259
203
|
- test/unit/active_model/serializer/has_one_and_has_many_test.rb
|
260
|
-
- test/unit/active_model/serializer/
|
261
|
-
- test/unit/active_model/serializer/has_one_test.rb
|
262
|
-
- test/unit/active_model/serializer/key_format_test.rb
|
263
|
-
- test/unit/active_model/serializer/meta_test.rb
|
264
|
-
- test/unit/active_model/serializer/options_test.rb
|
265
|
-
- test/unit/active_model/serializer/root_test.rb
|
204
|
+
- test/unit/active_model/serializer/filter_test.rb
|
266
205
|
- test/unit/active_model/serializer/scope_test.rb
|
267
|
-
- test/unit/active_model/
|
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
|
268
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
|
data/lib/bulk_cache_fetcher.rb
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# https://github.com/justinweiss/bulk_cache_fetcher/blob/df1c83e06b9641b7ec3408ec577b37528021190f/lib/bulk_cache_fetcher.rb
|
3
|
-
# Fetches many objects from a cache in order. In the event that some
|
4
|
-
# objects can't be served from the cache, you will have the
|
5
|
-
# opportunity to fetch them in bulk. This allows you to preload and
|
6
|
-
# cache entire object hierarchies, which works particularly well with
|
7
|
-
# Rails' nested caching while avoiding the n+1 queries problem in the
|
8
|
-
# uncached case.
|
9
|
-
class BulkCacheFetcher
|
10
|
-
VERSION = '1.0.0'
|
11
|
-
|
12
|
-
# Creates a new bulk cache fetcher, backed by +cache+. Cache must
|
13
|
-
# respond to the standard Rails cache API, described on
|
14
|
-
# http://guides.rubyonrails.org/caching_with_rails.html
|
15
|
-
def initialize(cache)
|
16
|
-
@cache = cache
|
17
|
-
end
|
18
|
-
|
19
|
-
# Returns a list of objects identified by
|
20
|
-
# <tt>object_identifiers</tt>. +fetch+ will try to find the objects
|
21
|
-
# from the cache first. Identifiers for objects that aren't in the
|
22
|
-
# cache will be passed as an ordered list to <tt>finder_block</tt>,
|
23
|
-
# where you can find the objects as you see fit. These objects
|
24
|
-
# should be returned in the same order as the identifiers that were
|
25
|
-
# passed into the block, because they'll be cached under their
|
26
|
-
# respective keys. The objects returned by +fetch+ will be returned
|
27
|
-
# in the same order as the <tt>object_identifiers</tt> passed in.
|
28
|
-
#
|
29
|
-
# +options+ will be passed along unmodified when caching newly found
|
30
|
-
# objects, so you can use it for things like setting cache
|
31
|
-
# expiration.
|
32
|
-
def fetch(object_identifiers, options = {}, &finder_block)
|
33
|
-
object_identifiers = normalize(object_identifiers)
|
34
|
-
cached_keys_with_objects, uncached_identifiers = partition(object_identifiers)
|
35
|
-
found_objects = find(uncached_identifiers, options, &finder_block)
|
36
|
-
coalesce(cache_keys(object_identifiers), cached_keys_with_objects, found_objects)
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
# Splits a list of identifiers into two objects. The first is a hash
|
42
|
-
# of <tt>{cache_key: object}</tt> for all the objects we were able to serve
|
43
|
-
# from the cache. The second is a list of all of the identifiers for
|
44
|
-
# objects that weren't cached.
|
45
|
-
def partition(object_identifiers)
|
46
|
-
uncached_identifiers = object_identifiers.dup
|
47
|
-
|
48
|
-
cache_keys = cache_keys(object_identifiers)
|
49
|
-
cached_keys_with_objects = @cache.read_multi(*cache_keys)
|
50
|
-
|
51
|
-
cache_keys.each do |cache_key|
|
52
|
-
uncached_identifiers.delete(cache_key) if cached_keys_with_objects.key?(cache_key)
|
53
|
-
end
|
54
|
-
|
55
|
-
[cached_keys_with_objects, uncached_identifiers]
|
56
|
-
end
|
57
|
-
|
58
|
-
# Finds all of the objects identified by +identifiers+, using the
|
59
|
-
# +finder_block+. Will pass +options+ on to the cache.
|
60
|
-
def find(identifiers, options = {})
|
61
|
-
return [] if identifiers.empty?
|
62
|
-
Array(yield(identifiers)).tap do |objects|
|
63
|
-
verify_equal_key_and_value_counts!(identifiers, objects)
|
64
|
-
cache_all(identifiers, objects, options)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Makes sure we have enough +identifiers+ to cache all of our
|
69
|
-
# +objects+, and vice-versa.
|
70
|
-
def verify_equal_key_and_value_counts!(identifiers, objects)
|
71
|
-
fail ArgumentError, 'You are returning too many objects from your cache block!' if objects.length > identifiers.length
|
72
|
-
fail ArgumentError, 'You are returning too few objects from your cache block!' if objects.length < identifiers.length
|
73
|
-
end
|
74
|
-
|
75
|
-
# Caches all +values+ under their respective +keys+.
|
76
|
-
def cache_all(keys, values, options = {})
|
77
|
-
keys.zip(values) { |k, v| @cache.write(cache_key(k), v, options) }
|
78
|
-
end
|
79
|
-
|
80
|
-
# Given a list of +cache_keys+, either find associated objects from
|
81
|
-
# +cached_keys_with_objects, or grab them from +found_objects+, in
|
82
|
-
# order.
|
83
|
-
def coalesce(cache_keys, cached_keys_with_objects, found_objects)
|
84
|
-
found_objects = Array(found_objects)
|
85
|
-
cache_keys.map { |key| cached_keys_with_objects.fetch(key) { found_objects.shift } }
|
86
|
-
end
|
87
|
-
|
88
|
-
# Returns the part of the identifier that we can use as the cache
|
89
|
-
# key. For simple identifiers, it's just the identifier, for
|
90
|
-
# identifiers with extra information attached, it's the first part
|
91
|
-
# of the identifier.
|
92
|
-
def cache_key(identifier)
|
93
|
-
Array(identifier).first
|
94
|
-
end
|
95
|
-
|
96
|
-
# Returns the cache keys for all of the +identifiers+.
|
97
|
-
def cache_keys(identifiers)
|
98
|
-
identifiers.map { |identifier| cache_key(identifier) }
|
99
|
-
end
|
100
|
-
|
101
|
-
# Makes sure we can iterate over identifiers.
|
102
|
-
def normalize(identifiers)
|
103
|
-
identifiers.respond_to?(:each) ? identifiers : Array(identifiers)
|
104
|
-
end
|
105
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# require 'test_helper'
|
2
|
-
#
|
3
|
-
# # https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/testing/integration.rb
|
4
|
-
# # rubocop:disable Style/ClassAndModuleChildren:
|
5
|
-
# class ActionController::Serialization::HttpCacheTest < ActionController::TestCase
|
6
|
-
# # class ActionController::Serialization::HttpCacheTest < ActionDispatch::IntegrationTest
|
7
|
-
# class HttpCacheTestController < ActionController::Base
|
8
|
-
# class Model < ActiveModelSerializers::Model
|
9
|
-
# attr_accessor :name, :description, :comments
|
10
|
-
# end
|
11
|
-
# class ModelSerializer < ActiveModel::Serializer
|
12
|
-
# attributes :name, :description, :comments
|
13
|
-
# end
|
14
|
-
#
|
15
|
-
# def render_as_serializable_object
|
16
|
-
# render serialization_options.merge!(json: model)
|
17
|
-
# end
|
18
|
-
#
|
19
|
-
# def render_as_json_string
|
20
|
-
# json = ActiveModelSerializers::SerializableResource.new(model, serialization_options).to_json
|
21
|
-
# render json: json
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# private
|
25
|
-
#
|
26
|
-
# def model
|
27
|
-
# Model.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
# def serialization_options
|
31
|
-
# { serializer: ModelSerializer, adapter: :json }
|
32
|
-
# end
|
33
|
-
# end
|
34
|
-
#
|
35
|
-
# tests HttpCacheTestController
|
36
|
-
#
|
37
|
-
# DATE = 'Date'.freeze
|
38
|
-
# LAST_MODIFIED = 'Last-Modified'.freeze
|
39
|
-
# ETAG = 'ETag'.freeze
|
40
|
-
# CACHE_CONTROL = 'Cache-Control'.freeze
|
41
|
-
# SPECIAL_KEYS = Set.new(%w(extras no-cache max-age public must-revalidate))
|
42
|
-
# def test_render_as_serializable_object
|
43
|
-
# 10.times do
|
44
|
-
# get :render_as_serializable_object
|
45
|
-
# end
|
46
|
-
# p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
|
47
|
-
# end
|
48
|
-
#
|
49
|
-
# def test_render_as_json_string
|
50
|
-
# 10.times do
|
51
|
-
# get :render_as_json_string
|
52
|
-
# end
|
53
|
-
# p [@response.etag?, @response.last_modified, @response.date, @response.headers[CACHE_CONTROL], @response.headers[ETAG], @response.headers[LAST_MODIFIED], @response.headers[DATE]]
|
54
|
-
# end
|
55
|
-
# end
|
56
|
-
# # rubocop:enable Style/ClassAndModuleChildren:
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# require 'test_helper'
|
2
|
-
#
|
3
|
-
# module ActionController
|
4
|
-
# module Serialization
|
5
|
-
# class ImplicitSerializerTest < ActionController::TestCase
|
6
|
-
# class PostWithoutSerializer < ActiveRecord::Base
|
7
|
-
# self.table_name = :posts
|
8
|
-
# end
|
9
|
-
# class ImplicitSerializationTestController < ActionController::Base
|
10
|
-
# def render_record_without_serializer
|
11
|
-
# @post = PostWithoutSerializer.new(title: 'Title', body: 'Body')
|
12
|
-
# render json: @post
|
13
|
-
# end
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# tests ImplicitSerializationTestController
|
17
|
-
#
|
18
|
-
# def test_record_without_serializer
|
19
|
-
# with_adapter :json do
|
20
|
-
# get :render_record_without_serializer
|
21
|
-
# end
|
22
|
-
#
|
23
|
-
# expected = {}
|
24
|
-
# PostWithoutSerializer.column_names.each { |field| expected[field] ||= nil }
|
25
|
-
# expected.update(
|
26
|
-
# title: 'Title',
|
27
|
-
# body: 'Body'
|
28
|
-
# )
|
29
|
-
#
|
30
|
-
# assert_equal 'application/json', @response.content_type
|
31
|
-
# assert_equal expected.to_json, @response.body
|
32
|
-
# end
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
# end
|
@@ -1,141 +0,0 @@
|
|
1
|
-
require 'bundler/setup'
|
2
|
-
require_relative './benchmarking_support'
|
3
|
-
require_relative './app'
|
4
|
-
|
5
|
-
time = 10
|
6
|
-
cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
|
7
|
-
comments = (0..50).map do |i|
|
8
|
-
Comment.new(id: i, body: 'ZOMG A COMMENT')
|
9
|
-
end
|
10
|
-
author = Author.new(id: 42, first_name: 'Joao', last_name: 'Moura')
|
11
|
-
model = Post.new(id: 1337, title: 'New Post', blog: nil, body: 'Body', comments: comments, author: author)
|
12
|
-
|
13
|
-
define_method :json do
|
14
|
-
model.to_json
|
15
|
-
end
|
16
|
-
define_method :cached_json do
|
17
|
-
parts = []
|
18
|
-
parts << 'key_name'
|
19
|
-
parts << 'adapter_name'
|
20
|
-
cache_key = parts.join('/')
|
21
|
-
cache_store.fetch(cache_key) { model.to_json }
|
22
|
-
end
|
23
|
-
define_method :ams do
|
24
|
-
ActiveModelSerializers::SerializableResource.new(model, adapter: :json, serializer: PostSerializer).as_json
|
25
|
-
end
|
26
|
-
define_method :cached_ams do
|
27
|
-
ActiveModelSerializers::SerializableResource.new(model, adapter: :json, serializer: CachingPostSerializer).as_json
|
28
|
-
end
|
29
|
-
def as_json(serializer_instance, adapter_instance, fields, includes = '*')
|
30
|
-
if serializer_instance.respond_to?(:each)
|
31
|
-
return serializer_instance.map do |each_serializer|
|
32
|
-
as_json(each_serializer, adapter_instance, fields, includes)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
cache_key = serializer_instance.cache_key(adapter_instance)
|
36
|
-
include_tree = includes || ActiveModel::Serializer::IncludeTree.from_include_args(includes)
|
37
|
-
cache_store = ActiveModelSerializers.config.cache_store
|
38
|
-
json = cache_store.fetch(cache_key) do
|
39
|
-
serializer_instance.attributes(fields)
|
40
|
-
end
|
41
|
-
serializer_instance.associations(include_tree).each do |association|
|
42
|
-
# FIXME: yields each association twice
|
43
|
-
json[association.key] ||= as_json(association.serializer, adapter_instance, [], includes[association.key])
|
44
|
-
end
|
45
|
-
json
|
46
|
-
end
|
47
|
-
|
48
|
-
define_method :cached_virtual_ams do
|
49
|
-
### OMG
|
50
|
-
post_serializer = CachingPostSerializer.new(model)
|
51
|
-
adapter_instance = ActiveModelSerializers::Adapter::Attributes.new(post_serializer)
|
52
|
-
fields = nil
|
53
|
-
includes = ActiveModel::Serializer::IncludeTree.from_include_args('*')
|
54
|
-
{ post: as_json(post_serializer, adapter_instance, fields, includes) }
|
55
|
-
# parts = []
|
56
|
-
# parts << 'ams_blog'
|
57
|
-
# parts << 'attributes'
|
58
|
-
# cache_key = parts.join('/')
|
59
|
-
# cache_store.fetch(cache_key) do
|
60
|
-
# include_tree = ActiveModel::Serializer::IncludeTree.from_include_args('*')
|
61
|
-
# post_serializer = CachingPostSerializer.new(model)
|
62
|
-
# json = { post: post_serializer.attributes }
|
63
|
-
# post_serializer.associations(include_tree).each do |association|
|
64
|
-
# # FIXME: yields each association twice
|
65
|
-
# json[:post][association.key] ||=
|
66
|
-
# case association.key
|
67
|
-
# when :comments
|
68
|
-
# cache_store.fetch(%w(ams_comments attributes).join('/')) do
|
69
|
-
# association.serializer.map(&:attributes)
|
70
|
-
# end
|
71
|
-
# when :blog
|
72
|
-
# association.serializer.attributes
|
73
|
-
# when :author
|
74
|
-
# cache_store.fetch(%w(ams_author attributes).join('/')) do
|
75
|
-
# association.serializer.attributes
|
76
|
-
# end
|
77
|
-
# else
|
78
|
-
# fail ArgumentError, "unexpected association #{association}"
|
79
|
-
# end
|
80
|
-
# end
|
81
|
-
# json
|
82
|
-
# end
|
83
|
-
end
|
84
|
-
puts JSON.pretty_generate(
|
85
|
-
equality: { cached_ams: ams == cached_ams, cached_virtual_ams: ams == cached_virtual_ams },
|
86
|
-
ams: ams,
|
87
|
-
cached_ams: cached_ams,
|
88
|
-
cached_virtual_ams: cached_virtual_ams
|
89
|
-
)
|
90
|
-
|
91
|
-
{
|
92
|
-
# 'cached json' => { disable_gc: true, send: :cached_json },
|
93
|
-
# 'json' => { disable_gc: true, send: :json },
|
94
|
-
# 'cached ams' => { disable_gc: true, send: :cached_ams },
|
95
|
-
'cached virtual ams' => { disable_gc: true, send: :cached_virtual_ams },
|
96
|
-
'ams' => { disable_gc: true, send: :ams }
|
97
|
-
}.each do |label, options|
|
98
|
-
Benchmark.ams(label, time: time, disable_gc: options[:disable_gc]) do
|
99
|
-
send(options[:send])
|
100
|
-
end
|
101
|
-
end
|
102
|
-
__END__
|
103
|
-
cached json 121321.3745504354/ips; 16 objects
|
104
|
-
json 1177.243210850789/ips; 1984 objects
|
105
|
-
cached ams 251.90341731442047/ips; 5879 objects
|
106
|
-
cached virtual ams 89169.87612473704/ips; 16 objects
|
107
|
-
ams 598.9890084759535/ips; 2348 objects
|
108
|
-
Benchmark results:
|
109
|
-
{
|
110
|
-
"commit_hash": "aa0be94",
|
111
|
-
"version": "0.10.0.rc5",
|
112
|
-
"rails_version": "4.2.5.1",
|
113
|
-
"benchmark_run[environment]": "2.2.3p173",
|
114
|
-
"runs": [
|
115
|
-
{
|
116
|
-
"benchmark_type[category]": "cached json",
|
117
|
-
"benchmark_run[result][iterations_per_second]": 121321.375,
|
118
|
-
"benchmark_run[result][total_allocated_objects_per_iteration]": 16
|
119
|
-
},
|
120
|
-
{
|
121
|
-
"benchmark_type[category]": "json",
|
122
|
-
"benchmark_run[result][iterations_per_second]": 1177.243,
|
123
|
-
"benchmark_run[result][total_allocated_objects_per_iteration]": 1984
|
124
|
-
},
|
125
|
-
{
|
126
|
-
"benchmark_type[category]": "cached ams",
|
127
|
-
"benchmark_run[result][iterations_per_second]": 251.903,
|
128
|
-
"benchmark_run[result][total_allocated_objects_per_iteration]": 5879
|
129
|
-
},
|
130
|
-
{
|
131
|
-
"benchmark_type[category]": "cached virtual ams",
|
132
|
-
"benchmark_run[result][iterations_per_second]": 89169.876,
|
133
|
-
"benchmark_run[result][total_allocated_objects_per_iteration]": 16
|
134
|
-
},
|
135
|
-
{
|
136
|
-
"benchmark_type[category]": "ams",
|
137
|
-
"benchmark_run[result][iterations_per_second]": 598.989,
|
138
|
-
"benchmark_run[result][total_allocated_objects_per_iteration]": 2348
|
139
|
-
}
|
140
|
-
]
|
141
|
-
}
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|