serega 0.8.1 → 0.8.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f1dd539e1a0b60a167cb67c5e8bfb509d5ce3be4d8ce8151a97a5f646f53378
4
- data.tar.gz: 39ed8e53b95cc192a0819fbc4452d2cb6951b9208566d0597802cd98b828669e
3
+ metadata.gz: 116b00d5c709f65a90899a9eda49f6e2c95cc9a47781a1cddf2499057553f427
4
+ data.tar.gz: 5f8fe19470218be68c09704964228be0381e677f5bd3cbcf9688f92974e9392d
5
5
  SHA512:
6
- metadata.gz: 7b6519e8fb225d6bc132c5144b2268b8b7866e030a3c7a582febac6fc468a3cae449cf9298e05b5468c31c8a975629891e196ee0f1537cee401ceab394c573a2
7
- data.tar.gz: bef92a58a8f730af6e97c3a36dbf6062aa7e3b99ad5c44484682447063018ec9dbcb345cc4715d1637a3d6c4c388f4b794a144b8250986db19efbe961b92c472
6
+ metadata.gz: 047de5335017cf65ee0f887124f81a755b94e19eea0e53a56ae24cb81698e7bdcc7e8eb6eba9256b5160a24bb011a5c0a1c1628cca77c7e7951b8883629ad96f
7
+ data.tar.gz: 5836df28c6e1cf2238d8c8471280dc806dd41a0cbbe474a101118d801e460830cda97dcb419e0885f9106d1e4e5ae795776ff5cc475555bdab6cb4c5408c1c94
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.1
1
+ 0.8.3
@@ -136,7 +136,9 @@ class Serega
136
136
 
137
137
  def keyword_block
138
138
  key_method_name = key
139
- proc { |object| object.public_send(key_method_name) }
139
+ proc do |object|
140
+ handle_no_method_error { object.public_send(key_method_name) }
141
+ end
140
142
  end
141
143
 
142
144
  def delegate_block
@@ -147,11 +149,25 @@ class Serega
147
149
  delegate_to = delegate[:to]
148
150
 
149
151
  if delegate[:allow_nil]
150
- proc { |object| object.public_send(delegate_to)&.public_send(key_method_name) }
152
+ proc do |object|
153
+ handle_no_method_error do
154
+ object.public_send(delegate_to)&.public_send(key_method_name)
155
+ end
156
+ end
151
157
  else
152
- proc { |object| object.public_send(delegate_to).public_send(key_method_name) }
158
+ proc do |object|
159
+ handle_no_method_error do
160
+ object.public_send(delegate_to).public_send(key_method_name)
161
+ end
162
+ end
153
163
  end
154
164
  end
165
+
166
+ def handle_no_method_error
167
+ yield
168
+ rescue NoMethodError => error
169
+ raise error, "NoMethodError when serializing '#{name}' attribute in #{self.class.serializer_class}\n\n#{error.message}", error.backtrace
170
+ end
155
171
  end
156
172
 
157
173
  extend Serega::SeregaHelpers::SerializerClassHelper
@@ -6,6 +6,9 @@ class Serega
6
6
  # JSON dump adapter for ::Oj
7
7
  #
8
8
  class OjDump
9
+ # Default Oj serialization options
10
+ OPTS = {mode: :compat}.freeze
11
+
9
12
  #
10
13
  # Dumps data to JSON string
11
14
  #
@@ -14,7 +17,7 @@ class Serega
14
17
  # @return [String] Data serialized to JSON
15
18
  #
16
19
  def self.call(data)
17
- ::Oj.dump(data, mode: :compat)
20
+ ::Oj.dump(data, OPTS)
18
21
  end
19
22
  end
20
23
 
data/lib/serega/map.rb CHANGED
@@ -35,7 +35,8 @@ class Serega
35
35
 
36
36
  def cached_map_for(opts, max_cache_size)
37
37
  @cache ||= {}
38
- cache_key = opts.to_s
38
+ cache_key = construct_cache_key(opts)
39
+
39
40
  map = @cache[cache_key] ||= map_for(opts)
40
41
  @cache.shift if @cache.length > max_cache_size
41
42
  map
@@ -50,7 +51,8 @@ class Serega
50
51
  end
51
52
 
52
53
  def construct_map(serializer_class, only:, except:, with:)
53
- serializer_class.attributes.each_with_object([]) do |(name, attribute), map|
54
+ map = []
55
+ serializer_class.attributes.each do |name, attribute|
54
56
  next unless attribute.visible?(only: only, except: except, with: with)
55
57
 
56
58
  nested_points =
@@ -65,6 +67,21 @@ class Serega
65
67
 
66
68
  map << serializer_class::SeregaMapPoint.new(attribute, nested_points)
67
69
  end
70
+ map
71
+ end
72
+
73
+ def construct_cache_key(opts, cache_key = nil)
74
+ return nil if opts.empty?
75
+
76
+ cache_key ||= +""
77
+
78
+ opts.each do |key, nested_opts|
79
+ cache_key.insert(-1, SeregaUtils::SymbolName.call(key))
80
+ cache_key.insert(-1, "-")
81
+ construct_cache_key(nested_opts, cache_key)
82
+ end
83
+
84
+ cache_key
68
85
  end
69
86
  end
70
87
 
@@ -50,6 +50,7 @@ class Serega
50
50
  # @return [void]
51
51
  #
52
52
  def self.load_plugin(serializer_class, **_opts)
53
+ require_relative "./lib/batch_option_model"
53
54
  require_relative "./lib/loader"
54
55
  require_relative "./lib/loaders"
55
56
  require_relative "./lib/validations/check_batch_opt_key"
@@ -87,14 +88,19 @@ class Serega
87
88
  serializer_class.const_set(:SeregaBatchLoader, batch_loader_class)
88
89
 
89
90
  if serializer_class.plugin_used?(:activerecord_preloads)
90
- require_relative "./lib/plugins_extensions"
91
+ require_relative "./lib/plugins_extensions/activerecord_preloads"
91
92
  serializer_class::SeregaBatchLoader.include(PluginsExtensions::ActiveRecordPreloads::BatchLoaderInstanceMethods)
92
93
  end
93
94
 
94
95
  if serializer_class.plugin_used?(:formatters)
95
- require_relative "./lib/plugins_extensions"
96
+ require_relative "./lib/plugins_extensions/formatters"
96
97
  serializer_class::SeregaBatchLoader.include(PluginsExtensions::Formatters::BatchLoaderInstanceMethods)
97
98
  end
99
+
100
+ if serializer_class.plugin_used?(:preloads)
101
+ require_relative "./lib/plugins_extensions/preloads"
102
+ serializer_class::SeregaAttribute.include(PluginsExtensions::Preloads::AttributeInstanceMethods)
103
+ end
98
104
  end
99
105
 
100
106
  #
@@ -140,56 +146,6 @@ class Serega
140
146
  end
141
147
  end
142
148
 
143
- #
144
- # Stores batch config for specific attribute
145
- #
146
- class BatchModel
147
- attr_reader :opts, :loaders, :many
148
-
149
- #
150
- # Initializes batch model
151
- #
152
- # @param opts [Hash] Attribute :batch option
153
- # @param loaders [Array] Array of all loaders defined in serialize class
154
- # @param many [Boolean] Option :many, defined on attribute
155
- #
156
- # @return [void]
157
- def initialize(opts, loaders, many)
158
- @opts = opts
159
- @loaders = loaders
160
- @many = many
161
- end
162
-
163
- # Returns proc that will be used to batch load registered keys values
164
- # @return [#call] batch loader
165
- def loader
166
- @batch_loader ||= begin
167
- loader = opts[:loader]
168
- loader = loaders.fetch(loader) if loader.is_a?(Symbol)
169
- loader
170
- end
171
- end
172
-
173
- # Returns proc that will be used to find batch_key for current attribute.
174
- # @return [Object] key (uid) of batch loaded object
175
- def key
176
- @batch_key ||= begin
177
- key = opts[:key]
178
- key.is_a?(Symbol) ? proc { |object| object.public_send(key) } : key
179
- end
180
- end
181
-
182
- # Returns default value to use if batch loader does not return value for some key
183
- # @return [Object] default value for missing key
184
- def default_value
185
- if opts.key?(:default)
186
- opts[:default]
187
- elsif many
188
- FROZEN_EMPTY_ARRAY
189
- end
190
- end
191
- end
192
-
193
149
  #
194
150
  # Config class additional/patched instance methods
195
151
  #
@@ -263,16 +219,16 @@ class Serega
263
219
  #
264
220
  module MapPointInstanceMethods
265
221
  #
266
- # Returns BatchModel, an object that encapsulates all batch_loader methods for current point
222
+ # Returns BatchOptionModel, an object that combines options and methods needed to load batch
267
223
  #
268
- # @return [BatchModel] batch model that encapsulates everything needed to load current batch
224
+ # @return [BatchOptionModel] Class that combines options and methods needed to load batch.
269
225
  #
270
226
  def batch
271
227
  return @batch if instance_variable_defined?(:@batch)
272
228
 
273
229
  @batch = begin
274
230
  opts = attribute.batch
275
- BatchModel.new(opts, self.class.serializer_class.config.batch_loaders, many) if opts
231
+ BatchOptionModel.new(attribute) if opts
276
232
  end
277
233
  end
278
234
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Serega
4
+ module SeregaPlugins
5
+ module Batch
6
+ #
7
+ # Combines options and methods needed to load batch for specific attribute
8
+ #
9
+ class BatchOptionModel
10
+ attr_reader :attribute, :opts, :loaders, :many
11
+
12
+ #
13
+ # Initializes BatchOptionModel
14
+ #
15
+ # @param map_point [Serega::SeregaMapPoint] Map point for attribute with :batch option
16
+ # @param loaders [Array] Array of all loaders defined in serialize class
17
+ # @param many [Boolean] Option :many, defined on attribute
18
+ #
19
+ # @return [void]
20
+ def initialize(attribute)
21
+ @attribute = attribute
22
+ @opts = attribute.batch
23
+ @loaders = attribute.class.serializer_class.config.batch_loaders
24
+ @many = attribute.many
25
+ end
26
+
27
+ # Returns proc that will be used to batch load registered keys values
28
+ # @return [#call] batch loader
29
+ def loader
30
+ @batch_loader ||= begin
31
+ loader = opts[:loader]
32
+ loader = loaders.fetch(loader) if loader.is_a?(Symbol)
33
+ loader
34
+ end
35
+ end
36
+
37
+ # Returns proc that will be used to find batch_key for current attribute.
38
+ # @return [Object] key (uid) of batch loaded object
39
+ def key
40
+ @batch_key ||= begin
41
+ key = opts[:key]
42
+
43
+ if key.is_a?(Symbol)
44
+ proc do |object|
45
+ handle_no_method_error { object.public_send(key) }
46
+ end
47
+ else
48
+ key
49
+ end
50
+ end
51
+ end
52
+
53
+ # Returns default value to use if batch loader does not return value for some key
54
+ # @return [Object] default value for missing key
55
+ def default_value
56
+ if opts.key?(:default)
57
+ opts[:default]
58
+ elsif many
59
+ FROZEN_EMPTY_ARRAY
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def handle_no_method_error
66
+ yield
67
+ rescue NoMethodError => error
68
+ raise error, "NoMethodError when serializing '#{attribute.name}' attribute in #{attribute.class.serializer_class}\n\n#{error.message}", error.backtrace
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Serega
4
+ module SeregaPlugins
5
+ module Batch
6
+ #
7
+ # Extensions (mini-plugins) that are enabled when :batch plugin used with other plugins
8
+ #
9
+ module PluginsExtensions
10
+ #
11
+ # Extension that is used when :batch plugin used with :active_record_preloads plugin
12
+ #
13
+ module ActiveRecordPreloads
14
+ #
15
+ # BatchLoader additional/patched instance methods
16
+ #
17
+ # @see Serega::SeregaPlugins::Batch::SeregaBatchLoader
18
+ #
19
+ module BatchLoaderInstanceMethods
20
+ private
21
+
22
+ # Preloads required associations to batch-loaded records
23
+ def keys_values(*)
24
+ data = super
25
+
26
+ if point.has_nested_points?
27
+ associations = point.preloads
28
+ return data if associations.empty?
29
+
30
+ records = data.values
31
+ records.flatten!(1)
32
+
33
+ ActiverecordPreloads::Preloader.preload(records, associations)
34
+ end
35
+
36
+ data
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Serega
4
+ module SeregaPlugins
5
+ module Batch
6
+ #
7
+ # Extensions (mini-plugins) that are enabled when :batch plugin used with other plugins
8
+ #
9
+ module PluginsExtensions
10
+ #
11
+ # Extension that is used when batch plugin used with :formatters plugin
12
+ #
13
+ module Formatters
14
+ #
15
+ # BatchLoader additional/patched instance methods
16
+ #
17
+ # @see Serega::SeregaPlugins::Batch::SeregaBatchLoader
18
+ #
19
+ module BatchLoaderInstanceMethods
20
+ private
21
+
22
+ # Format values after they are prepared
23
+ def keys_values(*)
24
+ data = super
25
+
26
+ formatter = point.attribute.formatter
27
+ data.transform_values! { |value| formatter.call(value) } if formatter
28
+
29
+ data
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Serega
4
+ module SeregaPlugins
5
+ module Batch
6
+ #
7
+ # Extensions (mini-plugins) that are enabled when :batch plugin used with other plugins
8
+ #
9
+ module PluginsExtensions
10
+ #
11
+ # Extension that is used when :preloads plugin is loaded
12
+ #
13
+ module Preloads
14
+ #
15
+ # Attribute additional/patched instance methods
16
+ #
17
+ # @see Serega::SeregaPlugins::Preloads::AttributeInstanceMethods
18
+ #
19
+ module AttributeInstanceMethods
20
+ private
21
+
22
+ # Do not add any preloads automatically when batch option provided
23
+ def get_preloads
24
+ return if batch && !opts.key?(:preload)
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "stringio"
4
+
3
5
  class Serega
4
6
  module SeregaPlugins
5
7
  #
@@ -14,7 +16,7 @@ class Serega
14
16
  # PostSerializer.new(only: "id,user(id,username)").to_h(post)
15
17
  # PostSerializer.new(except: "user(username,email)").to_h(post)
16
18
  # PostSerializer.new(with: "user(email)").to_h(post)
17
-
19
+ #
18
20
  # # Modifiers can still be provided old way with nested hashes or arrays.
19
21
  # PostSerializer.new(with: {user: %i[email, username]}).to_h(post)
20
22
  #
@@ -52,9 +54,11 @@ class Serega
52
54
  def parse(fields)
53
55
  res = {}
54
56
  attribute = +""
57
+ char = +""
55
58
  path_stack = nil
59
+ fields = StringIO.new(fields)
56
60
 
57
- fields.each_char do |char|
61
+ while fields.read(1, char)
58
62
  case char
59
63
  when ","
60
64
  add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Serega
4
+ module SeregaUtils
5
+ #
6
+ # Utility to get frozen string from symbol in any ruby version
7
+ #
8
+ class SymbolName
9
+ class << self
10
+ #
11
+ # Returns frozen string corresponding to provided symbol
12
+ #
13
+ # @param key [Symbol]
14
+ #
15
+ # @return [String] frozen string corresponding to provided symbol
16
+ #
17
+ def call(key)
18
+ key.is_a?(String) ? key : to_frozen_string(key)
19
+ end
20
+
21
+ private
22
+
23
+ # :nocov:
24
+ if RUBY_VERSION < "3"
25
+ def to_frozen_string(key)
26
+ key.to_s.freeze
27
+ end
28
+ else
29
+ def to_frozen_string(key)
30
+ key.name
31
+ end
32
+ end
33
+ # :nocov:
34
+ end
35
+ end
36
+ end
37
+ end
@@ -27,7 +27,7 @@ class Serega
27
27
  # @return [void]
28
28
  #
29
29
  def call(name)
30
- name = name.to_s
30
+ name = SeregaUtils::SymbolName.call(name)
31
31
 
32
32
  valid =
33
33
  case name.size
data/lib/serega.rb CHANGED
@@ -16,6 +16,7 @@ end
16
16
  require_relative "serega/errors"
17
17
  require_relative "serega/helpers/serializer_class_helper"
18
18
  require_relative "serega/utils/enum_deep_dup"
19
+ require_relative "serega/utils/symbol_name"
19
20
  require_relative "serega/utils/to_hash"
20
21
  require_relative "serega/json/adapter"
21
22
 
@@ -184,7 +185,7 @@ class Serega
184
185
  # Serializes provided object to Hash
185
186
  #
186
187
  # @param object [Object] Serialized object
187
- # @param opts [Hash] Serializer modifiers and other instantiating options
188
+ # @param opts [Hash, nil] Serializer modifiers and other instantiating options
188
189
  # @option opts [Array, Hash, String, Symbol] :only The only attributes to serialize
189
190
  # @option opts [Array, Hash, String, Symbol] :except Attributes to hide
190
191
  # @option opts [Array, Hash, String, Symbol] :with Attributes (usually hidden) to serialize additionally
@@ -194,13 +195,23 @@ class Serega
194
195
  #
195
196
  # @return [Hash] Serialization result
196
197
  #
197
- def call(object, opts = FROZEN_EMPTY_HASH)
198
+ def call(object, opts = nil)
199
+ opts ||= FROZEN_EMPTY_HASH
198
200
  initiate_keys = config.initiate_keys
199
- new(opts.slice(*initiate_keys)).to_h(object, opts.except(*initiate_keys))
201
+
202
+ if opts.empty?
203
+ modifiers_opts = FROZEN_EMPTY_HASH
204
+ serialize_opts = nil
205
+ else
206
+ serialize_opts = opts.except(*initiate_keys)
207
+ modifiers_opts = opts.slice(*initiate_keys)
208
+ end
209
+
210
+ new(modifiers_opts).to_h(object, serialize_opts)
200
211
  end
201
212
 
202
213
  # @see #call
203
- def to_h(object, opts = FROZEN_EMPTY_HASH)
214
+ def to_h(object, opts = nil)
204
215
  call(object, opts)
205
216
  end
206
217
 
@@ -208,7 +219,7 @@ class Serega
208
219
  # Serializes provided object to JSON string
209
220
  #
210
221
  # @param object [Object] Serialized object
211
- # @param opts [Hash] Serializer modifiers and other instantiating options
222
+ # @param opts [Hash, nil] Serializer modifiers and other instantiating options
212
223
  # @option opts [Array, Hash, String, Symbol] :only The only attributes to serialize
213
224
  # @option opts [Array, Hash, String, Symbol] :except Attributes to hide
214
225
  # @option opts [Array, Hash, String, Symbol] :with Attributes (usually hidden) to serialize additionally
@@ -218,16 +229,15 @@ class Serega
218
229
  #
219
230
  # @return [String] Serialization result
220
231
  #
221
- def to_json(object, opts = FROZEN_EMPTY_HASH)
222
- initiate_keys = config.initiate_keys
223
- new(opts.slice(*initiate_keys)).to_json(object, opts.except(*initiate_keys))
232
+ def to_json(object, opts = nil)
233
+ config.to_json.call(to_h(object, opts))
224
234
  end
225
235
 
226
236
  #
227
237
  # Serializes provided object as JSON
228
238
  #
229
239
  # @param object [Object] Serialized object
230
- # @param opts [Hash] Serializer modifiers and other instantiating options
240
+ # @param opts [Hash, nil] Serializer modifiers and other instantiating options
231
241
  # @option opts [Array, Hash, String, Symbol] :only The only attributes to serialize
232
242
  # @option opts [Array, Hash, String, Symbol] :except Attributes to hide
233
243
  # @option opts [Array, Hash, String, Symbol] :with Attributes (usually hidden) to serialize additionally
@@ -237,7 +247,7 @@ class Serega
237
247
  #
238
248
  # @return [Hash] Serialization result
239
249
  #
240
- def as_json(object, opts = FROZEN_EMPTY_HASH)
250
+ def as_json(object, opts = nil)
241
251
  config.from_json.call(to_json(object, opts))
242
252
  end
243
253
  end
@@ -249,36 +259,37 @@ class Serega
249
259
  #
250
260
  # Instantiates new Serega class
251
261
  #
252
- # @param opts [Hash] Serializer modifiers and other instantiating options
262
+ # @param opts [Hash, nil] Serializer modifiers and other instantiating options
253
263
  # @option opts [Array, Hash, String, Symbol] :only The only attributes to serialize
254
264
  # @option opts [Array, Hash, String, Symbol] :except Attributes to hide
255
265
  # @option opts [Array, Hash, String, Symbol] :with Attributes (usually hidden) to serialize additionally
256
266
  # @option opts [Boolean] :validate Validates provided modifiers (Default is true)
257
267
  #
258
- def initialize(opts = FROZEN_EMPTY_HASH)
259
- @opts = (opts == FROZEN_EMPTY_HASH) ? opts : prepare_modifiers(opts)
260
- self.class::CheckInitiateParams.new(@opts).validate if opts.fetch(:check_initiate_params) { config.check_initiate_params }
268
+ def initialize(opts = nil)
269
+ @opts = (opts.nil? || opts.empty?) ? FROZEN_EMPTY_HASH : prepare_modifiers(opts)
270
+ self.class::CheckInitiateParams.new(@opts).validate if opts&.fetch(:check_initiate_params) { config.check_initiate_params }
261
271
  end
262
272
 
263
273
  #
264
274
  # Serializes provided object to Hash
265
275
  #
266
276
  # @param object [Object] Serialized object
267
- # @param opts [Hash] Serializer modifiers and other instantiating options
277
+ # @param opts [Hash, nil] Serializer modifiers and other instantiating options
268
278
  # @option opts [Hash] :context Serialization context
269
279
  # @option opts [Boolean] :many Set true if provided multiple objects (Default `object.is_a?(Enumerable)`)
270
280
  #
271
281
  # @return [Hash] Serialization result
272
282
  #
273
- def call(object, opts = {})
274
- self.class::CheckSerializeParams.new(opts).validate
283
+ def call(object, opts = nil)
284
+ self.class::CheckSerializeParams.new(opts).validate if opts&.any?
285
+ opts ||= {}
275
286
  opts[:context] ||= {}
276
287
 
277
288
  serialize(object, opts)
278
289
  end
279
290
 
280
291
  # @see #call
281
- def to_h(object, opts = {})
292
+ def to_h(object, opts = nil)
282
293
  call(object, opts)
283
294
  end
284
295
 
@@ -286,13 +297,13 @@ class Serega
286
297
  # Serializes provided object to JSON string
287
298
  #
288
299
  # @param object [Object] Serialized object
289
- # @param opts [Hash] Serializer modifiers and other instantiating options
300
+ # @param opts [Hash, nil] Serializer modifiers and other instantiating options
290
301
  # @option opts [Hash] :context Serialization context
291
302
  # @option opts [Boolean] :many Set true if provided multiple objects (Default `object.is_a?(Enumerable)`)
292
303
  #
293
304
  # @return [Hash] Serialization result
294
305
  #
295
- def to_json(object, opts = {})
306
+ def to_json(object, opts = nil)
296
307
  hash = to_h(object, opts)
297
308
  config.to_json.call(hash)
298
309
  end
@@ -301,13 +312,13 @@ class Serega
301
312
  # Serializes provided object as JSON
302
313
  #
303
314
  # @param object [Object] Serialized object
304
- # @param opts [Hash] Serializer modifiers and other instantiating options
315
+ # @param opts [Hash, nil] Serializer modifiers and other instantiating options
305
316
  # @option opts [Hash] :context Serialization context
306
317
  # @option opts [Boolean] :many Set true if provided multiple objects (Default `object.is_a?(Enumerable)`)
307
318
  #
308
319
  # @return [Hash] Serialization result
309
320
  #
310
- def as_json(object, opts = {})
321
+ def as_json(object, opts = nil)
311
322
  json = to_json(object, opts)
312
323
  config.from_json.call(json)
313
324
  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.8.1
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Glushkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-10 00:00:00.000000000 Z
11
+ date: 2023-02-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  JSON Serializer
@@ -42,9 +42,12 @@ files:
42
42
  - lib/serega/plugins/activerecord_preloads/activerecord_preloads.rb
43
43
  - lib/serega/plugins/activerecord_preloads/lib/preloader.rb
44
44
  - lib/serega/plugins/batch/batch.rb
45
+ - lib/serega/plugins/batch/lib/batch_option_model.rb
45
46
  - lib/serega/plugins/batch/lib/loader.rb
46
47
  - lib/serega/plugins/batch/lib/loaders.rb
47
- - lib/serega/plugins/batch/lib/plugins_extensions.rb
48
+ - lib/serega/plugins/batch/lib/plugins_extensions/activerecord_preloads.rb
49
+ - lib/serega/plugins/batch/lib/plugins_extensions/formatters.rb
50
+ - lib/serega/plugins/batch/lib/plugins_extensions/preloads.rb
48
51
  - lib/serega/plugins/batch/lib/validations/check_batch_opt_key.rb
49
52
  - lib/serega/plugins/batch/lib/validations/check_batch_opt_loader.rb
50
53
  - lib/serega/plugins/batch/lib/validations/check_opt_batch.rb
@@ -70,6 +73,7 @@ files:
70
73
  - lib/serega/plugins/string_modifiers/parse_string_modifiers.rb
71
74
  - lib/serega/plugins/string_modifiers/string_modifiers.rb
72
75
  - lib/serega/utils/enum_deep_dup.rb
76
+ - lib/serega/utils/symbol_name.rb
73
77
  - lib/serega/utils/to_hash.rb
74
78
  - lib/serega/validations/attribute/check_block.rb
75
79
  - lib/serega/validations/attribute/check_name.rb
@@ -111,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
115
  - !ruby/object:Gem::Version
112
116
  version: '0'
113
117
  requirements: []
114
- rubygems_version: 3.3.15
118
+ rubygems_version: 3.4.6
115
119
  signing_key:
116
120
  specification_version: 4
117
121
  summary: JSON Serializer
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Serega
4
- module SeregaPlugins
5
- module Batch
6
- # Extensions (mini-plugins) that are enabled when Batch plugin used with other plugins
7
- module PluginsExtensions
8
- #
9
- # Extension that is used when batch plugin used with :active_record_preloads plugin
10
- #
11
- module ActiveRecordPreloads
12
- #
13
- # BatchLoader additional/patched instance methods
14
- #
15
- # @see Serega::SeregaPlugins::Batch::SeregaBatchLoader
16
- #
17
- module BatchLoaderInstanceMethods
18
- private
19
-
20
- # Preloads required associations to batch-loaded records
21
- def keys_values(*)
22
- data = super
23
-
24
- if point.has_nested_points?
25
- associations = point.preloads
26
- return data if associations.empty?
27
-
28
- ActiverecordPreloads::Preloader.preload(data.values.flatten(1), associations)
29
- end
30
-
31
- data
32
- end
33
- end
34
- end
35
-
36
- #
37
- # Extension that is used when batch plugin used with :formatters plugin
38
- #
39
- module Formatters
40
- #
41
- # BatchLoader additional/patched instance methods
42
- #
43
- # @see Serega::SeregaPlugins::Batch::SeregaBatchLoader
44
- #
45
- module BatchLoaderInstanceMethods
46
- private
47
-
48
- # Format values after they are prepared
49
- def keys_values(*)
50
- data = super
51
-
52
- formatter = point.attribute.formatter
53
- data.transform_values! { |value| formatter.call(value) } if formatter
54
-
55
- data
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
62
- end