mongo 1.12.5 → 2.0.0.beta

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 (437) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +64 -0
  5. data/LICENSE +1 -1
  6. data/README.md +23 -125
  7. data/Rakefile +26 -21
  8. data/bin/mongo_console +6 -38
  9. data/lib/mongo.rb +23 -82
  10. data/lib/mongo/address.rb +111 -0
  11. data/lib/mongo/address/ipv4.rb +85 -0
  12. data/lib/mongo/address/ipv6.rb +85 -0
  13. data/lib/mongo/address/unix.rb +76 -0
  14. data/lib/mongo/auth.rb +108 -0
  15. data/lib/mongo/auth/cr.rb +44 -0
  16. data/lib/mongo/auth/cr/conversation.rb +119 -0
  17. data/lib/mongo/auth/executable.rb +52 -0
  18. data/lib/mongo/auth/ldap.rb +48 -0
  19. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  20. data/lib/mongo/auth/roles.rb +104 -0
  21. data/lib/mongo/auth/scram.rb +53 -0
  22. data/lib/mongo/auth/scram/conversation.rb +450 -0
  23. data/lib/mongo/auth/user.rb +159 -0
  24. data/lib/mongo/auth/user/view.rb +102 -0
  25. data/lib/mongo/auth/x509.rb +48 -0
  26. data/lib/mongo/auth/x509/conversation.rb +92 -0
  27. data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
  28. data/lib/mongo/bulk/bulk_write.rb +307 -0
  29. data/lib/mongo/client.rb +233 -0
  30. data/lib/mongo/cluster.rb +203 -0
  31. data/lib/mongo/cluster/topology.rb +60 -0
  32. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  33. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  34. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  35. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  36. data/lib/mongo/collection.rb +130 -1101
  37. data/lib/mongo/collection/view.rb +169 -0
  38. data/lib/mongo/collection/view/aggregation.rb +108 -0
  39. data/lib/mongo/collection/view/explainable.rb +49 -0
  40. data/lib/mongo/collection/view/immutable.rb +43 -0
  41. data/lib/mongo/collection/view/iterable.rb +48 -0
  42. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  43. data/lib/mongo/collection/view/readable.rb +363 -0
  44. data/lib/mongo/collection/view/writable.rb +169 -0
  45. data/lib/mongo/cursor.rb +79 -680
  46. data/lib/mongo/database.rb +224 -0
  47. data/lib/mongo/database/view.rb +101 -0
  48. data/lib/mongo/error.rb +81 -0
  49. data/lib/mongo/error/bulk_write_failure.rb +41 -0
  50. data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
  51. data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
  52. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  53. data/lib/mongo/error/invalid_database_name.rb +39 -0
  54. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  55. data/lib/mongo/error/invalid_file.rb +38 -0
  56. data/lib/mongo/error/invalid_nonce.rb +46 -0
  57. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  58. data/lib/mongo/error/invalid_signature.rb +47 -0
  59. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  60. data/lib/mongo/error/max_bson_size.rb +40 -0
  61. data/lib/mongo/error/max_message_size.rb +42 -0
  62. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  63. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  64. data/lib/mongo/error/parser.rb +77 -0
  65. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  66. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  67. data/lib/mongo/error/unsupported_features.rb +43 -0
  68. data/lib/mongo/event.rb +40 -0
  69. data/lib/mongo/event/listeners.rb +63 -0
  70. data/lib/mongo/event/primary_elected.rb +53 -0
  71. data/lib/mongo/event/publisher.rb +42 -0
  72. data/lib/mongo/event/server_added.rb +53 -0
  73. data/lib/mongo/event/server_removed.rb +53 -0
  74. data/lib/mongo/event/subscriber.rb +41 -0
  75. data/lib/mongo/grid.rb +16 -0
  76. data/lib/mongo/grid/file.rb +94 -0
  77. data/lib/mongo/grid/file/chunk.rb +184 -0
  78. data/lib/mongo/grid/file/metadata.rb +223 -0
  79. data/lib/mongo/grid/fs.rb +149 -0
  80. data/lib/mongo/index.rb +64 -0
  81. data/lib/mongo/index/view.rb +205 -0
  82. data/lib/mongo/loggable.rb +126 -0
  83. data/lib/mongo/logger.rb +132 -0
  84. data/lib/mongo/operation.rb +26 -0
  85. data/lib/mongo/operation/aggregate.rb +100 -0
  86. data/lib/mongo/operation/aggregate/result.rb +84 -0
  87. data/lib/mongo/operation/batchable.rb +103 -0
  88. data/lib/mongo/operation/bulk_delete/result.rb +197 -0
  89. data/lib/mongo/operation/bulk_insert/result.rb +195 -0
  90. data/lib/mongo/operation/bulk_update/result.rb +295 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +116 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce.rb +96 -0
  98. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  99. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  100. data/lib/mongo/operation/read/collections_info.rb +67 -0
  101. data/lib/mongo/operation/read/get_more.rb +71 -0
  102. data/lib/mongo/operation/read/indexes.rb +68 -0
  103. data/lib/mongo/operation/read/list_collections.rb +75 -0
  104. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  105. data/lib/mongo/operation/read/query.rb +71 -0
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +380 -0
  109. data/lib/mongo/operation/write.rb +25 -0
  110. data/lib/mongo/operation/write/bulk_delete.rb +158 -0
  111. data/lib/mongo/operation/write/bulk_insert.rb +160 -0
  112. data/lib/mongo/operation/write/bulk_update.rb +167 -0
  113. data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
  114. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  115. data/lib/mongo/operation/write/command/delete.rb +56 -0
  116. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  117. data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
  118. data/lib/mongo/operation/write/command/insert.rb +55 -0
  119. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  120. data/lib/mongo/operation/write/command/update.rb +60 -0
  121. data/lib/mongo/operation/write/command/writable.rb +61 -0
  122. data/lib/mongo/operation/write/create_index.rb +84 -0
  123. data/lib/mongo/operation/write/create_user.rb +75 -0
  124. data/lib/mongo/operation/write/delete.rb +91 -0
  125. data/lib/mongo/operation/write/drop_index.rb +62 -0
  126. data/lib/mongo/operation/write/insert.rb +88 -0
  127. data/lib/mongo/operation/write/remove_user.rb +70 -0
  128. data/lib/mongo/operation/write/update.rb +98 -0
  129. data/lib/mongo/protocol.rb +15 -0
  130. data/lib/mongo/protocol/bit_vector.rb +61 -0
  131. data/lib/mongo/protocol/delete.rb +94 -0
  132. data/lib/mongo/protocol/get_more.rb +99 -0
  133. data/lib/mongo/protocol/insert.rb +99 -0
  134. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  135. data/lib/mongo/protocol/message.rb +252 -0
  136. data/lib/mongo/protocol/query.rb +147 -0
  137. data/lib/mongo/protocol/reply.rb +72 -0
  138. data/lib/mongo/protocol/serializers.rb +180 -0
  139. data/lib/mongo/protocol/update.rb +111 -0
  140. data/lib/mongo/server.rb +163 -0
  141. data/lib/mongo/server/connectable.rb +99 -0
  142. data/lib/mongo/server/connection.rb +133 -0
  143. data/lib/mongo/server/connection_pool.rb +141 -0
  144. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  145. data/lib/mongo/server/context.rb +66 -0
  146. data/lib/mongo/server/description.rb +450 -0
  147. data/lib/mongo/server/description/features.rb +85 -0
  148. data/lib/mongo/server/description/inspector.rb +79 -0
  149. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  150. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  151. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  152. data/lib/mongo/server/monitor.rb +160 -0
  153. data/lib/mongo/server/monitor/connection.rb +88 -0
  154. data/lib/mongo/server_selector.rb +81 -0
  155. data/lib/mongo/server_selector/nearest.rb +94 -0
  156. data/lib/mongo/server_selector/primary.rb +88 -0
  157. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  158. data/lib/mongo/server_selector/secondary.rb +91 -0
  159. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  160. data/lib/mongo/server_selector/selectable.rb +209 -0
  161. data/lib/mongo/socket.rb +179 -0
  162. data/lib/mongo/socket/ssl.rb +108 -0
  163. data/lib/mongo/socket/tcp.rb +69 -0
  164. data/lib/mongo/socket/unix.rb +66 -0
  165. data/lib/mongo/uri.rb +504 -0
  166. data/lib/mongo/version.rb +21 -0
  167. data/lib/mongo/write_concern.rb +99 -0
  168. data/lib/mongo/write_concern/acknowledged.rb +38 -0
  169. data/lib/mongo/write_concern/normalizable.rb +73 -0
  170. data/lib/mongo/write_concern/unacknowledged.rb +43 -0
  171. data/mongo.gemspec +17 -14
  172. data/spec/mongo/address/ipv4_spec.rb +74 -0
  173. data/spec/mongo/address/ipv6_spec.rb +74 -0
  174. data/spec/mongo/address/unix_spec.rb +30 -0
  175. data/spec/mongo/address_spec.rb +206 -0
  176. data/spec/mongo/auth/cr_spec.rb +59 -0
  177. data/spec/mongo/auth/ldap_spec.rb +40 -0
  178. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  179. data/spec/mongo/auth/scram_spec.rb +55 -0
  180. data/spec/mongo/auth/user/view_spec.rb +76 -0
  181. data/spec/mongo/auth/user_spec.rb +190 -0
  182. data/spec/mongo/auth/x509_spec.rb +40 -0
  183. data/spec/mongo/auth_spec.rb +65 -0
  184. data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
  185. data/spec/mongo/client_spec.rb +564 -0
  186. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  187. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  188. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  189. data/spec/mongo/cluster/topology_spec.rb +65 -0
  190. data/spec/mongo/cluster_spec.rb +129 -0
  191. data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
  192. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  193. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  194. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  195. data/spec/mongo/collection/view/writable_spec.rb +504 -0
  196. data/spec/mongo/collection/view_spec.rb +521 -0
  197. data/spec/mongo/collection_spec.rb +362 -0
  198. data/spec/mongo/cursor_spec.rb +295 -0
  199. data/spec/mongo/database_spec.rb +306 -0
  200. data/spec/mongo/error/parser_spec.rb +119 -0
  201. data/spec/mongo/event/publisher_spec.rb +50 -0
  202. data/spec/mongo/event/subscriber_spec.rb +34 -0
  203. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  204. data/spec/mongo/grid/file/metadata_spec.rb +69 -0
  205. data/spec/mongo/grid/file_spec.rb +138 -0
  206. data/spec/mongo/grid/fs_spec.rb +129 -0
  207. data/spec/mongo/index/view_spec.rb +226 -0
  208. data/spec/mongo/loggable_spec.rb +62 -0
  209. data/spec/mongo/logger_spec.rb +97 -0
  210. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  211. data/spec/mongo/operation/aggregate_spec.rb +135 -0
  212. data/spec/mongo/operation/command_spec.rb +106 -0
  213. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  214. data/spec/mongo/operation/limited_spec.rb +50 -0
  215. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  216. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  217. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  218. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  219. data/spec/mongo/operation/read/query_spec.rb +84 -0
  220. data/spec/mongo/operation/result_spec.rb +275 -0
  221. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  222. data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
  223. data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
  224. data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
  225. data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
  226. data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
  227. data/spec/mongo/operation/write/command/update_spec.rb +123 -0
  228. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  229. data/spec/mongo/operation/write/delete_spec.rb +178 -0
  230. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  231. data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
  232. data/spec/mongo/operation/write/insert_spec.rb +231 -0
  233. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  234. data/spec/mongo/operation/write/response_spec.rb +85 -0
  235. data/spec/mongo/operation/write/update_spec.rb +177 -0
  236. data/spec/mongo/protocol/delete_spec.rb +167 -0
  237. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  238. data/spec/mongo/protocol/insert_spec.rb +161 -0
  239. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  240. data/spec/mongo/protocol/query_spec.rb +285 -0
  241. data/spec/mongo/protocol/reply_spec.rb +157 -0
  242. data/spec/mongo/protocol/update_spec.rb +186 -0
  243. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  244. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  245. data/spec/mongo/server/connection_spec.rb +289 -0
  246. data/spec/mongo/server/description/features_spec.rb +138 -0
  247. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  248. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  249. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  250. data/spec/mongo/server/description_spec.rb +510 -0
  251. data/spec/mongo/server/monitor_spec.rb +130 -0
  252. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  253. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  254. data/spec/mongo/server_selection_spec.rb +89 -0
  255. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  256. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  257. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  258. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  259. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  260. data/spec/mongo/server_selector_spec.rb +101 -0
  261. data/spec/mongo/server_spec.rb +131 -0
  262. data/spec/mongo/uri_spec.rb +517 -0
  263. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  264. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  265. data/spec/mongo_orchestration_spec.rb +70 -0
  266. data/spec/spec_helper.rb +148 -0
  267. data/spec/support/authorization.rb +245 -0
  268. data/spec/support/helpers.rb +140 -0
  269. data/spec/support/matchers.rb +37 -0
  270. data/spec/support/mongo_orchestration.rb +61 -0
  271. data/spec/support/mongo_orchestration/requestable.rb +109 -0
  272. data/spec/support/mongo_orchestration/standalone.rb +57 -0
  273. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  274. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  275. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  276. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  277. data/spec/support/sdam/rs/discovery.yml +195 -0
  278. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  279. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  280. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  281. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  282. data/spec/support/sdam/rs/new_primary.yml +74 -0
  283. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  284. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  285. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  286. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  287. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  288. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  289. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  290. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  291. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  292. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  293. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  294. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  295. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  296. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  297. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  298. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  299. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  300. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  301. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  302. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  303. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  304. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  305. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  306. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  307. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  308. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  309. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  310. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  311. data/spec/support/server_selection.rb +140 -0
  312. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  313. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  314. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  315. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  316. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  317. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  318. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  319. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
  320. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
  321. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
  322. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
  323. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
  324. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
  325. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
  326. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
  327. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
  328. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
  329. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
  330. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
  331. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
  332. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
  333. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
  334. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
  335. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
  336. data/spec/support/server_selection_rtt.rb +41 -0
  337. data/spec/support/shared/bulk_write.rb +498 -0
  338. data/spec/support/shared/cursor.rb +38 -0
  339. data/spec/support/shared/operation.rb +77 -0
  340. data/spec/support/shared/protocol.rb +31 -0
  341. data/spec/support/shared/server_selector.rb +111 -0
  342. data/spec/support/shared/socket.rb +82 -0
  343. data/spec/support/travis.rb +14 -0
  344. metadata +523 -189
  345. metadata.gz.sig +0 -0
  346. data/VERSION +0 -1
  347. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  348. data/lib/mongo/collection_writer.rb +0 -364
  349. data/lib/mongo/connection/node.rb +0 -249
  350. data/lib/mongo/connection/pool.rb +0 -340
  351. data/lib/mongo/connection/pool_manager.rb +0 -320
  352. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  353. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  354. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  355. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  356. data/lib/mongo/db.rb +0 -808
  357. data/lib/mongo/exception.rb +0 -145
  358. data/lib/mongo/functional/authentication.rb +0 -455
  359. data/lib/mongo/functional/logging.rb +0 -85
  360. data/lib/mongo/functional/read_preference.rb +0 -183
  361. data/lib/mongo/functional/scram.rb +0 -556
  362. data/lib/mongo/functional/uri_parser.rb +0 -409
  363. data/lib/mongo/functional/write_concern.rb +0 -66
  364. data/lib/mongo/gridfs/grid.rb +0 -112
  365. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  366. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  367. data/lib/mongo/gridfs/grid_io.rb +0 -484
  368. data/lib/mongo/legacy.rb +0 -140
  369. data/lib/mongo/mongo_client.rb +0 -697
  370. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  371. data/lib/mongo/mongo_sharded_client.rb +0 -159
  372. data/lib/mongo/networking.rb +0 -372
  373. data/lib/mongo/utils/conversions.rb +0 -110
  374. data/lib/mongo/utils/core_ext.rb +0 -70
  375. data/lib/mongo/utils/server_version.rb +0 -69
  376. data/lib/mongo/utils/support.rb +0 -80
  377. data/test/functional/authentication_test.rb +0 -39
  378. data/test/functional/bulk_api_stress_test.rb +0 -133
  379. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  380. data/test/functional/client_test.rb +0 -627
  381. data/test/functional/collection_test.rb +0 -2175
  382. data/test/functional/collection_writer_test.rb +0 -83
  383. data/test/functional/conversions_test.rb +0 -163
  384. data/test/functional/cursor_fail_test.rb +0 -57
  385. data/test/functional/cursor_message_test.rb +0 -56
  386. data/test/functional/cursor_test.rb +0 -683
  387. data/test/functional/db_api_test.rb +0 -835
  388. data/test/functional/db_test.rb +0 -348
  389. data/test/functional/grid_file_system_test.rb +0 -285
  390. data/test/functional/grid_io_test.rb +0 -252
  391. data/test/functional/grid_test.rb +0 -273
  392. data/test/functional/pool_test.rb +0 -136
  393. data/test/functional/safe_test.rb +0 -98
  394. data/test/functional/support_test.rb +0 -62
  395. data/test/functional/timeout_test.rb +0 -60
  396. data/test/functional/uri_test.rb +0 -446
  397. data/test/functional/write_concern_test.rb +0 -118
  398. data/test/helpers/general.rb +0 -50
  399. data/test/helpers/test_unit.rb +0 -476
  400. data/test/replica_set/authentication_test.rb +0 -37
  401. data/test/replica_set/basic_test.rb +0 -189
  402. data/test/replica_set/client_test.rb +0 -393
  403. data/test/replica_set/connection_test.rb +0 -138
  404. data/test/replica_set/count_test.rb +0 -66
  405. data/test/replica_set/cursor_test.rb +0 -220
  406. data/test/replica_set/insert_test.rb +0 -157
  407. data/test/replica_set/max_values_test.rb +0 -151
  408. data/test/replica_set/pinning_test.rb +0 -105
  409. data/test/replica_set/query_test.rb +0 -73
  410. data/test/replica_set/read_preference_test.rb +0 -219
  411. data/test/replica_set/refresh_test.rb +0 -211
  412. data/test/replica_set/replication_ack_test.rb +0 -95
  413. data/test/sharded_cluster/basic_test.rb +0 -203
  414. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  415. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  416. data/test/shared/authentication/gssapi_shared.rb +0 -176
  417. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  418. data/test/shared/authentication/scram_shared.rb +0 -92
  419. data/test/shared/ssl_shared.rb +0 -235
  420. data/test/test_helper.rb +0 -61
  421. data/test/threading/basic_test.rb +0 -120
  422. data/test/tools/mongo_config.rb +0 -708
  423. data/test/tools/mongo_config_test.rb +0 -160
  424. data/test/unit/client_test.rb +0 -381
  425. data/test/unit/collection_test.rb +0 -166
  426. data/test/unit/connection_test.rb +0 -335
  427. data/test/unit/cursor_test.rb +0 -307
  428. data/test/unit/db_test.rb +0 -136
  429. data/test/unit/grid_test.rb +0 -76
  430. data/test/unit/mongo_sharded_client_test.rb +0 -48
  431. data/test/unit/node_test.rb +0 -93
  432. data/test/unit/pool_manager_test.rb +0 -111
  433. data/test/unit/read_pref_test.rb +0 -406
  434. data/test/unit/read_test.rb +0 -159
  435. data/test/unit/safe_test.rb +0 -158
  436. data/test/unit/sharding_pool_manager_test.rb +0 -84
  437. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Specifiable do
4
+
5
+ let(:spec) do
6
+ {}
7
+ end
8
+
9
+ let(:specifiable) do
10
+ Class.new do
11
+ include Mongo::Operation::Specifiable
12
+ end.new(spec)
13
+ end
14
+
15
+ describe '#==' do
16
+
17
+ context 'when the other object is a specifiable' do
18
+
19
+ context 'when the specs are equal' do
20
+
21
+ let(:other) do
22
+ Class.new do
23
+ include Mongo::Operation::Specifiable
24
+ end.new(spec)
25
+ end
26
+
27
+ it 'returns true' do
28
+ expect(specifiable).to eq(other)
29
+ end
30
+ end
31
+
32
+ context 'when the specs are not equal' do
33
+
34
+ let(:other) do
35
+ Class.new do
36
+ include Mongo::Operation::Specifiable
37
+ end.new({ :db_name => 'test' })
38
+ end
39
+
40
+ it 'returns false' do
41
+ expect(specifiable).to_not eq(other)
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'when the other object is not a specifiable' do
47
+
48
+ it 'returns false' do
49
+ expect(specifiable).to_not eq('test')
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,473 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Operation::Write::BulkDelete do
4
+ include_context 'operation'
5
+
6
+ let(:documents) do
7
+ [ { q: { foo: 1 }, limit: 1 } ]
8
+ end
9
+
10
+ let(:spec) do
11
+ { :deletes => documents,
12
+ :db_name => db_name,
13
+ :coll_name => coll_name,
14
+ :write_concern => write_concern,
15
+ :ordered => true
16
+ }
17
+ end
18
+
19
+ let(:op) { described_class.new(spec) }
20
+
21
+ describe '#initialize' do
22
+
23
+ context 'spec' do
24
+
25
+ it 'sets the spec' do
26
+ expect(op.spec).to eq(spec)
27
+ end
28
+ end
29
+ end
30
+
31
+ describe '#==' do
32
+
33
+ context 'spec' do
34
+
35
+ context 'when two ops have the same specs' do
36
+ let(:other) { described_class.new(spec) }
37
+
38
+ it 'returns true' do
39
+ expect(op).to eq(other)
40
+ end
41
+ end
42
+
43
+ context 'when two ops have different specs' do
44
+ let(:other_docs) do
45
+ [ { q: { bar: 1 }, limit: 1 } ]
46
+ end
47
+
48
+ let(:other_spec) do
49
+ { :deletes => other_docs,
50
+ :db_name => db_name,
51
+ :coll_name => coll_name,
52
+ :write_concern => write_concern,
53
+ :ordered => true
54
+ }
55
+ end
56
+ let(:other) { described_class.new(other_spec) }
57
+
58
+ it 'returns false' do
59
+ expect(op).not_to eq(other)
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#dup' do
66
+
67
+ context 'deep copy' do
68
+
69
+ it 'copies the list of deletes' do
70
+ copy = op.dup
71
+ expect(copy.spec[:deletes]).not_to be(op.spec[:deletes])
72
+ end
73
+ end
74
+ end
75
+
76
+ describe '#write_concern' do
77
+
78
+ let(:other_write_concern) do
79
+ { :w => 2 }
80
+ end
81
+
82
+ context 'when the write concern is set' do
83
+
84
+ it 'sets the write concern' do
85
+ new_op = op.write_concern(other_write_concern)
86
+ expect(new_op.write_concern.options).to eq(other_write_concern)
87
+ end
88
+ end
89
+ end
90
+
91
+ describe '#batch' do
92
+
93
+ context 'when number of deletes is evenly divisible by n_batches' do
94
+ let(:documents) do
95
+ [ { q: { a: 1 } },
96
+ { q: { b: 1 } },
97
+ { q: { c: 1 } },
98
+ { q: { d: 1 } },
99
+ { q: { e: 1 } },
100
+ { q: { f: 1 } } ]
101
+ end
102
+ let(:n_batches) { 3 }
103
+
104
+ it 'batches the op into the divisor number of children ops' do
105
+ expect(op.batch(n_batches).size).to eq(n_batches)
106
+ end
107
+
108
+ it 'divides the deletes evenly between children ops' do
109
+ ops = op.batch(n_batches)
110
+ batch_size = documents.size / n_batches
111
+
112
+ n_batches.times do |i|
113
+ start_index = i * batch_size
114
+ expect(ops[i].spec[:deletes]).to eq(documents[start_index, batch_size])
115
+ end
116
+ end
117
+ end
118
+
119
+ context 'when number of deletes is less than batch size' do
120
+ let(:documents) do
121
+ [ { q: { a: 1 } } ]
122
+ end
123
+ let(:n_batches) { 3 }
124
+
125
+ it 'raises an exception' do
126
+ expect {
127
+ op.batch(n_batches)
128
+ }.to raise_error(Exception)
129
+ end
130
+ end
131
+
132
+ context 'when number of deletes is not evenly divisible by n_batches' do
133
+ let(:documents) do
134
+ [ { q: { a: 1 } },
135
+ { q: { b: 1 } },
136
+ { q: { c: 1 } },
137
+ { q: { d: 1 } },
138
+ { q: { e: 1 } },
139
+ { q: { f: 1 } } ]
140
+ end
141
+ let(:n_batches) { 4 }
142
+
143
+ it 'batches the op into the n_batches number of children ops' do
144
+ expect(op.batch(n_batches).size).to eq(n_batches)
145
+ end
146
+
147
+ it 'divides the deletes evenly between children ops' do
148
+ ops = op.batch(n_batches)
149
+ batch_size = documents.size / n_batches
150
+
151
+ n_batches.times do |i|
152
+ start_index = i * batch_size
153
+ if i == n_batches - 1
154
+ expect(ops[i].spec[:deletes]).to eq(documents[start_index..-1])
155
+ else
156
+ expect(ops[i].spec[:deletes]).to eq(documents[start_index, batch_size])
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ describe '#merge!' do
164
+
165
+ context 'same collection and database' do
166
+
167
+ let(:other_docs) do
168
+ [ { q: { bar: 1 }, limit: 1 } ]
169
+ end
170
+
171
+ let(:other_spec) do
172
+ { deletes: other_docs,
173
+ db_name: db_name,
174
+ coll_name: coll_name
175
+ }
176
+ end
177
+
178
+ let(:other) { described_class.new(other_spec) }
179
+
180
+ it 'merges the two ops' do
181
+ expect{ op.merge!(other) }.not_to raise_exception
182
+ end
183
+ end
184
+
185
+ context 'different database' do
186
+
187
+ let(:other_docs) do
188
+ [ { q: { bar: 1 }, limit: 1 } ]
189
+ end
190
+
191
+ let(:other_spec) do
192
+ { deletes: other_docs,
193
+ db_name: 'different',
194
+ coll_name: coll_name
195
+ }
196
+ end
197
+
198
+ let(:other) { described_class.new(other_spec) }
199
+
200
+ it 'raises an exception' do
201
+ expect do
202
+ op.merge!(other)
203
+ end.to raise_exception
204
+ end
205
+ end
206
+
207
+ context 'different collection' do
208
+
209
+ let(:other_docs) do
210
+ [ { q: { bar: 1 }, limit: 1 } ]
211
+ end
212
+
213
+ let(:other_spec) do
214
+ { deletes: other_docs,
215
+ db_name: db_name,
216
+ coll_name: 'different'
217
+ }
218
+ end
219
+
220
+ let(:other) { described_class.new(other_spec) }
221
+
222
+ it 'raises an exception' do
223
+ expect do
224
+ op.merge!(other)
225
+ end.to raise_exception
226
+ end
227
+ end
228
+
229
+ context 'different operation type' do
230
+ let(:other) { Mongo::Write::Update.new(spec) }
231
+
232
+ it 'raises an exception' do
233
+ expect do
234
+ op.merge!(other)
235
+ end.to raise_exception
236
+ end
237
+ end
238
+
239
+ context 'merged deletes' do
240
+
241
+ let(:other_docs) do
242
+ [ { q: { bar: 1 }, limit: 1 } ]
243
+ end
244
+
245
+ let(:other_spec) do
246
+ { deletes: other_docs,
247
+ db_name: db_name,
248
+ coll_name: coll_name
249
+ }
250
+ end
251
+
252
+ let(:other) { described_class.new(other_spec) }
253
+
254
+ let(:expected) do
255
+ documents + other_docs
256
+ end
257
+
258
+ it 'merges the list of deletes' do
259
+ expect(op.merge!(other).spec[:deletes]).to eq(expected)
260
+ end
261
+ end
262
+
263
+ context 'mutability' do
264
+ let(:other_docs) do
265
+ [ { q: { bar: 1 }, limit: 1 } ]
266
+ end
267
+
268
+ let(:other_spec) do
269
+ { deletes: other_docs,
270
+ db_name: db_name,
271
+ coll_name: coll_name
272
+ }
273
+ end
274
+
275
+ let(:other) { described_class.new(other_spec) }
276
+
277
+ it 'returns a new object' do
278
+ expect(op.merge!(other)).to be(op)
279
+ end
280
+ end
281
+ end
282
+
283
+ describe '#execute' do
284
+
285
+ before do
286
+ authorized_collection.insert_many([
287
+ { name: 'test', field: 'test' },
288
+ { name: 'testing', field: 'test' }
289
+ ])
290
+ end
291
+
292
+ after do
293
+ authorized_collection.find.remove_many
294
+ end
295
+
296
+ context 'when deleting a single document' do
297
+
298
+ let(:op) do
299
+ described_class.new({
300
+ deletes: documents,
301
+ db_name: TEST_DB,
302
+ coll_name: TEST_COLL,
303
+ write_concern: Mongo::WriteConcern.get(w: 1)
304
+ })
305
+ end
306
+
307
+ context 'when the delete succeeds' do
308
+
309
+ let(:documents) do
310
+ [{ q: { field: 'test' }, limit: 1 }]
311
+ end
312
+
313
+ it 'deletes the document from the database' do
314
+ op.execute(authorized_primary.context)
315
+ expect(authorized_collection.find.count).to eq(1)
316
+ end
317
+ end
318
+ end
319
+
320
+ context 'when deleting multiple documents' do
321
+
322
+ let(:op) do
323
+ described_class.new({
324
+ deletes: documents,
325
+ db_name: TEST_DB,
326
+ coll_name: TEST_COLL,
327
+ write_concern: Mongo::WriteConcern.get(w: 1)
328
+ })
329
+ end
330
+
331
+ context 'when the deletes succeed' do
332
+
333
+ let(:documents) do
334
+ [{ q: { field: 'test' }, limit: 0 }]
335
+ end
336
+
337
+ it 'deletes the documents from the database' do
338
+ op.execute(authorized_primary.context)
339
+ expect(authorized_collection.find.count).to eq(0)
340
+ end
341
+ end
342
+ end
343
+
344
+ context 'when the deletes are ordered' do
345
+
346
+ let(:documents) do
347
+ [ failing_delete_doc,
348
+ { q: { field: 'test' }, limit: 1 }
349
+ ]
350
+ end
351
+
352
+ let(:spec) do
353
+ { :deletes => documents,
354
+ :db_name => TEST_DB,
355
+ :coll_name => TEST_COLL,
356
+ :write_concern => write_concern,
357
+ :ordered => true
358
+ }
359
+ end
360
+
361
+ let(:failing_delete) do
362
+ described_class.new(spec)
363
+ end
364
+
365
+ context 'when the delete fails' do
366
+
367
+ context 'when write concern is acknowledged' do
368
+
369
+ let(:write_concern) do
370
+ Mongo::WriteConcern.get(w: 1)
371
+ end
372
+
373
+ it 'aborts after first error' do
374
+ failing_delete.execute(authorized_primary.context)
375
+ expect(authorized_collection.find.count).to eq(2)
376
+ end
377
+ end
378
+
379
+ context 'when write concern is unacknowledged' do
380
+
381
+ let(:write_concern) do
382
+ Mongo::WriteConcern.get(w: 0)
383
+ end
384
+
385
+ it 'aborts after first error' do
386
+ failing_delete.execute(authorized_primary.context)
387
+ expect(authorized_collection.find.count).to eq(2)
388
+ end
389
+ end
390
+ end
391
+ end
392
+
393
+ context 'when the deletes are unordered' do
394
+
395
+ let(:documents) do
396
+ [ failing_delete_doc,
397
+ { q: { field: 'test' }, limit: 1 }
398
+ ]
399
+ end
400
+
401
+ let(:spec) do
402
+ { :deletes => documents,
403
+ :db_name => TEST_DB,
404
+ :coll_name => TEST_COLL,
405
+ :write_concern => write_concern,
406
+ :ordered => false
407
+ }
408
+ end
409
+
410
+ let(:failing_delete) do
411
+ described_class.new(spec)
412
+ end
413
+
414
+ context 'when the delete fails' do
415
+
416
+ context 'when write concern is acknowledged' do
417
+
418
+ let(:write_concern) do
419
+ Mongo::WriteConcern.get(w: 1)
420
+ end
421
+
422
+ it 'does not abort after first error' do
423
+ failing_delete.execute(authorized_primary.context)
424
+ expect(authorized_collection.find.count).to eq(1)
425
+ end
426
+ end
427
+
428
+ context 'when write concern is unacknowledged' do
429
+
430
+ let(:write_concern) do
431
+ Mongo::WriteConcern.get(w: 0)
432
+ end
433
+
434
+ it 'does not abort after first error' do
435
+ failing_delete.execute(authorized_primary.context)
436
+ expect(authorized_collection.find.count).to eq(1)
437
+ end
438
+ end
439
+ end
440
+ end
441
+
442
+ context 'when a write concern override is specified' do
443
+
444
+ let(:documents) do
445
+ [ { q: { field: 'test' }, limit: 1 } ]
446
+ end
447
+
448
+ let(:op) do
449
+ described_class.new({
450
+ deletes: documents,
451
+ db_name: db_name,
452
+ coll_name: coll_name,
453
+ write_concern: Mongo::WriteConcern.get(w: 1),
454
+ ordered: false
455
+ })
456
+ end
457
+
458
+ let(:unacknowledged) do
459
+ { w: 0 }
460
+ end
461
+
462
+ it 'uses that write concern', if: write_command_enabled? do
463
+ result = op.write_concern(unacknowledged).execute(authorized_primary.context)
464
+ expect(result.replies.size).to eq(1)
465
+ end
466
+
467
+ it 'uses that write concern', unless: write_command_enabled? do
468
+ result = op.write_concern(unacknowledged).execute(authorized_primary.context)
469
+ expect(result.replies).to be(nil)
470
+ end
471
+ end
472
+ end
473
+ end