enumerize 2.0.1 → 2.5.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 +5 -5
- data/.github/workflows/ruby.yml +73 -0
- data/CHANGELOG.md +80 -3
- data/Gemfile +3 -3
- data/Gemfile.global +2 -9
- data/Gemfile.mongo_mapper +2 -2
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/Gemfile.rails70 +9 -0
- data/Gemfile.railsmaster +5 -0
- data/README.md +209 -92
- data/Rakefile +2 -0
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +79 -0
- data/lib/enumerize/attribute.rb +19 -11
- data/lib/enumerize/attribute_map.rb +2 -0
- data/lib/enumerize/base.rb +6 -6
- data/lib/enumerize/hooks/formtastic.rb +4 -1
- data/lib/enumerize/hooks/sequel_dataset.rb +2 -0
- data/lib/enumerize/hooks/simple_form.rb +4 -1
- data/lib/enumerize/hooks/uniqueness.rb +5 -1
- data/lib/enumerize/integrations/rails_admin.rb +3 -1
- data/lib/enumerize/integrations/rspec/matcher.rb +7 -2
- data/lib/enumerize/integrations/rspec.rb +2 -0
- data/lib/enumerize/module.rb +2 -0
- data/lib/enumerize/module_attributes.rb +2 -0
- data/lib/enumerize/mongoid.rb +16 -0
- data/lib/enumerize/predicatable.rb +3 -1
- data/lib/enumerize/predicates.rb +2 -0
- data/lib/enumerize/scope/activerecord.rb +16 -0
- data/lib/enumerize/scope/mongoid.rb +15 -0
- data/lib/enumerize/scope/sequel.rb +16 -0
- data/lib/enumerize/sequel.rb +9 -4
- data/lib/enumerize/set.rb +2 -0
- data/lib/enumerize/utils.rb +12 -0
- data/lib/enumerize/value.rb +14 -15
- data/lib/enumerize/version.rb +3 -1
- data/lib/enumerize.rb +9 -0
- data/lib/sequel/plugins/enumerize.rb +18 -0
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +13 -10
- data/spec/spec_helper.rb +2 -0
- data/test/activemodel_test.rb +114 -0
- data/test/activerecord_test.rb +277 -79
- data/test/attribute_map_test.rb +9 -7
- data/test/attribute_test.rb +37 -30
- data/test/base_test.rb +66 -64
- data/test/formtastic_test.rb +25 -0
- data/test/module_attributes_test.rb +10 -8
- data/test/mongo_mapper_test.rb +19 -10
- data/test/mongoid_test.rb +51 -22
- data/test/multiple_test.rb +26 -18
- data/test/predicates_test.rb +30 -28
- data/test/rails_admin_test.rb +8 -6
- data/test/sequel_test.rb +111 -58
- data/test/set_test.rb +28 -26
- data/test/simple_form_test.rb +25 -0
- data/test/support/mock_controller.rb +6 -0
- data/test/support/shared_enums.rb +43 -0
- data/test/support/view_test_helper.rb +14 -1
- data/test/test_helper.rb +2 -0
- data/test/value_test.rb +51 -30
- metadata +14 -27
- data/.travis.yml +0 -18
- data/Gemfile.rails42 +0 -6
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module ActiveRecordSupport
|
3
5
|
def enumerize(name, options={})
|
@@ -17,6 +19,22 @@ module Enumerize
|
|
17
19
|
|
18
20
|
# https://github.com/brainspec/enumerize/issues/111
|
19
21
|
require 'enumerize/hooks/uniqueness'
|
22
|
+
|
23
|
+
unless options[:multiple]
|
24
|
+
if ::ActiveRecord.version >= ::Gem::Version.new("7.0.0.alpha")
|
25
|
+
attribute(name) do |subtype|
|
26
|
+
Type.new(enumerized_attributes[name], subtype)
|
27
|
+
end
|
28
|
+
elsif ::ActiveRecord.version >= ::Gem::Version.new("6.1.0.alpha")
|
29
|
+
decorate_attribute_type(name.to_s) do |subtype|
|
30
|
+
Type.new(enumerized_attributes[name], subtype)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
decorate_attribute_type(name, :enumerize) do |subtype|
|
34
|
+
Type.new(enumerized_attributes[name], subtype)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
20
38
|
end
|
21
39
|
end
|
22
40
|
end
|
@@ -44,6 +62,28 @@ module Enumerize
|
|
44
62
|
|
45
63
|
became
|
46
64
|
end
|
65
|
+
|
66
|
+
def reload(options = nil)
|
67
|
+
reloaded = super
|
68
|
+
|
69
|
+
reloaded.class.enumerized_attributes.each do |attr|
|
70
|
+
begin
|
71
|
+
# Checks first if the enumerized attribute is in ActiveRecord::Store
|
72
|
+
store_attr, _ = reloaded.class.stored_attributes.detect do |_store_attr, keys|
|
73
|
+
keys.include?(attr.name)
|
74
|
+
end
|
75
|
+
|
76
|
+
if store_attr.present?
|
77
|
+
reloaded.send("#{attr.name}=", reloaded.send(store_attr).with_indifferent_access[attr.name])
|
78
|
+
else
|
79
|
+
reloaded.send("#{attr.name}=", reloaded[attr.name])
|
80
|
+
end
|
81
|
+
rescue ActiveModel::MissingAttributeError
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
reloaded
|
86
|
+
end
|
47
87
|
end
|
48
88
|
|
49
89
|
module RelationMethods
|
@@ -59,5 +99,44 @@ module Enumerize
|
|
59
99
|
super(updates)
|
60
100
|
end
|
61
101
|
end
|
102
|
+
|
103
|
+
class Type < ActiveRecord::Type::Value
|
104
|
+
delegate :type, to: :@subtype
|
105
|
+
|
106
|
+
def initialize(attr, subtype)
|
107
|
+
@attr = attr
|
108
|
+
@subtype = subtype
|
109
|
+
end
|
110
|
+
|
111
|
+
def serialize(value)
|
112
|
+
v = @attr.find_value(value)
|
113
|
+
(v && v.value) || value
|
114
|
+
end
|
115
|
+
|
116
|
+
alias type_cast_for_database serialize
|
117
|
+
|
118
|
+
def deserialize(value)
|
119
|
+
@attr.find_value(value)
|
120
|
+
end
|
121
|
+
|
122
|
+
alias type_cast_from_database deserialize
|
123
|
+
|
124
|
+
def as_json(options = nil)
|
125
|
+
{attr: @attr.name, subtype: @subtype}.as_json(options)
|
126
|
+
end
|
127
|
+
|
128
|
+
def encode_with(coder)
|
129
|
+
coder[:class_name] = @attr.klass.name
|
130
|
+
coder[:attr_name] = @attr.name
|
131
|
+
coder[:subtype] = @subtype
|
132
|
+
end
|
133
|
+
|
134
|
+
def init_with(coder)
|
135
|
+
initialize(
|
136
|
+
coder[:class_name].constantize.enumerized_attributes[coder[:attr_name]],
|
137
|
+
coder[:subtype]
|
138
|
+
)
|
139
|
+
end
|
140
|
+
end
|
62
141
|
end
|
63
142
|
end
|
data/lib/enumerize/attribute.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
class Attribute
|
3
|
-
attr_reader :name, :values, :default_value, :i18n_scope
|
5
|
+
attr_reader :klass, :name, :values, :default_value, :i18n_scope, :skip_validations_value
|
4
6
|
|
5
7
|
def initialize(klass, name, options={})
|
6
8
|
raise ArgumentError, ':in option is required' unless options[:in]
|
@@ -11,21 +13,23 @@ module Enumerize
|
|
11
13
|
@klass = klass
|
12
14
|
@name = name.to_sym
|
13
15
|
|
14
|
-
value_class = options.fetch(:value_class, Value)
|
15
|
-
@values = Array(options[:in]).map { |v| value_class.new(self, *v) }
|
16
|
-
|
17
|
-
@value_hash = Hash[@values.map { |v| [v.value.to_s, v] }]
|
18
|
-
@value_hash.merge! Hash[@values.map { |v| [v.to_s, v] }]
|
19
|
-
|
20
16
|
if options[:i18n_scope]
|
21
17
|
raise ArgumentError, ':i18n_scope option accepts only String or Array of strings' unless Array(options[:i18n_scope]).all? { |s| s.is_a?(String) }
|
22
18
|
@i18n_scope = options[:i18n_scope]
|
23
19
|
end
|
24
20
|
|
21
|
+
value_class = options.fetch(:value_class, Value)
|
22
|
+
@values = Array(options[:in]).map { |v| value_class.new(self, *v).freeze }
|
23
|
+
|
24
|
+
@value_hash = Hash[@values.map { |v| [v.value.to_s, v] }]
|
25
|
+
@value_hash.merge! Hash[@values.map { |v| [v.to_s, v] }]
|
26
|
+
|
25
27
|
if options[:default]
|
26
28
|
@default_value = find_default_value(options[:default])
|
27
29
|
raise ArgumentError, 'invalid default value' unless @default_value
|
28
30
|
end
|
31
|
+
|
32
|
+
@skip_validations_value = options.fetch(:skip_validations, false)
|
29
33
|
end
|
30
34
|
|
31
35
|
def find_default_value(value)
|
@@ -44,11 +48,15 @@ module Enumerize
|
|
44
48
|
values.map { |value| find_value(value) }.compact
|
45
49
|
end
|
46
50
|
|
51
|
+
def each_value
|
52
|
+
values.each { |value| yield value }
|
53
|
+
end
|
54
|
+
|
47
55
|
def i18n_scopes
|
48
56
|
@i18n_scopes ||= if i18n_scope
|
49
|
-
|
57
|
+
Array(i18n_scope)
|
50
58
|
elsif @klass.respond_to?(:model_name)
|
51
|
-
|
59
|
+
["enumerize.#{@klass.model_name.i18n_key}.#{name}"]
|
52
60
|
else
|
53
61
|
[]
|
54
62
|
end
|
@@ -164,7 +172,7 @@ module Enumerize
|
|
164
172
|
|
165
173
|
def #{name}=(values)
|
166
174
|
@_#{name}_enumerized_set = Enumerize::Set.new(self, self.class.enumerized_attributes[:#{name}], values)
|
167
|
-
raw_values =
|
175
|
+
raw_values = self.#{name}.values.map(&:value)
|
168
176
|
|
169
177
|
if defined?(super)
|
170
178
|
super raw_values
|
@@ -176,7 +184,7 @@ module Enumerize
|
|
176
184
|
|
177
185
|
_enumerized_values_for_validation['#{name}'] = values.respond_to?(:map) ? values.reject(&:blank?).map(&:to_s) : values
|
178
186
|
|
179
|
-
|
187
|
+
self.#{name}
|
180
188
|
end
|
181
189
|
RUBY
|
182
190
|
end
|
data/lib/enumerize/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Base
|
3
5
|
def self.included(base)
|
@@ -72,6 +74,9 @@ module Enumerize
|
|
72
74
|
|
73
75
|
def _validate_enumerized_attributes
|
74
76
|
self.class.enumerized_attributes.each do |attr|
|
77
|
+
skip_validations = Utils.call_if_callable(attr.skip_validations_value, self)
|
78
|
+
next if skip_validations
|
79
|
+
|
75
80
|
value = read_attribute_for_validation(attr.name)
|
76
81
|
next if value.blank?
|
77
82
|
|
@@ -96,12 +101,7 @@ module Enumerize
|
|
96
101
|
value_for_validation = _enumerized_values_for_validation[attr.name.to_s]
|
97
102
|
|
98
103
|
if (!attr_value || attr_value.empty?) && (!value_for_validation || value_for_validation.empty?)
|
99
|
-
value = attr.default_value
|
100
|
-
|
101
|
-
if value.respond_to?(:call)
|
102
|
-
value = value.arity == 0 ? value.call : value.call(self)
|
103
|
-
end
|
104
|
-
|
104
|
+
value = Utils.call_if_callable(attr.default_value, self)
|
105
105
|
public_send("#{attr.name}=", value)
|
106
106
|
end
|
107
107
|
rescue ActiveModel::MissingAttributeError
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Enumerize
|
@@ -5,7 +7,8 @@ module Enumerize
|
|
5
7
|
module FormtasticFormBuilderExtension
|
6
8
|
|
7
9
|
def input(method, options={})
|
8
|
-
|
10
|
+
enumerized_object = convert_to_model(object)
|
11
|
+
klass = enumerized_object.class
|
9
12
|
|
10
13
|
if klass.respond_to?(:enumerized_attributes) && (attr = klass.enumerized_attributes[method])
|
11
14
|
options[:collection] ||= attr.options
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Enumerize
|
@@ -17,7 +19,8 @@ module Enumerize
|
|
17
19
|
private
|
18
20
|
|
19
21
|
def add_input_options_for_enumerized_attribute(attribute_name, options)
|
20
|
-
|
22
|
+
enumerized_object = convert_to_model(object)
|
23
|
+
klass = enumerized_object.class
|
21
24
|
|
22
25
|
if klass.respond_to?(:enumerized_attributes) && (attr = klass.enumerized_attributes[attribute_name])
|
23
26
|
options[:collection] ||= attr.options
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
|
3
5
|
module Enumerize
|
@@ -5,7 +7,9 @@ module Enumerize
|
|
5
7
|
module UniquenessValidator
|
6
8
|
|
7
9
|
def validate_each(record, name, value)
|
8
|
-
|
10
|
+
klass = record.to_model.class
|
11
|
+
|
12
|
+
if klass.respond_to?(:enumerized_attributes) && (attr = klass.enumerized_attributes[name])
|
9
13
|
value = attr.find_value(value).try(:value)
|
10
14
|
end
|
11
15
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Integrations
|
3
5
|
module RailsAdmin
|
@@ -7,7 +9,7 @@ module Enumerize
|
|
7
9
|
|
8
10
|
_enumerize_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
9
11
|
def #{name}_enum
|
10
|
-
self.class.enumerized_attributes[:#{name}].
|
12
|
+
self.class.enumerized_attributes[:#{name}].options
|
11
13
|
end
|
12
14
|
RUBY
|
13
15
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Integrations
|
3
5
|
module RSpec
|
@@ -108,7 +110,7 @@ module Enumerize
|
|
108
110
|
|
109
111
|
def matches_predicates?
|
110
112
|
if expected_predicates.is_a?(TrueClass)
|
111
|
-
subject.respond_to?("#{
|
113
|
+
subject.respond_to?("#{enumerized_values.first}?")
|
112
114
|
else
|
113
115
|
subject.respond_to?("#{expected_attr}_#{attributes.values.first}?")
|
114
116
|
end
|
@@ -119,8 +121,11 @@ module Enumerize
|
|
119
121
|
end
|
120
122
|
|
121
123
|
def matches_scope?
|
122
|
-
|
124
|
+
case expected_scope
|
125
|
+
when TrueClass
|
123
126
|
subject_class.respond_to?("with_#{expected_attr}")
|
127
|
+
when :shallow
|
128
|
+
enumerized_values.all? { |value| subject_class.respond_to?(value) }
|
124
129
|
else
|
125
130
|
subject_class.respond_to?(expected_scope[:scope])
|
126
131
|
end
|
data/lib/enumerize/module.rb
CHANGED
data/lib/enumerize/mongoid.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module MongoidSupport
|
3
5
|
def enumerize(name, options={})
|
@@ -5,9 +7,23 @@ module Enumerize
|
|
5
7
|
|
6
8
|
_enumerize_module.dependent_eval do
|
7
9
|
if self < ::Mongoid::Document
|
10
|
+
include InstanceMethods
|
11
|
+
|
8
12
|
after_initialize :_set_default_value_for_enumerized_attributes
|
9
13
|
end
|
10
14
|
end
|
11
15
|
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
def reload
|
19
|
+
reloaded = super
|
20
|
+
|
21
|
+
reloaded.class.enumerized_attributes.each do |attr|
|
22
|
+
reloaded.send("#{attr.name}=", reloaded[attr.name])
|
23
|
+
end
|
24
|
+
|
25
|
+
reloaded
|
26
|
+
end
|
27
|
+
end
|
12
28
|
end
|
13
29
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Predicatable
|
3
5
|
def respond_to_missing?(method, include_private=false)
|
@@ -15,7 +17,7 @@ module Enumerize
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def predicate_method?(method)
|
18
|
-
method[-1] == '?' && @attr.values.include?(method[0..-2])
|
20
|
+
method[-1] == '?' && @attr && @attr.values.include?(method[0..-2])
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
data/lib/enumerize/predicates.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Scope
|
3
5
|
module ActiveRecord
|
@@ -16,6 +18,8 @@ module Enumerize
|
|
16
18
|
private
|
17
19
|
|
18
20
|
def _define_activerecord_scope_methods!(name, options)
|
21
|
+
return _define_activerecord_shallow_scopes!(name) if options[:scope] == :shallow
|
22
|
+
|
19
23
|
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
20
24
|
|
21
25
|
define_singleton_method scope_name do |*values|
|
@@ -32,6 +36,18 @@ module Enumerize
|
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
39
|
+
|
40
|
+
def _define_activerecord_shallow_scopes!(attribute_name)
|
41
|
+
enumerized_attributes[attribute_name].each_value do |value_obj|
|
42
|
+
define_singleton_method(value_obj) do
|
43
|
+
where(attribute_name => value_obj.value)
|
44
|
+
end
|
45
|
+
|
46
|
+
define_singleton_method("not_#{value_obj}") do
|
47
|
+
where.not(attribute_name => value_obj.value)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
35
51
|
end
|
36
52
|
end
|
37
53
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Scope
|
3
5
|
module Mongoid
|
@@ -16,6 +18,7 @@ module Enumerize
|
|
16
18
|
private
|
17
19
|
|
18
20
|
def _define_mongoid_scope_methods!(name, options)
|
21
|
+
return _define_mongoid_shallow_scopes!(name) if options[:scope] == :shallow
|
19
22
|
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
20
23
|
|
21
24
|
define_singleton_method scope_name do |*values|
|
@@ -30,6 +33,18 @@ module Enumerize
|
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
36
|
+
|
37
|
+
def _define_mongoid_shallow_scopes!(attribute_name)
|
38
|
+
enumerized_attributes[attribute_name].each_value do |value_obj|
|
39
|
+
define_singleton_method(value_obj) do
|
40
|
+
self.in(attribute_name => value_obj.value)
|
41
|
+
end
|
42
|
+
|
43
|
+
define_singleton_method("not_#{value_obj}") do
|
44
|
+
self.not_in(attribute_name => value_obj.value)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
33
48
|
end
|
34
49
|
end
|
35
50
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Scope
|
3
5
|
module Sequel
|
@@ -18,6 +20,8 @@ module Enumerize
|
|
18
20
|
private
|
19
21
|
|
20
22
|
def _define_sequel_scope_methods!(name, options)
|
23
|
+
return _define_sequel_shallow_scopes!(name) if options[:scope] == :shallow
|
24
|
+
|
21
25
|
klass = self
|
22
26
|
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
23
27
|
|
@@ -35,6 +39,18 @@ module Enumerize
|
|
35
39
|
end
|
36
40
|
end
|
37
41
|
end
|
42
|
+
|
43
|
+
def _define_sequel_shallow_scopes!(attribute_name)
|
44
|
+
enumerized_attributes[attribute_name].each_value do |value_obj|
|
45
|
+
def_dataset_method(value_obj) do
|
46
|
+
where(attribute_name => value_obj.value.to_s)
|
47
|
+
end
|
48
|
+
|
49
|
+
def_dataset_method("not_#{value_obj}") do
|
50
|
+
exclude(attribute_name => value_obj.value.to_s)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
38
54
|
end
|
39
55
|
end
|
40
56
|
end
|
data/lib/enumerize/sequel.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module SequelSupport
|
3
5
|
def enumerize(name, options={})
|
@@ -17,8 +19,11 @@ module Enumerize
|
|
17
19
|
module InstanceMethods
|
18
20
|
def validate
|
19
21
|
super
|
20
|
-
|
22
|
+
|
21
23
|
self.class.enumerized_attributes.each do |attr|
|
24
|
+
skip_validations = Utils.call_if_callable(attr.skip_validations_value, self)
|
25
|
+
next if skip_validations
|
26
|
+
|
22
27
|
value = read_attribute_for_validation(attr.name)
|
23
28
|
next if value.blank?
|
24
29
|
|
@@ -38,13 +43,13 @@ module Enumerize
|
|
38
43
|
if defined?(Sequel::Plugins::Serialization::InstanceMethods)
|
39
44
|
modules = self.class.ancestors
|
40
45
|
plugin_idx = modules.index(Sequel::Plugins::Serialization::InstanceMethods)
|
41
|
-
|
46
|
+
|
42
47
|
if plugin_idx && plugin_idx < modules.index(Enumerize::SequelSupport::InstanceMethods)
|
43
48
|
abort "ERROR: You need to enable the Sequel serialization plugin before calling any enumerize methods on a model."
|
44
49
|
end
|
45
|
-
|
50
|
+
|
46
51
|
plugin_idx = modules.index(Sequel::Plugins::ValidationHelpers::InstanceMethods)
|
47
|
-
|
52
|
+
|
48
53
|
if plugin_idx && plugin_idx < modules.index(Enumerize::SequelSupport::InstanceMethods)
|
49
54
|
abort "ERROR: You need to enable the Sequel validation_helpers plugin before calling any enumerize methods on a model."
|
50
55
|
end
|
data/lib/enumerize/set.rb
CHANGED
data/lib/enumerize/value.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'i18n'
|
4
|
+
require 'active_support/inflector'
|
2
5
|
|
3
6
|
module Enumerize
|
4
7
|
class Value < String
|
@@ -7,14 +10,24 @@ module Enumerize
|
|
7
10
|
attr_reader :value
|
8
11
|
|
9
12
|
def initialize(attr, name, value=nil)
|
13
|
+
if self.class.method_defined?("#{name}?")
|
14
|
+
warn("It's not recommended to use `#{name}` as a field value since `#{name}?` is defined. (#{attr.klass.name}##{attr.name})")
|
15
|
+
end
|
16
|
+
|
10
17
|
@attr = attr
|
11
18
|
@value = value.nil? ? name.to_s : value
|
12
19
|
|
13
20
|
super(name.to_s)
|
21
|
+
|
22
|
+
@i18n_keys = @attr.i18n_scopes.map { |s| :"#{s}.#{self}" }
|
23
|
+
@i18n_keys << :"enumerize.defaults.#{@attr.name}.#{self}"
|
24
|
+
@i18n_keys << :"enumerize.#{@attr.name}.#{self}"
|
25
|
+
@i18n_keys << ActiveSupport::Inflector.humanize(ActiveSupport::Inflector.underscore(self)) # humanize value if there are no translations
|
26
|
+
@i18n_keys
|
14
27
|
end
|
15
28
|
|
16
29
|
def text
|
17
|
-
I18n.t(i18n_keys[0], :default => i18n_keys[1..-1])
|
30
|
+
I18n.t(@i18n_keys[0], :default => @i18n_keys[1..-1]) if @i18n_keys
|
18
31
|
end
|
19
32
|
|
20
33
|
def ==(other)
|
@@ -30,19 +43,5 @@ module Enumerize
|
|
30
43
|
def predicate_call(value)
|
31
44
|
value == self
|
32
45
|
end
|
33
|
-
|
34
|
-
def i18n_keys
|
35
|
-
@i18n_keys ||= begin
|
36
|
-
i18n_keys = i18n_scopes
|
37
|
-
i18n_keys << :"enumerize.defaults.#{@attr.name}.#{self}"
|
38
|
-
i18n_keys << :"enumerize.#{@attr.name}.#{self}"
|
39
|
-
i18n_keys << self.underscore.humanize # humanize value if there are no translations
|
40
|
-
i18n_keys
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def i18n_scopes
|
45
|
-
@attr.i18n_scopes.map { |s| :"#{s}.#{self}" }
|
46
|
-
end
|
47
46
|
end
|
48
47
|
end
|
data/lib/enumerize/version.rb
CHANGED
data/lib/enumerize.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
4
|
+
require 'active_support/core_ext/object/blank'
|
2
5
|
require 'enumerize/version'
|
3
6
|
|
4
7
|
module Enumerize
|
@@ -10,8 +13,10 @@ module Enumerize
|
|
10
13
|
autoload :Module, 'enumerize/module'
|
11
14
|
autoload :Predicates, 'enumerize/predicates'
|
12
15
|
autoload :Predicatable, 'enumerize/predicatable'
|
16
|
+
autoload :Utils, 'enumerize/utils'
|
13
17
|
autoload :ModuleAttributes, 'enumerize/module_attributes'
|
14
18
|
|
19
|
+
autoload :ActiveModelAttributesSupport, 'enumerize/activemodel'
|
15
20
|
autoload :ActiveRecordSupport, 'enumerize/activerecord'
|
16
21
|
autoload :SequelSupport, 'enumerize/sequel'
|
17
22
|
autoload :MongoidSupport, 'enumerize/mongoid'
|
@@ -31,6 +36,10 @@ module Enumerize
|
|
31
36
|
base.send :include, Enumerize::Base
|
32
37
|
base.extend Enumerize::Predicates
|
33
38
|
|
39
|
+
if defined?(::ActiveModel::Attributes)
|
40
|
+
base.extend Enumerize::ActiveModelAttributesSupport
|
41
|
+
end
|
42
|
+
|
34
43
|
if defined?(::ActiveRecord::Base)
|
35
44
|
base.extend Enumerize::ActiveRecordSupport
|
36
45
|
base.extend Enumerize::Scope::ActiveRecord
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module Plugins
|
5
|
+
module Enumerize
|
6
|
+
# Depend on the def_dataset_method plugin
|
7
|
+
def self.apply(model)
|
8
|
+
model.plugin(:def_dataset_method) unless model.respond_to?(:def_dataset_method)
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
def self.included(base)
|
13
|
+
base.extend ::Enumerize
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|