duck_record 0.0.9.1 → 0.0.10

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +13 -13
  3. data/lib/duck_record/associations/association.rb +15 -15
  4. data/lib/duck_record/associations/collection_association.rb +8 -8
  5. data/lib/duck_record/associations/collection_proxy.rb +1 -1
  6. data/lib/duck_record/associations/has_many_association.rb +0 -1
  7. data/lib/duck_record/associations/singular_association.rb +6 -6
  8. data/lib/duck_record/attribute/user_provided_default.rb +2 -2
  9. data/lib/duck_record/attribute.rb +70 -70
  10. data/lib/duck_record/attribute_assignment.rb +74 -74
  11. data/lib/duck_record/attribute_methods/before_type_cast.rb +9 -9
  12. data/lib/duck_record/attribute_methods/dirty.rb +29 -29
  13. data/lib/duck_record/attribute_methods/read.rb +27 -27
  14. data/lib/duck_record/attribute_methods/write.rb +20 -20
  15. data/lib/duck_record/attribute_methods.rb +8 -8
  16. data/lib/duck_record/attribute_mutation_tracker.rb +4 -4
  17. data/lib/duck_record/attribute_set/yaml_encoder.rb +5 -5
  18. data/lib/duck_record/attribute_set.rb +5 -5
  19. data/lib/duck_record/attributes.rb +14 -14
  20. data/lib/duck_record/base.rb +18 -18
  21. data/lib/duck_record/callbacks.rb +1 -1
  22. data/lib/duck_record/core.rb +35 -35
  23. data/lib/duck_record/inheritance.rb +25 -25
  24. data/lib/duck_record/model_schema.rb +10 -11
  25. data/lib/duck_record/nested_attributes.rb +149 -149
  26. data/lib/duck_record/reflection.rb +14 -14
  27. data/lib/duck_record/type/array.rb +6 -6
  28. data/lib/duck_record/type/registry.rb +21 -21
  29. data/lib/duck_record/type/serialized.rb +8 -8
  30. data/lib/duck_record/type/time.rb +0 -1
  31. data/lib/duck_record/type/unsigned_integer.rb +6 -6
  32. data/lib/duck_record/type.rb +16 -14
  33. data/lib/duck_record/validations/uniqueness_on_real_record.rb +45 -45
  34. data/lib/duck_record/validations.rb +6 -6
  35. data/lib/duck_record/version.rb +1 -1
  36. data/lib/duck_record.rb +7 -7
  37. metadata +7 -6
@@ -317,7 +317,7 @@ module DuckRecord
317
317
  # # creates avatar_attributes= and posts_attributes=
318
318
  # accepts_nested_attributes_for :avatar, :posts, allow_destroy: true
319
319
  def accepts_nested_attributes_for(*attr_names)
320
- options = {allow_destroy: false}
320
+ options = { allow_destroy: false }
321
321
  options.update(attr_names.extract_options!)
322
322
  options.assert_valid_keys(:reject_if, :limit, :allow_destroy)
323
323
  options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
@@ -340,19 +340,19 @@ module DuckRecord
340
340
 
341
341
  private
342
342
 
343
- # Generates a writer method for this association. Serves as a point for
344
- # accessing the objects in the association. For example, this method
345
- # could generate the following:
346
- #
347
- # def pirate_attributes=(attributes)
348
- # assign_nested_attributes_for_one_to_one_association(:pirate, attributes)
349
- # end
350
- #
351
- # This redirects the attempts to write objects in an association through
352
- # the helper methods defined below. Makes it seem like the nested
353
- # associations are just regular associations.
354
- def generate_association_writer(association_name, type)
355
- generated_association_methods.module_eval <<-eoruby, __FILE__, __LINE__ + 1
343
+ # Generates a writer method for this association. Serves as a point for
344
+ # accessing the objects in the association. For example, this method
345
+ # could generate the following:
346
+ #
347
+ # def pirate_attributes=(attributes)
348
+ # assign_nested_attributes_for_one_to_one_association(:pirate, attributes)
349
+ # end
350
+ #
351
+ # This redirects the attempts to write objects in an association through
352
+ # the helper methods defined below. Makes it seem like the nested
353
+ # associations are just regular associations.
354
+ def generate_association_writer(association_name, type)
355
+ generated_association_methods.module_eval <<-eoruby, __FILE__, __LINE__ + 1
356
356
  if method_defined?(:#{association_name}_attributes=)
357
357
  remove_method(:#{association_name}_attributes=)
358
358
  end
@@ -360,7 +360,7 @@ module DuckRecord
360
360
  assign_nested_attributes_for_#{type}_association(:#{association_name}, attributes)
361
361
  end
362
362
  eoruby
363
- end
363
+ end
364
364
  end
365
365
 
366
366
  # Marks this record to be destroyed as part of the parent's save transaction.
@@ -390,166 +390,166 @@ module DuckRecord
390
390
 
391
391
  private
392
392
 
393
- # Attribute hash keys that should not be assigned as normal attributes.
394
- # These hash keys are nested attributes implementation details.
395
- UNASSIGNABLE_KEYS = %w( _destroy )
396
-
397
- # Assigns the given attributes to the association.
398
- #
399
- # If an associated record does not yet exist, one will be instantiated. If
400
- # an associated record already exists, the method's behavior depends on
401
- # the value of the update_only option. If update_only is +false+ and the
402
- # given attributes include an <tt>:id</tt> that matches the existing record's
403
- # id, then the existing record will be modified. If no <tt>:id</tt> is provided
404
- # it will be replaced with a new record. If update_only is +true+ the existing
405
- # record will be modified regardless of whether an <tt>:id</tt> is provided.
406
- #
407
- # If the given attributes include a matching <tt>:id</tt> attribute, or
408
- # update_only is true, and a <tt>:_destroy</tt> key set to a truthy value,
409
- # then the existing record will be marked for destruction.
410
- def assign_nested_attributes_for_one_to_one_association(association_name, attributes)
411
- if attributes.respond_to?(:permitted?)
412
- attributes = attributes.to_h
413
- end
414
- attributes = attributes.with_indifferent_access
415
- existing_record = send(association_name)
393
+ # Attribute hash keys that should not be assigned as normal attributes.
394
+ # These hash keys are nested attributes implementation details.
395
+ UNASSIGNABLE_KEYS = %w( _destroy )
416
396
 
417
- if reject_new_record?(association_name, attributes)
418
- send("#{association_name}=", nil)
419
- else
420
- assignable_attributes = attributes.except(*UNASSIGNABLE_KEYS)
397
+ # Assigns the given attributes to the association.
398
+ #
399
+ # If an associated record does not yet exist, one will be instantiated. If
400
+ # an associated record already exists, the method's behavior depends on
401
+ # the value of the update_only option. If update_only is +false+ and the
402
+ # given attributes include an <tt>:id</tt> that matches the existing record's
403
+ # id, then the existing record will be modified. If no <tt>:id</tt> is provided
404
+ # it will be replaced with a new record. If update_only is +true+ the existing
405
+ # record will be modified regardless of whether an <tt>:id</tt> is provided.
406
+ #
407
+ # If the given attributes include a matching <tt>:id</tt> attribute, or
408
+ # update_only is true, and a <tt>:_destroy</tt> key set to a truthy value,
409
+ # then the existing record will be marked for destruction.
410
+ def assign_nested_attributes_for_one_to_one_association(association_name, attributes)
411
+ if attributes.respond_to?(:permitted?)
412
+ attributes = attributes.to_h
413
+ end
414
+ attributes = attributes.with_indifferent_access
415
+ existing_record = send(association_name)
421
416
 
422
- if existing_record
423
- existing_record.assign_attributes(assignable_attributes)
417
+ if reject_new_record?(association_name, attributes)
418
+ send("#{association_name}=", nil)
424
419
  else
425
- method = "build_#{association_name}"
426
- if respond_to?(method)
427
- send(method, assignable_attributes)
420
+ assignable_attributes = attributes.except(*UNASSIGNABLE_KEYS)
421
+
422
+ if existing_record
423
+ existing_record.assign_attributes(assignable_attributes)
428
424
  else
429
- raise ArgumentError, "Cannot build association `#{association_name}'. Are you trying to build a polymorphic one-to-one association?"
425
+ method = "build_#{association_name}"
426
+ if respond_to?(method)
427
+ send(method, assignable_attributes)
428
+ else
429
+ raise ArgumentError, "Cannot build association `#{association_name}'. Are you trying to build a polymorphic one-to-one association?"
430
+ end
430
431
  end
431
432
  end
432
433
  end
433
- end
434
434
 
435
- # Assigns the given attributes to the collection association.
436
- #
437
- # Hashes with an <tt>:id</tt> value matching an existing associated record
438
- # will update that record. Hashes without an <tt>:id</tt> value will build
439
- # a new record for the association. Hashes with a matching <tt>:id</tt>
440
- # value and a <tt>:_destroy</tt> key set to a truthy value will mark the
441
- # matched record for destruction.
442
- #
443
- # For example:
444
- #
445
- # assign_nested_attributes_for_collection_association(:people, {
446
- # '1' => { id: '1', name: 'Peter' },
447
- # '2' => { name: 'John' },
448
- # '3' => { id: '2', _destroy: true }
449
- # })
450
- #
451
- # Will update the name of the Person with ID 1, build a new associated
452
- # person with the name 'John', and mark the associated Person with ID 2
453
- # for destruction.
454
- #
455
- # Also accepts an Array of attribute hashes:
456
- #
457
- # assign_nested_attributes_for_collection_association(:people, [
458
- # { id: '1', name: 'Peter' },
459
- # { name: 'John' },
460
- # { id: '2', _destroy: true }
461
- # ])
462
- def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
463
- options = nested_attributes_options[association_name]
464
- if attributes_collection.respond_to?(:permitted?)
465
- attributes_collection = attributes_collection.to_h
466
- end
435
+ # Assigns the given attributes to the collection association.
436
+ #
437
+ # Hashes with an <tt>:id</tt> value matching an existing associated record
438
+ # will update that record. Hashes without an <tt>:id</tt> value will build
439
+ # a new record for the association. Hashes with a matching <tt>:id</tt>
440
+ # value and a <tt>:_destroy</tt> key set to a truthy value will mark the
441
+ # matched record for destruction.
442
+ #
443
+ # For example:
444
+ #
445
+ # assign_nested_attributes_for_collection_association(:people, {
446
+ # '1' => { id: '1', name: 'Peter' },
447
+ # '2' => { name: 'John' },
448
+ # '3' => { id: '2', _destroy: true }
449
+ # })
450
+ #
451
+ # Will update the name of the Person with ID 1, build a new associated
452
+ # person with the name 'John', and mark the associated Person with ID 2
453
+ # for destruction.
454
+ #
455
+ # Also accepts an Array of attribute hashes:
456
+ #
457
+ # assign_nested_attributes_for_collection_association(:people, [
458
+ # { id: '1', name: 'Peter' },
459
+ # { name: 'John' },
460
+ # { id: '2', _destroy: true }
461
+ # ])
462
+ def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
463
+ options = nested_attributes_options[association_name]
464
+ if attributes_collection.respond_to?(:permitted?)
465
+ attributes_collection = attributes_collection.to_h
466
+ end
467
467
 
468
- unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array)
469
- raise ArgumentError, "Hash or Array expected, got #{attributes_collection.class.name} (#{attributes_collection.inspect})"
470
- end
468
+ unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array)
469
+ raise ArgumentError, "Hash or Array expected, got #{attributes_collection.class.name} (#{attributes_collection.inspect})"
470
+ end
471
471
 
472
- check_record_limit!(options[:limit], attributes_collection)
472
+ check_record_limit!(options[:limit], attributes_collection)
473
473
 
474
- if attributes_collection.is_a? Hash
475
- attributes_collection = attributes_collection.values
476
- end
474
+ if attributes_collection.is_a? Hash
475
+ attributes_collection = attributes_collection.values
476
+ end
477
477
 
478
- association = association(association_name)
478
+ association = association(association_name)
479
479
 
480
- association.delete_all
480
+ association.delete_all
481
481
 
482
- attributes_collection.each do |attributes|
483
- if attributes.respond_to?(:permitted?)
484
- attributes = attributes.to_h
485
- end
486
- attributes = attributes.with_indifferent_access
482
+ attributes_collection.each do |attributes|
483
+ if attributes.respond_to?(:permitted?)
484
+ attributes = attributes.to_h
485
+ end
486
+ attributes = attributes.with_indifferent_access
487
487
 
488
- unless reject_new_record?(association_name, attributes)
489
- association.build(attributes.except(*UNASSIGNABLE_KEYS))
488
+ unless reject_new_record?(association_name, attributes)
489
+ association.build(attributes.except(*UNASSIGNABLE_KEYS))
490
+ end
490
491
  end
491
492
  end
492
- end
493
493
 
494
- # Takes in a limit and checks if the attributes_collection has too many
495
- # records. It accepts limit in the form of symbol, proc, or
496
- # number-like object (anything that can be compared with an integer).
497
- #
498
- # Raises TooManyRecords error if the attributes_collection is
499
- # larger than the limit.
500
- def check_record_limit!(limit, attributes_collection)
501
- if limit
502
- limit = \
503
- case limit
504
- when Symbol
505
- send(limit)
506
- when Proc
507
- limit.call
508
- else
509
- limit
494
+ # Takes in a limit and checks if the attributes_collection has too many
495
+ # records. It accepts limit in the form of symbol, proc, or
496
+ # number-like object (anything that can be compared with an integer).
497
+ #
498
+ # Raises TooManyRecords error if the attributes_collection is
499
+ # larger than the limit.
500
+ def check_record_limit!(limit, attributes_collection)
501
+ if limit
502
+ limit = \
503
+ case limit
504
+ when Symbol
505
+ send(limit)
506
+ when Proc
507
+ limit.call
508
+ else
509
+ limit
510
+ end
511
+
512
+ if limit && attributes_collection.size > limit
513
+ raise TooManyRecords, "Maximum #{limit} records are allowed. Got #{attributes_collection.size} records instead."
510
514
  end
511
-
512
- if limit && attributes_collection.size > limit
513
- raise TooManyRecords, "Maximum #{limit} records are allowed. Got #{attributes_collection.size} records instead."
514
515
  end
515
516
  end
516
- end
517
-
518
- # Determines if a hash contains a truthy _destroy key.
519
- def has_destroy_flag?(hash)
520
- Type::Boolean.new.cast(hash["_destroy"])
521
- end
522
517
 
523
- # Determines if a new record should be rejected by checking
524
- # has_destroy_flag? or if a <tt>:reject_if</tt> proc exists for this
525
- # association and evaluates to +true+.
526
- def reject_new_record?(association_name, attributes)
527
- will_be_destroyed?(association_name, attributes) || call_reject_if(association_name, attributes)
528
- end
518
+ # Determines if a hash contains a truthy _destroy key.
519
+ def has_destroy_flag?(hash)
520
+ Type::Boolean.new.cast(hash["_destroy"])
521
+ end
529
522
 
530
- # Determines if a record with the particular +attributes+ should be
531
- # rejected by calling the reject_if Symbol or Proc (if defined).
532
- # The reject_if option is defined by +accepts_nested_attributes_for+.
533
- #
534
- # Returns false if there is a +destroy_flag+ on the attributes.
535
- def call_reject_if(association_name, attributes)
536
- return false if will_be_destroyed?(association_name, attributes)
523
+ # Determines if a new record should be rejected by checking
524
+ # has_destroy_flag? or if a <tt>:reject_if</tt> proc exists for this
525
+ # association and evaluates to +true+.
526
+ def reject_new_record?(association_name, attributes)
527
+ will_be_destroyed?(association_name, attributes) || call_reject_if(association_name, attributes)
528
+ end
537
529
 
538
- case callback = nested_attributes_options[association_name][:reject_if]
539
- when Symbol
540
- method(callback).arity == 0 ? send(callback) : send(callback, attributes)
541
- when Proc
542
- callback.call(attributes)
530
+ # Determines if a record with the particular +attributes+ should be
531
+ # rejected by calling the reject_if Symbol or Proc (if defined).
532
+ # The reject_if option is defined by +accepts_nested_attributes_for+.
533
+ #
534
+ # Returns false if there is a +destroy_flag+ on the attributes.
535
+ def call_reject_if(association_name, attributes)
536
+ return false if will_be_destroyed?(association_name, attributes)
537
+
538
+ case callback = nested_attributes_options[association_name][:reject_if]
539
+ when Symbol
540
+ method(callback).arity == 0 ? send(callback) : send(callback, attributes)
541
+ when Proc
542
+ callback.call(attributes)
543
+ end
543
544
  end
544
- end
545
545
 
546
- # Only take into account the destroy flag if <tt>:allow_destroy</tt> is true
547
- def will_be_destroyed?(association_name, attributes)
548
- allow_destroy?(association_name) && has_destroy_flag?(attributes)
549
- end
546
+ # Only take into account the destroy flag if <tt>:allow_destroy</tt> is true
547
+ def will_be_destroyed?(association_name, attributes)
548
+ allow_destroy?(association_name) && has_destroy_flag?(attributes)
549
+ end
550
550
 
551
- def allow_destroy?(association_name)
552
- nested_attributes_options[association_name][:allow_destroy]
553
- end
551
+ def allow_destroy?(association_name)
552
+ nested_attributes_options[association_name][:allow_destroy]
553
+ end
554
554
  end
555
555
  end
@@ -175,9 +175,9 @@ module DuckRecord
175
175
 
176
176
  private
177
177
 
178
- def derive_class_name
179
- name.to_s.camelize
180
- end
178
+ def derive_class_name
179
+ name.to_s.camelize
180
+ end
181
181
  end
182
182
 
183
183
  # Holds all the metadata about an association as it was specified in the
@@ -269,21 +269,21 @@ module DuckRecord
269
269
 
270
270
  protected
271
271
 
272
- def actual_source_reflection # FIXME: this is a horrible name
273
- self
274
- end
272
+ def actual_source_reflection # FIXME: this is a horrible name
273
+ self
274
+ end
275
275
 
276
276
  private
277
277
 
278
- def calculate_constructable(macro, options)
279
- true
280
- end
278
+ def calculate_constructable(macro, options)
279
+ true
280
+ end
281
281
 
282
- def derive_class_name
283
- class_name = name.to_s
284
- class_name = class_name.singularize if collection?
285
- class_name.camelize
286
- end
282
+ def derive_class_name
283
+ class_name = name.to_s
284
+ class_name = class_name.singularize if collection?
285
+ class_name.camelize
286
+ end
287
287
  end
288
288
 
289
289
  class HasManyReflection < AssociationReflection # :nodoc:
@@ -24,13 +24,13 @@ module DuckRecord
24
24
 
25
25
  private
26
26
 
27
- def type_cast_array(value, method)
28
- if value.is_a?(::Array)
29
- value.map { |item| type_cast_array(item, method) }
30
- else
31
- @subtype.public_send(method, value)
27
+ def type_cast_array(value, method)
28
+ if value.is_a?(::Array)
29
+ value.map { |item| type_cast_array(item, method) }
30
+ else
31
+ @subtype.public_send(method, value)
32
+ end
32
33
  end
33
- end
34
34
  end
35
35
  end
36
36
  end
@@ -1,4 +1,4 @@
1
- require 'active_model/type/registry'
1
+ require "active_model/type/registry"
2
2
 
3
3
  module DuckRecord
4
4
  # :stopdoc:
@@ -10,15 +10,15 @@ module DuckRecord
10
10
 
11
11
  private
12
12
 
13
- def registration_klass
14
- Registration
15
- end
13
+ def registration_klass
14
+ Registration
15
+ end
16
16
 
17
- def find_registration(symbol, *args)
18
- registrations
19
- .select { |registration| registration.matches?(symbol, *args) }
20
- .max
21
- end
17
+ def find_registration(symbol, *args)
18
+ registrations
19
+ .select { |registration| registration.matches?(symbol, *args) }
20
+ .max
21
+ end
22
22
  end
23
23
 
24
24
  class Registration
@@ -48,15 +48,15 @@ module DuckRecord
48
48
  # Workaround for Ruby 2.2 "private attribute?" warning.
49
49
  protected
50
50
 
51
- attr_reader :name, :block, :override
51
+ attr_reader :name, :block, :override
52
52
 
53
- def priority
54
- result = 0
55
- if override
56
- result |= 1
53
+ def priority
54
+ result = 0
55
+ if override
56
+ result |= 1
57
+ end
58
+ result
57
59
  end
58
- result
59
- end
60
60
  end
61
61
 
62
62
  class DecorationRegistration < Registration
@@ -82,15 +82,15 @@ module DuckRecord
82
82
  # Workaround for Ruby 2.2 "private attribute?" warning.
83
83
  protected
84
84
 
85
- attr_reader :options, :klass
85
+ attr_reader :options, :klass
86
86
 
87
87
  private
88
88
 
89
- def matches_options?(**kwargs)
90
- options.all? do |key, value|
91
- kwargs[key] == value
89
+ def matches_options?(**kwargs)
90
+ options.all? do |key, value|
91
+ kwargs[key] == value
92
+ end
92
93
  end
93
- end
94
94
  end
95
95
  end
96
96
  # :startdoc:
@@ -43,21 +43,21 @@ module DuckRecord
43
43
 
44
44
  def assert_valid_value(value)
45
45
  if coder.respond_to?(:assert_valid_value)
46
- coder.assert_valid_value(value, action: 'serialize')
46
+ coder.assert_valid_value(value, action: "serialize")
47
47
  end
48
48
  end
49
49
 
50
50
  private
51
51
 
52
- def default_value?(value)
53
- value == coder.load(nil)
54
- end
52
+ def default_value?(value)
53
+ value == coder.load(nil)
54
+ end
55
55
 
56
- def encoded(value)
57
- unless default_value?(value)
58
- coder.dump(value)
56
+ def encoded(value)
57
+ unless default_value?(value)
58
+ coder.dump(value)
59
+ end
59
60
  end
60
- end
61
61
  end
62
62
  end
63
63
  end
@@ -17,4 +17,3 @@ module DuckRecord
17
17
  end
18
18
  end
19
19
  end
20
-
@@ -3,13 +3,13 @@ module DuckRecord
3
3
  class UnsignedInteger < ActiveModel::Type::Integer # :nodoc:
4
4
  private
5
5
 
6
- def max_value
7
- super * 2
8
- end
6
+ def max_value
7
+ super * 2
8
+ end
9
9
 
10
- def min_value
11
- 0
12
- end
10
+ def min_value
11
+ 0
12
+ end
13
13
  end
14
14
  end
15
15
  end
@@ -1,17 +1,21 @@
1
- require 'active_model/type'
1
+ require "active_model/type"
2
2
 
3
- require 'duck_record/type/internal/abstract_json'
4
- require 'duck_record/type/internal/timezone'
3
+ require "duck_record/type/internal/abstract_json"
4
+ require "duck_record/type/internal/timezone"
5
5
 
6
- require 'duck_record/type/date'
7
- require 'duck_record/type/date_time'
8
- require 'duck_record/type/time'
9
- require 'duck_record/type/json'
6
+ require "duck_record/type/date"
7
+ require "duck_record/type/date_time"
8
+ require "duck_record/type/time"
9
+ require "duck_record/type/json"
10
10
 
11
- require 'duck_record/type/array'
11
+ require "duck_record/type/array"
12
12
 
13
- require 'duck_record/type/serialized'
14
- require 'duck_record/type/registry'
13
+ require "duck_record/type/unsigned_integer"
14
+ require "duck_record/type/decimal_without_scale"
15
+ require "duck_record/type/text"
16
+
17
+ require "duck_record/type/serialized"
18
+ require "duck_record/type/registry"
15
19
 
16
20
  module DuckRecord
17
21
  module Type
@@ -43,15 +47,13 @@ module DuckRecord
43
47
  Binary = ActiveModel::Type::Binary
44
48
  Boolean = ActiveModel::Type::Boolean
45
49
  Decimal = ActiveModel::Type::Decimal
46
- DecimalWithoutScale = ActiveModel::Type::DecimalWithoutScale
47
50
  Float = ActiveModel::Type::Float
48
51
  Integer = ActiveModel::Type::Integer
49
52
  String = ActiveModel::Type::String
50
- Text = ActiveModel::Type::Text
51
- UnsignedInteger = ActiveModel::Type::UnsignedInteger
52
53
  Value = ActiveModel::Type::Value
53
54
 
54
55
  register(:big_integer, Type::BigInteger, override: false)
56
+ register(:decimal_without_scale)
55
57
  register(:binary, Type::Binary, override: false)
56
58
  register(:boolean, Type::Boolean, override: false)
57
59
  register(:date, Type::Date, override: false)
@@ -64,6 +66,6 @@ module DuckRecord
64
66
  register(:time, Type::Time, override: false)
65
67
  register(:json, Type::JSON, override: false)
66
68
 
67
- add_modifier({array: true}, Type::Array)
69
+ add_modifier({ array: true }, Type::Array)
68
70
  end
69
71
  end