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.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/.rubocop.yml +3 -15
- data/CHANGELOG.md +19 -0
- data/README.md +633 -0
- data/Rakefile +7 -0
- data/app/models/active_fields/application_record.rb +7 -0
- data/app/models/active_fields/field/base.rb +17 -0
- data/{lib/active_fields/models → app/models/active_fields}/field/boolean.rb +14 -9
- data/{lib/active_fields/models → app/models/active_fields}/field/date.rb +16 -12
- data/app/models/active_fields/field/date_array.rb +36 -0
- data/app/models/active_fields/field/date_time.rb +77 -0
- data/app/models/active_fields/field/date_time_array.rb +61 -0
- data/app/models/active_fields/field/decimal.rb +75 -0
- data/app/models/active_fields/field/decimal_array.rb +59 -0
- data/{lib/active_fields/models → app/models/active_fields}/field/enum.rb +34 -17
- data/app/models/active_fields/field/enum_array.rb +64 -0
- data/{lib/active_fields/models → app/models/active_fields}/field/integer.rb +16 -12
- data/app/models/active_fields/field/integer_array.rb +36 -0
- data/{lib/active_fields/models → app/models/active_fields}/field/text.rb +16 -12
- data/app/models/active_fields/field/text_array.rb +39 -0
- data/app/models/active_fields/value.rb +15 -0
- data/app/models/concerns/active_fields/customizable_concern.rb +94 -0
- data/app/models/concerns/active_fields/field_array_concern.rb +25 -0
- data/app/models/concerns/active_fields/field_concern.rb +111 -0
- data/app/models/concerns/active_fields/value_concern.rb +83 -0
- data/config/routes.rb +4 -0
- data/{lib/generators/active_fields/install/templates/create_active_fields_tables.rb.tt → db/migrate/20240229230000_create_active_fields_tables.rb} +8 -6
- data/lib/active_fields/casters/base_caster.rb +8 -2
- data/lib/active_fields/casters/boolean_caster.rb +0 -2
- data/lib/active_fields/casters/date_array_caster.rb +0 -2
- data/lib/active_fields/casters/date_caster.rb +8 -8
- data/lib/active_fields/casters/date_time_array_caster.rb +19 -0
- data/lib/active_fields/casters/date_time_caster.rb +43 -0
- data/lib/active_fields/casters/decimal_array_caster.rb +0 -2
- data/lib/active_fields/casters/decimal_caster.rb +10 -4
- data/lib/active_fields/casters/enum_array_caster.rb +13 -3
- data/lib/active_fields/casters/enum_caster.rb +15 -3
- data/lib/active_fields/casters/integer_array_caster.rb +0 -2
- data/lib/active_fields/casters/integer_caster.rb +2 -4
- data/lib/active_fields/casters/text_array_caster.rb +0 -2
- data/lib/active_fields/casters/text_caster.rb +0 -2
- data/lib/active_fields/config.rb +61 -0
- data/lib/active_fields/customizable_config.rb +24 -0
- data/lib/active_fields/engine.rb +13 -0
- data/lib/active_fields/has_active_fields.rb +19 -0
- data/lib/active_fields/validators/base_validator.rb +7 -3
- data/lib/active_fields/validators/boolean_validator.rb +2 -4
- data/lib/active_fields/validators/date_array_validator.rb +3 -5
- data/lib/active_fields/validators/date_time_array_validator.rb +26 -0
- data/lib/active_fields/validators/date_time_validator.rb +19 -0
- data/lib/active_fields/validators/date_validator.rb +3 -5
- data/lib/active_fields/validators/decimal_array_validator.rb +2 -4
- data/lib/active_fields/validators/decimal_validator.rb +2 -4
- data/lib/active_fields/validators/enum_array_validator.rb +3 -5
- data/lib/active_fields/validators/enum_validator.rb +3 -5
- data/lib/active_fields/validators/integer_array_validator.rb +2 -4
- data/lib/active_fields/validators/integer_validator.rb +2 -4
- data/lib/active_fields/validators/text_array_validator.rb +2 -4
- data/lib/active_fields/validators/text_validator.rb +2 -4
- data/lib/active_fields/version.rb +1 -1
- data/lib/active_fields.rb +47 -7
- data/lib/generators/active_fields/install/USAGE +1 -1
- data/lib/generators/active_fields/install/install_generator.rb +14 -18
- data/lib/tasks/active_fields_tasks.rake +6 -0
- metadata +49 -36
- data/lib/active_fields/models/concerns/concern.rb +0 -16
- data/lib/active_fields/models/concerns/customizable.rb +0 -83
- data/lib/active_fields/models/concerns/field_concern.rb +0 -79
- data/lib/active_fields/models/concerns/value_concern.rb +0 -50
- data/lib/active_fields/models/field/date_array.rb +0 -44
- data/lib/active_fields/models/field/decimal.rb +0 -48
- data/lib/active_fields/models/field/decimal_array.rb +0 -44
- data/lib/active_fields/models/field/enum_array.rb +0 -59
- data/lib/active_fields/models/field/integer_array.rb +0 -34
- data/lib/active_fields/models/field/text_array.rb +0 -35
- data/lib/active_fields/models/field.rb +0 -27
- data/lib/active_fields/models/value.rb +0 -30
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_fields
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kirill Usanov
|
@@ -9,10 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-
|
12
|
+
date: 2024-09-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: rails
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
@@ -26,21 +26,21 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '6.0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: factory_bot
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
35
|
-
type: :
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: pg
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
57
|
+
name: rake
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
@@ -68,7 +68,7 @@ dependencies:
|
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
71
|
+
name: rspec-rails
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
@@ -82,7 +82,7 @@ dependencies:
|
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
85
|
+
name: rubocop
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - ">="
|
@@ -96,7 +96,7 @@ dependencies:
|
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '0'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
|
-
name:
|
99
|
+
name: rubocop-factory_bot
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
102
|
- - ">="
|
@@ -110,7 +110,7 @@ dependencies:
|
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
|
-
name: rubocop
|
113
|
+
name: rubocop-performance
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
116
|
- - ">="
|
@@ -124,7 +124,7 @@ dependencies:
|
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
|
-
name: rubocop-
|
127
|
+
name: rubocop-rails
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
130
|
- - ">="
|
@@ -138,7 +138,7 @@ dependencies:
|
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
- !ruby/object:Gem::Dependency
|
141
|
-
name: rubocop-
|
141
|
+
name: rubocop-rake
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
144
|
- - ">="
|
@@ -152,7 +152,7 @@ dependencies:
|
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: '0'
|
154
154
|
- !ruby/object:Gem::Dependency
|
155
|
-
name: rubocop-
|
155
|
+
name: rubocop-rspec
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
157
157
|
requirements:
|
158
158
|
- - ">="
|
@@ -166,7 +166,7 @@ dependencies:
|
|
166
166
|
- !ruby/object:Gem::Version
|
167
167
|
version: '0'
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
|
-
name: rubocop-
|
169
|
+
name: rubocop-rspec_rails
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
172
|
- - ">="
|
@@ -206,11 +206,35 @@ files:
|
|
206
206
|
- LICENSE
|
207
207
|
- README.md
|
208
208
|
- Rakefile
|
209
|
+
- app/models/active_fields/application_record.rb
|
210
|
+
- app/models/active_fields/field/base.rb
|
211
|
+
- app/models/active_fields/field/boolean.rb
|
212
|
+
- app/models/active_fields/field/date.rb
|
213
|
+
- app/models/active_fields/field/date_array.rb
|
214
|
+
- app/models/active_fields/field/date_time.rb
|
215
|
+
- app/models/active_fields/field/date_time_array.rb
|
216
|
+
- app/models/active_fields/field/decimal.rb
|
217
|
+
- app/models/active_fields/field/decimal_array.rb
|
218
|
+
- app/models/active_fields/field/enum.rb
|
219
|
+
- app/models/active_fields/field/enum_array.rb
|
220
|
+
- app/models/active_fields/field/integer.rb
|
221
|
+
- app/models/active_fields/field/integer_array.rb
|
222
|
+
- app/models/active_fields/field/text.rb
|
223
|
+
- app/models/active_fields/field/text_array.rb
|
224
|
+
- app/models/active_fields/value.rb
|
225
|
+
- app/models/concerns/active_fields/customizable_concern.rb
|
226
|
+
- app/models/concerns/active_fields/field_array_concern.rb
|
227
|
+
- app/models/concerns/active_fields/field_concern.rb
|
228
|
+
- app/models/concerns/active_fields/value_concern.rb
|
229
|
+
- config/routes.rb
|
230
|
+
- db/migrate/20240229230000_create_active_fields_tables.rb
|
209
231
|
- lib/active_fields.rb
|
210
232
|
- lib/active_fields/casters/base_caster.rb
|
211
233
|
- lib/active_fields/casters/boolean_caster.rb
|
212
234
|
- lib/active_fields/casters/date_array_caster.rb
|
213
235
|
- lib/active_fields/casters/date_caster.rb
|
236
|
+
- lib/active_fields/casters/date_time_array_caster.rb
|
237
|
+
- lib/active_fields/casters/date_time_caster.rb
|
214
238
|
- lib/active_fields/casters/decimal_array_caster.rb
|
215
239
|
- lib/active_fields/casters/decimal_caster.rb
|
216
240
|
- lib/active_fields/casters/enum_array_caster.rb
|
@@ -219,26 +243,15 @@ files:
|
|
219
243
|
- lib/active_fields/casters/integer_caster.rb
|
220
244
|
- lib/active_fields/casters/text_array_caster.rb
|
221
245
|
- lib/active_fields/casters/text_caster.rb
|
222
|
-
- lib/active_fields/
|
223
|
-
- lib/active_fields/
|
224
|
-
- lib/active_fields/
|
225
|
-
- lib/active_fields/
|
226
|
-
- lib/active_fields/models/field.rb
|
227
|
-
- lib/active_fields/models/field/boolean.rb
|
228
|
-
- lib/active_fields/models/field/date.rb
|
229
|
-
- lib/active_fields/models/field/date_array.rb
|
230
|
-
- lib/active_fields/models/field/decimal.rb
|
231
|
-
- lib/active_fields/models/field/decimal_array.rb
|
232
|
-
- lib/active_fields/models/field/enum.rb
|
233
|
-
- lib/active_fields/models/field/enum_array.rb
|
234
|
-
- lib/active_fields/models/field/integer.rb
|
235
|
-
- lib/active_fields/models/field/integer_array.rb
|
236
|
-
- lib/active_fields/models/field/text.rb
|
237
|
-
- lib/active_fields/models/field/text_array.rb
|
238
|
-
- lib/active_fields/models/value.rb
|
246
|
+
- lib/active_fields/config.rb
|
247
|
+
- lib/active_fields/customizable_config.rb
|
248
|
+
- lib/active_fields/engine.rb
|
249
|
+
- lib/active_fields/has_active_fields.rb
|
239
250
|
- lib/active_fields/validators/base_validator.rb
|
240
251
|
- lib/active_fields/validators/boolean_validator.rb
|
241
252
|
- lib/active_fields/validators/date_array_validator.rb
|
253
|
+
- lib/active_fields/validators/date_time_array_validator.rb
|
254
|
+
- lib/active_fields/validators/date_time_validator.rb
|
242
255
|
- lib/active_fields/validators/date_validator.rb
|
243
256
|
- lib/active_fields/validators/decimal_array_validator.rb
|
244
257
|
- lib/active_fields/validators/decimal_validator.rb
|
@@ -251,7 +264,7 @@ files:
|
|
251
264
|
- lib/active_fields/version.rb
|
252
265
|
- lib/generators/active_fields/install/USAGE
|
253
266
|
- lib/generators/active_fields/install/install_generator.rb
|
254
|
-
- lib/
|
267
|
+
- lib/tasks/active_fields_tasks.rake
|
255
268
|
- sig/active_fields.rbs
|
256
269
|
homepage: https://github.com/lassoid/active_fields
|
257
270
|
licenses:
|
@@ -275,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
275
288
|
- !ruby/object:Gem::Version
|
276
289
|
version: '0'
|
277
290
|
requirements: []
|
278
|
-
rubygems_version: 3.5.
|
291
|
+
rubygems_version: 3.5.11
|
279
292
|
signing_key:
|
280
293
|
specification_version: 4
|
281
294
|
summary: Add custom fields to ActiveRecord models at runtime.
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Mix-in that provides ActiveRecord models with active fields functionality
|
4
|
-
module ActiveFields
|
5
|
-
module Concern
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
class_methods do
|
9
|
-
def has_active_fields(options = {})
|
10
|
-
include ActiveFields::Customizable
|
11
|
-
|
12
|
-
@__active_fields_options__ = options.dup
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,83 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Mix-in that adds the active fields functionality to the ActiveRecord model
|
4
|
-
module ActiveFields
|
5
|
-
module Customizable
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
# active_values association for the owner record.
|
10
|
-
# We skip built-in autosave because it doesn't work if the owner record isn't changed.
|
11
|
-
# Instead, we implement our own autosave callback: `save_changed_active_values`.
|
12
|
-
has_many :active_values,
|
13
|
-
class_name: "ActiveFields::Value",
|
14
|
-
as: :customizable,
|
15
|
-
inverse_of: :customizable,
|
16
|
-
autosave: false,
|
17
|
-
dependent: :destroy
|
18
|
-
|
19
|
-
# Firstly, we build active_values that hasn't been already created.
|
20
|
-
# Than, we set values for active_values whose values should be changed
|
21
|
-
# according to `active_values_attributes`.
|
22
|
-
before_validation :initialize_active_values
|
23
|
-
|
24
|
-
# Save all changed active_values on the owner record save.
|
25
|
-
after_save :save_changed_active_values
|
26
|
-
|
27
|
-
# We always validate active_values on the owner record change,
|
28
|
-
# as if they are just an ordinary record columns.
|
29
|
-
validates_associated :active_values
|
30
|
-
|
31
|
-
# This virtual attribute is used for setting active_values values.
|
32
|
-
# Keys are active_fields names,
|
33
|
-
# values are values for corresponding active_values of the record.
|
34
|
-
attr_reader :active_values_attributes
|
35
|
-
end
|
36
|
-
|
37
|
-
def active_fields
|
38
|
-
ActiveFields::Field.for(model_name.name)
|
39
|
-
end
|
40
|
-
|
41
|
-
# Convert hash keys to strings for easier access by fields names.
|
42
|
-
def active_values_attributes=(value)
|
43
|
-
@active_values_attributes =
|
44
|
-
if value.respond_to?(:to_h)
|
45
|
-
value.to_h.transform_keys(&:to_s)
|
46
|
-
else
|
47
|
-
value
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
def initialize_active_values
|
54
|
-
active_fields.each do |active_field|
|
55
|
-
active_value =
|
56
|
-
find_active_value_by_field(active_field) ||
|
57
|
-
active_values.new(active_field: active_field, value: active_field.default_value)
|
58
|
-
|
59
|
-
next unless active_values_attributes.is_a?(Hash)
|
60
|
-
next unless active_values_attributes.key?(active_field.name)
|
61
|
-
|
62
|
-
active_value.value = active_values_attributes[active_field.name]
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def save_changed_active_values
|
67
|
-
active_values.each do |active_value|
|
68
|
-
next unless active_value.new_record? || active_value.changed?
|
69
|
-
|
70
|
-
# For new records association id isn't set right, so we force reassignment of the customizable
|
71
|
-
active_value.customizable = self
|
72
|
-
|
73
|
-
# Do not validate active values twice,
|
74
|
-
# because they have already been validated by `validates_associated`.
|
75
|
-
active_value.save!(validate: false)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def find_active_value_by_field(active_field)
|
80
|
-
active_values.find { |active_value| active_value.active_field_id == active_field.id }
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Mix-in with a base logic for the active fields model
|
4
|
-
module ActiveFields
|
5
|
-
module FieldConcern
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
has_many :active_values,
|
10
|
-
class_name: "ActiveFields::Value",
|
11
|
-
foreign_key: :active_field_id,
|
12
|
-
inverse_of: :active_field,
|
13
|
-
dependent: :destroy
|
14
|
-
|
15
|
-
scope :for, ->(customizable_type) { where(customizable_type: customizable_type) }
|
16
|
-
|
17
|
-
validates :type, presence: true
|
18
|
-
validates :name, presence: true, uniqueness: { scope: :customizable_type }
|
19
|
-
validates :name, format: { with: /\A[a-z0-9_]+\z/ }, allow_blank: true
|
20
|
-
validate :validate_default_value
|
21
|
-
|
22
|
-
after_create :add_field_to_records
|
23
|
-
after_initialize :set_defaults
|
24
|
-
end
|
25
|
-
|
26
|
-
def value_validator_class
|
27
|
-
@value_validator_class ||= "ActiveFields::Validators::#{model_name.name.demodulize}Validator".constantize
|
28
|
-
end
|
29
|
-
|
30
|
-
def value_validator
|
31
|
-
value_validator_class.new(self)
|
32
|
-
end
|
33
|
-
|
34
|
-
def value_caster_class
|
35
|
-
@value_caster_class ||= "ActiveFields::Casters::#{model_name.name.demodulize}Caster".constantize
|
36
|
-
end
|
37
|
-
|
38
|
-
def value_caster
|
39
|
-
value_caster_class.new
|
40
|
-
end
|
41
|
-
|
42
|
-
def customizable_model
|
43
|
-
customizable_type.constantize
|
44
|
-
end
|
45
|
-
|
46
|
-
def default_value=(v)
|
47
|
-
super(value_caster.serialize(v))
|
48
|
-
end
|
49
|
-
|
50
|
-
def default_value
|
51
|
-
value_caster.deserialize(super)
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def validate_default_value
|
57
|
-
validator = value_validator
|
58
|
-
return if validator.validate(default_value)
|
59
|
-
|
60
|
-
validator.errors.each do |error|
|
61
|
-
if error.is_a?(Array) && error.size == 2 && error.first.is_a?(Symbol) && error.last.is_a?(Hash)
|
62
|
-
errors.add(:default_value, error.first, **error.last)
|
63
|
-
elsif error.is_a?(Symbol)
|
64
|
-
errors.add(:default_value, *error)
|
65
|
-
else
|
66
|
-
raise ArgumentError
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def add_field_to_records
|
72
|
-
customizable_model.find_each do |record|
|
73
|
-
ActiveFields::Value.create!(active_field: self, customizable: record, value: default_value)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def set_defaults; end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Mix-in with a base logic for the active fields value model
|
4
|
-
module ActiveFields
|
5
|
-
module ValueConcern
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
belongs_to :customizable, polymorphic: true, optional: false, inverse_of: :active_values
|
10
|
-
belongs_to :active_field, class_name: "ActiveFields::Field", optional: false, inverse_of: :active_values
|
11
|
-
|
12
|
-
validates :active_field_id, uniqueness: { scope: %i[customizable_id customizable_type] }
|
13
|
-
validate :validate_value
|
14
|
-
validate :validate_customizable_allowed
|
15
|
-
end
|
16
|
-
|
17
|
-
def value=(v)
|
18
|
-
super(active_field&.value_caster&.serialize(v))
|
19
|
-
end
|
20
|
-
|
21
|
-
def value
|
22
|
-
active_field&.value_caster&.deserialize(super)
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def validate_value
|
28
|
-
return if (validator = active_field&.value_validator).nil?
|
29
|
-
return if validator.validate(value)
|
30
|
-
|
31
|
-
validator.errors.each do |error|
|
32
|
-
if error.is_a?(Array) && error.size == 2 && error.first.is_a?(Symbol) && error.last.is_a?(Hash)
|
33
|
-
errors.add(:value, error.first, **error.last)
|
34
|
-
elsif error.is_a?(Symbol)
|
35
|
-
errors.add(:value, *error)
|
36
|
-
else
|
37
|
-
raise ArgumentError
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def validate_customizable_allowed
|
43
|
-
return true if active_field.nil?
|
44
|
-
return true if customizable_type == active_field.customizable_type
|
45
|
-
|
46
|
-
errors.add(:customizable, :invalid)
|
47
|
-
false
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
|
-
module ActiveFields
|
6
|
-
class Field
|
7
|
-
class DateArray < ActiveFields::Field
|
8
|
-
store_accessor :options, :min_size, :max_size, :min, :max
|
9
|
-
|
10
|
-
# attribute :min_size, :integer
|
11
|
-
# attribute :max_size, :integer
|
12
|
-
# attribute :min, :date
|
13
|
-
# attribute :max, :date
|
14
|
-
|
15
|
-
validates :min_size, comparison: { greater_than_or_equal_to: 0 }, allow_nil: true
|
16
|
-
validates :max_size, comparison: { greater_than_or_equal_to: ->(r) { r.min_size || 0 } }, allow_nil: true
|
17
|
-
validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
|
18
|
-
|
19
|
-
%i[min_size max_size].each do |column|
|
20
|
-
define_method(column) do
|
21
|
-
ActiveFields::Casters::IntegerCaster.new.deserialize(super())
|
22
|
-
end
|
23
|
-
|
24
|
-
define_method(:"#{column}=") do |other|
|
25
|
-
super(ActiveFields::Casters::IntegerCaster.new.serialize(other))
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
%i[min max].each do |column|
|
30
|
-
define_method(column) do
|
31
|
-
ActiveFields::Casters::DateCaster.new.deserialize(super())
|
32
|
-
end
|
33
|
-
|
34
|
-
define_method(:"#{column}=") do |other|
|
35
|
-
super(ActiveFields::Casters::DateCaster.new.serialize(other))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def set_defaults; end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
|
-
module ActiveFields
|
6
|
-
class Field
|
7
|
-
class Decimal < ActiveFields::Field
|
8
|
-
store_accessor :options, :required, :min, :max
|
9
|
-
|
10
|
-
# attribute :required, :boolean, default: false
|
11
|
-
# attribute :min, :decimal
|
12
|
-
# attribute :max, :decimal
|
13
|
-
|
14
|
-
validates :required, exclusion: [nil]
|
15
|
-
validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
|
16
|
-
|
17
|
-
%i[required].each do |column|
|
18
|
-
define_method(column) do
|
19
|
-
ActiveFields::Casters::BooleanCaster.new.deserialize(super())
|
20
|
-
end
|
21
|
-
|
22
|
-
define_method(:"#{column}?") do
|
23
|
-
!!public_send(column)
|
24
|
-
end
|
25
|
-
|
26
|
-
define_method(:"#{column}=") do |other|
|
27
|
-
super(ActiveFields::Casters::BooleanCaster.new.serialize(other))
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
%i[min max].each do |column|
|
32
|
-
define_method(column) do
|
33
|
-
ActiveFields::Casters::DecimalCaster.new.deserialize(super())
|
34
|
-
end
|
35
|
-
|
36
|
-
define_method(:"#{column}=") do |other|
|
37
|
-
super(ActiveFields::Casters::DecimalCaster.new.serialize(other))
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def set_defaults
|
44
|
-
self.required ||= false
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
|
-
module ActiveFields
|
6
|
-
class Field
|
7
|
-
class DecimalArray < ActiveFields::Field
|
8
|
-
store_accessor :options, :min_size, :max_size, :min, :max
|
9
|
-
|
10
|
-
# attribute :min_size, :integer
|
11
|
-
# attribute :max_size, :integer
|
12
|
-
# attribute :min, :decimal
|
13
|
-
# attribute :max, :decimal
|
14
|
-
|
15
|
-
validates :min_size, comparison: { greater_than_or_equal_to: 0 }, allow_nil: true
|
16
|
-
validates :max_size, comparison: { greater_than_or_equal_to: ->(r) { r.min_size || 0 } }, allow_nil: true
|
17
|
-
validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
|
18
|
-
|
19
|
-
%i[min_size max_size].each do |column|
|
20
|
-
define_method(column) do
|
21
|
-
ActiveFields::Casters::IntegerCaster.new.deserialize(super())
|
22
|
-
end
|
23
|
-
|
24
|
-
define_method(:"#{column}=") do |other|
|
25
|
-
super(ActiveFields::Casters::IntegerCaster.new.serialize(other))
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
%i[min max].each do |column|
|
30
|
-
define_method(column) do
|
31
|
-
ActiveFields::Casters::DecimalCaster.new.deserialize(super())
|
32
|
-
end
|
33
|
-
|
34
|
-
define_method(:"#{column}=") do |other|
|
35
|
-
super(ActiveFields::Casters::DecimalCaster.new.serialize(other))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def set_defaults; end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
|
-
module ActiveFields
|
6
|
-
class Field
|
7
|
-
class EnumArray < ActiveFields::Field
|
8
|
-
store_accessor :options, :min_size, :max_size, :allowed_values
|
9
|
-
|
10
|
-
# attribute :min_size, :integer
|
11
|
-
# attribute :max_size, :integer
|
12
|
-
# attribute :allowed_values, :string, array: true, default: []
|
13
|
-
|
14
|
-
validates :min_size, comparison: { greater_than_or_equal_to: 0 }, allow_nil: true
|
15
|
-
validates :max_size, comparison: { greater_than_or_equal_to: ->(r) { r.min_size || 0 } }, allow_nil: true
|
16
|
-
validate :validate_allowed_values
|
17
|
-
|
18
|
-
%i[min_size max_size].each do |column|
|
19
|
-
define_method(column) do
|
20
|
-
ActiveFields::Casters::IntegerCaster.new.deserialize(super())
|
21
|
-
end
|
22
|
-
|
23
|
-
define_method(:"#{column}=") do |other|
|
24
|
-
super(ActiveFields::Casters::IntegerCaster.new.serialize(other))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
%i[allowed_values].each do |column|
|
29
|
-
define_method(column) do
|
30
|
-
ActiveFields::Casters::TextArrayCaster.new.deserialize(super())
|
31
|
-
end
|
32
|
-
|
33
|
-
define_method(:"#{column}=") do |other|
|
34
|
-
super(ActiveFields::Casters::TextArrayCaster.new.serialize(other))
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def validate_allowed_values
|
41
|
-
if allowed_values.nil?
|
42
|
-
errors.add(:allowed_values, :blank)
|
43
|
-
elsif allowed_values.is_a?(Array)
|
44
|
-
if allowed_values.empty?
|
45
|
-
errors.add(:allowed_values, :blank)
|
46
|
-
elsif allowed_values.any? { !_1.is_a?(String) }
|
47
|
-
errors.add(:allowed_values, :invalid)
|
48
|
-
end
|
49
|
-
else
|
50
|
-
errors.add(:allowed_values, :invalid)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def set_defaults
|
55
|
-
self.allowed_values ||= []
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
|
-
module ActiveFields
|
6
|
-
class Field
|
7
|
-
class IntegerArray < ActiveFields::Field
|
8
|
-
store_accessor :options, :min_size, :max_size, :min, :max
|
9
|
-
|
10
|
-
# attribute :min_size, :integer
|
11
|
-
# attribute :max_size, :integer
|
12
|
-
# attribute :min, :integer
|
13
|
-
# attribute :max, :integer
|
14
|
-
|
15
|
-
validates :min_size, comparison: { greater_than_or_equal_to: 0 }, allow_nil: true
|
16
|
-
validates :max_size, comparison: { greater_than_or_equal_to: ->(r) { r.min_size || 0 } }, allow_nil: true
|
17
|
-
validates :max, comparison: { greater_than_or_equal_to: :min }, allow_nil: true, if: :min
|
18
|
-
|
19
|
-
%i[min_size max_size min max].each do |column|
|
20
|
-
define_method(column) do
|
21
|
-
ActiveFields::Casters::IntegerCaster.new.deserialize(super())
|
22
|
-
end
|
23
|
-
|
24
|
-
define_method(:"#{column}=") do |other|
|
25
|
-
super(ActiveFields::Casters::IntegerCaster.new.serialize(other))
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def set_defaults; end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|