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,126 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::WriteConcern do
4
+
5
+ describe '#get' do
6
+
7
+ context 'when no options are set' do
8
+
9
+ let(:options) do
10
+ { }
11
+ end
12
+
13
+ it 'returns an Acknowledged write concern object' do
14
+ expect(Mongo::WriteConcern.get(options)).to be_a(Mongo::WriteConcern::Acknowledged)
15
+ end
16
+ end
17
+
18
+ context 'when w is 0' do
19
+
20
+ context 'when no other options are provided' do
21
+
22
+ let(:options) do
23
+ { w: 0 }
24
+ end
25
+
26
+ it 'returns an Unacknowledged write concern object' do
27
+ expect(Mongo::WriteConcern.get(options)).to be_a(Mongo::WriteConcern::Unacknowledged)
28
+ end
29
+ end
30
+
31
+ context 'when j is also provided' do
32
+
33
+ context 'when j is false' do
34
+
35
+ let(:options) do
36
+ { w: 0, j: false }
37
+ end
38
+
39
+ it 'returns an Unacknowledged write concern object' do
40
+ expect(Mongo::WriteConcern.get(options)).to be_a(Mongo::WriteConcern::Unacknowledged)
41
+ end
42
+ end
43
+
44
+ context 'when j is true' do
45
+
46
+ let(:options) do
47
+ { w: 0, j: true }
48
+ end
49
+
50
+ it 'raises an exception' do
51
+ expect {
52
+ Mongo::WriteConcern.get(options)
53
+ }.to raise_error(Mongo::Error::InvalidWriteConcern)
54
+ end
55
+ end
56
+
57
+ context 'when fsync is true' do
58
+
59
+ let(:options) do
60
+ { w: 0, fsync: true }
61
+ end
62
+
63
+ it 'raises an exception' do
64
+ expect {
65
+ Mongo::WriteConcern.get(options)
66
+ }.to raise_error(Mongo::Error::InvalidWriteConcern)
67
+ end
68
+ end
69
+ end
70
+
71
+ context 'when wtimeout is also provided' do
72
+
73
+ let(:options) do
74
+ { w: 0, wimteout: 100 }
75
+ end
76
+
77
+ it 'returns an Unacknowledged write concern object' do
78
+ expect(Mongo::WriteConcern.get(options)).to be_a(Mongo::WriteConcern::Unacknowledged)
79
+ end
80
+ end
81
+ end
82
+
83
+ context 'when w is less than 0' do
84
+
85
+ let(:options) do
86
+ { w: -1 }
87
+ end
88
+
89
+ it 'raises an exception' do
90
+ expect {
91
+ Mongo::WriteConcern.get(options)
92
+ }.to raise_error(Mongo::Error::InvalidWriteConcern)
93
+ end
94
+ end
95
+
96
+ context 'when w is greater than 0' do
97
+
98
+ let(:options) do
99
+ { w: 2, journal: true }
100
+ end
101
+
102
+ it 'returns an Acknowledged write concern object' do
103
+ expect(Mongo::WriteConcern.get(options)).to be_a(Mongo::WriteConcern::Acknowledged)
104
+ end
105
+
106
+ it 'sets the options' do
107
+ expect(Mongo::WriteConcern.get(options).options).to eq(options)
108
+ end
109
+ end
110
+
111
+ context 'when w is a string' do
112
+
113
+ let(:options) do
114
+ { w: 'majority', journal: true }
115
+ end
116
+
117
+ it 'returns an Acknowledged write concern object' do
118
+ expect(Mongo::WriteConcern.get(options)).to be_a(Mongo::WriteConcern::Acknowledged)
119
+ end
120
+
121
+ it 'sets the options' do
122
+ expect(Mongo::WriteConcern.get(options).options).to eq(options)
123
+ end
124
+ end
125
+ end
126
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,22 +1,3 @@
1
- if RUBY_VERSION > '1.9' && RUBY_VERSION < '2.2'
2
- require 'simplecov'
3
- require 'coveralls'
4
-
5
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
6
- SimpleCov::Formatter::HTMLFormatter,
7
- Coveralls::SimpleCov::Formatter
8
- ]
9
-
10
- SimpleCov.start do
11
- # report groups
12
- add_group 'Wire Protocol', 'lib/mongo/protocol'
13
- # filters
14
- add_filter 'tasks'
15
- add_filter 'spec'
16
- add_filter 'bin'
17
- end
18
- end
19
-
20
1
  TEST_SET = 'ruby-driver-rs'
21
2
  COVERAGE_MIN = 90
22
3
  CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
@@ -24,6 +5,9 @@ SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/support/sdam/**/*.yml")
24
5
  SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/rtt/*.yml")
25
6
  SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/selection/**/*.yml")
26
7
  CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/support/crud_tests/**/*.yml")
8
+ COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/support/command_monitoring/**/*.yml")
9
+ CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/support/connection_string_tests/*.yml")
10
+ GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/support/gridfs_tests/*.yml")
27
11
 
28
12
  SSL_CERTS_DIR = "#{CURRENT_PATH}/support/certificates"
29
13
  CLIENT_PEM = "#{SSL_CERTS_DIR}/client.pem"
@@ -33,6 +17,9 @@ CRL_PEM = "#{SSL_CERTS_DIR}/crl.pem"
33
17
 
34
18
  require 'mongo'
35
19
 
20
+ Mongo::Logger.logger = Logger.new($stdout)
21
+ Mongo::Logger.logger.level = Logger::INFO
22
+
36
23
  require 'support/travis'
37
24
  require 'support/matchers'
38
25
  require 'support/authorization'
@@ -40,9 +27,9 @@ require 'support/server_discovery_and_monitoring'
40
27
  require 'support/server_selection_rtt'
41
28
  require 'support/server_selection'
42
29
  require 'support/crud'
43
-
44
- Mongo::Logger.logger = Logger.new($stdout)
45
- Mongo::Logger.logger.level = Logger::INFO
30
+ require 'support/command_monitoring'
31
+ require 'support/connection_string'
32
+ require 'support/gridfs'
46
33
 
47
34
  RSpec.configure do |config|
48
35
  config.color = true
@@ -57,6 +44,7 @@ RSpec.configure do |config|
57
44
  # database. This user will need to be authenticated in order to add any
58
45
  # more users to any other databases.
59
46
  ADMIN_UNAUTHORIZED_CLIENT.database.users.create(ROOT_USER)
47
+ ADMIN_UNAUTHORIZED_CLIENT.close
60
48
  rescue Exception => e
61
49
  end
62
50
  begin
@@ -67,7 +55,7 @@ RSpec.configure do |config|
67
55
  unless write_command_enabled?
68
56
  # If we are on versions less than 2.6, we need to create a user for
69
57
  # each database, since the users are not stored in the admin database
70
- # but in the system.users collection on the datbases themselves. Also,
58
+ # but in the system.users collection on the databases themselves. Also,
71
59
  # roles in versions lower than 2.6 can only be strings, not hashes.
72
60
  begin ADMIN_AUTHORIZED_TEST_CLIENT.database.users.create(TEST_READ_WRITE_USER); rescue; end
73
61
  end
@@ -131,6 +119,15 @@ def single_seed?
131
119
  ADDRESSES.size == 1
132
120
  end
133
121
 
122
+ # For instances where behaviour is different on different versions, we need to
123
+ # determine in the specs if we are 3.2 or higher.
124
+ #
125
+ # @since 2.0.0
126
+ def find_command_enabled?
127
+ $mongo_client ||= initialize_scanned_client!
128
+ $find_command_enabled ||= $mongo_client.cluster.servers.first.features.find_command_enabled?
129
+ end
130
+
134
131
  # For instances where behaviour is different on different versions, we need to
135
132
  # determine in the specs if we are 2.6 or higher.
136
133
  #
@@ -174,6 +171,15 @@ def failing_delete_doc
174
171
  { que: { field: 'test' } }
175
172
  end
176
173
 
174
+ # Try running a command on the admin database to see if the mongod was started with auth.
175
+ #
176
+ # @since 2.2.0
177
+ def auth_enabled?
178
+ $mongo_client ||= initialize_scanned_client!
179
+ begin; $mongo_client.use(:admin).command(getCmdLineOpts: 1); rescue; return true; end
180
+ false
181
+ end
182
+
177
183
  # Initializes a basic scanned client to do an ismaster check.
178
184
  #
179
185
  # @since 2.0.0
@@ -144,8 +144,7 @@ AUTHORIZED_CLIENT = Mongo::Client.new(
144
144
  # @since 2.0.0
145
145
  UNAUTHORIZED_CLIENT = Mongo::Client.new(
146
146
  ADDRESSES,
147
- TEST_OPTIONS.merge(
148
- database: TEST_DB)
147
+ TEST_OPTIONS.merge(database: TEST_DB, monitoring: false)
149
148
  )
150
149
 
151
150
  # Provides an unauthorized mongo client on the admin database, for use in
@@ -154,8 +153,7 @@ UNAUTHORIZED_CLIENT = Mongo::Client.new(
154
153
  # @since 2.0.0
155
154
  ADMIN_UNAUTHORIZED_CLIENT = Mongo::Client.new(
156
155
  ADDRESSES,
157
- TEST_OPTIONS.merge(
158
- database: Mongo::Database::ADMIN)
156
+ TEST_OPTIONS.merge(database: Mongo::Database::ADMIN, monitoring: false)
159
157
  )
160
158
 
161
159
  # Get an authorized client on the test database logged in as the admin
@@ -166,7 +164,8 @@ ADMIN_AUTHORIZED_TEST_CLIENT = ADMIN_UNAUTHORIZED_CLIENT.with(
166
164
  user: ROOT_USER.name,
167
165
  password: ROOT_USER.password,
168
166
  database: TEST_DB,
169
- auth_source: Mongo::Database::ADMIN
167
+ auth_source: Mongo::Database::ADMIN,
168
+ monitoring: false
170
169
  )
171
170
 
172
171
  module Authorization
@@ -0,0 +1,73 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful mixed bulk write"
12
+ operation:
13
+ name: "bulkWrite"
14
+ arguments:
15
+ requests:
16
+ - insertOne:
17
+ document: { _id: 4, x: 44 }
18
+ - updateOne:
19
+ filter: { _id: 3 }
20
+ update: { $set: { x: 333 } }
21
+ expectations:
22
+ -
23
+ command_started_event:
24
+ command:
25
+ insert: *collection_name
26
+ documents:
27
+ - { _id: 4, x: 44 }
28
+ ordered: true
29
+ command_name: "insert"
30
+ database_name: *database_name
31
+ -
32
+ command_succeeded_event:
33
+ reply: { ok: 1.0, n: 1 }
34
+ command_name: "insert"
35
+ -
36
+ command_started_event:
37
+ command:
38
+ update: *collection_name
39
+ updates:
40
+ - { q: {_id: 3 }, u: { $set: { x: 333 } }, upsert: false, multi: false }
41
+ ordered: true
42
+ command_name: "update"
43
+ database_name: *database_name
44
+ -
45
+ command_succeeded_event:
46
+ reply: { ok: 1.0, n: 1 }
47
+ command_name: "update"
48
+ -
49
+ description: "A successful unordered bulk write with an unacknowledged write concern"
50
+ comment: "On a 2.4 server, no GLE is sent and requires a client-side manufactored reply"
51
+ operation:
52
+ name: "bulkWrite"
53
+ arguments:
54
+ requests:
55
+ - insertOne:
56
+ document: { _id: 4, x: 44 }
57
+ ordered: false
58
+ writeConcern: { w: 0 }
59
+ expectations:
60
+ -
61
+ command_started_event:
62
+ command:
63
+ insert: *collection_name
64
+ documents:
65
+ - { _id: 4, x: 44 }
66
+ ordered: false
67
+ writeConcern: { w: 0 }
68
+ command_name: "insert"
69
+ database_name: *database_name
70
+ -
71
+ command_succeeded_event:
72
+ reply: { ok: 1.0 }
73
+ command_name: "insert"
@@ -0,0 +1,42 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+
4
+ collection_name: &collection_name "test"
5
+ database_name: &database_name "ruby-driver"
6
+
7
+ tests:
8
+ -
9
+ description: "A successful command"
10
+ operation:
11
+ name: "count"
12
+ arguments:
13
+ filter: { _id: 1 }
14
+ expectations:
15
+ -
16
+ command_started_event:
17
+ command:
18
+ count: *collection_name
19
+ query: { _id: 1 }
20
+ command_name: "count"
21
+ database_name: *database_name
22
+ -
23
+ command_succeeded_event:
24
+ reply: { ok: 1.0, n: 1 }
25
+ command_name: "count"
26
+ -
27
+ description: "A failed command event"
28
+ operation:
29
+ name: "count"
30
+ arguments:
31
+ filter: { $or: true }
32
+ expectations:
33
+ -
34
+ command_started_event:
35
+ command:
36
+ count: *collection_name
37
+ query: { $or: true }
38
+ command_name: "count"
39
+ database_name: *database_name
40
+ -
41
+ command_failed_event:
42
+ command_name: "count"
@@ -0,0 +1,55 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful delete many"
12
+ operation:
13
+ name: "deleteMany"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ expectations:
18
+ -
19
+ command_started_event:
20
+ command:
21
+ delete: *collection_name
22
+ deletes:
23
+ - { q: { _id: { $gt: 1 }}, limit: 0 }
24
+ ordered: true
25
+ command_name: "delete"
26
+ database_name: *database_name
27
+ -
28
+ command_succeeded_event:
29
+ reply: { ok: 1.0, n: 2 }
30
+ command_name: "delete"
31
+ -
32
+ description: "A successful delete many command with write errors"
33
+ operation:
34
+ name: "deleteMany"
35
+ arguments:
36
+ filter:
37
+ _id: { $nothing: 1 }
38
+ expectations:
39
+ -
40
+ command_started_event:
41
+ command:
42
+ delete: *collection_name
43
+ deletes:
44
+ - { q: { _id: { $nothing: 1 }}, limit: 0 }
45
+ ordered: true
46
+ command_name: "delete"
47
+ database_name: *database_name
48
+ -
49
+ command_succeeded_event:
50
+ reply:
51
+ ok: 1.0
52
+ n: 0
53
+ writeErrors:
54
+ - { index: 0, code: 42, errmsg: "" }
55
+ command_name: "delete"
@@ -0,0 +1,55 @@
1
+ data:
2
+ - { _id: 1, x: 11 }
3
+ - { _id: 2, x: 22 }
4
+ - { _id: 3, x: 33 }
5
+
6
+ collection_name: &collection_name "test"
7
+ database_name: &database_name "ruby-driver"
8
+
9
+ tests:
10
+ -
11
+ description: "A successful delete one"
12
+ operation:
13
+ name: "deleteOne"
14
+ arguments:
15
+ filter:
16
+ _id: { $gt: 1 }
17
+ expectations:
18
+ -
19
+ command_started_event:
20
+ command:
21
+ delete: *collection_name
22
+ deletes:
23
+ - { q: { _id: { $gt: 1 }}, limit: 1 }
24
+ ordered: true
25
+ command_name: "delete"
26
+ database_name: *database_name
27
+ -
28
+ command_succeeded_event:
29
+ reply: { ok: 1.0, n: 1 }
30
+ command_name: "delete"
31
+ -
32
+ description: "A successful delete one command with write errors"
33
+ operation:
34
+ name: "deleteOne"
35
+ arguments:
36
+ filter:
37
+ _id: { $nothing: 1 }
38
+ expectations:
39
+ -
40
+ command_started_event:
41
+ command:
42
+ delete: *collection_name
43
+ deletes:
44
+ - { q: { _id: { $nothing: 1 }}, limit: 1 }
45
+ ordered: true
46
+ command_name: "delete"
47
+ database_name: *database_name
48
+ -
49
+ command_succeeded_event:
50
+ reply:
51
+ ok: 1.0
52
+ n: 0
53
+ writeErrors:
54
+ - { index: 0, code: 42, errmsg: "" }
55
+ command_name: "delete"