simple_record 1.0.10 → 1.1.17
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/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
|