mongo 0.18.3 → 0.19
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 +41 -50
- data/Rakefile +14 -4
- data/examples/gridfs.rb +25 -70
- data/lib/mongo.rb +4 -2
- data/lib/mongo/collection.rb +70 -89
- data/lib/mongo/connection.rb +203 -43
- data/lib/mongo/cursor.rb +7 -7
- data/lib/mongo/db.rb +61 -18
- data/lib/mongo/exceptions.rb +7 -1
- data/lib/mongo/gridfs.rb +8 -1
- data/lib/mongo/gridfs/chunk.rb +2 -1
- data/lib/mongo/gridfs/grid.rb +90 -0
- data/lib/mongo/gridfs/grid_file_system.rb +113 -0
- data/lib/mongo/gridfs/grid_io.rb +339 -0
- data/lib/mongo/gridfs/grid_store.rb +43 -18
- data/lib/mongo/types/binary.rb +5 -1
- data/lib/mongo/types/code.rb +1 -1
- data/lib/mongo/types/dbref.rb +3 -1
- data/lib/mongo/types/min_max_keys.rb +1 -1
- data/lib/mongo/types/objectid.rb +16 -55
- data/lib/mongo/types/regexp_of_holding.rb +1 -1
- data/lib/mongo/util/bson_c.rb +2 -2
- data/lib/mongo/util/bson_ruby.rb +22 -11
- data/lib/mongo/util/byte_buffer.rb +1 -1
- data/lib/mongo/util/conversions.rb +1 -1
- data/lib/mongo/util/ordered_hash.rb +6 -1
- data/lib/mongo/util/server_version.rb +1 -1
- data/lib/mongo/util/support.rb +1 -1
- data/mongo-ruby-driver.gemspec +1 -1
- data/test/auxillary/authentication_test.rb +68 -0
- data/test/auxillary/autoreconnect_test.rb +41 -0
- data/test/binary_test.rb +15 -0
- data/test/{test_bson.rb → bson_test.rb} +63 -6
- data/test/{test_byte_buffer.rb → byte_buffer_test.rb} +0 -0
- data/test/{test_chunk.rb → chunk_test.rb} +0 -0
- data/test/{test_collection.rb → collection_test.rb} +35 -39
- data/test/{test_connection.rb → connection_test.rb} +33 -3
- data/test/{test_conversions.rb → conversions_test.rb} +0 -0
- data/test/{test_cursor.rb → cursor_test.rb} +0 -7
- data/test/{test_db_api.rb → db_api_test.rb} +3 -6
- data/test/{test_db_connection.rb → db_connection_test.rb} +0 -0
- data/test/{test_db.rb → db_test.rb} +33 -15
- data/test/grid_file_system_test.rb +210 -0
- data/test/grid_io_test.rb +78 -0
- data/test/{test_grid_store.rb → grid_store_test.rb} +33 -2
- data/test/grid_test.rb +87 -0
- data/test/{test_objectid.rb → objectid_test.rb} +2 -33
- data/test/{test_ordered_hash.rb → ordered_hash_test.rb} +4 -0
- data/test/{test_slave_connection.rb → slave_connection_test.rb} +0 -0
- data/test/test_helper.rb +2 -2
- data/test/{test_threading.rb → threading_test.rb} +0 -0
- data/test/unit/collection_test.rb +12 -3
- data/test/unit/connection_test.rb +85 -24
- data/test/unit/cursor_test.rb +1 -2
- data/test/unit/db_test.rb +70 -69
- metadata +27 -23
- data/bin/objectid_benchmark.rb +0 -23
- data/bin/perf.rb +0 -30
- data/lib/mongo/admin.rb +0 -95
- data/lib/mongo/util/xml_to_ruby.rb +0 -112
- data/test/test_admin.rb +0 -67
- data/test/test_round_trip.rb +0 -114
data/bin/objectid_benchmark.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'mongo'
|
3
|
-
require 'benchmark'
|
4
|
-
|
5
|
-
TRIALS = 500000
|
6
|
-
|
7
|
-
include Mongo
|
8
|
-
|
9
|
-
Benchmark.bm do |x|
|
10
|
-
|
11
|
-
x.report('original') do
|
12
|
-
TRIALS.times do
|
13
|
-
ObjectID.new(nil, true)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
x.report('new') do
|
18
|
-
TRIALS.times do
|
19
|
-
ObjectID.new(nil, false)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
data/bin/perf.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'rubygems'
|
3
|
-
require 'mongo'
|
4
|
-
require 'benchmark'
|
5
|
-
require 'socket'
|
6
|
-
require 'digest/md5'
|
7
|
-
require 'thread'
|
8
|
-
|
9
|
-
include Mongo
|
10
|
-
|
11
|
-
c = Mongo::Connection.new('localhost', 27017, :pool_size => 10)
|
12
|
-
coll = c['perf']['docs']
|
13
|
-
coll.remove
|
14
|
-
|
15
|
-
doc = {'name' => 'kyle',
|
16
|
-
'languages' => ['ruby', 'javascript', 'c'],
|
17
|
-
'date' => Time.now}
|
18
|
-
|
19
|
-
TRIES = 5000
|
20
|
-
@threads = []
|
21
|
-
100.times do |n|
|
22
|
-
@threads << Thread.new do
|
23
|
-
50.times do |n|
|
24
|
-
doc['n'] = n*n
|
25
|
-
coll.insert(doc)
|
26
|
-
doc.delete(:_id)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
@threads.join
|
data/lib/mongo/admin.rb
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
# --
|
2
|
-
# Copyright (C) 2008-2009 10gen Inc.
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
# ++
|
16
|
-
|
17
|
-
module Mongo
|
18
|
-
|
19
|
-
# @deprecated this class is deprecated. Methods defined here will
|
20
|
-
# henceforth be available in Mongo::DB.
|
21
|
-
class Admin
|
22
|
-
|
23
|
-
def initialize(db)
|
24
|
-
warn "The Admin class has been DEPRECATED. All admin methods now exist in DB."
|
25
|
-
@db = db
|
26
|
-
end
|
27
|
-
|
28
|
-
# Return the current database profiling level.
|
29
|
-
#
|
30
|
-
# @return [Symbol] :off, :slow_only, or :all
|
31
|
-
#
|
32
|
-
# @deprecated please use DB#profiling_level instead.
|
33
|
-
def profiling_level
|
34
|
-
warn "Admin#profiling_level has been DEPRECATED. Please use DB#profiling_level instead."
|
35
|
-
oh = OrderedHash.new
|
36
|
-
oh[:profile] = -1
|
37
|
-
doc = @db.command(oh)
|
38
|
-
raise "Error with profile command: #{doc.inspect}" unless @db.ok?(doc) && doc['was'].kind_of?(Numeric)
|
39
|
-
case doc['was'].to_i
|
40
|
-
when 0
|
41
|
-
:off
|
42
|
-
when 1
|
43
|
-
:slow_only
|
44
|
-
when 2
|
45
|
-
:all
|
46
|
-
else
|
47
|
-
raise "Error: illegal profiling level value #{doc['was']}"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# Set database profiling level to :off, :slow_only, or :all.
|
52
|
-
#
|
53
|
-
# @deprecated please use DB#profiling_level= instead.
|
54
|
-
def profiling_level=(level)
|
55
|
-
warn "Admin#profiling_level= has been DEPRECATED. Please use DB#profiling_level= instead."
|
56
|
-
oh = OrderedHash.new
|
57
|
-
oh[:profile] = case level
|
58
|
-
when :off
|
59
|
-
0
|
60
|
-
when :slow_only
|
61
|
-
1
|
62
|
-
when :all
|
63
|
-
2
|
64
|
-
else
|
65
|
-
raise "Error: illegal profiling level value #{level}"
|
66
|
-
end
|
67
|
-
doc = @db.command(oh)
|
68
|
-
raise "Error with profile command: #{doc.inspect}" unless @db.ok?(doc)
|
69
|
-
end
|
70
|
-
|
71
|
-
# Returns an array containing current profiling information.
|
72
|
-
#
|
73
|
-
# @deprecated please use DB#profiling_info instead.
|
74
|
-
def profiling_info
|
75
|
-
warn "Admin#profiling_info has been DEPRECATED. Please use DB#profiling_info instead."
|
76
|
-
Cursor.new(Collection.new(@db, DB::SYSTEM_PROFILE_COLLECTION), :selector => {}).to_a
|
77
|
-
end
|
78
|
-
|
79
|
-
# Validate a named collection by raising an exception if there is a
|
80
|
-
# problem or returning an interesting hash (see especially the
|
81
|
-
# 'result' string value) if all is well.
|
82
|
-
#
|
83
|
-
# @deprecated please use DB#validate_collection instead.
|
84
|
-
def validate_collection(name)
|
85
|
-
warn "Admin#validate_collection has been DEPRECATED. Please use DB#validate_collection instead."
|
86
|
-
doc = @db.command(:validate => name)
|
87
|
-
raise "Error with validate command: #{doc.inspect}" unless @db.ok?(doc)
|
88
|
-
result = doc['result']
|
89
|
-
raise "Error with validation data: #{doc.inspect}" unless result.kind_of?(String)
|
90
|
-
raise "Error: invalid collection #{name}: #{doc.inspect}" if result =~ /\b(exception|corrupt)\b/i
|
91
|
-
doc
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
# --
|
2
|
-
# Copyright (C) 2008-2009 10gen Inc.
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
# ++
|
16
|
-
|
17
|
-
require 'rexml/document'
|
18
|
-
require 'mongo'
|
19
|
-
|
20
|
-
# @deprecated
|
21
|
-
# Converts a .xson file (an XML file that describes a Mongo-type document) to
|
22
|
-
# an OrderedHash.
|
23
|
-
class XMLToRuby
|
24
|
-
|
25
|
-
include Mongo
|
26
|
-
|
27
|
-
def xml_to_ruby(io)
|
28
|
-
warn "XMLToRuby is deprecated. The .xson format is not longer in use."
|
29
|
-
doc = REXML::Document.new(io)
|
30
|
-
doc_to_ruby(doc.root.elements['doc'])
|
31
|
-
end
|
32
|
-
|
33
|
-
protected
|
34
|
-
|
35
|
-
def element_to_ruby(e)
|
36
|
-
warn "XMLToRuby is deprecated. The .xson format is not longer in use."
|
37
|
-
type = e.name
|
38
|
-
child = e.elements[1]
|
39
|
-
case type
|
40
|
-
when 'oid'
|
41
|
-
ObjectID.from_string(e.text)
|
42
|
-
when 'ref'
|
43
|
-
dbref_to_ruby(e.elements)
|
44
|
-
when 'int'
|
45
|
-
e.text.to_i
|
46
|
-
when 'number'
|
47
|
-
e.text.to_f
|
48
|
-
when 'string'
|
49
|
-
e.text.to_s
|
50
|
-
when 'code'
|
51
|
-
Code.new(e.text.to_s)
|
52
|
-
when 'binary'
|
53
|
-
bin = Binary.new
|
54
|
-
decoded = Base64.decode64(e.text.to_s)
|
55
|
-
decoded.each_byte { |b| bin.put(b) }
|
56
|
-
bin
|
57
|
-
when 'symbol'
|
58
|
-
e.text.to_s.intern
|
59
|
-
when 'boolean'
|
60
|
-
e.text.to_s == 'true'
|
61
|
-
when 'array'
|
62
|
-
array_to_ruby(e.elements)
|
63
|
-
when 'date'
|
64
|
-
Time.at(e.text.to_f / 1000.0)
|
65
|
-
when 'regex'
|
66
|
-
regex_to_ruby(e.elements)
|
67
|
-
when 'null'
|
68
|
-
nil
|
69
|
-
when 'doc'
|
70
|
-
doc_to_ruby(e)
|
71
|
-
else
|
72
|
-
raise "Unknown type #{type} in element with name #{e.attributes['name']}"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def doc_to_ruby(element)
|
77
|
-
warn "XMLToRuby is deprecated. The .xson format is not longer in use."
|
78
|
-
oh = OrderedHash.new
|
79
|
-
element.elements.each { |e| oh[e.attributes['name']] = element_to_ruby(e) }
|
80
|
-
oh
|
81
|
-
end
|
82
|
-
|
83
|
-
def array_to_ruby(elements)
|
84
|
-
warn "XMLToRuby is deprecated. The .xson format is not longer in use."
|
85
|
-
a = []
|
86
|
-
elements.each { |e|
|
87
|
-
index_str = e.attributes['name']
|
88
|
-
a[index_str.to_i] = element_to_ruby(e)
|
89
|
-
}
|
90
|
-
a
|
91
|
-
end
|
92
|
-
|
93
|
-
def regex_to_ruby(elements)
|
94
|
-
warn "XMLToRuby is deprecated. The .xson format is not longer in use."
|
95
|
-
pattern = elements['pattern'].text
|
96
|
-
options_str = elements['options'].text || ''
|
97
|
-
|
98
|
-
options = 0
|
99
|
-
options |= Regexp::IGNORECASE if options_str.include?('i')
|
100
|
-
options |= Regexp::MULTILINE if options_str.include?('m')
|
101
|
-
options |= Regexp::EXTENDED if options_str.include?('x')
|
102
|
-
Regexp.new(pattern, options)
|
103
|
-
end
|
104
|
-
|
105
|
-
def dbref_to_ruby(elements)
|
106
|
-
warn "XMLToRuby is deprecated. The .xson format is not longer in use."
|
107
|
-
ns = elements['ns'].text
|
108
|
-
oid_str = elements['oid'].text
|
109
|
-
DBRef.new(ns, ObjectID.from_string(oid_str))
|
110
|
-
end
|
111
|
-
|
112
|
-
end
|
data/test/test_admin.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'test/test_helper'
|
2
|
-
|
3
|
-
# NOTE: assumes Mongo is running
|
4
|
-
class AdminTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
include Mongo
|
7
|
-
|
8
|
-
@@db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
|
9
|
-
ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db('ruby-mongo-test')
|
10
|
-
@@coll = @@db.collection('test')
|
11
|
-
|
12
|
-
def setup
|
13
|
-
# Insert some data to make sure the database itself exists.
|
14
|
-
@@coll.remove
|
15
|
-
@r1 = @@coll.insert('a' => 1) # collection not created until it's used
|
16
|
-
@@coll_full_name = 'ruby-mongo-test.test'
|
17
|
-
@admin = @@db.admin
|
18
|
-
end
|
19
|
-
|
20
|
-
def teardown
|
21
|
-
@admin.profiling_level = :off
|
22
|
-
@@coll.remove if @@coll
|
23
|
-
@@db.error
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_default_profiling_level
|
27
|
-
assert_equal :off, @admin.profiling_level
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_change_profiling_level
|
31
|
-
@admin.profiling_level = :slow_only
|
32
|
-
assert_equal :slow_only, @admin.profiling_level
|
33
|
-
@admin.profiling_level = :off
|
34
|
-
assert_equal :off, @admin.profiling_level
|
35
|
-
@admin.profiling_level = :all
|
36
|
-
assert_equal :all, @admin.profiling_level
|
37
|
-
begin
|
38
|
-
@admin.profiling_level = :medium
|
39
|
-
fail "shouldn't be able to do this"
|
40
|
-
rescue
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_profiling_info
|
45
|
-
# Perform at least one query while profiling so we have something to see.
|
46
|
-
@admin.profiling_level = :all
|
47
|
-
@@coll.find()
|
48
|
-
@admin.profiling_level = :off
|
49
|
-
|
50
|
-
info = @admin.profiling_info
|
51
|
-
assert_kind_of Array, info
|
52
|
-
assert info.length >= 1
|
53
|
-
first = info.first
|
54
|
-
assert_kind_of String, first['info']
|
55
|
-
assert_kind_of Time, first['ts']
|
56
|
-
assert_kind_of Numeric, first['millis']
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_validate_collection
|
60
|
-
doc = @admin.validate_collection(@@coll.name)
|
61
|
-
assert_not_nil doc
|
62
|
-
result = doc['result']
|
63
|
-
assert_not_nil result
|
64
|
-
assert_match /firstExtent/, result
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
data/test/test_round_trip.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
HERE = File.dirname(__FILE__)
|
2
|
-
$LOAD_PATH[0,0] = File.join(HERE, '..', 'lib')
|
3
|
-
require 'test/test_helper'
|
4
|
-
require 'mongo/util/xml_to_ruby'
|
5
|
-
|
6
|
-
# For each xml/bson file in the data subdirectory, we turn the XML into an
|
7
|
-
# OrderedHash and then test both Ruby-to-BSON and BSON-to-Ruby translations.
|
8
|
-
#
|
9
|
-
# There is a whole other project that includes similar tests
|
10
|
-
# (http://github.com/mongodb/mongo-qa). If the directory ../../mongo-qa
|
11
|
-
# exists, (that is, the top-level dir of mongo-qa is next to the top-level dir
|
12
|
-
# of this project), then we find the BSON test files there and use those, too.
|
13
|
-
class RoundTripTest < Test::Unit::TestCase
|
14
|
-
|
15
|
-
include Mongo
|
16
|
-
|
17
|
-
@@ruby = nil
|
18
|
-
|
19
|
-
def setup
|
20
|
-
unless @@ruby
|
21
|
-
names = Dir[File.join(HERE, 'data', '*.xml')].collect {|f| File.basename(f).sub(/\.xml$/, '') }
|
22
|
-
@@ruby = {}
|
23
|
-
names.each { |name|
|
24
|
-
File.open(File.join(HERE, 'data', "#{name}.xml")) { |f|
|
25
|
-
@@ruby[name] = XMLToRuby.new.xml_to_ruby(f)
|
26
|
-
}
|
27
|
-
}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_dummy
|
32
|
-
assert true
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.create_test_for_round_trip_files_in_dir(dir)
|
36
|
-
names = Dir[File.join(dir, '*.xson')].collect {|f| File.basename(f).sub(/\.xson$/, '') }
|
37
|
-
names.each { |name|
|
38
|
-
eval <<EOS
|
39
|
-
def test_#{name}_#{dir.gsub(/[^a-zA-Z0-9_]/, '_')}
|
40
|
-
one_round_trip("#{dir}", "#{name}")
|
41
|
-
end
|
42
|
-
EOS
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
# Dynamically generate one test for each test file. This way, if one test
|
47
|
-
# fails the others will still run.
|
48
|
-
create_test_for_round_trip_files_in_dir(File.join(HERE, 'data'))
|
49
|
-
mongo_qa_dir = File.join(HERE, '../..', 'mongo-qa/modules/bson_tests/tests')
|
50
|
-
if File.exist?(mongo_qa_dir)
|
51
|
-
%w(basic_types complex single_types).each { |subdir_name|
|
52
|
-
create_test_for_round_trip_files_in_dir(File.join(mongo_qa_dir, subdir_name))
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
56
|
-
# Round-trip comparisons of Ruby-to-BSON and back.
|
57
|
-
# * Take the objects that were read from XML
|
58
|
-
# * Turn them into BSON bytes
|
59
|
-
# * Compare that with the BSON files we have
|
60
|
-
# * Turn those BSON bytes back in to Ruby objects
|
61
|
-
# * Turn them back into BSON bytes
|
62
|
-
# * Compare that with the BSON files we have (or the bytes that were already
|
63
|
-
# generated)
|
64
|
-
def one_round_trip(dir, name)
|
65
|
-
obj = File.open(File.join(dir, "#{name}.xson")) { |f|
|
66
|
-
begin
|
67
|
-
XMLToRuby.new.xml_to_ruby(f)
|
68
|
-
rescue => ex # unsupported type
|
69
|
-
return
|
70
|
-
end
|
71
|
-
}
|
72
|
-
|
73
|
-
File.open(File.join(dir, "#{name}.bson"), 'rb') { |f|
|
74
|
-
# Read the BSON from the file
|
75
|
-
bson = f.read
|
76
|
-
|
77
|
-
# Turn the Ruby object into BSON bytes and compare with the BSON bytes
|
78
|
-
# from the file.
|
79
|
-
bson_from_ruby = BSON.serialize(obj)
|
80
|
-
|
81
|
-
begin
|
82
|
-
assert_equal bson.length, bson_from_ruby.to_s.length
|
83
|
-
assert_equal bson, bson_from_ruby.to_s
|
84
|
-
rescue => ex
|
85
|
-
# File.open(File.join(dir, "#{name}_out_a.bson"), 'wb') { |f| # DEBUG
|
86
|
-
# bson_from_ruby.each { |b| f.putc(b) }
|
87
|
-
# }
|
88
|
-
raise ex
|
89
|
-
end
|
90
|
-
|
91
|
-
# Turn those BSON bytes back into a Ruby object.
|
92
|
-
#
|
93
|
-
# We're passing a nil db to the contructor here, but that's OK because
|
94
|
-
# the BSON DBRef bytes don't contain the db object in any case, and we
|
95
|
-
# don't care what the database is.
|
96
|
-
obj_from_bson = BSON.deserialize(bson_from_ruby)
|
97
|
-
assert_kind_of OrderedHash, obj_from_bson
|
98
|
-
|
99
|
-
# Turn that Ruby object into BSON and compare it to the original BSON
|
100
|
-
# bytes.
|
101
|
-
bson_from_ruby = BSON.serialize(obj_from_bson)
|
102
|
-
begin
|
103
|
-
assert_equal bson.length, bson_from_ruby.to_s.length
|
104
|
-
assert_equal bson, bson_from_ruby.to_s
|
105
|
-
rescue => ex
|
106
|
-
# File.open(File.join(dir, "#{name}_out_b.bson"), 'wb') { |f| # DEBUG
|
107
|
-
# bson_from_ruby.each { |b| f.putc(b) }
|
108
|
-
# }
|
109
|
-
raise ex
|
110
|
-
end
|
111
|
-
}
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|