domainic-attributer 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +11 -0
  3. data/CHANGELOG.md +32 -1
  4. data/README.md +42 -355
  5. data/docs/USAGE.md +723 -0
  6. data/lib/domainic/attributer/attribute/callback.rb +21 -9
  7. data/lib/domainic/attributer/attribute/coercer.rb +28 -13
  8. data/lib/domainic/attributer/attribute/mixin/belongs_to_attribute.rb +16 -13
  9. data/lib/domainic/attributer/attribute/signature.rb +43 -32
  10. data/lib/domainic/attributer/attribute/validator.rb +46 -16
  11. data/lib/domainic/attributer/attribute.rb +28 -18
  12. data/lib/domainic/attributer/attribute_set.rb +21 -19
  13. data/lib/domainic/attributer/class_methods.rb +136 -83
  14. data/lib/domainic/attributer/dsl/attribute_builder/option_parser.rb +64 -22
  15. data/lib/domainic/attributer/dsl/attribute_builder.rb +515 -26
  16. data/lib/domainic/attributer/dsl/initializer.rb +23 -18
  17. data/lib/domainic/attributer/dsl/method_injector.rb +16 -14
  18. data/lib/domainic/attributer/errors/aggregate_error.rb +36 -0
  19. data/lib/domainic/attributer/errors/callback_execution_error.rb +30 -0
  20. data/lib/domainic/attributer/errors/coercion_execution_error.rb +37 -0
  21. data/lib/domainic/attributer/errors/error.rb +19 -0
  22. data/lib/domainic/attributer/errors/validation_execution_error.rb +30 -0
  23. data/lib/domainic/attributer/instance_methods.rb +11 -8
  24. data/lib/domainic/attributer/undefined.rb +9 -7
  25. data/lib/domainic/attributer.rb +88 -27
  26. data/sig/domainic/attributer/attribute/callback.rbs +10 -7
  27. data/sig/domainic/attributer/attribute/coercer.rbs +14 -11
  28. data/sig/domainic/attributer/attribute/mixin/belongs_to_attribute.rbs +14 -12
  29. data/sig/domainic/attributer/attribute/signature.rbs +43 -32
  30. data/sig/domainic/attributer/attribute/validator.rbs +28 -13
  31. data/sig/domainic/attributer/attribute.rbs +27 -17
  32. data/sig/domainic/attributer/attribute_set.rbs +21 -19
  33. data/sig/domainic/attributer/class_methods.rbs +133 -80
  34. data/sig/domainic/attributer/dsl/attribute_builder/option_parser.rbs +62 -22
  35. data/sig/domainic/attributer/dsl/attribute_builder.rbs +515 -26
  36. data/sig/domainic/attributer/dsl/initializer.rbs +21 -19
  37. data/sig/domainic/attributer/dsl/method_injector.rbs +16 -14
  38. data/sig/domainic/attributer/errors/aggregate_error.rbs +28 -0
  39. data/sig/domainic/attributer/errors/callback_execution_error.rbs +23 -0
  40. data/sig/domainic/attributer/errors/coercion_execution_error.rbs +29 -0
  41. data/sig/domainic/attributer/errors/error.rbs +17 -0
  42. data/sig/domainic/attributer/errors/validation_execution_error.rbs +23 -0
  43. data/sig/domainic/attributer/instance_methods.rbs +11 -8
  44. data/sig/domainic/attributer/undefined.rbs +5 -3
  45. data/sig/domainic/attributer.rbs +88 -27
  46. metadata +19 -6
@@ -1,15 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'domainic/attributer/undefined'
4
+
3
5
  module Domainic
4
6
  module Attributer
5
7
  module DSL
6
8
  class AttributeBuilder
7
- # A class responsible for parsing and normalizing attribute options.
9
+ # A class responsible for parsing and normalizing attribute options
8
10
  #
9
11
  # This class handles the conversion of flexible DSL options into a normalized
10
12
  # format for attribute creation. It supports multiple ways of specifying common
11
13
  # options (like visibility, nullability, validation) and consolidates them
12
- # into a consistent internal representation.
14
+ # into a consistent internal representation
15
+ #
16
+ # @!visibility private
17
+ # @api private
13
18
  #
14
19
  # @author {https://aaronmallen.me Aaron Allen}
15
20
  # @since 0.1.0
@@ -105,25 +110,62 @@ module Domainic
105
110
  # @rbs @options: options
106
111
  # @rbs @result: result
107
112
 
108
- # Parse attribute options into a normalized format.
113
+ # Parse attribute options into a normalized format
109
114
  #
110
115
  # @param attribute_name [String, Symbol] the name of the attribute
111
116
  # @param attribute_type [String, Symbol] the type of attribute
112
- # @param options [Hash] the options to parse
117
+ # @param options [Hash{String, Symbol => Object}] the options to parse. See {#initialize} for details.
113
118
  #
114
- # @return [Hash] normalized options suitable for attribute creation
119
+ # @return [Hash{Symbol => Object}] normalized options suitable for attribute creation
115
120
  # @rbs (String | Symbol attribute_name, String | Symbol attribute_type, options options) -> void
116
121
  def self.parse!(attribute_name, attribute_type, options)
117
122
  new(attribute_name, attribute_type, options).parse!
118
123
  end
119
124
 
120
- # Initialize a new OptionParser.
125
+ # Initialize a new OptionParser instance
121
126
  #
122
127
  # @param attribute_name [String, Symbol] the name of the attribute
123
128
  # @param attribute_type [String, Symbol] the type of attribute
124
- # @param options [Hash] the options to parse
129
+ # @param options [Hash{String, Symbol => Object}] the options to parse
125
130
  #
126
- # @return [void]
131
+ # @option options [Array<Proc>, Proc] :callbacks handlers for attribute change events (priority over
132
+ # :callback, :on_change)
133
+ # @option options [Array<Proc>, Proc] :callback alias for :callbacks
134
+ # @option options [Array<Proc, Symbol>, Proc, Symbol] :coerce handlers for value coercion (priority over
135
+ # :coercers, :coerce_with)
136
+ # @option options [Array<Proc, Symbol>, Proc, Symbol] :coercers alias for :coerce
137
+ # @option options [Array<Proc, Symbol>, Proc, Symbol] :coerce_with alias for :coerce
138
+ # @option options [Object] :default the default value (priority over :default_generator, :default_value)
139
+ # @option options [Object] :default_generator alias for :default
140
+ # @option options [Object] :default_value alias for :default
141
+ # @option options [String] :desc short description (overridden by :description)
142
+ # @option options [String] :description description text
143
+ # @option options [Boolean] :non_nil require non-nil values (priority over :non_null, :non_nullable, :not_nil,
144
+ # :not_nilable, :not_null, :not_nullable)
145
+ # @option options [Boolean] :non_null alias for :non_nil
146
+ # @option options [Boolean] :non_nullable alias for :non_nil
147
+ # @option options [Boolean] :not_nil alias for :non_nil
148
+ # @option options [Boolean] :not_nilable alias for :non_nil
149
+ # @option options [Boolean] :not_null alias for :non_nil
150
+ # @option options [Boolean] :not_nullable alias for :non_nil
151
+ # @option options [Boolean] :null inverse of :non_nil
152
+ # @option options [Array<Proc>, Proc] :on_change alias for :callbacks
153
+ # @option options [Boolean] :optional whether attribute is optional (overridden by :required)
154
+ # @option options [Integer] :position specify order position
155
+ # @option options [Symbol] :read read visibility (:public, :protected, :private) (priority over :read_access,
156
+ # :reader)
157
+ # @option options [Symbol] :read_access alias for :read
158
+ # @option options [Symbol] :reader alias for :read
159
+ # @option options [Boolean] :required whether attribute is required
160
+ # @option options [Array<Object>, Object] :validate validators for the attribute (priority over
161
+ # :validate_with, :validators)
162
+ # @option options [Array<Object>, Object] :validate_with alias for :validate
163
+ # @option options [Array<Object>, Object] :validators alias for :validate
164
+ # @option options [Symbol] :write_access write visibility (:public, :protected, :private) (priority over
165
+ # :writer)
166
+ # @option options [Symbol] :writer alias for :write_access
167
+ #
168
+ # @return [OptionParser] the new OptionParser instance
127
169
  # @rbs (String | Symbol attribute_name, String | Symbol attribute_type, options options) -> void
128
170
  def initialize(attribute_name, attribute_type, options)
129
171
  @options = options.transform_keys(&:to_sym)
@@ -133,10 +175,10 @@ module Domainic
133
175
  @result[:position] = @options[:position] if @options.key?(:position)
134
176
  end
135
177
 
136
- # Parse the options into a normalized format.
178
+ # Parse the options into a normalized format
137
179
  #
138
- # @return [Hash] normalized options suitable for attribute creation
139
- # @rbs () -> result
180
+ # @return [Hash{Symbol => Object}] normalized options suitable for attribute creation
181
+ # @rbs () -> result
140
182
  def parse!
141
183
  parse_options!
142
184
  @result
@@ -144,11 +186,11 @@ module Domainic
144
186
 
145
187
  private
146
188
 
147
- # Find the last set value among multiple option keys.
189
+ # Find the last set value among multiple option keys
148
190
  #
149
191
  # @param keys [Array<Symbol>] the keys to check
150
192
  #
151
- # @return [Object] the last set value or Undefined
193
+ # @return [Object] the last set value or {Undefined}
152
194
  # @rbs (Array[Symbol]) -> untyped
153
195
  def find_last_option(keys)
154
196
  keys.reverse_each do |key|
@@ -158,7 +200,7 @@ module Domainic
158
200
  Undefined
159
201
  end
160
202
 
161
- # Parse accessor (reader/writer) visibility options.
203
+ # Parse accessor (reader/writer) visibility options
162
204
  #
163
205
  # @return [void]
164
206
  # @rbs () -> void
@@ -167,7 +209,7 @@ module Domainic
167
209
  @result[:write] = find_last_option(ACCESSOR_WRITER_KEYS)
168
210
  end
169
211
 
170
- # Parse callback handler options.
212
+ # Parse callback handler options
171
213
  #
172
214
  # @return [void]
173
215
  # @rbs () -> void
@@ -177,7 +219,7 @@ module Domainic
177
219
  end
178
220
  end
179
221
 
180
- # Parse coercion handler options.
222
+ # Parse coercion handler options
181
223
  #
182
224
  # @return [void]
183
225
  # @rbs () -> void
@@ -187,7 +229,7 @@ module Domainic
187
229
  end
188
230
  end
189
231
 
190
- # Parse default value options.
232
+ # Parse default value options
191
233
  #
192
234
  # @return [void]
193
235
  # @rbs () -> void
@@ -195,7 +237,7 @@ module Domainic
195
237
  @result[:default] = find_last_option(DEFAULT_KEYS)
196
238
  end
197
239
 
198
- # Parse description options.
240
+ # Parse description options
199
241
  #
200
242
  # @return [void]
201
243
  # @rbs () -> void
@@ -203,7 +245,7 @@ module Domainic
203
245
  @result[:description] = find_last_option(DESCRIPTION_KEYS)
204
246
  end
205
247
 
206
- # Parse nilability options.
248
+ # Parse nilability options
207
249
  #
208
250
  # @return [void]
209
251
  # @rbs () -> void
@@ -213,7 +255,7 @@ module Domainic
213
255
  @result[:nilable] = !(NON_NILABLE_KEYS.any? { |k| @options[k] == true } || @options[:null] == false)
214
256
  end
215
257
 
216
- # Parse all option types.
258
+ # Parse all option types
217
259
  #
218
260
  # @return [void]
219
261
  # @rbs () -> void
@@ -221,7 +263,7 @@ module Domainic
221
263
  private_methods.grep(/\Aparse_.*_options!\z/).each { |method| send(method) }
222
264
  end
223
265
 
224
- # Parse required/optional options.
266
+ # Parse required/optional options
225
267
  #
226
268
  # @return [void]
227
269
  # @rbs () -> void
@@ -231,7 +273,7 @@ module Domainic
231
273
  @result[:required] = @options[:optional] == false || @options[:required] == true
232
274
  end
233
275
 
234
- # Parse validator options.
276
+ # Parse validator options
235
277
  #
236
278
  # @return [void]
237
279
  # @rbs () -> void