careacademy-enumerize 2.8.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 +7 -0
- data/.github/workflows/ruby.yml +69 -0
- data/.gitignore +23 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +327 -0
- data/Gemfile +6 -0
- data/Gemfile.global +12 -0
- data/Gemfile.mongo_mapper +6 -0
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/Gemfile.rails70 +9 -0
- data/Gemfile.railsmaster +5 -0
- data/MIT-LICENSE +22 -0
- data/README.md +641 -0
- data/Rakefile +17 -0
- data/enumerize.gemspec +22 -0
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +142 -0
- data/lib/enumerize/attribute.rb +192 -0
- data/lib/enumerize/attribute_map.rb +40 -0
- data/lib/enumerize/base.rb +112 -0
- data/lib/enumerize/hooks/formtastic.rb +27 -0
- data/lib/enumerize/hooks/sequel_dataset.rb +17 -0
- data/lib/enumerize/hooks/simple_form.rb +37 -0
- data/lib/enumerize/hooks/uniqueness.rb +22 -0
- data/lib/enumerize/integrations/rails_admin.rb +18 -0
- data/lib/enumerize/integrations/rspec/matcher.rb +164 -0
- data/lib/enumerize/integrations/rspec.rb +19 -0
- data/lib/enumerize/module.rb +33 -0
- data/lib/enumerize/module_attributes.rb +12 -0
- data/lib/enumerize/mongoid.rb +29 -0
- data/lib/enumerize/predicatable.rb +23 -0
- data/lib/enumerize/predicates.rb +76 -0
- data/lib/enumerize/scope/activerecord.rb +53 -0
- data/lib/enumerize/scope/mongoid.rb +50 -0
- data/lib/enumerize/scope/sequel.rb +56 -0
- data/lib/enumerize/sequel.rb +62 -0
- data/lib/enumerize/set.rb +81 -0
- data/lib/enumerize/utils.rb +12 -0
- data/lib/enumerize/value.rb +47 -0
- data/lib/enumerize/version.rb +5 -0
- data/lib/enumerize.rb +90 -0
- data/lib/sequel/plugins/enumerize.rb +18 -0
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +261 -0
- data/spec/spec_helper.rb +30 -0
- data/test/activemodel_test.rb +114 -0
- data/test/activerecord_test.rb +679 -0
- data/test/attribute_map_test.rb +70 -0
- data/test/attribute_test.rb +141 -0
- data/test/base_test.rb +230 -0
- data/test/formtastic_test.rb +152 -0
- data/test/module_attributes_test.rb +52 -0
- data/test/mongo_mapper_test.rb +83 -0
- data/test/mongoid_test.rb +164 -0
- data/test/multiple_test.rb +65 -0
- data/test/predicates_test.rb +65 -0
- data/test/rails_admin_test.rb +27 -0
- data/test/sequel_test.rb +344 -0
- data/test/set_test.rb +166 -0
- data/test/simple_form_test.rb +156 -0
- data/test/support/mock_controller.rb +31 -0
- data/test/support/shared_enums.rb +43 -0
- data/test/support/view_test_helper.rb +46 -0
- data/test/test_helper.rb +53 -0
- data/test/value_test.rb +158 -0
- metadata +143 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
begin
|
6
|
+
|
7
|
+
silence_warnings do
|
8
|
+
require 'mongo_mapper'
|
9
|
+
end
|
10
|
+
|
11
|
+
MongoMapper.connection = Mongo::Client.new(['localhost:27017'], database: 'enumerize-test-suite-of-mongomapper')
|
12
|
+
|
13
|
+
describe Enumerize do
|
14
|
+
class MongoMapperUser
|
15
|
+
include MongoMapper::Document
|
16
|
+
extend Enumerize
|
17
|
+
|
18
|
+
key :sex
|
19
|
+
key :role
|
20
|
+
key :foo
|
21
|
+
|
22
|
+
enumerize :sex, :in => %w[male female]
|
23
|
+
enumerize :role, :in => %w[admin user], :default => 'user'
|
24
|
+
enumerize :foo, :in => %w[bar baz], :skip_validations => true
|
25
|
+
end
|
26
|
+
|
27
|
+
before { $VERBOSE = nil }
|
28
|
+
after { $VERBOSE = true }
|
29
|
+
|
30
|
+
let(:model) { MongoMapperUser }
|
31
|
+
|
32
|
+
it 'sets nil if invalid value is passed' do
|
33
|
+
user = model.new
|
34
|
+
user.sex = :invalid
|
35
|
+
expect(user.sex).must_be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'saves value' do
|
39
|
+
model.delete_all
|
40
|
+
user = model.new
|
41
|
+
user.sex = :female
|
42
|
+
user.save!
|
43
|
+
expect(user.sex).must_equal 'female'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'loads value' do
|
47
|
+
model.delete_all
|
48
|
+
model.create!(:sex => :male)
|
49
|
+
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
50
|
+
user = model.first
|
51
|
+
expect(user.sex).must_equal 'male'
|
52
|
+
expect(user.sex_text).must_equal 'Male'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'has default value' do
|
57
|
+
expect(model.new.role).must_equal 'user'
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'validates inclusion' do
|
61
|
+
user = model.new
|
62
|
+
user.role = 'wrong'
|
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?
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'assigns value on loaded record' do
|
73
|
+
model.delete_all
|
74
|
+
model.create!(:sex => :male)
|
75
|
+
user = model.first
|
76
|
+
user.sex = :female
|
77
|
+
expect(user.sex).must_equal 'female'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
rescue LoadError
|
82
|
+
# Skip
|
83
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
begin
|
6
|
+
|
7
|
+
silence_warnings do
|
8
|
+
require 'mongoid'
|
9
|
+
end
|
10
|
+
|
11
|
+
Mongoid.configure do |config|
|
12
|
+
config.connect_to('enumerize-test-suite')
|
13
|
+
config.options = { use_utc: true, include_root_in_json: true }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Enumerize do
|
17
|
+
class MongoidUser
|
18
|
+
include Mongoid::Document
|
19
|
+
extend Enumerize
|
20
|
+
|
21
|
+
field :sex
|
22
|
+
field :role
|
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
|
33
|
+
end
|
34
|
+
|
35
|
+
before { $VERBOSE = nil }
|
36
|
+
after { $VERBOSE = true }
|
37
|
+
|
38
|
+
let(:model) { MongoidUser }
|
39
|
+
|
40
|
+
it 'sets nil if invalid value is passed' do
|
41
|
+
user = model.new
|
42
|
+
user.sex = :invalid
|
43
|
+
expect(user.sex).must_be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'saves value' do
|
47
|
+
model.delete_all
|
48
|
+
user = model.new
|
49
|
+
user.sex = :female
|
50
|
+
user.save!
|
51
|
+
expect(user.sex).must_equal 'female'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'loads value' do
|
55
|
+
model.delete_all
|
56
|
+
model.create!(:sex => :male)
|
57
|
+
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
58
|
+
user = model.first
|
59
|
+
expect(user.sex).must_equal 'male'
|
60
|
+
expect(user.sex_text).must_equal 'Male'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'has default value' do
|
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
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'validates inclusion' do
|
84
|
+
user = model.new
|
85
|
+
user.role = 'wrong'
|
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]
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'assigns value on loaded record' do
|
104
|
+
model.delete_all
|
105
|
+
model.create!(:sex => :male)
|
106
|
+
user = model.first
|
107
|
+
user.sex = :female
|
108
|
+
expect(user.sex).must_equal 'female'
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'loads multiple properly' do
|
112
|
+
model.delete_all
|
113
|
+
|
114
|
+
model.create!(:mult => ['one', 'two'])
|
115
|
+
user = model.first
|
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]
|
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
|
164
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe Enumerize::Base do
|
6
|
+
let(:kklass) do
|
7
|
+
Class.new do
|
8
|
+
extend Enumerize
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:subklass) do
|
13
|
+
Class.new(kklass)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:object) { kklass.new }
|
17
|
+
|
18
|
+
it 'returns [] when not set' do
|
19
|
+
kklass.enumerize :foos, in: %w(a b), multiple: true
|
20
|
+
expect(object.foos).must_equal []
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns setted array' do
|
24
|
+
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
25
|
+
object.foos = %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)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "doesn't define _text method" do
|
45
|
+
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
46
|
+
expect(object).wont_respond_to :foos_text
|
47
|
+
end
|
48
|
+
|
49
|
+
it "doesn't define _value method" do
|
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)
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe Enumerize::Predicates do
|
6
|
+
let(:kklass) do
|
7
|
+
Class.new do
|
8
|
+
extend Enumerize
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:object) { kklass.new }
|
13
|
+
|
14
|
+
it 'creates predicate methods' do
|
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?
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'creates predicate methods on multiple attribute' do
|
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?
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'checks values' do
|
33
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: true)
|
34
|
+
object.foo = 'a'
|
35
|
+
expect(object.a?).must_equal true
|
36
|
+
expect(object.b?).must_equal false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'checks values on multiple attribute' do
|
40
|
+
kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
|
41
|
+
object.foo << :a
|
42
|
+
expect(object.a?).must_equal true
|
43
|
+
expect(object.b?).must_equal false
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'prefixes methods' do
|
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?
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'accepts only option' do
|
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?
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'accepts except option' do
|
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?
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class RailsAdminSpec < MiniTest::Spec
|
6
|
+
let(:kklass) do
|
7
|
+
Class.new do
|
8
|
+
extend Enumerize
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:object) { kklass.new }
|
13
|
+
|
14
|
+
it 'defines enum method' do
|
15
|
+
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
16
|
+
kklass.enumerize(:foo, in: [:a, :b])
|
17
|
+
expect(object.foo_enum).must_equal [['a text', 'a'], ['b text', 'b']]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'defines enum properly for custom values enumerations' do
|
22
|
+
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
23
|
+
kklass.enumerize(:foo, in: {:a => 1, :b => 2})
|
24
|
+
expect(object.foo_enum).must_equal [['a text', 'a'], ['b text', 'b']]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|