serega 0.11.1 → 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 +7 -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"
|
@@ -136,97 +143,6 @@ class Serega
|
|
136
143
|
config.batch.default_key = opts[:default_key] if opts.key?(:default_key)
|
137
144
|
end
|
138
145
|
|
139
|
-
#
|
140
|
-
# Batch loader config
|
141
|
-
#
|
142
|
-
class BatchConfig
|
143
|
-
attr_reader :opts
|
144
|
-
|
145
|
-
def initialize(opts)
|
146
|
-
@opts = opts
|
147
|
-
end
|
148
|
-
|
149
|
-
#
|
150
|
-
# Defines batch loader
|
151
|
-
#
|
152
|
-
# @param loader_name [Symbol] Batch loader name, that is used when defining attribute with batch loader.
|
153
|
-
# @param block [Proc] Block that can accept 3 parameters - keys, context, plan_point
|
154
|
-
# and returns hash where ids are keys and values are batch loaded objects/
|
155
|
-
#
|
156
|
-
# @return [void]
|
157
|
-
#
|
158
|
-
def define(loader_name, &block)
|
159
|
-
unless block
|
160
|
-
raise SeregaError, "Block must be given to #define method"
|
161
|
-
end
|
162
|
-
|
163
|
-
params = block.parameters
|
164
|
-
if params.count > 3 || !params.all? { |param| (param[0] == :req) || (param[0] == :opt) }
|
165
|
-
raise SeregaError, "Block can have maximum 3 regular parameters"
|
166
|
-
end
|
167
|
-
|
168
|
-
loaders[loader_name] = block
|
169
|
-
end
|
170
|
-
|
171
|
-
# Shows defined loaders
|
172
|
-
# @return [Hash] defined loaders
|
173
|
-
def loaders
|
174
|
-
opts[:loaders]
|
175
|
-
end
|
176
|
-
|
177
|
-
#
|
178
|
-
# Finds previously defined batch loader by name
|
179
|
-
#
|
180
|
-
# @param loader_name [Symbol]
|
181
|
-
#
|
182
|
-
# @return [Proc] batch loader block
|
183
|
-
def fetch_loader(loader_name)
|
184
|
-
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| ... }")
|
185
|
-
end
|
186
|
-
|
187
|
-
# Shows option to auto hide attributes with :batch specified
|
188
|
-
# @return [Boolean, nil] option value
|
189
|
-
def auto_hide
|
190
|
-
opts[:auto_hide]
|
191
|
-
end
|
192
|
-
|
193
|
-
# @param value [Boolean] New :auto_hide option value
|
194
|
-
# @return [Boolean] New option value
|
195
|
-
def auto_hide=(value)
|
196
|
-
raise SeregaError, "Must have boolean value, #{value.inspect} provided" if (value != true) && (value != false)
|
197
|
-
opts[:auto_hide] = value
|
198
|
-
end
|
199
|
-
|
200
|
-
# Shows default key for :batch option
|
201
|
-
# @return [Symbol, nil] default key for :batch option
|
202
|
-
def default_key
|
203
|
-
opts[:default_key]
|
204
|
-
end
|
205
|
-
|
206
|
-
# @param value [Symbol] New :default_key option value
|
207
|
-
# @return [Boolean] New option value
|
208
|
-
def default_key=(value)
|
209
|
-
raise SeregaError, "Must be a Symbol, #{value.inspect} provided" unless value.is_a?(Symbol)
|
210
|
-
opts[:default_key] = value
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
#
|
215
|
-
# Config class additional/patched instance methods
|
216
|
-
#
|
217
|
-
# @see Serega::SeregaConfig
|
218
|
-
#
|
219
|
-
module ConfigInstanceMethods
|
220
|
-
#
|
221
|
-
# Returns all batch loaders registered for current serializer
|
222
|
-
#
|
223
|
-
# @return [Serega::SeregaPlugins::Batch::BatchConfig] configuration for batch loaded attributes
|
224
|
-
#
|
225
|
-
def batch
|
226
|
-
@batch ||= BatchConfig.new(opts.fetch(:batch))
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
146
|
#
|
231
147
|
# Serega class additional/patched class methods
|
232
148
|
#
|
@@ -248,138 +164,6 @@ class Serega
|
|
248
164
|
end
|
249
165
|
end
|
250
166
|
|
251
|
-
#
|
252
|
-
# Serega::SeregaValidations::CheckAttributeParams additional/patched class methods
|
253
|
-
#
|
254
|
-
# @see Serega::SeregaValidations::CheckAttributeParams
|
255
|
-
#
|
256
|
-
module CheckAttributeParamsInstanceMethods
|
257
|
-
private
|
258
|
-
|
259
|
-
def check_opts
|
260
|
-
super
|
261
|
-
|
262
|
-
CheckOptBatch.call(opts, block, self.class.serializer_class)
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
#
|
267
|
-
# Serega::SeregaAttribute additional/patched class methods
|
268
|
-
#
|
269
|
-
# @see Serega::SeregaAttribute
|
270
|
-
#
|
271
|
-
module AttributeInstanceMethods
|
272
|
-
#
|
273
|
-
# @return [nil, Hash] :batch option
|
274
|
-
#
|
275
|
-
attr_reader :batch
|
276
|
-
|
277
|
-
private
|
278
|
-
|
279
|
-
def set_normalized_vars(normalizer)
|
280
|
-
super
|
281
|
-
@batch = normalizer.batch
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
|
-
#
|
286
|
-
# SeregaAttributeNormalizer additional/patched instance methods
|
287
|
-
#
|
288
|
-
# @see SeregaAttributeNormalizer::AttributeInstanceMethods
|
289
|
-
#
|
290
|
-
module AttributeNormalizerInstanceMethods
|
291
|
-
#
|
292
|
-
# Returns normalized attribute :batch option with prepared :key and
|
293
|
-
# :default options. Option :loader will be prepared at serialization
|
294
|
-
# time as loaders are usually defined after attributes.
|
295
|
-
#
|
296
|
-
# @return [Hash] attribute :batch normalized options
|
297
|
-
#
|
298
|
-
def batch
|
299
|
-
return @batch if instance_variable_defined?(:@batch)
|
300
|
-
|
301
|
-
@batch = prepare_batch
|
302
|
-
end
|
303
|
-
|
304
|
-
private
|
305
|
-
|
306
|
-
#
|
307
|
-
# Patch for original `prepare_hide` method
|
308
|
-
#
|
309
|
-
# Marks attribute hidden if auto_hide option was set and attribute has batch loader
|
310
|
-
#
|
311
|
-
def prepare_hide
|
312
|
-
res = super
|
313
|
-
return res unless res.nil?
|
314
|
-
|
315
|
-
if batch
|
316
|
-
self.class.serializer_class.config.batch.auto_hide || nil
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
def prepare_batch
|
321
|
-
batch = init_opts[:batch]
|
322
|
-
return unless batch
|
323
|
-
|
324
|
-
# take loader
|
325
|
-
loader = batch[:loader]
|
326
|
-
|
327
|
-
# take key
|
328
|
-
key = batch[:key] || self.class.serializer_class.config.batch.default_key
|
329
|
-
proc_key =
|
330
|
-
if key.is_a?(Symbol)
|
331
|
-
proc do |object|
|
332
|
-
handle_no_method_error { object.public_send(key) }
|
333
|
-
end
|
334
|
-
else
|
335
|
-
key
|
336
|
-
end
|
337
|
-
|
338
|
-
# take default value
|
339
|
-
default = batch.fetch(:default) { many ? FROZEN_EMPTY_ARRAY : nil }
|
340
|
-
|
341
|
-
{loader: loader, key: proc_key, default: default}
|
342
|
-
end
|
343
|
-
|
344
|
-
def handle_no_method_error
|
345
|
-
yield
|
346
|
-
rescue NoMethodError => error
|
347
|
-
raise error, "NoMethodError when serializing '#{name}' attribute in #{self.class.serializer_class}\n\n#{error.message}", error.backtrace
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
|
-
#
|
352
|
-
# Serega::SeregaPlanPoint additional/patched class methods
|
353
|
-
#
|
354
|
-
# @see SeregaAttribute
|
355
|
-
#
|
356
|
-
module PlanPointInstanceMethods
|
357
|
-
#
|
358
|
-
# Returns attribute :batch option with prepared loader
|
359
|
-
# @return [Hash] attribute :batch option
|
360
|
-
#
|
361
|
-
attr_reader :batch
|
362
|
-
|
363
|
-
private
|
364
|
-
|
365
|
-
def set_normalized_vars
|
366
|
-
super
|
367
|
-
@batch = prepare_batch
|
368
|
-
end
|
369
|
-
|
370
|
-
def prepare_batch
|
371
|
-
batch = attribute.batch
|
372
|
-
if batch
|
373
|
-
loader = batch[:loader]
|
374
|
-
if loader.is_a?(Symbol)
|
375
|
-
batch_config = attribute.class.serializer_class.config.batch
|
376
|
-
batch[:loader] = batch_config.fetch_loader(loader)
|
377
|
-
end
|
378
|
-
end
|
379
|
-
batch
|
380
|
-
end
|
381
|
-
end
|
382
|
-
|
383
167
|
#
|
384
168
|
# Serega additional/patched instance methods
|
385
169
|
#
|
@@ -398,28 +182,6 @@ class Serega
|
|
398
182
|
result
|
399
183
|
end
|
400
184
|
end
|
401
|
-
|
402
|
-
#
|
403
|
-
# SeregaObjectSerializer additional/patched class methods
|
404
|
-
#
|
405
|
-
# @see Serega::SeregaObjectSerializer
|
406
|
-
#
|
407
|
-
module SeregaObjectSerializerInstanceMethods
|
408
|
-
private
|
409
|
-
|
410
|
-
def attach_value(object, point, container)
|
411
|
-
batch = point.batch
|
412
|
-
return super unless batch
|
413
|
-
|
414
|
-
remember_key_for_batch_loading(batch, object, point, container)
|
415
|
-
end
|
416
|
-
|
417
|
-
def remember_key_for_batch_loading(batch, object, point, container)
|
418
|
-
key = batch[:key].call(object, context)
|
419
|
-
opts[:batch_loaders].get(point, self).remember(key, container)
|
420
|
-
container[point.name] = nil # Reserve attribute place in resulted hash. We will set correct value later
|
421
|
-
end
|
422
|
-
end
|
423
185
|
end
|
424
186
|
|
425
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
|