enumerize 0.8.0 → 2.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +73 -0
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +210 -0
- data/Gemfile +4 -21
- data/Gemfile.global +12 -0
- data/Gemfile.mongo_mapper +6 -0
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/Gemfile.rails70 +9 -0
- data/Gemfile.railsmaster +5 -0
- data/README.md +366 -73
- data/Rakefile +4 -4
- data/enumerize.gemspec +2 -1
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +102 -27
- data/lib/enumerize/attribute.rb +59 -15
- data/lib/enumerize/attribute_map.rb +2 -0
- data/lib/enumerize/base.rb +32 -17
- data/lib/enumerize/hooks/formtastic.rb +7 -9
- data/lib/enumerize/hooks/sequel_dataset.rb +17 -0
- data/lib/enumerize/hooks/simple_form.rb +9 -12
- data/lib/enumerize/hooks/uniqueness.rb +7 -8
- data/lib/enumerize/integrations/rails_admin.rb +3 -1
- data/lib/enumerize/integrations/rspec/matcher.rb +112 -26
- data/lib/enumerize/integrations/rspec.rb +3 -0
- data/lib/enumerize/module.rb +2 -0
- data/lib/enumerize/module_attributes.rb +2 -0
- data/lib/enumerize/mongoid.rb +36 -0
- data/lib/enumerize/predicatable.rb +10 -17
- data/lib/enumerize/predicates.rb +5 -1
- data/lib/enumerize/scope/activerecord.rb +53 -0
- data/lib/enumerize/scope/mongoid.rb +50 -0
- data/lib/enumerize/scope/sequel.rb +56 -0
- data/lib/enumerize/sequel.rb +62 -0
- data/lib/enumerize/set.rb +20 -8
- data/lib/enumerize/utils.rb +12 -0
- data/lib/enumerize/value.rb +20 -20
- data/lib/enumerize/version.rb +3 -1
- data/lib/enumerize.rb +33 -2
- data/lib/sequel/plugins/enumerize.rb +18 -0
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +261 -0
- data/spec/spec_helper.rb +30 -0
- data/test/activemodel_test.rb +114 -0
- data/test/activerecord_test.rb +434 -58
- data/test/attribute_map_test.rb +9 -7
- data/test/attribute_test.rb +52 -23
- data/test/base_test.rb +118 -66
- data/test/formtastic_test.rb +28 -12
- data/test/module_attributes_test.rb +10 -8
- data/test/mongo_mapper_test.rb +26 -11
- data/test/mongoid_test.rb +100 -15
- data/test/multiple_test.rb +41 -12
- data/test/predicates_test.rb +34 -26
- data/test/rails_admin_test.rb +8 -6
- data/test/sequel_test.rb +342 -0
- data/test/set_test.rb +42 -26
- data/test/simple_form_test.rb +25 -1
- data/test/support/mock_controller.rb +6 -0
- data/test/support/shared_enums.rb +43 -0
- data/test/support/view_test_helper.rb +18 -1
- data/test/test_helper.rb +33 -2
- data/test/value_test.rb +79 -28
- metadata +51 -12
- data/.travis.yml +0 -19
- data/Gemfile.rails4 +0 -23
- data/lib/enumerize/form_helper.rb +0 -23
- data/test/rspec_matcher_test.rb +0 -76
- data/test/rspec_spec.rb +0 -13
@@ -1,38 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Integrations
|
3
5
|
module RSpec
|
4
6
|
class Matcher
|
5
|
-
attr_accessor :attr, :values, :subject, :default
|
6
7
|
|
7
|
-
def initialize(
|
8
|
-
self.
|
8
|
+
def initialize(expected_attr)
|
9
|
+
self.expected_attr = expected_attr
|
9
10
|
end
|
10
11
|
|
11
|
-
def in(*
|
12
|
-
self.
|
12
|
+
def in(*expected_values)
|
13
|
+
self.expected_values = expected_values.flatten
|
13
14
|
self
|
14
15
|
end
|
15
16
|
|
16
|
-
def with_default(
|
17
|
-
self.
|
17
|
+
def with_default(expected_default)
|
18
|
+
self.expected_default = expected_default.to_s
|
18
19
|
self
|
19
20
|
end
|
20
21
|
|
21
|
-
def
|
22
|
-
|
23
|
-
|
22
|
+
def with_i18n_scope(expected_i18n_scope)
|
23
|
+
self.expected_i18n_scope = expected_i18n_scope
|
24
|
+
self
|
25
|
+
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
def with_predicates(expected_predicates)
|
28
|
+
self.expected_predicates = expected_predicates
|
29
|
+
self
|
30
|
+
end
|
31
|
+
|
32
|
+
def with_multiple(expected_multiple)
|
33
|
+
self.expected_multiple = expected_multiple
|
34
|
+
self
|
35
|
+
end
|
29
36
|
|
30
|
-
|
37
|
+
def with_scope(expected_scope)
|
38
|
+
self.expected_scope = expected_scope
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def failure_message
|
43
|
+
"Expected #{expectation}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def failure_message_when_negated
|
47
|
+
"Did not expect #{expectation}"
|
31
48
|
end
|
32
49
|
|
33
50
|
def description
|
34
|
-
description = "enumerize :#{
|
35
|
-
description += "
|
51
|
+
description = "define enumerize :#{expected_attr}"
|
52
|
+
description += " in: #{quote_values(expected_values)}" if expected_values
|
53
|
+
description += " with #{expected_default.inspect} as default value" if expected_default
|
54
|
+
description += " i18n_scope: #{expected_i18n_scope.inspect}" if expected_i18n_scope
|
55
|
+
description += " predicates: #{expected_predicates.inspect}" if expected_predicates
|
56
|
+
description += " multiple: #{expected_multiple.inspect}" if expected_multiple
|
57
|
+
description += " scope: #{expected_scope.inspect}" if expected_scope
|
36
58
|
|
37
59
|
description
|
38
60
|
end
|
@@ -41,36 +63,100 @@ module Enumerize
|
|
41
63
|
self.subject = subject
|
42
64
|
matches = true
|
43
65
|
|
44
|
-
matches &=
|
45
|
-
matches &=
|
66
|
+
matches &= matches_attribute?
|
67
|
+
matches &= matches_values? if expected_values
|
68
|
+
matches &= matches_default_value? if expected_default
|
69
|
+
matches &= matches_i18n_scope? if expected_i18n_scope
|
70
|
+
matches &= matches_predicates? if expected_predicates
|
71
|
+
matches &= matches_multiple? if expected_multiple
|
72
|
+
matches &= matches_scope? if expected_scope
|
46
73
|
|
47
74
|
matches
|
48
75
|
end
|
49
76
|
|
50
77
|
private
|
78
|
+
attr_accessor :expected_attr, :expected_values, :subject, :expected_default,
|
79
|
+
:expected_i18n_scope, :expected_predicates, :expected_multiple,
|
80
|
+
:expected_scope
|
81
|
+
|
82
|
+
def expectation
|
83
|
+
"#{subject.class.name} to #{description}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def matches_attribute?
|
87
|
+
attributes.present?
|
88
|
+
end
|
51
89
|
|
52
|
-
def
|
53
|
-
|
90
|
+
def matches_values?
|
91
|
+
matches_array_values? || matches_hash_values?
|
92
|
+
end
|
93
|
+
|
94
|
+
def matches_array_values?
|
95
|
+
sorted_values == enumerized_values
|
96
|
+
end
|
97
|
+
|
98
|
+
def matches_hash_values?
|
99
|
+
return unless expected_values.first.is_a?(Hash)
|
100
|
+
expected_values.first.all? { |k, v| enumerized_value_hash[k.to_s] == v; }
|
54
101
|
end
|
55
102
|
|
56
103
|
def matches_default_value?
|
57
|
-
|
104
|
+
expected_default == enumerized_default
|
105
|
+
end
|
106
|
+
|
107
|
+
def matches_i18n_scope?
|
108
|
+
attributes.i18n_scope == expected_i18n_scope
|
109
|
+
end
|
110
|
+
|
111
|
+
def matches_predicates?
|
112
|
+
if expected_predicates.is_a?(TrueClass)
|
113
|
+
subject.respond_to?("#{enumerized_values.first}?")
|
114
|
+
else
|
115
|
+
subject.respond_to?("#{expected_attr}_#{attributes.values.first}?")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def matches_multiple?
|
120
|
+
subject.public_send(expected_attr).is_a?(Enumerize::Set)
|
121
|
+
end
|
122
|
+
|
123
|
+
def matches_scope?
|
124
|
+
case expected_scope
|
125
|
+
when TrueClass
|
126
|
+
subject_class.respond_to?("with_#{expected_attr}")
|
127
|
+
when :shallow
|
128
|
+
enumerized_values.all? { |value| subject_class.respond_to?(value) }
|
129
|
+
else
|
130
|
+
subject_class.respond_to?(expected_scope[:scope])
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def sorted_values
|
135
|
+
@sorted_values ||=expected_values.map(&:to_s).sort
|
58
136
|
end
|
59
137
|
|
60
138
|
def enumerized_values
|
61
|
-
@enumerized_values ||= attributes
|
139
|
+
@enumerized_values ||= attributes.values.sort
|
62
140
|
end
|
63
141
|
|
64
142
|
def enumerized_default
|
65
|
-
@enumerized_default ||= attributes
|
143
|
+
@enumerized_default ||= attributes.default_value
|
144
|
+
end
|
145
|
+
|
146
|
+
def enumerized_value_hash
|
147
|
+
@enumerized_value_hash ||= attributes.instance_variable_get('@value_hash')
|
66
148
|
end
|
67
149
|
|
68
150
|
def attributes
|
69
|
-
|
151
|
+
subject_class.enumerized_attributes.attributes[expected_attr.to_s]
|
152
|
+
end
|
153
|
+
|
154
|
+
def subject_class
|
155
|
+
@subject_class ||= subject.class
|
70
156
|
end
|
71
157
|
|
72
158
|
def quote_values(values)
|
73
|
-
|
159
|
+
sorted_values.map(&:inspect).join(', ')
|
74
160
|
end
|
75
161
|
end
|
76
162
|
end
|
data/lib/enumerize/module.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enumerize
|
4
|
+
module MongoidSupport
|
5
|
+
def enumerize(name, options={})
|
6
|
+
super
|
7
|
+
|
8
|
+
_enumerize_module.dependent_eval do
|
9
|
+
if self < ::Mongoid::Document
|
10
|
+
include InstanceMethods
|
11
|
+
|
12
|
+
after_initialize :_set_default_value_for_enumerized_attributes
|
13
|
+
end
|
14
|
+
end
|
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
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def _set_default_value_for_enumerized_attribute(attr)
|
31
|
+
super
|
32
|
+
rescue Mongoid::Errors::AttributeNotLoaded
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,30 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Enumerize
|
2
4
|
module Predicatable
|
3
|
-
def method_missing(method, *args, &block)
|
4
|
-
if boolean_method?(method)
|
5
|
-
define_query_methods
|
6
|
-
send(method, *args, &block)
|
7
|
-
else
|
8
|
-
super
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
5
|
def respond_to_missing?(method, include_private=false)
|
13
|
-
|
6
|
+
predicate_method?(method) || super
|
14
7
|
end
|
15
8
|
|
16
9
|
private
|
17
10
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
def method_missing(method, *args, &block)
|
12
|
+
if predicate_method?(method)
|
13
|
+
predicate_call(method[0..-2], *args, &block)
|
14
|
+
else
|
15
|
+
super
|
23
16
|
end
|
24
17
|
end
|
25
18
|
|
26
|
-
def
|
27
|
-
method[-1] == '?' && @attr.
|
19
|
+
def predicate_method?(method)
|
20
|
+
method[-1] == '?' && @attr && @attr.value?(method[0..-2])
|
28
21
|
end
|
29
22
|
end
|
30
23
|
end
|
data/lib/enumerize/predicates.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/core_ext/module/delegation'
|
4
|
+
|
1
5
|
module Enumerize
|
2
6
|
# Predicate methods.
|
3
7
|
#
|
@@ -61,7 +65,7 @@ module Enumerize
|
|
61
65
|
end
|
62
66
|
|
63
67
|
def names
|
64
|
-
values.map { |v| "#{v}?" }
|
68
|
+
values.map { |v| "#{v.tr('-', '_')}?" }
|
65
69
|
end
|
66
70
|
|
67
71
|
def build(klass)
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enumerize
|
4
|
+
module Scope
|
5
|
+
module ActiveRecord
|
6
|
+
def enumerize(name, options={})
|
7
|
+
super
|
8
|
+
|
9
|
+
_enumerize_module.dependent_eval do
|
10
|
+
if self < ::ActiveRecord::Base
|
11
|
+
if options[:scope]
|
12
|
+
_define_activerecord_scope_methods!(name, options)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def _define_activerecord_scope_methods!(name, options)
|
21
|
+
return _define_activerecord_shallow_scopes!(name) if options[:scope] == :shallow
|
22
|
+
|
23
|
+
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
24
|
+
|
25
|
+
define_singleton_method scope_name do |*values|
|
26
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
27
|
+
values = values.first if values.size == 1
|
28
|
+
|
29
|
+
where(name => values)
|
30
|
+
end
|
31
|
+
|
32
|
+
if options[:scope] == true
|
33
|
+
define_singleton_method "without_#{name}" do |*values|
|
34
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
35
|
+
where(arel_table[name].not_in(values))
|
36
|
+
end
|
37
|
+
end
|
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
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enumerize
|
4
|
+
module Scope
|
5
|
+
module Mongoid
|
6
|
+
def enumerize(name, options={})
|
7
|
+
super
|
8
|
+
|
9
|
+
_enumerize_module.dependent_eval do
|
10
|
+
if self < ::Mongoid::Document
|
11
|
+
if options[:scope]
|
12
|
+
_define_mongoid_scope_methods!(name, options)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def _define_mongoid_scope_methods!(name, options)
|
21
|
+
return _define_mongoid_shallow_scopes!(name) if options[:scope] == :shallow
|
22
|
+
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
23
|
+
|
24
|
+
define_singleton_method scope_name do |*values|
|
25
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
26
|
+
self.in(name => values)
|
27
|
+
end
|
28
|
+
|
29
|
+
if options[:scope] == true
|
30
|
+
define_singleton_method "without_#{name}" do |*values|
|
31
|
+
values = enumerized_attributes[name].find_values(*values).map(&:value)
|
32
|
+
not_in(name => values)
|
33
|
+
end
|
34
|
+
end
|
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
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enumerize
|
4
|
+
module Scope
|
5
|
+
module Sequel
|
6
|
+
def enumerize(name, options={})
|
7
|
+
super
|
8
|
+
|
9
|
+
_enumerize_module.dependent_eval do
|
10
|
+
if defined?(::Sequel::Model) && self < ::Sequel::Model
|
11
|
+
if options[:scope]
|
12
|
+
_define_sequel_scope_methods!(name, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'enumerize/hooks/sequel_dataset'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def _define_sequel_scope_methods!(name, options)
|
23
|
+
return _define_sequel_shallow_scopes!(name) if options[:scope] == :shallow
|
24
|
+
|
25
|
+
klass = self
|
26
|
+
scope_name = options[:scope] == true ? "with_#{name}" : options[:scope]
|
27
|
+
|
28
|
+
def_dataset_method scope_name do |*values|
|
29
|
+
values = values.map { |value| klass.enumerized_attributes[name].find_value(value).value }
|
30
|
+
values = values.first if values.size == 1
|
31
|
+
|
32
|
+
where(name => values)
|
33
|
+
end
|
34
|
+
|
35
|
+
if options[:scope] == true
|
36
|
+
def_dataset_method "without_#{name}" do |*values|
|
37
|
+
values = values.map { |value| klass.enumerized_attributes[name].find_value(value).value }
|
38
|
+
exclude(name => values)
|
39
|
+
end
|
40
|
+
end
|
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
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enumerize
|
4
|
+
module SequelSupport
|
5
|
+
def enumerize(name, options={})
|
6
|
+
super
|
7
|
+
|
8
|
+
_enumerize_module.dependent_eval do
|
9
|
+
if defined?(::Sequel::Model) && self < ::Sequel::Model
|
10
|
+
include InstanceMethods
|
11
|
+
|
12
|
+
require 'enumerize/hooks/sequel_dataset'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
module InstanceMethods
|
20
|
+
def validate
|
21
|
+
super
|
22
|
+
|
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
|
+
|
27
|
+
value = read_attribute_for_validation(attr.name)
|
28
|
+
next if value.blank?
|
29
|
+
|
30
|
+
if attr.kind_of? Multiple
|
31
|
+
errors.add attr.name, "is invalid" unless value.respond_to?(:all?) && value.all? { |v| v.blank? || attr.find_value(v) }
|
32
|
+
else
|
33
|
+
errors.add attr.name, "is not included in the list" unless attr.find_value(value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def _set_default_value_for_enumerized_attributes
|
39
|
+
_enumerized_values_for_validation.delete_if do |k, v|
|
40
|
+
v.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
if defined?(Sequel::Plugins::Serialization::InstanceMethods)
|
44
|
+
modules = self.class.ancestors
|
45
|
+
plugin_idx = modules.index(Sequel::Plugins::Serialization::InstanceMethods)
|
46
|
+
|
47
|
+
if plugin_idx && plugin_idx < modules.index(Enumerize::SequelSupport::InstanceMethods)
|
48
|
+
abort "ERROR: You need to enable the Sequel serialization plugin before calling any enumerize methods on a model."
|
49
|
+
end
|
50
|
+
|
51
|
+
plugin_idx = modules.index(Sequel::Plugins::ValidationHelpers::InstanceMethods)
|
52
|
+
|
53
|
+
if plugin_idx && plugin_idx < modules.index(Enumerize::SequelSupport::InstanceMethods)
|
54
|
+
abort "ERROR: You need to enable the Sequel validation_helpers plugin before calling any enumerize methods on a model."
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
super
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/enumerize/set.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/core_ext/module/delegation'
|
4
|
+
|
1
5
|
module Enumerize
|
2
6
|
class Set
|
3
7
|
include Enumerable
|
@@ -8,12 +12,15 @@ module Enumerize
|
|
8
12
|
def initialize(obj, attr, values)
|
9
13
|
@obj = obj
|
10
14
|
@attr = attr
|
11
|
-
@values =
|
15
|
+
@values = []
|
12
16
|
|
13
17
|
if values.respond_to?(:each)
|
14
18
|
values.each do |input|
|
15
19
|
value = @attr.find_value(input)
|
16
|
-
|
20
|
+
|
21
|
+
if value && !@values.include?(value)
|
22
|
+
@values << value
|
23
|
+
end
|
17
24
|
end
|
18
25
|
end
|
19
26
|
end
|
@@ -31,9 +38,14 @@ module Enumerize
|
|
31
38
|
@values.to_a
|
32
39
|
end
|
33
40
|
|
41
|
+
def texts
|
42
|
+
@values.map(&:text)
|
43
|
+
end
|
44
|
+
|
34
45
|
delegate :join, to: :to_ary
|
35
46
|
|
36
47
|
def ==(other)
|
48
|
+
return false unless other.respond_to?(:each)
|
37
49
|
other.size == size && other.all? { |v| @values.include?(@attr.find_value(v)) }
|
38
50
|
end
|
39
51
|
|
@@ -52,14 +64,14 @@ module Enumerize
|
|
52
64
|
"#<Enumerize::Set {#{join(', ')}}>"
|
53
65
|
end
|
54
66
|
|
67
|
+
def encode_with(coder)
|
68
|
+
coder.represent_object(Array, @values)
|
69
|
+
end
|
70
|
+
|
55
71
|
private
|
56
72
|
|
57
|
-
def
|
58
|
-
|
59
|
-
def #{value}?
|
60
|
-
include?("#{value}")
|
61
|
-
end
|
62
|
-
RUBY
|
73
|
+
def predicate_call(value)
|
74
|
+
include?(value)
|
63
75
|
end
|
64
76
|
|
65
77
|
def mutate!
|
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,28 @@ 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
|
31
|
+
end
|
32
|
+
|
33
|
+
def ==(other)
|
34
|
+
super(other.to_s) || value == other
|
18
35
|
end
|
19
36
|
|
20
37
|
def encode_with(coder)
|
@@ -23,25 +40,8 @@ module Enumerize
|
|
23
40
|
|
24
41
|
private
|
25
42
|
|
26
|
-
def
|
27
|
-
|
28
|
-
def #{value}?
|
29
|
-
#{value == self}
|
30
|
-
end
|
31
|
-
RUBY
|
32
|
-
end
|
33
|
-
|
34
|
-
def i18n_keys
|
35
|
-
@i18n_keys ||= begin
|
36
|
-
i18n_keys = i18n_scopes
|
37
|
-
i18n_keys << [:"enumerize.#{@attr.name}.#{self}"]
|
38
|
-
i18n_keys << self.humanize # humanize value if there are no translations
|
39
|
-
i18n_keys.flatten
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def i18n_scopes
|
44
|
-
@attr.i18n_scopes.map { |s| :"#{s}.#{self}" }
|
43
|
+
def predicate_call(value)
|
44
|
+
value == self
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
data/lib/enumerize/version.rb
CHANGED