simple_enum 1.4.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -1
- data/.travis.yml +7 -3
- data/Appraisals +14 -0
- data/Gemfile +7 -1
- data/Gemfile.lock +57 -0
- data/README.rdoc +48 -4
- data/Rakefile +3 -3
- data/gemfiles/rails-3.0.gemfile +11 -0
- data/gemfiles/rails-3.0.gemfile.lock +56 -0
- data/gemfiles/rails-3.1.gemfile +11 -0
- data/gemfiles/rails-3.1.gemfile.lock +58 -0
- data/gemfiles/rails-3.2.gemfile +11 -0
- data/gemfiles/rails-3.2.gemfile.lock +58 -0
- data/lib/simple_enum.rb +35 -16
- data/lib/simple_enum/enum_hash.rb +24 -14
- data/lib/simple_enum/mongoid.rb +52 -0
- data/lib/simple_enum/validation.rb +1 -1
- data/lib/simple_enum/version.rb +1 -1
- data/locales/en.yml +4 -0
- data/simple_enum.gemspec +8 -6
- data/test/array_conversions_test.rb +9 -11
- data/test/class_methods_test.rb +20 -34
- data/test/dirty_attributes_test.rb +4 -5
- data/test/enum_hash_test.rb +16 -21
- data/test/finders_test.rb +13 -9
- data/test/locales.yml +17 -9
- data/test/mongoid_test.rb +38 -0
- data/test/object_backed_test.rb +17 -23
- data/test/orm/active_record.rb +99 -0
- data/test/orm/common.rb +23 -0
- data/test/orm/mongoid.rb +101 -0
- data/test/poro_test.rb +20 -0
- data/test/prefixes_test.rb +5 -7
- data/test/simple_enum_test.rb +68 -55
- data/test/test_helper.rb +22 -49
- data/test/without_shortcuts_test.rb +8 -9
- metadata +101 -39
- data/lib/simple_enum/object_support.rb +0 -37
- data/test/object_support_test.rb +0 -29
data/test/orm/mongoid.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'mongoid/version'
|
2
|
+
require 'simple_enum/mongoid'
|
3
|
+
|
4
|
+
def orm_version
|
5
|
+
Mongoid::VERSION
|
6
|
+
end
|
7
|
+
|
8
|
+
def setup_db
|
9
|
+
# create database connection
|
10
|
+
Mongoid.configure do |config|
|
11
|
+
config.master = Mongo::Connection.new('localhost').db("simple-enum-test-suite")
|
12
|
+
config.use_utc = true
|
13
|
+
config.include_root_in_json = true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
# Reload database
|
19
|
+
def reload_db(options = {})
|
20
|
+
|
21
|
+
# clear collections except system
|
22
|
+
Mongoid.master.collections.select do |collection|
|
23
|
+
collection.name !~ /system/
|
24
|
+
end.each(&:drop)
|
25
|
+
|
26
|
+
fill_db(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
# models
|
30
|
+
def anonymous_dummy(&block)
|
31
|
+
Class.new do
|
32
|
+
include Mongoid::Document
|
33
|
+
include SimpleEnum::Mongoid
|
34
|
+
self.collection_name = 'dummies'
|
35
|
+
instance_eval &block
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def extend_computer(current_i18n_name = "Computer", &block)
|
40
|
+
Class.new(Computer) do
|
41
|
+
self.collection_name = 'computers'
|
42
|
+
instance_eval &block
|
43
|
+
instance_eval <<-RUBY
|
44
|
+
def self.model_name; MockName.mock!(#{current_i18n_name.inspect}) end
|
45
|
+
RUBY
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def named_dummy(class_name, &block)
|
50
|
+
begin
|
51
|
+
return class_name.constantize
|
52
|
+
rescue NameError
|
53
|
+
klass = Object.const_set(class_name, Class.new)
|
54
|
+
klass.module_eval do
|
55
|
+
include Mongoid::Document
|
56
|
+
include SimpleEnum::Mongoid
|
57
|
+
|
58
|
+
self.collection_name = 'dummies'
|
59
|
+
instance_eval &block
|
60
|
+
end
|
61
|
+
|
62
|
+
klass
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
class Dummy
|
68
|
+
include Mongoid::Document
|
69
|
+
include SimpleEnum::Mongoid
|
70
|
+
|
71
|
+
as_enum :gender, [:male, :female]
|
72
|
+
as_enum :word, { :alpha => 'alpha', :beta => 'beta', :gamma => 'gamma'}
|
73
|
+
as_enum :didum, [ :foo, :bar, :foobar ], :column => 'other'
|
74
|
+
|
75
|
+
before_save :check_typed
|
76
|
+
|
77
|
+
def check_typed
|
78
|
+
attributes['_type'] = nil unless (self.hereditary? || self.polymorphic?)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
class Gender
|
84
|
+
include Mongoid::Document
|
85
|
+
include SimpleEnum::Mongoid
|
86
|
+
|
87
|
+
field :name, :type => String
|
88
|
+
end
|
89
|
+
|
90
|
+
class Computer
|
91
|
+
include Mongoid::Document
|
92
|
+
include SimpleEnum::Mongoid
|
93
|
+
|
94
|
+
field :name, :type => String
|
95
|
+
|
96
|
+
as_enum :manufacturer, [:dell, :compaq, :apple]
|
97
|
+
as_enum :operating_system, [:windows, :osx, :linux, :bsd]
|
98
|
+
end
|
99
|
+
|
100
|
+
# Used to test STI stuff
|
101
|
+
class SpecificDummy < Dummy; end
|
data/test/poro_test.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class POROTest < MiniTest::Unit::TestCase
|
4
|
+
class MyPORO
|
5
|
+
include SimpleEnum
|
6
|
+
|
7
|
+
attr_accessor :gender_cd
|
8
|
+
as_enum :gender, [:male, :female]
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_reading_and_writing
|
12
|
+
poro = POROTest::MyPORO.new
|
13
|
+
poro.gender_cd = 1
|
14
|
+
assert_equal :female, poro.gender
|
15
|
+
|
16
|
+
poro.male!
|
17
|
+
assert_equal 0, poro.gender_cd
|
18
|
+
assert_equal :male, poro.gender
|
19
|
+
end
|
20
|
+
end
|
data/test/prefixes_test.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class PrefixesTest <
|
3
|
+
class PrefixesTest < MiniTest::Unit::TestCase
|
4
4
|
def setup
|
5
5
|
reload_db
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
with_prefix =
|
10
|
-
set_table_name 'dummies'
|
8
|
+
def test_that_gender_is_prefixed_in_getters_and_setters
|
9
|
+
with_prefix = anonymous_dummy do
|
11
10
|
as_enum :gender, [:male, :female], :prefix => true
|
12
11
|
end
|
13
12
|
|
@@ -21,9 +20,8 @@ class PrefixesTest < ActiveSupport::TestCase
|
|
21
20
|
assert !d.respond_to?(:male!)
|
22
21
|
end
|
23
22
|
|
24
|
-
|
25
|
-
with_string_prefix =
|
26
|
-
set_table_name 'dummies'
|
23
|
+
def test_that_custom_prefix_is_applied_to_getters_and_setters
|
24
|
+
with_string_prefix = anonymous_dummy do
|
27
25
|
as_enum :gender, [:male, :female], :prefix => 'didum'
|
28
26
|
end
|
29
27
|
|
data/test/simple_enum_test.rb
CHANGED
@@ -1,51 +1,76 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class SimpleEnumTest <
|
3
|
+
class SimpleEnumTest < MiniTest::Unit::TestCase
|
4
4
|
def setup
|
5
5
|
reload_db
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
def test_reading_public_enum_definitions
|
9
9
|
assert_equal "gender_cd", Dummy.enum_definitions[:gender][:column]
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
def test_getting_the_correct_integer_values_when_setting_to_symbol
|
13
13
|
d = Dummy.new
|
14
14
|
d.gender = :male
|
15
15
|
assert_equal(0, d.gender_cd)
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
def test_getting_the_correct_symbold_when_setting_the_integer_value
|
19
19
|
d = Dummy.new
|
20
20
|
d.gender_cd = 1
|
21
21
|
assert_equal(:female, d.gender)
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
def test_that_checker_returns_correct_result
|
25
25
|
d = Dummy.new
|
26
26
|
d.gender = :male
|
27
27
|
assert_equal(true, d.male?)
|
28
28
|
assert_equal(false, d.female?)
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
def test_enum_comparisons
|
32
|
+
d = Dummy.new
|
33
|
+
assert_equal(false, d.gender?)
|
34
|
+
d.gender = :male
|
35
|
+
assert_equal(true, d.gender?)
|
36
|
+
assert_equal(true, d.gender?(:male))
|
37
|
+
assert_equal(false, d.gender?(:female))
|
38
|
+
assert_equal(false, d.gender?(:whot))
|
39
|
+
d.gender = :female
|
40
|
+
assert_equal(true, d.gender?(:female))
|
41
|
+
assert_equal(false, d.gender?(:male))
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_enum_comparisons_with_strings
|
45
|
+
d = Dummy.new(:gender => :male)
|
46
|
+
assert_equal(true, d.gender?("male"))
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_enum_comparisons_with_nil_always_returns_false
|
50
|
+
d = Dummy.new(:gender => :male)
|
51
|
+
assert_equal(false, d.gender?(nil))
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_getting_symbol_when_data_is_fetched_from_datasource
|
55
|
+
dummies = Dummy.all
|
56
|
+
|
32
57
|
# Anna
|
33
|
-
assert_equal(:female,
|
34
|
-
assert_equal(:alpha,
|
35
|
-
assert_equal(:foo,
|
58
|
+
assert_equal(:female, dummies[0].gender)
|
59
|
+
assert_equal(:alpha, dummies[0].word)
|
60
|
+
assert_equal(:foo, dummies[0].didum)
|
36
61
|
|
37
62
|
# Bella
|
38
|
-
assert_equal(true,
|
39
|
-
assert_equal(true,
|
40
|
-
assert_equal(:bar,
|
63
|
+
assert_equal(true, dummies[1].female?)
|
64
|
+
assert_equal(true, dummies[1].beta?)
|
65
|
+
assert_equal(:bar, dummies[1].didum)
|
41
66
|
|
42
67
|
# Chris
|
43
|
-
assert_equal(false,
|
44
|
-
assert_equal(:gamma,
|
45
|
-
assert_equal(:foobar,
|
68
|
+
assert_equal(false, dummies[2].female?)
|
69
|
+
assert_equal(:gamma, dummies[2].word)
|
70
|
+
assert_equal(:foobar, dummies[2].didum)
|
46
71
|
end
|
47
72
|
|
48
|
-
|
73
|
+
def test_creating_and_saving_a_new_datasource_object_then_test_symbols
|
49
74
|
d = Dummy.create({ :name => 'Dummy', :gender_cd => 0 }) # :gender => male
|
50
75
|
assert_equal(true, d.male?)
|
51
76
|
|
@@ -55,16 +80,14 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
55
80
|
assert_equal(true, Dummy.find(d.id).female?)
|
56
81
|
end
|
57
82
|
|
58
|
-
|
59
|
-
|
60
|
-
set_table_name 'computers'
|
61
|
-
|
83
|
+
def test_validation_if
|
84
|
+
validate_if_comp = extend_computer do
|
62
85
|
validates_as_enum :manufacturer, :if => lambda { |computer|
|
63
86
|
computer.name == "Fred"
|
64
87
|
}
|
65
88
|
end
|
66
89
|
|
67
|
-
computer =
|
90
|
+
computer = validate_if_comp.new(:manufacturer_cd => 48328432)
|
68
91
|
|
69
92
|
computer.name = nil
|
70
93
|
assert_equal(true, computer.save)
|
@@ -73,16 +96,14 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
73
96
|
assert_equal(false, computer.save)
|
74
97
|
end
|
75
98
|
|
76
|
-
|
77
|
-
|
78
|
-
set_table_name 'computers'
|
79
|
-
|
99
|
+
def test_validation_unless
|
100
|
+
validate_unless_comp = extend_computer do
|
80
101
|
validates_as_enum :manufacturer, :unless => lambda { |computer|
|
81
102
|
computer.name == "Unless"
|
82
103
|
}
|
83
104
|
end
|
84
105
|
|
85
|
-
computer =
|
106
|
+
computer = validate_unless_comp.new(:manufacturer_cd => 48328432)
|
86
107
|
|
87
108
|
computer.name = nil
|
88
109
|
assert_equal(false, computer.save)
|
@@ -92,14 +113,12 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
92
113
|
assert_equal(true, computer.save)
|
93
114
|
end
|
94
115
|
|
95
|
-
|
96
|
-
|
97
|
-
set_table_name 'computers'
|
98
|
-
|
116
|
+
def test_validation_on_update
|
117
|
+
validate_update_comp = extend_computer do
|
99
118
|
validates_as_enum :manufacturer, :on => :update
|
100
119
|
end
|
101
120
|
|
102
|
-
computer =
|
121
|
+
computer = validate_update_comp.new(:manufacturer_cd => nil)
|
103
122
|
assert_equal(true, computer.save)
|
104
123
|
|
105
124
|
computer.name = 'Something else'
|
@@ -107,14 +126,12 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
107
126
|
assert_equal(1, computer.errors[:manufacturer].size)
|
108
127
|
end
|
109
128
|
|
110
|
-
|
111
|
-
|
112
|
-
set_table_name 'computers'
|
113
|
-
|
129
|
+
def test_validation_on_create
|
130
|
+
validate_create_comp = extend_computer do
|
114
131
|
validates_as_enum :manufacturer, :on => :create
|
115
132
|
end
|
116
133
|
|
117
|
-
computer =
|
134
|
+
computer = validate_create_comp.new(:manufacturer_cd => nil)
|
118
135
|
assert_equal(false, computer.save)
|
119
136
|
assert_equal(1, computer.errors[:manufacturer].size)
|
120
137
|
|
@@ -125,14 +142,12 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
125
142
|
assert_equal(true, computer.save)
|
126
143
|
end
|
127
144
|
|
128
|
-
|
129
|
-
|
130
|
-
set_table_name 'computers'
|
131
|
-
|
145
|
+
def test_validation_allow_nil
|
146
|
+
validate_nil_comp = extend_computer do
|
132
147
|
validates_as_enum :manufacturer, :allow_nil => true
|
133
148
|
end
|
134
149
|
|
135
|
-
computer =
|
150
|
+
computer = validate_nil_comp.new(:manufacturer_cd => nil)
|
136
151
|
assert_equal(true, computer.save)
|
137
152
|
|
138
153
|
computer.manufacturer = :apple
|
@@ -143,37 +158,35 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
143
158
|
assert_equal(1, computer.errors[:manufacturer].size)
|
144
159
|
end
|
145
160
|
|
146
|
-
|
147
|
-
|
148
|
-
set_table_name 'computers'
|
161
|
+
def test_default_error_messages_using_translations
|
162
|
+
validated_comp = extend_computer("ValidatedComputer") do
|
149
163
|
validates_as_enum :manufacturer
|
150
164
|
validates_as_enum :operating_system
|
151
165
|
end
|
152
166
|
|
153
|
-
computer =
|
167
|
+
computer = validated_comp.new
|
154
168
|
assert !computer.save, "save should return false"
|
155
169
|
assert_equal "invalid option supplied.", computer.errors[:manufacturer].first
|
156
170
|
assert_equal "y u no os?", computer.errors[:operating_system].first
|
157
171
|
end
|
158
172
|
|
159
|
-
|
160
|
-
|
161
|
-
set_table_name 'computers'
|
173
|
+
def test_allow_setting_custom_error_via_message
|
174
|
+
validate_msg_comp = extend_computer do
|
162
175
|
validates_as_enum :manufacturer, :message => "invalid manufacturer"
|
163
176
|
end
|
164
177
|
|
165
|
-
computer =
|
178
|
+
computer = validate_msg_comp.new
|
166
179
|
assert !computer.valid?, "valid? should return false"
|
167
180
|
assert_equal "invalid manufacturer", computer.errors[:manufacturer].first
|
168
181
|
end
|
169
182
|
|
170
|
-
|
171
|
-
|
183
|
+
def test_that_argumenterror_is_raised_if_invalid_symbol_is_passed
|
184
|
+
assert_raises ArgumentError do
|
172
185
|
Dummy.new :gender => :foo
|
173
186
|
end
|
174
187
|
end
|
175
188
|
|
176
|
-
|
189
|
+
def test_that_no_argumenterror_is_raised_if_whiny_is_false
|
177
190
|
not_whiny = Class.new(Dummy) do
|
178
191
|
as_enum :gender, [:male, :female], :whiny => false
|
179
192
|
end
|
@@ -184,7 +197,7 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
184
197
|
assert_nil(d.gender)
|
185
198
|
end
|
186
199
|
|
187
|
-
|
200
|
+
def test_that_setting_to_nil_works_if_whiny_is_true_or_false
|
188
201
|
d = Dummy.new :gender => :male
|
189
202
|
assert_equal(:male, d.gender)
|
190
203
|
d.gender = nil
|
@@ -204,13 +217,13 @@ class SimpleEnumTest < ActiveSupport::TestCase
|
|
204
217
|
assert_nil(d.gender)
|
205
218
|
end
|
206
219
|
|
207
|
-
|
220
|
+
def test_deprecation_warning_when_using_enum_name_eq_column_name
|
208
221
|
original_behavior = ActiveSupport::Deprecation.behavior
|
209
222
|
begin
|
210
223
|
expected = 0
|
211
224
|
ActiveSupport::Deprecation.silenced = false
|
212
225
|
ActiveSupport::Deprecation.behavior = Proc.new { |msg, cb| expected += 1 if msg =~ /\[simple_enum\].+gender_cd/ }
|
213
|
-
invalid_dummy =
|
226
|
+
invalid_dummy = anonymous_dummy do
|
214
227
|
as_enum :gender_cd, [:male, :female], :column => "gender_cd"
|
215
228
|
end
|
216
229
|
|
data/test/test_helper.rb
CHANGED
@@ -8,65 +8,38 @@ require 'bundler/setup'
|
|
8
8
|
|
9
9
|
require 'test/unit'
|
10
10
|
require 'active_support'
|
11
|
-
require 'active_record'
|
12
11
|
require 'active_support/version'
|
13
|
-
require '
|
12
|
+
require 'minitest/autorun'
|
14
13
|
|
15
|
-
#
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
# setup fake rails env
|
15
|
+
ROOT = File.join(File.dirname(__FILE__), '..')
|
16
|
+
RAILS_ROOT = ROOT
|
17
|
+
RAILS_ENV = 'test'
|
19
18
|
|
20
|
-
# load
|
21
|
-
|
22
|
-
|
23
|
-
# load dummy class
|
24
|
-
require File.join(File.dirname(__FILE__), 'models')
|
25
|
-
|
26
|
-
# Test environment info
|
27
|
-
puts "Testing against: activesupport-#{ActiveSupport::VERSION::STRING}, activerecord-#{ActiveRecord::VERSION::STRING}"
|
19
|
+
# load orms
|
20
|
+
ORM = ENV['ORM'] || 'active_record'
|
28
21
|
|
29
|
-
|
30
|
-
|
22
|
+
def mongoid?; return ORM == 'mongoid';end
|
23
|
+
def activerecord?; return ORM == 'active_record';end
|
31
24
|
|
32
|
-
#
|
33
|
-
|
34
|
-
options = { :fill => true, :genders => false }.merge(options)
|
35
|
-
ActiveRecord::Base.connection.create_table :dummies, :force => true do |t|
|
36
|
-
t.column :name, :string
|
37
|
-
t.column :gender_cd, :integer
|
38
|
-
t.column :word_cd, :string, :limit => 5
|
39
|
-
t.column :other, :integer
|
40
|
-
end
|
25
|
+
# load database implemntation
|
26
|
+
require ORM
|
41
27
|
|
42
|
-
|
43
|
-
|
44
|
-
t.column :operating_system_cd, :integer
|
45
|
-
t.column :manufacturer_cd, :integer
|
46
|
-
end
|
28
|
+
# load simple enum
|
29
|
+
require 'simple_enum'
|
47
30
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
end
|
31
|
+
# load ORM specific stuff
|
32
|
+
require 'orm/common'
|
33
|
+
require "orm/#{ORM}"
|
52
34
|
|
53
|
-
|
54
|
-
|
55
|
-
Dummy.create({ :name => 'Anna', :gender_cd => 1, :word_cd => 'alpha', :other => 0})
|
56
|
-
Dummy.create({ :name => 'Bella', :gender_cd => 1, :word_cd => 'beta', :other => 1})
|
57
|
-
Dummy.create({ :name => 'Chris', :gender_cd => 0, :word_cd => 'gamma', :other => 2})
|
58
|
-
end
|
35
|
+
# Add test locales
|
36
|
+
I18n.load_path << File.join(File.dirname(__FILE__), 'locales.yml')
|
59
37
|
|
60
|
-
|
61
|
-
|
62
|
-
male.id = 0;
|
63
|
-
male.save!
|
38
|
+
# setup db
|
39
|
+
setup_db
|
64
40
|
|
65
|
-
|
66
|
-
|
67
|
-
female.save!
|
68
|
-
end
|
69
|
-
end
|
41
|
+
# Test environment info
|
42
|
+
puts "Testing against: activesupport-#{ActiveSupport::VERSION::STRING}, #{ORM.to_s}-#{orm_version}"
|
70
43
|
|
71
44
|
# do some magic to initialze DB for IRB session
|
72
45
|
if Object.const_defined?('IRB')
|