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.
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