enumerize 2.0.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +75 -0
  3. data/CHANGELOG.md +117 -3
  4. data/Gemfile +3 -3
  5. data/Gemfile.global +5 -9
  6. data/Gemfile.mongo_mapper +2 -2
  7. data/Gemfile.rails60 +6 -0
  8. data/Gemfile.rails61 +6 -0
  9. data/Gemfile.rails70 +9 -0
  10. data/Gemfile.railsmaster +5 -0
  11. data/README.md +210 -92
  12. data/Rakefile +9 -3
  13. data/enumerize.gemspec +1 -1
  14. data/lib/enumerize/activemodel.rb +47 -0
  15. data/lib/enumerize/activerecord.rb +92 -6
  16. data/lib/enumerize/attribute.rb +19 -11
  17. data/lib/enumerize/attribute_map.rb +2 -0
  18. data/lib/enumerize/base.rb +22 -18
  19. data/lib/enumerize/hooks/formtastic.rb +4 -1
  20. data/lib/enumerize/hooks/sequel_dataset.rb +2 -0
  21. data/lib/enumerize/hooks/simple_form.rb +4 -1
  22. data/lib/enumerize/hooks/uniqueness.rb +5 -1
  23. data/lib/enumerize/integrations/rails_admin.rb +3 -1
  24. data/lib/enumerize/integrations/rspec/matcher.rb +7 -2
  25. data/lib/enumerize/integrations/rspec.rb +3 -0
  26. data/lib/enumerize/module.rb +2 -0
  27. data/lib/enumerize/module_attributes.rb +2 -0
  28. data/lib/enumerize/mongoid.rb +23 -0
  29. data/lib/enumerize/predicatable.rb +3 -1
  30. data/lib/enumerize/predicates.rb +16 -0
  31. data/lib/enumerize/scope/activerecord.rb +16 -0
  32. data/lib/enumerize/scope/mongoid.rb +15 -0
  33. data/lib/enumerize/scope/sequel.rb +16 -0
  34. data/lib/enumerize/sequel.rb +9 -4
  35. data/lib/enumerize/set.rb +2 -0
  36. data/lib/enumerize/utils.rb +12 -0
  37. data/lib/enumerize/value.rb +14 -15
  38. data/lib/enumerize/version.rb +3 -1
  39. data/lib/enumerize.rb +9 -0
  40. data/lib/sequel/plugins/enumerize.rb +18 -0
  41. data/spec/enumerize/integrations/rspec/matcher_spec.rb +13 -10
  42. data/spec/spec_helper.rb +2 -0
  43. data/test/activemodel_test.rb +114 -0
  44. data/test/activerecord_test.rb +327 -78
  45. data/test/attribute_map_test.rb +9 -7
  46. data/test/attribute_test.rb +37 -34
  47. data/test/base_test.rb +117 -65
  48. data/test/formtastic_test.rb +25 -0
  49. data/test/module_attributes_test.rb +10 -8
  50. data/test/mongo_mapper_test.rb +20 -11
  51. data/test/mongoid_test.rb +52 -23
  52. data/test/multiple_test.rb +27 -19
  53. data/test/predicates_test.rb +51 -29
  54. data/test/rails_admin_test.rb +8 -6
  55. data/test/sequel_test.rb +228 -177
  56. data/test/set_test.rb +29 -27
  57. data/test/simple_form_test.rb +25 -0
  58. data/test/support/mock_controller.rb +6 -0
  59. data/test/support/shared_enums.rb +43 -0
  60. data/test/support/view_test_helper.rb +14 -1
  61. data/test/test_helper.rb +10 -0
  62. data/test/value_test.rb +59 -31
  63. metadata +16 -7
  64. data/.travis.yml +0 -18
  65. 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
- describe Enumerize do
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.must_equal nil
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.with_sex(:male).to_a.must_equal [user_1]
104
- model.with_sex(:female).to_a.must_equal [user_2]
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.without_sex(:male).to_a.must_equal [user_2]
108
- model.without_sex(:female).to_a.must_equal [user_1]
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.having_role(:admin).to_a.must_equal [user_1]
112
- model.having_role(:user).to_a.must_equal [user_2]
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
 
@@ -1,57 +1,65 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
- describe Enumerize::Base do
4
- let(:klass) do
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(klass)
13
+ Class.new(kklass)
12
14
  end
13
15
 
14
- let(:object) { klass.new }
16
+ let(:object) { kklass.new }
15
17
 
16
18
  it 'returns [] when not set' do
17
- klass.enumerize :foos, in: %w(a b), multiple: true
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
- klass.enumerize :foos, in: %w(a b c), multiple: true
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
- klass.enumerize :foos, in: %w(a b c), default: 'b', multiple: true
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
- klass.enumerize :foos, in: %w(a b c), default: %w(b), multiple: true
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
- klass.enumerize :foos, in: %w(a b c), default: %w(b c), multiple: true
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
- klass.enumerize :foos, in: %w(a b c), multiple: true
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
- klass.enumerize :foos, in: %w(a b c), multiple: true
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
- klass.enumerize :foos, in: %w(a b c), multiple: true, scope: true
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
@@ -1,63 +1,85 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
- describe Enumerize::Predicates do
4
- let(:klass) do
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) { klass.new }
14
+ let(:object) { kklass.new }
11
15
 
12
16
  it 'creates predicate methods' do
13
- klass.enumerize(:foo, in: %w(a b), predicates: true)
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
- klass.enumerize(:foo, in: %w(foo-bar bar-foo), predicates: true)
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
- klass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
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
- klass.enumerize(:foo, in: %w(a b), predicates: true)
35
+ kklass.enumerize(:foo, in: %w(a b), predicates: true)
32
36
  object.foo = 'a'
33
- object.a?.must_equal true
34
- object.b?.must_equal false
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
- klass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
42
+ kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
39
43
  object.foo << :a
40
- object.a?.must_equal true
41
- object.b?.must_equal false
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
- klass.enumerize(:foo, in: %w(a b), predicates: { prefix: 'bar' })
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
- klass.enumerize(:foo, in: %w(a b), predicates: { only: :a })
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
- klass.enumerize(:foo, in: %w(a b), predicates: { except: :a })
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
@@ -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(:klass) do
6
+ let(:kklass) do
5
7
  Class.new do
6
8
  extend Enumerize
7
9
  end
8
10
  end
9
11
 
10
- let(:object) { klass.new }
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
- klass.enumerize(:foo, in: [:a, :b])
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
- klass.enumerize(:foo, in: {:a => 1, :b => 2})
22
- object.foo_enum.must_equal [['a text', 1], ['b text', 2]]
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