active_fields 0.1.0 → 1.0.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 (78) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -1
  3. data/.rubocop.yml +3 -15
  4. data/CHANGELOG.md +19 -0
  5. data/README.md +633 -0
  6. data/Rakefile +7 -0
  7. data/app/models/active_fields/application_record.rb +7 -0
  8. data/app/models/active_fields/field/base.rb +17 -0
  9. data/{lib/active_fields/models → app/models/active_fields}/field/boolean.rb +14 -9
  10. data/{lib/active_fields/models → app/models/active_fields}/field/date.rb +16 -12
  11. data/app/models/active_fields/field/date_array.rb +36 -0
  12. data/app/models/active_fields/field/date_time.rb +77 -0
  13. data/app/models/active_fields/field/date_time_array.rb +61 -0
  14. data/app/models/active_fields/field/decimal.rb +75 -0
  15. data/app/models/active_fields/field/decimal_array.rb +59 -0
  16. data/{lib/active_fields/models → app/models/active_fields}/field/enum.rb +34 -17
  17. data/app/models/active_fields/field/enum_array.rb +64 -0
  18. data/{lib/active_fields/models → app/models/active_fields}/field/integer.rb +16 -12
  19. data/app/models/active_fields/field/integer_array.rb +36 -0
  20. data/{lib/active_fields/models → app/models/active_fields}/field/text.rb +16 -12
  21. data/app/models/active_fields/field/text_array.rb +39 -0
  22. data/app/models/active_fields/value.rb +15 -0
  23. data/app/models/concerns/active_fields/customizable_concern.rb +94 -0
  24. data/app/models/concerns/active_fields/field_array_concern.rb +25 -0
  25. data/app/models/concerns/active_fields/field_concern.rb +111 -0
  26. data/app/models/concerns/active_fields/value_concern.rb +83 -0
  27. data/config/routes.rb +4 -0
  28. data/{lib/generators/active_fields/install/templates/create_active_fields_tables.rb.tt → db/migrate/20240229230000_create_active_fields_tables.rb} +8 -6
  29. data/lib/active_fields/casters/base_caster.rb +8 -2
  30. data/lib/active_fields/casters/boolean_caster.rb +0 -2
  31. data/lib/active_fields/casters/date_array_caster.rb +0 -2
  32. data/lib/active_fields/casters/date_caster.rb +8 -8
  33. data/lib/active_fields/casters/date_time_array_caster.rb +19 -0
  34. data/lib/active_fields/casters/date_time_caster.rb +43 -0
  35. data/lib/active_fields/casters/decimal_array_caster.rb +0 -2
  36. data/lib/active_fields/casters/decimal_caster.rb +10 -4
  37. data/lib/active_fields/casters/enum_array_caster.rb +13 -3
  38. data/lib/active_fields/casters/enum_caster.rb +15 -3
  39. data/lib/active_fields/casters/integer_array_caster.rb +0 -2
  40. data/lib/active_fields/casters/integer_caster.rb +2 -4
  41. data/lib/active_fields/casters/text_array_caster.rb +0 -2
  42. data/lib/active_fields/casters/text_caster.rb +0 -2
  43. data/lib/active_fields/config.rb +61 -0
  44. data/lib/active_fields/customizable_config.rb +24 -0
  45. data/lib/active_fields/engine.rb +13 -0
  46. data/lib/active_fields/has_active_fields.rb +19 -0
  47. data/lib/active_fields/validators/base_validator.rb +7 -3
  48. data/lib/active_fields/validators/boolean_validator.rb +2 -4
  49. data/lib/active_fields/validators/date_array_validator.rb +3 -5
  50. data/lib/active_fields/validators/date_time_array_validator.rb +26 -0
  51. data/lib/active_fields/validators/date_time_validator.rb +19 -0
  52. data/lib/active_fields/validators/date_validator.rb +3 -5
  53. data/lib/active_fields/validators/decimal_array_validator.rb +2 -4
  54. data/lib/active_fields/validators/decimal_validator.rb +2 -4
  55. data/lib/active_fields/validators/enum_array_validator.rb +3 -5
  56. data/lib/active_fields/validators/enum_validator.rb +3 -5
  57. data/lib/active_fields/validators/integer_array_validator.rb +2 -4
  58. data/lib/active_fields/validators/integer_validator.rb +2 -4
  59. data/lib/active_fields/validators/text_array_validator.rb +2 -4
  60. data/lib/active_fields/validators/text_validator.rb +2 -4
  61. data/lib/active_fields/version.rb +1 -1
  62. data/lib/active_fields.rb +47 -7
  63. data/lib/generators/active_fields/install/USAGE +1 -1
  64. data/lib/generators/active_fields/install/install_generator.rb +14 -18
  65. data/lib/tasks/active_fields_tasks.rake +6 -0
  66. metadata +49 -36
  67. data/lib/active_fields/models/concerns/concern.rb +0 -16
  68. data/lib/active_fields/models/concerns/customizable.rb +0 -83
  69. data/lib/active_fields/models/concerns/field_concern.rb +0 -79
  70. data/lib/active_fields/models/concerns/value_concern.rb +0 -50
  71. data/lib/active_fields/models/field/date_array.rb +0 -44
  72. data/lib/active_fields/models/field/decimal.rb +0 -48
  73. data/lib/active_fields/models/field/decimal_array.rb +0 -44
  74. data/lib/active_fields/models/field/enum_array.rb +0 -59
  75. data/lib/active_fields/models/field/integer_array.rb +0 -34
  76. data/lib/active_fields/models/field/text_array.rb +0 -35
  77. data/lib/active_fields/models/field.rb +0 -27
  78. data/lib/active_fields/models/value.rb +0 -30
@@ -1,21 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../field"
4
-
5
3
  module ActiveFields
6
- class Field
7
- class Boolean < ActiveFields::Field
8
- store_accessor :options, :required, :nullable
4
+ module Field
5
+ class Boolean < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ validator: {
8
+ class_name: "ActiveFields::Validators::BooleanValidator",
9
+ options: -> { { required: required?, nullable: nullable? } },
10
+ },
11
+ caster: {
12
+ class_name: "ActiveFields::Casters::BooleanCaster",
13
+ },
14
+ )
9
15
 
10
- # attribute :required, :boolean, default: false
11
- # attribute :nullable, :boolean, default: false
16
+ store_accessor :options, :required, :nullable
12
17
 
13
18
  validates :required, exclusion: [nil]
14
19
  validates :nullable, exclusion: [nil]
15
20
 
16
21
  %i[required nullable].each do |column|
17
22
  define_method(column) do
18
- ActiveFields::Casters::BooleanCaster.new.deserialize(super())
23
+ Casters::BooleanCaster.new.deserialize(super())
19
24
  end
20
25
 
21
26
  define_method(:"#{column}?") do
@@ -23,7 +28,7 @@ module ActiveFields
23
28
  end
24
29
 
25
30
  define_method(:"#{column}=") do |other|
26
- super(ActiveFields::Casters::BooleanCaster.new.serialize(other))
31
+ super(Casters::BooleanCaster.new.serialize(other))
27
32
  end
28
33
  end
29
34
 
@@ -1,22 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../field"
4
-
5
3
  module ActiveFields
6
- class Field
7
- class Date < ActiveFields::Field
8
- store_accessor :options, :required, :min, :max
4
+ module Field
5
+ class Date < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ validator: {
8
+ class_name: "ActiveFields::Validators::DateValidator",
9
+ options: -> { { required: required?, min: min, max: max } },
10
+ },
11
+ caster: {
12
+ class_name: "ActiveFields::Casters::DateCaster",
13
+ },
14
+ )
9
15
 
10
- # attribute :required, :boolean, default: false
11
- # attribute :min, :date
12
- # attribute :max, :date
16
+ store_accessor :options, :required, :min, :max
13
17
 
14
18
  validates :required, exclusion: [nil]
15
19
  validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
16
20
 
17
21
  %i[required].each do |column|
18
22
  define_method(column) do
19
- ActiveFields::Casters::BooleanCaster.new.deserialize(super())
23
+ Casters::BooleanCaster.new.deserialize(super())
20
24
  end
21
25
 
22
26
  define_method(:"#{column}?") do
@@ -24,17 +28,17 @@ module ActiveFields
24
28
  end
25
29
 
26
30
  define_method(:"#{column}=") do |other|
27
- super(ActiveFields::Casters::BooleanCaster.new.serialize(other))
31
+ super(Casters::BooleanCaster.new.serialize(other))
28
32
  end
29
33
  end
30
34
 
31
35
  %i[min max].each do |column|
32
36
  define_method(column) do
33
- ActiveFields::Casters::DateCaster.new.deserialize(super())
37
+ Casters::DateCaster.new.deserialize(super())
34
38
  end
35
39
 
36
40
  define_method(:"#{column}=") do |other|
37
- super(ActiveFields::Casters::DateCaster.new.serialize(other))
41
+ super(Casters::DateCaster.new.serialize(other))
38
42
  end
39
43
  end
40
44
 
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFields
4
+ module Field
5
+ class DateArray < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ array: true,
8
+ validator: {
9
+ class_name: "ActiveFields::Validators::DateArrayValidator",
10
+ options: -> { { min: min, max: max, min_size: min_size, max_size: max_size } },
11
+ },
12
+ caster: {
13
+ class_name: "ActiveFields::Casters::DateArrayCaster",
14
+ },
15
+ )
16
+
17
+ store_accessor :options, :min, :max
18
+
19
+ validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
20
+
21
+ %i[min max].each do |column|
22
+ define_method(column) do
23
+ Casters::DateCaster.new.deserialize(super())
24
+ end
25
+
26
+ define_method(:"#{column}=") do |other|
27
+ super(Casters::DateCaster.new.serialize(other))
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def set_defaults; end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFields
4
+ module Field
5
+ class DateTime < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ validator: {
8
+ class_name: "ActiveFields::Validators::DateTimeValidator",
9
+ options: -> { { required: required?, min: min, max: max } },
10
+ },
11
+ caster: {
12
+ class_name: "ActiveFields::Casters::DateTimeCaster",
13
+ options: -> { { precision: precision } },
14
+ },
15
+ )
16
+
17
+ store_accessor :options, :required, :min, :max, :precision
18
+
19
+ validates :required, exclusion: [nil]
20
+ validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
21
+ validates :precision,
22
+ comparison: { greater_than_or_equal_to: 0, less_than_or_equal_to: Casters::DateTimeCaster::MAX_PRECISION },
23
+ allow_nil: true
24
+
25
+ # If precision is set after attributes that depend on it, deserialization will work correctly,
26
+ # but an incorrect internal value may be saved in the DB.
27
+ # This callback reassigns the internal values of the attributes to ensure accuracy.
28
+ before_save :reapply_precision
29
+
30
+ %i[required].each do |column|
31
+ define_method(column) do
32
+ Casters::BooleanCaster.new.deserialize(super())
33
+ end
34
+
35
+ define_method(:"#{column}?") do
36
+ !!public_send(column)
37
+ end
38
+
39
+ define_method(:"#{column}=") do |other|
40
+ super(Casters::BooleanCaster.new.serialize(other))
41
+ end
42
+ end
43
+
44
+ %i[min max].each do |column|
45
+ define_method(column) do
46
+ Casters::DateTimeCaster.new(precision: precision).deserialize(super())
47
+ end
48
+
49
+ define_method(:"#{column}=") do |other|
50
+ super(Casters::DateTimeCaster.new(precision: precision).serialize(other))
51
+ end
52
+ end
53
+
54
+ %i[precision].each do |column|
55
+ define_method(column) do
56
+ Casters::IntegerCaster.new.deserialize(super())
57
+ end
58
+
59
+ define_method(:"#{column}=") do |other|
60
+ super(Casters::IntegerCaster.new.serialize(other))
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def set_defaults
67
+ self.required ||= false
68
+ end
69
+
70
+ def reapply_precision
71
+ self.min = min
72
+ self.max = max
73
+ self.default_value = default_value
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFields
4
+ module Field
5
+ class DateTimeArray < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ array: true,
8
+ validator: {
9
+ class_name: "ActiveFields::Validators::DateTimeArrayValidator",
10
+ options: -> { { min: min, max: max, min_size: min_size, max_size: max_size } },
11
+ },
12
+ caster: {
13
+ class_name: "ActiveFields::Casters::DateTimeArrayCaster",
14
+ options: -> { { precision: precision } },
15
+ },
16
+ )
17
+
18
+ store_accessor :options, :min, :max, :precision
19
+
20
+ validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
21
+ validates :precision,
22
+ comparison: { greater_than_or_equal_to: 0, less_than_or_equal_to: Casters::DateTimeCaster::MAX_PRECISION },
23
+ allow_nil: true
24
+
25
+ # If precision is set after attributes that depend on it, deserialization will work correctly,
26
+ # but an incorrect internal value may be saved in the DB.
27
+ # This callback reassigns the internal values of the attributes to ensure accuracy.
28
+ before_save :reapply_precision
29
+
30
+ %i[precision].each do |column|
31
+ define_method(column) do
32
+ Casters::IntegerCaster.new.deserialize(super())
33
+ end
34
+
35
+ define_method(:"#{column}=") do |other|
36
+ super(Casters::IntegerCaster.new.serialize(other))
37
+ end
38
+ end
39
+
40
+ %i[min max].each do |column|
41
+ define_method(column) do
42
+ Casters::DateTimeCaster.new(precision: precision).deserialize(super())
43
+ end
44
+
45
+ define_method(:"#{column}=") do |other|
46
+ super(Casters::DateTimeCaster.new(precision: precision).serialize(other))
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def set_defaults; end
53
+
54
+ def reapply_precision
55
+ self.min = min
56
+ self.max = max
57
+ self.default_value = default_value
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFields
4
+ module Field
5
+ class Decimal < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ validator: {
8
+ class_name: "ActiveFields::Validators::DecimalValidator",
9
+ options: -> { { required: required?, min: min, max: max } },
10
+ },
11
+ caster: {
12
+ class_name: "ActiveFields::Casters::DecimalCaster",
13
+ options: -> { { precision: precision } },
14
+ },
15
+ )
16
+
17
+ store_accessor :options, :required, :min, :max, :precision
18
+
19
+ validates :required, exclusion: [nil]
20
+ validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
21
+ validates :precision, comparison: { greater_than_or_equal_to: 0 }, allow_nil: true
22
+
23
+ # If precision is set after attributes that depend on it, deserialization will work correctly,
24
+ # but an incorrect internal value may be saved in the DB.
25
+ # This callback reassigns the internal values of the attributes to ensure accuracy.
26
+ before_save :reapply_precision
27
+
28
+ %i[required].each do |column|
29
+ define_method(column) do
30
+ Casters::BooleanCaster.new.deserialize(super())
31
+ end
32
+
33
+ define_method(:"#{column}?") do
34
+ !!public_send(column)
35
+ end
36
+
37
+ define_method(:"#{column}=") do |other|
38
+ super(Casters::BooleanCaster.new.serialize(other))
39
+ end
40
+ end
41
+
42
+ %i[min max].each do |column|
43
+ define_method(column) do
44
+ Casters::DecimalCaster.new(precision: precision).deserialize(super())
45
+ end
46
+
47
+ define_method(:"#{column}=") do |other|
48
+ super(Casters::DecimalCaster.new(precision: precision).serialize(other))
49
+ end
50
+ end
51
+
52
+ %i[precision].each do |column|
53
+ define_method(column) do
54
+ Casters::IntegerCaster.new.deserialize(super())
55
+ end
56
+
57
+ define_method(:"#{column}=") do |other|
58
+ super(Casters::IntegerCaster.new.serialize(other))
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def set_defaults
65
+ self.required ||= false
66
+ end
67
+
68
+ def reapply_precision
69
+ self.min = min
70
+ self.max = max
71
+ self.default_value = default_value
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFields
4
+ module Field
5
+ class DecimalArray < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ array: true,
8
+ validator: {
9
+ class_name: "ActiveFields::Validators::DecimalArrayValidator",
10
+ options: -> { { min: min, max: max, min_size: min_size, max_size: max_size } },
11
+ },
12
+ caster: {
13
+ class_name: "ActiveFields::Casters::DecimalArrayCaster",
14
+ options: -> { { precision: precision } },
15
+ },
16
+ )
17
+
18
+ store_accessor :options, :min, :max, :precision
19
+
20
+ validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
21
+ validates :precision, comparison: { greater_than_or_equal_to: 0 }, allow_nil: true
22
+
23
+ # If precision is set after attributes that depend on it, deserialization will work correctly,
24
+ # but an incorrect internal value may be saved in the DB.
25
+ # This callback reassigns the internal values of the attributes to ensure accuracy.
26
+ before_save :reapply_precision
27
+
28
+ %i[precision].each do |column|
29
+ define_method(column) do
30
+ Casters::IntegerCaster.new.deserialize(super())
31
+ end
32
+
33
+ define_method(:"#{column}=") do |other|
34
+ super(Casters::IntegerCaster.new.serialize(other))
35
+ end
36
+ end
37
+
38
+ %i[min max].each do |column|
39
+ define_method(column) do
40
+ Casters::DecimalCaster.new(precision: precision).deserialize(super())
41
+ end
42
+
43
+ define_method(:"#{column}=") do |other|
44
+ super(Casters::DecimalCaster.new(precision: precision).serialize(other))
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def set_defaults; end
51
+
52
+ def reapply_precision
53
+ self.min = min
54
+ self.max = max
55
+ self.default_value = default_value
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,21 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../field"
4
-
5
3
  module ActiveFields
6
- class Field
7
- class Enum < ActiveFields::Field
8
- store_accessor :options, :required, :allowed_values
4
+ module Field
5
+ class Enum < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ validator: {
8
+ class_name: "ActiveFields::Validators::EnumValidator",
9
+ options: -> { { required: required?, allowed_values: allowed_values } },
10
+ },
11
+ caster: {
12
+ class_name: "ActiveFields::Casters::EnumCaster",
13
+ },
14
+ )
9
15
 
10
- # attribute :required, :boolean, default: false
11
- # attribute :allowed_values, :string, array: true, default: []
16
+ store_accessor :options, :required, :allowed_values
12
17
 
13
18
  validates :required, exclusion: [nil]
14
19
  validate :validate_allowed_values
15
20
 
16
21
  %i[required].each do |column|
17
22
  define_method(column) do
18
- ActiveFields::Casters::BooleanCaster.new.deserialize(super())
23
+ Casters::BooleanCaster.new.deserialize(super())
19
24
  end
20
25
 
21
26
  define_method(:"#{column}?") do
@@ -23,17 +28,17 @@ module ActiveFields
23
28
  end
24
29
 
25
30
  define_method(:"#{column}=") do |other|
26
- super(ActiveFields::Casters::BooleanCaster.new.serialize(other))
31
+ super(Casters::BooleanCaster.new.serialize(other))
27
32
  end
28
33
  end
29
34
 
30
35
  %i[allowed_values].each do |column|
31
36
  define_method(column) do
32
- ActiveFields::Casters::TextArrayCaster.new.deserialize(super())
37
+ Casters::TextArrayCaster.new.deserialize(super())
33
38
  end
34
39
 
35
40
  define_method(:"#{column}=") do |other|
36
- super(ActiveFields::Casters::TextArrayCaster.new.serialize(other))
41
+ super(Casters::TextArrayCaster.new.serialize(other))
37
42
  end
38
43
  end
39
44
 
@@ -42,15 +47,27 @@ module ActiveFields
42
47
  def validate_allowed_values
43
48
  if allowed_values.nil?
44
49
  errors.add(:allowed_values, :blank)
45
- elsif allowed_values.is_a?(Array)
46
- if allowed_values.empty?
47
- errors.add(:allowed_values, :blank)
48
- elsif allowed_values.any? { !_1.is_a?(String) }
50
+ return false
51
+ end
52
+
53
+ unless allowed_values.is_a?(Array)
54
+ errors.add(:allowed_values, :invalid)
55
+ return false
56
+ end
57
+
58
+ if allowed_values.empty?
59
+ errors.add(:allowed_values, :blank)
60
+ return false
61
+ end
62
+
63
+ allowed_values.each do |value_element|
64
+ if value_element.blank?
49
65
  errors.add(:allowed_values, :invalid)
66
+ return false
50
67
  end
51
- else
52
- errors.add(:allowed_values, :invalid)
53
68
  end
69
+
70
+ true
54
71
  end
55
72
 
56
73
  def set_defaults
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFields
4
+ module Field
5
+ class EnumArray < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ array: true,
8
+ validator: {
9
+ class_name: "ActiveFields::Validators::EnumArrayValidator",
10
+ options: -> { { allowed_values: allowed_values, min_size: min_size, max_size: max_size } },
11
+ },
12
+ caster: {
13
+ class_name: "ActiveFields::Casters::EnumArrayCaster",
14
+ },
15
+ )
16
+
17
+ store_accessor :options, :allowed_values
18
+
19
+ validate :validate_allowed_values
20
+
21
+ %i[allowed_values].each do |column|
22
+ define_method(column) do
23
+ Casters::TextArrayCaster.new.deserialize(super())
24
+ end
25
+
26
+ define_method(:"#{column}=") do |other|
27
+ super(Casters::TextArrayCaster.new.serialize(other))
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def validate_allowed_values
34
+ if allowed_values.nil?
35
+ errors.add(:allowed_values, :blank)
36
+ return false
37
+ end
38
+
39
+ unless allowed_values.is_a?(Array)
40
+ errors.add(:allowed_values, :invalid)
41
+ return false
42
+ end
43
+
44
+ if allowed_values.empty?
45
+ errors.add(:allowed_values, :blank)
46
+ return false
47
+ end
48
+
49
+ allowed_values.each do |value_element|
50
+ if value_element.blank?
51
+ errors.add(:allowed_values, :invalid)
52
+ return false
53
+ end
54
+ end
55
+
56
+ true
57
+ end
58
+
59
+ def set_defaults
60
+ self.allowed_values ||= []
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,22 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../field"
4
-
5
3
  module ActiveFields
6
- class Field
7
- class Integer < ActiveFields::Field
8
- store_accessor :options, :required, :min, :max
4
+ module Field
5
+ class Integer < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ validator: {
8
+ class_name: "ActiveFields::Validators::IntegerValidator",
9
+ options: -> { { required: required?, min: min, max: max } },
10
+ },
11
+ caster: {
12
+ class_name: "ActiveFields::Casters::IntegerCaster",
13
+ },
14
+ )
9
15
 
10
- # attribute :required, :boolean, default: false
11
- # attribute :min, :integer
12
- # attribute :max, :integer
16
+ store_accessor :options, :required, :min, :max
13
17
 
14
18
  validates :required, exclusion: [nil]
15
19
  validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
16
20
 
17
21
  %i[required].each do |column|
18
22
  define_method(column) do
19
- ActiveFields::Casters::BooleanCaster.new.deserialize(super())
23
+ Casters::BooleanCaster.new.deserialize(super())
20
24
  end
21
25
 
22
26
  define_method(:"#{column}?") do
@@ -24,17 +28,17 @@ module ActiveFields
24
28
  end
25
29
 
26
30
  define_method(:"#{column}=") do |other|
27
- super(ActiveFields::Casters::BooleanCaster.new.serialize(other))
31
+ super(Casters::BooleanCaster.new.serialize(other))
28
32
  end
29
33
  end
30
34
 
31
35
  %i[min max].each do |column|
32
36
  define_method(column) do
33
- ActiveFields::Casters::IntegerCaster.new.deserialize(super())
37
+ Casters::IntegerCaster.new.deserialize(super())
34
38
  end
35
39
 
36
40
  define_method(:"#{column}=") do |other|
37
- super(ActiveFields::Casters::IntegerCaster.new.serialize(other))
41
+ super(Casters::IntegerCaster.new.serialize(other))
38
42
  end
39
43
  end
40
44
 
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveFields
4
+ module Field
5
+ class IntegerArray < ActiveFields.config.field_base_class
6
+ acts_as_active_field(
7
+ array: true,
8
+ validator: {
9
+ class_name: "ActiveFields::Validators::IntegerArrayValidator",
10
+ options: -> { { min: min, max: max, min_size: min_size, max_size: max_size } },
11
+ },
12
+ caster: {
13
+ class_name: "ActiveFields::Casters::IntegerArrayCaster",
14
+ },
15
+ )
16
+
17
+ store_accessor :options, :min, :max
18
+
19
+ validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
20
+
21
+ %i[min max].each do |column|
22
+ define_method(column) do
23
+ Casters::IntegerCaster.new.deserialize(super())
24
+ end
25
+
26
+ define_method(:"#{column}=") do |other|
27
+ super(Casters::IntegerCaster.new.serialize(other))
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def set_defaults; end
34
+ end
35
+ end
36
+ end