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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +69 -0
  3. data/.gitignore +23 -0
  4. data/.rspec +2 -0
  5. data/CHANGELOG.md +327 -0
  6. data/Gemfile +6 -0
  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/MIT-LICENSE +22 -0
  14. data/README.md +641 -0
  15. data/Rakefile +17 -0
  16. data/enumerize.gemspec +22 -0
  17. data/lib/enumerize/activemodel.rb +47 -0
  18. data/lib/enumerize/activerecord.rb +142 -0
  19. data/lib/enumerize/attribute.rb +192 -0
  20. data/lib/enumerize/attribute_map.rb +40 -0
  21. data/lib/enumerize/base.rb +112 -0
  22. data/lib/enumerize/hooks/formtastic.rb +27 -0
  23. data/lib/enumerize/hooks/sequel_dataset.rb +17 -0
  24. data/lib/enumerize/hooks/simple_form.rb +37 -0
  25. data/lib/enumerize/hooks/uniqueness.rb +22 -0
  26. data/lib/enumerize/integrations/rails_admin.rb +18 -0
  27. data/lib/enumerize/integrations/rspec/matcher.rb +164 -0
  28. data/lib/enumerize/integrations/rspec.rb +19 -0
  29. data/lib/enumerize/module.rb +33 -0
  30. data/lib/enumerize/module_attributes.rb +12 -0
  31. data/lib/enumerize/mongoid.rb +29 -0
  32. data/lib/enumerize/predicatable.rb +23 -0
  33. data/lib/enumerize/predicates.rb +76 -0
  34. data/lib/enumerize/scope/activerecord.rb +53 -0
  35. data/lib/enumerize/scope/mongoid.rb +50 -0
  36. data/lib/enumerize/scope/sequel.rb +56 -0
  37. data/lib/enumerize/sequel.rb +62 -0
  38. data/lib/enumerize/set.rb +81 -0
  39. data/lib/enumerize/utils.rb +12 -0
  40. data/lib/enumerize/value.rb +47 -0
  41. data/lib/enumerize/version.rb +5 -0
  42. data/lib/enumerize.rb +90 -0
  43. data/lib/sequel/plugins/enumerize.rb +18 -0
  44. data/spec/enumerize/integrations/rspec/matcher_spec.rb +261 -0
  45. data/spec/spec_helper.rb +30 -0
  46. data/test/activemodel_test.rb +114 -0
  47. data/test/activerecord_test.rb +679 -0
  48. data/test/attribute_map_test.rb +70 -0
  49. data/test/attribute_test.rb +141 -0
  50. data/test/base_test.rb +230 -0
  51. data/test/formtastic_test.rb +152 -0
  52. data/test/module_attributes_test.rb +52 -0
  53. data/test/mongo_mapper_test.rb +83 -0
  54. data/test/mongoid_test.rb +164 -0
  55. data/test/multiple_test.rb +65 -0
  56. data/test/predicates_test.rb +65 -0
  57. data/test/rails_admin_test.rb +27 -0
  58. data/test/sequel_test.rb +344 -0
  59. data/test/set_test.rb +166 -0
  60. data/test/simple_form_test.rb +156 -0
  61. data/test/support/mock_controller.rb +31 -0
  62. data/test/support/shared_enums.rb +43 -0
  63. data/test/support/view_test_helper.rb +46 -0
  64. data/test/test_helper.rb +53 -0
  65. data/test/value_test.rb +158 -0
  66. 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