serega 0.17.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47eacc613b0a58af4dc552e09e0f55ed731f7e2a852e5c668794e7eb5128be69
4
- data.tar.gz: bb9fec8432d12108e374bf15da74a230a4efda994835e9480e795b7222bb9ced
3
+ metadata.gz: 60cc0f4e593d4600bf316e9c18bd93804008e28deebd5f51c231b632bb3a4eff
4
+ data.tar.gz: e3bdc8e6a0489a14916d84781dcf61c6a82dedb246a0b5366f324d78ca81d9b2
5
5
  SHA512:
6
- metadata.gz: d7536453cd03fd6e0f65faf22f85f5a12de61ef2bda50d674cd5b31ab1fba815c4b94d5118d82902f5a434d06112cfdc16757eefd334ba217946f9e920442e05
7
- data.tar.gz: 9bcd5c46c1ffa32f95bc02e821e94acd46408e4e65a0861e4738454e24a57767105a5d3a9af48d52c4662a1030819963f11ee8c317c84ed179eb44b282a02c73
6
+ metadata.gz: 879f46f3bface078c156ad0c89e71b4abc08945754034235d03a688c5613e549d477ae1d24bfa6d0f2c44de1def6266d9b18677ab9fab53ef8341510075806d5
7
+ data.tar.gz: 45b302b1efc001b9ff3ef35bb9d71bf05e3dcfffbfd35938cf938448b308e9c6c0f74a8f1c1eeceabf8a3bd0eb759f50dd053948664565fbeef2f4b8502841b2
data/README.md CHANGED
@@ -539,118 +539,165 @@ UserSerializer.to_h(user)
539
539
 
540
540
  ### Plugin :batch
541
541
 
542
- Adds ability to load nested attributes values in batches.
542
+ Must be used to omit N+1 when loading attributes values.
543
543
 
544
- It can be used to find value for attributes in optimal way:
544
+ User must provide batch loader object to attribute -
545
+ `attribute :foo, batch: {loader: SomeLoader, id_method: :id}`.
545
546
 
546
- - load associations for multiple objects
547
- - load counters for multiple objects
548
- - make any heavy calculations for multiple objects only once
549
-
550
- After including plugin, attributes gain new `:batch` option:
547
+ Result must be returned as Hash, where each key is one of provided ids.
551
548
 
552
549
  ```ruby
553
- attribute :name, batch: { loader: :name_loader, key: :id, default: nil }
550
+ class AppSerializer
551
+ plugin :batch
552
+ end
553
+
554
+ class UserSerializer < AppSerializer
555
+ attribute :comments_count,
556
+ batch: { loader: SomeLoader, id_method: :id }
557
+
558
+ attribute :company,
559
+ batch: { loader: SomeLoader, id_method: :id },
560
+ serializer: CompanySerializer
561
+ end
554
562
  ```
555
563
 
556
- `:batch` option must be a hash with this keys:
564
+ #### Option :loader
557
565
 
558
- - `loader` (required) [Symbol, Proc, callable] - Defines how to fetch values for
559
- batch of keys. Receives 3 parameters: keys, context, plan.
560
- - `key` (required) [Symbol, Proc, callable] - Defines current object identifier.
561
- Key is optional if plugin was defined with `default_key` option.
562
- - `default` (optional) - Default value for attribute.
563
- By default it is `nil` or `[]` when attribute has option `many: true`
564
- (ex: `attribute :tags, many: true, batch: { ... }`).
566
+ Loaders can be defined as a Proc, a callable value or a named Symbol
567
+ Named loaders should be predefined with
568
+ `config.batch.define(:loader_name) { |ids| ... })`
565
569
 
566
- If `:loader` was defined using name (as Symbol) then batch loader must be
567
- defined using `config.batch.define(:loader_name) { ... }` method.
570
+ Loader can accept 1 to 3 arguments:
568
571
 
569
- Result of this `:loader` callable must be a **Hash** where:
572
+ 1. List of ids (each id will be found by using `:id_method` option)
573
+ 1. Context
574
+ 1. PlanPoint - a special object containing information about current
575
+ attribute and all children and parent attributes. It can be used to preload
576
+ required associations to batch values.
577
+ See [example](examples/batch_loader.rb) how
578
+ to find required preloads when using with `:preloads` plugin.
570
579
 
571
- - keys - provided keys
572
- - values - values for according keys
580
+ ```ruby
581
+ class AppSerializer < Serega
582
+ plugin :batch, id_method: :id
583
+ end
573
584
 
574
- `Batch` plugin can be defined with two specific attributes:
585
+ class UserSerializer < Serega
586
+ # Define loader as callable object
587
+ attribute :comments_count,
588
+ batch: { loader: CountLoader }
575
589
 
576
- - `auto_hide: true` - Marks attributes with defined :batch as hidden, so it
577
- will not be serialized by default
578
- - `default_key: :id` - Set default object key (in this case :id) that will be
579
- used for all attributes with :batch option specified.
590
+ # Define loader as a Proc
591
+ attribute :comments_count,
592
+ batch: { loader: proc { |ids| CountLoader.call(ids) } }
580
593
 
581
- ```ruby
582
- plugin :batch, auto_hide: true, default_key: :id
594
+ # Define loader as a Symbol
595
+ config.batch.define(:comments_count_loader) { |ids| CountLoader.call(ids }
596
+ attribute :comments_count, batch: { loader: :comments_count_loader }
597
+ end
598
+
599
+ class CountLoader
600
+ def self.call(user_ids)
601
+ Comment.where(user_id: user_ids).group(:user_id).count
602
+ end
603
+ end
583
604
  ```
584
605
 
585
- Options `auto_hide` and `default_key` can be overwritten in nested serializers.
606
+ #### Option :id_method
607
+
608
+ Batch plugin can be added with global `:id_method` option. It can be a Symbol,
609
+ Proc or any callable value, which can accept current object and current context.
586
610
 
587
611
  ```ruby
588
- class AppSerializer
589
- plugin :batch, auto_hide: true, default_key: :id
612
+ class SomeSerializer
613
+ plugin :batch, id_method: :id
590
614
  end
591
615
 
592
616
  class UserSerializer < AppSerializer
593
- config.batch.auto_hide = false
594
- config.batch.default_key = :user_id
617
+ attribute :comments_count,
618
+ batch: { loader: CommentsCountBatchLoader } # no :id_method here anymore
619
+
620
+ attribute :company,
621
+ batch: { loader: UserCompanyBatchLoader }, # no :id_method here anymore
622
+ serializer: CompanySerializer
595
623
  end
624
+
596
625
  ```
597
626
 
598
- ---
599
- ⚠️ ATTENTION: `Batch` plugin must be added to serializers which have no
600
- `:batch` attributes, but have nested serializers, that have some. For example
601
- when you serialize `User -> Album -> Song` and Song has `:batch` attribute, then
602
- `:batch` plugin must be added to the User serializer also. \
603
- Best way would be to create one parent `AppSerializer < Serega` for all your
604
- serializers and add `:batch` plugin only to this parent `AppSerializer`
627
+ However, global `id_method` option can be overwritten via `config.batch.id_method=`
628
+ method or in specific attributes with `id_method` option.
605
629
 
606
630
  ```ruby
607
- class AppSerializer < Serega
608
- plugin :batch, auto_hide: true, default_key: :id
631
+ class SomeSerializer
632
+ plugin :batch, id_method: :id # global id_method is `:id`
609
633
  end
610
634
 
611
- class PostSerializer < AppSerializer
612
- attribute :comments_count,
613
- batch: {
614
- loader: CommentsCountBatchLoader, # callable(keys, context, plan_point)
615
- key: :id, # can be skipped (as :id value is same as configured :default_key)
616
- default: 0
617
- }
635
+ class UserSerializer < AppSerializer
636
+ # :user_id will be used as default `id_method` for all batch attributes
637
+ config.batch.id_method = :user_id
618
638
 
619
- # Define batch loader via Symbol, later we should define this loader via
620
- # `config.batch.define(:posts_comments_counter) { ... }`
621
- #
622
- # Loader will receive array of ids, as `default_key: :id` plugin option was specified.
623
- # Default value for not found counters is nil, as `:default` option not defined
639
+ # id_method is :user_id
624
640
  attribute :comments_count,
625
- batch: { loader: :posts_comments_counter }
641
+ batch: { loader: CommentsCountBatchLoader }
626
642
 
627
- # Define batch loader with serializer
628
- attribute :comments,
629
- serializer: CommentSerializer,
630
- batch: {loader: :posts_comments, default: []}
631
643
 
632
- # Resulted block must return hash like { key => value(s) }
633
- config.batch.define(:posts_comments_counter) do |keys|
634
- Comment.group(:post_id).where(post_id: keys).count
635
- end
644
+ # id_method is :user_id
645
+ attribute :company,
646
+ batch: { loader: UserCompanyBatchLoader }, serializer: CompanySerializer
636
647
 
637
- # We can return objects that will be automatically serialized if attribute
638
- # defined with :serializer
639
- # Parameter `context` can be used when loading batch
640
- # Parameter `point` can be used to find nested attributes to serialize
641
- config.batch.define(:posts_comments) do |keys, context, point|
642
- # point.child_plan - if you need to manually check all nested attributes
643
- # point.preloads - nested preloads (works with :preloads plugin only)
644
-
645
- Comment
646
- .preload(point.preloads) # Skip if :activerecord_preloads plugin used
647
- .where(post_id: keys)
648
- .where(is_spam: false)
649
- .group_by(&:post_id)
650
- end
648
+ # id_method is :uuid
649
+ attribute :points_amount,
650
+ batch: { loader: PointsBatchLoader, id_method: :uuid }
651
+ end
652
+ ```
653
+
654
+ #### Option :default
655
+
656
+ The default value for attributes without found value can be specified via
657
+ `:default` option. By default attributes without found value will be
658
+ serialized as `nil`. Attribute marked as `many: true` will be
659
+ serialized as empty array `[]`
660
+
661
+ ```ruby
662
+ class UserSerializer < AppSerializer
663
+ # Missing values become empty arrays, as `many: true` option specified
664
+ attribute :companies,
665
+ batch: {loader: proc {}},
666
+ serializer: CompanySerializer,
667
+ many: true
668
+
669
+ # Missing values become `0` as specified directly
670
+ attribute :points_amount,
671
+ batch: { loader: proc {}, default: 0 }
672
+ end
673
+ ```
674
+
675
+ Batch attributes can be marked as hidden by default if plugin specified with
676
+ `auto_hide` option. Also `auto_hide` option can be changed with
677
+ `config.batch.auto_hide=` method.
678
+
679
+ Look at [select serialized fields](#selecting-fields) for more information
680
+ about hiding/showing attributes.
681
+
682
+ ```ruby
683
+ class AppSerializer
684
+ plugin :batch, auto_hide: true
685
+ end
686
+
687
+ class UserSerializer < AppSerializer
688
+ config.batch.auto_hide = false
651
689
  end
652
690
  ```
653
691
 
692
+ ---
693
+ ⚠️ ATTENTION: `Batch` plugin must be added to all serializers that have
694
+ `:batch` attributes inside nested serializers. For example when you serialize
695
+ `User -> Album -> Song` and Song has `batch` attribute, then
696
+ `batch` plugin must be added to the User serializer also.
697
+
698
+ Best way would be to create one parent `AppSerializer < Serega` serializer
699
+ and add `:batch` plugin once to this parent serializer.
700
+
654
701
  ### Plugin :root
655
702
 
656
703
  Allows to add root key to your serialized data
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.17.0
1
+ 0.18.0
@@ -29,7 +29,7 @@ class Serega
29
29
  #
30
30
  # @param object [Object] Serialized object
31
31
  #
32
- # @return [Hash, Array<Hash>] Serialized object(s)
32
+ # @return [Hash, Array<Hash>, nil] Serialized object(s)
33
33
  def serialize(object)
34
34
  return if object.nil?
35
35
 
@@ -5,62 +5,17 @@ class Serega
5
5
  #
6
6
  # Plugin `:batch`
7
7
  #
8
- # Adds ability to load nested attributes values in batches.
8
+ # Must be used to omit N+1 when loading attributes values.
9
9
  #
10
- # It can be used to find value for attributes in optimal way:
11
- # - load associations for multiple objects
12
- # - load counters for multiple objects
13
- # - make any heavy calculations for multiple objects only once
10
+ # @example Quick example
14
11
  #
15
- # After including plugin, attributes gain new `:batch` option.
16
- #
17
- # `:batch` option must be a hash with this keys:
18
- # - `key` (required) [Symbol, Proc, callable] - Defines current object identifier.
19
- # Later `loader` will accept array of `keys` to find `values`.
20
- # - `loader` (required) [Symbol, Proc, callable] - Defines how to fetch values for
21
- # batch of keys. Receives 3 parameters: keys, context, plan_point.
22
- # - `default` (optional) - Default value for attribute.
23
- # By default it is `nil` or `[]` when attribute has option `many: true`
24
- #
25
- # If `:loader` was defined using name (as Symbol) then batch loader must be
26
- # defined in serializer config: `config.batch.define(:loader_name) { ... }` method.
27
- #
28
- # *Result of this `:loader` callable must be a **Hash** where*:
29
- # - keys - provided keys
30
- # - values - values for according keys
31
- #
32
- # `Batch` plugin can be defined with two specific attributes:
33
- # - `auto_hide: true` - Marks attributes with defined :batch as hidden, so it
34
- # will not be serialized by default
35
- # - `default_key: :id` - Set default object key (in this case :id) that will be used for all attributes with :batch option specified.
36
- #
37
- # This options (`auto_hide`, `default_key`) also can be set as config options in
38
- # any nested serializer.
39
- #
40
- # @example
41
- # class PostSerializer < Serega
42
- # plugin :batch, auto_hide: true, default_key: :id
43
- #
44
- # # Define batch loader via callable class, it must accept three args (keys, context, plan_point)
45
- # attribute :comments_count, batch: { loader: PostCommentsCountBatchLoader, default: 0}
46
- #
47
- # # Define batch loader via Symbol, later we should define this loader via config.batch.define(:posts_comments_counter) { ... }
48
- # attribute :comments_count, batch: { loader: :posts_comments_counter, default: 0}
49
- #
50
- # # Define batch loader with serializer
51
- # attribute :comments, serializer: CommentSerializer, batch: { loader: :posts_comments, default: []}
52
- #
53
- # # Resulted block must return hash like { key => value(s) }
54
- # config.batch.define(:posts_comments_counter) do |keys|
55
- # Comment.group(:post_id).where(post_id: keys).count
56
- # end
12
+ # class AppSerializer
13
+ # plugin :batch, id_method: :id
14
+ # end
57
15
  #
58
- # # We can return objects that will be automatically serialized if attribute defined with :serializer
59
- # # Parameter `context` can be used when loading batch
60
- # # Parameter `plan_point` can be used to find nested attributes that will be serialized (`plan_point.preloads`)
61
- # config.batch.define(:posts_comments) do |keys, context, plan_point|
62
- # Comment.where(post_id: keys).where(is_spam: false).group_by(&:post_id)
63
- # end
16
+ # class UserSerializer < AppSerializer
17
+ # attribute :comments_count, batch: { loader: CommentsCountBatchLoader, default: 0 }
18
+ # attribute :company, serializer: CompanySerializer, batch: { loader: UserCompanyBatchLoader }
64
19
  # end
65
20
  #
66
21
  module Batch
@@ -88,7 +43,7 @@ class Serega
88
43
  require_relative "lib/modules/config"
89
44
  require_relative "lib/modules/object_serializer"
90
45
  require_relative "lib/modules/plan_point"
91
- require_relative "lib/validations/check_batch_opt_key"
46
+ require_relative "lib/validations/check_batch_opt_id_method"
92
47
  require_relative "lib/validations/check_batch_opt_loader"
93
48
  require_relative "lib/validations/check_opt_batch"
94
49
 
@@ -138,9 +93,9 @@ class Serega
138
93
 
139
94
  config = serializer_class.config
140
95
  config.attribute_keys << :batch
141
- config.opts[:batch] = {loaders: {}, default_key: nil, auto_hide: false}
96
+ config.opts[:batch] = {loaders: {}, id_method: nil, auto_hide: false}
142
97
  config.batch.auto_hide = opts[:auto_hide] if opts.key?(:auto_hide)
143
- config.batch.default_key = opts[:default_key] if opts.key?(:default_key)
98
+ config.batch.id_method = opts[:id_method] if opts.key?(:id_method)
144
99
  end
145
100
 
146
101
  #
@@ -17,8 +17,8 @@ class Serega
17
17
  # Defines batch loader
18
18
  #
19
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/
20
+ # @param block [Proc] Block that can accept 3 parameters - ids, context, plan_point
21
+ # and returns hash with ids as keys and values are batch loaded objects
22
22
  #
23
23
  # @return [void]
24
24
  #
@@ -32,7 +32,7 @@ class Serega
32
32
  params_count = SeregaUtils::ParamsCount.call(callable, max_count: 3)
33
33
 
34
34
  if params_count > 3
35
- raise SeregaError, "Batch loader can have maximum 3 parameters (keys, context, plan)"
35
+ raise SeregaError, "Batch loader can have maximum 3 parameters (ids, context, plan)"
36
36
  end
37
37
 
38
38
  loaders[loader_name] = callable
@@ -44,16 +44,6 @@ class Serega
44
44
  opts[:loaders]
45
45
  end
46
46
 
47
- #
48
- # Finds previously defined batch loader by name
49
- #
50
- # @param loader_name [Symbol]
51
- #
52
- # @return [Proc] batch loader block
53
- def fetch_loader(loader_name)
54
- loaders[loader_name] || (raise SeregaError, "Batch loader with name `#{loader_name.inspect}` was not defined. Define example: config.batch.define(:#{loader_name}) { |keys| ... }")
55
- end
56
-
57
47
  # Shows option to auto hide attributes with :batch specified
58
48
  # @return [Boolean, nil] option value
59
49
  def auto_hide
@@ -67,17 +57,19 @@ class Serega
67
57
  opts[:auto_hide] = value
68
58
  end
69
59
 
70
- # Shows default key for :batch option
71
- # @return [Symbol, nil] default key for :batch option
72
- def default_key
73
- opts[:default_key]
60
+ # Shows method name or callable object needed to get object identifier for batch load
61
+ # @return [Symbol, #call, nil] Default method name or callable object to get identifier
62
+ def id_method
63
+ opts[:id_method]
74
64
  end
75
65
 
76
- # @param value [Symbol] New :default_key option value
66
+ # Sets new identifier method name or callable value needed for batch loading
67
+ #
68
+ # @param value [Symbol, #call] New :id_method value
77
69
  # @return [Boolean] New option value
78
- def default_key=(value)
79
- raise SeregaError, "Must be a Symbol, #{value.inspect} provided" unless value.is_a?(Symbol)
80
- opts[:default_key] = value
70
+ def id_method=(value)
71
+ CheckBatchOptIdMethod.call(value)
72
+ opts[:id_method] = value
81
73
  end
82
74
  end
83
75
  end
@@ -44,27 +44,27 @@ class Serega
44
44
 
45
45
  loader = prepare_batch_loader(batch[:loader])
46
46
 
47
- key = batch[:key] || self.class.serializer_class.config.batch.default_key
48
- key = prepare_batch_key(key)
47
+ id_method = batch[:id_method] || self.class.serializer_class.config.batch.id_method
48
+ id_method = prepare_batch_id_method(id_method)
49
49
 
50
50
  default = batch.fetch(:default) { many ? FROZEN_EMPTY_ARRAY : nil }
51
51
 
52
- {loader: loader, key: key, default: default}
52
+ {loader: loader, id_method: id_method, default: default}
53
53
  end
54
54
 
55
- def prepare_batch_key(key)
56
- return proc { |object| object.public_send(key) } if key.is_a?(Symbol)
55
+ def prepare_batch_id_method(id_method)
56
+ return proc { |object| object.public_send(id_method) } if id_method.is_a?(Symbol)
57
57
 
58
- params_count = SeregaUtils::ParamsCount.call(key, max_count: 2)
58
+ params_count = SeregaUtils::ParamsCount.call(id_method, max_count: 2)
59
59
  case params_count
60
- when 0 then proc { key.call }
61
- when 1 then proc { |object| key.call(object) }
62
- else key
60
+ when 0 then proc { id_method.call }
61
+ when 1 then proc { |object| id_method.call(object) }
62
+ else id_method
63
63
  end
64
64
  end
65
65
 
66
66
  def prepare_batch_loader(loader)
67
- return loader if loader.is_a?(Symbol)
67
+ loader = self.class.serializer_class.config.batch.loaders.fetch(loader) if loader.is_a?(Symbol)
68
68
 
69
69
  params_count = SeregaUtils::ParamsCount.call(loader, max_count: 3)
70
70
  case params_count
@@ -19,8 +19,8 @@ class Serega
19
19
  end
20
20
 
21
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)
22
+ id = batch[:id_method].call(object, context)
23
+ batch_loader(point).remember(id, container)
24
24
  container[point.name] = nil # Reserve attribute place in resulted hash. We will set correct value later
25
25
  end
26
26
 
@@ -13,25 +13,8 @@ class Serega
13
13
  # Returns attribute :batch option with prepared loader
14
14
  # @return [Hash] attribute :batch option
15
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
16
+ def batch
17
+ attribute.batch
35
18
  end
36
19
  end
37
20
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Serega
4
+ module SeregaPlugins
5
+ module Batch
6
+ #
7
+ # Validator for option :id_method in attribute :batch option
8
+ #
9
+ class CheckBatchOptIdMethod
10
+ class << self
11
+ #
12
+ # Checks option :id_method of attribute :batch option
13
+ #
14
+ # @param id [nil, #call] Attribute :batch option :id_method
15
+ #
16
+ # @raise [SeregaError] validation error
17
+ #
18
+ # @return [void]
19
+ #
20
+ def call(id)
21
+ return if id.is_a?(Symbol)
22
+
23
+ raise SeregaError, must_be_callable unless id.respond_to?(:call)
24
+
25
+ SeregaValidations::Utils::CheckExtraKeywordArg.call(id, "batch option :id_method")
26
+ params_count = SeregaUtils::ParamsCount.call(id, max_count: 2)
27
+ raise SeregaError, params_count_error if params_count > 2
28
+ end
29
+
30
+ private
31
+
32
+ def params_count_error
33
+ "Invalid :batch option :id_method. It can accept maximum 2 parameters (object, context)"
34
+ end
35
+
36
+ def must_be_callable
37
+ "Invalid :batch option :id_method. It must be a Symbol, a Proc or respond to #call"
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -17,9 +17,27 @@ class Serega
17
17
  #
18
18
  # @return [void]
19
19
  #
20
- def call(loader)
21
- return if loader.is_a?(Symbol)
20
+ def call(loader, serializer_class)
21
+ if loader.is_a?(Symbol)
22
+ check_symbol(loader, serializer_class)
23
+ else
24
+ check_callable(loader)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def check_symbol(loader_name, serializer_class)
31
+ defined_loaders = serializer_class.config.batch.loaders
32
+ return if defined_loaders[loader_name]
22
33
 
34
+ raise SeregaError, <<~ERR.strip
35
+ Please define loader before adding it to attribute.
36
+ Example: `config.batch.define(:#{loader_name}) { |ids| ... }`
37
+ ERR
38
+ end
39
+
40
+ def check_callable(loader)
23
41
  raise SeregaError, must_be_callable unless loader.respond_to?(:call)
24
42
 
25
43
  SeregaValidations::Utils::CheckExtraKeywordArg.call(loader, ":batch option :loader")
@@ -27,10 +45,8 @@ class Serega
27
45
  raise SeregaError, params_count_error if params_count > 3
28
46
  end
29
47
 
30
- private
31
-
32
48
  def params_count_error
33
- "Invalid :batch option :loader. It can accept maximum 3 parameters (keys, context, plan)"
49
+ "Invalid :batch option :loader. It can accept maximum 3 parameters (ids, context, plan)"
34
50
  end
35
51
 
36
52
  def must_be_callable
@@ -23,30 +23,29 @@ class Serega
23
23
  SeregaValidations::Utils::CheckOptIsHash.call(opts, :batch)
24
24
 
25
25
  batch = opts[:batch]
26
- SeregaValidations::Utils::CheckAllowedKeys.call(batch, %i[key loader default], :batch)
27
-
28
- check_batch_opt_key(batch, serializer_class)
29
- check_batch_opt_loader(batch)
26
+ SeregaValidations::Utils::CheckAllowedKeys.call(batch, %i[id_method loader default], :batch)
30
27
 
28
+ check_batch_opt_id_method(batch, serializer_class)
29
+ check_batch_opt_loader(batch, serializer_class)
31
30
  check_usage_with_other_params(opts, block)
32
31
  end
33
32
 
34
33
  private
35
34
 
36
- def check_batch_opt_key(batch, serializer_class)
37
- return if !batch.key?(:key) && serializer_class.config.batch.default_key
35
+ def check_batch_opt_id_method(batch, serializer_class)
36
+ return if !batch.key?(:id_method) && serializer_class.config.batch.id_method
38
37
 
39
- key = batch[:key]
40
- raise SeregaError, "Option :key must present inside :batch option" unless key
38
+ id_method = batch[:id_method]
39
+ raise SeregaError, "Option :id_method must present inside :batch option" unless id_method
41
40
 
42
- CheckBatchOptKey.call(key)
41
+ CheckBatchOptIdMethod.call(id_method)
43
42
  end
44
43
 
45
- def check_batch_opt_loader(batch)
44
+ def check_batch_opt_loader(batch, serializer_class)
46
45
  loader = batch[:loader]
47
46
  raise SeregaError, "Option :loader must present inside :batch option" unless loader
48
47
 
49
- CheckBatchOptLoader.call(loader)
48
+ CheckBatchOptLoader.call(loader, serializer_class)
50
49
  end
51
50
 
52
51
  def check_usage_with_other_params(opts, block)
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.17.0
4
+ version: 0.18.0
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-11-03 00:00:00.000000000 Z
11
+ date: 2023-11-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  JSON Serializer
@@ -55,7 +55,7 @@ files:
55
55
  - lib/serega/plugins/batch/lib/plugins_extensions/activerecord_preloads.rb
56
56
  - lib/serega/plugins/batch/lib/plugins_extensions/formatters.rb
57
57
  - lib/serega/plugins/batch/lib/plugins_extensions/preloads.rb
58
- - lib/serega/plugins/batch/lib/validations/check_batch_opt_key.rb
58
+ - lib/serega/plugins/batch/lib/validations/check_batch_opt_id_method.rb
59
59
  - lib/serega/plugins/batch/lib/validations/check_batch_opt_loader.rb
60
60
  - lib/serega/plugins/batch/lib/validations/check_opt_batch.rb
61
61
  - lib/serega/plugins/camel_case/camel_case.rb
@@ -140,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
142
  requirements: []
143
- rubygems_version: 3.4.21
143
+ rubygems_version: 3.4.22
144
144
  signing_key:
145
145
  specification_version: 4
146
146
  summary: JSON Serializer
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Serega
4
- module SeregaPlugins
5
- module Batch
6
- #
7
- # Validator for option :key in attribute :batch option
8
- #
9
- class CheckBatchOptKey
10
- class << self
11
- #
12
- # Checks option :key of attribute :batch option
13
- #
14
- # @param key [nil, #call] Attribute :batch option :key
15
- #
16
- # @raise [SeregaError] validation error
17
- #
18
- # @return [void]
19
- #
20
- def call(key)
21
- return if key.is_a?(Symbol)
22
-
23
- raise SeregaError, must_be_callable unless key.respond_to?(:call)
24
-
25
- SeregaValidations::Utils::CheckExtraKeywordArg.call(key, "batch option :key")
26
- params_count = SeregaUtils::ParamsCount.call(key, max_count: 2)
27
- raise SeregaError, params_count_error if params_count > 2
28
- end
29
-
30
- private
31
-
32
- def params_count_error
33
- "Invalid :batch option :key. It can accept maximum 2 parameters (object, context)"
34
- end
35
-
36
- def must_be_callable
37
- "Invalid :batch option :key. It must be a Symbol, a Proc or respond to :call"
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end