jeffp-enumerated_attribute 0.1.2 → 0.1.4
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.
- data/.gitignore +1 -1
- data/CHANGELOG.rdoc +11 -0
- data/README.rdoc +90 -6
- data/Rakefile +20 -24
- data/lib/enumerated_attribute.rb +274 -107
- data/spec/active_record/active_record_spec.rb +244 -0
- data/spec/active_record/cfg.rb +3 -0
- data/spec/active_record/race_car.rb +10 -0
- data/spec/active_record/single_table_inheritance_spec.rb +0 -0
- data/spec/active_record/test_in_memory.rb +21 -0
- data/spec/car.rb +46 -16
- data/spec/new_and_method_missing_spec.rb +73 -0
- data/spec/plural.rb +8 -0
- data/spec/{tractor_spec.rb → poro_spec.rb} +40 -6
- data/spec/tractor.rb +3 -3
- metadata +13 -6
- data/spec/car_spec.rb +0 -21
@@ -0,0 +1,244 @@
|
|
1
|
+
require 'test_in_memory'
|
2
|
+
require 'enumerated_attribute'
|
3
|
+
require 'active_record'
|
4
|
+
require 'race_car'
|
5
|
+
|
6
|
+
describe "RaceCar" do
|
7
|
+
|
8
|
+
it "should have dynamic predicate methods for :gear attribute" do
|
9
|
+
r=RaceCar.new
|
10
|
+
r.gear = :second
|
11
|
+
r.gear_is_in_second?.should be_true
|
12
|
+
r.gear_not_in_second?.should be_false
|
13
|
+
r.gear_is_nil?.should be_false
|
14
|
+
r.gear_is_not_nil?.should be_true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have working dynamic predicate methods on retrieved objects" do
|
18
|
+
r=RaceCar.new
|
19
|
+
r.gear = :second
|
20
|
+
r.save!
|
21
|
+
|
22
|
+
s=RaceCar.find r.id
|
23
|
+
s.should_not be_nil
|
24
|
+
s.gear_is_in_second?.should be_true
|
25
|
+
s.gear_is_not_in_second?.should be_false
|
26
|
+
s.gear_is_nil?.should be_false
|
27
|
+
s.gear_is_not_nil?.should be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should find record by enumerated column :gear attributes" do
|
31
|
+
r=RaceCar.new
|
32
|
+
r.gear = :second
|
33
|
+
r.name = 'special'
|
34
|
+
r.save!
|
35
|
+
|
36
|
+
s=RaceCar.find_by_gear_and_name(:second, 'special')
|
37
|
+
s.should_not be_nil
|
38
|
+
s.id.should == r.id
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should initialize according to enumerated attribute definitions" do
|
42
|
+
r = RaceCar.new
|
43
|
+
r.gear.should == :neutral
|
44
|
+
r.choke.should == :none
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should create new instance using block" do
|
48
|
+
r = RaceCar.new do |r|
|
49
|
+
r.gear = :first
|
50
|
+
r.choke = :medium
|
51
|
+
r.lights = 'on'
|
52
|
+
end
|
53
|
+
r.gear.should == :first
|
54
|
+
r.lights.should == 'on'
|
55
|
+
r.choke.should == :medium
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should initialize using parameter hash" do
|
59
|
+
r=RaceCar.new(:name=>'FastFurious', :gear=>:second, :lights=>'on', :choke=>:medium)
|
60
|
+
r.gear.should == :second
|
61
|
+
r.lights.should == 'on'
|
62
|
+
r.choke.should == :medium
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should convert non-column enumerated attributes from string to symbols" do
|
66
|
+
r=RaceCar.new
|
67
|
+
r.choke = 'medium'
|
68
|
+
r.choke.should == :medium
|
69
|
+
r.save!
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should convert enumerated column attributes from string to symbols" do
|
73
|
+
r=RaceCar.new
|
74
|
+
r.gear = 'second'
|
75
|
+
r.gear.should == :second
|
76
|
+
r.save!
|
77
|
+
|
78
|
+
s=RaceCar.find r.id
|
79
|
+
s.gear.should == :second
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should not convert non-enumerated column attributes from string to symbols" do
|
83
|
+
r=RaceCar.new
|
84
|
+
r.lights = 'off'
|
85
|
+
r.lights.should == 'off'
|
86
|
+
r.save!
|
87
|
+
|
88
|
+
s=RaceCar.find r.id
|
89
|
+
s.lights.should == 'off'
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should raise InvalidEnumeration when parametrically initialized with :gear=>:drive" do
|
93
|
+
r=RaceCar.new
|
94
|
+
lambda{ r.gear= :drive}.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should raise InvalidEnumeration when parametrically initialized with :choke=>:all" do
|
98
|
+
r=RaceCar.new
|
99
|
+
lambda{ r.choke= :all}.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should return non-column enumerated attributes from [] method" do
|
103
|
+
r = RaceCar.new
|
104
|
+
r[:choke].should == :none
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should return enumerated column attributes from [] method" do
|
108
|
+
r=RaceCar.new
|
109
|
+
r.gear = :neutral
|
110
|
+
r[:gear].should == :neutral
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should set non-column enumerated attributes with []= method" do
|
114
|
+
r=RaceCar.new
|
115
|
+
r[:choke] = :medium
|
116
|
+
r.choke.should == :medium
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should set enumerated column attriubtes with []= method" do
|
120
|
+
r=RaceCar.new
|
121
|
+
r[:gear] = :second
|
122
|
+
r.gear.should == :second
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should raise InvalidEnumeration when setting enumerated column attribute with []= method" do
|
126
|
+
r=RaceCar.new
|
127
|
+
lambda{ r[:gear]= :drive }.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should set and retrieve string for non-enumerated column attributes with []=" do
|
131
|
+
r=RaceCar.new
|
132
|
+
r[:lights] = 'on'
|
133
|
+
r.lights.should == 'on'
|
134
|
+
r[:lights].should == 'on'
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should set and retrieve symbol for non-enumerated column attributes with []=" do
|
138
|
+
r=RaceCar.new
|
139
|
+
r[:lights] = :on
|
140
|
+
r.lights.should == :on
|
141
|
+
r[:lights].should == :on
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should raise InvalidEnumeration for invalid enum passed to attributes=" do
|
145
|
+
r=RaceCar.new
|
146
|
+
lambda { r.attributes = {:lights=>'off', :gear =>:drive} }.should raise_error(EnumeratedAttribute::InvalidEnumeration)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should update_attribute for enumerated column attribute" do
|
150
|
+
r=RaceCar.new
|
151
|
+
r.gear = :first
|
152
|
+
r.save!
|
153
|
+
r.update_attribute(:gear, :second)
|
154
|
+
r.gear.should == :second
|
155
|
+
|
156
|
+
s=RaceCar.find r.id
|
157
|
+
s.gear.should == :second
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should update_attribute for non-enumerated column attribute" do
|
161
|
+
r=RaceCar.new
|
162
|
+
r.lights = 'on'
|
163
|
+
r.save!
|
164
|
+
r.update_attribute(:lights, 'off')
|
165
|
+
r.lights.should == 'off'
|
166
|
+
|
167
|
+
s=RaceCar.find r.id
|
168
|
+
s.lights.should == 'off'
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should update_attributes for both non- and enumerated column attributes" do
|
172
|
+
r=RaceCar.new
|
173
|
+
r.gear = :first
|
174
|
+
r.lights = 'off'
|
175
|
+
r.save!
|
176
|
+
r.update_attributes({:gear=>:second, :lights=>'on'})
|
177
|
+
s=RaceCar.find r.id
|
178
|
+
s.gear.should == :second
|
179
|
+
s.lights.should == 'on'
|
180
|
+
s.update_attributes({:gear=>'over_drive', :lights=>'off'})
|
181
|
+
t=RaceCar.find s.id
|
182
|
+
t.gear.should == :over_drive
|
183
|
+
t.lights.should == 'off'
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should provide symbol values for enumerated column attributes from the :attributes method" do
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should provide normal values for non-enumerated column attributes from the :attributes method" do
|
190
|
+
end
|
191
|
+
|
192
|
+
it "should raise ArgumentError when setting invalid enumertion value with :attributes= method" do
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should save and retrieve its name" do
|
196
|
+
r = RaceCar.new
|
197
|
+
r.name= 'Green Meanie'
|
198
|
+
r.save!
|
199
|
+
|
200
|
+
s = RaceCar.find r.id
|
201
|
+
s.should_not be_nil
|
202
|
+
s.name.should == 'Green Meanie'
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should save and retrieve symbols for enumerated column attribute" do
|
206
|
+
r = RaceCar.new
|
207
|
+
r.gear = :over_drive
|
208
|
+
r.save!
|
209
|
+
|
210
|
+
s = RaceCar.find r.id
|
211
|
+
#s.should_not be_nil
|
212
|
+
s.gear.should == :over_drive
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should not save values for non-column enumerated attributes" do
|
216
|
+
r=RaceCar.new
|
217
|
+
r.choke = :medium
|
218
|
+
r.save!
|
219
|
+
|
220
|
+
s=RaceCar.find r.id
|
221
|
+
s.choke.should == :none
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should save string and retrieve string for non-enumerated column attributes" do
|
225
|
+
r =RaceCar.new
|
226
|
+
r.lights = 'on'
|
227
|
+
r.save!
|
228
|
+
|
229
|
+
s = RaceCar.find r.id
|
230
|
+
s.lights.should == 'on'
|
231
|
+
s[:lights].should == 'on'
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should save symbol and retrieve string for non-enumerated column attributes" do
|
235
|
+
r =RaceCar.new
|
236
|
+
r.lights = :off
|
237
|
+
r.save!
|
238
|
+
|
239
|
+
s = RaceCar.find r.id
|
240
|
+
s.lights.should == "--- :off\n"
|
241
|
+
s[:lights].should == "--- :off\n"
|
242
|
+
end
|
243
|
+
|
244
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
|
2
|
+
class RaceCar < ActiveRecord::Base
|
3
|
+
enum_attr :gear, %w(reverse ^neutral first second over_drive)
|
4
|
+
enum_attr :choke, %w(^none medium full)
|
5
|
+
end
|
6
|
+
|
7
|
+
#gear = enumerated column attribute
|
8
|
+
#choke = enumerated non-column attribute
|
9
|
+
#lights = non-enumerated column attribute
|
10
|
+
|
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
gem 'activerecord', ENV['AR_VERSION'] ? "=#{ENV['AR_VERSION']}" : '>=2.1.0'
|
5
|
+
require 'active_record'
|
6
|
+
|
7
|
+
ActiveRecord::Base.establish_connection({'adapter' => 'sqlite3', 'database' => ':memory:'})
|
8
|
+
ActiveRecord::Base.logger = Logger.new("#{File.dirname(__FILE__)}/active_record.log")
|
9
|
+
|
10
|
+
connection = ActiveRecord::Base.connection
|
11
|
+
connection.create_table(:race_cars, :force=>true) do |t|
|
12
|
+
t.string :name
|
13
|
+
t.string :gear
|
14
|
+
t.string :lights
|
15
|
+
end
|
16
|
+
connection.create_table(:bicycles, :force=>true) do |t|
|
17
|
+
t.string :name
|
18
|
+
t.string :speed
|
19
|
+
t.string :gear
|
20
|
+
end
|
21
|
+
|
data/spec/car.rb
CHANGED
@@ -2,36 +2,66 @@ require 'enumerated_attribute'
|
|
2
2
|
|
3
3
|
#used to test that method_missing chaining plays nice in inheritance situations
|
4
4
|
|
5
|
-
class Vehicle
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
class Vehicle
|
6
|
+
def vehicle_method_missing_called?; @vehicle_method_missing_called; end
|
7
|
+
def self.vehicle_new_called?; @@vehicle_new_called; end
|
8
|
+
def self.reset; @@vehicle_new_called = false; end
|
9
|
+
|
10
|
+
@@vehicle_new_called = false
|
9
11
|
def initialize
|
10
|
-
@
|
12
|
+
@vehicle_method_missing_called = false
|
13
|
+
super
|
11
14
|
end
|
12
15
|
|
13
16
|
def method_missing(methId, *args)
|
14
|
-
@
|
17
|
+
@vehicle_method_missing_called = true
|
15
18
|
#end here
|
16
19
|
end
|
20
|
+
|
21
|
+
def self.new
|
22
|
+
@@vehicle_new_called = true
|
23
|
+
super
|
24
|
+
end
|
17
25
|
|
18
|
-
alias :vmh :vehicle_method_hit
|
19
|
-
|
20
26
|
end
|
21
27
|
|
22
|
-
class
|
23
|
-
|
24
|
-
|
28
|
+
class CarWithMethods < Vehicle
|
29
|
+
def car_method_missing_called?; @car_method_missing_called; end
|
30
|
+
def self.car_new_called?; @@car_new_called; end
|
31
|
+
def self.reset; @@car_new_called = false; super; end
|
32
|
+
|
33
|
+
def self.new
|
34
|
+
@@car_new_called = true
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
def method_missing(methId, *args)
|
39
|
+
@car_method_missing_called = true
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
43
|
+
enum_attr :gear, %w(reverse ^neutral drive)
|
44
|
+
|
45
|
+
@@car_new_called = false
|
25
46
|
def initialize
|
47
|
+
@car_method_missing_called = false
|
26
48
|
super
|
27
|
-
@car_method_hit = false
|
28
49
|
end
|
29
50
|
|
30
|
-
|
31
|
-
|
51
|
+
end
|
52
|
+
|
53
|
+
class CarWithoutMethods < Vehicle
|
54
|
+
def car_method_missing_called?; @car_method_missing_called; end
|
55
|
+
def self.car_new_called?; @@car_new_called; end
|
56
|
+
def self.reset; @@car_new_called = false; super; end
|
57
|
+
|
58
|
+
enum_attr :gear, %w(reverse ^neutral drive)
|
59
|
+
|
60
|
+
@@car_new_called = false
|
61
|
+
def initialize
|
62
|
+
@car_method_missing_called = false
|
32
63
|
super
|
33
64
|
end
|
34
65
|
|
35
|
-
enum_attr :gear, %w(reverse ^neutral drive)
|
36
|
-
alias :cmt :car_method_hit
|
37
66
|
end
|
67
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'car'
|
2
|
+
|
3
|
+
#used to test that method_missing chaining plays nice in inheritance situation
|
4
|
+
|
5
|
+
describe "CarWithMethods" do
|
6
|
+
|
7
|
+
it "should initialize Car and Vehicle _method_missing_called? to false" do
|
8
|
+
c= CarWithMethods.new
|
9
|
+
c.car_method_missing_called?.should be_false
|
10
|
+
c.vehicle_method_missing_called?.should be_false
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should initialize Car and Vehicle _new_called? to false" do
|
14
|
+
CarWithMethods.reset
|
15
|
+
CarWithMethods.car_new_called?.should be_false
|
16
|
+
CarWithMethods.vehicle_new_called?.should be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should initialize :gear to :neutral" do
|
20
|
+
c = CarWithMethods.new
|
21
|
+
c.gear.should == :neutral
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should hit both new methods for Car and Vehicle on instantiation" do
|
25
|
+
CarWithMethods.reset
|
26
|
+
CarWithMethods.new
|
27
|
+
CarWithMethods.car_new_called?.should be_true
|
28
|
+
CarWithMethods.vehicle_new_called?.should be_true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should not hit method_missing when calling dynamic predicate method :gear_is_in_reverse?" do
|
32
|
+
c = CarWithMethods.new
|
33
|
+
c.gear_is_in_reverse?
|
34
|
+
c.car_method_missing_called?.should be_false
|
35
|
+
c.vehicle_method_missing_called?.should be_false
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should hit Car and Vehicle method_missing when calling unsupported dynamic predicate method" do
|
39
|
+
c = CarWithMethods.new
|
40
|
+
c.parking_break_is_on?
|
41
|
+
c.car_method_missing_called?.should be_true
|
42
|
+
c.vehicle_method_missing_called?.should be_true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "CarWithoutMethods" do
|
47
|
+
|
48
|
+
it "should set Car and Vehicle _new_called? to false when calling :reset" do
|
49
|
+
CarWithoutMethods.reset
|
50
|
+
CarWithoutMethods.car_new_called?.should be_false
|
51
|
+
CarWithoutMethods.vehicle_new_called?.should be_false
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should hit only Vehicle _new_called? on instantiation" do
|
55
|
+
CarWithoutMethods.reset
|
56
|
+
CarWithoutMethods.new
|
57
|
+
CarWithoutMethods.car_new_called?.should be_false
|
58
|
+
CarWithoutMethods.vehicle_new_called?.should be_true
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should not hit Vehicle method_missing when calling dynamic predicate method :gear_is_in_first?" do
|
62
|
+
c = CarWithoutMethods.new
|
63
|
+
c.gear_is_in_drive?
|
64
|
+
c.vehicle_method_missing_called?.should be_false
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should hit Vehicle method_missing when calling unsupported predicate method" do
|
68
|
+
c = CarWithoutMethods.new
|
69
|
+
c.parking_break2_is_on?
|
70
|
+
c.vehicle_method_missing_called?.should be_true
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|