serega 0.6.1 → 0.7.0

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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/lib/serega/attribute.rb +2 -2
  4. data/lib/serega/config.rb +23 -1
  5. data/lib/serega/errors.rb +8 -5
  6. data/lib/serega/helpers/serializer_class_helper.rb +5 -0
  7. data/lib/serega/json/adapter.rb +6 -0
  8. data/lib/serega/json/json.rb +20 -0
  9. data/lib/serega/json/oj.rb +20 -0
  10. data/lib/serega/map.rb +17 -0
  11. data/lib/serega/map_point.rb +36 -1
  12. data/lib/serega/object_serializer.rb +17 -4
  13. data/lib/serega/plugins/activerecord_preloads/activerecord_preloads.rb +66 -18
  14. data/lib/serega/plugins/activerecord_preloads/lib/preloader.rb +100 -40
  15. data/lib/serega/plugins/batch/batch.rb +136 -10
  16. data/lib/serega/plugins/batch/lib/loader.rb +33 -1
  17. data/lib/serega/plugins/batch/lib/loaders.rb +15 -2
  18. data/lib/serega/plugins/batch/lib/plugins_extensions.rb +23 -1
  19. data/lib/serega/plugins/batch/lib/validations/check_batch_opt_key.rb +12 -0
  20. data/lib/serega/plugins/batch/lib/validations/check_batch_opt_loader.rb +12 -0
  21. data/lib/serega/plugins/batch/lib/validations/check_opt_batch.rb +12 -0
  22. data/lib/serega/plugins/context_metadata/context_metadata.rb +95 -13
  23. data/lib/serega/plugins/formatters/formatters.rb +94 -8
  24. data/lib/serega/plugins/hide_nil/hide_nil.rb +33 -7
  25. data/lib/serega/plugins/metadata/metadata.rb +108 -35
  26. data/lib/serega/plugins/metadata/validations/check_block.rb +3 -0
  27. data/lib/serega/plugins/metadata/validations/check_opt_hide_empty.rb +4 -1
  28. data/lib/serega/plugins/metadata/validations/check_opt_hide_nil.rb +4 -1
  29. data/lib/serega/plugins/metadata/validations/check_opts.rb +3 -0
  30. data/lib/serega/plugins/metadata/validations/check_path.rb +3 -0
  31. data/lib/serega/plugins/preloads/lib/enum_deep_freeze.rb +10 -1
  32. data/lib/serega/plugins/preloads/lib/format_user_preloads.rb +13 -4
  33. data/lib/serega/plugins/preloads/lib/main_preload_path.rb +16 -3
  34. data/lib/serega/plugins/preloads/lib/preloads_constructor.rb +4 -6
  35. data/lib/serega/plugins/preloads/preloads.rb +145 -12
  36. data/lib/serega/plugins/preloads/validations/check_opt_preload.rb +11 -0
  37. data/lib/serega/plugins/preloads/validations/check_opt_preload_path.rb +12 -0
  38. data/lib/serega/plugins/presenter/presenter.rb +20 -11
  39. data/lib/serega/plugins/root/root.rb +131 -19
  40. data/lib/serega/plugins/string_modifiers/parse_string_modifiers.rb +42 -12
  41. data/lib/serega/plugins/string_modifiers/string_modifiers.rb +14 -0
  42. data/lib/serega/plugins.rb +7 -1
  43. data/lib/serega/utils/enum_deep_dup.rb +5 -0
  44. data/lib/serega/utils/to_hash.rb +21 -3
  45. data/lib/serega/validations/attribute/check_block.rb +7 -2
  46. data/lib/serega/validations/attribute/check_name.rb +6 -0
  47. data/lib/serega/validations/attribute/check_opt_const.rb +12 -9
  48. data/lib/serega/validations/attribute/check_opt_delegate.rb +13 -10
  49. data/lib/serega/validations/attribute/check_opt_hide.rb +3 -0
  50. data/lib/serega/validations/attribute/check_opt_key.rb +12 -9
  51. data/lib/serega/validations/attribute/check_opt_many.rb +3 -0
  52. data/lib/serega/validations/attribute/check_opt_serializer.rb +3 -0
  53. data/lib/serega/validations/attribute/check_opt_value.rb +12 -9
  54. data/lib/serega/validations/check_attribute_params.rb +29 -1
  55. data/lib/serega/validations/check_initiate_params.rb +17 -0
  56. data/lib/serega/validations/check_serialize_params.rb +16 -0
  57. data/lib/serega/validations/initiate/check_modifiers.rb +15 -0
  58. data/lib/serega/validations/utils/check_allowed_keys.rb +14 -0
  59. data/lib/serega/validations/utils/check_opt_is_bool.rb +11 -0
  60. data/lib/serega/validations/utils/check_opt_is_hash.rb +11 -0
  61. data/lib/serega/validations/utils/check_opt_is_string_or_symbol.rb +11 -0
  62. data/lib/serega/version.rb +4 -0
  63. data/lib/serega.rb +83 -24
  64. metadata +2 -3
  65. data/lib/serega/serializer.rb +0 -32
@@ -2,36 +2,109 @@
2
2
 
3
3
  class Serega
4
4
  module SeregaPlugins
5
+ #
6
+ # Plugin :root
7
+ #
8
+ # Allows to add root key to your serialized data
9
+ #
10
+ # Accepts options:
11
+ # - :root - specifies root for all responses
12
+ # - :root_one - specifies root for single object serialization only
13
+ # - :root_many - specifies root for multiple objects serialization only
14
+ #
15
+ # Adds additional config options:
16
+ # - config.root.one
17
+ # - config.root.many
18
+ # - config.root.one=
19
+ # - config.root_many=
20
+ #
21
+ # Default root is `:data`.
22
+ #
23
+ # Root also can be changed per serialization.
24
+ #
25
+ # Also root can be removed for all responses by providing `root: nil`. In this case no root will be added to response, but
26
+ # you still can to add it per serialization
27
+ #
28
+ # @example Define plugin
29
+ # class UserSerializer < Serega
30
+ # plugin :root # default root is :data
31
+ # end
32
+ #
33
+ # class UserSerializer < Serega
34
+ # plugin :root, root: :users
35
+ # end
36
+ #
37
+ # class UserSerializer < Serega
38
+ # plugin :root, root_one: :user, root_many: :people
39
+ # end
40
+ #
41
+ # class UserSerializer < Serega
42
+ # plugin :root, root: nil # no root by default
43
+ # end
44
+ #
45
+ # @example Change root per serialization:
46
+ # class UserSerializer < Serega
47
+ # plugin :root
48
+ # end
49
+ #
50
+ # UserSerializer.to_h(nil) # => {:data=>nil}
51
+ # UserSerializer.to_h(nil, root: :user) # => {:user=>nil}
52
+ # UserSerializer.to_h(nil, root: nil) # => nil
53
+ #
5
54
  module Root
6
55
  # @return [Symbol] Default response root key
7
56
  ROOT_DEFAULT = :data
8
57
 
58
+ # @return [Symbol] Plugin name
9
59
  def self.plugin_name
10
60
  :root
11
61
  end
12
62
 
63
+ #
64
+ # Applies plugin code to specific serializer
65
+ #
66
+ # @param serializer_class [Class<Serega>] Current serializer class
67
+ # @param _opts [Hash] Loaded plugins options
68
+ #
69
+ # @return [void]
70
+ #
13
71
  def self.load_plugin(serializer_class, **_opts)
14
72
  serializer_class.extend(ClassMethods)
73
+ serializer_class.include(InstanceMethods)
15
74
  serializer_class::SeregaConfig.include(ConfigInstanceMethods)
16
- serializer_class::SeregaSerializer.include(SerializerInstanceMethods)
17
75
  end
18
76
 
77
+ #
78
+ # Adds config options and runs other callbacks after plugin was loaded
79
+ #
80
+ # @param serializer_class [Class<Serega>] Current serializer class
81
+ # @param opts [Hash] loaded plugins opts
82
+ #
83
+ # @return [void]
84
+ #
19
85
  def self.after_load_plugin(serializer_class, **opts)
20
86
  config = serializer_class.config
21
- default = opts[:root] || ROOT_DEFAULT
22
- one = (opts[:root_one] || default).to_sym
23
- many = (opts[:root_many] || default).to_sym
24
- config.opts[:root] = {one: one, many: many}
87
+ default = opts.fetch(:root, ROOT_DEFAULT)
88
+ one = opts.fetch(:root_one, default)
89
+ many = opts.fetch(:root_many, default)
90
+ config.opts[:root] = {}
91
+ config.root = {one: one, many: many}
92
+
25
93
  config.serialize_keys << :root
26
94
  end
27
95
 
96
+ #
97
+ # Serega additional/patched class methods
98
+ #
99
+ # @see Serega
100
+ #
28
101
  module ClassMethods
29
102
  #
30
103
  # Configures response root key
31
104
  #
32
- # @param root [String, Symbol] Specifies common root when serializing one or multiple objects
33
- # @param root_one [String, Symbol] Specifies root when serializing one object
34
- # @param root_many [String, Symbol] Specifies root when serializing multiple objects
105
+ # @param root [String, Symbol, nil] Specifies common root when serializing one or multiple objects
106
+ # @param one [String, Symbol, nil] Specifies root when serializing one object
107
+ # @param many [String, Symbol, nil] Specifies root when serializing multiple objects
35
108
  #
36
109
  # @return [Hash] Configured root names
37
110
  #
@@ -39,63 +112,102 @@ class Serega
39
112
  one ||= root
40
113
  many ||= root
41
114
 
42
- one = one.to_sym if one
43
- many = many.to_sym if many
44
-
45
115
  config.root = {one: one, many: many}
46
116
  end
47
117
  end
48
118
 
119
+ # Root config object
49
120
  class RootConfig
50
121
  attr_reader :opts
51
122
 
123
+ #
124
+ # Initializes RootConfig object
125
+ #
126
+ # @param opts [Hash] root options
127
+ # @option opts [Symbol, String, nil] :one root for single-object serialization
128
+ # @option opts [Symbol, String, nil] :many root for many-objects serialization
129
+ #
130
+ # @return [Serega::SeregaPlugins::Root::RootConfig] RootConfig object
131
+ #
52
132
  def initialize(opts)
53
133
  @opts = opts
54
134
  end
55
135
 
136
+ # @return [Symbol, String, nil] defined root for single-object serialization
56
137
  def one
57
138
  opts.fetch(:one)
58
139
  end
59
140
 
141
+ # @return [Symbol, String, nil] defined root for many-objects serialization
60
142
  def many
61
143
  opts.fetch(:many)
62
144
  end
63
145
 
146
+ #
147
+ # Set root for single-object serialization
148
+ #
149
+ # @param value [Symbol, String, nil] root key
150
+ #
151
+ # @return [Symbol, String, nil] root key for single-object serialization
64
152
  def one=(value)
65
153
  opts[:one] = value
66
154
  end
67
155
 
156
+ #
157
+ # Set root for multiple-object serialization
158
+ #
159
+ # @param value [Symbol, String, nil] root key
160
+ #
161
+ # @return [Symbol, String, nil] root key for multiple-object serialization
68
162
  def many=(value)
69
163
  opts[:many] = value
70
164
  end
71
165
  end
72
166
 
167
+ #
168
+ # Serega::SeregaConfig additional/patched class methods
169
+ #
170
+ # @see Serega::SeregaConfig
171
+ #
73
172
  module ConfigInstanceMethods
173
+ # @return [Serega::SeregaPlugins::Root::RootConfig] current root config
74
174
  def root
75
175
  @root ||= RootConfig.new(opts.fetch(:root))
76
176
  end
77
177
 
178
+ # Set root for one-object and many-objects serialization types
179
+ #
180
+ # @param value [Hash]
181
+ # @option value [Symbol, String, nil] :one Root for one-object serialization type
182
+ # @option value [Symbol, String, nil] :many Root for many-objects serialization type
183
+ #
184
+ # @return [void]
78
185
  def root=(value)
79
186
  root.one = value.fetch(:one)
80
187
  root.many = value.fetch(:many)
81
188
  end
82
189
  end
83
190
 
84
- module SerializerInstanceMethods
85
- def serialize(_object)
191
+ #
192
+ # Serega additional/patched instance methods
193
+ #
194
+ # @see Serega
195
+ #
196
+ module InstanceMethods
197
+ private
198
+
199
+ def serialize(object, opts)
86
200
  result = super
87
- root = build_root(result, opts)
201
+ root = build_root(object, opts)
88
202
  result = {root => result} if root
89
203
  result
90
204
  end
91
205
 
92
- private
93
-
94
- def build_root(result, opts)
206
+ def build_root(object, opts)
95
207
  return opts[:root] if opts.key?(:root)
96
208
 
97
- root = self.class.serializer_class.config.root
98
- result.is_a?(Array) ? root.many : root.one
209
+ root = self.class.config.root
210
+ (opts.fetch(:many) { object.is_a?(Enumerable) }) ? root.many : root.one
99
211
  end
100
212
  end
101
213
  end
@@ -2,23 +2,53 @@
2
2
 
3
3
  class Serega
4
4
  module SeregaPlugins
5
+ #
6
+ # Plugin :string_modifiers
7
+ #
8
+ # Allows to specify modifiers as strings.
9
+ #
10
+ # Serialized attributes must be split with `,` and nested attributes can be defined inside brackets `(`, `)`.
11
+ #
12
+ # @example
13
+ # PostSerializer.plugin :string_modifiers
14
+ # PostSerializer.new(only: "id,user(id,username)").to_h(post)
15
+ # PostSerializer.new(except: "user(username,email)").to_h(post)
16
+ # PostSerializer.new(with: "user(email)").to_h(post)
17
+
18
+ # # Modifiers can still be provided old way with nested hashes or arrays.
19
+ # PostSerializer.new(with: {user: %i[email, username]}).to_h(post)
20
+ #
5
21
  module StringModifiers
22
+ #
23
+ # Modifiers parser
24
+ #
6
25
  class ParseStringModifiers
7
- COMMA = ","
8
- OPEN_BRACKET = "("
9
- CLOSE_BRACKET = ")"
10
-
26
+ #
27
+ # Parses provided fields
28
+ #
29
+ # @param fields [String,Hash,Array,nil]
30
+ #
31
+ # @return [Hash] parsed modifiers in form of nested hash
32
+ #
11
33
  def self.call(fields)
12
34
  return fields unless fields.is_a?(String)
13
35
 
14
36
  new.parse(fields)
15
37
  end
16
38
 
17
- # user => { user: {} }
18
- # user(id) => { user: { id: {} } }
19
- # user(id,name) => { user: { id: {}, name: {} } }
20
- # user,comments => { user: {}, comments: {} }
21
- # user(comments(text)) => { user: { comments: { text: {} } } }
39
+ #
40
+ # Parses string modifiers
41
+ #
42
+ # @param fields [String]
43
+ #
44
+ # @return [Hash] parsed modifiers in form of nested hash
45
+ #
46
+ # @example
47
+ # parse("user") => { user: {} }
48
+ # parse("user(id)") => { user: { id: {} } }
49
+ # parse("user(id,name)") => { user: { id: {}, name: {} } }
50
+ # parse("user,comments") => { user: {}, comments: {} }
51
+ # parse("user(comments(text))") => { user: { comments: { text: {} } } }
22
52
  def parse(fields)
23
53
  res = {}
24
54
  attribute = +""
@@ -26,12 +56,12 @@ class Serega
26
56
 
27
57
  fields.each_char do |char|
28
58
  case char
29
- when COMMA
59
+ when ","
30
60
  add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
31
- when CLOSE_BRACKET
61
+ when ")"
32
62
  add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
33
63
  path_stack&.pop
34
- when OPEN_BRACKET
64
+ when "("
35
65
  name = add_attribute(res, path_stack, attribute, {})
36
66
  (path_stack ||= []).push(name) if name
37
67
  else
@@ -3,15 +3,29 @@
3
3
  class Serega
4
4
  module SeregaPlugins
5
5
  module StringModifiers
6
+ # @return [Symbol] Plugin name
6
7
  def self.plugin_name
7
8
  :string_modifiers
8
9
  end
9
10
 
11
+ #
12
+ # Applies plugin code to specific serializer
13
+ #
14
+ # @param serializer_class [Class<Serega>] Current serializer class
15
+ # @param _opts [Hash] Loaded plugins options
16
+ #
17
+ # @return [void]
18
+ #
10
19
  def self.load_plugin(serializer_class, **_opts)
11
20
  serializer_class.include(InstanceMethods)
12
21
  require_relative "./parse_string_modifiers"
13
22
  end
14
23
 
24
+ #
25
+ # Serega additional/patched instance methods
26
+ #
27
+ # @see Serega
28
+ #
15
29
  module InstanceMethods
16
30
  private
17
31
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Serega
4
- # Module in which all Serega plugins should be stored
4
+ # Plugins are stored here
5
5
  module SeregaPlugins
6
6
  @plugins = {}
7
7
 
@@ -9,8 +9,14 @@ class Serega
9
9
  #
10
10
  # Registers given plugin to be able to load it using symbol name.
11
11
  #
12
+ # @param name [Symbol] Plugin name
13
+ # @param mod [Module] Plugin module
14
+ #
12
15
  # @example Register plugin
13
16
  # Serega::SeregaPlugins.register_plugin(:plugin_name, PluginModule)
17
+ #
18
+ # @return [void]
19
+ #
14
20
  def register_plugin(name, mod)
15
21
  @plugins[name] = mod
16
22
  end
@@ -1,8 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Serega
4
+ #
5
+ # Utilities
6
+ #
4
7
  module SeregaUtils
8
+ #
5
9
  # Duplicates nested hashes and arrays
10
+ #
6
11
  class EnumDeepDup
7
12
  DUP = {
8
13
  Hash => ->(data) { dup_hash_values(data) },
@@ -2,8 +2,28 @@
2
2
 
3
3
  class Serega
4
4
  module SeregaUtils
5
+ #
6
+ # Utility to transform almost anything to Hash
7
+ #
5
8
  class ToHash
6
- module ClassMethods
9
+ class << self
10
+ #
11
+ # Constructs deep hashes from provided data
12
+ #
13
+ # @param value [Array, Hash, String, Symbol, NilClass, FalseClass] Value to transform
14
+ #
15
+ # @example
16
+ # Serega::SeregaUtils::ToHash.(nil) # => {}
17
+ # Serega::SeregaUtils::ToHash.(false) # => {}
18
+ # Serega::SeregaUtils::ToHash.(:foo) # => {:foo=>{}}
19
+ # Serega::SeregaUtils::ToHash.("foo") # => {:foo=>{}}
20
+ # Serega::SeregaUtils::ToHash.(%w[foo bar]) # => {:foo=>{}, :bar=>{}}
21
+ # Serega::SeregaUtils::ToHash.({ foo: nil, bar: false }) # => {:foo=>{}, :bar=>{}}
22
+ # Serega::SeregaUtils::ToHash.({ foo: :bar }) # => {:foo=>{:bar=>{}}}
23
+ # Serega::SeregaUtils::ToHash.({ foo: [:bar] }) # => {:foo=>{:bar=>{}}}
24
+ #
25
+ # @return [Hash] Transformed data
26
+ #
7
27
  def call(value)
8
28
  case value
9
29
  when Array then array_to_hash(value)
@@ -45,8 +65,6 @@ class Serega
45
65
  {value => Serega::FROZEN_EMPTY_HASH}
46
66
  end
47
67
  end
48
-
49
- extend ClassMethods
50
68
  end
51
69
  end
52
70
  end
@@ -2,11 +2,17 @@
2
2
 
3
3
  class Serega
4
4
  module SeregaValidations
5
+ #
6
+ # Attribute parameters validators
7
+ #
5
8
  module Attribute
9
+ #
10
+ # Attribute `block` parameter validator
11
+ #
6
12
  class CheckBlock
7
13
  class << self
8
14
  #
9
- # Checks :value option or a block provided with attribute
15
+ # Checks block parameter provided with attribute.
10
16
  # Must have up to two arguments - object and context.
11
17
  # It should not have any *rest or **key arguments
12
18
  #
@@ -19,7 +25,6 @@ class Serega
19
25
  # @example with two arguments
20
26
  # attribute(:email) { |obj, context| context['is_current'] ? obj.email : nil }
21
27
  #
22
- # @param opts [Proc] Attribute opts, we will check :value option
23
28
  # @param block [Proc] Block that returns serialized attribute value
24
29
  #
25
30
  # @raise [SeregaError] SeregaError that block has invalid arguments
@@ -3,8 +3,14 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `name` parameter validator
8
+ #
6
9
  class CheckName
10
+ # Regexp for valid one-char attribute name
7
11
  FORMAT_ONE_CHAR = /\A[a-zA-Z0-9]\z/
12
+
13
+ # Regexp for valid multi-chars attribute name
8
14
  FORMAT_MANY_CHARS = /\A[a-zA-Z0-9][a-zA-Z0-9_-]*?[a-zA-Z0-9]\z/ # allow '-' and '_' in the middle
9
15
 
10
16
  private_constant :FORMAT_ONE_CHAR, :FORMAT_MANY_CHARS
@@ -3,17 +3,20 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `:const` option validator
8
+ #
6
9
  class CheckOptConst
7
- #
8
- # Checks attribute :const option
9
- #
10
- # @param opts [Hash] Attribute options
11
- #
12
- # @raise [SeregaError] Attribute validation error
13
- #
14
- # @return [void]
15
- #
16
10
  class << self
11
+ #
12
+ # Checks attribute :const option
13
+ #
14
+ # @param opts [Hash] Attribute options
15
+ #
16
+ # @raise [SeregaError] Attribute validation error
17
+ #
18
+ # @return [void]
19
+ #
17
20
  def call(opts, block = nil)
18
21
  return unless opts.key?(:const)
19
22
 
@@ -3,18 +3,21 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `:delegate` option validator
8
+ #
6
9
  class CheckOptDelegate
7
- #
8
- # Checks attribute :delegate option
9
- # It must have :to option and can have :optional allow_nil option
10
- #
11
- # @param opts [Hash] Attribute options
12
- #
13
- # @raise [SeregaError] Attribute validation error
14
- #
15
- # @return [void]
16
- #
17
10
  class << self
11
+ #
12
+ # Checks attribute :delegate option
13
+ # It must have :to option and can have :optional allow_nil option
14
+ #
15
+ # @param opts [Hash] Attribute options
16
+ #
17
+ # @raise [SeregaError] Attribute validation error
18
+ #
19
+ # @return [void]
20
+ #
18
21
  def call(opts, block = nil)
19
22
  return unless opts.key?(:delegate)
20
23
 
@@ -3,6 +3,9 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `:hide` option validator
8
+ #
6
9
  class CheckOptHide
7
10
  #
8
11
  # Checks attribute :hide option
@@ -3,17 +3,20 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `:key` option validator
8
+ #
6
9
  class CheckOptKey
7
- #
8
- # Checks attribute :key option
9
- #
10
- # @param opts [Hash] Attribute options
11
- #
12
- # @raise [SeregaError] SeregaError that option has invalid value
13
- #
14
- # @return [void]
15
- #
16
10
  class << self
11
+ #
12
+ # Checks attribute :key option
13
+ #
14
+ # @param opts [Hash] Attribute options
15
+ #
16
+ # @raise [SeregaError] SeregaError that option has invalid value
17
+ #
18
+ # @return [void]
19
+ #
17
20
  def call(opts, block = nil)
18
21
  return unless opts.key?(:key)
19
22
 
@@ -3,6 +3,9 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `:many` option validator
8
+ #
6
9
  class CheckOptMany
7
10
  #
8
11
  # Checks attribute :many option
@@ -3,6 +3,9 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `:serializer` option validator
8
+ #
6
9
  class CheckOptSerializer
7
10
  class << self
8
11
  #
@@ -3,17 +3,20 @@
3
3
  class Serega
4
4
  module SeregaValidations
5
5
  module Attribute
6
+ #
7
+ # Attribute `:value` option validator
8
+ #
6
9
  class CheckOptValue
7
- #
8
- # Checks attribute :value option
9
- #
10
- # @param opts [Hash] Attribute options
11
- #
12
- # @raise [SeregaError] SeregaError that option has invalid value
13
- #
14
- # @return [void]
15
- #
16
10
  class << self
11
+ #
12
+ # Checks attribute :value option
13
+ #
14
+ # @param opts [Hash] Attribute options
15
+ #
16
+ # @raise [SeregaError] SeregaError that option has invalid value
17
+ #
18
+ # @return [void]
19
+ #
17
20
  def call(opts, block = nil)
18
21
  return unless opts.key?(:value)
19
22
 
@@ -1,17 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Serega
4
+ #
5
+ # Validations
6
+ #
4
7
  module SeregaValidations
8
+ #
9
+ # Validations for attribute params
10
+ #
5
11
  class CheckAttributeParams
12
+ #
13
+ # Validations for attribute params instance methods
14
+ #
6
15
  module InstanceMethods
7
- attr_reader :name, :opts, :block
16
+ # @return [Symbol] validated attribute name
17
+ attr_reader :name
8
18
 
19
+ # @return [Hash] validated attribute options
20
+ attr_reader :opts
21
+
22
+ # @return [nil, Proc] validated attribute block
23
+ attr_reader :block
24
+
25
+ #
26
+ # Initializes attribute params validator
27
+ #
28
+ # @param name [Symbol] attribute name
29
+ # @param opts [Hash] attribute options
30
+ # @param block [nil, Proc] block provided to attribute
31
+ #
32
+ # @return [void]
33
+ #
9
34
  def initialize(name, opts, block)
10
35
  @name = name
11
36
  @opts = opts
12
37
  @block = block
13
38
  end
14
39
 
40
+ #
41
+ # Validates attribute params
42
+ #
15
43
  def validate
16
44
  check_name
17
45
  check_opts