enumerize 0.8.0 → 2.6.1
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/.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