jmongo 1.1.2 → 1.1.3
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/Gemfile +4 -1
- data/Gemfile.lock +1 -0
- data/README.txt +11 -2
- data/jmongo.gemspec +2 -2
- data/lib/jmongo/cursor.rb +101 -33
- data/lib/jmongo/mongo/utils.rb +43 -0
- data/lib/jmongo/version.rb +1 -1
- data/test/collection_test.rb +57 -37
- metadata +11 -11
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.txt
CHANGED
@@ -26,7 +26,7 @@ the collection and cursor test suites pass. NOTE: a few (2/3) tests have been sk
|
|
26
26
|
them to see if they affect you.
|
27
27
|
|
28
28
|
The Mongoid rspec functional suite runs 2607 examples with 28 failures when using JMongo
|
29
|
-
My Mongoid repo was forked after this commit (so newer funtionality/
|
29
|
+
My Mongoid repo was forked after this commit (so newer funtionality/specs will be missing)
|
30
30
|
commit 6cc97092bc10535b8b65647a3d14b10ca1b94c8c
|
31
31
|
Author: Bernerd Schaefer <bj.schaefer@gmail.com>
|
32
32
|
Date: Tue Jun 28 12:59:34 2011 +0200
|
@@ -36,7 +36,7 @@ The failures are classed in this way:
|
|
36
36
|
* Managing Replica Sets directly
|
37
37
|
* Managing Connection Pools directly
|
38
38
|
* XML serialization
|
39
|
-
* Ruby RegExp to BSON encode and decode
|
39
|
+
* Ruby RegExp to BSON encode and decode (FIXED)
|
40
40
|
|
41
41
|
I will fix these problems in due course
|
42
42
|
|
@@ -46,3 +46,12 @@ JMongo lets the Java driver handle reading from slaves and writing to master, al
|
|
46
46
|
tested JMongo with Replica Sets yet.
|
47
47
|
If you intend to use the fsync=true uri option to imply safe=true on your queries, at the moment you will also
|
48
48
|
need to specify the w option in the uri. e.g. mongodb://0.0.0.0:27017/?fsync=true;w=1;
|
49
|
+
|
50
|
+
2011-10-18
|
51
|
+
I have added non-blocking support to the Cursor if it is tailable and bound to a Capped Collection.
|
52
|
+
This is to have similar behaviour to the ruby driver as far as test expectations.
|
53
|
+
The unblocking behaviour is achieved by inserting a "poison doc" into the capped collection in a timeout thread.
|
54
|
+
In the Cursor.new options hash if you set await_data to hash, float or true it will not block on cursor.next.
|
55
|
+
a value of true will use the defaults, a value of float will set the timeout whaile a hash will allow you to
|
56
|
+
control the timeout as well as your own poison doc and the poison doc equality (lambda/proc) mechanism.
|
57
|
+
The default timeout is 0.125 seconds.
|
data/jmongo.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'jmongo'
|
3
|
-
s.version = '1.1.
|
4
|
-
s.date = '2011-10-
|
3
|
+
s.version = '1.1.3'
|
4
|
+
s.date = '2011-10-18'
|
5
5
|
s.platform = Gem::Platform::RUBY
|
6
6
|
s.authors = ["Chuck Remes","Guy Boertje", "Lee Henson"]
|
7
7
|
s.email = ["cremes@mac.com", "guyboertje@gmail.com", "lee.m.henson@gmail.com"]
|
data/lib/jmongo/cursor.rb
CHANGED
@@ -17,6 +17,8 @@ module Mongo
|
|
17
17
|
class Cursor
|
18
18
|
include Mongo::JavaImpl::Utils
|
19
19
|
|
20
|
+
NEXT_DOCUMENT_TIMEOUT = 0.125
|
21
|
+
|
20
22
|
attr_reader :j_cursor, :collection, :selector, :fields,
|
21
23
|
:order, :hint, :snapshot, :timeout,
|
22
24
|
:full_collection_name, :transformer,
|
@@ -25,7 +27,6 @@ module Mongo
|
|
25
27
|
def initialize(collection, options={})
|
26
28
|
@collection = collection
|
27
29
|
@j_collection = collection.j_collection
|
28
|
-
@query_run = false
|
29
30
|
@selector = convert_selector_for_query(options[:selector])
|
30
31
|
@fields = convert_fields_for_query(options[:fields])
|
31
32
|
@admin = options.fetch(:admin, false)
|
@@ -42,8 +43,25 @@ module Mongo
|
|
42
43
|
@explain = options[:explain]
|
43
44
|
@socket = options[:socket]
|
44
45
|
@timeout = options.fetch(:timeout, true)
|
45
|
-
@tailable = options.fetch(:tailable, false)
|
46
46
|
@transformer = options[:transformer]
|
47
|
+
@tailable = options.fetch(:tailable, false)
|
48
|
+
@await_data = @tailable ? options[:await_data] : nil
|
49
|
+
@next_timeout = NEXT_DOCUMENT_TIMEOUT
|
50
|
+
@is_poison_function = nil
|
51
|
+
case @await_data
|
52
|
+
when Hash
|
53
|
+
@poison_doc = @await_data.fetch(:poison_doc, default_poison_doc)
|
54
|
+
@is_poison_function = @await_data[:is_poison_function]
|
55
|
+
@next_timeout = @await_data.fetch(:next_timeout, NEXT_DOCUMENT_TIMEOUT).to_f
|
56
|
+
when Numeric
|
57
|
+
@poison_doc = default_poison_doc
|
58
|
+
@next_timeout = @await_data.to_f
|
59
|
+
when TrueClass
|
60
|
+
@poison_doc = default_poison_doc
|
61
|
+
else
|
62
|
+
@poison_doc = nil
|
63
|
+
end
|
64
|
+
@timeout_thread = TimeoutThread.new(@collection, @poison_doc, @next_timeout) if @tailable && @poison_doc
|
47
65
|
|
48
66
|
@full_collection_name = "#{@collection.db.name}.#{@collection.name}"
|
49
67
|
|
@@ -52,12 +70,13 @@ module Mongo
|
|
52
70
|
|
53
71
|
def rewind!
|
54
72
|
close
|
55
|
-
@query_run = false
|
56
73
|
spawn_cursor
|
57
74
|
end
|
58
75
|
|
59
76
|
def close
|
60
|
-
@
|
77
|
+
if @j_cursor.num_seen == 0 && !@tailable
|
78
|
+
@j_cursor.next rescue nil
|
79
|
+
end
|
61
80
|
@j_cursor.close
|
62
81
|
end
|
63
82
|
|
@@ -74,13 +93,13 @@ module Mongo
|
|
74
93
|
end
|
75
94
|
|
76
95
|
def add_option(opt)
|
77
|
-
|
96
|
+
raise_invalid_op if @j_cursor.num_seen != 0
|
78
97
|
@j_cursor.addOption(opt)
|
79
98
|
options
|
80
99
|
end
|
81
100
|
|
82
101
|
def options
|
83
|
-
@j_cursor.
|
102
|
+
@j_cursor.options
|
84
103
|
end
|
85
104
|
|
86
105
|
def query_opts
|
@@ -90,7 +109,7 @@ module Mongo
|
|
90
109
|
end
|
91
110
|
|
92
111
|
def remove_option(opt)
|
93
|
-
|
112
|
+
raise_invalid_op if @j_cursor.num_seen != 0
|
94
113
|
@j_cursor.setOptions(options & ~opt)
|
95
114
|
options
|
96
115
|
end
|
@@ -100,7 +119,15 @@ module Mongo
|
|
100
119
|
end
|
101
120
|
|
102
121
|
def next_document
|
103
|
-
|
122
|
+
doc = nil
|
123
|
+
trap_raise(Mongo::OperationFailure) do
|
124
|
+
if @tailable
|
125
|
+
doc = __next
|
126
|
+
elsif has_next?
|
127
|
+
doc = __next
|
128
|
+
end
|
129
|
+
end
|
130
|
+
_xform(doc)
|
104
131
|
end
|
105
132
|
alias :next :next_document
|
106
133
|
|
@@ -114,12 +141,15 @@ module Mongo
|
|
114
141
|
private :_xform
|
115
142
|
|
116
143
|
def has_next?
|
117
|
-
@
|
144
|
+
if @tailable
|
145
|
+
true
|
146
|
+
else
|
147
|
+
@j_cursor.has_next?
|
148
|
+
end
|
118
149
|
end
|
119
150
|
|
120
151
|
# iterate directly from the mongo db
|
121
152
|
def each
|
122
|
-
check_modifiable
|
123
153
|
while has_next?
|
124
154
|
yield next_document
|
125
155
|
end
|
@@ -127,7 +157,6 @@ module Mongo
|
|
127
157
|
|
128
158
|
def _batch_size(size=nil)
|
129
159
|
return if size.nil?
|
130
|
-
check_modifiable
|
131
160
|
raise ArgumentError, "batch_size requires an integer" unless size.is_a? Integer
|
132
161
|
@batch_size = size
|
133
162
|
end
|
@@ -140,8 +169,7 @@ module Mongo
|
|
140
169
|
end
|
141
170
|
|
142
171
|
def _limit(number_to_return=nil)
|
143
|
-
return if number_to_return.nil?
|
144
|
-
check_modifiable
|
172
|
+
return if number_to_return.nil? && @limit
|
145
173
|
raise ArgumentError, "limit requires an integer" unless number_to_return.is_a? Integer
|
146
174
|
@limit = number_to_return
|
147
175
|
end
|
@@ -150,14 +178,13 @@ module Mongo
|
|
150
178
|
def limit(number_to_return=nil)
|
151
179
|
_limit(number_to_return)
|
152
180
|
wrap_invalid_op do
|
153
|
-
@j_cursor = @j_cursor.limit(@limit)
|
181
|
+
@j_cursor = @j_cursor.limit(@limit)
|
154
182
|
end
|
155
183
|
self
|
156
184
|
end
|
157
185
|
|
158
186
|
def _skip(number_to_skip=nil)
|
159
|
-
return if number_to_skip.nil?
|
160
|
-
check_modifiable
|
187
|
+
return if number_to_skip.nil? && @skip
|
161
188
|
raise ArgumentError, "skip requires an integer" unless number_to_skip.is_a? Integer
|
162
189
|
@skip = number_to_skip
|
163
190
|
end
|
@@ -166,14 +193,13 @@ module Mongo
|
|
166
193
|
def skip(number_to_skip=nil)
|
167
194
|
_skip(number_to_skip)
|
168
195
|
wrap_invalid_op do
|
169
|
-
@j_cursor = @j_cursor.skip(@skip)
|
196
|
+
@j_cursor = @j_cursor.skip(@skip)
|
170
197
|
end
|
171
198
|
self
|
172
199
|
end
|
173
200
|
|
174
201
|
def _sort(key_or_list=nil, direction=nil)
|
175
|
-
return if key_or_list.nil?
|
176
|
-
check_modifiable
|
202
|
+
return if key_or_list.nil? && @order
|
177
203
|
@order = prep_sort(key_or_list, direction)
|
178
204
|
end
|
179
205
|
private :_sort
|
@@ -181,7 +207,7 @@ module Mongo
|
|
181
207
|
def sort(key_or_list, direction=nil)
|
182
208
|
_sort(key_or_list, direction)
|
183
209
|
wrap_invalid_op do
|
184
|
-
@j_cursor = @j_cursor.sort(@order)
|
210
|
+
@j_cursor = @j_cursor.sort(@order)
|
185
211
|
end
|
186
212
|
self
|
187
213
|
end
|
@@ -191,11 +217,12 @@ module Mongo
|
|
191
217
|
end
|
192
218
|
|
193
219
|
def count(skip_and_limit = false)
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
220
|
+
wrap_invalid_op do
|
221
|
+
if skip_and_limit && @skip && @limit
|
222
|
+
@j_cursor.size
|
223
|
+
else
|
224
|
+
@j_cursor.count
|
225
|
+
end
|
199
226
|
end
|
200
227
|
end
|
201
228
|
|
@@ -225,11 +252,45 @@ module Mongo
|
|
225
252
|
Set.new self.to_a
|
226
253
|
end
|
227
254
|
|
255
|
+
def done_size
|
256
|
+
@j_cursor.num_seen
|
257
|
+
end
|
258
|
+
|
259
|
+
def to_do_size
|
260
|
+
@j_cursor.size - @j_cursor.num_seen
|
261
|
+
end
|
262
|
+
|
228
263
|
private
|
229
264
|
|
265
|
+
def default_poison_doc
|
266
|
+
{ 'jmongo_poison_document' => true }
|
267
|
+
end
|
268
|
+
|
269
|
+
def default_is_poison?(doc)
|
270
|
+
!!doc['jmongo_poison_document']
|
271
|
+
end
|
272
|
+
|
230
273
|
def __next
|
231
|
-
@
|
232
|
-
from_dbobject(@j_cursor.next)
|
274
|
+
@timeout_thread.trigger if @tailable
|
275
|
+
doc = from_dbobject(@j_cursor.next)
|
276
|
+
if @tailable
|
277
|
+
if poisoned?(doc)
|
278
|
+
nil
|
279
|
+
else
|
280
|
+
@timeout_thread.cancel
|
281
|
+
doc
|
282
|
+
end
|
283
|
+
else
|
284
|
+
doc
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
def poisoned?(doc)
|
289
|
+
if @is_poison_function
|
290
|
+
@is_poison_function.call(doc)
|
291
|
+
else
|
292
|
+
default_is_poison?(doc)
|
293
|
+
end
|
233
294
|
end
|
234
295
|
|
235
296
|
# Convert the +:fields+ parameter from a single field name or an array
|
@@ -260,19 +321,26 @@ module Mongo
|
|
260
321
|
@j_cursor = @j_cursor.sort(@order) if @order
|
261
322
|
@j_cursor = @j_cursor.skip(@skip) if @skip && @skip > 0
|
262
323
|
@j_cursor = @j_cursor.limit(@limit) if @limit && @limit > 0
|
324
|
+
@j_cursor = @j_cursor.hint(@hint) if @hint
|
325
|
+
@j_cursor = @j_cursor.snapshot if @snapshot
|
263
326
|
@j_cursor = @j_cursor.batchSize(@batch_size) if @batch_size && @batch_size > 0
|
264
|
-
|
265
|
-
|
266
|
-
|
327
|
+
opts_bf = @j_cursor.options
|
328
|
+
opts_bf = mask_option(opts_bf, JMongo::Bytes::QUERYOPTION_NOTIMEOUT, !@timeout)
|
329
|
+
opts_bf = mask_option(opts_bf, JMongo::Bytes::QUERYOPTION_TAILABLE, !!@tailable)
|
330
|
+
opts_bf = mask_option(opts_bf, JMongo::Bytes::QUERYOPTION_AWAITDATA, !!@await_data)
|
331
|
+
@j_cursor.options = opts_bf
|
267
332
|
end
|
268
333
|
|
269
334
|
self
|
270
335
|
end
|
271
336
|
|
272
|
-
def
|
273
|
-
if
|
274
|
-
|
337
|
+
def mask_option(bitfield, bit, set = true)
|
338
|
+
if set
|
339
|
+
bitfield |= bit
|
340
|
+
else
|
341
|
+
bitfield &= ~bit
|
275
342
|
end
|
343
|
+
bitfield
|
276
344
|
end
|
277
345
|
|
278
346
|
def wrap_invalid_op
|
data/lib/jmongo/mongo/utils.rb
CHANGED
@@ -1,6 +1,48 @@
|
|
1
1
|
# Copyright (C) 2010 Guy Boertje
|
2
2
|
|
3
3
|
module Mongo
|
4
|
+
|
5
|
+
class TimeoutThread
|
6
|
+
attr_reader :thread, :timeout
|
7
|
+
def initialize(collection, doc, timeout)
|
8
|
+
@collection = collection
|
9
|
+
@doc = doc
|
10
|
+
@timeout = timeout
|
11
|
+
@queue = SizedQueue.new(1)
|
12
|
+
spawn_thread
|
13
|
+
end
|
14
|
+
|
15
|
+
def trigger
|
16
|
+
@queue.push(true) if @queue.length == 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def cancel
|
20
|
+
return if @thread[:cancel]
|
21
|
+
@thread[:cancel] = true
|
22
|
+
end
|
23
|
+
|
24
|
+
def stop
|
25
|
+
@queue.push false
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def spawn_thread
|
31
|
+
@thread = Thread.new do
|
32
|
+
while true
|
33
|
+
going = @queue.pop
|
34
|
+
break if !going
|
35
|
+
sleep @timeout
|
36
|
+
unless Thread.current[:cancel]
|
37
|
+
@collection.insert(@doc)
|
38
|
+
end
|
39
|
+
Thread.current[:cancel] = false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
@thread[:cancel] = false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
4
46
|
module JavaImpl
|
5
47
|
|
6
48
|
module NoImplYetClass
|
@@ -10,6 +52,7 @@ module Mongo
|
|
10
52
|
end
|
11
53
|
|
12
54
|
module Utils
|
55
|
+
|
13
56
|
def raise_not_implemented
|
14
57
|
raise NoMethodError, "This method hasn't been implemented yet."
|
15
58
|
end
|
data/lib/jmongo/version.rb
CHANGED
data/test/collection_test.rb
CHANGED
@@ -878,41 +878,61 @@ describe "Collection" do
|
|
878
878
|
end
|
879
879
|
end
|
880
880
|
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
881
|
+
describe "Capped collections" do
|
882
|
+
before do
|
883
|
+
Cfg.db.drop_collection('log')
|
884
|
+
@capped = Cfg.db.create_collection('log', :capped => true, :max => 1000, :size => 400000)
|
885
|
+
|
886
|
+
1000.times { |n| @capped.insert({:n => n}) }
|
887
|
+
end
|
888
|
+
|
889
|
+
it "should find using a standard cursor" do
|
890
|
+
cursor = @capped.find
|
891
|
+
1000.times do
|
892
|
+
assert cursor.next_document
|
893
|
+
end
|
894
|
+
assert_nil cursor.next_document
|
895
|
+
@capped.insert({:n => 100})
|
896
|
+
assert_nil cursor.next_document
|
897
|
+
end
|
898
|
+
|
899
|
+
it "should fail tailable cursor on a non-capped collection" do
|
900
|
+
col = Cfg.db['regular-collection']
|
901
|
+
col.insert({:a => 1000})
|
902
|
+
tail = Mongo::Cursor.new(col, :tailable => true, :order => [['$natural', 1]])
|
903
|
+
assert_raises Mongo::OperationFailure do
|
904
|
+
tail.next_document
|
905
|
+
end
|
906
|
+
end
|
907
|
+
|
908
|
+
it "should find using a tailable cursor" do
|
909
|
+
tail = Mongo::Cursor.new(@capped, :timeout => false, :tailable => true, :await_data => true, :order => [['$natural', 1]])
|
910
|
+
1000.times do
|
911
|
+
assert tail.next_document
|
912
|
+
end
|
913
|
+
assert true, tail.has_next?
|
914
|
+
assert_nil tail.next_document
|
915
|
+
end
|
916
|
+
|
917
|
+
it "should find using a tailable cursor with await_data set to a float" do
|
918
|
+
tail = Mongo::Cursor.new(@capped, :timeout => false, :tailable => true, :await_data => 3.0, :order => [['$natural', 1]])
|
919
|
+
1000.times do
|
920
|
+
assert tail.next_document
|
921
|
+
end
|
922
|
+
assert true, tail.has_next?
|
923
|
+
assert_nil tail.next_document
|
924
|
+
end
|
925
|
+
|
926
|
+
it "should find using a tailable cursor with await_data set to hash" do
|
927
|
+
await = {:poison_doc => {'pppppoisoned' => 42},
|
928
|
+
:is_poison_function => lambda { |doc| doc['pppppoisoned'] == 42 },
|
929
|
+
:next_timeout => 2.0}
|
930
|
+
tail = Mongo::Cursor.new(@capped, :timeout => false, :tailable => true, :await_data => await, :order => [['$natural', 1]])
|
931
|
+
1000.times do
|
932
|
+
assert tail.next_document
|
933
|
+
end
|
934
|
+
assert true, tail.has_next?
|
935
|
+
assert_nil tail.next_document
|
936
|
+
end
|
937
|
+
end
|
918
938
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jmongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2011-10-
|
14
|
+
date: 2011-10-18 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: require_all
|
18
|
-
requirement: &
|
18
|
+
requirement: &10865120 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
@@ -23,10 +23,10 @@ dependencies:
|
|
23
23
|
version: '1.2'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *10865120
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: awesome_print
|
29
|
-
requirement: &
|
29
|
+
requirement: &10864640 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
@@ -34,10 +34,10 @@ dependencies:
|
|
34
34
|
version: '0.4'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *10864640
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: fuubar
|
40
|
-
requirement: &
|
40
|
+
requirement: &10864180 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
@@ -45,10 +45,10 @@ dependencies:
|
|
45
45
|
version: '0.0'
|
46
46
|
type: :development
|
47
47
|
prerelease: false
|
48
|
-
version_requirements: *
|
48
|
+
version_requirements: *10864180
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: rspec
|
51
|
-
requirement: &
|
51
|
+
requirement: &10863300 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
53
53
|
requirements:
|
54
54
|
- - ~>
|
@@ -56,7 +56,7 @@ dependencies:
|
|
56
56
|
version: '2.6'
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
|
-
version_requirements: *
|
59
|
+
version_requirements: *10863300
|
60
60
|
description: Thin jruby wrapper around Mongo Java Driver
|
61
61
|
email:
|
62
62
|
- cremes@mac.com
|
@@ -183,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
183
|
version: '0'
|
184
184
|
requirements: []
|
185
185
|
rubyforge_project:
|
186
|
-
rubygems_version: 1.8.
|
186
|
+
rubygems_version: 1.8.10
|
187
187
|
signing_key:
|
188
188
|
specification_version: 3
|
189
189
|
summary: Thin ruby wrapper around Mongo Java Driver; for JRuby only
|