enumerize 2.0.1 → 2.5.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 +5 -5
- data/.github/workflows/ruby.yml +73 -0
- data/CHANGELOG.md +80 -3
- data/Gemfile +3 -3
- data/Gemfile.global +2 -9
- data/Gemfile.mongo_mapper +2 -2
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/Gemfile.rails70 +9 -0
- data/Gemfile.railsmaster +5 -0
- data/README.md +209 -92
- data/Rakefile +2 -0
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +79 -0
- data/lib/enumerize/attribute.rb +19 -11
- data/lib/enumerize/attribute_map.rb +2 -0
- data/lib/enumerize/base.rb +6 -6
- data/lib/enumerize/hooks/formtastic.rb +4 -1
- data/lib/enumerize/hooks/sequel_dataset.rb +2 -0
- data/lib/enumerize/hooks/simple_form.rb +4 -1
- data/lib/enumerize/hooks/uniqueness.rb +5 -1
- data/lib/enumerize/integrations/rails_admin.rb +3 -1
- data/lib/enumerize/integrations/rspec/matcher.rb +7 -2
- data/lib/enumerize/integrations/rspec.rb +2 -0
- data/lib/enumerize/module.rb +2 -0
- data/lib/enumerize/module_attributes.rb +2 -0
- data/lib/enumerize/mongoid.rb +16 -0
- data/lib/enumerize/predicatable.rb +3 -1
- data/lib/enumerize/predicates.rb +2 -0
- data/lib/enumerize/scope/activerecord.rb +16 -0
- data/lib/enumerize/scope/mongoid.rb +15 -0
- data/lib/enumerize/scope/sequel.rb +16 -0
- data/lib/enumerize/sequel.rb +9 -4
- data/lib/enumerize/set.rb +2 -0
- data/lib/enumerize/utils.rb +12 -0
- data/lib/enumerize/value.rb +14 -15
- data/lib/enumerize/version.rb +3 -1
- data/lib/enumerize.rb +9 -0
- data/lib/sequel/plugins/enumerize.rb +18 -0
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +13 -10
- data/spec/spec_helper.rb +2 -0
- data/test/activemodel_test.rb +114 -0
- data/test/activerecord_test.rb +277 -79
- data/test/attribute_map_test.rb +9 -7
- data/test/attribute_test.rb +37 -30
- data/test/base_test.rb +66 -64
- data/test/formtastic_test.rb +25 -0
- data/test/module_attributes_test.rb +10 -8
- data/test/mongo_mapper_test.rb +19 -10
- data/test/mongoid_test.rb +51 -22
- data/test/multiple_test.rb +26 -18
- data/test/predicates_test.rb +30 -28
- data/test/rails_admin_test.rb +8 -6
- data/test/sequel_test.rb +111 -58
- data/test/set_test.rb +28 -26
- data/test/simple_form_test.rb +25 -0
- data/test/support/mock_controller.rb +6 -0
- data/test/support/shared_enums.rb +43 -0
- data/test/support/view_test_helper.rb +14 -1
- data/test/test_helper.rb +2 -0
- data/test/value_test.rb +51 -30
- metadata +14 -27
- data/.travis.yml +0 -18
- data/Gemfile.rails42 +0 -6
data/test/sequel_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'sequel'
|
3
5
|
require 'logger'
|
@@ -21,7 +23,9 @@ module SequelTest
|
|
21
23
|
String :name
|
22
24
|
String :interests
|
23
25
|
String :status
|
26
|
+
Integer :skill
|
24
27
|
String :account_type, default: "basic"
|
28
|
+
String :foo
|
25
29
|
end
|
26
30
|
|
27
31
|
DB.create_table :documents do
|
@@ -32,7 +36,7 @@ module SequelTest
|
|
32
36
|
end
|
33
37
|
|
34
38
|
class Document < Sequel::Model
|
35
|
-
|
39
|
+
plugin :enumerize
|
36
40
|
enumerize :visibility, :in => [:public, :private, :protected], :scope => true, :default => :public
|
37
41
|
end
|
38
42
|
|
@@ -47,15 +51,17 @@ module SequelTest
|
|
47
51
|
plugin :dirty
|
48
52
|
plugin :defaults_setter
|
49
53
|
plugin :validation_helpers
|
50
|
-
|
54
|
+
plugin :enumerize
|
51
55
|
include RoleEnum
|
52
56
|
|
53
|
-
enumerize :sex, :in => [:male, :female]
|
57
|
+
enumerize :sex, :in => [:male, :female], scope: :shallow
|
54
58
|
|
55
59
|
enumerize :interests, :in => [:music, :sports, :dancing, :programming], :multiple => true
|
56
60
|
|
57
61
|
enumerize :status, :in => { active: 1, blocked: 2 }, scope: true
|
58
62
|
|
63
|
+
enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
|
64
|
+
|
59
65
|
enumerize :account_type, :in => [:basic, :premium]
|
60
66
|
end
|
61
67
|
|
@@ -67,64 +73,80 @@ module SequelTest
|
|
67
73
|
end
|
68
74
|
end
|
69
75
|
|
76
|
+
class SkipValidationsUser < Sequel::Model(:users)
|
77
|
+
include SkipValidationsEnum
|
78
|
+
end
|
79
|
+
|
80
|
+
class DoNotSkipValidationsUser < Sequel::Model(:users)
|
81
|
+
include DoNotSkipValidationsEnum
|
82
|
+
end
|
83
|
+
|
84
|
+
class SkipValidationsLambdaUser < Sequel::Model(:users)
|
85
|
+
include SkipValidationsLambdaEnum
|
86
|
+
end
|
87
|
+
|
88
|
+
class SkipValidationsLambdaWithParamUser < Sequel::Model(:users)
|
89
|
+
include SkipValidationsLambdaWithParamEnum
|
90
|
+
end
|
91
|
+
|
70
92
|
describe Enumerize::SequelSupport do
|
71
93
|
it 'sets nil if invalid value is passed' do
|
72
94
|
user = User.new
|
73
95
|
user.sex = :invalid
|
74
|
-
user.sex.
|
96
|
+
expect(user.sex).must_be_nil
|
75
97
|
end
|
76
98
|
|
77
99
|
it 'saves value' do
|
78
|
-
User.filter.delete
|
100
|
+
User.filter{ true }.delete
|
79
101
|
user = User.new
|
80
102
|
user.sex = :female
|
81
103
|
user.save
|
82
|
-
user.sex.must_equal 'female'
|
104
|
+
expect(user.sex).must_equal 'female'
|
83
105
|
end
|
84
106
|
|
85
107
|
it 'loads value' do
|
86
|
-
User.filter.delete
|
108
|
+
User.filter{ true }.delete
|
87
109
|
User.create(:sex => :male)
|
88
110
|
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
89
111
|
user = User.first
|
90
|
-
user.sex.must_equal 'male'
|
91
|
-
user.sex_text.must_equal 'Male'
|
112
|
+
expect(user.sex).must_equal 'male'
|
113
|
+
expect(user.sex_text).must_equal 'Male'
|
92
114
|
end
|
93
115
|
end
|
94
116
|
|
95
117
|
it 'has default value' do
|
96
|
-
User.new.role.must_equal 'user'
|
97
|
-
User.new.values[:role].must_equal 'user'
|
118
|
+
expect(User.new.role).must_equal 'user'
|
119
|
+
expect(User.new.values[:role]).must_equal 'user'
|
98
120
|
end
|
99
121
|
|
100
122
|
it 'does not set default value for not selected attributes' do
|
101
|
-
User.filter.delete
|
123
|
+
User.filter{ true }.delete
|
102
124
|
User.create(:sex => :male)
|
103
125
|
|
104
126
|
assert_equal [:id], User.select(:id).first.values.keys
|
105
127
|
end
|
106
128
|
|
107
129
|
it 'has default value with lambda' do
|
108
|
-
User.new.lambda_role.must_equal 'admin'
|
109
|
-
User.new.values[:lambda_role].must_equal 'admin'
|
130
|
+
expect(User.new.lambda_role).must_equal 'admin'
|
131
|
+
expect(User.new.values[:lambda_role]).must_equal 'admin'
|
110
132
|
end
|
111
133
|
it 'uses after_initialize callback to set default value' do
|
112
|
-
User.filter.delete
|
134
|
+
User.filter{ true }.delete
|
113
135
|
User.create(sex: 'male', lambda_role: nil)
|
114
136
|
|
115
137
|
user = User.where(:sex => 'male').first
|
116
|
-
user.lambda_role.must_equal 'admin'
|
138
|
+
expect(user.lambda_role).must_equal 'admin'
|
117
139
|
end
|
118
140
|
|
119
141
|
it 'uses default value from db column' do
|
120
|
-
User.new.account_type.must_equal 'basic'
|
142
|
+
expect(User.new.account_type).must_equal 'basic'
|
121
143
|
end
|
122
144
|
|
123
145
|
it 'validates inclusion' do
|
124
146
|
user = User.new
|
125
147
|
user.role = 'wrong'
|
126
|
-
user.wont_be :valid?
|
127
|
-
user.errors[:role].must_include 'is not included in the list'
|
148
|
+
expect(user).wont_be :valid?
|
149
|
+
expect(user.errors[:role]).must_include 'is not included in the list'
|
128
150
|
end
|
129
151
|
|
130
152
|
it 'validates inclusion on mass assignment' do
|
@@ -135,41 +157,66 @@ module SequelTest
|
|
135
157
|
|
136
158
|
it "uses persisted value for validation if it hasn't been set" do
|
137
159
|
user = User.create :sex => :male
|
138
|
-
User[user.id].read_attribute_for_validation(:sex).must_equal 'male'
|
160
|
+
expect(User[user.id].read_attribute_for_validation(:sex)).must_equal 'male'
|
139
161
|
end
|
140
162
|
|
141
163
|
it 'is valid with empty string assigned' do
|
142
164
|
user = User.new
|
143
165
|
user.role = ''
|
144
|
-
user.must_be :valid?
|
166
|
+
expect(user).must_be :valid?
|
145
167
|
end
|
146
168
|
|
147
169
|
it 'stores nil when empty string assigned' do
|
148
170
|
user = User.new
|
149
171
|
user.role = ''
|
150
|
-
user.values[:role].
|
172
|
+
expect(user.values[:role]).must_be_nil
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'validates inclusion when :skip_validations = false' do
|
176
|
+
user = DoNotSkipValidationsUser.new
|
177
|
+
user.foo = 'wrong'
|
178
|
+
expect(user).wont_be :valid?
|
179
|
+
expect(user.errors[:foo]).must_include 'is not included in the list'
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'does not validate inclusion when :skip_validations = true' do
|
183
|
+
user = SkipValidationsUser.new
|
184
|
+
user.foo = 'wrong'
|
185
|
+
expect(user).must_be :valid?
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'supports :skip_validations option as lambda' do
|
189
|
+
user = SkipValidationsLambdaUser.new
|
190
|
+
user.foo = 'wrong'
|
191
|
+
expect(user).must_be :valid?
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'supports :skip_validations option as lambda with a parameter' do
|
195
|
+
user = SkipValidationsLambdaWithParamUser.new
|
196
|
+
user.foo = 'wrong'
|
197
|
+
expect(user).must_be :valid?
|
151
198
|
end
|
152
199
|
|
153
200
|
it 'supports multiple attributes' do
|
154
201
|
user = User.new
|
155
202
|
user.interests ||= []
|
156
|
-
user.interests.must_be_empty
|
203
|
+
expect(user.interests).must_be_empty
|
157
204
|
user.interests << "music"
|
158
|
-
user.interests.must_equal %w(music)
|
205
|
+
expect(user.interests).must_equal %w(music)
|
159
206
|
user.save
|
160
207
|
|
161
208
|
user = User[user.id]
|
162
|
-
user.interests.must_be_instance_of Enumerize::Set
|
163
|
-
user.interests.must_equal %w(music)
|
209
|
+
expect(user.interests).must_be_instance_of Enumerize::Set
|
210
|
+
expect(user.interests).must_equal %w(music)
|
164
211
|
user.interests << "sports"
|
165
|
-
user.interests.must_equal %w(music sports)
|
212
|
+
expect(user.interests).must_equal %w(music sports)
|
166
213
|
|
167
214
|
user.interests = []
|
168
215
|
interests = user.interests
|
169
216
|
interests << "music"
|
170
|
-
interests.must_equal %w(music)
|
217
|
+
expect(interests).must_equal %w(music)
|
171
218
|
interests << "dancing"
|
172
|
-
interests.must_equal %w(music dancing)
|
219
|
+
expect(interests).must_equal %w(music dancing)
|
173
220
|
end
|
174
221
|
|
175
222
|
it 'returns invalid multiple value for validation' do
|
@@ -177,50 +224,56 @@ module SequelTest
|
|
177
224
|
user.interests << :music
|
178
225
|
user.interests << :invalid
|
179
226
|
values = user.read_attribute_for_validation(:interests)
|
180
|
-
values.must_equal %w(music invalid)
|
227
|
+
expect(values).must_equal %w(music invalid)
|
181
228
|
end
|
182
229
|
|
183
230
|
it 'validates multiple attributes' do
|
184
231
|
user = User.new
|
185
232
|
user.interests << :invalid
|
186
|
-
user.wont_be :valid?
|
233
|
+
expect(user).wont_be :valid?
|
187
234
|
|
188
235
|
user.interests = Object.new
|
189
|
-
user.wont_be :valid?
|
236
|
+
expect(user).wont_be :valid?
|
190
237
|
|
191
238
|
user.interests = ['music', '']
|
192
|
-
user.must_be :valid?
|
239
|
+
expect(user).must_be :valid?
|
193
240
|
end
|
194
241
|
|
195
242
|
it 'stores custom values for multiple attributes' do
|
196
|
-
User.filter.delete
|
243
|
+
User.filter{ true }.delete
|
197
244
|
|
198
245
|
klass = Class.new(User)
|
199
246
|
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
200
247
|
|
201
248
|
user = klass.new
|
202
249
|
user.interests << :music
|
203
|
-
user.interests.must_equal %w(music)
|
250
|
+
expect(user.interests).must_equal %w(music)
|
204
251
|
user.save
|
205
252
|
|
206
253
|
user = klass[user.id]
|
207
|
-
user.interests.must_equal %w(music)
|
254
|
+
expect(user.interests).must_equal %w(music)
|
208
255
|
end
|
209
256
|
|
210
257
|
it 'adds scope' do
|
211
|
-
User.filter.delete
|
258
|
+
User.filter{ true }.delete
|
259
|
+
|
260
|
+
user_1 = User.create(sex: :female, skill: :noob, status: :active, role: :admin)
|
261
|
+
user_2 = User.create(sex: :female, skill: :casual, status: :blocked)
|
262
|
+
user_3 = User.create(sex: :male, skill: :pro)
|
212
263
|
|
213
|
-
|
214
|
-
|
264
|
+
expect(User.with_status(:active).to_a).must_equal [user_1]
|
265
|
+
expect(User.with_status(:blocked).to_a).must_equal [user_2]
|
266
|
+
expect(User.with_status(:active, :blocked).to_set).must_equal [user_1, user_2].to_set
|
215
267
|
|
216
|
-
User.
|
217
|
-
User.
|
218
|
-
User.with_status(:active, :blocked).to_set.must_equal [user_1, user_2].to_set
|
268
|
+
expect(User.without_status(:active).to_a).must_equal [user_2]
|
269
|
+
expect(User.without_status(:active, :blocked).to_a).must_equal []
|
219
270
|
|
220
|
-
User.
|
221
|
-
User.
|
271
|
+
expect(User.having_role(:admin).to_a).must_equal [user_1]
|
272
|
+
expect(User.male.to_a).must_equal [user_3]
|
273
|
+
expect(User.pro.to_a).must_equal [user_3]
|
222
274
|
|
223
|
-
User.
|
275
|
+
expect(User.not_male.to_set).must_equal [user_1, user_2].to_set
|
276
|
+
expect(User.not_pro.to_set).must_equal [user_1, user_2].to_set
|
224
277
|
end
|
225
278
|
|
226
279
|
it 'allows either key or value as valid' do
|
@@ -228,30 +281,30 @@ module SequelTest
|
|
228
281
|
user_2 = User.new(status: 1)
|
229
282
|
user_3 = User.new(status: '1')
|
230
283
|
|
231
|
-
user_1.status.must_equal 'active'
|
232
|
-
user_2.status.must_equal 'active'
|
233
|
-
user_3.status.must_equal 'active'
|
284
|
+
expect(user_1.status).must_equal 'active'
|
285
|
+
expect(user_2.status).must_equal 'active'
|
286
|
+
expect(user_3.status).must_equal 'active'
|
234
287
|
|
235
|
-
user_1.must_be :valid?
|
236
|
-
user_2.must_be :valid?
|
237
|
-
user_3.must_be :valid?
|
288
|
+
expect(user_1).must_be :valid?
|
289
|
+
expect(user_2).must_be :valid?
|
290
|
+
expect(user_3).must_be :valid?
|
238
291
|
end
|
239
292
|
|
240
293
|
it 'supports defining enumerized attributes on abstract class' do
|
241
|
-
Document.filter.delete
|
294
|
+
Document.filter{ true }.delete
|
242
295
|
|
243
296
|
document = Document.new
|
244
297
|
document.visibility = :protected
|
245
|
-
document.visibility.must_equal 'protected'
|
298
|
+
expect(document.visibility).must_equal 'protected'
|
246
299
|
end
|
247
300
|
|
248
301
|
it 'supports defining enumerized scopes on abstract class' do
|
249
|
-
Document.filter.delete
|
302
|
+
Document.filter{ true }.delete
|
250
303
|
|
251
304
|
document_1 = Document.create(visibility: :public)
|
252
305
|
document_2 = Document.create(visibility: :private)
|
253
306
|
|
254
|
-
Document.with_visibility(:public).to_a.must_equal [document_1]
|
307
|
+
expect(Document.with_visibility(:public).to_a).must_equal [document_1]
|
255
308
|
end
|
256
309
|
|
257
310
|
it 'validates uniqueness' do
|
@@ -260,13 +313,13 @@ module SequelTest
|
|
260
313
|
user = UniqStatusUser.new
|
261
314
|
user.sex = "male"
|
262
315
|
user.status = :active
|
263
|
-
user.valid
|
316
|
+
expect(user.valid?).must_equal false
|
264
317
|
|
265
|
-
user.errors[:status].wont_be :empty?
|
318
|
+
expect(user.errors[:status]).wont_be :empty?
|
266
319
|
end
|
267
320
|
|
268
321
|
it "doesn't update record" do
|
269
|
-
Document.filter.delete
|
322
|
+
Document.filter{ true }.delete
|
270
323
|
|
271
324
|
expected = Time.new(2010, 10, 10)
|
272
325
|
|
data/test/set_test.rb
CHANGED
@@ -1,18 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'yaml'
|
3
5
|
|
4
6
|
describe Enumerize::Set do
|
5
|
-
let(:
|
7
|
+
let(:kklass) do
|
6
8
|
Class.new do
|
7
9
|
extend Enumerize
|
8
10
|
enumerize :foo, :in => %w(a b c), :multiple => true
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
|
-
let(:object) {
|
14
|
+
let(:object) { kklass.new }
|
13
15
|
|
14
16
|
def build_set(values)
|
15
|
-
@set = Enumerize::Set.new(object,
|
17
|
+
@set = Enumerize::Set.new(object, kklass.foo, values)
|
16
18
|
end
|
17
19
|
|
18
20
|
def set
|
@@ -39,36 +41,36 @@ describe Enumerize::Set do
|
|
39
41
|
end
|
40
42
|
|
41
43
|
it 'equals to other set' do
|
42
|
-
set.must_equal Enumerize::Set.new(nil,
|
44
|
+
expect(set).must_equal Enumerize::Set.new(nil, kklass.foo, %w(a))
|
43
45
|
end
|
44
46
|
|
45
47
|
it 'equals to array' do
|
46
|
-
set.must_equal %w(a)
|
48
|
+
expect(set).must_equal %w(a)
|
47
49
|
end
|
48
50
|
|
49
51
|
it 'equals to array of symbols' do
|
50
|
-
set.must_equal [:a]
|
52
|
+
expect(set).must_equal [:a]
|
51
53
|
end
|
52
54
|
|
53
55
|
it 'has unique values' do
|
54
56
|
set << :a
|
55
|
-
set.must_equal %w(a)
|
57
|
+
expect(set).must_equal %w(a)
|
56
58
|
end
|
57
59
|
|
58
60
|
it 'equals to array with different value order' do
|
59
61
|
set << :b
|
60
|
-
set.must_equal %w(b a)
|
62
|
+
expect(set).must_equal %w(b a)
|
61
63
|
end
|
62
64
|
|
63
65
|
it "isn't equal to a part of values" do
|
64
66
|
set << :b
|
65
|
-
set.wont_equal %w(a)
|
67
|
+
expect(set).wont_equal %w(a)
|
66
68
|
end
|
67
69
|
|
68
70
|
describe '#push' do
|
69
71
|
it 'appends values' do
|
70
72
|
set.push :b
|
71
|
-
set.must_include :b
|
73
|
+
expect(set).must_include :b
|
72
74
|
end
|
73
75
|
|
74
76
|
it 'reassigns attribute' do
|
@@ -81,7 +83,7 @@ describe Enumerize::Set do
|
|
81
83
|
describe '#delete' do
|
82
84
|
it 'deletes value' do
|
83
85
|
set.delete :a
|
84
|
-
set.wont_include :a
|
86
|
+
expect(set).wont_include :a
|
85
87
|
end
|
86
88
|
|
87
89
|
it 'reassigns attribute' do
|
@@ -94,64 +96,64 @@ describe Enumerize::Set do
|
|
94
96
|
describe '#inspect' do
|
95
97
|
it 'returns custom string' do
|
96
98
|
set << :b
|
97
|
-
set.inspect.must_equal '#<Enumerize::Set {a, b}>'
|
99
|
+
expect(set.inspect).must_equal '#<Enumerize::Set {a, b}>'
|
98
100
|
end
|
99
101
|
end
|
100
102
|
|
101
103
|
describe '#to_ary' do
|
102
104
|
it 'returns array' do
|
103
|
-
set.to_ary.must_be_instance_of Array
|
105
|
+
expect(set.to_ary).must_be_instance_of Array
|
104
106
|
end
|
105
107
|
end
|
106
108
|
|
107
109
|
describe '#texts' do
|
108
110
|
it 'returns array of text values' do
|
109
|
-
set.texts.must_equal ['A']
|
111
|
+
expect(set.texts).must_equal ['A']
|
110
112
|
end
|
111
113
|
end
|
112
114
|
|
113
115
|
describe '#join' do
|
114
116
|
it 'joins values' do
|
115
117
|
set << :b
|
116
|
-
set.join(', ').must_equal 'a, b'
|
118
|
+
expect(set.join(', ')).must_equal 'a, b'
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
120
122
|
describe 'boolean methods comparison' do
|
121
123
|
it 'returns true if value equals method' do
|
122
124
|
set << :a
|
123
|
-
set.a
|
125
|
+
expect(set.a?).must_equal true
|
124
126
|
end
|
125
127
|
|
126
128
|
it 'returns false if value does not equal method' do
|
127
129
|
set << :a
|
128
|
-
set.b
|
130
|
+
expect(set.b?).must_equal false
|
129
131
|
end
|
130
132
|
|
131
133
|
it 'raises NoMethodError if there are no values like boolean method' do
|
132
|
-
proc {
|
134
|
+
expect(proc {
|
133
135
|
set.some_method?
|
134
|
-
}.must_raise NoMethodError
|
136
|
+
}).must_raise NoMethodError
|
135
137
|
end
|
136
138
|
|
137
139
|
it 'raises ArgumentError if arguments are passed' do
|
138
|
-
proc {
|
140
|
+
expect(proc {
|
139
141
|
set.a?('<3')
|
140
|
-
}.must_raise ArgumentError
|
142
|
+
}).must_raise ArgumentError
|
141
143
|
end
|
142
144
|
|
143
145
|
it 'responds to methods for existing values' do
|
144
|
-
set.must_respond_to :a?
|
145
|
-
set.must_respond_to :b?
|
146
|
-
set.must_respond_to :c?
|
146
|
+
expect(set).must_respond_to :a?
|
147
|
+
expect(set).must_respond_to :b?
|
148
|
+
expect(set).must_respond_to :c?
|
147
149
|
end
|
148
150
|
|
149
151
|
it 'returns a method object' do
|
150
|
-
set.method(:a?).must_be_instance_of Method
|
152
|
+
expect(set.method(:a?)).must_be_instance_of Method
|
151
153
|
end
|
152
154
|
|
153
155
|
it 'does not respond to a method for not existing value' do
|
154
|
-
set.wont_respond_to :some_method?
|
156
|
+
expect(set).wont_respond_to :some_method?
|
155
157
|
end
|
156
158
|
end
|
157
159
|
|
data/test/simple_form_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'simple_form/version'
|
3
5
|
|
@@ -40,6 +42,12 @@ class SimpleFormSpec < MiniTest::Spec
|
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
45
|
+
class Registration < Struct.new(:sex)
|
46
|
+
extend Enumerize
|
47
|
+
|
48
|
+
enumerize :sex, in: [:male, :female]
|
49
|
+
end
|
50
|
+
|
43
51
|
let(:user) { User.new }
|
44
52
|
let(:post) { Post.new }
|
45
53
|
|
@@ -128,4 +136,21 @@ class SimpleFormSpec < MiniTest::Spec
|
|
128
136
|
|
129
137
|
assert_select 'input.string'
|
130
138
|
end
|
139
|
+
|
140
|
+
it 'renders select with enumerized values for non-ActiveModel object' do
|
141
|
+
concat(simple_form_for(Registration.new, as: 'registration', url: '/') do |f|
|
142
|
+
f.input(:sex)
|
143
|
+
end)
|
144
|
+
|
145
|
+
assert_select 'select option[value=male]'
|
146
|
+
assert_select 'select option[value=female]'
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'does not affect forms without object' do
|
150
|
+
concat(simple_form_for('') do |f|
|
151
|
+
f.input(:name)
|
152
|
+
end)
|
153
|
+
|
154
|
+
assert_select 'input.string'
|
155
|
+
end
|
131
156
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_record'
|
4
|
+
require 'sequel'
|
5
|
+
|
6
|
+
module EnumerizeExtention
|
7
|
+
def self.included(base)
|
8
|
+
case
|
9
|
+
when base < ActiveRecord::Base
|
10
|
+
base.extend Enumerize
|
11
|
+
when base < Sequel::Model
|
12
|
+
base.plugin :enumerize
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module SkipValidationsEnum
|
18
|
+
def self.included(base)
|
19
|
+
base.include EnumerizeExtention
|
20
|
+
base.enumerize :foo, :in => [:bar, :baz], :skip_validations => true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module DoNotSkipValidationsEnum
|
25
|
+
def self.included(base)
|
26
|
+
base.include EnumerizeExtention
|
27
|
+
base.enumerize :foo, :in => [:bar, :baz], :skip_validations => false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module SkipValidationsLambdaEnum
|
32
|
+
def self.included(base)
|
33
|
+
base.include EnumerizeExtention
|
34
|
+
base.enumerize :foo, :in => [:bar, :baz], :skip_validations => lambda { true }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module SkipValidationsLambdaWithParamEnum
|
39
|
+
def self.included(base)
|
40
|
+
base.include EnumerizeExtention
|
41
|
+
base.enumerize :foo, :in => [:bar, :baz], :skip_validations => lambda { |record| true }
|
42
|
+
end
|
43
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_support/concern'
|
2
4
|
require 'active_support/testing/setup_and_teardown'
|
3
5
|
|
@@ -5,10 +7,21 @@ if defined?(ActionView::RoutingUrlFor)
|
|
5
7
|
ActionView::RoutingUrlFor.send(:include, ActionDispatch::Routing::UrlFor)
|
6
8
|
end
|
7
9
|
|
8
|
-
module
|
10
|
+
module SetupAndTeardownHelper
|
9
11
|
extend ActiveSupport::Concern
|
10
12
|
|
11
13
|
include ActiveSupport::Testing::SetupAndTeardown
|
14
|
+
|
15
|
+
included do
|
16
|
+
include ActiveSupport::Callbacks
|
17
|
+
define_callbacks :setup, :teardown
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module ViewTestHelper
|
22
|
+
extend ActiveSupport::Concern
|
23
|
+
|
24
|
+
include SetupAndTeardownHelper
|
12
25
|
include ActionView::TestCase::Behavior
|
13
26
|
|
14
27
|
included do
|