active_fields 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/.rubocop.yml +3 -15
- data/CHANGELOG.md +7 -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 +4 -6
- data/{lib/active_fields/models → app/models/active_fields}/field/date.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/date_array.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/decimal.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/decimal_array.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/enum.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/enum_array.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/integer.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/integer_array.rb +4 -6
- data/{lib/active_fields/models → app/models/active_fields}/field/text.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/text_array.rb +4 -6
- data/app/models/active_fields/value.rb +15 -0
- data/{lib/active_fields/models/concerns/customizable.rb → app/models/concerns/active_fields/customizable_concern.rb} +6 -4
- data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/field_concern.rb +14 -3
- data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/value_concern.rb +7 -2
- 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} +6 -4
- 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 +0 -2
- data/lib/active_fields/casters/decimal_array_caster.rb +0 -2
- data/lib/active_fields/casters/decimal_caster.rb +0 -2
- data/lib/active_fields/casters/enum_array_caster.rb +0 -2
- data/lib/active_fields/casters/enum_caster.rb +0 -2
- data/lib/active_fields/casters/integer_array_caster.rb +0 -2
- data/lib/active_fields/casters/integer_caster.rb +1 -3
- 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 +50 -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/boolean_validator.rb +0 -2
- data/lib/active_fields/validators/date_array_validator.rb +0 -2
- data/lib/active_fields/validators/date_validator.rb +0 -2
- data/lib/active_fields/validators/decimal_array_validator.rb +0 -2
- data/lib/active_fields/validators/decimal_validator.rb +0 -2
- data/lib/active_fields/validators/enum_array_validator.rb +0 -2
- data/lib/active_fields/validators/enum_validator.rb +0 -2
- data/lib/active_fields/validators/integer_array_validator.rb +0 -2
- data/lib/active_fields/validators/integer_validator.rb +0 -2
- data/lib/active_fields/validators/text_array_validator.rb +0 -2
- data/lib/active_fields/validators/text_validator.rb +0 -2
- data/lib/active_fields/version.rb +1 -1
- data/lib/active_fields.rb +43 -7
- data/lib/tasks/active_fields_tasks.rake +6 -0
- metadata +52 -34
- data/lib/active_fields/models/concerns/concern.rb +0 -16
- data/lib/active_fields/models/field.rb +0 -27
- data/lib/active_fields/models/value.rb +0 -30
- data/lib/generators/active_fields/install/USAGE +0 -5
- data/lib/generators/active_fields/install/install_generator.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aee118ed966e5912d28dcf8cb2d1db0cdd68d85f7d4fc3bcdf267cc5629c7ff3
|
4
|
+
data.tar.gz: 99009dea7a5f940034263a85f5f20f76b84911772677dfc69fe97380bd308563
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca324370030b6028c6a579e4782f37d010e6e01dff7d75054220302e6a36e9aaf35acb30488513f723eadef183ba8fda590890db7bd5f654517ceb03ddfd2a82
|
7
|
+
data.tar.gz: df6501f049664003e9d02571c6f6652b8eaacf92718038e98eea1daae7ee08ddba92a028f737fac5d08042a410f06445ef996bcf418844099d4003d568a53ed5
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require:
|
2
|
+
# - rubocop-factory_bot
|
2
3
|
- rubocop-performance
|
3
4
|
- rubocop-rails
|
4
5
|
- rubocop-rake
|
5
6
|
- rubocop-rspec
|
6
|
-
- rubocop-
|
7
|
+
# - rubocop-rspec_rails
|
7
8
|
|
8
9
|
inherit_gem:
|
9
10
|
rubocop-shopify: rubocop.yml
|
@@ -13,7 +14,7 @@ AllCops:
|
|
13
14
|
TargetRailsVersion: 7.1
|
14
15
|
NewCops: enable
|
15
16
|
Exclude:
|
16
|
-
- "
|
17
|
+
- "spec/dummy/db/schema.rb"
|
17
18
|
|
18
19
|
Layout/EmptyLinesAroundAccessModifier:
|
19
20
|
EnforcedStyle: around
|
@@ -45,16 +46,3 @@ RSpec/ContextWording:
|
|
45
46
|
|
46
47
|
RSpec/MultipleExpectations:
|
47
48
|
Enabled: false
|
48
|
-
|
49
|
-
Rails/ApplicationRecord:
|
50
|
-
Enabled: false
|
51
|
-
|
52
|
-
Rails/Date:
|
53
|
-
Enabled: false
|
54
|
-
|
55
|
-
RSpec/FilePath:
|
56
|
-
Enabled: false
|
57
|
-
|
58
|
-
RSpec/SpecFilePathFormat:
|
59
|
-
Enabled: false
|
60
|
-
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.2.0] - 2024-06-13
|
4
|
+
|
5
|
+
- Rewrited as a Rails plugin!
|
6
|
+
- Custom field types support
|
7
|
+
- Global configuration options for changing field and value classes
|
8
|
+
- Per-model configuration option for enabling specific field types only
|
9
|
+
|
3
10
|
## [0.1.0] - 2024-05-19
|
4
11
|
|
5
12
|
- Initial release
|
data/Rakefile
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveFields
|
4
|
+
module Field
|
5
|
+
# If the field base class has been changed, we should prevent this model from being loaded.
|
6
|
+
# Since we cannot remove it entirely, we will not add any functionality to it.
|
7
|
+
if ActiveFields.config.field_base_class_changed?
|
8
|
+
class Base; end
|
9
|
+
else
|
10
|
+
class Base < ApplicationRecord
|
11
|
+
self.table_name = "active_fields"
|
12
|
+
|
13
|
+
include FieldConcern
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Boolean < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Boolean < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :nullable
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -15,7 +13,7 @@ module ActiveFields
|
|
15
13
|
|
16
14
|
%i[required nullable].each do |column|
|
17
15
|
define_method(column) do
|
18
|
-
|
16
|
+
Casters::BooleanCaster.new.deserialize(super())
|
19
17
|
end
|
20
18
|
|
21
19
|
define_method(:"#{column}?") do
|
@@ -23,7 +21,7 @@ module ActiveFields
|
|
23
21
|
end
|
24
22
|
|
25
23
|
define_method(:"#{column}=") do |other|
|
26
|
-
super(
|
24
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Date < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Date < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min, :max
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -16,7 +14,7 @@ module ActiveFields
|
|
16
14
|
|
17
15
|
%i[required].each do |column|
|
18
16
|
define_method(column) do
|
19
|
-
|
17
|
+
Casters::BooleanCaster.new.deserialize(super())
|
20
18
|
end
|
21
19
|
|
22
20
|
define_method(:"#{column}?") do
|
@@ -24,17 +22,17 @@ module ActiveFields
|
|
24
22
|
end
|
25
23
|
|
26
24
|
define_method(:"#{column}=") do |other|
|
27
|
-
super(
|
25
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
%i[min max].each do |column|
|
32
30
|
define_method(column) do
|
33
|
-
|
31
|
+
Casters::DateCaster.new.deserialize(super())
|
34
32
|
end
|
35
33
|
|
36
34
|
define_method(:"#{column}=") do |other|
|
37
|
-
super(
|
35
|
+
super(Casters::DateCaster.new.serialize(other))
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class DateArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class DateArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min, :max
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -18,21 +16,21 @@ module ActiveFields
|
|
18
16
|
|
19
17
|
%i[min_size max_size].each do |column|
|
20
18
|
define_method(column) do
|
21
|
-
|
19
|
+
Casters::IntegerCaster.new.deserialize(super())
|
22
20
|
end
|
23
21
|
|
24
22
|
define_method(:"#{column}=") do |other|
|
25
|
-
super(
|
23
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
29
27
|
%i[min max].each do |column|
|
30
28
|
define_method(column) do
|
31
|
-
|
29
|
+
Casters::DateCaster.new.deserialize(super())
|
32
30
|
end
|
33
31
|
|
34
32
|
define_method(:"#{column}=") do |other|
|
35
|
-
super(
|
33
|
+
super(Casters::DateCaster.new.serialize(other))
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Decimal < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Decimal < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min, :max
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -16,7 +14,7 @@ module ActiveFields
|
|
16
14
|
|
17
15
|
%i[required].each do |column|
|
18
16
|
define_method(column) do
|
19
|
-
|
17
|
+
Casters::BooleanCaster.new.deserialize(super())
|
20
18
|
end
|
21
19
|
|
22
20
|
define_method(:"#{column}?") do
|
@@ -24,17 +22,17 @@ module ActiveFields
|
|
24
22
|
end
|
25
23
|
|
26
24
|
define_method(:"#{column}=") do |other|
|
27
|
-
super(
|
25
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
%i[min max].each do |column|
|
32
30
|
define_method(column) do
|
33
|
-
|
31
|
+
Casters::DecimalCaster.new.deserialize(super())
|
34
32
|
end
|
35
33
|
|
36
34
|
define_method(:"#{column}=") do |other|
|
37
|
-
super(
|
35
|
+
super(Casters::DecimalCaster.new.serialize(other))
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class DecimalArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class DecimalArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min, :max
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -18,21 +16,21 @@ module ActiveFields
|
|
18
16
|
|
19
17
|
%i[min_size max_size].each do |column|
|
20
18
|
define_method(column) do
|
21
|
-
|
19
|
+
Casters::IntegerCaster.new.deserialize(super())
|
22
20
|
end
|
23
21
|
|
24
22
|
define_method(:"#{column}=") do |other|
|
25
|
-
super(
|
23
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
29
27
|
%i[min max].each do |column|
|
30
28
|
define_method(column) do
|
31
|
-
|
29
|
+
Casters::DecimalCaster.new.deserialize(super())
|
32
30
|
end
|
33
31
|
|
34
32
|
define_method(:"#{column}=") do |other|
|
35
|
-
super(
|
33
|
+
super(Casters::DecimalCaster.new.serialize(other))
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Enum < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Enum < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :allowed_values
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -15,7 +13,7 @@ module ActiveFields
|
|
15
13
|
|
16
14
|
%i[required].each do |column|
|
17
15
|
define_method(column) do
|
18
|
-
|
16
|
+
Casters::BooleanCaster.new.deserialize(super())
|
19
17
|
end
|
20
18
|
|
21
19
|
define_method(:"#{column}?") do
|
@@ -23,17 +21,17 @@ module ActiveFields
|
|
23
21
|
end
|
24
22
|
|
25
23
|
define_method(:"#{column}=") do |other|
|
26
|
-
super(
|
24
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
30
28
|
%i[allowed_values].each do |column|
|
31
29
|
define_method(column) do
|
32
|
-
|
30
|
+
Casters::TextArrayCaster.new.deserialize(super())
|
33
31
|
end
|
34
32
|
|
35
33
|
define_method(:"#{column}=") do |other|
|
36
|
-
super(
|
34
|
+
super(Casters::TextArrayCaster.new.serialize(other))
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class EnumArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class EnumArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :allowed_values
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -17,21 +15,21 @@ module ActiveFields
|
|
17
15
|
|
18
16
|
%i[min_size max_size].each do |column|
|
19
17
|
define_method(column) do
|
20
|
-
|
18
|
+
Casters::IntegerCaster.new.deserialize(super())
|
21
19
|
end
|
22
20
|
|
23
21
|
define_method(:"#{column}=") do |other|
|
24
|
-
super(
|
22
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
26
|
%i[allowed_values].each do |column|
|
29
27
|
define_method(column) do
|
30
|
-
|
28
|
+
Casters::TextArrayCaster.new.deserialize(super())
|
31
29
|
end
|
32
30
|
|
33
31
|
define_method(:"#{column}=") do |other|
|
34
|
-
super(
|
32
|
+
super(Casters::TextArrayCaster.new.serialize(other))
|
35
33
|
end
|
36
34
|
end
|
37
35
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Integer < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Integer < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min, :max
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -16,7 +14,7 @@ module ActiveFields
|
|
16
14
|
|
17
15
|
%i[required].each do |column|
|
18
16
|
define_method(column) do
|
19
|
-
|
17
|
+
Casters::BooleanCaster.new.deserialize(super())
|
20
18
|
end
|
21
19
|
|
22
20
|
define_method(:"#{column}?") do
|
@@ -24,17 +22,17 @@ module ActiveFields
|
|
24
22
|
end
|
25
23
|
|
26
24
|
define_method(:"#{column}=") do |other|
|
27
|
-
super(
|
25
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
%i[min max].each do |column|
|
32
30
|
define_method(column) do
|
33
|
-
|
31
|
+
Casters::IntegerCaster.new.deserialize(super())
|
34
32
|
end
|
35
33
|
|
36
34
|
define_method(:"#{column}=") do |other|
|
37
|
-
super(
|
35
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class IntegerArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class IntegerArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min, :max
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -18,11 +16,11 @@ module ActiveFields
|
|
18
16
|
|
19
17
|
%i[min_size max_size min max].each do |column|
|
20
18
|
define_method(column) do
|
21
|
-
|
19
|
+
Casters::IntegerCaster.new.deserialize(super())
|
22
20
|
end
|
23
21
|
|
24
22
|
define_method(:"#{column}=") do |other|
|
25
|
-
super(
|
23
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Text < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Text < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min_length, :max_length
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -17,7 +15,7 @@ module ActiveFields
|
|
17
15
|
|
18
16
|
%i[required].each do |column|
|
19
17
|
define_method(column) do
|
20
|
-
|
18
|
+
Casters::BooleanCaster.new.deserialize(super())
|
21
19
|
end
|
22
20
|
|
23
21
|
define_method(:"#{column}?") do
|
@@ -25,17 +23,17 @@ module ActiveFields
|
|
25
23
|
end
|
26
24
|
|
27
25
|
define_method(:"#{column}=") do |other|
|
28
|
-
super(
|
26
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
32
30
|
%i[min_length max_length].each do |column|
|
33
31
|
define_method(column) do
|
34
|
-
|
32
|
+
Casters::IntegerCaster.new.deserialize(super())
|
35
33
|
end
|
36
34
|
|
37
35
|
define_method(:"#{column}=") do |other|
|
38
|
-
super(
|
36
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
39
37
|
end
|
40
38
|
end
|
41
39
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class TextArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class TextArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min_length, :max_length
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -19,11 +17,11 @@ module ActiveFields
|
|
19
17
|
|
20
18
|
%i[min_size max_size min_length max_length].each do |column|
|
21
19
|
define_method(column) do
|
22
|
-
|
20
|
+
Casters::IntegerCaster.new.deserialize(super())
|
23
21
|
end
|
24
22
|
|
25
23
|
define_method(:"#{column}=") do |other|
|
26
|
-
super(
|
24
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveFields
|
4
|
+
# If value base class has been changed, we should prevent this model from being loaded.
|
5
|
+
# Since we cannot remove it entirely, we will not add any functionality to it.
|
6
|
+
if ActiveFields.config.value_class_changed?
|
7
|
+
class Value; end
|
8
|
+
else
|
9
|
+
class Value < ApplicationRecord
|
10
|
+
self.table_name = "active_fields_values"
|
11
|
+
|
12
|
+
include ValueConcern
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,20 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Mix-in that adds the active fields functionality to the ActiveRecord model
|
4
3
|
module ActiveFields
|
5
|
-
|
4
|
+
# Mix-in that adds the active fields functionality to the ActiveRecord model
|
5
|
+
module CustomizableConcern
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
9
|
# active_values association for the owner record.
|
10
10
|
# We skip built-in autosave because it doesn't work if the owner record isn't changed.
|
11
11
|
# Instead, we implement our own autosave callback: `save_changed_active_values`.
|
12
|
+
# rubocop:disable Rails/ReflectionClassName
|
12
13
|
has_many :active_values,
|
13
|
-
class_name:
|
14
|
+
class_name: ActiveFields.config.value_class_name,
|
14
15
|
as: :customizable,
|
15
16
|
inverse_of: :customizable,
|
16
17
|
autosave: false,
|
17
18
|
dependent: :destroy
|
19
|
+
# rubocop:enable Rails/ReflectionClassName
|
18
20
|
|
19
21
|
# Firstly, we build active_values that hasn't been already created.
|
20
22
|
# Than, we set values for active_values whose values should be changed
|
@@ -35,7 +37,7 @@ module ActiveFields
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def active_fields
|
38
|
-
ActiveFields
|
40
|
+
ActiveFields.config.field_base_class.for(model_name.name)
|
39
41
|
end
|
40
42
|
|
41
43
|
# Convert hash keys to strings for easier access by fields names.
|
data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/field_concern.rb
RENAMED
@@ -1,16 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Mix-in with a base logic for the active fields model
|
4
3
|
module ActiveFields
|
4
|
+
# Mix-in with a base logic for the active fields model
|
5
5
|
module FieldConcern
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
|
+
# rubocop:disable Rails/ReflectionClassName
|
9
10
|
has_many :active_values,
|
10
|
-
class_name:
|
11
|
+
class_name: ActiveFields.config.value_class_name,
|
11
12
|
foreign_key: :active_field_id,
|
12
13
|
inverse_of: :active_field,
|
13
14
|
dependent: :destroy
|
15
|
+
# rubocop:enable Rails/ReflectionClassName
|
14
16
|
|
15
17
|
scope :for, ->(customizable_type) { where(customizable_type: customizable_type) }
|
16
18
|
|
@@ -18,6 +20,7 @@ module ActiveFields
|
|
18
20
|
validates :name, presence: true, uniqueness: { scope: :customizable_type }
|
19
21
|
validates :name, format: { with: /\A[a-z0-9_]+\z/ }, allow_blank: true
|
20
22
|
validate :validate_default_value
|
23
|
+
validate :validate_customizable_model_allows_type
|
21
24
|
|
22
25
|
after_create :add_field_to_records
|
23
26
|
after_initialize :set_defaults
|
@@ -68,9 +71,17 @@ module ActiveFields
|
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
74
|
+
def validate_customizable_model_allows_type
|
75
|
+
allowed_types = customizable_model.active_fields_config&.types || []
|
76
|
+
return true if ActiveFields.config.fields.values_at(*allowed_types).include?(type)
|
77
|
+
|
78
|
+
errors.add(:customizable_type, :inclusion)
|
79
|
+
false
|
80
|
+
end
|
81
|
+
|
71
82
|
def add_field_to_records
|
72
83
|
customizable_model.find_each do |record|
|
73
|
-
ActiveFields
|
84
|
+
ActiveFields.config.value_class.create!(active_field: self, customizable: record, value: default_value)
|
74
85
|
end
|
75
86
|
end
|
76
87
|
|
data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/value_concern.rb
RENAMED
@@ -1,13 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Mix-in with a base logic for the active fields value model
|
4
3
|
module ActiveFields
|
4
|
+
# Mix-in with a base logic for the active fields value model
|
5
5
|
module ValueConcern
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
9
|
belongs_to :customizable, polymorphic: true, optional: false, inverse_of: :active_values
|
10
|
-
|
10
|
+
# rubocop:disable Rails/ReflectionClassName
|
11
|
+
belongs_to :active_field,
|
12
|
+
class_name: ActiveFields.config.field_base_class_name,
|
13
|
+
optional: false,
|
14
|
+
inverse_of: :active_values
|
15
|
+
# rubocop:enable Rails/ReflectionClassName
|
11
16
|
|
12
17
|
validates :active_field_id, uniqueness: { scope: %i[customizable_id customizable_type] }
|
13
18
|
validate :validate_value
|
data/config/routes.rb
ADDED