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
@@ -20,6 +20,10 @@ describe Mongo::Client do
20
20
  )
21
21
  end
22
22
 
23
+ after do
24
+ client.close
25
+ end
26
+
23
27
  context 'when the other is a client' do
24
28
 
25
29
  context 'when the options and cluster are equal' do
@@ -162,17 +166,21 @@ describe Mongo::Client do
162
166
  described_class.new(
163
167
  ['127.0.0.1:27017'],
164
168
  :read => { :mode => :primary },
165
- :local_threshold_ms => 10,
166
- :server_selection_timeout_ms => 10000,
169
+ :local_threshold => 10,
170
+ :server_selection_timeout => 10000,
167
171
  :database => TEST_DB
168
172
  )
169
173
  end
170
174
 
175
+ let(:options) do
176
+ Mongo::Options::Redacted.new(:read => { :mode => :primary },
177
+ :local_threshold => 10,
178
+ :server_selection_timeout => 10000,
179
+ :database => TEST_DB)
180
+ end
181
+
171
182
  let(:expected) do
172
- [client.cluster, { :read => { :mode => :primary },
173
- :local_threshold_ms => 10,
174
- :server_selection_timeout_ms => 10000,
175
- :database => TEST_DB }].hash
183
+ [client.cluster, options].hash
176
184
  end
177
185
 
178
186
  it 'returns a hash of the cluster and options' do
@@ -195,6 +203,23 @@ describe Mongo::Client do
195
203
  "<Mongo::Client:0x#{client.object_id} cluster=127.0.0.1:27017"
196
204
  )
197
205
  end
206
+
207
+ context 'when there is sensitive data in the options' do
208
+
209
+ let(:client) do
210
+ described_class.new(
211
+ ['127.0.0.1:27017'],
212
+ :read => { :mode => :primary },
213
+ :database => TEST_DB,
214
+ :password => 'some_password',
215
+ :user => 'emily'
216
+ )
217
+ end
218
+
219
+ it 'does not print out sensitive data' do
220
+ expect(client.inspect).not_to match('some_password')
221
+ end
222
+ end
198
223
  end
199
224
 
200
225
  describe '#initialize' do
@@ -222,6 +247,27 @@ describe Mongo::Client do
222
247
  expect(client[:users].name).to eq('users')
223
248
  end
224
249
  end
250
+
251
+ context 'when providing a custom logger' do
252
+
253
+ let(:logger) do
254
+ Logger.new($stdout).tap do |l|
255
+ l.level = Logger::FATAL
256
+ end
257
+ end
258
+
259
+ let(:client) do
260
+ authorized_client.with(logger: logger)
261
+ end
262
+
263
+ after do
264
+ client.close
265
+ end
266
+
267
+ it 'does not use the global logger' do
268
+ expect(client.cluster.logger).to_not eq(Mongo::Logger.logger)
269
+ end
270
+ end
225
271
  end
226
272
 
227
273
  context 'when providing a connection string' do
@@ -266,8 +312,12 @@ describe Mongo::Client do
266
312
  described_class.new(uri)
267
313
  end
268
314
 
315
+ let(:expected_options) do
316
+ Mongo::Options::Redacted.new(:write => { :w => 3 }, :database => 'testdb')
317
+ end
318
+
269
319
  it 'sets the options' do
270
- expect(client.options).to eq(:write => { :w => 3 }, :database => 'testdb')
320
+ expect(client.options).to eq(expected_options)
271
321
  end
272
322
  end
273
323
 
@@ -281,8 +331,12 @@ describe Mongo::Client do
281
331
  described_class.new(uri, :write => { :w => 3 })
282
332
  end
283
333
 
334
+ let(:expected_options) do
335
+ Mongo::Options::Redacted.new(:write => { :w => 3 }, :database => 'testdb')
336
+ end
337
+
284
338
  it 'sets the options' do
285
- expect(client.options).to eq(:write => { :w => 3 }, :database => 'testdb')
339
+ expect(client.options).to eq(expected_options)
286
340
  end
287
341
  end
288
342
 
@@ -296,8 +350,12 @@ describe Mongo::Client do
296
350
  described_class.new(uri, :write => { :w => 4 })
297
351
  end
298
352
 
353
+ let(:expected_options) do
354
+ Mongo::Options::Redacted.new(:write => { :w => 4 }, :database => 'testdb')
355
+ end
356
+
299
357
  it 'allows explicit options to take preference' do
300
- expect(client.options).to eq(:write => { :w => 4 }, :database => 'testdb')
358
+ expect(client.options).to eq(expected_options)
301
359
  end
302
360
  end
303
361
 
@@ -315,6 +373,26 @@ describe Mongo::Client do
315
373
  expect(client.cluster.topology).to be_a(Mongo::Cluster::Topology::ReplicaSet)
316
374
  end
317
375
  end
376
+
377
+ context 'when an invalid option is provided' do
378
+
379
+ let(:client) do
380
+ described_class.new(['127.0.0.1:27017'], :ssl => false, :invalid => :test)
381
+ end
382
+
383
+ it 'does not set the option' do
384
+ expect(client.options.keys).not_to include('invalid')
385
+ end
386
+
387
+ it 'sets the valid options' do
388
+ expect(client.options.keys).to include('ssl')
389
+ end
390
+
391
+ it 'warns that an invalid option has been specified' do
392
+ expect(Mongo::Logger.logger).to receive(:warn)
393
+ expect(client.options.keys).not_to include('invalid')
394
+ end
395
+ end
318
396
  end
319
397
  end
320
398
 
@@ -323,7 +401,8 @@ describe Mongo::Client do
323
401
  let(:client) do
324
402
  described_class.new(['127.0.0.1:27017'],
325
403
  :database => TEST_DB,
326
- :read => mode)
404
+ :read => mode,
405
+ :server_selection_timeout => 2)
327
406
  end
328
407
 
329
408
  let(:preference) do
@@ -341,7 +420,7 @@ describe Mongo::Client do
341
420
  end
342
421
 
343
422
  it 'passes the options to the read preference' do
344
- expect(preference.options[:database]).to eq(TEST_DB)
423
+ expect(preference.options[:server_selection_timeout]).to eq(2)
345
424
  end
346
425
  end
347
426
 
@@ -399,6 +478,33 @@ describe Mongo::Client do
399
478
  expect(preference).to be_a(Mongo::ServerSelector::Primary)
400
479
  end
401
480
  end
481
+
482
+ context 'when the read preference is printed' do
483
+
484
+ let(:client) do
485
+ described_class.new([ DEFAULT_ADDRESS ], options)
486
+ end
487
+
488
+ let(:options) do
489
+ { user: 'Emily', password: 'sensitive_data', server_selection_timeout: 0.1 }
490
+ end
491
+
492
+ before do
493
+ allow(client.database.cluster).to receive(:single?).and_return(false)
494
+ end
495
+
496
+ let(:error) do
497
+ begin
498
+ client.database.command(ping: 1)
499
+ rescue => e
500
+ e
501
+ end
502
+ end
503
+
504
+ it 'redacts sensitive client options' do
505
+ expect(error.message).not_to match(options[:password])
506
+ end
507
+ end
402
508
  end
403
509
 
404
510
  describe '#use' do
@@ -472,20 +578,28 @@ describe Mongo::Client do
472
578
  client.with(:read => { :mode => :primary })
473
579
  end
474
580
 
581
+ let(:new_options) do
582
+ Mongo::Options::Redacted.new(:read => { :mode => :primary },
583
+ :write => { :w => 1 },
584
+ :database => TEST_DB)
585
+ end
586
+
587
+ let(:original_options) do
588
+ Mongo::Options::Redacted.new(:read => { :mode => :secondary },
589
+ :write => { :w => 1 },
590
+ :database => TEST_DB)
591
+ end
592
+
475
593
  it 'returns a new client' do
476
594
  expect(new_client).not_to equal(client)
477
595
  end
478
596
 
479
597
  it 'replaces the existing options' do
480
- expect(new_client.options).to eq({
481
- :read => { :mode => :primary }, :write => { :w => 1 }, :database => TEST_DB
482
- })
598
+ expect(new_client.options).to eq(new_options)
483
599
  end
484
600
 
485
601
  it 'does not modify the original client' do
486
- expect(client.options).to eq({
487
- :read => { :mode => :secondary }, :write => { :w => 1 }, :database => TEST_DB
488
- })
602
+ expect(client.options).to eq(original_options)
489
603
  end
490
604
 
491
605
  it 'keeps the same cluster' do
@@ -530,6 +644,26 @@ describe Mongo::Client do
530
644
  end
531
645
  end
532
646
  end
647
+
648
+ context 'when an invalid option is provided' do
649
+
650
+ let(:new_client) do
651
+ client.with(invalid: :option, ssl: false)
652
+ end
653
+
654
+ it 'does not set the invalid option' do
655
+ expect(new_client.options.keys).not_to include('invalid')
656
+ end
657
+
658
+ it 'sets the valid options' do
659
+ expect(new_client.options.keys).to include('ssl')
660
+ end
661
+
662
+ it 'warns that an invalid option has been specified' do
663
+ expect(Mongo::Logger.logger).to receive(:warn)
664
+ expect(new_client.options.keys).not_to include('invalid')
665
+ end
666
+ end
533
667
  end
534
668
 
535
669
  describe '#write_concern' do
@@ -540,8 +674,8 @@ describe Mongo::Client do
540
674
 
541
675
  let(:client) { described_class.new(['127.0.0.1:27017'], :database => TEST_DB) }
542
676
 
543
- it 'returns a acknowledged write concern' do
544
- expect(concern.get_last_error).to eq(:getlasterror => 1, :w => 1)
677
+ it 'does not set the write concern' do
678
+ expect(concern).to be_nil
545
679
  end
546
680
  end
547
681
 
@@ -554,7 +688,7 @@ describe Mongo::Client do
554
688
  end
555
689
 
556
690
  it 'returns a acknowledged write concern' do
557
- expect(concern.get_last_error).to eq(:getlasterror => 1, :j => true)
691
+ expect(concern.get_last_error).to eq(:getlasterror => 1, 'j' => true)
558
692
  end
559
693
  end
560
694
 
@@ -577,8 +711,10 @@ describe Mongo::Client do
577
711
  described_class.new(['127.0.0.1:27017'], :write => { :w => -1 }, :database => TEST_DB)
578
712
  end
579
713
 
580
- it 'returns an unacknowledged write concern' do
581
- expect(concern.get_last_error).to be_nil
714
+ it 'raises an error' do
715
+ expect {
716
+ concern
717
+ }.to raise_error(Mongo::Error::InvalidWriteConcern)
582
718
  end
583
719
  end
584
720
  end
@@ -631,7 +767,41 @@ describe Mongo::Client do
631
767
 
632
768
  it 'reconnects the cluster and returns true' do
633
769
  expect(client.reconnect).to be(true)
634
- sleep(2)
770
+ end
771
+ end
772
+
773
+ describe '#dup' do
774
+
775
+ let(:client) do
776
+ described_class.new(
777
+ ['127.0.0.1:27017'],
778
+ :read => { :mode => :primary },
779
+ :database => TEST_DB
780
+ )
781
+ end
782
+
783
+ it 'creates a client with Redacted options' do
784
+ expect(client.dup.options).to be_a(Mongo::Options::Redacted)
785
+ end
786
+ end
787
+
788
+ describe '#collections' do
789
+
790
+ before do
791
+ authorized_client.database[:users].create
792
+ end
793
+
794
+ after do
795
+ authorized_client.database[:users].drop
796
+ end
797
+
798
+ let(:collection) do
799
+ Mongo::Collection.new(authorized_client.database, 'users')
800
+ end
801
+
802
+ it 'refers the current database collections' do
803
+ expect(authorized_client.collections).to include(collection)
804
+ expect(authorized_client.collections).to all(be_a(Mongo::Collection))
635
805
  end
636
806
  end
637
807
  end
@@ -239,6 +239,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
239
239
  double('description').tap do |d|
240
240
  allow(d).to receive(:config).and_return({ 'ismaster' => true })
241
241
  allow(d).to receive(:primary?).and_return(false)
242
+ allow(d).to receive(:me_mismatch?).and_return(false)
242
243
  allow(d).to receive(:hosts).and_return([])
243
244
  end
244
245
  end
@@ -257,6 +258,7 @@ describe Mongo::Cluster::Topology::ReplicaSet do
257
258
  allow(d).to receive(:hosts).and_return([ primary ])
258
259
  allow(d).to receive(:replica_set_name).and_return('test')
259
260
  allow(d).to receive(:replica_set_member?).and_return(true)
261
+ allow(d).to receive(:me_mismatch?).and_return(false)
260
262
  end
261
263
  end
262
264
 
@@ -300,4 +300,69 @@ describe Mongo::Collection::View::Aggregation do
300
300
  end
301
301
  end
302
302
  end
303
+
304
+ context 'when $out is in the pipeline', if: write_command_enabled? do
305
+
306
+ let(:pipeline) do
307
+ [{
308
+ "$group" => {
309
+ "_id" => "$city",
310
+ "totalpop" => { "$sum" => "$pop" }
311
+ }
312
+ },
313
+ {
314
+ '$out' => 'output_collection'
315
+ }
316
+ ]
317
+ end
318
+
319
+ after do
320
+ authorized_client['output_collection'].delete_many
321
+ end
322
+
323
+ context 'when $out is a string' do
324
+
325
+ it 'does not allow the operation on a secondary' do
326
+ expect(aggregation.send(:secondary_ok?)).to be(false)
327
+ end
328
+ end
329
+
330
+ context 'when $out is a symbol' do
331
+
332
+ let(:pipeline) do
333
+ [{
334
+ "$group" => {
335
+ "_id" => "$city",
336
+ "totalpop" => { "$sum" => "$pop" }
337
+ }
338
+ },
339
+ {
340
+ :$out => 'output_collection'
341
+ }
342
+ ]
343
+ end
344
+
345
+ it 'does not allow the operation on a secondary' do
346
+ expect(aggregation.send(:secondary_ok?)).to be(false)
347
+ end
348
+ end
349
+
350
+
351
+ context 'when the context is not a valid server for writing' do
352
+
353
+ it 'reroutes the operation to a primary' do
354
+ allow(aggregation).to receive(:valid_server?).and_return(false)
355
+ expect(Mongo::Logger.logger).to receive(:warn?).and_call_original
356
+ aggregation.to_a
357
+ end
358
+ end
359
+
360
+ context 'when the context is a valid server for writing' do
361
+
362
+ it 'does not reroute the operation to a primary' do
363
+ expect(Mongo::Logger.logger).not_to receive(:warn?)
364
+ aggregation.to_a
365
+ end
366
+ end
367
+ end
303
368
  end
@@ -0,0 +1,167 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Builder::FindCommand do
4
+
5
+ describe '#specification' do
6
+
7
+ let(:view) do
8
+ Mongo::Collection::View.new(authorized_collection, filter, options)
9
+ end
10
+
11
+ let(:builder) do
12
+ described_class.new(view)
13
+ end
14
+
15
+ let(:specification) do
16
+ builder.specification
17
+ end
18
+
19
+ let(:selector) do
20
+ specification[:selector]
21
+ end
22
+
23
+ context 'when the options are standard' do
24
+
25
+ let(:filter) do
26
+ { 'name' => 'test' }
27
+ end
28
+
29
+ let(:options) do
30
+ {
31
+ sort: { _id: 1 },
32
+ projection: { name: 1 },
33
+ hint: { name: 1 },
34
+ skip: 10,
35
+ limit: 20,
36
+ batch_size: 5,
37
+ single_batch: false,
38
+ comment: "testing",
39
+ max_scan: 200,
40
+ max_time_ms: 40,
41
+ max_value: { name: 'joe' },
42
+ min_value: { name: 'albert' },
43
+ return_key: true,
44
+ show_disk_loc: true,
45
+ snapshot: true,
46
+ tailable: true,
47
+ oplog_replay: true,
48
+ no_cursor_timeout: true,
49
+ await_data: true,
50
+ allow_partial_results: true,
51
+ read_concern: { level: 'local' }
52
+ }
53
+ end
54
+
55
+ it 'maps the collection name' do
56
+ expect(selector['find']).to eq(authorized_collection.name)
57
+ end
58
+
59
+ it 'maps the filter' do
60
+ expect(selector['filter']).to eq(filter)
61
+ end
62
+
63
+ it 'maps sort' do
64
+ expect(selector['sort']).to eq('_id' => 1)
65
+ end
66
+
67
+ it 'maps projection' do
68
+ expect(selector['projection']).to eq('name' => 1)
69
+ end
70
+
71
+ it 'maps hint' do
72
+ expect(selector['hint']).to eq('name' => 1)
73
+ end
74
+
75
+ it 'maps skip' do
76
+ expect(selector['skip']).to eq(10)
77
+ end
78
+
79
+ it 'maps limit' do
80
+ expect(selector['limit']).to eq(20)
81
+ end
82
+
83
+ it 'maps batch size' do
84
+ expect(selector['batchSize']).to eq(5)
85
+ end
86
+
87
+ it 'maps single batch' do
88
+ expect(selector['singleBatch']).to be false
89
+ end
90
+
91
+ it 'maps comment' do
92
+ expect(selector['comment']).to eq('testing')
93
+ end
94
+
95
+ it 'maps max scan' do
96
+ expect(selector['maxScan']).to eq(200)
97
+ end
98
+
99
+ it 'maps max time ms' do
100
+ expect(selector['maxTimeMS']).to eq(40)
101
+ end
102
+
103
+ it 'maps max' do
104
+ expect(selector['max']).to eq('name' => 'joe')
105
+ end
106
+
107
+ it 'maps min' do
108
+ expect(selector['min']).to eq('name' => 'albert')
109
+ end
110
+
111
+ it 'maps read concern' do
112
+ expect(selector['readConcern']).to eq('level' => 'local')
113
+ end
114
+
115
+ it 'maps return key' do
116
+ expect(selector['returnKey']).to be true
117
+ end
118
+
119
+ it 'maps show record id' do
120
+ expect(selector['showRecordId']).to be true
121
+ end
122
+
123
+ it 'maps snapshot' do
124
+ expect(selector['snapshot']).to be true
125
+ end
126
+
127
+ it 'maps tailable' do
128
+ expect(selector['tailable']).to be true
129
+ end
130
+
131
+ it 'maps oplog replay' do
132
+ expect(selector['oplogReplay']).to be true
133
+ end
134
+
135
+ it 'maps no cursor timeout' do
136
+ expect(selector['noCursorTimeout']).to be true
137
+ end
138
+
139
+ it 'maps await data' do
140
+ expect(selector['awaitData']).to be true
141
+ end
142
+
143
+ it 'maps allow partial results' do
144
+ expect(selector['allowPartialResults']).to be true
145
+ end
146
+ end
147
+
148
+ context 'when limit is negative' do
149
+
150
+ let(:filter) do
151
+ { 'name' => 'test' }
152
+ end
153
+
154
+ let(:options) do
155
+ { limit: -1 }
156
+ end
157
+
158
+ it 'sets single batch to true' do
159
+ expect(selector['singleBatch']).to be true
160
+ end
161
+
162
+ it 'removes the limit from the command' do
163
+ expect(selector['limit']).to be_nil
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View::Builder::Flags do
4
+
5
+ describe '.map_flags' do
6
+
7
+ shared_examples_for 'a flag mapper' do
8
+
9
+ let(:flags) do
10
+ described_class.map_flags(options)
11
+ end
12
+
13
+ it 'maps allow partial results' do
14
+ expect(flags).to include(:partial)
15
+ end
16
+
17
+ it 'maps oplog replay' do
18
+ expect(flags).to include(:oplog_replay)
19
+ end
20
+
21
+ it 'maps no cursor timeout' do
22
+ expect(flags).to include(:no_cursor_timeout)
23
+ end
24
+
25
+ it 'maps tailable' do
26
+ expect(flags).to include(:tailable_cursor)
27
+ end
28
+
29
+ it 'maps await data' do
30
+ expect(flags).to include(:await_data)
31
+ end
32
+
33
+ it 'maps exhaust' do
34
+ expect(flags).to include(:exhaust)
35
+ end
36
+ end
37
+
38
+ context 'when the options are standard' do
39
+
40
+ let(:options) do
41
+ {
42
+ :allow_partial_results => true,
43
+ :oplog_replay => true,
44
+ :no_cursor_timeout => true,
45
+ :tailable => true,
46
+ :await_data => true,
47
+ :exhaust => true
48
+ }
49
+ end
50
+
51
+ it_behaves_like 'a flag mapper'
52
+ end
53
+
54
+ context 'when the options already have flags' do
55
+
56
+ let(:options) do
57
+ {
58
+ :flags => [
59
+ :partial,
60
+ :oplog_replay,
61
+ :no_cursor_timeout,
62
+ :tailable_cursor,
63
+ :await_data,
64
+ :exhaust
65
+ ]
66
+ }
67
+ end
68
+
69
+ it_behaves_like 'a flag mapper'
70
+ end
71
+
72
+ context 'when the options include tailable_await' do
73
+
74
+ let(:options) do
75
+ { :tailable_await => true }
76
+ end
77
+
78
+ let(:flags) do
79
+ described_class.map_flags(options)
80
+ end
81
+
82
+ it 'maps the await data option' do
83
+ expect(flags).to include(:await_data)
84
+ end
85
+
86
+ it 'maps the tailable option' do
87
+ expect(flags).to include(:tailable_cursor)
88
+ end
89
+ end
90
+
91
+ context 'when the options provide a cursor type' do
92
+
93
+ let(:options) do
94
+ { :cursor_type => :await_data }
95
+ end
96
+
97
+ let(:flags) do
98
+ described_class.map_flags(options)
99
+ end
100
+
101
+ it 'maps the cursor type to a flag' do
102
+ expect(flags).to include(:await_data)
103
+ end
104
+ end
105
+ end
106
+ end