tinymongo 0.1.8 → 0.1.9
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 +5 -0
- data/VERSION +1 -1
- data/lib/tinymongo.rb +1 -1
- data/lib/tinymongo/cursor.rb +18 -14
- data/lib/tinymongo/model.rb +123 -8
- data/test/test_tinymongo.rb +78 -2
- data/tinymongo.gemspec +1 -1
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -73,6 +73,11 @@ To create TinyMongo config file (config/tinymongo.yml) and initializer file (con
|
|
73
73
|
Person.find.count # count ignores skip and limit
|
74
74
|
Person.find.skip(1).size # size is affected by skip and limit
|
75
75
|
|
76
|
+
Person.distinct(:name)
|
77
|
+
|
78
|
+
Person.ensure_index({:name => 1})
|
79
|
+
Person.drop_index({:name => 1})
|
80
|
+
|
76
81
|
== Copyright
|
77
82
|
|
78
83
|
Copyright (c) 2010 Peter Jihoon Kim. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.9
|
data/lib/tinymongo.rb
CHANGED
data/lib/tinymongo/cursor.rb
CHANGED
@@ -48,8 +48,8 @@ module TinyMongo
|
|
48
48
|
has_next?
|
49
49
|
end
|
50
50
|
|
51
|
-
def limit(
|
52
|
-
call_and_wrap_retval_in_tinymongo_cursor(:limit,
|
51
|
+
def limit(number_to_return=nil)
|
52
|
+
call_and_wrap_retval_in_tinymongo_cursor(:limit, [number_to_return])
|
53
53
|
end
|
54
54
|
|
55
55
|
def next!
|
@@ -65,16 +65,18 @@ module TinyMongo
|
|
65
65
|
next!
|
66
66
|
end
|
67
67
|
|
68
|
-
def skip(
|
69
|
-
call_and_wrap_retval_in_tinymongo_cursor(:skip,
|
68
|
+
def skip(number_to_skip=nil)
|
69
|
+
call_and_wrap_retval_in_tinymongo_cursor(:skip, [number_to_skip])
|
70
70
|
end
|
71
71
|
|
72
|
-
def sort(
|
73
|
-
if(
|
74
|
-
|
72
|
+
def sort(key_or_list, direction=nil)
|
73
|
+
if(key_or_list.kind_of? Hash)
|
74
|
+
key_or_list = key_or_list.map { |k, v| [k.to_s, convert_ascending_descending(v)] }
|
75
|
+
elsif(key_or_list.kind_of? Array)
|
76
|
+
key_or_list = key_or_list.map { |o| (o.kind_of? Array) ? [o[0].to_s, convert_ascending_descending(o[1])] : nil }.compact
|
75
77
|
end
|
76
78
|
|
77
|
-
call_and_wrap_retval_in_tinymongo_cursor(:sort,
|
79
|
+
call_and_wrap_retval_in_tinymongo_cursor(:sort, [key_or_list, direction])
|
78
80
|
end
|
79
81
|
|
80
82
|
def to_a
|
@@ -95,12 +97,14 @@ module TinyMongo
|
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
98
|
-
def
|
99
|
-
case(val)
|
100
|
-
when 'ascending', 'asc', 1
|
101
|
-
|
102
|
-
when 'descending', 'desc', -1
|
103
|
-
|
100
|
+
def convert_ascending_descending(val)
|
101
|
+
case(val.to_s)
|
102
|
+
when 'ascending', 'asc', '1', Mongo::ASCENDING.to_s
|
103
|
+
Mongo::ASCENDING
|
104
|
+
when 'descending', 'desc', '-1', Mongo::DESCENDING.to_s
|
105
|
+
Mongo::DESCENDING
|
106
|
+
else
|
107
|
+
val
|
104
108
|
end
|
105
109
|
end
|
106
110
|
end
|
data/lib/tinymongo/model.rb
CHANGED
@@ -6,7 +6,7 @@ module TinyMongo
|
|
6
6
|
@_tinymongo_defaults = {} if @_tinymongo_defaults.nil?
|
7
7
|
|
8
8
|
args.each do |arg|
|
9
|
-
default = arg[:default] || arg['default'] if(arg.
|
9
|
+
default = arg[:default] || arg['default'] if(arg.kind_of? Hash)
|
10
10
|
end
|
11
11
|
|
12
12
|
args.each do |arg|
|
@@ -40,6 +40,18 @@ module TinyMongo
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
def full_name
|
44
|
+
"#{db.name}.#{collection.name}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_full_name
|
48
|
+
full_name
|
49
|
+
end
|
50
|
+
|
51
|
+
def getFullName
|
52
|
+
full_name
|
53
|
+
end
|
54
|
+
|
43
55
|
def find(query={}, fields=nil, limit=nil, skip=nil)
|
44
56
|
query = Helper.hashify_models_in(query)
|
45
57
|
fields = Helper.hashify_models_in(fields)
|
@@ -76,8 +88,12 @@ module TinyMongo
|
|
76
88
|
collection.remove({ '_id' => Helper.bson_object_id(id)})
|
77
89
|
end
|
78
90
|
|
79
|
-
def destroy(
|
80
|
-
delete(
|
91
|
+
def destroy(*args)
|
92
|
+
delete(*args)
|
93
|
+
end
|
94
|
+
|
95
|
+
def remove(*args)
|
96
|
+
delete(*args)
|
81
97
|
end
|
82
98
|
|
83
99
|
def drop
|
@@ -95,10 +111,69 @@ module TinyMongo
|
|
95
111
|
def count
|
96
112
|
collection.count
|
97
113
|
end
|
114
|
+
|
115
|
+
def ensure_index(keys, options={})
|
116
|
+
if(keys.kind_of? Hash)
|
117
|
+
keys = keys.map { |k,v| [k.to_s, convert_ascending_descending_2d(v)]}
|
118
|
+
elsif(keys.kind_of? Array)
|
119
|
+
keys = keys.map { |o| (o.kind_of? Array) ? [o[0].to_s, convert_ascending_descending_2d(o[1])] : nil }.compact
|
120
|
+
end
|
121
|
+
options = Helper.symbolify_keys_in_hash(options)
|
122
|
+
collection.create_index(keys, options)
|
123
|
+
end
|
124
|
+
|
125
|
+
def ensureIndex(*args)
|
126
|
+
ensure_index(*args)
|
127
|
+
end
|
128
|
+
|
129
|
+
def drop_index(obj)
|
130
|
+
if(obj.instance_of? String)
|
131
|
+
index = obj
|
132
|
+
elsif(obj.kind_of? Hash)
|
133
|
+
index = get_index_name(obj)
|
134
|
+
elsif(obj.kind_of? Array)
|
135
|
+
index = get_index_name(Hash[obj])
|
136
|
+
else
|
137
|
+
return
|
138
|
+
end
|
139
|
+
|
140
|
+
collection.drop_index(index)
|
141
|
+
end
|
142
|
+
|
143
|
+
def dropIndex(*args)
|
144
|
+
drop_index(*args)
|
145
|
+
end
|
146
|
+
|
147
|
+
def drop_indexes
|
148
|
+
collection.drop_indexes
|
149
|
+
end
|
150
|
+
|
151
|
+
def dropIndexes
|
152
|
+
drop_indexes
|
153
|
+
end
|
154
|
+
|
155
|
+
def get_indexes
|
156
|
+
collection.index_information.map { |k,v| v }
|
157
|
+
end
|
158
|
+
|
159
|
+
def getIndexes
|
160
|
+
get_indexes
|
161
|
+
end
|
162
|
+
|
163
|
+
def distinct(key, query=nil)
|
164
|
+
if(query.kind_of? Hash)
|
165
|
+
query = Helper.hashify_models_in(query)
|
166
|
+
end
|
167
|
+
collection.distinct(key, query)
|
168
|
+
end
|
98
169
|
end
|
99
170
|
|
100
171
|
def initialize(hash={})
|
101
|
-
@_tinymongo_hash =
|
172
|
+
@_tinymongo_hash = {}
|
173
|
+
defaults = self.class.instance_variable_get(:@_tinymongo_defaults)
|
174
|
+
defaults = self.class.instance_variable_set(:@_tinymongo_defaults, {}) if(defaults.nil?)
|
175
|
+
hash = Helper.deep_copy(defaults).merge(Helper.stringify_keys_in_hash(hash || {}))
|
176
|
+
hash.each_pair { |key, value| set_using_setter(key, value) }
|
102
177
|
set_tinymongo_model_class_name_in_hash(@_tinymongo_hash)
|
103
178
|
self
|
104
179
|
end
|
@@ -153,16 +228,16 @@ module TinyMongo
|
|
153
228
|
return self
|
154
229
|
end
|
155
230
|
|
156
|
-
def update_attribute(
|
157
|
-
|
231
|
+
def update_attribute(key, value)
|
232
|
+
set_using_setter(key, value)
|
158
233
|
save
|
159
234
|
end
|
160
235
|
|
161
236
|
def update_attributes(hash={})
|
162
|
-
hash.each_pair { |key, value|
|
237
|
+
hash.each_pair { |key, value| set_using_setter(key, value) }
|
163
238
|
save
|
164
239
|
end
|
165
|
-
|
240
|
+
|
166
241
|
def delete
|
167
242
|
if(@_tinymongo_hash['_id'])
|
168
243
|
collection.remove({ '_id' => @_tinymongo_hash['_id'] })
|
@@ -241,5 +316,45 @@ module TinyMongo
|
|
241
316
|
end
|
242
317
|
fields
|
243
318
|
end
|
319
|
+
|
320
|
+
def set_using_setter(key, value)
|
321
|
+
setter = key.to_s + '='
|
322
|
+
self.send(setter, value) if(self.respond_to? setter)
|
323
|
+
end
|
324
|
+
|
325
|
+
def self.convert_ascending_descending_2d(val)
|
326
|
+
case(val.to_s)
|
327
|
+
when 'ascending', 'asc', '1', Mongo::ASCENDING.to_s
|
328
|
+
Mongo::ASCENDING
|
329
|
+
when 'descending', 'desc', '-1', Mongo::DESCENDING.to_s
|
330
|
+
Mongo::DESCENDING
|
331
|
+
when '2d', Mongo::GEO2D.to_s
|
332
|
+
Mongo::GEO2D
|
333
|
+
else
|
334
|
+
val
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
def self.convert_ascending_descending_to_numeric(val)
|
339
|
+
case(val.to_s)
|
340
|
+
when 'ascending', 'asc', '1', Mongo::ASCENDING.to_s
|
341
|
+
1
|
342
|
+
when 'descending', 'desc', '-1', Mongo::DESCENDING.to_s
|
343
|
+
-1
|
344
|
+
else
|
345
|
+
val
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
def self.get_index_name(hash)
|
350
|
+
name = ''
|
351
|
+
hash.each_pair do |k,v|
|
352
|
+
name += '_' if(name.length > 0)
|
353
|
+
name += k.to_s + '_'
|
354
|
+
v = convert_ascending_descending_to_numeric(v)
|
355
|
+
name += v.to_s if(v.kind_of? Integer)
|
356
|
+
end
|
357
|
+
name
|
358
|
+
end
|
244
359
|
end
|
245
360
|
end
|
data/test/test_tinymongo.rb
CHANGED
@@ -21,7 +21,7 @@ end
|
|
21
21
|
|
22
22
|
class TinyMongoTest < Test::Unit::TestCase
|
23
23
|
def setup
|
24
|
-
TinyMongo.db['dummies'].drop
|
24
|
+
TinyMongo.db['dummies'].drop
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_helper_stringify_keys_in_hash
|
@@ -116,6 +116,13 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
116
116
|
assert_equal TinyMongo::Helper.stringify_keys_in_hash(hash), result, result # compare
|
117
117
|
end
|
118
118
|
|
119
|
+
def test_create_ignore_undefined_keys
|
120
|
+
obj = Dummy.create({'foo' => 'hello', 'bar' => 'world', 'fubar' => 'snafu'}) # save to db
|
121
|
+
|
122
|
+
result = TinyMongo.db['dummies'].find_one({'_id' => obj._id})
|
123
|
+
assert_equal TinyMongo::Helper.stringify_keys_in_hash({'foo' => 'hello', 'bar' => 'world', '_id' => obj._id, '_tinymongo_model_class_name' => 'Dummy'}), result, result # compare
|
124
|
+
end
|
125
|
+
|
119
126
|
def test_save_update
|
120
127
|
obj = Dummy.create('foo' => 'hello')
|
121
128
|
obj.foo = 'bye'
|
@@ -313,10 +320,19 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
313
320
|
obj2 = Dummy.create('foo' => 2)
|
314
321
|
obj3 = Dummy.create('foo' => 1)
|
315
322
|
|
316
|
-
cursor = Dummy.find.sort(
|
323
|
+
cursor = Dummy.find.sort('foo')
|
317
324
|
assert_equal [obj3, obj2, obj1], cursor.to_a
|
318
325
|
end
|
319
326
|
|
327
|
+
def test_cursor_sort_array
|
328
|
+
obj1 = Dummy.create('foo' => 3)
|
329
|
+
obj2 = Dummy.create('foo' => 2)
|
330
|
+
obj3 = Dummy.create('foo' => 1)
|
331
|
+
|
332
|
+
cursor = Dummy.find.sort([['foo', 'ascending']])
|
333
|
+
assert_equal [obj3, obj2, obj1], cursor.to_a
|
334
|
+
end
|
335
|
+
|
320
336
|
def test_cursor_sort_hash
|
321
337
|
obj1 = Dummy.create('foo' => 3)
|
322
338
|
obj2 = Dummy.create('foo' => 2)
|
@@ -492,4 +508,64 @@ class TinyMongoTest < Test::Unit::TestCase
|
|
492
508
|
assert_equal 'world', d.bar[1].foo
|
493
509
|
end
|
494
510
|
|
511
|
+
def test_full_name
|
512
|
+
assert_equal 'tinymongo_test.dummies', Dummy.full_name
|
513
|
+
end
|
514
|
+
|
515
|
+
def test_get_indexes
|
516
|
+
Dummy.create
|
517
|
+
assert_equal [{'name' => '_id_', 'ns' => 'tinymongo_test.dummies', 'key' => {'_id' => 1}}], Dummy.get_indexes
|
518
|
+
end
|
519
|
+
|
520
|
+
def test_ensure_index
|
521
|
+
Dummy.create
|
522
|
+
assert_equal 'foo_1', Dummy.ensure_index({'foo' => 1})
|
523
|
+
assert_equal 'foo_1_bar_-1', Dummy.ensure_index({'foo' => 1, 'bar' => -1})
|
524
|
+
assert_equal [{"name" => "_id_", "ns" => "tinymongo_test.dummies", "key" => {"_id" => 1}},
|
525
|
+
{"name" => "foo_1", "ns" => "tinymongo_test.dummies", "key" => {"foo" => 1}},
|
526
|
+
{"name" => "foo_1_bar_-1", "ns" => "tinymongo_test.dummies", "key" => {"foo" => 1, "bar" => -1}}],
|
527
|
+
Dummy.get_indexes
|
528
|
+
end
|
529
|
+
|
530
|
+
def test_drop_index
|
531
|
+
Dummy.create
|
532
|
+
index_name = Dummy.ensure_index({'foo' => 1})
|
533
|
+
assert_equal [{"name" => "_id_", "ns" => "tinymongo_test.dummies", "key" => {"_id" => 1}},
|
534
|
+
{"name" => "foo_1", "ns" => "tinymongo_test.dummies", "key" => {"foo" => 1}}],
|
535
|
+
Dummy.get_indexes
|
536
|
+
Dummy.drop_index(index_name)
|
537
|
+
assert_equal [{'name' => '_id_', 'ns' => 'tinymongo_test.dummies', 'key' => {'_id' => 1}}], Dummy.get_indexes
|
538
|
+
end
|
539
|
+
|
540
|
+
def test_drop_index_hash
|
541
|
+
Dummy.create
|
542
|
+
index_name = Dummy.ensure_index({'foo' => 1, 'bar' => -1})
|
543
|
+
Dummy.drop_index({'foo' => 1, 'bar' => -1})
|
544
|
+
assert_equal [{'name' => '_id_', 'ns' => 'tinymongo_test.dummies', 'key' => {'_id' => 1}}], Dummy.get_indexes
|
545
|
+
end
|
546
|
+
|
547
|
+
def test_drop_index_array
|
548
|
+
Dummy.create
|
549
|
+
index_name = Dummy.ensure_index({'foo' => 1, 'bar' => -1})
|
550
|
+
Dummy.drop_index([['foo', 1], ['bar', -1]])
|
551
|
+
assert_equal [{'name' => '_id_', 'ns' => 'tinymongo_test.dummies', 'key' => {'_id' => 1}}], Dummy.get_indexes
|
552
|
+
end
|
553
|
+
|
554
|
+
def test_drop_indexes
|
555
|
+
Dummy.create
|
556
|
+
Dummy.ensure_index({'foo' => 1})
|
557
|
+
Dummy.ensure_index({'bar' => 1})
|
558
|
+
Dummy.drop_indexes
|
559
|
+
assert_equal [{'name' => '_id_', 'ns' => 'tinymongo_test.dummies', 'key' => {'_id' => 1}}], Dummy.get_indexes
|
560
|
+
end
|
561
|
+
|
562
|
+
def test_distinct
|
563
|
+
Dummy.create('foo' => 'hello', 'bar' => 'hello')
|
564
|
+
Dummy.create('foo' => 'hello', 'bar' => 'world')
|
565
|
+
Dummy.create('foo' => 'world', 'bar' => 'world')
|
566
|
+
Dummy.create('foo' => 'world', 'bar' => 'world')
|
567
|
+
assert_equal ['hello','world'], Dummy.distinct('foo')
|
568
|
+
assert_equal ['hello'], Dummy.distinct('foo', {'bar' => 'hello'})
|
569
|
+
assert_equal ['hello','world'], Dummy.distinct('foo', {'bar' => 'world'})
|
570
|
+
end
|
495
571
|
end
|
data/tinymongo.gemspec
CHANGED