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/lib/stats.rb ADDED
@@ -0,0 +1,16 @@
1
+ module SimpleRecord
2
+ class Stats
3
+ attr_accessor :selects, :puts
4
+
5
+ def initialize
6
+ @selects = 0
7
+ @puts = 0
8
+ end
9
+
10
+ def clear
11
+ self.selects = 0
12
+ self.puts = 0
13
+ end
14
+ end
15
+ end
16
+
@@ -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
@@ -1,4 +1,4 @@
1
- require 'minitest/unit'
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.read('test-config.yml'))
12
- puts 'akey=' + @config['amazon']['access_key']
13
- puts 'skey=' + @config['amazon']['secret_key']
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
- RightAws::ActiveSdb.close_connection()
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
- mm2 = MyModel.find(:all, :conditions=>["name =4?", "1"])
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
- # these DO NOT work right now, all objects get all callbacks
86
- # I tried like this, seem to be getting somewhere.
87
- #
88
- # class << self;
89
- # @@callbacks.each do |callback|
90
- # #we first have to make an initialized array for each of the callbacks, to prevent problems if they are not called
91
- # puts 'setting callback ' + callback.to_s + ' on ' + self.inspect
92
- # eval %{
93
- #
94
- # # add the methods to the class
95
- # def #{callback}(*args)
96
- # args.each do |arg|
97
- # cb_names = self.instance_variable_get(:@#{callback}_names)
98
- # cb_names = [] if cb_names.nil?
99
- # cb_names << arg.to_s if cb_names.index(arg.to_s).nil?
100
- # self.instance_variable_set(:@#{callback}_names, cb_names)
101
- # end
102
- ## asdf @@#{callback}_names=args.map{|arg| arg.to_s}
103
- # end
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
- # # now we run the methods in the callback array for this class
106
- #send :define_method, "run_#{callback}" do
107
- ## def run_#{callback}
108
- # cb_names = self.instance_variable_get(:@#{callback}_names)
109
- # cb_names.each { |name|
110
- # unless eval(name)
111
- # return false
112
- # end
113
- # }
114
- # return true
115
- # end
116
- # }
117
- # end
118
- # end
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