enumerize 0.8.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
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