tinymongo 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -26,11 +26,11 @@ To create TinyMongo config file (config/tinymongo.yml) and initializer file (con
26
26
  class Person < TinyMongo::Model
27
27
  mongo_collection :people # optional if using Rails
28
28
  mongo_key :name
29
- mongo_key :age
30
- mongo_key :children
29
+ mongo_key :age, :default => 0
30
+ mongo_key :children, :default => []
31
31
 
32
32
  def make_child
33
- child = Person.create(:name => 'Baby', :age => 0)
33
+ child = Person.create(:name => 'Baby')
34
34
  push({:children => child}) # push child into children array
35
35
  end
36
36
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
@@ -87,7 +87,7 @@ module TinyMongo
87
87
 
88
88
  def next_document
89
89
  doc = @_tinymongo_cursor.next_document
90
- @_tinymongo_model_class.new(doc)
90
+ @_tinymongo_model_class.new(doc) if doc
91
91
  end
92
92
 
93
93
  def query_options_hash
@@ -120,7 +120,7 @@ module TinyMongo
120
120
  return [] if @_tinymongo_cursor.nil?
121
121
 
122
122
  hashes = @_tinymongo_cursor.to_a
123
- hashes.map { |hash| @_tinymongo_model_class.new(hash) }
123
+ hashes.map { |hash| @_tinymongo_model_class.new(hash) if hash }
124
124
  end
125
125
 
126
126
  protected
@@ -2,13 +2,22 @@ module TinyMongo
2
2
  class Model
3
3
  class << self
4
4
  def mongo_key(*args)
5
- args.each do |key_name|
6
- if([Symbol, String].include? key_name.class)
7
- key_name_s = key_name.to_s
8
- key_name_sym = key_name.to_sym
5
+ default = nil
6
+ @_tinymongo_defaults = {} if @_tinymongo_defaults.nil?
7
+
8
+ args.each do |arg|
9
+ default = arg[:default] || arg['default'] if(arg.instance_of? Hash)
10
+ end
11
+
12
+ args.each do |arg|
13
+ if([Symbol, String].include? arg.class)
14
+ key_name_s = arg.to_s
15
+ key_name_sym = arg.to_sym
9
16
 
10
17
  define_method(key_name_sym) { instance_variable_get(:@_tinymongo_hash)[key_name_s] }
11
18
  define_method("#{key_name_s}=") { |val| instance_variable_get(:@_tinymongo_hash)[key_name_s] = val }
19
+
20
+ @_tinymongo_defaults[key_name_s] = default if default
12
21
  end
13
22
  end
14
23
  end
@@ -79,7 +88,7 @@ module TinyMongo
79
88
  end
80
89
 
81
90
  def initialize(hash={})
82
- @_tinymongo_hash = Helper.stringify_keys_in_hash(hash) || {}
91
+ @_tinymongo_hash = (self.class.instance_variable_get(:@_tinymongo_defaults).merge(Helper.stringify_keys_in_hash(hash)) || {}) if hash
83
92
  end
84
93
 
85
94
  def _id
@@ -90,8 +99,17 @@ module TinyMongo
90
99
  @_tinymongo_hash['_id'] = Helper.bson_object_id(val)
91
100
  end
92
101
 
102
+ def id
103
+ @_tinymongo_hash['_id'].to_s
104
+ end
105
+
106
+ def id=(val)
107
+ @_tinymongo_hash['_id'] = Helper.bson_object_id(val)
108
+ end
109
+
93
110
  def ==(another)
94
- self.to_hash == another.to_hash
111
+ (self.instance_variable_get(:@_tinymongo_hash) == another.instance_variable_get(:@_tinymongo_hash)) &&
112
+ (self.kind_of? TinyMongo::Model) && (another.kind_of? TinyMongo::Model)
95
113
  end
96
114
 
97
115
  def db
@@ -106,22 +124,26 @@ module TinyMongo
106
124
  @_tinymongo_hash.dup
107
125
  end
108
126
 
127
+ def to_param
128
+ @_tinymongo_hash['_id'].to_s
129
+ end
130
+
109
131
  def reload
110
- if(self._id)
111
- obj = collection.find_one({ '_id' => self._id })
132
+ if(@_tinymongo_hash['_id'])
133
+ obj = collection.find_one({ '_id' => @_tinymongo_hash['_id'] })
112
134
  @_tinymongo_hash = Helper.stringify_keys_in_hash(obj) if(obj)
113
135
  end
114
136
  end
115
137
 
116
138
  def save
117
- if(self._id.nil?) # new
139
+ if(@_tinymongo_hash['_id'].nil?) # new
118
140
  oid = collection.save(@_tinymongo_hash)
119
141
  if(oid)
120
142
  @_tinymongo_hash.delete(:_id)
121
- self._id = oid
143
+ @_tinymongo_hash['_id'] = oid
122
144
  end
123
145
  else # update
124
- collection.update({ '_id' => self._id }, @_tinymongo_hash, :upsert => true)
146
+ collection.update({ '_id' => @_tinymongo_hash['_id'] }, @_tinymongo_hash, :upsert => true)
125
147
  reload
126
148
  end
127
149
  return self
@@ -138,8 +160,8 @@ module TinyMongo
138
160
  end
139
161
 
140
162
  def delete
141
- if(self._id)
142
- collection.remove({ '_id' => self._id })
163
+ if(@_tinymongo_hash['_id'])
164
+ collection.remove({ '_id' => @_tinymongo_hash['_id'] })
143
165
  end
144
166
  end
145
167
 
@@ -185,8 +207,8 @@ module TinyMongo
185
207
 
186
208
  protected
187
209
  def do_modifier_operation_and_reload(operator, hash)
188
- raise ModifierOperationError unless self._id
189
- collection.update({ '_id' => self._id }, { operator => Helper.hashify_models_in_hash(hash) })
210
+ raise ModifierOperationError unless @_tinymongo_hash['_id']
211
+ collection.update({ '_id' => @_tinymongo_hash['_id'] }, { operator => Helper.hashify_models_in_hash(hash) })
190
212
  reload
191
213
  end
192
214
  end
@@ -10,6 +10,15 @@ class Dummy < TinyMongo::Model
10
10
  mongo_key :bar
11
11
  end
12
12
 
13
+ class DummyTwo < TinyMongo::Model
14
+ mongo_key :foo, :bar
15
+ end
16
+
17
+ class DummyDefault < TinyMongo::Model
18
+ mongo_key :foo, :default => 'hello'
19
+ mongo_key :bar, :default => 'world'
20
+ end
21
+
13
22
  class TinyMongoTest < Test::Unit::TestCase
14
23
  def setup
15
24
  TinyMongo.db['dummies'].drop()
@@ -57,6 +66,28 @@ class TinyMongoTest < Test::Unit::TestCase
57
66
  assert_equal 'world', m.bar
58
67
  end
59
68
 
69
+ def test_mongo_two_keys_in_one_line
70
+ m = DummyTwo.new('foo' => 'hello')
71
+ m.bar = 'world'
72
+
73
+ assert_equal 'hello', m.foo
74
+ assert_equal 'world', m.bar
75
+ end
76
+
77
+ def test_mongo_key_with_default_value
78
+ m = DummyDefault.new
79
+
80
+ assert_equal 'hello', m.foo
81
+ assert_equal 'world', m.bar
82
+ end
83
+
84
+ def test_mongo_key_override_default_value
85
+ m = DummyDefault.new(:foo => 'world', :bar => 'hello')
86
+
87
+ assert_equal 'world', m.foo
88
+ assert_equal 'hello', m.bar
89
+ end
90
+
60
91
  def test_save_new
61
92
  hash = {'foo' => 'hello', 'bar' => 'world'}
62
93
 
@@ -189,11 +220,21 @@ class TinyMongoTest < Test::Unit::TestCase
189
220
  assert_equal true, cursor.has_next?
190
221
  end
191
222
 
223
+ def test_cursor_has_next_is_false
224
+ cursor = Dummy.find
225
+ assert_equal false, cursor.has_next?
226
+ end
227
+
192
228
  def test_cursor_next_document
193
229
  obj = Dummy.create
194
230
  cursor = Dummy.find
195
231
  assert_equal obj, cursor.next_document
196
232
  end
233
+
234
+ def test_cursor_next_document_nil
235
+ cursor = Dummy.find
236
+ assert_equal nil, cursor.next_document
237
+ end
197
238
 
198
239
  def test_cursor_skip
199
240
  Dummy.create('foo' => 1)
@@ -203,6 +244,15 @@ class TinyMongoTest < Test::Unit::TestCase
203
244
  cursor = Dummy.find.skip(2)
204
245
  assert_equal obj, cursor.next_document
205
246
  end
247
+
248
+ def test_cursor_skip_all
249
+ Dummy.create('foo' => 1)
250
+ Dummy.create('foo' => 2)
251
+ obj = Dummy.create('foo' => 3)
252
+
253
+ cursor = Dummy.find.skip(3)
254
+ assert_equal nil, cursor.next_document
255
+ end
206
256
 
207
257
  def test_cursor_skip_count
208
258
  Dummy.create('foo' => 1)
@@ -221,6 +271,11 @@ class TinyMongoTest < Test::Unit::TestCase
221
271
  cursor = Dummy.find
222
272
  assert_equal [obj1, obj2, obj3], cursor.to_a
223
273
  end
274
+
275
+ def test_cursor_to_a_empty
276
+ cursor = Dummy.find
277
+ assert_equal [], cursor.to_a
278
+ end
224
279
 
225
280
  def test_cursor_sort
226
281
  obj1 = Dummy.create('foo' => 3)
@@ -286,8 +341,18 @@ class TinyMongoTest < Test::Unit::TestCase
286
341
  assert_equal({'_id' => obj._id, 'foo' => 'hello'}, obj.to_hash)
287
342
  end
288
343
 
344
+ def test_id
345
+ obj = Dummy.create
346
+ assert_equal obj._id.to_s, obj.id
347
+ end
348
+
349
+ def test_to_param
350
+ obj = Dummy.create
351
+ assert_equal obj._id.to_s, obj.to_param
352
+ end
353
+
289
354
  def test_eq
290
- obj = Dummy.create('foo' => 'hello')
355
+ obj = Dummy.create
291
356
  obj2 = Dummy.find_one()
292
357
  assert_equal obj, obj2
293
358
  end
data/tinymongo.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{tinymongo}
8
- s.version = "0.1.5"
8
+ s.version = "0.1.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Peter Jihoon Kim"]
12
- s.date = %q{2010-07-23}
12
+ s.date = %q{2010-07-27}
13
13
  s.description = %q{Simple MongoDB wrapper}
14
14
  s.email = %q{raingrove@gmail.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 5
9
- version: 0.1.5
8
+ - 6
9
+ version: 0.1.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Peter Jihoon Kim
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-23 00:00:00 +09:00
17
+ date: 2010-07-27 00:00:00 +09:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency