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.
Files changed (70) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +73 -0
  3. data/.gitignore +2 -0
  4. data/.rspec +2 -0
  5. data/CHANGELOG.md +210 -0
  6. data/Gemfile +4 -21
  7. data/Gemfile.global +12 -0
  8. data/Gemfile.mongo_mapper +6 -0
  9. data/Gemfile.rails60 +6 -0
  10. data/Gemfile.rails61 +6 -0
  11. data/Gemfile.rails70 +9 -0
  12. data/Gemfile.railsmaster +5 -0
  13. data/README.md +366 -73
  14. data/Rakefile +4 -4
  15. data/enumerize.gemspec +2 -1
  16. data/lib/enumerize/activemodel.rb +47 -0
  17. data/lib/enumerize/activerecord.rb +102 -27
  18. data/lib/enumerize/attribute.rb +59 -15
  19. data/lib/enumerize/attribute_map.rb +2 -0
  20. data/lib/enumerize/base.rb +32 -17
  21. data/lib/enumerize/hooks/formtastic.rb +7 -9
  22. data/lib/enumerize/hooks/sequel_dataset.rb +17 -0
  23. data/lib/enumerize/hooks/simple_form.rb +9 -12
  24. data/lib/enumerize/hooks/uniqueness.rb +7 -8
  25. data/lib/enumerize/integrations/rails_admin.rb +3 -1
  26. data/lib/enumerize/integrations/rspec/matcher.rb +112 -26
  27. data/lib/enumerize/integrations/rspec.rb +3 -0
  28. data/lib/enumerize/module.rb +2 -0
  29. data/lib/enumerize/module_attributes.rb +2 -0
  30. data/lib/enumerize/mongoid.rb +36 -0
  31. data/lib/enumerize/predicatable.rb +10 -17
  32. data/lib/enumerize/predicates.rb +5 -1
  33. data/lib/enumerize/scope/activerecord.rb +53 -0
  34. data/lib/enumerize/scope/mongoid.rb +50 -0
  35. data/lib/enumerize/scope/sequel.rb +56 -0
  36. data/lib/enumerize/sequel.rb +62 -0
  37. data/lib/enumerize/set.rb +20 -8
  38. data/lib/enumerize/utils.rb +12 -0
  39. data/lib/enumerize/value.rb +20 -20
  40. data/lib/enumerize/version.rb +3 -1
  41. data/lib/enumerize.rb +33 -2
  42. data/lib/sequel/plugins/enumerize.rb +18 -0
  43. data/spec/enumerize/integrations/rspec/matcher_spec.rb +261 -0
  44. data/spec/spec_helper.rb +30 -0
  45. data/test/activemodel_test.rb +114 -0
  46. data/test/activerecord_test.rb +434 -58
  47. data/test/attribute_map_test.rb +9 -7
  48. data/test/attribute_test.rb +52 -23
  49. data/test/base_test.rb +118 -66
  50. data/test/formtastic_test.rb +28 -12
  51. data/test/module_attributes_test.rb +10 -8
  52. data/test/mongo_mapper_test.rb +26 -11
  53. data/test/mongoid_test.rb +100 -15
  54. data/test/multiple_test.rb +41 -12
  55. data/test/predicates_test.rb +34 -26
  56. data/test/rails_admin_test.rb +8 -6
  57. data/test/sequel_test.rb +342 -0
  58. data/test/set_test.rb +42 -26
  59. data/test/simple_form_test.rb +25 -1
  60. data/test/support/mock_controller.rb +6 -0
  61. data/test/support/shared_enums.rb +43 -0
  62. data/test/support/view_test_helper.rb +18 -1
  63. data/test/test_helper.rb +33 -2
  64. data/test/value_test.rb +79 -28
  65. metadata +51 -12
  66. data/.travis.yml +0 -19
  67. data/Gemfile.rails4 +0 -23
  68. data/lib/enumerize/form_helper.rb +0 -23
  69. data/test/rspec_matcher_test.rb +0 -76
  70. data/test/rspec_spec.rb +0 -13
@@ -1,22 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
5
+ begin
6
+
3
7
  silence_warnings do
4
8
  require 'mongo_mapper'
5
9
  end
6
10
 
7
- MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
8
- MongoMapper.database = 'enumerize-test-suite-of-mongomapper'
11
+ MongoMapper.connection = Mongo::Client.new(['localhost:27017'], database: 'enumerize-test-suite-of-mongomapper')
9
12
 
10
- describe Enumerize do
13
+ class MongoMapperTest < MiniTest::Spec
11
14
  class MongoMapperUser
12
15
  include MongoMapper::Document
13
16
  extend Enumerize
14
17
 
15
18
  key :sex
16
19
  key :role
20
+ key :foo
17
21
 
18
- enumerize :sex, :in => %w[male female]
22
+ enumerize :sex, :in => %w[male female]
19
23
  enumerize :role, :in => %w[admin user], :default => 'user'
24
+ enumerize :foo, :in => %w[bar baz], :skip_validations => true
20
25
  end
21
26
 
22
27
  before { $VERBOSE = nil }
@@ -27,7 +32,7 @@ describe Enumerize do
27
32
  it 'sets nil if invalid value is passed' do
28
33
  user = model.new
29
34
  user.sex = :invalid
30
- user.sex.must_equal nil
35
+ expect(user.sex).must_be_nil
31
36
  end
32
37
 
33
38
  it 'saves value' do
@@ -35,7 +40,7 @@ describe Enumerize do
35
40
  user = model.new
36
41
  user.sex = :female
37
42
  user.save!
38
- user.sex.must_equal 'female'
43
+ expect(user.sex).must_equal 'female'
39
44
  end
40
45
 
41
46
  it 'loads value' do
@@ -43,19 +48,25 @@ describe Enumerize do
43
48
  model.create!(:sex => :male)
44
49
  store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
45
50
  user = model.first
46
- user.sex.must_equal 'male'
47
- user.sex_text.must_equal 'Male'
51
+ expect(user.sex).must_equal 'male'
52
+ expect(user.sex_text).must_equal 'Male'
48
53
  end
49
54
  end
50
55
 
51
56
  it 'has default value' do
52
- model.new.role.must_equal 'user'
57
+ expect(model.new.role).must_equal 'user'
53
58
  end
54
59
 
55
60
  it 'validates inclusion' do
56
61
  user = model.new
57
62
  user.role = 'wrong'
58
- user.wont_be :valid?
63
+ expect(user).wont_be :valid?
64
+ end
65
+
66
+ it 'does not validate inclusion when :skip_validations option passed' do
67
+ user = model.new
68
+ user.foo = 'wrong'
69
+ expect(user).must_be :valid?
59
70
  end
60
71
 
61
72
  it 'assigns value on loaded record' do
@@ -63,6 +74,10 @@ describe Enumerize do
63
74
  model.create!(:sex => :male)
64
75
  user = model.first
65
76
  user.sex = :female
66
- user.sex.must_equal 'female'
77
+ expect(user.sex).must_equal 'female'
67
78
  end
68
79
  end
80
+
81
+ rescue LoadError
82
+ # Skip
83
+ end
data/test/mongoid_test.rb CHANGED
@@ -1,25 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
5
+ begin
6
+
3
7
  silence_warnings do
4
8
  require 'mongoid'
5
9
  end
6
10
 
7
11
  Mongoid.configure do |config|
8
- config.sessions = { :default => { :database => 'enumerize-test-suite', hosts: ['127.0.0.1:27017'] } }
9
- config.use_utc = true
10
- config.include_root_in_json = true
12
+ config.connect_to('enumerize-test-suite')
13
+ config.options = { use_utc: true, include_root_in_json: true }
11
14
  end
12
15
 
13
- describe Enumerize do
16
+ class MongoidTest < MiniTest::Spec
14
17
  class MongoidUser
15
18
  include Mongoid::Document
16
19
  extend Enumerize
17
20
 
18
21
  field :sex
19
22
  field :role
20
- enumerize :sex, :in => %w[male female]
21
- enumerize :role, :in => %w[admin user], :default => 'user'
22
- enumerize :mult, :in => %w[one two three four], :multiple => true
23
+ field :foo
24
+ field :skill
25
+
26
+ enumerize :sex, :in => %w[male female], scope: true
27
+ enumerize :status, :in => %w[notice warning error], scope: true
28
+ enumerize :role, :in => %w[admin user], :default => 'user', scope: :having_role
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
23
33
  end
24
34
 
25
35
  before { $VERBOSE = nil }
@@ -30,7 +40,7 @@ describe Enumerize do
30
40
  it 'sets nil if invalid value is passed' do
31
41
  user = model.new
32
42
  user.sex = :invalid
33
- user.sex.must_equal nil
43
+ expect(user.sex).must_be_nil
34
44
  end
35
45
 
36
46
  it 'saves value' do
@@ -38,7 +48,7 @@ describe Enumerize do
38
48
  user = model.new
39
49
  user.sex = :female
40
50
  user.save!
41
- user.sex.must_equal 'female'
51
+ expect(user.sex).must_equal 'female'
42
52
  end
43
53
 
44
54
  it 'loads value' do
@@ -46,19 +56,48 @@ describe Enumerize do
46
56
  model.create!(:sex => :male)
47
57
  store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
48
58
  user = model.first
49
- user.sex.must_equal 'male'
50
- user.sex_text.must_equal 'Male'
59
+ expect(user.sex).must_equal 'male'
60
+ expect(user.sex_text).must_equal 'Male'
51
61
  end
52
62
  end
53
63
 
54
64
  it 'has default value' do
55
- model.new.role.must_equal 'user'
65
+ expect(model.new.role).must_equal 'user'
66
+ end
67
+
68
+ it 'uses after_initialize callback to set default value' do
69
+ model.delete_all
70
+ model.create!(sex: 'male', role: nil)
71
+
72
+ user = model.where(sex: 'male').first
73
+ expect(user.role).must_equal 'user'
74
+ end
75
+
76
+ it 'does not set default value for not selected attributes' do
77
+ model.delete_all
78
+ model.create!(sex: :male)
79
+
80
+ assert_equal ['_id'], model.only(:id).first.attributes.keys
56
81
  end
57
82
 
58
83
  it 'validates inclusion' do
59
84
  user = model.new
60
85
  user.role = 'wrong'
61
- 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]
62
101
  end
63
102
 
64
103
  it 'assigns value on loaded record' do
@@ -66,7 +105,7 @@ describe Enumerize do
66
105
  model.create!(:sex => :male)
67
106
  user = model.first
68
107
  user.sex = :female
69
- user.sex.must_equal 'female'
108
+ expect(user.sex).must_equal 'female'
70
109
  end
71
110
 
72
111
  it 'loads multiple properly' do
@@ -74,6 +113,52 @@ describe Enumerize do
74
113
 
75
114
  model.create!(:mult => ['one', 'two'])
76
115
  user = model.first
77
- user.mult.to_a.must_equal ['one', 'two']
116
+ expect(user.mult.to_a).must_equal ['one', 'two']
117
+ end
118
+
119
+ it 'adds scope' do
120
+ model.delete_all
121
+
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]
133
+
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]
136
+
137
+ expect(model.pro.to_a).must_equal [user_3]
138
+ expect(model.premium.to_a).must_equal [user_3]
139
+
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
142
+ end
143
+
144
+ it 'chains scopes' do
145
+ model.delete_all
146
+
147
+ user_1 = model.create!(status: :notice)
148
+ user_2 = model.create!(status: :warning)
149
+ user_3 = model.create!(status: :error)
150
+
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]
78
153
  end
154
+
155
+ it 'ignores not enumerized values that passed to the scope method' do
156
+ model.delete_all
157
+
158
+ expect(model.with_sex(:foo)).must_equal []
159
+ end
160
+ end
161
+
162
+ rescue LoadError
163
+ # Skip
79
164
  end
@@ -1,36 +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)
27
+ end
28
+
29
+ it 'sets default value as single value' do
30
+ kklass.enumerize :foos, in: %w(a b c), default: 'b', multiple: true
31
+ expect(object.foos).must_equal %w(b)
32
+ end
33
+
34
+ it 'sets default value as array of one element' do
35
+ kklass.enumerize :foos, in: %w(a b c), default: %w(b), multiple: true
36
+ expect(object.foos).must_equal %w(b)
37
+ end
38
+
39
+ it 'sets default value as array of several elements' do
40
+ kklass.enumerize :foos, in: %w(a b c), default: %w(b c), multiple: true
41
+ expect(object.foos).must_equal %w(b c)
25
42
  end
26
43
 
27
44
  it "doesn't define _text method" do
28
- klass.enumerize :foos, in: %w(a b c), multiple: true
29
- 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
30
47
  end
31
48
 
32
49
  it "doesn't define _value method" do
33
- klass.enumerize :foos, in: %w(a b c), multiple: true
34
- 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
52
+ end
53
+
54
+ it "cannot define multiple with scope" do
55
+ assert_raises ArgumentError do
56
+ kklass.enumerize :foos, in: %w(a b c), multiple: true, scope: true
57
+ end
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)
35
64
  end
36
65
  end
@@ -1,57 +1,65 @@
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
7
9
  end
8
10
  end
9
11
 
10
- let(:object) { klass.new }
12
+ let(:object) { kklass.new }
11
13
 
12
14
  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?
15
+ kklass.enumerize(:foo, in: %w(a b), predicates: true)
16
+ expect(object).must_respond_to :a?
17
+ expect(object).must_respond_to :b?
18
+ end
19
+
20
+ it 'creates predicate methods when enumerized values have dash in it' do
21
+ kklass.enumerize(:foo, in: %w(foo-bar bar-foo), predicates: true)
22
+ expect(object).must_respond_to :foo_bar?
23
+ expect(object).must_respond_to :bar_foo?
16
24
  end
17
25
 
18
26
  it 'creates predicate methods on multiple attribute' do
19
- klass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
20
- object.must_respond_to :a?
21
- object.must_respond_to :b?
27
+ kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
28
+ expect(object).must_respond_to :a?
29
+ expect(object).must_respond_to :b?
22
30
  end
23
31
 
24
32
  it 'checks values' do
25
- klass.enumerize(:foo, in: %w(a b), predicates: true)
33
+ kklass.enumerize(:foo, in: %w(a b), predicates: true)
26
34
  object.foo = 'a'
27
- object.a?.must_equal true
28
- object.b?.must_equal false
35
+ expect(object.a?).must_equal true
36
+ expect(object.b?).must_equal false
29
37
  end
30
38
 
31
39
  it 'checks values on multiple attribute' do
32
- klass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
40
+ kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
33
41
  object.foo << :a
34
- object.a?.must_equal true
35
- object.b?.must_equal false
42
+ expect(object.a?).must_equal true
43
+ expect(object.b?).must_equal false
36
44
  end
37
45
 
38
46
  it 'prefixes methods' do
39
- klass.enumerize(:foo, in: %w(a b), predicates: { prefix: 'bar' })
40
- object.wont_respond_to :a?
41
- object.wont_respond_to :b?
42
- object.must_respond_to :bar_a?
43
- object.must_respond_to :bar_b?
47
+ kklass.enumerize(:foo, in: %w(a b), predicates: { prefix: 'bar' })
48
+ expect(object).wont_respond_to :a?
49
+ expect(object).wont_respond_to :b?
50
+ expect(object).must_respond_to :bar_a?
51
+ expect(object).must_respond_to :bar_b?
44
52
  end
45
53
 
46
54
  it 'accepts only option' do
47
- klass.enumerize(:foo, in: %w(a b), predicates: { only: :a })
48
- object.must_respond_to :a?
49
- object.wont_respond_to :b?
55
+ kklass.enumerize(:foo, in: %w(a b), predicates: { only: :a })
56
+ expect(object).must_respond_to :a?
57
+ expect(object).wont_respond_to :b?
50
58
  end
51
59
 
52
60
  it 'accepts except option' do
53
- klass.enumerize(:foo, in: %w(a b), predicates: { except: :a })
54
- object.wont_respond_to :a?
55
- object.must_respond_to :b?
61
+ kklass.enumerize(:foo, in: %w(a b), predicates: { except: :a })
62
+ expect(object).wont_respond_to :a?
63
+ expect(object).must_respond_to :b?
56
64
  end
57
65
  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