serega 0.11.0 → 0.11.2
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 +4 -4
- data/VERSION +1 -1
- data/lib/serega/plugins/batch/batch.rb +8 -245
- data/lib/serega/plugins/batch/lib/batch_config.rb +82 -0
- data/lib/serega/plugins/batch/lib/modules/attribute.rb +26 -0
- data/lib/serega/plugins/batch/lib/modules/attribute_normalizer.rb +73 -0
- data/lib/serega/plugins/batch/lib/modules/check_attribute_params.rb +22 -0
- data/lib/serega/plugins/batch/lib/modules/config.rb +23 -0
- data/lib/serega/plugins/batch/lib/modules/object_serializer.rb +46 -0
- data/lib/serega/plugins/batch/lib/modules/plan_point.rb +39 -0
- metadata +9 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9b4a68e91572d22cf24e20a79cc788f647eb63e16582f0e33497eec459692de1
|
|
4
|
+
data.tar.gz: 8d3a55c8fd783b00c55cb08ed8f62c0f47cb79573ccbdc9f65c6710489d0dd0f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 67cb15aafd0dd90dd301a2ae79643c93204c52c26752649f96e904d2e1fe75d37709c91474c891eb73d1ee913002c214fc2c0288a613f82ad082ee385b149338
|
|
7
|
+
data.tar.gz: c421133bba5f4be2227a266bf6eb6fa6013f0320741f4e842575823d3a6d9e93bf37e8029b9fa801b2bcede964679c19fe794a1f7f0dceb10909c98251db588b
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.11.
|
|
1
|
+
0.11.2
|
|
@@ -79,8 +79,15 @@ class Serega
|
|
|
79
79
|
# @return [void]
|
|
80
80
|
#
|
|
81
81
|
def self.load_plugin(serializer_class, **_opts)
|
|
82
|
+
require_relative "./lib/batch_config"
|
|
82
83
|
require_relative "./lib/loader"
|
|
83
84
|
require_relative "./lib/loaders"
|
|
85
|
+
require_relative "./lib/modules/attribute"
|
|
86
|
+
require_relative "./lib/modules/attribute_normalizer"
|
|
87
|
+
require_relative "./lib/modules/check_attribute_params"
|
|
88
|
+
require_relative "./lib/modules/config"
|
|
89
|
+
require_relative "./lib/modules/object_serializer"
|
|
90
|
+
require_relative "./lib/modules/plan_point"
|
|
84
91
|
require_relative "./lib/validations/check_batch_opt_key"
|
|
85
92
|
require_relative "./lib/validations/check_batch_opt_loader"
|
|
86
93
|
require_relative "./lib/validations/check_opt_batch"
|
|
@@ -133,97 +140,7 @@ class Serega
|
|
|
133
140
|
config.attribute_keys << :batch
|
|
134
141
|
config.opts[:batch] = {loaders: {}, default_key: nil, auto_hide: false}
|
|
135
142
|
config.batch.auto_hide = opts[:auto_hide] if opts.key?(:auto_hide)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
#
|
|
139
|
-
# Batch loader config
|
|
140
|
-
#
|
|
141
|
-
class BatchConfig
|
|
142
|
-
attr_reader :opts
|
|
143
|
-
|
|
144
|
-
def initialize(opts)
|
|
145
|
-
@opts = opts
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
#
|
|
149
|
-
# Defines batch loader
|
|
150
|
-
#
|
|
151
|
-
# @param loader_name [Symbol] Batch loader name, that is used when defining attribute with batch loader.
|
|
152
|
-
# @param block [Proc] Block that can accept 3 parameters - keys, context, plan_point
|
|
153
|
-
# and returns hash where ids are keys and values are batch loaded objects/
|
|
154
|
-
#
|
|
155
|
-
# @return [void]
|
|
156
|
-
#
|
|
157
|
-
def define(loader_name, &block)
|
|
158
|
-
unless block
|
|
159
|
-
raise SeregaError, "Block must be given to #define method"
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
params = block.parameters
|
|
163
|
-
if params.count > 3 || !params.all? { |param| (param[0] == :req) || (param[0] == :opt) }
|
|
164
|
-
raise SeregaError, "Block can have maximum 3 regular parameters"
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
loaders[loader_name] = block
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
# Shows defined loaders
|
|
171
|
-
# @return [Hash] defined loaders
|
|
172
|
-
def loaders
|
|
173
|
-
opts[:loaders]
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
#
|
|
177
|
-
# Finds previously defined batch loader by name
|
|
178
|
-
#
|
|
179
|
-
# @param loader_name [Symbol]
|
|
180
|
-
#
|
|
181
|
-
# @return [Proc] batch loader block
|
|
182
|
-
def fetch_loader(loader_name)
|
|
183
|
-
loaders[loader_name] || (raise SeregaError, "Batch loader with name `#{loader_name.inspect}` was not defined. Define example: config.batch.define(:#{loader_name}) { |keys, ctx, points| ... }")
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
# Shows option to auto hide attributes with :batch specified
|
|
187
|
-
# @return [Boolean, nil] option value
|
|
188
|
-
def auto_hide
|
|
189
|
-
opts[:auto_hide]
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
# @param value [Boolean] New :auto_hide option value
|
|
193
|
-
# @return [Boolean] New option value
|
|
194
|
-
def auto_hide=(value)
|
|
195
|
-
raise SeregaError, "Must have boolean value, #{value.inspect} provided" if (value != true) && (value != false)
|
|
196
|
-
opts[:auto_hide] = value
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
# Shows default key for :batch option
|
|
200
|
-
# @return [Symbol, nil] default key for :batch option
|
|
201
|
-
def default_key
|
|
202
|
-
opts[:default_key]
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
# @param value [Symbol] New :default_key option value
|
|
206
|
-
# @return [Boolean] New option value
|
|
207
|
-
def default_key=(value)
|
|
208
|
-
raise SeregaError, "Must be a Symbol, #{value.inspect} provided" unless value.is_a?(Symbol)
|
|
209
|
-
opts[:default_key] = value
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
#
|
|
214
|
-
# Config class additional/patched instance methods
|
|
215
|
-
#
|
|
216
|
-
# @see Serega::SeregaConfig
|
|
217
|
-
#
|
|
218
|
-
module ConfigInstanceMethods
|
|
219
|
-
#
|
|
220
|
-
# Returns all batch loaders registered for current serializer
|
|
221
|
-
#
|
|
222
|
-
# @return [Serega::SeregaPlugins::Batch::BatchConfig] configuration for batch loaded attributes
|
|
223
|
-
#
|
|
224
|
-
def batch
|
|
225
|
-
@batch ||= BatchConfig.new(opts.fetch(:batch))
|
|
226
|
-
end
|
|
143
|
+
config.batch.default_key = opts[:default_key] if opts.key?(:default_key)
|
|
227
144
|
end
|
|
228
145
|
|
|
229
146
|
#
|
|
@@ -247,138 +164,6 @@ class Serega
|
|
|
247
164
|
end
|
|
248
165
|
end
|
|
249
166
|
|
|
250
|
-
#
|
|
251
|
-
# Serega::SeregaValidations::CheckAttributeParams additional/patched class methods
|
|
252
|
-
#
|
|
253
|
-
# @see Serega::SeregaValidations::CheckAttributeParams
|
|
254
|
-
#
|
|
255
|
-
module CheckAttributeParamsInstanceMethods
|
|
256
|
-
private
|
|
257
|
-
|
|
258
|
-
def check_opts
|
|
259
|
-
super
|
|
260
|
-
|
|
261
|
-
CheckOptBatch.call(opts, block, self.class.serializer_class)
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
#
|
|
266
|
-
# Serega::SeregaAttribute additional/patched class methods
|
|
267
|
-
#
|
|
268
|
-
# @see Serega::SeregaAttribute
|
|
269
|
-
#
|
|
270
|
-
module AttributeInstanceMethods
|
|
271
|
-
#
|
|
272
|
-
# @return [nil, Hash] :batch option
|
|
273
|
-
#
|
|
274
|
-
attr_reader :batch
|
|
275
|
-
|
|
276
|
-
private
|
|
277
|
-
|
|
278
|
-
def set_normalized_vars(normalizer)
|
|
279
|
-
super
|
|
280
|
-
@batch = normalizer.batch
|
|
281
|
-
end
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
#
|
|
285
|
-
# SeregaAttributeNormalizer additional/patched instance methods
|
|
286
|
-
#
|
|
287
|
-
# @see SeregaAttributeNormalizer::AttributeInstanceMethods
|
|
288
|
-
#
|
|
289
|
-
module AttributeNormalizerInstanceMethods
|
|
290
|
-
#
|
|
291
|
-
# Returns normalized attribute :batch option with prepared :key and
|
|
292
|
-
# :default options. Option :loader will be prepared at serialization
|
|
293
|
-
# time as loaders are usually defined after attributes.
|
|
294
|
-
#
|
|
295
|
-
# @return [Hash] attribute :batch normalized options
|
|
296
|
-
#
|
|
297
|
-
def batch
|
|
298
|
-
return @batch if instance_variable_defined?(:@batch)
|
|
299
|
-
|
|
300
|
-
@batch = prepare_batch
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
private
|
|
304
|
-
|
|
305
|
-
#
|
|
306
|
-
# Patch for original `prepare_hide` method
|
|
307
|
-
#
|
|
308
|
-
# Marks attribute hidden if auto_hide option was set and attribute has batch loader
|
|
309
|
-
#
|
|
310
|
-
def prepare_hide
|
|
311
|
-
res = super
|
|
312
|
-
return res unless res.nil?
|
|
313
|
-
|
|
314
|
-
if batch
|
|
315
|
-
self.class.serializer_class.config.batch.auto_hide || nil
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
def prepare_batch
|
|
320
|
-
batch = init_opts[:batch]
|
|
321
|
-
return unless batch
|
|
322
|
-
|
|
323
|
-
# take loader
|
|
324
|
-
loader = batch[:loader]
|
|
325
|
-
|
|
326
|
-
# take key
|
|
327
|
-
key = batch[:key] || self.class.serializer_class.config.batch.default_key
|
|
328
|
-
proc_key =
|
|
329
|
-
if key.is_a?(Symbol)
|
|
330
|
-
proc do |object|
|
|
331
|
-
handle_no_method_error { object.public_send(key) }
|
|
332
|
-
end
|
|
333
|
-
else
|
|
334
|
-
key
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
# take default value
|
|
338
|
-
default = batch.fetch(:default) { many ? FROZEN_EMPTY_ARRAY : nil }
|
|
339
|
-
|
|
340
|
-
{loader: loader, key: proc_key, default: default}
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
def handle_no_method_error
|
|
344
|
-
yield
|
|
345
|
-
rescue NoMethodError => error
|
|
346
|
-
raise error, "NoMethodError when serializing '#{name}' attribute in #{self.class.serializer_class}\n\n#{error.message}", error.backtrace
|
|
347
|
-
end
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
#
|
|
351
|
-
# Serega::SeregaPlanPoint additional/patched class methods
|
|
352
|
-
#
|
|
353
|
-
# @see SeregaAttribute
|
|
354
|
-
#
|
|
355
|
-
module PlanPointInstanceMethods
|
|
356
|
-
#
|
|
357
|
-
# Returns attribute :batch option with prepared loader
|
|
358
|
-
# @return [Hash] attribute :batch option
|
|
359
|
-
#
|
|
360
|
-
attr_reader :batch
|
|
361
|
-
|
|
362
|
-
private
|
|
363
|
-
|
|
364
|
-
def set_normalized_vars
|
|
365
|
-
super
|
|
366
|
-
@batch = prepare_batch
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
def prepare_batch
|
|
370
|
-
batch = attribute.batch
|
|
371
|
-
if batch
|
|
372
|
-
loader = batch[:loader]
|
|
373
|
-
if loader.is_a?(Symbol)
|
|
374
|
-
batch_config = attribute.class.serializer_class.config.batch
|
|
375
|
-
batch[:loader] = batch_config.fetch_loader(loader)
|
|
376
|
-
end
|
|
377
|
-
end
|
|
378
|
-
batch
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
|
|
382
167
|
#
|
|
383
168
|
# Serega additional/patched instance methods
|
|
384
169
|
#
|
|
@@ -397,28 +182,6 @@ class Serega
|
|
|
397
182
|
result
|
|
398
183
|
end
|
|
399
184
|
end
|
|
400
|
-
|
|
401
|
-
#
|
|
402
|
-
# SeregaObjectSerializer additional/patched class methods
|
|
403
|
-
#
|
|
404
|
-
# @see Serega::SeregaObjectSerializer
|
|
405
|
-
#
|
|
406
|
-
module SeregaObjectSerializerInstanceMethods
|
|
407
|
-
private
|
|
408
|
-
|
|
409
|
-
def attach_value(object, point, container)
|
|
410
|
-
batch = point.batch
|
|
411
|
-
return super unless batch
|
|
412
|
-
|
|
413
|
-
remember_key_for_batch_loading(batch, object, point, container)
|
|
414
|
-
end
|
|
415
|
-
|
|
416
|
-
def remember_key_for_batch_loading(batch, object, point, container)
|
|
417
|
-
key = batch[:key].call(object, context)
|
|
418
|
-
opts[:batch_loaders].get(point, self).remember(key, container)
|
|
419
|
-
container[point.name] = nil # Reserve attribute place in resulted hash. We will set correct value later
|
|
420
|
-
end
|
|
421
|
-
end
|
|
422
185
|
end
|
|
423
186
|
|
|
424
187
|
register_plugin(Batch.plugin_name, Batch)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Serega
|
|
4
|
+
module SeregaPlugins
|
|
5
|
+
module Batch
|
|
6
|
+
#
|
|
7
|
+
# Batch plugin config
|
|
8
|
+
#
|
|
9
|
+
class BatchConfig
|
|
10
|
+
attr_reader :opts
|
|
11
|
+
|
|
12
|
+
def initialize(opts)
|
|
13
|
+
@opts = opts
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# Defines batch loader
|
|
18
|
+
#
|
|
19
|
+
# @param loader_name [Symbol] Batch loader name, that is used when defining attribute with batch loader.
|
|
20
|
+
# @param block [Proc] Block that can accept 3 parameters - keys, context, plan_point
|
|
21
|
+
# and returns hash where ids are keys and values are batch loaded objects/
|
|
22
|
+
#
|
|
23
|
+
# @return [void]
|
|
24
|
+
#
|
|
25
|
+
def define(loader_name, &block)
|
|
26
|
+
unless block
|
|
27
|
+
raise SeregaError, "Block must be given to #define method"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
params = block.parameters
|
|
31
|
+
if params.count > 3 || !params.all? { |param| (param[0] == :req) || (param[0] == :opt) }
|
|
32
|
+
raise SeregaError, "Block can have maximum 3 regular parameters"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
loaders[loader_name] = block
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Shows defined loaders
|
|
39
|
+
# @return [Hash] defined loaders
|
|
40
|
+
def loaders
|
|
41
|
+
opts[:loaders]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# Finds previously defined batch loader by name
|
|
46
|
+
#
|
|
47
|
+
# @param loader_name [Symbol]
|
|
48
|
+
#
|
|
49
|
+
# @return [Proc] batch loader block
|
|
50
|
+
def fetch_loader(loader_name)
|
|
51
|
+
loaders[loader_name] || (raise SeregaError, "Batch loader with name `#{loader_name.inspect}` was not defined. Define example: config.batch.define(:#{loader_name}) { |keys, ctx, points| ... }")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Shows option to auto hide attributes with :batch specified
|
|
55
|
+
# @return [Boolean, nil] option value
|
|
56
|
+
def auto_hide
|
|
57
|
+
opts[:auto_hide]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @param value [Boolean] New :auto_hide option value
|
|
61
|
+
# @return [Boolean] New option value
|
|
62
|
+
def auto_hide=(value)
|
|
63
|
+
raise SeregaError, "Must have boolean value, #{value.inspect} provided" if (value != true) && (value != false)
|
|
64
|
+
opts[:auto_hide] = value
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Shows default key for :batch option
|
|
68
|
+
# @return [Symbol, nil] default key for :batch option
|
|
69
|
+
def default_key
|
|
70
|
+
opts[:default_key]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @param value [Symbol] New :default_key option value
|
|
74
|
+
# @return [Boolean] New option value
|
|
75
|
+
def default_key=(value)
|
|
76
|
+
raise SeregaError, "Must be a Symbol, #{value.inspect} provided" unless value.is_a?(Symbol)
|
|
77
|
+
opts[:default_key] = value
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Serega
|
|
4
|
+
module SeregaPlugins
|
|
5
|
+
module Batch
|
|
6
|
+
#
|
|
7
|
+
# Serega::SeregaAttribute additional/patched class methods
|
|
8
|
+
#
|
|
9
|
+
# @see Serega::SeregaAttribute
|
|
10
|
+
#
|
|
11
|
+
module AttributeInstanceMethods
|
|
12
|
+
#
|
|
13
|
+
# @return [nil, Hash] :batch option
|
|
14
|
+
#
|
|
15
|
+
attr_reader :batch
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def set_normalized_vars(normalizer)
|
|
20
|
+
super
|
|
21
|
+
@batch = normalizer.batch
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Serega
|
|
4
|
+
module SeregaPlugins
|
|
5
|
+
module Batch
|
|
6
|
+
#
|
|
7
|
+
# SeregaAttributeNormalizer additional/patched instance methods
|
|
8
|
+
#
|
|
9
|
+
# @see SeregaAttributeNormalizer::AttributeInstanceMethods
|
|
10
|
+
#
|
|
11
|
+
module AttributeNormalizerInstanceMethods
|
|
12
|
+
#
|
|
13
|
+
# Returns normalized attribute :batch option with prepared :key and
|
|
14
|
+
# :default options. Option :loader will be prepared at serialization
|
|
15
|
+
# time as loaders are usually defined after attributes.
|
|
16
|
+
#
|
|
17
|
+
# @return [Hash] attribute :batch normalized options
|
|
18
|
+
#
|
|
19
|
+
def batch
|
|
20
|
+
return @batch if instance_variable_defined?(:@batch)
|
|
21
|
+
|
|
22
|
+
@batch = prepare_batch
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Patch for original `prepare_hide` method
|
|
29
|
+
#
|
|
30
|
+
# Marks attribute hidden if auto_hide option was set and attribute has batch loader
|
|
31
|
+
#
|
|
32
|
+
def prepare_hide
|
|
33
|
+
res = super
|
|
34
|
+
return res unless res.nil?
|
|
35
|
+
|
|
36
|
+
if batch
|
|
37
|
+
self.class.serializer_class.config.batch.auto_hide || nil
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def prepare_batch
|
|
42
|
+
batch = init_opts[:batch]
|
|
43
|
+
return unless batch
|
|
44
|
+
|
|
45
|
+
# take loader
|
|
46
|
+
loader = batch[:loader]
|
|
47
|
+
|
|
48
|
+
# take key
|
|
49
|
+
key = batch[:key] || self.class.serializer_class.config.batch.default_key
|
|
50
|
+
proc_key =
|
|
51
|
+
if key.is_a?(Symbol)
|
|
52
|
+
proc do |object|
|
|
53
|
+
handle_no_method_error { object.public_send(key) }
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
key
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# take default value
|
|
60
|
+
default = batch.fetch(:default) { many ? FROZEN_EMPTY_ARRAY : nil }
|
|
61
|
+
|
|
62
|
+
{loader: loader, key: proc_key, default: default}
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def handle_no_method_error
|
|
66
|
+
yield
|
|
67
|
+
rescue NoMethodError => error
|
|
68
|
+
raise error, "NoMethodError when serializing '#{name}' attribute in #{self.class.serializer_class}\n\n#{error.message}", error.backtrace
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Serega
|
|
4
|
+
module SeregaPlugins
|
|
5
|
+
module Batch
|
|
6
|
+
#
|
|
7
|
+
# Serega::SeregaValidations::CheckAttributeParams additional/patched class methods
|
|
8
|
+
#
|
|
9
|
+
# @see Serega::SeregaValidations::CheckAttributeParams
|
|
10
|
+
#
|
|
11
|
+
module CheckAttributeParamsInstanceMethods
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def check_opts
|
|
15
|
+
super
|
|
16
|
+
|
|
17
|
+
CheckOptBatch.call(opts, block, self.class.serializer_class)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Serega
|
|
4
|
+
module SeregaPlugins
|
|
5
|
+
module Batch
|
|
6
|
+
#
|
|
7
|
+
# Config class additional/patched instance methods
|
|
8
|
+
#
|
|
9
|
+
# @see Serega::SeregaConfig
|
|
10
|
+
#
|
|
11
|
+
module ConfigInstanceMethods
|
|
12
|
+
#
|
|
13
|
+
# Returns all batch loaders registered for current serializer
|
|
14
|
+
#
|
|
15
|
+
# @return [Serega::SeregaPlugins::Batch::BatchConfig] configuration for batch loaded attributes
|
|
16
|
+
#
|
|
17
|
+
def batch
|
|
18
|
+
@batch ||= BatchConfig.new(opts.fetch(:batch))
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Serega
|
|
4
|
+
module SeregaPlugins
|
|
5
|
+
module Batch
|
|
6
|
+
#
|
|
7
|
+
# SeregaObjectSerializer additional/patched class methods
|
|
8
|
+
#
|
|
9
|
+
# @see Serega::SeregaObjectSerializer
|
|
10
|
+
#
|
|
11
|
+
module SeregaObjectSerializerInstanceMethods
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def attach_value(object, point, container)
|
|
15
|
+
batch = point.batch
|
|
16
|
+
return super unless batch
|
|
17
|
+
|
|
18
|
+
remember_key_for_batch_loading(batch, object, point, container)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def remember_key_for_batch_loading(batch, object, point, container)
|
|
22
|
+
key = batch[:key].call(object, context)
|
|
23
|
+
batch_loader(point).remember(key, container)
|
|
24
|
+
container[point.name] = nil # Reserve attribute place in resulted hash. We will set correct value later
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def batch_loader(point)
|
|
28
|
+
batch_loaders = opts[:batch_loaders]
|
|
29
|
+
raise_batch_plugin_for_serializer_not_defined(point) unless batch_loaders
|
|
30
|
+
batch_loaders.get(point, self)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def raise_batch_plugin_for_serializer_not_defined(point)
|
|
34
|
+
root_plan = point.plan
|
|
35
|
+
root_plan = plan.parent_plan_point.plan while root_plan.parent_plan_point
|
|
36
|
+
current_serializer = root_plan.serializer_class
|
|
37
|
+
nested_serializer = self.class.serializer_class
|
|
38
|
+
|
|
39
|
+
raise SeregaError,
|
|
40
|
+
"Plugin :batch must be added to current serializer (#{current_serializer})" \
|
|
41
|
+
" to load attributes with :batch option in nested serializer (#{nested_serializer})"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Serega
|
|
4
|
+
module SeregaPlugins
|
|
5
|
+
module Batch
|
|
6
|
+
#
|
|
7
|
+
# Serega::SeregaPlanPoint additional/patched class methods
|
|
8
|
+
#
|
|
9
|
+
# @see SeregaAttribute
|
|
10
|
+
#
|
|
11
|
+
module PlanPointInstanceMethods
|
|
12
|
+
#
|
|
13
|
+
# Returns attribute :batch option with prepared loader
|
|
14
|
+
# @return [Hash] attribute :batch option
|
|
15
|
+
#
|
|
16
|
+
attr_reader :batch
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def set_normalized_vars
|
|
21
|
+
super
|
|
22
|
+
@batch = prepare_batch
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def prepare_batch
|
|
26
|
+
batch = attribute.batch
|
|
27
|
+
if batch
|
|
28
|
+
loader = batch[:loader]
|
|
29
|
+
if loader.is_a?(Symbol)
|
|
30
|
+
batch_config = attribute.class.serializer_class.config.batch
|
|
31
|
+
batch[:loader] = batch_config.fetch_loader(loader)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
batch
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: serega
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.11.
|
|
4
|
+
version: 0.11.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrey Glushkov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-04-
|
|
11
|
+
date: 2023-04-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: |
|
|
14
14
|
JSON Serializer
|
|
@@ -43,8 +43,15 @@ files:
|
|
|
43
43
|
- lib/serega/plugins/activerecord_preloads/activerecord_preloads.rb
|
|
44
44
|
- lib/serega/plugins/activerecord_preloads/lib/preloader.rb
|
|
45
45
|
- lib/serega/plugins/batch/batch.rb
|
|
46
|
+
- lib/serega/plugins/batch/lib/batch_config.rb
|
|
46
47
|
- lib/serega/plugins/batch/lib/loader.rb
|
|
47
48
|
- lib/serega/plugins/batch/lib/loaders.rb
|
|
49
|
+
- lib/serega/plugins/batch/lib/modules/attribute.rb
|
|
50
|
+
- lib/serega/plugins/batch/lib/modules/attribute_normalizer.rb
|
|
51
|
+
- lib/serega/plugins/batch/lib/modules/check_attribute_params.rb
|
|
52
|
+
- lib/serega/plugins/batch/lib/modules/config.rb
|
|
53
|
+
- lib/serega/plugins/batch/lib/modules/object_serializer.rb
|
|
54
|
+
- lib/serega/plugins/batch/lib/modules/plan_point.rb
|
|
48
55
|
- lib/serega/plugins/batch/lib/plugins_extensions/activerecord_preloads.rb
|
|
49
56
|
- lib/serega/plugins/batch/lib/plugins_extensions/formatters.rb
|
|
50
57
|
- lib/serega/plugins/batch/lib/plugins_extensions/preloads.rb
|