mongo 2.1.0.beta → 2.2.0

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 (342) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +1 -7
  5. data/lib/mongo/address/ipv4.rb +6 -1
  6. data/lib/mongo/address/unix.rb +2 -2
  7. data/lib/mongo/address.rb +32 -10
  8. data/lib/mongo/auth/cr/conversation.rb +1 -1
  9. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  10. data/lib/mongo/auth/scram/conversation.rb +9 -3
  11. data/lib/mongo/auth/user/view.rb +23 -2
  12. data/lib/mongo/auth/x509/conversation.rb +1 -1
  13. data/lib/mongo/bulk_write/combineable.rb +51 -0
  14. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  15. data/lib/mongo/bulk_write/result.rb +61 -8
  16. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  17. data/lib/mongo/bulk_write/transformable.rb +132 -0
  18. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  19. data/lib/mongo/bulk_write/validatable.rb +62 -0
  20. data/lib/mongo/bulk_write.rb +164 -23
  21. data/lib/mongo/client.rb +75 -18
  22. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  23. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  24. data/lib/mongo/cluster.rb +85 -5
  25. data/lib/mongo/collection/view/aggregation.rb +19 -45
  26. data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
  27. data/lib/mongo/collection/view/builder/find_command.rb +111 -0
  28. data/lib/mongo/collection/view/builder/flags.rb +62 -0
  29. data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
  30. data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
  31. data/lib/mongo/collection/view/builder/op_query.rb +83 -0
  32. data/lib/mongo/collection/view/builder.rb +20 -0
  33. data/lib/mongo/collection/view/explainable.rb +15 -0
  34. data/lib/mongo/collection/view/immutable.rb +4 -11
  35. data/lib/mongo/collection/view/iterable.rb +40 -5
  36. data/lib/mongo/collection/view/map_reduce.rb +67 -37
  37. data/lib/mongo/collection/view/readable.rb +114 -100
  38. data/lib/mongo/collection/view/writable.rb +46 -22
  39. data/lib/mongo/collection/view.rb +25 -22
  40. data/lib/mongo/collection.rb +130 -12
  41. data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
  42. data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
  43. data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
  44. data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
  45. data/lib/mongo/cursor/builder.rb +18 -0
  46. data/lib/mongo/cursor.rb +76 -21
  47. data/lib/mongo/database/view.rb +11 -6
  48. data/lib/mongo/database.rb +16 -6
  49. data/lib/mongo/dbref.rb +9 -9
  50. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  51. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  52. data/lib/mongo/error/file_not_found.rb +37 -0
  53. data/lib/mongo/error/invalid_file.rb +2 -2
  54. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  55. data/lib/mongo/error/invalid_uri.rb +5 -4
  56. data/lib/mongo/error/invalid_write_concern.rb +35 -0
  57. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  58. data/lib/mongo/error/operation_failure.rb +33 -2
  59. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  60. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  61. data/lib/mongo/error.rb +8 -0
  62. data/lib/mongo/grid/file/chunk.rb +9 -9
  63. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  64. data/lib/mongo/grid/file.rb +12 -9
  65. data/lib/mongo/grid/fs_bucket.rb +448 -0
  66. data/lib/mongo/grid/stream/read.rb +208 -0
  67. data/lib/mongo/grid/stream/write.rb +187 -0
  68. data/lib/mongo/grid/stream.rb +64 -0
  69. data/lib/mongo/grid.rb +2 -1
  70. data/lib/mongo/index/view.rb +7 -4
  71. data/lib/mongo/index.rb +5 -0
  72. data/lib/mongo/loggable.rb +34 -57
  73. data/lib/mongo/logger.rb +16 -78
  74. data/lib/mongo/monitoring/command_log_subscriber.rb +38 -14
  75. data/lib/mongo/monitoring/event/command_started.rb +2 -1
  76. data/lib/mongo/monitoring/event/command_succeeded.rb +24 -2
  77. data/lib/mongo/monitoring/event/secure.rb +58 -0
  78. data/lib/mongo/monitoring/event.rb +1 -0
  79. data/lib/mongo/monitoring/publishable.rb +22 -12
  80. data/lib/mongo/monitoring.rb +1 -5
  81. data/lib/mongo/operation/commands/aggregate/result.rb +89 -0
  82. data/lib/mongo/operation/commands/aggregate.rb +64 -0
  83. data/lib/mongo/operation/commands/collections_info/result.rb +41 -0
  84. data/lib/mongo/operation/{read → commands}/collections_info.rb +5 -3
  85. data/lib/mongo/operation/commands/command.rb +47 -0
  86. data/lib/mongo/operation/commands/find/result.rb +62 -0
  87. data/lib/mongo/operation/commands/find.rb +27 -0
  88. data/lib/mongo/operation/commands/get_more/result.rb +62 -0
  89. data/lib/mongo/operation/commands/get_more.rb +27 -0
  90. data/lib/mongo/operation/{read → commands}/indexes.rb +9 -6
  91. data/lib/mongo/operation/{list_collections → commands/list_collections}/result.rb +1 -21
  92. data/lib/mongo/operation/{read → commands}/list_collections.rb +4 -32
  93. data/lib/mongo/operation/{list_indexes → commands/list_indexes}/result.rb +1 -21
  94. data/lib/mongo/operation/{read → commands}/list_indexes.rb +3 -33
  95. data/lib/mongo/operation/commands/map_reduce/result.rb +119 -0
  96. data/lib/mongo/operation/commands/map_reduce.rb +49 -0
  97. data/lib/mongo/operation/commands/parallel_scan/result.rb +64 -0
  98. data/lib/mongo/operation/commands/parallel_scan.rb +52 -0
  99. data/lib/mongo/operation/commands/user_query.rb +71 -0
  100. data/lib/mongo/operation/commands/users_info/result.rb +38 -0
  101. data/lib/mongo/operation/commands/users_info.rb +48 -0
  102. data/lib/mongo/operation/commands.rb +26 -0
  103. data/lib/mongo/operation/executable.rb +4 -68
  104. data/lib/mongo/operation/kill_cursors.rb +3 -3
  105. data/lib/mongo/operation/object_id_generator.rb +36 -0
  106. data/lib/mongo/operation/read/get_more.rb +2 -22
  107. data/lib/mongo/operation/read/query/result.rb +40 -0
  108. data/lib/mongo/operation/read/query.rb +4 -21
  109. data/lib/mongo/operation/read.rb +0 -4
  110. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  111. data/lib/mongo/operation/result.rb +43 -1
  112. data/lib/mongo/operation/specifiable.rb +59 -1
  113. data/lib/mongo/operation/write/bulk/bulkable.rb +83 -0
  114. data/lib/mongo/operation/write/bulk/delete/result.rb +67 -0
  115. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  116. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  117. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  118. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  119. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  120. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  121. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  122. data/lib/mongo/operation/write/bulk.rb +6 -3
  123. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  124. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  125. data/lib/mongo/operation/write/command/delete.rb +3 -3
  126. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  127. data/lib/mongo/operation/write/command/insert.rb +4 -3
  128. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  129. data/lib/mongo/operation/write/command/update.rb +6 -4
  130. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  131. data/lib/mongo/operation/write/command/writable.rb +13 -18
  132. data/lib/mongo/operation/write/create_index.rb +4 -27
  133. data/lib/mongo/operation/write/create_user.rb +4 -30
  134. data/lib/mongo/operation/write/delete.rb +6 -29
  135. data/lib/mongo/operation/write/drop_index.rb +3 -3
  136. data/lib/mongo/operation/write/gle.rb +49 -0
  137. data/lib/mongo/operation/write/idable.rb +24 -2
  138. data/lib/mongo/operation/write/insert.rb +2 -24
  139. data/lib/mongo/operation/write/remove_user.rb +4 -27
  140. data/lib/mongo/operation/write/update.rb +13 -36
  141. data/lib/mongo/operation/write/update_user.rb +4 -30
  142. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  143. data/lib/mongo/operation/write.rb +2 -0
  144. data/lib/mongo/operation.rb +33 -5
  145. data/lib/mongo/options/mapper.rb +26 -2
  146. data/lib/mongo/options/redacted.rb +156 -0
  147. data/lib/mongo/options.rb +1 -0
  148. data/lib/mongo/protocol/bit_vector.rb +11 -9
  149. data/lib/mongo/protocol/delete.rb +78 -3
  150. data/lib/mongo/protocol/get_more.rb +59 -2
  151. data/lib/mongo/protocol/insert.rb +73 -1
  152. data/lib/mongo/protocol/kill_cursors.rb +66 -4
  153. data/lib/mongo/protocol/message.rb +44 -20
  154. data/lib/mongo/protocol/query.rb +153 -65
  155. data/lib/mongo/protocol/reply.rb +92 -1
  156. data/lib/mongo/protocol/serializers.rb +49 -40
  157. data/lib/mongo/protocol/update.rb +93 -1
  158. data/lib/mongo/retryable.rb +101 -0
  159. data/lib/mongo/server/connectable.rb +28 -8
  160. data/lib/mongo/server/connection.rb +52 -10
  161. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  162. data/lib/mongo/server/connection_pool.rb +12 -15
  163. data/lib/mongo/server/description/features.rb +4 -2
  164. data/lib/mongo/server/description.rb +39 -3
  165. data/lib/mongo/server/monitor/connection.rb +49 -28
  166. data/lib/mongo/server/monitor.rb +3 -14
  167. data/lib/mongo/server.rb +31 -4
  168. data/lib/mongo/server_selector/selectable.rb +58 -32
  169. data/lib/mongo/server_selector.rb +19 -10
  170. data/lib/mongo/socket/ssl.rb +4 -1
  171. data/lib/mongo/socket/tcp.rb +2 -2
  172. data/lib/mongo/socket/unix.rb +5 -8
  173. data/lib/mongo/socket.rb +11 -4
  174. data/lib/mongo/uri.rb +245 -139
  175. data/lib/mongo/version.rb +1 -1
  176. data/lib/mongo/write_concern.rb +21 -6
  177. data/lib/mongo.rb +4 -4
  178. data/mongo.gemspec +1 -2
  179. data/spec/mongo/address/unix_spec.rb +1 -1
  180. data/spec/mongo/address_spec.rb +25 -0
  181. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  182. data/spec/mongo/auth/user/view_spec.rb +26 -1
  183. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +284 -0
  184. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  185. data/spec/mongo/bulk_write_spec.rb +385 -161
  186. data/spec/mongo/client_spec.rb +193 -23
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  188. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  189. data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
  190. data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
  191. data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
  192. data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
  193. data/spec/mongo/collection/view/explainable_spec.rb +1 -2
  194. data/spec/mongo/collection/view/immutable_spec.rb +54 -0
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +104 -9
  196. data/spec/mongo/collection/view/readable_spec.rb +109 -112
  197. data/spec/mongo/collection/view_spec.rb +119 -487
  198. data/spec/mongo/collection_spec.rb +1002 -33
  199. data/spec/mongo/command_monitoring_spec.rb +64 -0
  200. data/spec/mongo/connection_string_spec.rb +115 -0
  201. data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
  202. data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
  203. data/spec/mongo/cursor_spec.rb +10 -60
  204. data/spec/mongo/database_spec.rb +81 -12
  205. data/spec/mongo/dbref_spec.rb +4 -4
  206. data/spec/mongo/grid/file/chunk_spec.rb +6 -6
  207. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  208. data/spec/mongo/grid/file_spec.rb +8 -8
  209. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  210. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  211. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  212. data/spec/mongo/grid/stream_spec.rb +48 -0
  213. data/spec/mongo/gridfs_spec.rb +50 -0
  214. data/spec/mongo/index/view_spec.rb +41 -0
  215. data/spec/mongo/logger_spec.rb +0 -40
  216. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  217. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  218. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  219. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  220. data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
  221. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  222. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  223. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +1 -19
  224. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  225. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  226. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  227. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  228. data/spec/mongo/operation/read/query_spec.rb +19 -16
  229. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  230. data/spec/mongo/operation/result_spec.rb +19 -0
  231. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +17 -28
  232. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  233. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +7 -18
  234. data/spec/mongo/operation/write/command/delete_spec.rb +18 -9
  235. data/spec/mongo/operation/write/command/insert_spec.rb +18 -9
  236. data/spec/mongo/operation/write/command/update_spec.rb +18 -9
  237. data/spec/mongo/operation/write/delete_spec.rb +3 -3
  238. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  239. data/spec/mongo/operation/write/update_spec.rb +6 -6
  240. data/spec/mongo/options/redacted_spec.rb +350 -0
  241. data/spec/mongo/protocol/delete_spec.rb +4 -4
  242. data/spec/mongo/protocol/get_more_spec.rb +4 -4
  243. data/spec/mongo/protocol/insert_spec.rb +3 -3
  244. data/spec/mongo/protocol/kill_cursors_spec.rb +8 -6
  245. data/spec/mongo/protocol/query_spec.rb +21 -7
  246. data/spec/mongo/protocol/update_spec.rb +5 -5
  247. data/spec/mongo/retryable_spec.rb +221 -0
  248. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  249. data/spec/mongo/server/connection_pool_spec.rb +42 -6
  250. data/spec/mongo/server/connection_spec.rb +86 -1
  251. data/spec/mongo/server/description/features_spec.rb +25 -0
  252. data/spec/mongo/server/description_spec.rb +42 -0
  253. data/spec/mongo/server/monitor_spec.rb +44 -0
  254. data/spec/mongo/server_discovery_and_monitoring_spec.rb +25 -59
  255. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  256. data/spec/mongo/server_selection_spec.rb +5 -3
  257. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  258. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  259. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  260. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  261. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  262. data/spec/mongo/server_selector_spec.rb +87 -24
  263. data/spec/mongo/server_spec.rb +78 -15
  264. data/spec/mongo/socket/ssl_spec.rb +101 -57
  265. data/spec/mongo/socket/unix_spec.rb +52 -0
  266. data/spec/mongo/uri_spec.rb +271 -59
  267. data/spec/mongo/write_concern_spec.rb +126 -0
  268. data/spec/spec_helper.rb +29 -23
  269. data/spec/support/authorization.rb +4 -5
  270. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  271. data/spec/support/command_monitoring/command.yml +42 -0
  272. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  273. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  274. data/spec/support/command_monitoring/find.yml +268 -0
  275. data/spec/support/command_monitoring/insertMany.yml +81 -0
  276. data/spec/support/command_monitoring/insertOne.yml +51 -0
  277. data/spec/support/command_monitoring/updateMany.yml +67 -0
  278. data/spec/support/command_monitoring/updateOne.yml +95 -0
  279. data/spec/support/command_monitoring.rb +373 -0
  280. data/spec/support/connection_string.rb +228 -0
  281. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  282. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  283. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  284. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  285. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  286. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  287. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  288. data/spec/support/crud/read.rb +14 -10
  289. data/spec/support/crud/write.rb +36 -9
  290. data/spec/support/crud.rb +10 -2
  291. data/spec/support/gridfs.rb +637 -0
  292. data/spec/support/gridfs_tests/delete.yml +157 -0
  293. data/spec/support/gridfs_tests/download.yml +210 -0
  294. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  295. data/spec/support/gridfs_tests/upload.yml +158 -0
  296. data/spec/support/matchers.rb +2 -2
  297. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  298. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  299. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  300. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  301. data/spec/support/sdam/rs/rsother_discovered.yml +24 -3
  302. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  303. data/spec/support/sdam/rs/stepdown_change_set_name.yml +59 -0
  304. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  305. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  306. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  307. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  308. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  309. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  310. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  311. data/spec/support/server_selection.rb +3 -1
  312. data/spec/support/shared/bulk_write.rb +192 -0
  313. data/spec/support/shared/protocol.rb +5 -5
  314. data/spec/support/shared/server_selector.rb +78 -13
  315. data/spec/support/travis.rb +1 -1
  316. data.tar.gz.sig +0 -0
  317. metadata +211 -72
  318. metadata.gz.sig +0 -0
  319. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  320. data/lib/mongo/bulk_write/deletable.rb +0 -57
  321. data/lib/mongo/bulk_write/insertable.rb +0 -49
  322. data/lib/mongo/bulk_write/replacable.rb +0 -58
  323. data/lib/mongo/bulk_write/updatable.rb +0 -69
  324. data/lib/mongo/grid/fs.rb +0 -146
  325. data/lib/mongo/operation/aggregate/result.rb +0 -103
  326. data/lib/mongo/operation/aggregate.rb +0 -108
  327. data/lib/mongo/operation/command.rb +0 -61
  328. data/lib/mongo/operation/map_reduce/result.rb +0 -122
  329. data/lib/mongo/operation/map_reduce.rb +0 -95
  330. data/lib/mongo/operation/parallel_scan/result.rb +0 -72
  331. data/lib/mongo/operation/parallel_scan.rb +0 -76
  332. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  333. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  334. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  335. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  336. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  337. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  338. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  339. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  340. data/spec/mongo/grid/fs_spec.rb +0 -160
  341. data/spec/mongo/loggable_spec.rb +0 -63
  342. data/spec/mongo/operation/aggregate_spec.rb +0 -127
@@ -203,4 +203,29 @@ describe Mongo::Address do
203
203
  end
204
204
  end
205
205
  end
206
+
207
+ describe "#socket" do
208
+
209
+ context 'when providing a DNS entry that resolves to both IPv6 and IPv4' do
210
+
211
+ let(:address) do
212
+ described_class.new(DEFAULT_ADDRESS)
213
+ end
214
+
215
+ let(:host) do
216
+ DEFAULT_ADDRESS.split(':').first
217
+ end
218
+
219
+ before do
220
+ allow(::Socket).to receive(:getaddrinfo).and_return(
221
+ [ ["AF_INET6", 0, '::1', '::1', ::Socket::AF_INET6, 1, 6],
222
+ ["AF_INET", 0, host, host, ::Socket::AF_INET, 1, 6]]
223
+ )
224
+ end
225
+
226
+ it "attempts to use IPv6 and fallbacks to IPv4" do
227
+ expect(address.socket(0.0)).not_to be_nil
228
+ end
229
+ end
230
+ end
206
231
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::LDAP::Conversation do
4
+
5
+ let(:user) do
6
+ Mongo::Auth::User.new(
7
+ database: Mongo::Database::ADMIN,
8
+ user: 'user',
9
+ password: 'pencil'
10
+ )
11
+ end
12
+
13
+ let(:conversation) do
14
+ described_class.new(user)
15
+ end
16
+
17
+ describe '#start' do
18
+
19
+ let(:query) do
20
+ conversation.start
21
+ end
22
+
23
+ let(:selector) do
24
+ query.selector
25
+ end
26
+
27
+ it 'sets the sasl start flag' do
28
+ expect(selector[:saslStart]).to eq(1)
29
+ end
30
+
31
+ it 'sets the auto authorize flag' do
32
+ expect(selector[:autoAuthorize]).to eq(1)
33
+ end
34
+
35
+ it 'sets the mechanism' do
36
+ expect(selector[:mechanism]).to eq('PLAIN')
37
+ end
38
+
39
+ it 'sets the payload' do
40
+ expect(selector[:payload].data).to eq("\x00user\x00pencil")
41
+ end
42
+ end
43
+ end
@@ -112,7 +112,32 @@ describe Mongo::Auth::User::View do
112
112
  end
113
113
  end
114
114
 
115
- describe '#update' do
115
+ describe '#info' do
116
+
117
+ context 'when a user exists in the database' do
118
+
119
+ before do
120
+ view.create(
121
+ 'emily',
122
+ password: 'password'
123
+ )
124
+ end
125
+
126
+ after do
127
+ view.remove('emily')
128
+ end
129
+
130
+ it 'returns information for that user' do
131
+ expect(view.info('emily')).to_not be_empty
132
+ end
133
+ end
134
+
135
+ context 'when a user does not exist in the database' do
136
+
137
+ it 'returns nil' do
138
+ expect(view.info('emily')).to be_empty
139
+ end
140
+ end
116
141
 
117
142
  end
118
143
  end
@@ -0,0 +1,284 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::BulkWrite::OrderedCombiner do
4
+
5
+ describe '#combine' do
6
+
7
+ let(:combiner) do
8
+ described_class.new(requests)
9
+ end
10
+
11
+ context 'when provided a series of delete one' do
12
+
13
+ context 'when the documents are valid' do
14
+
15
+ let(:requests) do
16
+ [
17
+ { delete_one: { filter: { _id: 0 }}},
18
+ { delete_one: { filter: { _id: 1 }}}
19
+ ]
20
+ end
21
+
22
+ it 'returns a single delete one' do
23
+ expect(combiner.combine).to eq(
24
+ [
25
+ {
26
+ delete_one: [
27
+ { 'q' => { _id: 0 }, 'limit' => 1 },
28
+ { 'q' => { _id: 1 }, 'limit' => 1 }
29
+ ]
30
+ }
31
+ ]
32
+ )
33
+ end
34
+ end
35
+
36
+ context 'when a document is not valid' do
37
+
38
+ let(:requests) do
39
+ [
40
+ { delete_one: { filter: { _id: 0 }}},
41
+ { delete_one: 'whoami' }
42
+ ]
43
+ end
44
+
45
+ it 'raises an exception' do
46
+ expect {
47
+ combiner.combine
48
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'when provided a series of delete many' do
54
+
55
+ context 'when the documents are valid' do
56
+
57
+ let(:requests) do
58
+ [
59
+ { delete_many: { filter: { _id: 0 }}},
60
+ { delete_many: { filter: { _id: 1 }}}
61
+ ]
62
+ end
63
+
64
+ it 'returns a single delete many' do
65
+ expect(combiner.combine).to eq(
66
+ [
67
+ {
68
+ delete_many: [
69
+ { 'q' => { _id: 0 }, 'limit' => 0 },
70
+ { 'q' => { _id: 1 }, 'limit' => 0 }
71
+ ]
72
+ }
73
+ ]
74
+ )
75
+ end
76
+ end
77
+
78
+ context 'when a document is not valid' do
79
+
80
+ let(:requests) do
81
+ [
82
+ { delete_many: { filter: { _id: 0 }}},
83
+ { delete_many: 'whoami' }
84
+ ]
85
+ end
86
+
87
+ it 'raises an exception' do
88
+ expect {
89
+ combiner.combine
90
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when provided a series of insert one' do
96
+
97
+ context 'when providing only one operation' do
98
+
99
+ let(:requests) do
100
+ [{ insert_one: { _id: 0 }}]
101
+ end
102
+
103
+ it 'returns a single insert one' do
104
+ expect(combiner.combine).to eq(
105
+ [{ insert_one: [{ _id: 0 }]}]
106
+ )
107
+ end
108
+ end
109
+
110
+ context 'when the documents are valid' do
111
+
112
+ let(:requests) do
113
+ [{ insert_one: { _id: 0 }}, { insert_one: { _id: 1 }}]
114
+ end
115
+
116
+ it 'returns a single insert one' do
117
+ expect(combiner.combine).to eq(
118
+ [{ insert_one: [{ _id: 0 }, { _id: 1 }]}]
119
+ )
120
+ end
121
+ end
122
+
123
+ context 'when a document is not valid' do
124
+
125
+ let(:requests) do
126
+ [{ insert_one: { _id: 0 }}, { insert_one: 'whoami' }]
127
+ end
128
+
129
+ it 'raises an exception' do
130
+ expect {
131
+ combiner.combine
132
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
133
+ end
134
+ end
135
+ end
136
+
137
+ context 'when provided a series of replace one' do
138
+
139
+ context 'when the documents are valid' do
140
+
141
+ let(:requests) do
142
+ [
143
+ { replace_one: { filter: { _id: 0 }, replacement: { name: 'test' }}},
144
+ { replace_one: { filter: { _id: 1 }, replacement: { name: 'test' }}}
145
+ ]
146
+ end
147
+
148
+ it 'returns a single replace one' do
149
+ expect(combiner.combine).to eq(
150
+ [
151
+ {
152
+ replace_one: [
153
+ { 'q' => { _id: 0 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false },
154
+ { 'q' => { _id: 1 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false }
155
+ ]
156
+ }
157
+ ]
158
+ )
159
+ end
160
+ end
161
+
162
+ context 'when a document is not valid' do
163
+
164
+ let(:requests) do
165
+ [
166
+ { replace_one: { filter: { _id: 0 }, replacement: { name: 'test' }}},
167
+ { replace_one: 'whoami' }
168
+ ]
169
+ end
170
+
171
+ it 'raises an exception' do
172
+ expect {
173
+ combiner.combine
174
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
175
+ end
176
+ end
177
+ end
178
+
179
+ context 'when provided a series of update one' do
180
+
181
+ context 'when the documents are valid' do
182
+
183
+ let(:requests) do
184
+ [
185
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
186
+ { update_one: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
187
+ ]
188
+ end
189
+
190
+ it 'returns a single update one' do
191
+ expect(combiner.combine).to eq(
192
+ [
193
+ {
194
+ update_one: [
195
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false },
196
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false }
197
+ ]
198
+ }
199
+ ]
200
+ )
201
+ end
202
+ end
203
+
204
+ context 'when a document is not valid' do
205
+
206
+ let(:requests) do
207
+ [
208
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
209
+ { update_one: 'whoami' }
210
+ ]
211
+ end
212
+
213
+ it 'raises an exception' do
214
+ expect {
215
+ combiner.combine
216
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
217
+ end
218
+ end
219
+ end
220
+
221
+ context 'when provided a series of update many ops' do
222
+
223
+ context 'when the documents are valid' do
224
+
225
+ let(:requests) do
226
+ [
227
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
228
+ { update_many: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
229
+ ]
230
+ end
231
+
232
+ it 'returns a single update many' do
233
+ expect(combiner.combine).to eq(
234
+ [
235
+ {
236
+ update_many: [
237
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false },
238
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false }
239
+ ]
240
+ }
241
+ ]
242
+ )
243
+ end
244
+ end
245
+
246
+ context 'when a document is not valid' do
247
+
248
+ let(:requests) do
249
+ [
250
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
251
+ { update_many: 'whoami' }
252
+ ]
253
+ end
254
+
255
+ it 'raises an exception' do
256
+ expect {
257
+ combiner.combine
258
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
259
+ end
260
+ end
261
+ end
262
+
263
+ context 'when provided a mix of operations' do
264
+
265
+ let(:requests) do
266
+ [
267
+ { insert_one: { _id: 0 }},
268
+ { delete_one: { filter: { _id: 0 }}},
269
+ { insert_one: { _id: 1 }}
270
+ ]
271
+ end
272
+
273
+ it 'returns an ordered grouping' do
274
+ expect(combiner.combine).to eq(
275
+ [
276
+ { insert_one: [{ _id: 0 }]},
277
+ { delete_one: [{ 'q' => { _id: 0 }, 'limit' => 1 }]},
278
+ { insert_one: [{ _id: 1 }]}
279
+ ]
280
+ )
281
+ end
282
+ end
283
+ end
284
+ end
@@ -0,0 +1,239 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::BulkWrite::UnorderedCombiner do
4
+
5
+ describe '#combine' do
6
+
7
+ let(:combiner) do
8
+ described_class.new(requests)
9
+ end
10
+
11
+ context 'when provided a series of delete one' do
12
+
13
+ context 'when the documents are valid' do
14
+
15
+ let(:requests) do
16
+ [
17
+ { delete_one: { filter: { _id: 0 }}},
18
+ { delete_one: { filter: { _id: 1 }}}
19
+ ]
20
+ end
21
+
22
+ it 'returns a single delete one' do
23
+ expect(combiner.combine).to eq(
24
+ [
25
+ {
26
+ delete_one: [
27
+ { 'q' => { _id: 0 }, 'limit' => 1 },
28
+ { 'q' => { _id: 1 }, 'limit' => 1 }
29
+ ]
30
+ }
31
+ ]
32
+ )
33
+ end
34
+ end
35
+
36
+ context 'when a document is not valid' do
37
+
38
+ let(:requests) do
39
+ [
40
+ { delete_one: { filter: { _id: 0 }}},
41
+ { delete_one: 'whoami' }
42
+ ]
43
+ end
44
+
45
+ it 'raises an exception' do
46
+ expect {
47
+ combiner.combine
48
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'when provided a series of delete many' do
54
+
55
+ context 'when the documents are valid' do
56
+
57
+ let(:requests) do
58
+ [
59
+ { delete_many: { filter: { _id: 0 }}},
60
+ { delete_many: { filter: { _id: 1 }}}
61
+ ]
62
+ end
63
+
64
+ it 'returns a single delete many' do
65
+ expect(combiner.combine).to eq(
66
+ [
67
+ {
68
+ delete_many: [
69
+ { 'q' => { _id: 0 }, 'limit' => 0 },
70
+ { 'q' => { _id: 1 }, 'limit' => 0 }
71
+ ]
72
+ }
73
+ ]
74
+ )
75
+ end
76
+ end
77
+
78
+ context 'when a document is not valid' do
79
+
80
+ let(:requests) do
81
+ [
82
+ { delete_many: { filter: { _id: 0 }}},
83
+ { delete_many: 'whoami' }
84
+ ]
85
+ end
86
+
87
+ it 'raises an exception' do
88
+ expect {
89
+ combiner.combine
90
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when provided a series of insert one' do
96
+
97
+ context 'when the documents are valid' do
98
+
99
+ let(:requests) do
100
+ [{ insert_one: { _id: 0 }}, { insert_one: { _id: 1 }}]
101
+ end
102
+
103
+ it 'returns a single insert one' do
104
+ expect(combiner.combine).to eq(
105
+ [{ insert_one: [{ _id: 0 }, { _id: 1 }]}]
106
+ )
107
+ end
108
+ end
109
+
110
+ context 'when a document is not valid' do
111
+
112
+ let(:requests) do
113
+ [{ insert_one: { _id: 0 }}, { insert_one: 'whoami' }]
114
+ end
115
+
116
+ it 'raises an exception' do
117
+ expect {
118
+ combiner.combine
119
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
120
+ end
121
+ end
122
+ end
123
+
124
+ context 'when provided a series of update one' do
125
+
126
+ context 'when the documents are valid' do
127
+
128
+ let(:requests) do
129
+ [
130
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
131
+ { update_one: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
132
+ ]
133
+ end
134
+
135
+ it 'returns a single update one' do
136
+ expect(combiner.combine).to eq(
137
+ [
138
+ {
139
+ update_one: [
140
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false },
141
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false }
142
+ ]
143
+ }
144
+ ]
145
+ )
146
+ end
147
+ end
148
+
149
+ context 'when a document is not valid' do
150
+
151
+ let(:requests) do
152
+ [
153
+ { update_one: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
154
+ { update_one: 'whoami' }
155
+ ]
156
+ end
157
+
158
+ it 'raises an exception' do
159
+ expect {
160
+ combiner.combine
161
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
162
+ end
163
+ end
164
+ end
165
+
166
+ context 'when provided a series of update many ops' do
167
+
168
+ context 'when the documents are valid' do
169
+
170
+ let(:requests) do
171
+ [
172
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
173
+ { update_many: { filter: { _id: 1 }, update: { '$set' => { name: 'test' }}}}
174
+ ]
175
+ end
176
+
177
+ it 'returns a single update many' do
178
+ expect(combiner.combine).to eq(
179
+ [
180
+ {
181
+ update_many: [
182
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false },
183
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false }
184
+ ]
185
+ }
186
+ ]
187
+ )
188
+ end
189
+ end
190
+
191
+ context 'when a document is not valid' do
192
+
193
+ let(:requests) do
194
+ [
195
+ { update_many: { filter: { _id: 0 }, update: { '$set' => { name: 'test' }}}},
196
+ { update_many: 'whoami' }
197
+ ]
198
+ end
199
+
200
+ it 'raises an exception' do
201
+ expect {
202
+ combiner.combine
203
+ }.to raise_error(Mongo::Error::InvalidBulkOperation)
204
+ end
205
+ end
206
+ end
207
+
208
+ context 'when provided a mix of operations' do
209
+
210
+ let(:requests) do
211
+ [
212
+ { insert_one: { _id: 0 }},
213
+ { delete_one: { filter: { _id: 0 }}},
214
+ { insert_one: { _id: 1 }},
215
+ { delete_one: { filter: { _id: 1 }}}
216
+ ]
217
+ end
218
+
219
+ it 'returns an unordered mixed grouping' do
220
+ expect(combiner.combine).to eq(
221
+ [
222
+ {
223
+ insert_one: [
224
+ { _id: 0 },
225
+ { _id: 1 }
226
+ ]
227
+ },
228
+ {
229
+ delete_one: [
230
+ { 'q' => { _id: 0 }, 'limit' => 1 },
231
+ { 'q' => { _id: 1 }, 'limit' => 1 }
232
+ ]
233
+ }
234
+ ]
235
+ )
236
+ end
237
+ end
238
+ end
239
+ end