enumerize 2.1.2 → 2.4.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/.travis.yml +10 -9
- data/CHANGELOG.md +50 -3
- data/Gemfile +2 -3
- data/Gemfile.global +1 -2
- data/Gemfile.mongo_mapper +2 -3
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/README.md +37 -1
- data/Rakefile +2 -0
- data/lib/enumerize.rb +9 -0
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +33 -3
- 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.rb +2 -0
- data/lib/enumerize/integrations/rspec/matcher.rb +7 -2
- 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 +12 -0
- data/lib/enumerize/scope/mongoid.rb +11 -0
- data/lib/enumerize/scope/sequel.rb +12 -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 +1 -1
- 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 +127 -5
- data/test/attribute_map_test.rb +2 -0
- data/test/attribute_test.rb +7 -0
- data/test/base_test.rb +35 -33
- data/test/formtastic_test.rb +25 -0
- data/test/module_attributes_test.rb +2 -0
- data/test/mongo_mapper_test.rb +12 -3
- data/test/mongoid_test.rb +30 -4
- data/test/multiple_test.rb +19 -11
- data/test/predicates_test.rb +12 -10
- data/test/rails_admin_test.rb +7 -5
- data/test/sequel_test.rb +62 -12
- data/test/set_test.rb +6 -4
- data/test/simple_form_test.rb +25 -0
- data/test/support/mock_controller.rb +2 -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 +33 -5
- metadata +15 -9
- data/Gemfile.rails42 +0 -7
- data/Gemfile.rails51 +0 -7
data/spec/spec_helper.rb
CHANGED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
if defined?(::ActiveModel::Attributes)
|
|
6
|
+
|
|
7
|
+
describe Enumerize do
|
|
8
|
+
class ActiveModelUser
|
|
9
|
+
include ActiveModel::Model
|
|
10
|
+
include ActiveModel::Attributes
|
|
11
|
+
extend Enumerize
|
|
12
|
+
|
|
13
|
+
attribute :name, :string
|
|
14
|
+
enumerize :sex, :in => %w[male female]
|
|
15
|
+
enumerize :role, :in => %w[admin user], :default => 'user'
|
|
16
|
+
enumerize :interests, :in => [:music, :sports, :dancing, :programming], :multiple => true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class InterestsRequiredActiveModelUser < ActiveModelUser
|
|
20
|
+
validates :interests, presence: true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
let(:model) { ActiveModelUser }
|
|
24
|
+
|
|
25
|
+
it 'initialize value' do
|
|
26
|
+
user = model.new(:name => 'active_model_user', :sex => :male, :role => :user, :interests => [:music, :programming])
|
|
27
|
+
user.sex.must_equal 'male'
|
|
28
|
+
user.sex_text.must_equal 'Male'
|
|
29
|
+
user.role.must_equal 'user'
|
|
30
|
+
user.role_text.must_equal 'User'
|
|
31
|
+
user.interests.must_equal %w(music programming)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'sets nil if invalid value is passed' do
|
|
35
|
+
user = model.new
|
|
36
|
+
user.sex = :invalid
|
|
37
|
+
user.sex.must_be_nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'stores value' do
|
|
41
|
+
user = model.new
|
|
42
|
+
user.sex = :female
|
|
43
|
+
user.sex.must_equal 'female'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'has default value' do
|
|
47
|
+
model.new.role.must_equal 'user'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'validates inclusion' do
|
|
51
|
+
user = model.new
|
|
52
|
+
user.role = 'wrong'
|
|
53
|
+
user.wont_be :valid?
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'supports multiple attributes' do
|
|
57
|
+
user = ActiveModelUser.new
|
|
58
|
+
user.interests.must_be_instance_of Enumerize::Set
|
|
59
|
+
user.interests.must_be_empty
|
|
60
|
+
user.interests << :music
|
|
61
|
+
user.interests.must_equal %w(music)
|
|
62
|
+
user.interests << :sports
|
|
63
|
+
user.interests.must_equal %w(music sports)
|
|
64
|
+
|
|
65
|
+
user.interests = []
|
|
66
|
+
interests = user.interests
|
|
67
|
+
interests << :music
|
|
68
|
+
interests.must_equal %w(music)
|
|
69
|
+
interests << :dancing
|
|
70
|
+
interests.must_equal %w(music dancing)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'returns invalid multiple value for validation' do
|
|
74
|
+
user = ActiveModelUser.new
|
|
75
|
+
user.interests << :music
|
|
76
|
+
user.interests << :invalid
|
|
77
|
+
values = user.read_attribute_for_validation(:interests)
|
|
78
|
+
values.must_equal %w(music invalid)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it 'validates multiple attributes' do
|
|
82
|
+
user = ActiveModelUser.new
|
|
83
|
+
user.interests << :invalid
|
|
84
|
+
user.wont_be :valid?
|
|
85
|
+
|
|
86
|
+
user.interests = Object.new
|
|
87
|
+
user.wont_be :valid?
|
|
88
|
+
|
|
89
|
+
user.interests = ['music', '']
|
|
90
|
+
user.must_be :valid?
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'validates presence with multiple attributes' do
|
|
94
|
+
user = InterestsRequiredActiveModelUser.new
|
|
95
|
+
user.interests = []
|
|
96
|
+
user.valid?
|
|
97
|
+
|
|
98
|
+
user.errors[:interests].wont_be :empty?
|
|
99
|
+
|
|
100
|
+
user.interests = ['']
|
|
101
|
+
user.valid?
|
|
102
|
+
|
|
103
|
+
user.errors[:interests].wont_be :empty?
|
|
104
|
+
|
|
105
|
+
user.interests = [:dancing, :programming]
|
|
106
|
+
user.valid?
|
|
107
|
+
|
|
108
|
+
user.errors[:interests].must_be_empty
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
else
|
|
113
|
+
# Skip
|
|
114
|
+
end
|
data/test/activerecord_test.rb
CHANGED
|
@@ -44,7 +44,10 @@ ActiveRecord::Base.connection.instance_eval do
|
|
|
44
44
|
t.string :name
|
|
45
45
|
t.string :interests
|
|
46
46
|
t.integer :status
|
|
47
|
+
t.text :settings
|
|
48
|
+
t.integer :skill
|
|
47
49
|
t.string :account_type, :default => :basic
|
|
50
|
+
t.string :foo
|
|
48
51
|
end
|
|
49
52
|
|
|
50
53
|
create_table :documents do |t|
|
|
@@ -78,13 +81,18 @@ class User < ActiveRecord::Base
|
|
|
78
81
|
extend Enumerize
|
|
79
82
|
include RoleEnum
|
|
80
83
|
|
|
81
|
-
|
|
84
|
+
store :settings, accessors: [:language]
|
|
85
|
+
|
|
86
|
+
enumerize :sex, :in => [:male, :female], scope: :shallow
|
|
87
|
+
enumerize :language, :in => [:en, :jp]
|
|
82
88
|
|
|
83
89
|
serialize :interests, Array
|
|
84
90
|
enumerize :interests, :in => [:music, :sports, :dancing, :programming], :multiple => true
|
|
85
91
|
|
|
86
92
|
enumerize :status, :in => { active: 1, blocked: 2 }, scope: true
|
|
87
93
|
|
|
94
|
+
enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
|
|
95
|
+
|
|
88
96
|
enumerize :account_type, :in => [:basic, :premium]
|
|
89
97
|
|
|
90
98
|
# There is no column for relationship enumeration for testing purposes: model
|
|
@@ -103,6 +111,26 @@ class InterestsRequiredUser < User
|
|
|
103
111
|
validates :interests, presence: true
|
|
104
112
|
end
|
|
105
113
|
|
|
114
|
+
class SkipValidationsUser < ActiveRecord::Base
|
|
115
|
+
self.table_name = "users"
|
|
116
|
+
include SkipValidationsEnum
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
class DoNotSkipValidationsUser < ActiveRecord::Base
|
|
120
|
+
self.table_name = "users"
|
|
121
|
+
include DoNotSkipValidationsEnum
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
class SkipValidationsLambdaUser < ActiveRecord::Base
|
|
125
|
+
self.table_name = "users"
|
|
126
|
+
include SkipValidationsLambdaEnum
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
class SkipValidationsLambdaWithParamUser < ActiveRecord::Base
|
|
130
|
+
self.table_name = "users"
|
|
131
|
+
include SkipValidationsLambdaWithParamEnum
|
|
132
|
+
end
|
|
133
|
+
|
|
106
134
|
describe Enumerize::ActiveRecordSupport do
|
|
107
135
|
it 'sets nil if invalid value is passed' do
|
|
108
136
|
user = User.new
|
|
@@ -128,6 +156,21 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
128
156
|
end
|
|
129
157
|
end
|
|
130
158
|
|
|
159
|
+
it 'sets nil if invalid stored attribute value is passed' do
|
|
160
|
+
user = User.new
|
|
161
|
+
user.language = :invalid
|
|
162
|
+
user.language.must_be_nil
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it 'saves stored attribute value' do
|
|
166
|
+
User.delete_all
|
|
167
|
+
user = User.new
|
|
168
|
+
user.language = :en
|
|
169
|
+
user.save!
|
|
170
|
+
user.reload
|
|
171
|
+
user.language.must_equal 'en'
|
|
172
|
+
end
|
|
173
|
+
|
|
131
174
|
it 'has default value' do
|
|
132
175
|
User.new.role.must_equal 'user'
|
|
133
176
|
User.new.attributes['role'].must_equal 'user'
|
|
@@ -137,7 +180,9 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
137
180
|
User.delete_all
|
|
138
181
|
User.create!(:sex => :male)
|
|
139
182
|
|
|
140
|
-
|
|
183
|
+
user = User.select(:id).first
|
|
184
|
+
user.attributes['role'].must_equal nil
|
|
185
|
+
user.attributes['lambda_role'].must_equal nil
|
|
141
186
|
end
|
|
142
187
|
|
|
143
188
|
it 'has default value with lambda' do
|
|
@@ -173,6 +218,14 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
173
218
|
user.errors[:role].must_include 'is not included in the list'
|
|
174
219
|
end
|
|
175
220
|
|
|
221
|
+
it 'sets value to enumerized field from db when record is reloaded' do
|
|
222
|
+
user = User.create!(interests: [:music])
|
|
223
|
+
User.find(user.id).update(interests: %i[music dancing])
|
|
224
|
+
user.interests.must_equal %w[music]
|
|
225
|
+
user.reload
|
|
226
|
+
user.interests.must_equal %w[music dancing]
|
|
227
|
+
end
|
|
228
|
+
|
|
176
229
|
it 'validates inclusion when using write_attribute with string attribute' do
|
|
177
230
|
user = User.new
|
|
178
231
|
user.send(:write_attribute, 'role', 'wrong')
|
|
@@ -212,6 +265,31 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
212
265
|
user.read_attribute(:role).must_be_nil
|
|
213
266
|
end
|
|
214
267
|
|
|
268
|
+
it 'validates inclusion when :skip_validations = false' do
|
|
269
|
+
user = DoNotSkipValidationsUser.new
|
|
270
|
+
user.foo = 'wrong'
|
|
271
|
+
user.wont_be :valid?
|
|
272
|
+
user.errors[:foo].must_include 'is not included in the list'
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
it 'does not validate inclusion when :skip_validations = true' do
|
|
276
|
+
user = SkipValidationsUser.new
|
|
277
|
+
user.foo = 'wrong'
|
|
278
|
+
user.must_be :valid?
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
it 'supports :skip_validations option as lambda' do
|
|
282
|
+
user = SkipValidationsLambdaUser.new
|
|
283
|
+
user.foo = 'wrong'
|
|
284
|
+
user.must_be :valid?
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
it 'supports :skip_validations option as lambda with a parameter' do
|
|
288
|
+
user = SkipValidationsLambdaWithParamUser.new
|
|
289
|
+
user.foo = 'wrong'
|
|
290
|
+
user.must_be :valid?
|
|
291
|
+
end
|
|
292
|
+
|
|
215
293
|
it 'supports multiple attributes' do
|
|
216
294
|
user = User.new
|
|
217
295
|
user.interests.must_be_empty
|
|
@@ -263,7 +341,11 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
263
341
|
it 'stores custom values for multiple attributes' do
|
|
264
342
|
User.delete_all
|
|
265
343
|
|
|
266
|
-
klass = Class.new(User)
|
|
344
|
+
klass = Class.new(User) do
|
|
345
|
+
def self.name
|
|
346
|
+
'UserSubclass'
|
|
347
|
+
end
|
|
348
|
+
end
|
|
267
349
|
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
|
268
350
|
|
|
269
351
|
user = klass.new
|
|
@@ -281,6 +363,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
281
363
|
|
|
282
364
|
user_1 = User.create!(status: :active, role: :admin)
|
|
283
365
|
user_2 = User.create!(status: :blocked)
|
|
366
|
+
user_3 = User.create!(sex: :male, skill: :pro)
|
|
284
367
|
|
|
285
368
|
User.with_status(:active).must_equal [user_1]
|
|
286
369
|
User.with_status(:blocked).must_equal [user_2]
|
|
@@ -289,7 +372,8 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
289
372
|
User.without_status(:active).must_equal [user_2]
|
|
290
373
|
User.without_status(:active, :blocked).must_equal []
|
|
291
374
|
|
|
292
|
-
User.
|
|
375
|
+
User.male.must_equal [user_3]
|
|
376
|
+
User.pro.must_equal [user_3]
|
|
293
377
|
end
|
|
294
378
|
|
|
295
379
|
it 'ignores not enumerized values that passed to the scope method' do
|
|
@@ -433,7 +517,11 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
433
517
|
it 'allows using update_all for multiple enumerize' do
|
|
434
518
|
User.delete_all
|
|
435
519
|
|
|
436
|
-
klass = Class.new(User)
|
|
520
|
+
klass = Class.new(User) do
|
|
521
|
+
def self.name
|
|
522
|
+
'UserSubclass'
|
|
523
|
+
end
|
|
524
|
+
end
|
|
437
525
|
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
|
438
526
|
|
|
439
527
|
user = klass.create(status: :active)
|
|
@@ -522,4 +610,38 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
522
610
|
user = YAML.load(User.create(status: :blocked).to_yaml)
|
|
523
611
|
user.status.must_equal 'blocked'
|
|
524
612
|
end
|
|
613
|
+
|
|
614
|
+
# https://github.com/brainspec/enumerize/issues/304
|
|
615
|
+
it "fallbacks to a raw passed value if AR type can't find value in the attribute" do
|
|
616
|
+
table = User.arel_table
|
|
617
|
+
sql = User.where(table[:account_type].matches '%foo%').to_sql
|
|
618
|
+
|
|
619
|
+
sql.must_include 'LIKE \'%foo%\''
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
if Rails::VERSION::MAJOR >= 6
|
|
623
|
+
it 'supports AR#insert_all' do
|
|
624
|
+
User.delete_all
|
|
625
|
+
|
|
626
|
+
User.insert_all([{ sex: :male }])
|
|
627
|
+
User.insert_all([{ status: :active }])
|
|
628
|
+
User.insert_all([{ interests: [:music, :sports] }])
|
|
629
|
+
|
|
630
|
+
User.exists?(sex: :male).must_equal true
|
|
631
|
+
User.exists?(status: :active).must_equal true
|
|
632
|
+
User.exists?(interests: [:music, :sports]).must_equal true
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
it 'supports AR#upsert_all' do
|
|
636
|
+
User.delete_all
|
|
637
|
+
|
|
638
|
+
User.upsert_all([{ sex: :male }])
|
|
639
|
+
User.upsert_all([{ status: :active }])
|
|
640
|
+
User.upsert_all([{ interests: [:music, :sports] }])
|
|
641
|
+
|
|
642
|
+
User.exists?(sex: :male).must_equal true
|
|
643
|
+
User.exists?(status: :active).must_equal true
|
|
644
|
+
User.exists?(interests: [:music, :sports]).must_equal true
|
|
645
|
+
end
|
|
646
|
+
end
|
|
525
647
|
end
|
data/test/attribute_map_test.rb
CHANGED
data/test/attribute_test.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'test_helper'
|
|
2
4
|
|
|
3
5
|
describe Enumerize::Attribute do
|
|
@@ -14,6 +16,11 @@ describe Enumerize::Attribute do
|
|
|
14
16
|
attr.values.must_equal %w[a b]
|
|
15
17
|
end
|
|
16
18
|
|
|
19
|
+
it 'returns frozen values' do
|
|
20
|
+
build_attr nil, :foo, :in => [:a, :b]
|
|
21
|
+
attr.values.map(&:frozen?).must_equal [true, true]
|
|
22
|
+
end
|
|
23
|
+
|
|
17
24
|
it 'converts name to symbol' do
|
|
18
25
|
build_attr nil, 'foo', :in => %w[a b]
|
|
19
26
|
attr.name.must_equal :foo
|
data/test/base_test.rb
CHANGED
|
@@ -1,32 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'test_helper'
|
|
2
4
|
|
|
3
5
|
describe Enumerize::Base do
|
|
4
|
-
let(:
|
|
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(
|
|
13
|
+
Class.new(kklass)
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
let(:object) {
|
|
16
|
+
let(:object) { kklass.new }
|
|
15
17
|
|
|
16
18
|
it 'returns nil when not set' do
|
|
17
|
-
|
|
19
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
18
20
|
object.foo.must_be_nil
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
it 'returns value that was set' do
|
|
22
|
-
|
|
24
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
23
25
|
object.foo = :a
|
|
24
26
|
object.foo.must_equal 'a'
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
it 'returns translation' do
|
|
28
30
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text'}}) do
|
|
29
|
-
|
|
31
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
30
32
|
object.foo = :a
|
|
31
33
|
object.foo.text.must_equal 'a text'
|
|
32
34
|
object.foo_text.must_equal 'a text'
|
|
@@ -36,14 +38,14 @@ describe Enumerize::Base do
|
|
|
36
38
|
|
|
37
39
|
it 'returns nil as translation when value is nil' do
|
|
38
40
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text'}}) do
|
|
39
|
-
|
|
41
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
40
42
|
object.foo_text.must_be_nil
|
|
41
43
|
end
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
it 'scopes translation by i18n key' do
|
|
45
|
-
def
|
|
46
|
-
name = "ExampleClass"
|
|
47
|
+
def kklass.model_name
|
|
48
|
+
name = String.new("ExampleClass")
|
|
47
49
|
def name.i18n_key
|
|
48
50
|
'example_class'
|
|
49
51
|
end
|
|
@@ -52,7 +54,7 @@ describe Enumerize::Base do
|
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
store_translations(:en, :enumerize => {:example_class => {:foo => {:a => 'a text scoped'}}}) do
|
|
55
|
-
|
|
57
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
56
58
|
object.foo = :a
|
|
57
59
|
object.foo.text.must_equal 'a text scoped'
|
|
58
60
|
object.foo_text.must_equal 'a text scoped'
|
|
@@ -61,88 +63,88 @@ describe Enumerize::Base do
|
|
|
61
63
|
|
|
62
64
|
it 'returns humanized value if there are no translations' do
|
|
63
65
|
store_translations(:en, :enumerize => {}) do
|
|
64
|
-
|
|
66
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
65
67
|
object.foo = :a
|
|
66
68
|
object.foo_text.must_equal 'A'
|
|
67
69
|
end
|
|
68
70
|
end
|
|
69
71
|
|
|
70
72
|
it 'stores value as string' do
|
|
71
|
-
|
|
73
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
72
74
|
object.foo = :a
|
|
73
75
|
object.instance_variable_get(:@foo).must_be_instance_of String
|
|
74
76
|
end
|
|
75
77
|
|
|
76
78
|
it 'handles default value' do
|
|
77
|
-
|
|
79
|
+
kklass.enumerize(:foo, :in => [:a, :b], :default => :b)
|
|
78
80
|
object.foo.must_equal 'b'
|
|
79
81
|
end
|
|
80
82
|
|
|
81
83
|
it 'handles default value with lambda' do
|
|
82
|
-
|
|
84
|
+
kklass.enumerize(:foo, :in => [:a, :b], :default => lambda { :b })
|
|
83
85
|
object.foo.must_equal 'b'
|
|
84
86
|
end
|
|
85
87
|
|
|
86
88
|
it 'injects object instance into lamda default value' do
|
|
87
|
-
|
|
89
|
+
kklass.enumerize(:foo, :in => [:a, :b], :default => lambda { |obj| :b if obj.is_a? kklass })
|
|
88
90
|
object.foo.must_equal 'b'
|
|
89
91
|
end
|
|
90
92
|
|
|
91
93
|
it 'raises exception on invalid default value' do
|
|
92
94
|
proc {
|
|
93
|
-
|
|
95
|
+
kklass.enumerize(:foo, :in => [:a, :b], :default => :c)
|
|
94
96
|
}.must_raise ArgumentError
|
|
95
97
|
end
|
|
96
98
|
|
|
97
99
|
it 'has enumerized attributes' do
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
100
|
+
kklass.enumerized_attributes.must_be_empty
|
|
101
|
+
kklass.enumerize(:foo, :in => %w[a b])
|
|
102
|
+
kklass.enumerized_attributes[:foo].must_be_instance_of Enumerize::Attribute
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
it "doesn't override existing method" do
|
|
104
|
-
method =
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
method = kklass.method(:name)
|
|
107
|
+
kklass.enumerize(:name, :in => %w[a b], :default => 'a')
|
|
108
|
+
kklass.method(:name).must_equal method
|
|
107
109
|
end
|
|
108
110
|
|
|
109
111
|
it "inherits enumerized attributes from a parent class" do
|
|
110
|
-
|
|
112
|
+
kklass.enumerize(:foo, :in => %w[a b])
|
|
111
113
|
subklass.enumerized_attributes[:foo].must_be_instance_of Enumerize::Attribute
|
|
112
114
|
end
|
|
113
115
|
|
|
114
116
|
it "inherits enumerized attributes from a grandparent class" do
|
|
115
|
-
|
|
117
|
+
kklass.enumerize(:foo, :in => %w[a b])
|
|
116
118
|
Class.new(subklass).enumerized_attributes[:foo].must_be_instance_of Enumerize::Attribute
|
|
117
119
|
end
|
|
118
120
|
|
|
119
121
|
it "doesn't add enumerized attributes to parent class" do
|
|
120
|
-
|
|
122
|
+
kklass.enumerize(:foo, :in => %w[a b])
|
|
121
123
|
subklass.enumerize(:bar, :in => %w[c d])
|
|
122
124
|
|
|
123
|
-
|
|
125
|
+
kklass.enumerized_attributes[:bar].must_be_nil
|
|
124
126
|
end
|
|
125
127
|
|
|
126
128
|
it 'adds new parent class attributes to subclass' do
|
|
127
|
-
subklass = Class.new(
|
|
128
|
-
|
|
129
|
+
subklass = Class.new(kklass)
|
|
130
|
+
kklass.enumerize :foo, :in => %w[a b]
|
|
129
131
|
subklass.enumerized_attributes[:foo].must_be_instance_of Enumerize::Attribute
|
|
130
132
|
end
|
|
131
133
|
|
|
132
134
|
it 'stores nil value' do
|
|
133
|
-
|
|
135
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
134
136
|
object.foo = nil
|
|
135
137
|
object.instance_variable_get(:@foo).must_be_nil
|
|
136
138
|
end
|
|
137
139
|
|
|
138
140
|
it 'casts value to string for validation' do
|
|
139
|
-
|
|
141
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
140
142
|
object.foo = :c
|
|
141
143
|
object.read_attribute_for_validation(:foo).must_equal 'c'
|
|
142
144
|
end
|
|
143
145
|
|
|
144
146
|
it "doesn't cast nil to string for validation" do
|
|
145
|
-
|
|
147
|
+
kklass.enumerize(:foo, :in => [:a, :b])
|
|
146
148
|
object.foo = nil
|
|
147
149
|
object.read_attribute_for_validation(:foo).must_be_nil
|
|
148
150
|
end
|
|
@@ -179,7 +181,7 @@ describe Enumerize::Base do
|
|
|
179
181
|
end
|
|
180
182
|
|
|
181
183
|
it 'stores hash values' do
|
|
182
|
-
|
|
184
|
+
kklass.enumerize(:foo, :in => {:a => 1, :b => 2})
|
|
183
185
|
|
|
184
186
|
object.foo = :a
|
|
185
187
|
object.instance_variable_get(:@foo).must_equal 1
|
|
@@ -191,7 +193,7 @@ describe Enumerize::Base do
|
|
|
191
193
|
end
|
|
192
194
|
|
|
193
195
|
it 'returns custom value' do
|
|
194
|
-
|
|
196
|
+
kklass.enumerize(:foo, :in => {:a => 1, :b => 2})
|
|
195
197
|
|
|
196
198
|
object.foo = :a
|
|
197
199
|
object.foo_value.must_equal 1
|