simple_record 1.0.10 → 1.1.17
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +200 -0
- data/lib/results_array.rb +137 -0
- data/lib/simple_record.rb +498 -263
- data/lib/stats.rb +16 -0
- data/test/my_child_model.rb +34 -0
- data/test/my_model.rb +47 -0
- data/test/paging_array_test.rb +15 -0
- data/test/temp_test.rb +63 -0
- data/test/test_simple_record.rb +227 -43
- metadata +24 -39
- data/History.txt +0 -6
- data/Manifest.txt +0 -7
- data/README.txt +0 -52
- data/Rakefile +0 -12
- data/bin/simple_record +0 -3
data/lib/stats.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
|
2
|
+
require 'my_model'
|
3
|
+
|
4
|
+
class MyChildModel < SimpleRecord::Base
|
5
|
+
belongs_to :my_model
|
6
|
+
has_attributes :name, :child_attr
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
=begin
|
12
|
+
|
13
|
+
|
14
|
+
puts 'word'
|
15
|
+
|
16
|
+
mm = MyModel.new
|
17
|
+
puts 'word2'
|
18
|
+
|
19
|
+
mcm = MyChildModel.new
|
20
|
+
|
21
|
+
puts 'mcm instance methods=' + MyChildModel.instance_methods(true).inspect
|
22
|
+
#puts 'mcm=' + mcm.instance_methods(false)
|
23
|
+
puts 'mcm class vars = ' + mcm.class.class_variables.inspect
|
24
|
+
puts mcm.class == MyChildModel
|
25
|
+
puts 'saved? ' + mm.save.to_s
|
26
|
+
puts mm.errors.inspect
|
27
|
+
|
28
|
+
puts "mm attributes=" + MyModel.defined_attributes.inspect
|
29
|
+
puts "mcm attributes=" + MyChildModel.defined_attributes.inspect
|
30
|
+
|
31
|
+
mcm2 = MyChildModel.new
|
32
|
+
puts "mcm2 attributes=" + MyChildModel.defined_attributes.inspect
|
33
|
+
|
34
|
+
=end
|
data/test/my_model.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
|
2
|
+
|
3
|
+
class MyModel < SimpleRecord::Base
|
4
|
+
|
5
|
+
has_strings :name, :nickname
|
6
|
+
has_ints :age, :save_count
|
7
|
+
has_booleans :cool
|
8
|
+
has_dates :birthday
|
9
|
+
|
10
|
+
|
11
|
+
#callbacks
|
12
|
+
before_create :set_nickname
|
13
|
+
|
14
|
+
after_save :bump_save_count
|
15
|
+
|
16
|
+
def set_nickname
|
17
|
+
self.nickname = name if self.nickname.blank?
|
18
|
+
end
|
19
|
+
|
20
|
+
def bump_save_count
|
21
|
+
puts 'save_count=' + save_count.to_s
|
22
|
+
if save_count.nil?
|
23
|
+
self.save_count = 1
|
24
|
+
else
|
25
|
+
self.save_count += 1
|
26
|
+
end
|
27
|
+
puts 'save_count=' + self.save_count.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate
|
31
|
+
errors.add("name", "can't be empty.") if name.blank?
|
32
|
+
end
|
33
|
+
|
34
|
+
def validate_on_create
|
35
|
+
errors.add("save_count", "should be zero.") if !save_count.blank? && save_count > 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_on_update
|
39
|
+
puts 'save_count = ' + save_count.to_s
|
40
|
+
errors.add("save_count", "should not be zero.") if save_count.blank? || save_count == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
def atts
|
44
|
+
@@attributes
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/../lib/results_array")
|
3
|
+
|
4
|
+
array = SimpleRecord::ResultsArray.new()
|
5
|
+
#array.extend(ResultsArray)
|
6
|
+
|
7
|
+
500.times do |i|
|
8
|
+
array << "_ob_" + i.to_s
|
9
|
+
end
|
10
|
+
|
11
|
+
array.each do |v|
|
12
|
+
puts v.to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
puts array[10]
|
data/test/temp_test.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# rubymine won't run 1.9 tests
|
2
|
+
|
3
|
+
require 'minitest/unit'
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
|
5
|
+
require "yaml"
|
6
|
+
require 'right_aws'
|
7
|
+
require 'my_model'
|
8
|
+
require 'my_child_model'
|
9
|
+
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@config = YAML::load(File.read('test-config.yml'))
|
13
|
+
puts 'akey=' + @config['amazon']['access_key']
|
14
|
+
puts 'skey=' + @config['amazon']['secret_key']
|
15
|
+
RightAws::ActiveSdb.establish_connection(@config['amazon']['access_key'], @config['amazon']['secret_key'], :port=>80, :protocol=>"http")
|
16
|
+
SimpleRecord::Base.set_domain_prefix("simplerecord_tests_")
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
RightAws::ActiveSdb.close_connection()
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_dates
|
24
|
+
mm = MyModel.new
|
25
|
+
mm.name = "Travis"
|
26
|
+
mm.age = 32
|
27
|
+
mm.cool = true
|
28
|
+
mm.created = DateTime.now - 10
|
29
|
+
mm.updated = DateTime.now
|
30
|
+
mm.birthday = Time.now - (3600 * 24 * 365 * 10)
|
31
|
+
puts 'before save=' + mm.inspect
|
32
|
+
mm.save
|
33
|
+
puts 'after save=' + mm.inspect
|
34
|
+
|
35
|
+
mms = MyModel.find(:all, :conditions => ["created > ?", DateTime.now - 1])
|
36
|
+
puts 'mms=' + mms.inspect
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_date_comparisons
|
41
|
+
|
42
|
+
t = SimpleRecord::Base.pad_and_offset(Time.now)
|
43
|
+
puts t
|
44
|
+
dt = SimpleRecord::Base.pad_and_offset(DateTime.now)
|
45
|
+
puts dt
|
46
|
+
dt_tomorrow = SimpleRecord::Base.pad_and_offset(DateTime.now + 1)
|
47
|
+
|
48
|
+
|
49
|
+
puts 'compare=' + (t <=> dt).to_s
|
50
|
+
puts 'compare=' + (t <=> dt_tomorrow).to_s
|
51
|
+
|
52
|
+
dts = DateTime.parse(dt_tomorrow)
|
53
|
+
puts dts.to_s
|
54
|
+
ts = Time.parse(dt)
|
55
|
+
puts ts.to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
setup
|
59
|
+
|
60
|
+
#test_dates
|
61
|
+
test_date_comparisons
|
62
|
+
|
63
|
+
teardown
|
data/test/test_simple_record.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'test/unit'
|
2
2
|
require File.expand_path(File.dirname(__FILE__) + "/../lib/simple_record")
|
3
3
|
require "yaml"
|
4
4
|
require 'right_aws'
|
@@ -8,36 +8,50 @@ require 'my_child_model'
|
|
8
8
|
class TestSimpleRecord < Test::Unit::TestCase
|
9
9
|
|
10
10
|
def setup
|
11
|
-
@config = YAML::load(File.
|
12
|
-
puts
|
13
|
-
|
14
|
-
RightAws::ActiveSdb.establish_connection(@config['amazon']['access_key'], @config['amazon']['secret_key'], :port=>80, :protocol=>"http")
|
11
|
+
@config = YAML::load(File.open(File.expand_path("~/.amazon/simple_record_tests.yml")))
|
12
|
+
#puts @config.inspect
|
13
|
+
SimpleRecord.establish_connection(@config['amazon']['access_key'], @config['amazon']['secret_key'], :port=>80, :protocol=>"http")
|
15
14
|
SimpleRecord::Base.set_domain_prefix("simplerecord_tests_")
|
16
15
|
end
|
17
16
|
|
18
17
|
def teardown
|
19
|
-
|
18
|
+
SimpleRecord.close_connection()
|
20
19
|
end
|
21
20
|
|
21
|
+
|
22
22
|
def test_save_get
|
23
23
|
mm = MyModel.new
|
24
24
|
mm.name = "Travis"
|
25
25
|
mm.age = 32
|
26
26
|
mm.cool = true
|
27
27
|
mm.save
|
28
|
+
|
29
|
+
assert !mm.created.nil?
|
30
|
+
assert !mm.updated.nil?
|
31
|
+
assert !mm.id.nil?
|
32
|
+
assert mm.age == 32
|
33
|
+
assert mm.cool = true
|
34
|
+
assert mm.name = "Travis"
|
35
|
+
|
28
36
|
id = mm.id
|
29
37
|
puts 'id=' + id.to_s
|
30
38
|
# Get the object back
|
31
39
|
mm2 = MyModel.find(id)
|
32
|
-
puts 'got=' + mm2.name + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
|
33
|
-
puts mm2.cool.class.name
|
40
|
+
#puts 'got=' + mm2.name + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
|
41
|
+
#puts mm2.cool.class.name
|
34
42
|
assert mm2.id == mm.id
|
35
43
|
assert mm2.age == mm.age
|
36
44
|
assert mm2.cool == mm.cool
|
45
|
+
assert mm2.age == 32
|
46
|
+
assert mm2.cool = true
|
47
|
+
assert mm2.name = "Travis"
|
48
|
+
assert mm2.created.is_a? DateTime
|
37
49
|
end
|
38
50
|
|
39
51
|
def test_bad_query
|
40
|
-
|
52
|
+
assert_raise RightAws::AwsError do
|
53
|
+
mm2 = MyModel.find(:all, :conditions=>["name =4?", "1"])
|
54
|
+
end
|
41
55
|
end
|
42
56
|
|
43
57
|
def test_batch_save
|
@@ -56,7 +70,7 @@ class TestSimpleRecord < Test::Unit::TestCase
|
|
56
70
|
items.each do |item|
|
57
71
|
puts 'id=' + item.id
|
58
72
|
new_item = MyModel.find(item.id)
|
59
|
-
puts 'new=' + new_item.inspect
|
73
|
+
#puts 'new=' + new_item.inspect
|
60
74
|
assert item.id == new_item.id
|
61
75
|
assert item.name == new_item.name
|
62
76
|
assert item.cool == new_item.cool
|
@@ -82,39 +96,209 @@ class TestSimpleRecord < Test::Unit::TestCase
|
|
82
96
|
end
|
83
97
|
|
84
98
|
def test_callbacks
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
#
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
99
|
+
|
100
|
+
|
101
|
+
mm = MyModel.new
|
102
|
+
assert !mm.save
|
103
|
+
assert mm.errors.count == 1 # name is required
|
104
|
+
|
105
|
+
# test queued callback before_create
|
106
|
+
mm.name = "Travis"
|
107
|
+
assert mm.save
|
108
|
+
# now nickname should be set on before_create
|
109
|
+
assert mm.nickname == mm.name
|
110
|
+
|
111
|
+
mm2 = MyModel.find(mm.id)
|
112
|
+
assert mm2.nickname = mm.nickname
|
113
|
+
assert mm2.name = mm.name
|
114
|
+
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_dirty
|
119
|
+
mm = MyModel.new
|
120
|
+
mm.name = "Travis"
|
121
|
+
mm.age = 32
|
122
|
+
mm.cool = true
|
123
|
+
mm.save
|
124
|
+
id = mm.id
|
125
|
+
puts 'id=' + id.to_s
|
126
|
+
# Get the object back
|
127
|
+
mm2 = MyModel.find(id)
|
128
|
+
puts 'got=' + mm2.name + ' and he/she is ' + mm2.age.to_s + ' years old and he/she is cool? ' + mm2.cool.to_s
|
129
|
+
assert mm2.id == mm.id
|
130
|
+
assert mm2.age == mm.age
|
131
|
+
assert mm2.cool == mm.cool
|
132
|
+
|
133
|
+
mm2.name = "Travis 2"
|
134
|
+
mm2.save(:dirty=>true)
|
135
|
+
|
136
|
+
# todo: how do we assert this?
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
# http://api.rubyonrails.org/classes/ActiveRecord/Dirty.html#M002136
|
141
|
+
def test_changed
|
142
|
+
mm = MyModel.new
|
143
|
+
mm.name = "Travis"
|
144
|
+
mm.age = 32
|
145
|
+
mm.cool = true
|
146
|
+
mm.save
|
147
|
+
|
148
|
+
puts 'changed?=' + mm.changed?.to_s
|
149
|
+
assert !mm.changed?
|
150
|
+
assert mm.changed.size == 0
|
151
|
+
assert mm.changes.size == 0
|
152
|
+
assert !mm.name_changed?
|
153
|
+
|
154
|
+
mm.name = "Jim"
|
155
|
+
assert mm.changed?
|
156
|
+
assert mm.changed.size == 1
|
157
|
+
assert mm.changed[0] == "name"
|
158
|
+
|
159
|
+
assert mm.changes.size == 1
|
160
|
+
puts 'CHANGES=' + mm.changes.inspect
|
161
|
+
assert mm.changes["name"][0] == "Travis"
|
162
|
+
assert mm.changes["name"][1] == "Jim"
|
163
|
+
|
164
|
+
assert mm.name_changed?
|
165
|
+
assert mm.name_was == "Travis"
|
166
|
+
assert mm.name_change[0] == "Travis"
|
167
|
+
assert mm.name_change[1] == "Jim"
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_count
|
172
|
+
|
173
|
+
SimpleRecord.stats.clear
|
174
|
+
|
175
|
+
count = MyModel.find(:count) # select 1
|
176
|
+
assert count > 0
|
177
|
+
|
178
|
+
mms = MyModel.find(:all) # select 2
|
179
|
+
assert mms.size > 0 # select 3
|
180
|
+
assert mms.size == count, "size != count! size=" + mms.size.to_s + " count=" + count.to_s
|
181
|
+
assert SimpleRecord.stats.selects == 3, "should have been 3 select, but was actually #{SimpleRecord.stats.selects}" # count should not have been called twice
|
182
|
+
|
183
|
+
count = MyModel.find(:count, :conditions=>["name=?", "Travis"])
|
184
|
+
assert count > 0
|
185
|
+
|
186
|
+
mms = MyModel.find(:all, :conditions=>["name=?", "Travis"])
|
187
|
+
assert mms.size > 0
|
188
|
+
assert mms.size == count
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_select
|
193
|
+
# just passes through to find
|
194
|
+
MyModel.select(:count)
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_attributes_correct
|
198
|
+
# child should contain child class attributes + parent class attributes
|
199
|
+
|
200
|
+
#MyModel.defined_attributes.each do |a|
|
104
201
|
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
202
|
+
#end
|
203
|
+
#MyChildModel.defined_attributes.inspect
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
# ensures that it uses next token and what not
|
208
|
+
def test_big_result
|
209
|
+
mms = MyModel.find(:all)
|
210
|
+
puts 'mms.size=' + mms.size.to_s
|
211
|
+
i = 0
|
212
|
+
mms.each do |x|
|
213
|
+
puts 'deleting=' + i.to_s
|
214
|
+
x.delete
|
215
|
+
i+=1
|
216
|
+
end
|
217
|
+
num_made = 110
|
218
|
+
num_made.times do |i|
|
219
|
+
mm = MyModel.create(:name=>"Travis", :age=>i, :cool=>true)
|
220
|
+
end
|
221
|
+
rs = MyModel.find(:all) # should get 100 at a time
|
222
|
+
assert rs.size == num_made
|
223
|
+
i = 0
|
224
|
+
rs.each do |x|
|
225
|
+
#puts 'x=' + x.id
|
226
|
+
i+=1
|
227
|
+
end
|
228
|
+
assert i == num_made
|
119
229
|
end
|
230
|
+
|
231
|
+
def test_results_array
|
232
|
+
mms = MyModel.find(:all) # select 2
|
233
|
+
assert !mms.first.nil?
|
234
|
+
assert !mms.last.nil?
|
235
|
+
assert !mms.empty?
|
236
|
+
assert mms.include?(mms[0])
|
237
|
+
|
238
|
+
assert mms[2, 2].size == 2
|
239
|
+
assert mms[2..5].size == 4
|
240
|
+
assert mms[2...5].size == 3
|
241
|
+
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_random_index
|
245
|
+
create_my_models(120)
|
246
|
+
mms = MyModel.find(:all)
|
247
|
+
o = mms[85]
|
248
|
+
puts 'o=' + o.inspect
|
249
|
+
assert !o.nil?
|
250
|
+
o = mms[111]
|
251
|
+
puts 'o=' + o.inspect
|
252
|
+
assert !o.nil?
|
253
|
+
end
|
254
|
+
|
255
|
+
# Use to populate db
|
256
|
+
def create_my_models(count)
|
257
|
+
batch = []
|
258
|
+
count.times do |i|
|
259
|
+
mm = MyModel.new(:name=>"model_" + i.to_s)
|
260
|
+
batch << mm
|
261
|
+
end
|
262
|
+
MyModel.batch_save batch
|
263
|
+
|
264
|
+
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_objects_in_constructor
|
268
|
+
mm = MyModel.new(:name=>"model1")
|
269
|
+
mm.save
|
270
|
+
mcm = MyChildModel.new(:name=>"johnny", :my_model=>mm)
|
271
|
+
mcm.save
|
272
|
+
|
273
|
+
assert !mcm.my_model.nil?
|
274
|
+
|
275
|
+
mcm = MyChildModel.find(mcm.id)
|
276
|
+
assert !mcm.my_model.nil?
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_validations
|
281
|
+
mm = MyModel.new()
|
282
|
+
assert mm.invalid?
|
283
|
+
assert mm.errors.size == 1
|
284
|
+
mm.name = "abcd"
|
285
|
+
assert mm.valid?
|
286
|
+
assert mm.errors.size == 0
|
287
|
+
|
288
|
+
mm.save_count = 2
|
289
|
+
assert mm.invalid?
|
290
|
+
|
291
|
+
mm.save_count = nil
|
292
|
+
|
293
|
+
assert mm.save, mm.errors.inspect
|
294
|
+
|
295
|
+
assert mm.valid?, mm.errors.inspect
|
296
|
+
assert mm.save_count == 1
|
297
|
+
|
298
|
+
end
|
299
|
+
|
300
|
+
def test_funny_names
|
301
|
+
MyModel.find(:all, :order=>"order")
|
302
|
+
end
|
303
|
+
|
120
304
|
end
|