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