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
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ def skippable?(file)
4
+ !write_command_enabled? && (file.include?('bulkWrite') || file.include?('insert'))
5
+ end
6
+
7
+ def ignore?(test)
8
+ if version = test.ignore_if_server_version_greater_than
9
+ return true if version == "3.0" && find_command_enabled?
10
+ end
11
+ if version = test.ignore_if_server_version_less_than
12
+ return true if version == "3.1" && !find_command_enabled?
13
+ end
14
+ false
15
+ end
16
+
17
+ describe 'Command Monitoring Events' do
18
+
19
+ COMMAND_MONITORING_TESTS.each do |file|
20
+
21
+ if !skippable?(file)
22
+
23
+ spec = Mongo::CommandMonitoring::Spec.new(file)
24
+
25
+ spec.tests.each do |test|
26
+
27
+ context(test.description) do
28
+
29
+ let(:subscriber) do
30
+ Mongo::CommandMonitoring::TestSubscriber.new
31
+ end
32
+
33
+ let(:monitoring) do
34
+ authorized_client.instance_variable_get(:@monitoring)
35
+ end
36
+
37
+ before do
38
+ authorized_collection.find.delete_many
39
+ authorized_client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
40
+ end
41
+
42
+ after do
43
+ monitoring.subscribers[Mongo::Monitoring::COMMAND].delete(subscriber)
44
+ authorized_collection.find.delete_many
45
+ end
46
+
47
+ test.expectations.each do |expectation|
48
+
49
+ it "generates a #{expectation.event_name} for #{expectation.command_name}", unless: ignore?(test) do
50
+ begin
51
+ test.run(authorized_collection)
52
+ event = subscriber.send(expectation.event_type)[expectation.command_name]
53
+ expect(event).to send(expectation.matcher, expectation)
54
+ rescue Mongo::Error::OperationFailure, Mongo::Error::BulkWriteError => e
55
+ event = subscriber.send(expectation.event_type)[expectation.command_name]
56
+ expect(event).to send(expectation.matcher, expectation)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'ConnectionString' do
4
+ include Mongo::ConnectionString
5
+
6
+ CONNECTION_STRING_TESTS.each do |file|
7
+
8
+ spec = Mongo::ConnectionString::Spec.new(file)
9
+
10
+ context(spec.description) do
11
+
12
+ before(:all) do
13
+
14
+ module Mongo
15
+ class Address
16
+
17
+ private
18
+
19
+ alias :original_initialize_resolver! :initialize_resolver!
20
+ def initialize_resolver!(timeout, ssl_options)
21
+ family = (host == 'localhost') ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
22
+ info = ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM)
23
+ FAMILY_MAP[info.first[4]].new(info[3], port, host)
24
+ end
25
+ end
26
+
27
+ class Server
28
+
29
+ # The constructor keeps the same API, but does not instantiate a
30
+ # monitor and run it.
31
+ alias :original_initialize :initialize
32
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
33
+ @address = address
34
+ @cluster = cluster
35
+ @monitoring = monitoring
36
+ @options = options.freeze
37
+ @monitor = Monitor.new(address, event_listeners, options)
38
+ end
39
+
40
+ # Disconnect simply needs to return true since we have no monitor and
41
+ # no connection.
42
+ alias :original_disconnect! :disconnect!
43
+ def disconnect!; true; end
44
+ end
45
+ end
46
+ end
47
+
48
+ after(:all) do
49
+
50
+ module Mongo
51
+ # Return the implementations to their originals for the other
52
+ # tests in the suite.
53
+ class Address
54
+ alias :initialize_resolver! :original_initialize_resolver!
55
+ remove_method(:original_initialize_resolver!)
56
+ end
57
+
58
+ class Server
59
+ alias :initialize :original_initialize
60
+ remove_method(:original_initialize)
61
+
62
+ alias :disconnect! :original_disconnect!
63
+ remove_method(:original_disconnect!)
64
+ end
65
+ end
66
+ end
67
+
68
+ spec.tests.each_with_index do |test, index|
69
+
70
+ context "when a #{test.description} is provided" do
71
+
72
+
73
+ context 'when the uri is invalid', unless: test.valid? do
74
+
75
+ it 'raises an error' do
76
+ expect{
77
+ test.uri
78
+ }.to raise_exception(Mongo::Error::InvalidURI)
79
+ end
80
+ end
81
+
82
+ context 'when the uri should warn', if: test.warn? do
83
+
84
+ before do
85
+ expect(Mongo::Logger.logger).to receive(:warn)
86
+ end
87
+
88
+ it 'warns' do
89
+ expect(test.client).to be_a(Mongo::Client)
90
+ end
91
+ end
92
+
93
+ context 'when the uri is valid', if: test.valid? do
94
+
95
+ it 'does not raise an exception' do
96
+ expect(test.uri).to be_a(Mongo::URI)
97
+ end
98
+
99
+ it 'creates a client with the correct hosts' do
100
+ expect(test.client).to have_hosts(test)
101
+ end
102
+
103
+ it 'creates a client with the correct authentication properties' do
104
+ expect(test.client).to match_auth(test)
105
+ end
106
+
107
+ it 'creates a client with the correct options' do
108
+ expect(test.client).to match_options(test)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,160 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Cursor::Builder::GetMoreCommand do
4
+
5
+ describe '#specification' do
6
+
7
+ let(:reply) do
8
+ Mongo::Protocol::Reply.allocate
9
+ end
10
+
11
+ let(:result) do
12
+ Mongo::Operation::Result.new(reply)
13
+ end
14
+
15
+ let(:cursor) do
16
+ Mongo::Cursor.new(view, result, authorized_primary)
17
+ end
18
+
19
+ let(:builder) do
20
+ described_class.new(cursor)
21
+ end
22
+
23
+ let(:specification) do
24
+ builder.specification
25
+ end
26
+
27
+ let(:selector) do
28
+ specification[:selector]
29
+ end
30
+
31
+ shared_examples_for 'a getmore command builder' do
32
+
33
+ it 'includes the database name' do
34
+ expect(specification[:db_name]).to eq(TEST_DB)
35
+ end
36
+
37
+ it 'includes getmore with cursor id' do
38
+ expect(selector[:getMore]).to eq(cursor.id)
39
+ end
40
+
41
+ it 'includes the collection name' do
42
+ expect(selector[:collection]).to eq(TEST_COLL)
43
+ end
44
+ end
45
+
46
+ context 'when the query is standard' do
47
+
48
+ let(:view) do
49
+ Mongo::Collection::View.new(authorized_collection)
50
+ end
51
+
52
+ it_behaves_like 'a getmore command builder'
53
+
54
+ it 'does not include max time' do
55
+ expect(selector[:maxTimeMS]).to be_nil
56
+ end
57
+
58
+ it 'does not include batch size' do
59
+ expect(selector[:batchSize]).to be_nil
60
+ end
61
+ end
62
+
63
+ context 'when the query has a batch size' do
64
+
65
+ let(:view) do
66
+ Mongo::Collection::View.new(authorized_collection, {}, batch_size: 10)
67
+ end
68
+
69
+ it_behaves_like 'a getmore command builder'
70
+
71
+ it 'does not include max time' do
72
+ expect(selector[:maxTimeMS]).to be_nil
73
+ end
74
+
75
+ it 'includes batch size' do
76
+ expect(selector[:batchSize]).to eq(10)
77
+ end
78
+ end
79
+
80
+ context 'when a max await time is specified' do
81
+
82
+ context 'when the cursor is not tailable' do
83
+
84
+ let(:view) do
85
+ Mongo::Collection::View.new(authorized_collection, {}, max_await_time_ms: 100)
86
+ end
87
+
88
+ it_behaves_like 'a getmore command builder'
89
+
90
+ it 'does not include max time' do
91
+ expect(selector[:maxTimeMS]).to be_nil
92
+ end
93
+
94
+ it 'does not include max await time' do
95
+ expect(selector[:maxAwaitTimeMS]).to be_nil
96
+ end
97
+
98
+ it 'does not include batch size' do
99
+ expect(selector[:batchSize]).to be_nil
100
+ end
101
+ end
102
+
103
+ context 'when the cursor is tailable' do
104
+
105
+ context 'when await data is true' do
106
+
107
+ let(:view) do
108
+ Mongo::Collection::View.new(
109
+ authorized_collection,
110
+ {},
111
+ await_data: true,
112
+ tailable: true,
113
+ max_await_time_ms: 100
114
+ )
115
+ end
116
+
117
+ it_behaves_like 'a getmore command builder'
118
+
119
+ it 'includes max time' do
120
+ expect(selector[:maxTimeMS]).to eq(100)
121
+ end
122
+
123
+ it 'does not include max await time' do
124
+ expect(selector[:maxAwaitTimeMS]).to be_nil
125
+ end
126
+
127
+ it 'does not include batch size' do
128
+ expect(selector[:batchSize]).to be_nil
129
+ end
130
+ end
131
+
132
+ context 'when await data is false' do
133
+
134
+ let(:view) do
135
+ Mongo::Collection::View.new(
136
+ authorized_collection,
137
+ {},
138
+ tailable: true,
139
+ max_await_time_ms: 100
140
+ )
141
+ end
142
+
143
+ it_behaves_like 'a getmore command builder'
144
+
145
+ it 'does not include max time' do
146
+ expect(selector[:maxTimeMS]).to be_nil
147
+ end
148
+
149
+ it 'does not include max await time' do
150
+ expect(selector[:maxAwaitTimeMS]).to be_nil
151
+ end
152
+
153
+ it 'does not include batch size' do
154
+ expect(selector[:batchSize]).to be_nil
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Cursor::Builder::OpGetMore do
4
+
5
+ describe '#specification' do
6
+
7
+ let(:reply) do
8
+ Mongo::Protocol::Reply.allocate
9
+ end
10
+
11
+ let(:result) do
12
+ Mongo::Operation::Result.new(reply)
13
+ end
14
+
15
+ let(:view) do
16
+ Mongo::Collection::View.new(
17
+ authorized_collection,
18
+ {},
19
+ tailable: true,
20
+ max_time_ms: 100
21
+ )
22
+ end
23
+
24
+ let(:cursor) do
25
+ Mongo::Cursor.new(view, result, authorized_primary)
26
+ end
27
+
28
+ let(:builder) do
29
+ described_class.new(cursor)
30
+ end
31
+
32
+ let(:specification) do
33
+ builder.specification
34
+ end
35
+
36
+ it 'includes to return' do
37
+ expect(specification[:to_return]).to eq(0)
38
+ end
39
+
40
+ it 'includes the cursor id' do
41
+ expect(specification[:cursor_id]).to eq(cursor.id)
42
+ end
43
+
44
+ it 'includes the database name' do
45
+ expect(specification[:db_name]).to eq(TEST_DB)
46
+ end
47
+
48
+ it 'includes the collection name' do
49
+ expect(specification[:coll_name]).to eq(TEST_COLL)
50
+ end
51
+ end
52
+ end
@@ -4,12 +4,16 @@ describe Mongo::Cursor do
4
4
 
5
5
  describe '#each' do
6
6
 
7
+ let(:server) do
8
+ view.read.select_server(authorized_client.cluster)
9
+ end
10
+
7
11
  let(:reply) do
8
- Mongo::Operation::Read::Query.new(query_spec).execute(authorized_primary.context)
12
+ view.send(:send_initial_query, server)
9
13
  end
10
14
 
11
15
  let(:cursor) do
12
- described_class.new(view, reply, authorized_primary)
16
+ described_class.new(view, reply, server)
13
17
  end
14
18
 
15
19
  context 'when no options are provided to the view' do
@@ -18,10 +22,6 @@ describe Mongo::Cursor do
18
22
  Mongo::Collection::View.new(authorized_collection)
19
23
  end
20
24
 
21
- let(:query_spec) do
22
- { :selector => {}, :options => {}, :db_name => TEST_DB, :coll_name => TEST_COLL }
23
- end
24
-
25
25
  context 'when the initial query retieves all documents' do
26
26
 
27
27
  let(:documents) do
@@ -97,15 +97,6 @@ describe Mongo::Cursor do
97
97
  Mongo::Collection::View.new(authorized_collection, {}, :limit => 2)
98
98
  end
99
99
 
100
- let(:query_spec) do
101
- {
102
- :selector => {},
103
- :options => { :limit => 2 },
104
- :db_name => TEST_DB,
105
- :coll_name => TEST_COLL
106
- }
107
- end
108
-
109
100
  it 'returns the correct amount' do
110
101
  expect(cursor.to_a.count).to eq(2)
111
102
  end
@@ -123,17 +114,12 @@ describe Mongo::Cursor do
123
114
  Mongo::Collection::View.new(authorized_collection, {}, :limit => -2)
124
115
  end
125
116
 
126
- let(:query_spec) do
127
- {
128
- :selector => {},
129
- :options => { :limit => -2 },
130
- :db_name => TEST_DB,
131
- :coll_name => TEST_COLL
132
- }
117
+ it 'returns the positive number of documents', unless: find_command_enabled? do
118
+ expect(cursor.to_a.count).to eq(2)
133
119
  end
134
120
 
135
- it 'returns the positive number of documents' do
136
- expect(cursor.to_a.count).to eq(2)
121
+ it 'returns all documents', if: find_command_enabled? do
122
+ expect(cursor.to_a.count).to eq(10)
137
123
  end
138
124
 
139
125
  it 'iterates the documents' do
@@ -149,15 +135,6 @@ describe Mongo::Cursor do
149
135
  Mongo::Collection::View.new(authorized_collection, {}, :limit => 0)
150
136
  end
151
137
 
152
- let(:query_spec) do
153
- {
154
- :selector => {},
155
- :options => { :limit => 0 },
156
- :db_name => TEST_DB,
157
- :coll_name => TEST_COLL
158
- }
159
- end
160
-
161
138
  it 'returns all documents' do
162
139
  expect(cursor.to_a.count).to eq(10)
163
140
  end
@@ -182,15 +159,6 @@ describe Mongo::Cursor do
182
159
  )
183
160
  end
184
161
 
185
- let(:query_spec) do
186
- {
187
- :selector => {},
188
- :options => { :limit => 5, :batch_size => 3 },
189
- :db_name => TEST_DB,
190
- :coll_name => TEST_COLL
191
- }
192
- end
193
-
194
162
  it 'returns the limited number of documents' do
195
163
  expect(cursor.to_a.count).to eq(5)
196
164
  end
@@ -212,15 +180,6 @@ describe Mongo::Cursor do
212
180
  )
213
181
  end
214
182
 
215
- let(:query_spec) do
216
- {
217
- :selector => {},
218
- :options => { :limit => 5, :batch_size => 7 },
219
- :db_name => TEST_DB,
220
- :coll_name => TEST_COLL
221
- }
222
- end
223
-
224
183
  it 'returns the limited number of documents' do
225
184
  expect(cursor.to_a.count).to eq(5)
226
185
  end
@@ -242,15 +201,6 @@ describe Mongo::Cursor do
242
201
  )
243
202
  end
244
203
 
245
- let(:query_spec) do
246
- {
247
- :selector => {},
248
- :options => { :limit => 5, :batch_size => 5 },
249
- :db_name => TEST_DB,
250
- :coll_name => TEST_COLL
251
- }
252
- end
253
-
254
204
  it 'returns the limited number of documents' do
255
205
  expect(cursor.to_a.count).to eq(5)
256
206
  end
@@ -93,6 +93,26 @@ describe Mongo::Database do
93
93
  expect(database.collection_names(batch_size: 1).to_a).to include('users')
94
94
  end
95
95
  end
96
+
97
+ context 'when there are more collections than the initial batch size' do
98
+
99
+ before do
100
+ 2.times do |i|
101
+ database["#{i}_dalmatians"].create
102
+ end
103
+ end
104
+
105
+ after do
106
+ 2.times do |i|
107
+ database["#{i}_dalmatians"].drop
108
+ end
109
+ end
110
+
111
+ it 'returns all collections' do
112
+ expect(database.collection_names(batch_size: 1).select { |c| c =~ /dalmatians/}.size).to eq(2)
113
+ end
114
+
115
+ end
96
116
  end
97
117
 
98
118
  describe '#list_collections' do
@@ -160,7 +180,7 @@ describe Mongo::Database do
160
180
  end
161
181
  end
162
182
 
163
- context 'when the user is not authorized', unless: sharded? do
183
+ context 'when the user is not authorized', if: auth_enabled? do
164
184
 
165
185
  let(:database) do
166
186
  described_class.new(unauthorized_client, TEST_DB)
@@ -184,6 +204,27 @@ describe Mongo::Database do
184
204
  expect(database.command(:ismaster => 1).written_count).to eq(0)
185
205
  end
186
206
 
207
+ context 'when a read concern is provided', if: find_command_enabled? do
208
+
209
+ context 'when the read concern is valid' do
210
+
211
+ it 'sends the read concern' do
212
+ expect {
213
+ database.command(:ismaster => 1, readConcern: { level: 'local' })
214
+ }.to_not raise_error
215
+ end
216
+ end
217
+
218
+ context 'when the read concern is not valid' do
219
+
220
+ it 'raises an exception', if: (find_command_enabled? && !sharded?) do
221
+ expect {
222
+ database.command(:ismaster => 1, readConcern: { level: 'yay' })
223
+ }.to raise_error(Mongo::Error::OperationFailure)
224
+ end
225
+ end
226
+ end
227
+
187
228
  context 'when an alternate read preference is specified' do
188
229
 
189
230
  before do
@@ -195,7 +236,7 @@ describe Mongo::Database do
195
236
  end
196
237
 
197
238
  let(:client) do
198
- authorized_client.with(server_selection_timeout: 2)
239
+ authorized_client.with(server_selection_timeout: 0.1)
199
240
  end
200
241
 
201
242
  let(:database) do
@@ -208,6 +249,18 @@ describe Mongo::Database do
208
249
  end.to raise_error(Mongo::Error::NoServerAvailable)
209
250
  end
210
251
  end
252
+
253
+ context 'when there is a read preference set on the client' do
254
+
255
+ let(:database) do
256
+ described_class.new(authorized_client.with(read: { mode: :secondary }), TEST_DB)
257
+ end
258
+
259
+ it 'does not use the read preference' do
260
+ expect(database.client.cluster).to receive(:next_primary).and_call_original
261
+ database.command(ping: 1)
262
+ end
263
+ end
211
264
  end
212
265
 
213
266
  describe '#drop' do
@@ -278,7 +331,7 @@ describe Mongo::Database do
278
331
  shared_context 'a GridFS database' do
279
332
 
280
333
  it 'returns a Grid::FS for the db' do
281
- expect(fs).to be_a(Mongo::Grid::FS)
334
+ expect(fs).to be_a(Mongo::Grid::FSBucket)
282
335
  end
283
336
 
284
337
  context 'when operating on the fs' do
@@ -292,8 +345,8 @@ describe Mongo::Database do
292
345
  end
293
346
 
294
347
  after do
295
- fs.files_collection.find.delete_many
296
- fs.chunks_collection.find.delete_many
348
+ fs.files_collection.delete_many
349
+ fs.chunks_collection.delete_many
297
350
  end
298
351
 
299
352
  let(:from_db) do
@@ -301,7 +354,7 @@ describe Mongo::Database do
301
354
  end
302
355
 
303
356
  it 'returns the assembled file from the db' do
304
- expect(from_db.filename).to eq(file.metadata.filename)
357
+ expect(from_db.filename).to eq(file.info.filename)
305
358
  end
306
359
  end
307
360
  end
@@ -317,15 +370,31 @@ describe Mongo::Database do
317
370
 
318
371
  context 'when a custom prefix is provided' do
319
372
 
320
- let(:fs) do
321
- database.fs(:fs_name => 'grid')
322
- end
373
+ context 'when the option is fs_name' do
323
374
 
324
- it 'sets the custom prefix' do
325
- expect(fs.prefix).to eq('grid')
375
+ let(:fs) do
376
+ database.fs(:fs_name => 'grid')
377
+ end
378
+
379
+ it 'sets the custom prefix' do
380
+ expect(fs.prefix).to eq('grid')
381
+ end
382
+
383
+ it_behaves_like 'a GridFS database'
326
384
  end
327
385
 
328
- it_behaves_like 'a GridFS database'
386
+ context 'when the option is bucket_name' do
387
+
388
+ let(:fs) do
389
+ database.fs(:bucket_name => 'grid')
390
+ end
391
+
392
+ it 'sets the custom prefix' do
393
+ expect(fs.prefix).to eq('grid')
394
+ end
395
+
396
+ it_behaves_like 'a GridFS database'
397
+ end
329
398
  end
330
399
  end
331
400
  end
@@ -69,7 +69,7 @@ describe Mongo::DBRef do
69
69
  end
70
70
 
71
71
  it 'converts the underlying document to bson' do
72
- expect(dbref.to_bson).to eq(dbref.as_json.to_bson)
72
+ expect(dbref.to_bson.to_s).to eq(dbref.as_json.to_bson.to_s)
73
73
  end
74
74
  end
75
75
 
@@ -100,12 +100,12 @@ describe Mongo::DBRef do
100
100
 
101
101
  describe '#from_bson' do
102
102
 
103
- let(:bson) do
104
- StringIO.new(dbref.to_bson)
103
+ let(:buffer) do
104
+ dbref.to_bson
105
105
  end
106
106
 
107
107
  let(:decoded) do
108
- BSON::Document.from_bson(bson)
108
+ BSON::Document.from_bson(BSON::ByteBuffer.new(buffer.to_s))
109
109
  end
110
110
 
111
111
  context 'when a database exists' do