enumerize 2.0.0 → 2.7.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 +75 -0
- data/CHANGELOG.md +117 -3
- data/Gemfile +3 -3
- data/Gemfile.global +5 -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 +210 -92
- data/Rakefile +9 -3
- data/enumerize.gemspec +1 -1
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +92 -6
- data/lib/enumerize/attribute.rb +19 -11
- data/lib/enumerize/attribute_map.rb +2 -0
- data/lib/enumerize/base.rb +22 -18
- 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 +3 -0
- data/lib/enumerize/module.rb +2 -0
- data/lib/enumerize/module_attributes.rb +2 -0
- data/lib/enumerize/mongoid.rb +23 -0
- data/lib/enumerize/predicatable.rb +3 -1
- data/lib/enumerize/predicates.rb +16 -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 +327 -78
- data/test/attribute_map_test.rb +9 -7
- data/test/attribute_test.rb +37 -34
- data/test/base_test.rb +117 -65
- data/test/formtastic_test.rb +25 -0
- data/test/module_attributes_test.rb +10 -8
- data/test/mongo_mapper_test.rb +20 -11
- data/test/mongoid_test.rb +52 -23
- data/test/multiple_test.rb +27 -19
- data/test/predicates_test.rb +51 -29
- data/test/rails_admin_test.rb +8 -6
- data/test/sequel_test.rb +228 -177
- data/test/set_test.rb +29 -27
- 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 +10 -0
- data/test/value_test.rb +59 -31
- metadata +16 -7
- data/.travis.yml +0 -18
- data/Gemfile.rails42 +0 -6
data/test/mongoid_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
begin
|
@@ -11,17 +13,23 @@ Mongoid.configure do |config|
|
|
11
13
|
config.options = { use_utc: true, include_root_in_json: true }
|
12
14
|
end
|
13
15
|
|
14
|
-
|
16
|
+
class MongoidTest < MiniTest::Spec
|
15
17
|
class MongoidUser
|
16
18
|
include Mongoid::Document
|
17
19
|
extend Enumerize
|
18
20
|
|
19
21
|
field :sex
|
20
22
|
field :role
|
23
|
+
field :foo
|
24
|
+
field :skill
|
25
|
+
|
21
26
|
enumerize :sex, :in => %w[male female], scope: true
|
22
27
|
enumerize :status, :in => %w[notice warning error], scope: true
|
23
28
|
enumerize :role, :in => %w[admin user], :default => 'user', scope: :having_role
|
24
29
|
enumerize :mult, :in => %w[one two three four], :multiple => true
|
30
|
+
enumerize :foo, :in => %w[bar baz], :skip_validations => true
|
31
|
+
enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
|
32
|
+
enumerize :account_type, :in => %w[basic premium], scope: :shallow
|
25
33
|
end
|
26
34
|
|
27
35
|
before { $VERBOSE = nil }
|
@@ -32,7 +40,7 @@ describe Enumerize do
|
|
32
40
|
it 'sets nil if invalid value is passed' do
|
33
41
|
user = model.new
|
34
42
|
user.sex = :invalid
|
35
|
-
user.sex.
|
43
|
+
expect(user.sex).must_be_nil
|
36
44
|
end
|
37
45
|
|
38
46
|
it 'saves value' do
|
@@ -40,7 +48,7 @@ describe Enumerize do
|
|
40
48
|
user = model.new
|
41
49
|
user.sex = :female
|
42
50
|
user.save!
|
43
|
-
user.sex.must_equal 'female'
|
51
|
+
expect(user.sex).must_equal 'female'
|
44
52
|
end
|
45
53
|
|
46
54
|
it 'loads value' do
|
@@ -48,13 +56,13 @@ describe Enumerize do
|
|
48
56
|
model.create!(:sex => :male)
|
49
57
|
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
50
58
|
user = model.first
|
51
|
-
user.sex.must_equal 'male'
|
52
|
-
user.sex_text.must_equal 'Male'
|
59
|
+
expect(user.sex).must_equal 'male'
|
60
|
+
expect(user.sex_text).must_equal 'Male'
|
53
61
|
end
|
54
62
|
end
|
55
63
|
|
56
64
|
it 'has default value' do
|
57
|
-
model.new.role.must_equal 'user'
|
65
|
+
expect(model.new.role).must_equal 'user'
|
58
66
|
end
|
59
67
|
|
60
68
|
it 'uses after_initialize callback to set default value' do
|
@@ -62,7 +70,7 @@ describe Enumerize do
|
|
62
70
|
model.create!(sex: 'male', role: nil)
|
63
71
|
|
64
72
|
user = model.where(sex: 'male').first
|
65
|
-
user.role.must_equal 'user'
|
73
|
+
expect(user.role).must_equal 'user'
|
66
74
|
end
|
67
75
|
|
68
76
|
it 'does not set default value for not selected attributes' do
|
@@ -75,7 +83,21 @@ describe Enumerize do
|
|
75
83
|
it 'validates inclusion' do
|
76
84
|
user = model.new
|
77
85
|
user.role = 'wrong'
|
78
|
-
user.wont_be :valid?
|
86
|
+
expect(user).wont_be :valid?
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'does not validate inclusion when :skip_validations option passed' do
|
90
|
+
user = model.new
|
91
|
+
user.foo = 'wrong'
|
92
|
+
expect(user).must_be :valid?
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'sets value to enumerized field from db when record is reloaded' do
|
96
|
+
user = model.create!(mult: [:one])
|
97
|
+
model.find(user.id).update(mult: %i[two three])
|
98
|
+
expect(user.mult).must_equal %w[one]
|
99
|
+
user.reload
|
100
|
+
expect(user.mult).must_equal %w[two three]
|
79
101
|
end
|
80
102
|
|
81
103
|
it 'assigns value on loaded record' do
|
@@ -83,7 +105,7 @@ describe Enumerize do
|
|
83
105
|
model.create!(:sex => :male)
|
84
106
|
user = model.first
|
85
107
|
user.sex = :female
|
86
|
-
user.sex.must_equal 'female'
|
108
|
+
expect(user.sex).must_equal 'female'
|
87
109
|
end
|
88
110
|
|
89
111
|
it 'loads multiple properly' do
|
@@ -91,25 +113,32 @@ describe Enumerize do
|
|
91
113
|
|
92
114
|
model.create!(:mult => ['one', 'two'])
|
93
115
|
user = model.first
|
94
|
-
user.mult.to_a.must_equal ['one', 'two']
|
116
|
+
expect(user.mult.to_a).must_equal ['one', 'two']
|
95
117
|
end
|
96
118
|
|
97
119
|
it 'adds scope' do
|
98
120
|
model.delete_all
|
99
121
|
|
100
|
-
user_1 = model.create!(sex: :male, role: :admin)
|
101
|
-
user_2 = model.create!(sex: :female, role: :user)
|
122
|
+
user_1 = model.create!(sex: :male, skill: :noob, role: :admin, account_type: :basic)
|
123
|
+
user_2 = model.create!(sex: :female, skill: :noob, role: :user, account_type: :basic)
|
124
|
+
user_3 = model.create!(skill: :pro, account_type: :premium)
|
125
|
+
|
126
|
+
expect(model.with_sex(:male).to_a).must_equal [user_1]
|
127
|
+
expect(model.with_sex(:female).to_a).must_equal [user_2]
|
128
|
+
expect(model.with_sex(:male, :female).to_set).must_equal [user_1, user_2].to_set
|
129
|
+
|
130
|
+
expect(model.without_sex(:male).to_set).must_equal [user_2, user_3].to_set
|
131
|
+
expect(model.without_sex(:female).to_set).must_equal [user_1, user_3].to_set
|
132
|
+
expect(model.without_sex(:male, :female).to_a).must_equal [user_3]
|
102
133
|
|
103
|
-
model.
|
104
|
-
model.
|
105
|
-
model.with_sex(:male, :female).to_set.must_equal [user_1, user_2].to_set
|
134
|
+
expect(model.having_role(:admin).to_a).must_equal [user_1]
|
135
|
+
expect(model.having_role(:user).to_a).must_equal [user_2, user_3]
|
106
136
|
|
107
|
-
model.
|
108
|
-
model.
|
109
|
-
model.without_sex(:male, :female).to_a.must_equal []
|
137
|
+
expect(model.pro.to_a).must_equal [user_3]
|
138
|
+
expect(model.premium.to_a).must_equal [user_3]
|
110
139
|
|
111
|
-
model.
|
112
|
-
model.
|
140
|
+
expect(model.not_pro.to_set).must_equal [user_1, user_2].to_set
|
141
|
+
expect(model.not_premium.to_set).must_equal [user_1, user_2].to_set
|
113
142
|
end
|
114
143
|
|
115
144
|
it 'chains scopes' do
|
@@ -119,14 +148,14 @@ describe Enumerize do
|
|
119
148
|
user_2 = model.create!(status: :warning)
|
120
149
|
user_3 = model.create!(status: :error)
|
121
150
|
|
122
|
-
model.with_status(:notice, :warning).with_status(:notice, :error).to_a.must_equal [user_1]
|
123
|
-
model.with_status(:notice, :warning).union.with_status(:notice, :error).to_a.must_equal [user_1, user_2, user_3]
|
151
|
+
expect(model.with_status(:notice, :warning).with_status(:notice, :error).to_a).must_equal [user_1]
|
152
|
+
expect(model.with_status(:notice, :warning).union.with_status(:notice, :error).to_a).must_equal [user_1, user_2, user_3]
|
124
153
|
end
|
125
154
|
|
126
155
|
it 'ignores not enumerized values that passed to the scope method' do
|
127
156
|
model.delete_all
|
128
157
|
|
129
|
-
model.with_sex(:foo).must_equal []
|
158
|
+
expect(model.with_sex(:foo)).must_equal []
|
130
159
|
end
|
131
160
|
end
|
132
161
|
|
data/test/multiple_test.rb
CHANGED
@@ -1,57 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
|
-
|
4
|
-
let(:
|
5
|
+
class MultipleTest < MiniTest::Spec
|
6
|
+
let(:kklass) do
|
5
7
|
Class.new do
|
6
8
|
extend Enumerize
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
10
12
|
let(:subklass) do
|
11
|
-
Class.new(
|
13
|
+
Class.new(kklass)
|
12
14
|
end
|
13
15
|
|
14
|
-
let(:object) {
|
16
|
+
let(:object) { kklass.new }
|
15
17
|
|
16
18
|
it 'returns [] when not set' do
|
17
|
-
|
18
|
-
object.foos.must_equal []
|
19
|
+
kklass.enumerize :foos, in: %w(a b), multiple: true
|
20
|
+
expect(object.foos).must_equal []
|
19
21
|
end
|
20
22
|
|
21
23
|
it 'returns setted array' do
|
22
|
-
|
24
|
+
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
23
25
|
object.foos = %w(a c)
|
24
|
-
object.foos.must_equal %w(a c)
|
26
|
+
expect(object.foos).must_equal %w(a c)
|
25
27
|
end
|
26
28
|
|
27
29
|
it 'sets default value as single value' do
|
28
|
-
|
29
|
-
object.foos.must_equal %w(b)
|
30
|
+
kklass.enumerize :foos, in: %w(a b c), default: 'b', multiple: true
|
31
|
+
expect(object.foos).must_equal %w(b)
|
30
32
|
end
|
31
33
|
|
32
34
|
it 'sets default value as array of one element' do
|
33
|
-
|
34
|
-
object.foos.must_equal %w(b)
|
35
|
+
kklass.enumerize :foos, in: %w(a b c), default: %w(b), multiple: true
|
36
|
+
expect(object.foos).must_equal %w(b)
|
35
37
|
end
|
36
38
|
|
37
39
|
it 'sets default value as array of several elements' do
|
38
|
-
|
39
|
-
object.foos.must_equal %w(b c)
|
40
|
+
kklass.enumerize :foos, in: %w(a b c), default: %w(b c), multiple: true
|
41
|
+
expect(object.foos).must_equal %w(b c)
|
40
42
|
end
|
41
43
|
|
42
44
|
it "doesn't define _text method" do
|
43
|
-
|
44
|
-
object.wont_respond_to :foos_text
|
45
|
+
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
46
|
+
expect(object).wont_respond_to :foos_text
|
45
47
|
end
|
46
48
|
|
47
49
|
it "doesn't define _value method" do
|
48
|
-
|
49
|
-
object.wont_respond_to :foos_value
|
50
|
+
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
51
|
+
expect(object).wont_respond_to :foos_value
|
50
52
|
end
|
51
53
|
|
52
54
|
it "cannot define multiple with scope" do
|
53
55
|
assert_raises ArgumentError do
|
54
|
-
|
56
|
+
kklass.enumerize :foos, in: %w(a b c), multiple: true, scope: true
|
55
57
|
end
|
56
58
|
end
|
59
|
+
|
60
|
+
it 'assign a name with the first letter capitalized' do
|
61
|
+
kklass.enumerize :Foos, in: %w(a b c), multiple: true
|
62
|
+
object.Foos = %w(a c)
|
63
|
+
expect(object.Foos).must_equal %w(a c)
|
64
|
+
end
|
57
65
|
end
|
data/test/predicates_test.rb
CHANGED
@@ -1,63 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
|
-
|
4
|
-
let(:
|
5
|
+
class PredicatesTest < MiniTest::Spec
|
6
|
+
let(:kklass) do
|
5
7
|
Class.new do
|
6
8
|
extend Enumerize
|
9
|
+
|
10
|
+
def self.c?; end
|
7
11
|
end
|
8
12
|
end
|
9
13
|
|
10
|
-
let(:object) {
|
14
|
+
let(:object) { kklass.new }
|
11
15
|
|
12
16
|
it 'creates predicate methods' do
|
13
|
-
|
14
|
-
object.must_respond_to :a?
|
15
|
-
object.must_respond_to :b?
|
17
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: true)
|
18
|
+
expect(object).must_respond_to :a?
|
19
|
+
expect(object).must_respond_to :b?
|
16
20
|
end
|
17
21
|
|
18
22
|
it 'creates predicate methods when enumerized values have dash in it' do
|
19
|
-
|
20
|
-
object.must_respond_to :foo_bar?
|
21
|
-
object.must_respond_to :bar_foo?
|
23
|
+
kklass.enumerize(:foo, in: %w(foo-bar bar-foo), predicates: true)
|
24
|
+
expect(object).must_respond_to :foo_bar?
|
25
|
+
expect(object).must_respond_to :bar_foo?
|
22
26
|
end
|
23
27
|
|
24
28
|
it 'creates predicate methods on multiple attribute' do
|
25
|
-
|
26
|
-
object.must_respond_to :a?
|
27
|
-
object.must_respond_to :b?
|
29
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
|
30
|
+
expect(object).must_respond_to :a?
|
31
|
+
expect(object).must_respond_to :b?
|
28
32
|
end
|
29
33
|
|
30
34
|
it 'checks values' do
|
31
|
-
|
35
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: true)
|
32
36
|
object.foo = 'a'
|
33
|
-
object.a
|
34
|
-
object.b
|
37
|
+
expect(object.a?).must_equal true
|
38
|
+
expect(object.b?).must_equal false
|
35
39
|
end
|
36
40
|
|
37
41
|
it 'checks values on multiple attribute' do
|
38
|
-
|
42
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
|
39
43
|
object.foo << :a
|
40
|
-
object.a
|
41
|
-
object.b
|
44
|
+
expect(object.a?).must_equal true
|
45
|
+
expect(object.b?).must_equal false
|
42
46
|
end
|
43
47
|
|
44
48
|
it 'prefixes methods' do
|
45
|
-
|
46
|
-
object.wont_respond_to :a?
|
47
|
-
object.wont_respond_to :b?
|
48
|
-
object.must_respond_to :bar_a?
|
49
|
-
object.must_respond_to :bar_b?
|
49
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: { prefix: 'bar' })
|
50
|
+
expect(object).wont_respond_to :a?
|
51
|
+
expect(object).wont_respond_to :b?
|
52
|
+
expect(object).must_respond_to :bar_a?
|
53
|
+
expect(object).must_respond_to :bar_b?
|
50
54
|
end
|
51
55
|
|
52
56
|
it 'accepts only option' do
|
53
|
-
|
54
|
-
object.must_respond_to :a?
|
55
|
-
object.wont_respond_to :b?
|
57
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: { only: :a })
|
58
|
+
expect(object).must_respond_to :a?
|
59
|
+
expect(object).wont_respond_to :b?
|
56
60
|
end
|
57
61
|
|
58
62
|
it 'accepts except option' do
|
59
|
-
|
60
|
-
object.wont_respond_to :a?
|
61
|
-
object.must_respond_to :b?
|
63
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: { except: :a })
|
64
|
+
expect(object).wont_respond_to :a?
|
65
|
+
expect(object).must_respond_to :b?
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'warns if predicate method is already defined' do
|
69
|
+
assert_output(nil, /`c\?` is already defined/) do
|
70
|
+
kklass.enumerize(:bar, in: %w(a b c), predicates: true)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'does not warn if predicate has prefix and does not collide with defined method' do
|
75
|
+
assert_output(nil, '') do
|
76
|
+
kklass.enumerize(:bar, in: %w(a b c), predicates: { prefix: 'bar' })
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'does not warn if predicate method is already defined but enumerize does not generate predicates' do
|
81
|
+
assert_output(nil, '') do
|
82
|
+
kklass.enumerize(:bar, in: %w(a b c))
|
83
|
+
end
|
62
84
|
end
|
63
85
|
end
|
data/test/rails_admin_test.rb
CHANGED
@@ -1,25 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class RailsAdminSpec < MiniTest::Spec
|
4
|
-
let(:
|
6
|
+
let(:kklass) do
|
5
7
|
Class.new do
|
6
8
|
extend Enumerize
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
10
|
-
let(:object) {
|
12
|
+
let(:object) { kklass.new }
|
11
13
|
|
12
14
|
it 'defines enum method' do
|
13
15
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
14
|
-
|
15
|
-
object.foo_enum.must_equal [['a text', 'a'], ['b text', 'b']]
|
16
|
+
kklass.enumerize(:foo, in: [:a, :b])
|
17
|
+
expect(object.foo_enum).must_equal [['a text', 'a'], ['b text', 'b']]
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
21
|
it 'defines enum properly for custom values enumerations' do
|
20
22
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
21
|
-
|
22
|
-
object.foo_enum.must_equal [['a text',
|
23
|
+
kklass.enumerize(:foo, in: {:a => 1, :b => 2})
|
24
|
+
expect(object.foo_enum).must_equal [['a text', 'a'], ['b text', 'b']]
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|