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,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Grid::FSBucket::Stream do
4
+
5
+ let(:fs) do
6
+ authorized_client.database.fs
7
+ end
8
+
9
+ describe '.get' do
10
+
11
+ let(:stream) do
12
+ described_class.get(fs, mode)
13
+ end
14
+
15
+ context 'when mode is read' do
16
+
17
+ let(:mode) do
18
+ Mongo::Grid::FSBucket::Stream::READ_MODE
19
+ end
20
+
21
+ it 'returns a Stream::Read object' do
22
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Read)
23
+ end
24
+ end
25
+
26
+ context 'when mode is write' do
27
+
28
+ let(:mode) do
29
+ Mongo::Grid::FSBucket::Stream::WRITE_MODE
30
+ end
31
+
32
+ it 'returns a Stream::Write object' do
33
+ expect(stream).to be_a(Mongo::Grid::FSBucket::Stream::Write)
34
+ end
35
+
36
+ context 'when options are provided' do
37
+
38
+ let(:stream) do
39
+ described_class.get(fs, mode, chunk_size: 100)
40
+ end
41
+
42
+ it 'sets the options on the stream object' do
43
+ expect(stream.options[:chunk_size]).to eq(100)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'GridFS' do
4
+ include Mongo::GridFS
5
+
6
+ GRIDFS_TESTS.each do |file|
7
+
8
+ spec = Mongo::GridFS::Spec.new(file)
9
+
10
+ context(spec.description) do
11
+
12
+ spec.tests.each do |test|
13
+
14
+ context(test.description) do
15
+
16
+ after do
17
+ fs.files_collection.delete_many
18
+ fs.chunks_collection.delete_many
19
+ test.expected_files_collection.delete_many
20
+ test.expected_chunks_collection.delete_many
21
+ end
22
+
23
+ let!(:result) do
24
+ test.run(fs)
25
+ end
26
+
27
+ let(:fs) do
28
+ authorized_collection.database.fs
29
+ end
30
+
31
+ it "raises the correct error", if: test.error? do
32
+ expect(result).to match_error(test.expected_error)
33
+ end
34
+
35
+ it 'completes successfully', unless: test.error? do
36
+ expect(result).to completes_successfully(test)
37
+ end
38
+
39
+ it 'has the correct documents in the files collection', if: test.assert_data? do
40
+ expect(fs.files_collection).to match_files_collection(test.expected_files_collection)
41
+ end
42
+
43
+ it 'has the correct documents in the chunks collection', if: test.assert_data? do
44
+ expect(fs.chunks_collection).to match_chunks_collection(test.expected_chunks_collection)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -196,6 +196,47 @@ describe Mongo::Index::View do
196
196
  expect(view.get('random_name')).to_not be_nil
197
197
  end
198
198
  end
199
+
200
+ context 'when providing an invalid partial index filter', if: find_command_enabled? do
201
+
202
+ it 'raises an exception' do
203
+ expect {
204
+ view.create_one({'x' => 1}, partial_filter_expression: 5)
205
+ }.to raise_error(Mongo::Error::OperationFailure)
206
+ end
207
+ end
208
+
209
+ context 'when providing a valid partial index filter', if: find_command_enabled? do
210
+
211
+ let(:expression) do
212
+ {'a' => {'$lte' => 1.5}}
213
+ end
214
+
215
+ let!(:result) do
216
+ view.create_one({'x' => 1}, partial_filter_expression: expression)
217
+ end
218
+
219
+ let(:indexes) do
220
+ authorized_collection.indexes.get('x_1')
221
+ end
222
+
223
+ after do
224
+ view.drop_one('x_1')
225
+ end
226
+
227
+ it 'returns ok' do
228
+ expect(result).to be_successful
229
+ end
230
+
231
+ it 'creates an index' do
232
+ expect(indexes).to_not be_nil
233
+ end
234
+
235
+ it 'passes partialFilterExpression correctly' do
236
+ expect(indexes[:partialFilterExpression]).to eq(expression)
237
+ end
238
+
239
+ end
199
240
  end
200
241
 
201
242
  describe '#get' do
@@ -6,38 +6,6 @@ describe Mongo::Logger do
6
6
  described_class.logger
7
7
  end
8
8
 
9
- describe '.debug' do
10
-
11
- it 'logs a debug message' do
12
- expect(logger).to receive(:debug).with("mongo.query | message | runtime: 10ms")
13
- described_class.debug('mongo.query', 'message', '10ms')
14
- end
15
- end
16
-
17
- describe '.error' do
18
-
19
- it 'logs a error message' do
20
- expect(logger).to receive(:error).with("mongo.query | message | runtime: 10ms")
21
- described_class.error('mongo.query', 'message', '10ms')
22
- end
23
- end
24
-
25
- describe '.fatal' do
26
-
27
- it 'logs a fatal message' do
28
- expect(logger).to receive(:fatal).with("mongo.query | message | runtime: 10ms")
29
- described_class.fatal('mongo.query', 'message', '10ms')
30
- end
31
- end
32
-
33
- describe '.info' do
34
-
35
- it 'logs a info message' do
36
- expect(logger).to receive(:info).with("mongo.query | message | runtime: 10ms")
37
- described_class.info('mongo.query', 'message', '10ms')
38
- end
39
- end
40
-
41
9
  describe '.logger' do
42
10
 
43
11
  context 'when no logger has been set' do
@@ -86,12 +54,4 @@ describe Mongo::Logger do
86
54
  end
87
55
  end
88
56
  end
89
-
90
- describe '.warn' do
91
-
92
- it 'logs a warn message' do
93
- expect(logger).to receive(:warn).with("mongo.query | message | runtime: 10ms")
94
- described_class.warn('mongo.query', 'message', '10ms')
95
- end
96
- end
97
57
  end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::CommandLogSubscriber do
4
+
5
+ describe '#started' do
6
+
7
+ let(:filter) do
8
+ (1...100).reduce({}) do |hash, i|
9
+ hash[i] = i
10
+ hash
11
+ end
12
+ end
13
+
14
+ let(:command) do
15
+ { find: 'users', filter: filter }
16
+ end
17
+
18
+ let(:event) do
19
+ Mongo::Monitoring::Event::CommandStarted.new(
20
+ 'find',
21
+ 'users',
22
+ Mongo::Address.new('127.0.0.1:27017'),
23
+ 12345,
24
+ 67890,
25
+ command
26
+ )
27
+ end
28
+
29
+ before do
30
+ Mongo::Logger.level = Logger::DEBUG
31
+ end
32
+
33
+ after do
34
+ Mongo::Logger.level = Logger::INFO
35
+ end
36
+
37
+ context 'when truncating the logs' do
38
+
39
+ context 'when no option is provided' do
40
+
41
+ let(:subscriber) do
42
+ described_class.new
43
+ end
44
+
45
+ it 'truncates the logs at 250 characters' do
46
+ expect(subscriber).to receive(:truncate).with(command).and_call_original
47
+ subscriber.started(event)
48
+ end
49
+ end
50
+
51
+ context 'when true option is provided' do
52
+
53
+ let(:subscriber) do
54
+ described_class.new(truncate_logs: true)
55
+ end
56
+
57
+ it 'truncates the logs at 250 characters' do
58
+ expect(subscriber).to receive(:truncate).with(command).and_call_original
59
+ subscriber.started(event)
60
+ end
61
+ end
62
+ end
63
+
64
+ context 'when not truncating the logs' do
65
+
66
+ let(:subscriber) do
67
+ described_class.new(truncate_logs: false)
68
+ end
69
+
70
+ it 'does not truncate the logs' do
71
+ expect(subscriber).to_not receive(:truncate)
72
+ subscriber.started(event)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::Event::CommandStarted do
4
+
5
+ describe '#initialize' do
6
+
7
+ let(:address) do
8
+ Mongo::Address.new('127.0.0.1:27017')
9
+ end
10
+
11
+ let(:command) do
12
+ BSON::Document.new(test: 'value')
13
+ end
14
+
15
+ context 'when the command should be redacted' do
16
+
17
+ let(:event) do
18
+ described_class.new('copydb', 'admin', address, 1, 2, command)
19
+ end
20
+
21
+ it 'sets the command to an empty document' do
22
+ expect(event.command).to be_empty
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::Event::CommandSucceeded do
4
+
5
+ describe '#initialize' do
6
+
7
+ let(:address) do
8
+ Mongo::Address.new('127.0.0.1:27017')
9
+ end
10
+
11
+ let(:reply) do
12
+ BSON::Document.new(test: 'value')
13
+ end
14
+
15
+ context 'when the reply should be redacted' do
16
+
17
+ let(:event) do
18
+ described_class.new('copydb', 'admin', address, 1, 2, reply, 0.5)
19
+ end
20
+
21
+ it 'sets the reply to an empty document' do
22
+ expect(event.reply).to be_empty
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Monitoring::Event::Secure do
4
+
5
+ let(:document) do
6
+ BSON::Document.new(test: 'value')
7
+ end
8
+
9
+ let(:klass) do
10
+ Class.new do
11
+ include Mongo::Monitoring::Event::Secure
12
+ end
13
+ end
14
+
15
+ describe '#redacted' do
16
+
17
+ let(:secure) do
18
+ klass.new
19
+ end
20
+
21
+ context 'when the command must be redacted' do
22
+
23
+ context 'when the command name is a string' do
24
+
25
+ let(:redacted) do
26
+ secure.redacted('saslStart', document)
27
+ end
28
+
29
+ it 'returns an empty document' do
30
+ expect(redacted).to be_empty
31
+ end
32
+ end
33
+
34
+ context 'when the command name is a symbol' do
35
+
36
+ let(:redacted) do
37
+ secure.redacted(:saslStart, document)
38
+ end
39
+
40
+ it 'returns an empty document' do
41
+ expect(redacted).to be_empty
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'when the command is not in the redacted list' do
47
+
48
+ let(:redacted) do
49
+ secure.redacted(:find, document)
50
+ end
51
+
52
+ it 'returns the document' do
53
+ expect(redacted).to eq(document)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::Aggregate::Result do
3
+ describe Mongo::Operation::Commands::Aggregate::Result do
4
4
 
5
5
  let(:result) do
6
6
  described_class.new(reply)
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Commands::Aggregate do
4
+ include_context 'operation'
5
+
6
+ let(:selector) do
7
+ { :aggregate => coll_name,
8
+ :pipeline => [],
9
+ }
10
+ end
11
+ let(:spec) do
12
+ { :selector => selector,
13
+ :options => {},
14
+ :db_name => db_name
15
+ }
16
+ end
17
+ let(:op) { described_class.new(spec) }
18
+
19
+
20
+ describe '#initialize' do
21
+
22
+ context 'spec' do
23
+
24
+ it 'sets the spec' do
25
+ expect(op.spec).to be(spec)
26
+ end
27
+ end
28
+ end
29
+
30
+ describe '#==' do
31
+
32
+ context ' when two ops have different specs' do
33
+ let(:other_selector) do
34
+ { :aggregate => 'another_test_coll',
35
+ :pipeline => [],
36
+ }
37
+ end
38
+ let(:other_spec) do
39
+ { :selector => other_selector,
40
+ :options => options,
41
+ :db_name => db_name,
42
+ }
43
+ end
44
+ let(:other) { described_class.new(other_spec) }
45
+
46
+ it 'returns false' do
47
+ expect(op).not_to eq(other)
48
+ end
49
+ end
50
+ end
51
+
52
+ describe '#execute' do
53
+
54
+ context 'when the aggregation fails' do
55
+
56
+ let(:selector) do
57
+ { :aggregate => coll_name,
58
+ :pipeline => [{ '$invalid' => 'operator' }],
59
+ }
60
+ end
61
+
62
+ it 'raises an exception' do
63
+ expect {
64
+ op.execute(authorized_primary.context)
65
+ }.to raise_error(Mongo::Error::OperationFailure)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::Read::CollectionsInfo do
3
+ describe Mongo::Operation::Commands::CollectionsInfo do
4
4
 
5
5
  let(:spec) do
6
6
  { :db_name => TEST_DB }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::Command do
3
+ describe Mongo::Operation::Commands::Command do
4
4
 
5
5
  let(:selector) { { :ismaster => 1 } }
6
6
  let(:options) { { :limit => -1 } }
@@ -38,24 +38,6 @@ describe Mongo::Operation::Command do
38
38
  end
39
39
  end
40
40
 
41
- context '#merge' do
42
-
43
- let(:other_op) { described_class.new(spec) }
44
-
45
- it 'raises an exception' do
46
- expect{ op.merge(other_op) }.to raise_exception
47
- end
48
- end
49
-
50
- context '#merge!' do
51
-
52
- let(:other_op) { described_class.new(spec) }
53
-
54
- it 'raises an exception' do
55
- expect{ op.merge!(other_op) }.to raise_exception
56
- end
57
- end
58
-
59
41
  describe '#execute' do
60
42
 
61
43
  context 'when the command succeeds' do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::Read::Indexes do
3
+ describe Mongo::Operation::Commands::Indexes do
4
4
 
5
5
  describe '#execute' do
6
6
 
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mongo::Operation::MapReduce do
3
+ describe Mongo::Operation::Commands::MapReduce do
4
4
 
5
5
  let(:map) do
6
6
  %Q{
@@ -77,24 +77,6 @@ describe Mongo::Operation::MapReduce do
77
77
  end
78
78
  end
79
79
 
80
- describe '#merge' do
81
-
82
- let(:other_op) { described_class.new(spec) }
83
-
84
- it 'is not allowed' do
85
- expect{ op.merge(other_op) }.to raise_exception
86
- end
87
- end
88
-
89
- describe '#merge!' do
90
-
91
- let(:other_op) { described_class.new(spec) }
92
-
93
- it 'is not allowed' do
94
- expect{ op.merge!(other_op) }.to raise_exception
95
- end
96
- end
97
-
98
80
  describe '#execute' do
99
81
 
100
82
  let(:documents) do
@@ -27,28 +27,12 @@ describe Mongo::Operation::KillCursors do
27
27
  end
28
28
  end
29
29
 
30
- context '#merge' do
31
- let(:other_op) { described_class.new(spec) }
32
-
33
- it 'is not allowed' do
34
- expect{ op.merge(other_op) }.to raise_exception
35
- end
36
- end
37
-
38
- context '#merge!' do
39
- let(:other_op) { described_class.new(spec) }
40
-
41
- it 'is not allowed' do
42
- expect{ op.merge!(other_op) }.to raise_exception
43
- end
44
- end
45
-
46
30
  describe '#execute' do
47
31
 
48
32
  context 'message' do
49
33
 
50
34
  it 'creates a kill cursors wire protocol message with correct specs' do
51
- expect(Mongo::Protocol::KillCursors).to receive(:new) do |ids|
35
+ expect(Mongo::Protocol::KillCursors).to receive(:new) do |collection, database, ids|
52
36
  expect(ids).to eq(spec[:cursor_ids])
53
37
  end
54
38
  op.execute(primary_context)
@@ -39,22 +39,6 @@ describe Mongo::Operation::Read::GetMore do
39
39
  end
40
40
  end
41
41
 
42
- context '#merge' do
43
- let(:other_op) { described_class.new(spec) }
44
-
45
- it 'is not allowed' do
46
- expect{ op.merge(other_op) }.to raise_exception
47
- end
48
- end
49
-
50
- context '#merge!' do
51
- let(:other_op) { described_class.new(spec) }
52
-
53
- it 'is not allowed' do
54
- expect{ op.merge!(other_op) }.to raise_exception
55
- end
56
- end
57
-
58
42
  describe '#execute' do
59
43
 
60
44
  context 'message' do
@@ -42,22 +42,6 @@ describe Mongo::Operation::Read::Query do
42
42
  end
43
43
  end
44
44
 
45
- context '#merge' do
46
- let(:other_op) { described_class.new(spec) }
47
-
48
- it 'is not allowed' do
49
- expect{ op.merge(other_op) }.to raise_exception
50
- end
51
- end
52
-
53
- context '#merge!' do
54
- let(:other_op) { described_class.new(spec) }
55
-
56
- it 'is not allowed' do
57
- expect{ op.merge!(other_op) }.to raise_exception
58
- end
59
- end
60
-
61
45
  describe '#message' do
62
46
 
63
47
  let(:query_options) do
@@ -98,6 +82,25 @@ describe Mongo::Operation::Read::Query do
98
82
  op.execute(primary_context)
99
83
  end
100
84
  end
85
+
86
+ context "when the document contains an 'ok' field" do
87
+
88
+ before do
89
+ authorized_collection.insert_one(ok: false)
90
+ end
91
+
92
+ after do
93
+ authorized_collection.delete_many
94
+ end
95
+
96
+ let(:context) do
97
+ authorized_client.cluster.next_primary.context
98
+ end
99
+
100
+ it 'does not raise an exception' do
101
+ expect(op.execute(context)).to be_a(Mongo::Operation::Read::Query::Result)
102
+ end
103
+ end
101
104
  end
102
105
  end
103
106