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,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::SCRAM do
4
+
5
+ let(:address) do
6
+ Mongo::Address.new(DEFAULT_ADDRESS)
7
+ end
8
+
9
+ let(:server) do
10
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
11
+ end
12
+
13
+ let(:connection) do
14
+ Mongo::Server::Connection.new(server)
15
+ end
16
+
17
+ describe '#login' do
18
+
19
+ context 'when the user is not authorized' do
20
+
21
+ let(:user) do
22
+ Mongo::Auth::User.new(
23
+ database: 'driver',
24
+ user: 'notauser',
25
+ password: 'password'
26
+ )
27
+ end
28
+
29
+ let(:cr) do
30
+ described_class.new(user)
31
+ end
32
+
33
+ it 'raises an exception', if: list_command_enabled? do
34
+ expect {
35
+ cr.login(connection)
36
+ }.to raise_error(Mongo::Auth::Unauthorized)
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'when the user is authorized for the database' do
42
+
43
+ let(:cr) do
44
+ described_class.new(root_user)
45
+ end
46
+
47
+ let(:login) do
48
+ cr.login(connection).documents[0]
49
+ end
50
+
51
+ it 'logs the user into the connection', if: list_command_enabled? do
52
+ expect(login['ok']).to eq(1)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::User::View do
4
+
5
+ let(:view) do
6
+ described_class.new(root_authorized_client.database)
7
+ end
8
+
9
+ describe '#create' do
10
+
11
+ let!(:response) do
12
+ view.create(
13
+ 'durran',
14
+ password: 'password', roles: [ Mongo::Auth::Roles::READ_WRITE ]
15
+ )
16
+ end
17
+
18
+ after do
19
+ view.remove('durran')
20
+ end
21
+
22
+ context 'when user creation was successful' do
23
+
24
+ it 'saves the user in the database' do
25
+ expect(response).to be_successful
26
+ end
27
+ end
28
+
29
+ context 'when creation was not successful' do
30
+
31
+ it 'raises an exception' do
32
+ expect {
33
+ view.create('durran', password: 'password')
34
+ }.to raise_error(Mongo::Error::OperationFailure)
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#remove' do
40
+
41
+ context 'when user removal was successful' do
42
+
43
+ before do
44
+ view.create(
45
+ 'durran',
46
+ password: 'password', roles: [ Mongo::Auth::Roles::READ_WRITE ]
47
+ )
48
+ end
49
+
50
+ let(:response) do
51
+ view.remove('durran')
52
+ end
53
+
54
+ it 'saves the user in the database' do
55
+ expect(response).to be_successful
56
+ end
57
+ end
58
+
59
+ context 'when removal was not successful' do
60
+
61
+ it 'raises an exception', if: write_command_enabled? do
62
+ expect {
63
+ view.remove('notauser')
64
+ }.to raise_error(Mongo::Error::OperationFailure)
65
+ end
66
+
67
+ it 'does not raise an exception', unless: write_command_enabled? do
68
+ expect(view.remove('notauser').written_count).to eq(0)
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#update' do
74
+
75
+ end
76
+ end
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::User do
4
+
5
+ let(:options) do
6
+ { database: 'testing', user: 'user', password: 'pass' }
7
+ end
8
+
9
+ let(:user) do
10
+ described_class.new(options)
11
+ end
12
+
13
+ describe '#auth_key' do
14
+
15
+ let(:nonce) do
16
+
17
+ end
18
+
19
+ let(:expected) do
20
+ Digest::MD5.hexdigest("#{nonce}#{user.name}#{user.hashed_password}")
21
+ end
22
+
23
+ it 'returns the users authentication key' do
24
+ expect(user.auth_key(nonce)).to eq(expected)
25
+ end
26
+ end
27
+
28
+ describe '#encoded_name' do
29
+
30
+ context 'when the user name contains an =' do
31
+
32
+ let(:options) do
33
+ { user: 'user=' }
34
+ end
35
+
36
+ it 'escapes the = character to =3D' do
37
+ expect(user.encoded_name).to eq('user=3D')
38
+ end
39
+
40
+ it 'returns a UTF-8 string' do
41
+ expect(user.encoded_name.encoding.name).to eq('UTF-8')
42
+ end
43
+ end
44
+
45
+ context 'when the user name contains a ,' do
46
+
47
+ let(:options) do
48
+ { user: 'user,' }
49
+ end
50
+
51
+ it 'escapes the , character to =2C' do
52
+ expect(user.encoded_name).to eq('user=2C')
53
+ end
54
+
55
+ it 'returns a UTF-8 string' do
56
+ expect(user.encoded_name.encoding.name).to eq('UTF-8')
57
+ end
58
+ end
59
+
60
+ context 'when the user name contains no special characters' do
61
+
62
+ it 'does not alter the user name' do
63
+ expect(user.name).to eq('user')
64
+ end
65
+
66
+ it 'returns a UTF-8 string' do
67
+ expect(user.encoded_name.encoding.name).to eq('UTF-8')
68
+ end
69
+ end
70
+ end
71
+
72
+ describe '#initialize' do
73
+
74
+ it 'sets the database' do
75
+ expect(user.database).to eq('testing')
76
+ end
77
+
78
+ it 'sets the name' do
79
+ expect(user.name).to eq('user')
80
+ end
81
+
82
+ it 'sets the password' do
83
+ expect(user.password).to eq('pass')
84
+ end
85
+ end
86
+
87
+ describe '#hashed_password' do
88
+
89
+ let(:expected) do
90
+ Digest::MD5.hexdigest("user:mongo:pass")
91
+ end
92
+
93
+ it 'returns the hashed password' do
94
+ expect(user.hashed_password).to eq(expected)
95
+ end
96
+ end
97
+
98
+ describe '#mechanism' do
99
+
100
+ context 'when the option is provided' do
101
+
102
+ let(:options) do
103
+ { database: 'testing', user: 'user', password: 'pass', auth_mech: :plain }
104
+ end
105
+
106
+ let(:user) do
107
+ described_class.new(options)
108
+ end
109
+
110
+ it 'returns the option' do
111
+ expect(user.mechanism).to eq(:plain)
112
+ end
113
+ end
114
+
115
+ context 'when no option is provided' do
116
+
117
+ let(:user) do
118
+ described_class.new(options)
119
+ end
120
+
121
+ it 'returns the default' do
122
+ expect(user.mechanism).to eq(:mongodb_cr)
123
+ end
124
+ end
125
+ end
126
+
127
+ describe '#auth_mech_properties' do
128
+
129
+ context 'when the option is provided' do
130
+
131
+ let(:auth_mech_properties) do
132
+ { service_name: 'test',
133
+ service_realm: 'test',
134
+ canonicalize_host_name: true }
135
+ end
136
+
137
+ let(:options) do
138
+ { database: 'testing', user: 'user', password: 'pass', auth_mech_properties: auth_mech_properties }
139
+ end
140
+
141
+ let(:user) do
142
+ described_class.new(options)
143
+ end
144
+
145
+ it 'returns the option' do
146
+ expect(user.auth_mech_properties).to eq(auth_mech_properties)
147
+ end
148
+ end
149
+
150
+ context 'when no option is provided' do
151
+
152
+ let(:user) do
153
+ described_class.new(options)
154
+ end
155
+
156
+ it 'returns an empty hash' do
157
+ expect(user.auth_mech_properties).to eq({})
158
+ end
159
+ end
160
+ end
161
+
162
+ describe '#roles' do
163
+
164
+ context 'when roles are provided' do
165
+
166
+ let(:roles) do
167
+ [ Mongo::Auth::Roles::ROOT ]
168
+ end
169
+
170
+ let(:user) do
171
+ described_class.new(roles: roles)
172
+ end
173
+
174
+ it 'returns the roles' do
175
+ expect(user.roles).to eq(roles)
176
+ end
177
+ end
178
+
179
+ context 'when no roles are provided' do
180
+
181
+ let(:user) do
182
+ described_class.new({})
183
+ end
184
+
185
+ it 'returns an empty array' do
186
+ expect(user.roles).to be_empty
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth::X509 do
4
+
5
+ let(:address) do
6
+ Mongo::Address.new(DEFAULT_ADDRESS)
7
+ end
8
+
9
+ let(:server) do
10
+ Mongo::Server.new(address, Mongo::Event::Listeners.new)
11
+ end
12
+
13
+ let(:connection) do
14
+ Mongo::Server::Connection.new(server)
15
+ end
16
+
17
+ let(:user) do
18
+ Mongo::Auth::User.new(database: TEST_DB, user: 'driver', password: 'password')
19
+ end
20
+
21
+ describe '#login' do
22
+
23
+ context 'when the user is not authorized for the database' do
24
+
25
+ let(:cr) do
26
+ described_class.new(user)
27
+ end
28
+
29
+ let(:login) do
30
+ cr.login(connection).documents[0]
31
+ end
32
+
33
+ it 'logs the user into the connection' do
34
+ expect {
35
+ cr.login(connection)
36
+ }.to raise_error(Mongo::Auth::Unauthorized)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Auth do
4
+
5
+ describe '#get' do
6
+
7
+ context 'when a mongodb_cr user is provided' do
8
+
9
+ let(:user) do
10
+ Mongo::Auth::User.new(auth_mech: :mongodb_cr)
11
+ end
12
+
13
+ let(:cr) do
14
+ described_class.get(user)
15
+ end
16
+
17
+ it 'returns CR' do
18
+ expect(cr).to be_a(Mongo::Auth::CR)
19
+ end
20
+ end
21
+
22
+ context 'when a mongodb_x509 user is provided' do
23
+
24
+ let(:user) do
25
+ Mongo::Auth::User.new(auth_mech: :mongodb_x509)
26
+ end
27
+
28
+ let(:x509) do
29
+ described_class.get(user)
30
+ end
31
+
32
+ it 'returns X509' do
33
+ expect(x509).to be_a(Mongo::Auth::X509)
34
+ end
35
+ end
36
+
37
+ context 'when a plain user is provided' do
38
+
39
+ let(:user) do
40
+ Mongo::Auth::User.new(auth_mech: :plain)
41
+ end
42
+
43
+ let(:ldap) do
44
+ described_class.get(user)
45
+ end
46
+
47
+ it 'returns LDAP' do
48
+ expect(ldap).to be_a(Mongo::Auth::LDAP)
49
+ end
50
+ end
51
+
52
+ context 'when an invalid mechanism is provided' do
53
+
54
+ let(:user) do
55
+ Mongo::Auth::User.new(auth_mech: :nothing)
56
+ end
57
+
58
+ it 'raises an error' do
59
+ expect {
60
+ described_class.get(user)
61
+ }.to raise_error(Mongo::Auth::InvalidMechanism)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::BulkWrite do
4
+
5
+ before do
6
+ authorized_collection.find.remove_many
7
+ end
8
+
9
+ describe '#execute' do
10
+
11
+ let(:bulk) do
12
+ described_class.new(operations, options, authorized_collection)
13
+ end
14
+
15
+ context 'when the operations are ordered' do
16
+
17
+ let(:options) do
18
+ { ordered: true }
19
+ end
20
+
21
+ it_behaves_like 'a bulk write object'
22
+
23
+ context 'when the insert batch requires splitting' do
24
+
25
+ context 'when the operations exceed the max batch size' do
26
+
27
+ let(:error) do
28
+ begin
29
+ bulk.execute
30
+ rescue => ex
31
+ ex
32
+ end
33
+ end
34
+
35
+ let(:operations) do
36
+ [].tap do |ops|
37
+ 3000.times do |i|
38
+ ops << { insert_one: { _id: i } }
39
+ end
40
+ ops << { insert_one: { _id: 0 } }
41
+ ops << { insert_one: { _id: 3001 } }
42
+ end
43
+ end
44
+
45
+ it 'raises an error' do
46
+ expect(error).to be_a(Mongo::Error::BulkWriteFailure)
47
+ end
48
+
49
+ it 'halts execution after first error and reports correct index' do
50
+ expect(error.result['writeErrors'].first['index']).to eq(3000)
51
+ expect(authorized_collection.find.count).to eq(3000)
52
+ end
53
+ end
54
+
55
+ context 'when the operations exceed the max bson size' do
56
+
57
+ let(:error) do
58
+ begin
59
+ bulk.execute
60
+ rescue => ex
61
+ ex
62
+ end
63
+ end
64
+
65
+ let(:operations) do
66
+ [].tap do |ops|
67
+ 6.times do |i|
68
+ ops << { insert_one: { _id: i, x: 'y'*4000000 } }
69
+ end
70
+ ops << { insert_one: { _id: 0 } }
71
+ ops << { insert_one: { _id: 100 } }
72
+ end
73
+ end
74
+
75
+ it 'raises an error' do
76
+ expect(error).to be_a(Mongo::Error::BulkWriteFailure)
77
+ end
78
+
79
+ it 'splits messages into multiple messages' do
80
+ error
81
+ expect(authorized_collection.find.count).to eq(6)
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ context 'when the operations are unordered' do
88
+
89
+ before do
90
+ authorized_collection.find.remove_many
91
+ end
92
+
93
+ let(:options) do
94
+ { ordered: false }
95
+ end
96
+
97
+ let(:bulk) do
98
+ described_class.new(operations, options, authorized_collection)
99
+ end
100
+
101
+ it_behaves_like 'a bulk write object'
102
+
103
+ context 'when the insert batch requires splitting' do
104
+
105
+ context 'when the operations exceed the max batch size' do
106
+
107
+ let(:error) do
108
+ begin
109
+ bulk.execute
110
+ rescue => ex
111
+ ex
112
+ end
113
+ end
114
+
115
+ let(:operations) do
116
+ [].tap do |ops|
117
+ 3000.times do |i|
118
+ ops << { insert_one: { _id: i } }
119
+ end
120
+ ops << { insert_one: { _id: 0 } }
121
+ ops << { insert_one: { _id: 3001 } }
122
+ end
123
+ end
124
+
125
+ after do
126
+ authorized_collection.find.remove_many
127
+ end
128
+
129
+ it 'raises an error' do
130
+ expect(error).to be_a(Mongo::Error::BulkWriteFailure)
131
+ end
132
+
133
+ it 'does not halt execution after first error' do
134
+ expect(error.result['writeErrors'].first['index']).to eq(3000)
135
+ expect(authorized_collection.find.count).to eq(3001)
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'when the operations exceed the max bson size' do
141
+
142
+ let(:error) do
143
+ begin
144
+ bulk.execute
145
+ rescue => ex
146
+ ex
147
+ end
148
+ end
149
+
150
+ let(:operations) do
151
+ [].tap do |ops|
152
+ 15.times do |i|
153
+ ops << { insert_one: { _id: i, x: 'y'*4000000 } }
154
+ end
155
+ ops << { insert_one: { _id: 0 } }
156
+ ops << { insert_one: { _id: 100 } }
157
+ end
158
+ end
159
+
160
+ after do
161
+ authorized_collection.find.remove_many
162
+ end
163
+
164
+ it 'raises an error' do
165
+ expect(error).to be_a(Mongo::Error::BulkWriteFailure)
166
+ end
167
+
168
+ it 'splits messages into multiple messages' do
169
+ error
170
+ expect(authorized_collection.find.count).to eq(16)
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end