tinymongo 0.1.7 → 0.1.8
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.rdoc +15 -9
- data/VERSION +1 -1
- data/lib/tinymongo/cursor.rb +22 -61
- data/lib/tinymongo/errors.rb +6 -0
- data/lib/tinymongo/helper.rb +51 -58
- data/lib/tinymongo/model.rb +57 -27
- data/test/test_tinymongo.rb +82 -45
- data/tinymongo.gemspec +2 -2
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -47,25 +47,31 @@ To create TinyMongo config file (config/tinymongo.yml) and initializer file (con
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
Person.drop # empty
|
50
|
+
Person.drop # empty person collection
|
51
51
|
|
52
|
-
p = Person.create(:name => 'John', :age => 20)
|
53
|
-
p.make_child
|
54
|
-
p.grow_up
|
52
|
+
p = Person.create(:name => 'John', :age => 20)
|
53
|
+
p.make_child
|
54
|
+
p.grow_up
|
55
55
|
|
56
56
|
Person.find.each do |person|
|
57
|
-
puts person.name
|
57
|
+
puts person.name
|
58
58
|
end
|
59
59
|
|
60
|
-
|
60
|
+
Person.find_one(:name => 'John').age
|
61
61
|
|
62
62
|
Person.create(:name => 'Jim')
|
63
63
|
Person.create(:name => 'Pam')
|
64
64
|
|
65
|
-
|
65
|
+
Person.find.to_a.map { |person| person.name }
|
66
66
|
|
67
|
-
|
68
|
-
|
67
|
+
Person.find.has_next?
|
68
|
+
|
69
|
+
Person.find.sort({:name => 1}).skip(2).limit(1).next!.name
|
70
|
+
|
71
|
+
Person.find({:name => 'John'}, {:age => 1}) # select only age field
|
72
|
+
|
73
|
+
Person.find.count # count ignores skip and limit
|
74
|
+
Person.find.skip(1).size # size is affected by skip and limit
|
69
75
|
|
70
76
|
== Copyright
|
71
77
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.8
|
data/lib/tinymongo/cursor.rb
CHANGED
@@ -14,65 +14,28 @@ module TinyMongo
|
|
14
14
|
@_tinymongo_cursor
|
15
15
|
end
|
16
16
|
|
17
|
-
def batch_size
|
18
|
-
@_tinymongo_cursor.batch_size
|
19
|
-
end
|
20
|
-
|
21
|
-
def collection
|
22
|
-
@_tinymongo_cursor.collection
|
23
|
-
end
|
24
|
-
|
25
|
-
def fields
|
26
|
-
@_tinymongo_cursor.fields
|
27
|
-
end
|
28
|
-
|
29
|
-
def full_collection_name
|
30
|
-
@_tinymongo_cursor.full_collection_name
|
31
|
-
end
|
32
|
-
|
33
|
-
def hint
|
34
|
-
@_tinymongo_cursor.hint
|
35
|
-
end
|
36
|
-
|
37
|
-
def order
|
38
|
-
@_tinymongo_cursor.order
|
39
|
-
end
|
40
|
-
|
41
|
-
def selector
|
42
|
-
@_tinymongo_cursor.selector
|
43
|
-
end
|
44
|
-
|
45
|
-
def snapshot
|
46
|
-
@_tinymongo_cursor.snapshot
|
47
|
-
end
|
48
|
-
|
49
|
-
def timeout
|
50
|
-
@_tinymongo_cursor.timeout
|
51
|
-
end
|
52
|
-
|
53
|
-
# instance methods in Mongo::Cursor
|
54
|
-
|
55
|
-
def close
|
56
|
-
@_tinymongo_cursor.close
|
57
|
-
end
|
58
|
-
|
59
|
-
def closed?
|
60
|
-
@_tinymongo_cursor.closed?
|
61
|
-
end
|
62
|
-
|
63
17
|
def count
|
64
18
|
@_tinymongo_cursor.count
|
65
19
|
end
|
66
20
|
|
21
|
+
def size
|
22
|
+
num = (count - skip)
|
23
|
+
num = (num > 0) ? (((num > limit) && limit != 0) ? limit : num) : 0
|
24
|
+
end
|
25
|
+
|
67
26
|
def each
|
68
27
|
num_returned = 0
|
69
28
|
while(has_next? && (@_tinymongo_cursor.instance_variable_get(:@limit) <= 0 ||
|
70
29
|
num_returned < @_tinymongo_cursor.instance_variable_get(:@limit)))
|
71
|
-
yield
|
30
|
+
yield next!
|
72
31
|
num_returned += 1
|
73
32
|
end
|
74
33
|
end
|
75
34
|
|
35
|
+
def forEach(*args)
|
36
|
+
each(*args)
|
37
|
+
end
|
38
|
+
|
76
39
|
def explain
|
77
40
|
@_tinymongo_cursor.explain
|
78
41
|
end
|
@@ -81,21 +44,25 @@ module TinyMongo
|
|
81
44
|
@_tinymongo_cursor.has_next?
|
82
45
|
end
|
83
46
|
|
47
|
+
def hasNext
|
48
|
+
has_next?
|
49
|
+
end
|
50
|
+
|
84
51
|
def limit(*args)
|
85
52
|
call_and_wrap_retval_in_tinymongo_cursor(:limit, args)
|
86
53
|
end
|
87
54
|
|
88
|
-
def
|
55
|
+
def next!
|
89
56
|
doc = @_tinymongo_cursor.next_document
|
90
|
-
|
57
|
+
Helper.deserialize_hashes_in(doc)
|
91
58
|
end
|
92
59
|
|
93
|
-
def
|
94
|
-
|
60
|
+
def next_document
|
61
|
+
next!
|
95
62
|
end
|
96
63
|
|
97
|
-
def
|
98
|
-
|
64
|
+
def nextDocument
|
65
|
+
next!
|
99
66
|
end
|
100
67
|
|
101
68
|
def skip(*args)
|
@@ -104,13 +71,7 @@ module TinyMongo
|
|
104
71
|
|
105
72
|
def sort(*args)
|
106
73
|
if(args.length > 0 && (args[0].instance_of? Hash))
|
107
|
-
|
108
|
-
|
109
|
-
args[0].each_pair do |key, value|
|
110
|
-
sort_array << [key, convert_ascending_descending_to_numeric(value)]
|
111
|
-
end
|
112
|
-
|
113
|
-
args[0] = sort_array
|
74
|
+
args[0] = args[0].map { |k, v| [k, convert_ascending_descending_to_numeric(v)] }
|
114
75
|
end
|
115
76
|
|
116
77
|
call_and_wrap_retval_in_tinymongo_cursor(:sort, args)
|
@@ -120,7 +81,7 @@ module TinyMongo
|
|
120
81
|
return [] if @_tinymongo_cursor.nil?
|
121
82
|
|
122
83
|
hashes = @_tinymongo_cursor.to_a
|
123
|
-
hashes.map { |hash|
|
84
|
+
hashes.map { |hash| Helper.deserialize_hashes_in(hash) }
|
124
85
|
end
|
125
86
|
|
126
87
|
protected
|
data/lib/tinymongo/errors.rb
CHANGED
@@ -19,4 +19,10 @@ module TinyMongo
|
|
19
19
|
super('Modifier operations are not allowed on objects that are not yet saved!')
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
class DeserializationError < Error
|
24
|
+
def initialize(class_name)
|
25
|
+
super("Unable to deserialize hash into #{class_name}!")
|
26
|
+
end
|
27
|
+
end
|
22
28
|
end
|
data/lib/tinymongo/helper.rb
CHANGED
@@ -1,85 +1,78 @@
|
|
1
1
|
module TinyMongo
|
2
2
|
module Helper
|
3
3
|
class << self
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
new_hash[key] = if(obj.instance_of? Hash)
|
8
|
-
deep_copy_hash(obj)
|
9
|
-
elsif(obj.instance_of? Array)
|
10
|
-
deep_copy_array(obj)
|
11
|
-
else
|
12
|
-
begin
|
13
|
-
obj.dup
|
14
|
-
rescue
|
15
|
-
obj
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
new_hash
|
4
|
+
def constantize(class_name)
|
5
|
+
return unless class_name.instance_of? String
|
6
|
+
class_name.split('::').inject(Object) { |mod, klass| mod.const_get(klass) }
|
20
7
|
end
|
21
|
-
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
rescue
|
33
|
-
obj
|
34
|
-
end
|
8
|
+
|
9
|
+
def deep_copy(obj)
|
10
|
+
if(obj.kind_of? Hash)
|
11
|
+
Hash[obj.map { |k,v| [k.to_s, deep_copy(v)] }]
|
12
|
+
elsif(obj.kind_of? Array)
|
13
|
+
obj.map { |o| deep_copy(o)}
|
14
|
+
else
|
15
|
+
begin
|
16
|
+
obj.dup
|
17
|
+
rescue
|
18
|
+
obj
|
35
19
|
end
|
36
20
|
end
|
37
|
-
new_array
|
38
21
|
end
|
39
|
-
|
22
|
+
|
40
23
|
def stringify_keys_in_hash(hash)
|
41
|
-
new_hash = {}
|
42
|
-
hash.each_pair { |key, value| new_hash[key.to_s] = value }
|
24
|
+
new_hash = Hash[hash.map { |k,v| [k.to_s, v] }]
|
43
25
|
new_hash['_id'] = bson_object_id(new_hash['_id']) if(new_hash['_id'])
|
44
26
|
new_hash
|
45
27
|
end
|
46
28
|
|
47
29
|
def symbolify_keys_in_hash(hash)
|
48
|
-
new_hash = {}
|
49
|
-
hash.each_pair { |key, value| new_hash[key.to_sym] = value }
|
30
|
+
new_hash = Hash[hash.map { |k,v| [k.to_sym, v] }]
|
50
31
|
new_hash[:_id] = bson_object_id(new_hash[:_id]) if(new_hash[:_id])
|
51
32
|
new_hash
|
52
33
|
end
|
53
34
|
|
54
|
-
def
|
55
|
-
if(obj.
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
35
|
+
def deserialize_hashes_in(obj)
|
36
|
+
if(obj.kind_of? Hash)
|
37
|
+
new_hash = Hash[obj.map { |k,v| [k.to_s, deserialize_hashes_in(v)] }]
|
38
|
+
class_name = new_hash['_tinymongo_model_class_name']
|
39
|
+
if(class_name)
|
40
|
+
begin
|
41
|
+
klass = constantize(new_hash['_tinymongo_model_class_name'])
|
42
|
+
if(klass.new.kind_of? TinyMongo::Model)
|
43
|
+
deserialized_obj = klass.new(new_hash)
|
44
|
+
else
|
45
|
+
raise
|
46
|
+
end
|
47
|
+
rescue
|
48
|
+
raise DeserializationError, class_name
|
49
|
+
end
|
50
|
+
deserialized_obj
|
51
|
+
else
|
52
|
+
new_hash
|
53
|
+
end
|
54
|
+
elsif(obj.kind_of? Array)
|
55
|
+
obj.map { |o| deserialize_hashes_in(o) }
|
61
56
|
else
|
62
57
|
obj
|
63
58
|
end
|
64
59
|
end
|
65
60
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
61
|
+
def hashify_models_in(obj)
|
62
|
+
if(obj.kind_of? Hash)
|
63
|
+
Hash[obj.map do |k,v|
|
64
|
+
key = k.to_s
|
65
|
+
(key == '_id') ? [key, bson_object_id(v)] : [key, hashify_models_in(v)]
|
66
|
+
end]
|
67
|
+
elsif(obj.kind_of? Array)
|
68
|
+
obj.map { |o| hashify_models_in(o) }
|
69
|
+
elsif(obj.kind_of? TinyMongo::Model)
|
70
|
+
hashify_models_in(obj.to_hash)
|
71
|
+
else
|
72
|
+
obj
|
79
73
|
end
|
80
|
-
new_hash
|
81
74
|
end
|
82
|
-
|
75
|
+
|
83
76
|
def bson_object_id(id)
|
84
77
|
if(id.instance_of? BSON::ObjectID)
|
85
78
|
id
|
data/lib/tinymongo/model.rb
CHANGED
@@ -40,21 +40,31 @@ module TinyMongo
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def find(
|
44
|
-
|
45
|
-
|
43
|
+
def find(query={}, fields=nil, limit=nil, skip=nil)
|
44
|
+
query = Helper.hashify_models_in(query)
|
45
|
+
fields = Helper.hashify_models_in(fields)
|
46
|
+
|
47
|
+
add_tinymongo_model_class_name_key_to_fields(fields)
|
48
|
+
Cursor.new(collection.find(query, {:fields => fields, :limit => limit, :skip => skip}), self)
|
46
49
|
end
|
47
|
-
|
48
|
-
def find_one(
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
|
51
|
+
def find_one(query={}, fields=nil)
|
52
|
+
return nil unless query
|
53
|
+
|
54
|
+
if([BSON::ObjectID, String].include? query.class)
|
55
|
+
query = {'_id' => Helper.bson_object_id(query)}
|
53
56
|
else
|
54
|
-
|
55
|
-
|
57
|
+
query = Helper.hashify_models_in(query)
|
58
|
+
fields = Helper.hashify_models_in(fields)
|
56
59
|
end
|
57
|
-
|
60
|
+
|
61
|
+
add_tinymongo_model_class_name_key_to_fields(fields)
|
62
|
+
hash = collection.find_one(query, {:fields => fields})
|
63
|
+
hash ? Helper.deserialize_hashes_in(hash) : nil
|
64
|
+
end
|
65
|
+
|
66
|
+
def findOne(*args)
|
67
|
+
find_one(*args)
|
58
68
|
end
|
59
69
|
|
60
70
|
def create(hash={})
|
@@ -88,7 +98,9 @@ module TinyMongo
|
|
88
98
|
end
|
89
99
|
|
90
100
|
def initialize(hash={})
|
91
|
-
@_tinymongo_hash = (Helper.
|
101
|
+
@_tinymongo_hash = (Helper.deep_copy(self.class.instance_variable_get(:@_tinymongo_defaults)).merge(Helper.stringify_keys_in_hash(hash)) || {}) if hash
|
102
|
+
set_tinymongo_model_class_name_in_hash(@_tinymongo_hash)
|
103
|
+
self
|
92
104
|
end
|
93
105
|
|
94
106
|
def _id
|
@@ -99,14 +111,6 @@ module TinyMongo
|
|
99
111
|
@_tinymongo_hash['_id'] = Helper.bson_object_id(val)
|
100
112
|
end
|
101
113
|
|
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
|
-
|
110
114
|
def ==(another)
|
111
115
|
(self.instance_variable_get(:@_tinymongo_hash) == another.instance_variable_get(:@_tinymongo_hash)) &&
|
112
116
|
(self.kind_of? TinyMongo::Model) && (another.kind_of? TinyMongo::Model)
|
@@ -121,7 +125,7 @@ module TinyMongo
|
|
121
125
|
end
|
122
126
|
|
123
127
|
def to_hash
|
124
|
-
@_tinymongo_hash.dup
|
128
|
+
hash = @_tinymongo_hash.dup
|
125
129
|
end
|
126
130
|
|
127
131
|
def to_param
|
@@ -131,19 +135,19 @@ module TinyMongo
|
|
131
135
|
def reload
|
132
136
|
if(@_tinymongo_hash['_id'])
|
133
137
|
obj = collection.find_one({ '_id' => @_tinymongo_hash['_id'] })
|
134
|
-
@_tinymongo_hash = Helper.
|
138
|
+
@_tinymongo_hash = Hash[obj.map { |k,v| [k.to_s, Helper.deserialize_hashes_in(v)] }] if(obj)
|
135
139
|
end
|
136
140
|
end
|
137
141
|
|
138
142
|
def save
|
139
143
|
if(@_tinymongo_hash['_id'].nil?) # new
|
140
|
-
oid = collection.save(@_tinymongo_hash)
|
144
|
+
oid = collection.save(Helper.hashify_models_in(@_tinymongo_hash))
|
141
145
|
if(oid)
|
142
146
|
@_tinymongo_hash.delete(:_id)
|
143
147
|
@_tinymongo_hash['_id'] = oid
|
144
148
|
end
|
145
149
|
else # update
|
146
|
-
collection.update({ '_id' => @_tinymongo_hash['_id'] }, @_tinymongo_hash, :upsert => true)
|
150
|
+
collection.update({ '_id' => @_tinymongo_hash['_id'] }, Helper.hashify_models_in(@_tinymongo_hash), :upsert => true)
|
147
151
|
reload
|
148
152
|
end
|
149
153
|
return self
|
@@ -184,14 +188,22 @@ module TinyMongo
|
|
184
188
|
def push(hash={})
|
185
189
|
do_modifier_operation_and_reload('$push', hash)
|
186
190
|
end
|
187
|
-
|
191
|
+
|
188
192
|
def push_all(hash={})
|
189
193
|
do_modifier_operation_and_reload('$pushAll', hash)
|
190
194
|
end
|
195
|
+
|
196
|
+
def pushAll(*args)
|
197
|
+
push_all(*args)
|
198
|
+
end
|
191
199
|
|
192
200
|
def add_to_set(hash={})
|
193
201
|
do_modifier_operation_and_reload('$addToSet', hash)
|
194
202
|
end
|
203
|
+
|
204
|
+
def addToSet(*args)
|
205
|
+
add_to_set(*args)
|
206
|
+
end
|
195
207
|
|
196
208
|
def pop(hash={})
|
197
209
|
do_modifier_operation_and_reload('$pop', hash)
|
@@ -204,12 +216,30 @@ module TinyMongo
|
|
204
216
|
def pull_all(hash={})
|
205
217
|
do_modifier_operation_and_reload('$pullAll', hash)
|
206
218
|
end
|
219
|
+
|
220
|
+
def pullAll(*args)
|
221
|
+
pull_all(*args)
|
222
|
+
end
|
207
223
|
|
208
224
|
protected
|
209
225
|
def do_modifier_operation_and_reload(operator, hash)
|
210
226
|
raise ModifierOperationError unless @_tinymongo_hash['_id']
|
211
|
-
collection.update({ '_id' => @_tinymongo_hash['_id'] }, { operator => Helper.
|
227
|
+
collection.update({ '_id' => @_tinymongo_hash['_id'] }, { operator => Helper.hashify_models_in(hash) })
|
212
228
|
reload
|
213
229
|
end
|
230
|
+
|
231
|
+
def set_tinymongo_model_class_name_in_hash(hash)
|
232
|
+
hash['_tinymongo_model_class_name'] = self.class.to_s
|
233
|
+
hash
|
234
|
+
end
|
235
|
+
|
236
|
+
def self.add_tinymongo_model_class_name_key_to_fields(fields)
|
237
|
+
if(fields.kind_of? Hash)
|
238
|
+
fields['_tinymongo_model_class_name'] = 1
|
239
|
+
elsif(fields.kind_of? Array)
|
240
|
+
fields << '_tinymongo_model_class_name'
|
241
|
+
end
|
242
|
+
fields
|
243
|
+
end
|
214
244
|
end
|
215
245
|
end
|
data/test/test_tinymongo.rb
CHANGED
@@ -38,24 +38,30 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
38
38
|
obj1 = Dummy.new(:foo => 'hello', :bar => 'world')
|
39
39
|
obj2 = Dummy.new(:foo => 'love', :bar => 'ek')
|
40
40
|
hash = { :obj1 => obj1, :obj2 => obj2, :hash => { :obj => obj1 }, :array => [obj1, obj2, 'yay'], :val => 'pete' }
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
obj1_hash = { 'foo' => 'hello', 'bar' => 'world', '_tinymongo_model_class_name' => 'Dummy' }
|
42
|
+
obj2_hash = { 'foo' => 'love', 'bar' => 'ek', '_tinymongo_model_class_name' => 'Dummy' }
|
43
|
+
|
44
|
+
assert_equal({ 'obj1' => obj1_hash,
|
45
|
+
'obj2' => obj2_hash,
|
46
|
+
'hash' => { 'obj' => obj1_hash },
|
47
|
+
'array' => [ obj1_hash, obj2_hash, 'yay' ],
|
45
48
|
'val' => 'pete' },
|
46
|
-
TinyMongo::Helper.
|
49
|
+
TinyMongo::Helper.hashify_models_in(hash))
|
47
50
|
end
|
48
51
|
|
49
52
|
def test_helper_hashify_models_in_array
|
50
53
|
obj1 = Dummy.new(:foo => 'hello', :bar => 'world')
|
51
54
|
obj2 = Dummy.new(:foo => 'love', :bar => 'ek')
|
52
55
|
array = [ obj1, obj2, { :obj => obj1 }, [obj1, obj2, 'yay'], 'pete' ]
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
56
|
+
obj1_hash = { 'foo' => 'hello', 'bar' => 'world', '_tinymongo_model_class_name' => 'Dummy' }
|
57
|
+
obj2_hash = { 'foo' => 'love', 'bar' => 'ek', '_tinymongo_model_class_name' => 'Dummy' }
|
58
|
+
|
59
|
+
assert_equal([ obj1_hash,
|
60
|
+
obj2_hash,
|
61
|
+
{ 'obj' => obj1_hash },
|
62
|
+
[ obj1_hash, obj2_hash, 'yay' ],
|
57
63
|
'pete' ],
|
58
|
-
TinyMongo::Helper.
|
64
|
+
TinyMongo::Helper.hashify_models_in(array))
|
59
65
|
end
|
60
66
|
|
61
67
|
def test_mongo_key
|
@@ -94,6 +100,7 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
94
100
|
obj = Dummy.new(hash)
|
95
101
|
obj.save # save to db
|
96
102
|
hash['_id'] = obj._id # add _id to hash
|
103
|
+
hash['_tinymongo_model_class_name'] = 'Dummy'
|
97
104
|
result = TinyMongo.db['dummies'].find_one({'_id' => obj._id})
|
98
105
|
assert_equal TinyMongo::Helper.stringify_keys_in_hash(hash), result # compare
|
99
106
|
end
|
@@ -103,6 +110,7 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
103
110
|
|
104
111
|
obj = Dummy.create(hash) # save to db
|
105
112
|
hash['_id'] = obj._id # add _id to hash
|
113
|
+
hash['_tinymongo_model_class_name'] = 'Dummy'
|
106
114
|
|
107
115
|
result = TinyMongo.db['dummies'].find_one({'_id' => obj._id})
|
108
116
|
assert_equal TinyMongo::Helper.stringify_keys_in_hash(hash), result, result # compare
|
@@ -162,43 +170,66 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
162
170
|
assert_equal [obj3], found2
|
163
171
|
end
|
164
172
|
|
165
|
-
def
|
166
|
-
Dummy.create
|
167
|
-
|
168
|
-
assert_equal
|
169
|
-
|
170
|
-
|
171
|
-
def test_cursor_closed?
|
172
|
-
Dummy.create
|
173
|
-
cursor = Dummy.find
|
174
|
-
cursor.close
|
175
|
-
assert_equal true, cursor.closed?
|
173
|
+
def test_find_fields
|
174
|
+
Dummy.create('foo' => 'hello', 'bar' => 'world')
|
175
|
+
found = Dummy.find({}, {'foo' => 1}).next!
|
176
|
+
assert_equal 'hello', found.foo
|
177
|
+
assert_equal nil, found.bar
|
176
178
|
end
|
177
|
-
|
178
|
-
|
179
|
+
|
179
180
|
def test_cursor_count
|
180
|
-
Dummy.create
|
181
|
-
Dummy.create
|
182
|
-
Dummy.create
|
181
|
+
3.times { Dummy.create }
|
183
182
|
cursor = Dummy.find
|
184
183
|
assert_equal 3, cursor.count
|
185
184
|
end
|
186
185
|
|
187
186
|
def test_cursor_limit
|
188
|
-
Dummy.create
|
189
|
-
Dummy.create
|
190
|
-
Dummy.create
|
187
|
+
3.times { Dummy.create }
|
191
188
|
cursor = Dummy.find.limit(1)
|
192
189
|
assert_equal 1, cursor.to_a.size
|
193
190
|
end
|
194
191
|
|
195
192
|
def test_cursor_limit_count
|
196
|
-
Dummy.create
|
197
|
-
Dummy.create
|
198
|
-
Dummy.create
|
193
|
+
3.times { Dummy.create }
|
199
194
|
cursor = Dummy.find.limit(2)
|
200
195
|
assert_equal 2, cursor.limit
|
201
196
|
end
|
197
|
+
|
198
|
+
def test_cursor_size
|
199
|
+
10.times { Dummy.create }
|
200
|
+
cursor = Dummy.find
|
201
|
+
assert_equal 10, cursor.size
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_cursor_size_skip
|
205
|
+
10.times { Dummy.create }
|
206
|
+
cursor = Dummy.find.skip(4)
|
207
|
+
assert_equal 6, cursor.size
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_cursor_size_limit
|
211
|
+
10.times { Dummy.create }
|
212
|
+
cursor = Dummy.find.limit(5)
|
213
|
+
assert_equal 5, cursor.size
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_cursor_size_skip_limit
|
217
|
+
10.times { Dummy.create }
|
218
|
+
cursor = Dummy.find.skip(3).limit(5)
|
219
|
+
assert_equal 5, cursor.size
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_cursor_size_skip_too_much
|
223
|
+
10.times { Dummy.create }
|
224
|
+
cursor = Dummy.find.skip(10)
|
225
|
+
assert_equal 0, cursor.size
|
226
|
+
end
|
227
|
+
|
228
|
+
def test_cursor_size_skip_limit_out_of_bounds
|
229
|
+
10.times { Dummy.create }
|
230
|
+
cursor = Dummy.find.skip(7).limit(5)
|
231
|
+
assert_equal 3, cursor.size
|
232
|
+
end
|
202
233
|
|
203
234
|
def test_cursor_each
|
204
235
|
Dummy.create('foo' => 1)
|
@@ -224,16 +255,16 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
224
255
|
cursor = Dummy.find
|
225
256
|
assert_equal false, cursor.has_next?
|
226
257
|
end
|
227
|
-
|
228
|
-
def
|
258
|
+
|
259
|
+
def test_cursor_next!
|
229
260
|
obj = Dummy.create
|
230
261
|
cursor = Dummy.find
|
231
|
-
assert_equal obj, cursor.
|
262
|
+
assert_equal obj, cursor.next!
|
232
263
|
end
|
233
264
|
|
234
|
-
def
|
265
|
+
def test_cursor_next_nil
|
235
266
|
cursor = Dummy.find
|
236
|
-
assert_equal nil, cursor.
|
267
|
+
assert_equal nil, cursor.next!
|
237
268
|
end
|
238
269
|
|
239
270
|
def test_cursor_skip
|
@@ -242,7 +273,7 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
242
273
|
obj = Dummy.create('foo' => 3)
|
243
274
|
|
244
275
|
cursor = Dummy.find.skip(2)
|
245
|
-
assert_equal obj, cursor.
|
276
|
+
assert_equal obj, cursor.next!
|
246
277
|
end
|
247
278
|
|
248
279
|
def test_cursor_skip_all
|
@@ -251,7 +282,7 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
251
282
|
obj = Dummy.create('foo' => 3)
|
252
283
|
|
253
284
|
cursor = Dummy.find.skip(3)
|
254
|
-
assert_equal nil, cursor.
|
285
|
+
assert_equal nil, cursor.next!
|
255
286
|
end
|
256
287
|
|
257
288
|
def test_cursor_skip_count
|
@@ -338,12 +369,7 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
338
369
|
|
339
370
|
def test_to_hash
|
340
371
|
obj = Dummy.create('foo' => 'hello')
|
341
|
-
assert_equal({'_id' => obj._id, 'foo' => 'hello'}, obj.to_hash)
|
342
|
-
end
|
343
|
-
|
344
|
-
def test_id
|
345
|
-
obj = Dummy.create
|
346
|
-
assert_equal obj._id.to_s, obj.id
|
372
|
+
assert_equal({'_id' => obj._id, 'foo' => 'hello', '_tinymongo_model_class_name' => 'Dummy'}, obj.to_hash)
|
347
373
|
end
|
348
374
|
|
349
375
|
def test_to_param
|
@@ -455,4 +481,15 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
455
481
|
assert_equal [3], TinyMongo.db['dummies'].find_one()['foo']
|
456
482
|
end
|
457
483
|
|
484
|
+
def test_deserialize
|
485
|
+
Dummy.create('foo' => 'array', 'bar' => [Dummy.create('foo' => 'hello'), Dummy.create('foo' => 'world')])
|
486
|
+
d = Dummy.find_one({'foo' => 'array'})
|
487
|
+
assert_equal 'Dummy', d.class.to_s
|
488
|
+
assert_equal 'array', d.foo
|
489
|
+
assert_equal 'Dummy', d.bar[0].class.to_s
|
490
|
+
assert_equal 'hello', d.bar[0].foo
|
491
|
+
assert_equal 'Dummy', d.bar[1].class.to_s
|
492
|
+
assert_equal 'world', d.bar[1].foo
|
493
|
+
end
|
494
|
+
|
458
495
|
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.
|
8
|
+
s.version = "0.1.8"
|
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-
|
12
|
+
s.date = %q{2010-07-29}
|
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
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 8
|
9
|
+
version: 0.1.8
|
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-
|
17
|
+
date: 2010-07-29 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|