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,350 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Options::Redacted do
4
+
5
+ let(:options) do
6
+ described_class.new(original_opts)
7
+ end
8
+
9
+ describe '#to_s' do
10
+
11
+ context 'when the hash contains a sensitive key' do
12
+
13
+ let(:original_opts) do
14
+ { password: 'sensitive_data' }
15
+ end
16
+
17
+ it 'replaces the value with the redacted string' do
18
+ expect(options.to_s).not_to match(original_opts[:password])
19
+ end
20
+
21
+ it 'replaces the value with the redacted string' do
22
+ expect(options.to_s).to match(Mongo::Options::Redacted::STRING_REPLACEMENT)
23
+ end
24
+ end
25
+
26
+ context 'when the hash does not contain a sensitive key' do
27
+
28
+ let(:original_opts) do
29
+ { user: 'emily' }
30
+ end
31
+
32
+ it 'prints all the values' do
33
+ expect(options.to_s).to match(original_opts[:user])
34
+ end
35
+ end
36
+ end
37
+
38
+ describe '#inspect' do
39
+
40
+ context 'when the hash contains a sensitive key' do
41
+
42
+ let(:original_opts) do
43
+ { password: 'sensitive_data' }
44
+ end
45
+
46
+ it 'replaces the value with the redacted string' do
47
+ expect(options.inspect).not_to match(original_opts[:password])
48
+ end
49
+
50
+ it 'replaces the value with the redacted string' do
51
+ expect(options.inspect).to match(Mongo::Options::Redacted::STRING_REPLACEMENT)
52
+ end
53
+ end
54
+
55
+ context 'when the hash does not contain a sensitive key' do
56
+
57
+ let(:original_opts) do
58
+ { name: 'some_name' }
59
+ end
60
+
61
+ it 'does not replace the value with the redacted string' do
62
+ expect(options.inspect).to match(original_opts[:name])
63
+ end
64
+
65
+ it 'does not replace the value with the redacted string' do
66
+ expect(options.inspect).not_to match(Mongo::Options::Redacted::STRING_REPLACEMENT)
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#has_key?' do
72
+
73
+ context 'when the original key is a String' do
74
+
75
+ let(:original_opts) do
76
+ { 'name' => 'Emily' }
77
+ end
78
+
79
+ context 'when the method argument is a String' do
80
+
81
+ it 'returns true' do
82
+ expect(options.has_key?('name')).to be(true)
83
+ end
84
+ end
85
+
86
+ context 'when method argument is a Symbol' do
87
+
88
+ it 'returns true' do
89
+ expect(options.has_key?(:name)).to be(true)
90
+ end
91
+ end
92
+ end
93
+
94
+ context 'when the original key is a Symbol' do
95
+
96
+ let(:original_opts) do
97
+ { name: 'Emily' }
98
+ end
99
+
100
+ context 'when the method argument is a String' do
101
+
102
+ it 'returns true' do
103
+ expect(options.has_key?('name')).to be(true)
104
+ end
105
+ end
106
+
107
+ context 'when method argument is a Symbol' do
108
+
109
+ it 'returns true' do
110
+ expect(options.has_key?(:name)).to be(true)
111
+ end
112
+ end
113
+ end
114
+
115
+ context 'when the hash does not contain the key' do
116
+
117
+ let(:original_opts) do
118
+ { other: 'Emily' }
119
+ end
120
+
121
+ context 'when the method argument is a String' do
122
+
123
+ it 'returns false' do
124
+ expect(options.has_key?('name')).to be(false)
125
+ end
126
+ end
127
+
128
+ context 'when method argument is a Symbol' do
129
+
130
+ it 'returns false' do
131
+ expect(options.has_key?(:name)).to be(false)
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ describe '#reject' do
138
+
139
+ let(:options) do
140
+ described_class.new(a: 1, b: 2, c: 3)
141
+ end
142
+
143
+ context 'when no block is provided' do
144
+
145
+ it 'returns an enumerable' do
146
+ expect(options.reject).to be_a(Enumerator)
147
+ end
148
+ end
149
+
150
+ context 'when a block is provided' do
151
+
152
+ context 'when the block evaluates to true for some pairs' do
153
+
154
+ let(:result) do
155
+ options.reject { |k,v| k == 'a' }
156
+ end
157
+
158
+ it 'returns an object consisting of only the remaining pairs' do
159
+ expect(result).to eq(described_class.new(b: 2, c: 3))
160
+ end
161
+
162
+ it 'returns a new object' do
163
+ expect(result).not_to be(options)
164
+ end
165
+ end
166
+
167
+ context 'when the block does not evaluate to true for any pairs' do
168
+
169
+ let(:result) do
170
+ options.reject { |k,v| k == 'd' }
171
+ end
172
+
173
+ it 'returns an object with all pairs intact' do
174
+ expect(result).to eq(described_class.new(a: 1, b: 2, c: 3))
175
+ end
176
+
177
+ it 'returns a new object' do
178
+ expect(result).not_to be(options)
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ describe '#reject!' do
185
+
186
+ let(:options) do
187
+ described_class.new(a: 1, b: 2, c: 3)
188
+ end
189
+
190
+ context 'when no block is provided' do
191
+
192
+ it 'returns an enumerable' do
193
+ expect(options.reject).to be_a(Enumerator)
194
+ end
195
+ end
196
+
197
+ context 'when a block is provided' do
198
+
199
+ context 'when the block evaluates to true for some pairs' do
200
+
201
+ let(:result) do
202
+ options.reject! { |k,v| k == 'a' }
203
+ end
204
+
205
+ it 'returns an object consisting of only the remaining pairs' do
206
+ expect(result).to eq(described_class.new(b: 2, c: 3))
207
+ end
208
+
209
+ it 'returns the same object' do
210
+ expect(result).to be(options)
211
+ end
212
+ end
213
+
214
+ context 'when the block does not evaluate to true for any pairs' do
215
+
216
+ let(:result) do
217
+ options.reject! { |k,v| k == 'd' }
218
+ end
219
+
220
+ it 'returns nil' do
221
+ expect(result).to be(nil)
222
+ end
223
+ end
224
+ end
225
+ end
226
+
227
+ describe '#select' do
228
+
229
+ let(:options) do
230
+ described_class.new(a: 1, b: 2, c: 3)
231
+ end
232
+
233
+ context 'when no block is provided' do
234
+
235
+ it 'returns an enumerable' do
236
+ expect(options.reject).to be_a(Enumerator)
237
+ end
238
+ end
239
+
240
+ context 'when a block is provided' do
241
+
242
+ context 'when the block evaluates to true for some pairs' do
243
+
244
+ let(:result) do
245
+ options.select { |k,v| k == 'a' }
246
+ end
247
+
248
+ it 'returns an object consisting of those pairs' do
249
+ expect(result).to eq(described_class.new(a: 1))
250
+ end
251
+
252
+ it 'returns a new object' do
253
+ expect(result).not_to be(options)
254
+ end
255
+ end
256
+
257
+ context 'when the block does not evaluate to true for any pairs' do
258
+
259
+ let(:result) do
260
+ options.select { |k,v| k == 'd' }
261
+ end
262
+
263
+ it 'returns an object with no pairs' do
264
+ expect(result).to eq(described_class.new)
265
+ end
266
+
267
+ it 'returns a new object' do
268
+ expect(result).not_to be(options)
269
+ end
270
+ end
271
+
272
+ context 'when the object is unchanged' do
273
+
274
+ let(:options) do
275
+ described_class.new(a: 1, b: 2, c: 3)
276
+ end
277
+
278
+ let(:result) do
279
+ options.select { |k,v| ['a', 'b', 'c'].include?(k) }
280
+ end
281
+
282
+ it 'returns a new object' do
283
+ expect(result).to eq(described_class.new(a: 1, b: 2, c: 3))
284
+ end
285
+ end
286
+ end
287
+ end
288
+
289
+ describe '#select!' do
290
+
291
+ let(:options) do
292
+ described_class.new(a: 1, b: 2, c: 3)
293
+ end
294
+
295
+ context 'when no block is provided' do
296
+
297
+ it 'returns an enumerable' do
298
+ expect(options.reject).to be_a(Enumerator)
299
+ end
300
+ end
301
+
302
+ context 'when a block is provided' do
303
+
304
+ context 'when the block evaluates to true for some pairs' do
305
+
306
+ let(:result) do
307
+ options.select! { |k,v| k == 'a' }
308
+ end
309
+
310
+ it 'returns an object consisting of those pairs' do
311
+ expect(result).to eq(described_class.new(a: 1))
312
+ end
313
+
314
+ it 'returns the same object' do
315
+ expect(result).to be(options)
316
+ end
317
+ end
318
+
319
+ context 'when the block does not evaluate to true for any pairs' do
320
+
321
+ let(:result) do
322
+ options.select! { |k,v| k == 'd' }
323
+ end
324
+
325
+ it 'returns an object with no pairs' do
326
+ expect(result).to eq(described_class.new)
327
+ end
328
+
329
+ it 'returns the same object' do
330
+ expect(result).to be(options)
331
+ end
332
+ end
333
+
334
+ context 'when the object is unchanged' do
335
+
336
+ let(:options) do
337
+ described_class.new(a: 1, b: 2, c: 3)
338
+ end
339
+
340
+ let(:result) do
341
+ options.select! { |k,v| ['a', 'b', 'c'].include?(k) }
342
+ end
343
+
344
+ it 'returns nil' do
345
+ expect(result).to be(nil)
346
+ end
347
+ end
348
+ end
349
+ end
350
+ end
@@ -122,7 +122,7 @@ describe Mongo::Protocol::Delete do
122
122
  include_examples 'message with a header'
123
123
 
124
124
  describe 'zero' do
125
- let(:field) { bytes[16..19] }
125
+ let(:field) { bytes.to_s[16..19] }
126
126
 
127
127
  it 'serializes a zero' do
128
128
  expect(field).to be_int32(0)
@@ -130,14 +130,14 @@ describe Mongo::Protocol::Delete do
130
130
  end
131
131
 
132
132
  describe 'namespace' do
133
- let(:field) { bytes[20..36] }
133
+ let(:field) { bytes.to_s[20..36] }
134
134
  it 'serializes the namespace' do
135
135
  expect(field).to be_cstring(ns)
136
136
  end
137
137
  end
138
138
 
139
139
  describe 'flags' do
140
- let(:field) { bytes[37..40] }
140
+ let(:field) { bytes.to_s[37..40] }
141
141
 
142
142
  context 'when no flags are provided' do
143
143
  it 'does not set any bits' do
@@ -158,7 +158,7 @@ describe Mongo::Protocol::Delete do
158
158
  end
159
159
 
160
160
  describe 'selector' do
161
- let(:field) { bytes[41..-1] }
161
+ let(:field) { bytes.to_s[41..-1] }
162
162
  it 'serializes the selector' do
163
163
  expect(field).to be_bson(selector)
164
164
  end
@@ -115,7 +115,7 @@ describe Mongo::Protocol::GetMore do
115
115
  include_examples 'message with a header'
116
116
 
117
117
  describe 'zero' do
118
- let(:field) { bytes[16..19] }
118
+ let(:field) { bytes.to_s[16..19] }
119
119
 
120
120
  it 'does not set any bits' do
121
121
  expect(field).to be_int32(0)
@@ -123,21 +123,21 @@ describe Mongo::Protocol::GetMore do
123
123
  end
124
124
 
125
125
  describe 'namespace' do
126
- let(:field) { bytes[20..36] }
126
+ let(:field) { bytes.to_s[20..36] }
127
127
  it 'serializes the namespace' do
128
128
  expect(field).to be_cstring(ns)
129
129
  end
130
130
  end
131
131
 
132
132
  describe 'number to return' do
133
- let(:field) { bytes[37..40] }
133
+ let(:field) { bytes.to_s[37..40] }
134
134
  it 'serializes the number to return' do
135
135
  expect(field).to be_int32(limit)
136
136
  end
137
137
  end
138
138
 
139
139
  describe 'cursor id' do
140
- let(:field) { bytes[41..48] }
140
+ let(:field) { bytes.to_s[41..48] }
141
141
  it 'serializes the cursor id' do
142
142
  expect(field).to be_int64(cursor_id)
143
143
  end
@@ -124,7 +124,7 @@ describe Mongo::Protocol::Insert do
124
124
  include_examples 'message with a header'
125
125
 
126
126
  describe 'flags' do
127
- let(:field) { bytes[16..19] }
127
+ let(:field) { bytes.to_s[16..19] }
128
128
 
129
129
  context 'when no flags are provided' do
130
130
  it 'does not set any bits' do
@@ -145,14 +145,14 @@ describe Mongo::Protocol::Insert do
145
145
  end
146
146
 
147
147
  describe 'namespace' do
148
- let(:field) { bytes[20..36] }
148
+ let(:field) { bytes.to_s[20..36] }
149
149
  it 'serializes the namespace' do
150
150
  expect(field).to be_cstring(ns)
151
151
  end
152
152
  end
153
153
 
154
154
  describe 'documents' do
155
- let(:field) { bytes[37..-1] }
155
+ let(:field) { bytes.to_s[37..-1] }
156
156
  it 'serializes the documents' do
157
157
  expect(field).to be_bson_sequence(docs)
158
158
  end
@@ -5,8 +5,10 @@ describe Mongo::Protocol::KillCursors do
5
5
  let(:opcode) { 2007 }
6
6
  let(:cursor_ids) { [123, 456, 789] }
7
7
  let(:id_count) { cursor_ids.size }
8
+ let(:collection) { TEST_COLL }
9
+ let(:database) { TEST_DB }
8
10
  let(:message) do
9
- described_class.new(cursor_ids)
11
+ described_class.new(collection, database, cursor_ids)
10
12
  end
11
13
 
12
14
  describe '#initialize' do
@@ -26,7 +28,7 @@ describe Mongo::Protocol::KillCursors do
26
28
 
27
29
  context 'when the cursor ids are equal' do
28
30
  let(:other) do
29
- described_class.new(cursor_ids)
31
+ described_class.new(collection, database, cursor_ids)
30
32
  end
31
33
 
32
34
  it 'returns true' do
@@ -36,7 +38,7 @@ describe Mongo::Protocol::KillCursors do
36
38
 
37
39
  context 'when the cursor ids are not equal' do
38
40
  let(:other) do
39
- described_class.new([123, 456])
41
+ described_class.new(collection, database, [123, 456])
40
42
  end
41
43
 
42
44
  it 'returns false' do
@@ -77,7 +79,7 @@ describe Mongo::Protocol::KillCursors do
77
79
  include_examples 'message with a header'
78
80
 
79
81
  describe 'zero' do
80
- let(:field) { bytes[16..19] }
82
+ let(:field) { bytes.to_s[16..19] }
81
83
 
82
84
  it 'serializes a zero' do
83
85
  expect(field).to be_int32(0)
@@ -85,14 +87,14 @@ describe Mongo::Protocol::KillCursors do
85
87
  end
86
88
 
87
89
  describe 'number of cursors' do
88
- let(:field) { bytes[20..23] }
90
+ let(:field) { bytes.to_s[20..23] }
89
91
  it 'serializes the cursor count' do
90
92
  expect(field).to be_int32(id_count)
91
93
  end
92
94
  end
93
95
 
94
96
  describe 'cursor ids' do
95
- let(:field) { bytes[24..-1] }
97
+ let(:field) { bytes.to_s[24..-1] }
96
98
  it 'serializes the selector' do
97
99
  expect(field).to be_int64_sequence(cursor_ids)
98
100
  end
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe Mongo::Protocol::Query do
@@ -15,7 +16,7 @@ describe Mongo::Protocol::Query do
15
16
 
16
17
  describe '#initialize' do
17
18
 
18
- it 'sets the namepsace' do
19
+ it 'sets the namespace' do
19
20
  expect(message.namespace).to eq(ns)
20
21
  end
21
22
 
@@ -146,7 +147,7 @@ describe Mongo::Protocol::Query do
146
147
  include_examples 'message with a header'
147
148
 
148
149
  describe 'flags' do
149
- let(:field) { bytes[16..19] }
150
+ let(:field) { bytes.to_s[16..19] }
150
151
 
151
152
  context 'when no flags are provided' do
152
153
  it 'does not set any bits' do
@@ -216,14 +217,27 @@ describe Mongo::Protocol::Query do
216
217
  end
217
218
 
218
219
  describe 'namespace' do
219
- let(:field) { bytes[20..36] }
220
+ let(:field) { bytes.to_s[20..36] }
220
221
  it 'serializes the namespace' do
221
222
  expect(field).to be_cstring(ns)
222
223
  end
224
+
225
+ context 'when the namespace contains unicode characters' do
226
+ let(:field) { bytes.to_s[20..40] }
227
+
228
+ let(:coll) do
229
+ 'områder'
230
+ end
231
+
232
+ it 'serializes the namespace' do
233
+ expect(field).to be_cstring(ns)
234
+ end
235
+
236
+ end
223
237
  end
224
238
 
225
239
  describe 'skip' do
226
- let(:field) { bytes[37..40] }
240
+ let(:field) { bytes.to_s[37..40] }
227
241
 
228
242
  context 'when no skip is provided' do
229
243
  it 'serializes a zero' do
@@ -241,7 +255,7 @@ describe Mongo::Protocol::Query do
241
255
  end
242
256
 
243
257
  describe 'limit' do
244
- let(:field) { bytes[41..44] }
258
+ let(:field) { bytes.to_s[41..44] }
245
259
 
246
260
  context 'when no limit is provided' do
247
261
  it 'serializes a zero' do
@@ -258,14 +272,14 @@ describe Mongo::Protocol::Query do
258
272
  end
259
273
 
260
274
  describe 'selector' do
261
- let(:field) { bytes[45..65] }
275
+ let(:field) { bytes.to_s[45..65] }
262
276
  it 'serializes the selector' do
263
277
  expect(field).to be_bson(selector)
264
278
  end
265
279
  end
266
280
 
267
281
  describe 'project' do
268
- let(:field) { bytes[66..-1] }
282
+ let(:field) { bytes.to_s[66..-1] }
269
283
  context 'when no projection is provided' do
270
284
  it 'does not serialize a projection' do
271
285
  expect(field).to be_empty
@@ -127,7 +127,7 @@ describe Mongo::Protocol::Update do
127
127
  include_examples 'message with a header'
128
128
 
129
129
  describe 'zero' do
130
- let(:field) { bytes[16..19] }
130
+ let(:field) { bytes.to_s[16..19] }
131
131
 
132
132
  it 'serializes a zero' do
133
133
  expect(field).to be_int32(0)
@@ -135,14 +135,14 @@ describe Mongo::Protocol::Update do
135
135
  end
136
136
 
137
137
  describe 'namespace' do
138
- let(:field) { bytes[20..36] }
138
+ let(:field) { bytes.to_s[20..36] }
139
139
  it 'serializes the namespace' do
140
140
  expect(field).to be_cstring(ns)
141
141
  end
142
142
  end
143
143
 
144
144
  describe 'flags' do
145
- let(:field) { bytes[37..40] }
145
+ let(:field) { bytes.to_s[37..40] }
146
146
 
147
147
  context 'when no flags are provided' do
148
148
  it 'does not set any bits' do
@@ -170,14 +170,14 @@ describe Mongo::Protocol::Update do
170
170
  end
171
171
 
172
172
  describe 'selector' do
173
- let(:field) { bytes[41..61] }
173
+ let(:field) { bytes.to_s[41..61] }
174
174
  it 'serializes the selector' do
175
175
  expect(field).to be_bson(selector)
176
176
  end
177
177
  end
178
178
 
179
179
  describe 'update' do
180
- let(:field) { bytes[62..80] }
180
+ let(:field) { bytes.to_s[62..80] }
181
181
  it 'serializes the update' do
182
182
  expect(field).to be_bson(update_doc)
183
183
  end