mongo 2.0.6 → 2.1.0.beta

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.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +2 -0
  5. data/lib/mongo/bulk_write.rb +1 -0
  6. data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
  7. data/lib/mongo/bulk_write/deletable.rb +8 -7
  8. data/lib/mongo/bulk_write/insertable.rb +4 -3
  9. data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
  10. data/lib/mongo/bulk_write/replacable.rb +4 -3
  11. data/lib/mongo/bulk_write/result.rb +138 -0
  12. data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
  13. data/lib/mongo/bulk_write/updatable.rb +8 -7
  14. data/lib/mongo/client.rb +36 -4
  15. data/lib/mongo/cluster.rb +39 -4
  16. data/lib/mongo/cluster/topology/replica_set.rb +20 -4
  17. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  18. data/lib/mongo/collection.rb +282 -29
  19. data/lib/mongo/collection/view/aggregation.rb +32 -4
  20. data/lib/mongo/collection/view/iterable.rb +2 -1
  21. data/lib/mongo/collection/view/map_reduce.rb +3 -1
  22. data/lib/mongo/collection/view/readable.rb +89 -14
  23. data/lib/mongo/collection/view/writable.rb +11 -5
  24. data/lib/mongo/cursor.rb +11 -3
  25. data/lib/mongo/dbref.rb +113 -0
  26. data/lib/mongo/error.rb +6 -2
  27. data/lib/mongo/error/parser.rb +1 -1
  28. data/lib/mongo/event/description_changed.rb +1 -1
  29. data/lib/mongo/grid/file.rb +1 -1
  30. data/lib/mongo/grid/fs.rb +2 -5
  31. data/lib/mongo/monitoring.rb +199 -0
  32. data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
  33. data/lib/mongo/monitoring/event.rb +17 -0
  34. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  35. data/lib/mongo/monitoring/event/command_started.rb +88 -0
  36. data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
  37. data/lib/mongo/monitoring/publishable.rb +96 -0
  38. data/lib/mongo/operation.rb +1 -0
  39. data/lib/mongo/operation/executable.rb +1 -1
  40. data/lib/mongo/operation/parallel_scan.rb +76 -0
  41. data/lib/mongo/operation/parallel_scan/result.rb +72 -0
  42. data/lib/mongo/operation/specifiable.rb +18 -0
  43. data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
  44. data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
  45. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
  46. data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
  47. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
  48. data/lib/mongo/protocol/delete.rb +8 -13
  49. data/lib/mongo/protocol/get_more.rb +13 -13
  50. data/lib/mongo/protocol/insert.rb +8 -13
  51. data/lib/mongo/protocol/kill_cursors.rb +7 -11
  52. data/lib/mongo/protocol/query.rb +58 -20
  53. data/lib/mongo/protocol/reply.rb +12 -0
  54. data/lib/mongo/protocol/update.rb +13 -14
  55. data/lib/mongo/server.rb +23 -2
  56. data/lib/mongo/server/connectable.rb +0 -22
  57. data/lib/mongo/server/connection.rb +29 -0
  58. data/lib/mongo/server/description.rb +23 -1
  59. data/lib/mongo/server/monitor.rb +17 -1
  60. data/lib/mongo/server/monitor/connection.rb +24 -0
  61. data/lib/mongo/socket/ssl.rb +28 -16
  62. data/lib/mongo/socket/tcp.rb +1 -1
  63. data/lib/mongo/socket/unix.rb +1 -1
  64. data/lib/mongo/uri.rb +12 -5
  65. data/lib/mongo/version.rb +1 -1
  66. data/spec/mongo/auth/cr_spec.rb +9 -1
  67. data/spec/mongo/auth/ldap_spec.rb +9 -1
  68. data/spec/mongo/auth/scram_spec.rb +9 -1
  69. data/spec/mongo/auth/x509_spec.rb +9 -1
  70. data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
  71. data/spec/mongo/client_spec.rb +42 -0
  72. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
  73. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  74. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  75. data/spec/mongo/cluster_spec.rb +55 -10
  76. data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
  77. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  78. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  79. data/spec/mongo/collection/view/readable_spec.rb +251 -6
  80. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  81. data/spec/mongo/collection/view_spec.rb +233 -71
  82. data/spec/mongo/collection_spec.rb +905 -9
  83. data/spec/mongo/crud_spec.rb +2 -2
  84. data/spec/mongo/cursor_spec.rb +3 -3
  85. data/spec/mongo/dbref_spec.rb +149 -0
  86. data/spec/mongo/monitoring_spec.rb +168 -0
  87. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  88. data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
  89. data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
  90. data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
  91. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  92. data/spec/mongo/operation/write/insert_spec.rb +2 -2
  93. data/spec/mongo/operation/write/update_spec.rb +1 -1
  94. data/spec/mongo/protocol/query_spec.rb +0 -29
  95. data/spec/mongo/server/connection_pool_spec.rb +18 -6
  96. data/spec/mongo/server/connection_spec.rb +12 -4
  97. data/spec/mongo/server/description_spec.rb +7 -3
  98. data/spec/mongo/server/monitor_spec.rb +30 -0
  99. data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
  100. data/spec/mongo/server_selection_spec.rb +14 -6
  101. data/spec/mongo/server_spec.rb +27 -8
  102. data/spec/mongo/socket/ssl_spec.rb +94 -8
  103. data/spec/mongo/uri_spec.rb +25 -9
  104. data/spec/spec_helper.rb +29 -20
  105. data/spec/support/authorization.rb +19 -4
  106. data/spec/support/certificates/client.pem +4 -4
  107. data/spec/support/crud/read.rb +9 -10
  108. data/spec/support/crud/write.rb +24 -20
  109. data/spec/support/sdam/rs/equal_electionids.yml +45 -0
  110. data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
  111. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  112. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  113. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  114. data/spec/support/server_discovery_and_monitoring.rb +19 -2
  115. data/spec/support/shared/bulk_write.rb +26 -22
  116. data/spec/support/shared/server_selector.rb +2 -1
  117. metadata +31 -7
  118. metadata.gz.sig +0 -0
  119. data/lib/mongo/error/invalid_uri_option.rb +0 -38
@@ -13,11 +13,11 @@ describe 'CRUD' do
13
13
  context(test.description) do
14
14
 
15
15
  before(:each) do
16
- authorized_collection.find.delete_many
16
+ authorized_collection.delete_many
17
17
  end
18
18
 
19
19
  after(:each) do
20
- authorized_collection.find.delete_many
20
+ authorized_collection.delete_many
21
21
  end
22
22
 
23
23
  let(:results) do
@@ -33,7 +33,7 @@ describe Mongo::Cursor do
33
33
  end
34
34
 
35
35
  after do
36
- authorized_collection.find.delete_many
36
+ authorized_collection.delete_many
37
37
  end
38
38
 
39
39
  it 'returns the correct amount' do
@@ -58,7 +58,7 @@ describe Mongo::Cursor do
58
58
  end
59
59
 
60
60
  after do
61
- authorized_collection.find.delete_many
61
+ authorized_collection.delete_many
62
62
  end
63
63
 
64
64
  it 'returns the correct amount' do
@@ -84,7 +84,7 @@ describe Mongo::Cursor do
84
84
  end
85
85
 
86
86
  after do
87
- authorized_collection.find.delete_many
87
+ authorized_collection.delete_many
88
88
  end
89
89
 
90
90
  context 'when a limit is provided' do
@@ -0,0 +1,149 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ describe Mongo::DBRef do
5
+
6
+ let(:object_id) do
7
+ BSON::ObjectId.new
8
+ end
9
+
10
+ describe '#as_json' do
11
+
12
+ context 'when the database is not provided' do
13
+
14
+ let(:dbref) do
15
+ described_class.new('users', object_id)
16
+ end
17
+
18
+ it 'returns the json document without database' do
19
+ expect(dbref.as_json).to eq({ '$ref' => 'users', '$id' => object_id })
20
+ end
21
+ end
22
+
23
+ context 'when the database is provided' do
24
+
25
+ let(:dbref) do
26
+ described_class.new('users', object_id, 'database')
27
+ end
28
+
29
+ it 'returns the json document with database' do
30
+ expect(dbref.as_json).to eq({
31
+ '$ref' => 'users',
32
+ '$id' => object_id,
33
+ '$db' => 'database'
34
+ })
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#initialize' do
40
+
41
+ let(:dbref) do
42
+ described_class.new('users', object_id)
43
+ end
44
+
45
+ it 'sets the collection' do
46
+ expect(dbref.collection).to eq('users')
47
+ end
48
+
49
+ it 'sets the id' do
50
+ expect(dbref.id).to eq(object_id)
51
+ end
52
+
53
+ context 'when a database is provided' do
54
+
55
+ let(:dbref) do
56
+ described_class.new('users', object_id, 'db')
57
+ end
58
+
59
+ it 'sets the database' do
60
+ expect(dbref.database).to eq('db')
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#to_bson' do
66
+
67
+ let(:dbref) do
68
+ described_class.new('users', object_id, 'database')
69
+ end
70
+
71
+ it 'converts the underlying document to bson' do
72
+ expect(dbref.to_bson).to eq(dbref.as_json.to_bson)
73
+ end
74
+ end
75
+
76
+ describe '#to_json' do
77
+
78
+ context 'when the database is not provided' do
79
+
80
+ let(:dbref) do
81
+ described_class.new('users', object_id)
82
+ end
83
+
84
+ it 'returns the json document without database' do
85
+ expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json}}")
86
+ end
87
+ end
88
+
89
+ context 'when the database is provided' do
90
+
91
+ let(:dbref) do
92
+ described_class.new('users', object_id, 'database')
93
+ end
94
+
95
+ it 'returns the json document with database' do
96
+ expect(dbref.to_json).to eq("{\"$ref\":\"users\",\"$id\":#{object_id.to_json},\"$db\":\"database\"}")
97
+ end
98
+ end
99
+ end
100
+
101
+ describe '#from_bson' do
102
+
103
+ let(:bson) do
104
+ StringIO.new(dbref.to_bson)
105
+ end
106
+
107
+ let(:decoded) do
108
+ BSON::Document.from_bson(bson)
109
+ end
110
+
111
+ context 'when a database exists' do
112
+
113
+ let(:dbref) do
114
+ described_class.new('users', object_id, 'database')
115
+ end
116
+
117
+ it 'decodes the ref' do
118
+ expect(decoded.collection).to eq('users')
119
+ end
120
+
121
+ it 'decodes the id' do
122
+ expect(decoded.id).to eq(object_id)
123
+ end
124
+
125
+ it 'decodes the database' do
126
+ expect(decoded.database).to eq('database')
127
+ end
128
+ end
129
+
130
+ context 'when no database exists' do
131
+
132
+ let(:dbref) do
133
+ described_class.new('users', object_id)
134
+ end
135
+
136
+ it 'decodes the ref' do
137
+ expect(decoded.collection).to eq('users')
138
+ end
139
+
140
+ it 'decodes the id' do
141
+ expect(decoded.id).to eq(object_id)
142
+ end
143
+
144
+ it 'sets the database to nil' do
145
+ expect(decoded.database).to be_nil
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring do
4
+
5
+ describe '#dup' do
6
+
7
+ let(:monitoring) do
8
+ described_class.new
9
+ end
10
+
11
+ let(:copy) do
12
+ monitoring.dup
13
+ end
14
+
15
+ it 'dups the subscribers' do
16
+ expect(monitoring.subscribers).to_not equal(copy.subscribers)
17
+ end
18
+
19
+ it 'keeps the same subscriber instances' do
20
+ expect(monitoring.subscribers).to eq(copy.subscribers)
21
+ end
22
+
23
+ context 'when adding to the copy' do
24
+
25
+ let(:subscriber) do
26
+ double('subscriber')
27
+ end
28
+
29
+ before do
30
+ copy.subscribe('topic', subscriber)
31
+ end
32
+
33
+ it 'does not modify the original subscribers' do
34
+ expect(monitoring.subscribers).to_not eq(copy.subscribers)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#initialize' do
40
+
41
+ context 'when no monitoring options provided' do
42
+
43
+ let(:monitoring) do
44
+ described_class.new
45
+ end
46
+
47
+ it 'includes the global subscribers' do
48
+ expect(monitoring.subscribers.size).to eq(1)
49
+ end
50
+ end
51
+
52
+ context 'when monitoring options provided' do
53
+
54
+ context 'when monitoring is true' do
55
+
56
+ let(:monitoring) do
57
+ described_class.new(monitoring: true)
58
+ end
59
+
60
+ it 'includes the global subscribers' do
61
+ expect(monitoring.subscribers.size).to eq(1)
62
+ end
63
+ end
64
+
65
+ context 'when monitoring is false' do
66
+
67
+ let(:monitoring) do
68
+ described_class.new(monitoring: false)
69
+ end
70
+
71
+ it 'does not include the global subscribers' do
72
+ expect(monitoring.subscribers).to be_empty
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '#subscribe' do
79
+
80
+ let(:monitoring) do
81
+ described_class.new(monitoring: false)
82
+ end
83
+
84
+ let(:subscriber) do
85
+ double('subscriber')
86
+ end
87
+
88
+ before do
89
+ monitoring.subscribe('topic', subscriber)
90
+ end
91
+
92
+ it 'subscribes to the topic' do
93
+ expect(monitoring.subscribers['topic']).to eq([ subscriber ])
94
+ end
95
+ end
96
+
97
+ describe '#started' do
98
+
99
+ let(:monitoring) do
100
+ described_class.new(monitoring: false)
101
+ end
102
+
103
+ let(:subscriber) do
104
+ double('subscriber')
105
+ end
106
+
107
+ let(:event) do
108
+ double('event')
109
+ end
110
+
111
+ before do
112
+ monitoring.subscribe('topic', subscriber)
113
+ end
114
+
115
+ it 'calls the started method on each subscriber' do
116
+ expect(subscriber).to receive(:started).with(event)
117
+ monitoring.started('topic', event)
118
+ end
119
+ end
120
+
121
+ describe '#succeeded' do
122
+
123
+ let(:monitoring) do
124
+ described_class.new(monitoring: false)
125
+ end
126
+
127
+ let(:subscriber) do
128
+ double('subscriber')
129
+ end
130
+
131
+ let(:event) do
132
+ double('event')
133
+ end
134
+
135
+ before do
136
+ monitoring.subscribe('topic', subscriber)
137
+ end
138
+
139
+ it 'calls the succeeded method on each subscriber' do
140
+ expect(subscriber).to receive(:succeeded).with(event)
141
+ monitoring.succeeded('topic', event)
142
+ end
143
+ end
144
+
145
+ describe '#failed' do
146
+
147
+ let(:monitoring) do
148
+ described_class.new(monitoring: false)
149
+ end
150
+
151
+ let(:subscriber) do
152
+ double('subscriber')
153
+ end
154
+
155
+ let(:event) do
156
+ double('event')
157
+ end
158
+
159
+ before do
160
+ monitoring.subscribe('topic', subscriber)
161
+ end
162
+
163
+ it 'calls the failed method on each subscriber' do
164
+ expect(subscriber).to receive(:failed).with(event)
165
+ monitoring.failed('topic', event)
166
+ end
167
+ end
168
+ end
@@ -109,7 +109,7 @@ describe Mongo::Operation::MapReduce do
109
109
  end
110
110
 
111
111
  after do
112
- authorized_collection.find.delete_many
112
+ authorized_collection.delete_many
113
113
  end
114
114
 
115
115
  context 'when the map/reduce succeeds' do
@@ -83,7 +83,7 @@ describe Mongo::Operation::Write::BulkDelete do
83
83
  end
84
84
 
85
85
  after do
86
- authorized_collection.find.delete_many
86
+ authorized_collection.delete_many
87
87
  end
88
88
 
89
89
  context 'when deleting a single document' do
@@ -20,7 +20,7 @@ describe Mongo::Operation::Write::BulkInsert do
20
20
  end
21
21
 
22
22
  after do
23
- authorized_collection.find.delete_many
23
+ authorized_collection.delete_many
24
24
  end
25
25
 
26
26
  describe '#initialize' do
@@ -115,7 +115,7 @@ describe Mongo::Operation::Write::BulkInsert do
115
115
  end
116
116
 
117
117
  after do
118
- authorized_collection.find.delete_many
118
+ authorized_collection.delete_many
119
119
  authorized_collection.indexes.drop_one('name_1')
120
120
  end
121
121
 
@@ -93,7 +93,7 @@ describe Mongo::Operation::Write::BulkUpdate do
93
93
  end
94
94
 
95
95
  after do
96
- authorized_collection.find.delete_many
96
+ authorized_collection.delete_many
97
97
  end
98
98
 
99
99
  context 'when updating a single document' do
@@ -72,7 +72,7 @@ describe Mongo::Operation::Write::Delete do
72
72
  end
73
73
 
74
74
  after do
75
- authorized_collection.find.delete_many
75
+ authorized_collection.delete_many
76
76
  end
77
77
 
78
78
  context 'when deleting a single document' do
@@ -16,7 +16,7 @@ describe Mongo::Operation::Write::Insert do
16
16
  end
17
17
 
18
18
  after do
19
- authorized_collection.find.delete_many
19
+ authorized_collection.delete_many
20
20
  end
21
21
 
22
22
  let(:insert) do
@@ -114,7 +114,7 @@ describe Mongo::Operation::Write::Insert do
114
114
  end
115
115
 
116
116
  after do
117
- authorized_collection.find.delete_many
117
+ authorized_collection.delete_many
118
118
  authorized_collection.indexes.drop_one('name_1')
119
119
  end
120
120
 
@@ -78,7 +78,7 @@ describe Mongo::Operation::Write::Update do
78
78
  end
79
79
 
80
80
  after do
81
- authorized_collection.find.delete_many
81
+ authorized_collection.delete_many
82
82
  end
83
83
 
84
84
  context 'when updating a single document' do
@@ -282,33 +282,4 @@ describe Mongo::Protocol::Query do
282
282
  end
283
283
  end
284
284
  end
285
-
286
- describe '#log_message' do
287
-
288
- context 'when the selector is greater than LOG_STRING_LIMIT characters' do
289
-
290
- let(:selector) do
291
- 'z'*260
292
- end
293
-
294
- it 'Only prints LOG_STRING_LIMIT number of characters' do
295
- expect(message.log_message.scan(/z/).length).to eq(Mongo::Protocol::Query::LOG_STRING_LIMIT)
296
- end
297
- end
298
-
299
- context 'when the selector cannot be inspected' do
300
-
301
- let(:selector) do
302
- 'invalid string'
303
- end
304
-
305
- before do
306
- allow(selector).to receive(:inspect).and_raise(ArgumentError)
307
- end
308
-
309
- it 'Does not include the selector in the log message' do
310
- expect(message.log_message.scan(/invalid string/).length).to eq(0)
311
- end
312
- end
313
- end
314
285
  end