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,233 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the 'License');
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an 'AS IS' BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+
17
+ # The client is the entry point to the driver and is the main object that
18
+ # will be interacted with.
19
+ #
20
+ # @since 2.0.0
21
+ class Client
22
+ extend Forwardable
23
+
24
+ # @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
25
+ attr_reader :cluster
26
+
27
+ # @return [ Mongo::Database ] database The database the client is operating on.
28
+ attr_reader :database
29
+
30
+ # @return [ Hash ] options The configuration options.
31
+ attr_reader :options
32
+
33
+ # Delegate command execution to the current database.
34
+ def_delegators :@database, :command
35
+
36
+ # Determine if this client is equivalent to another object.
37
+ #
38
+ # @example Check client equality.
39
+ # client == other
40
+ #
41
+ # @param [ Object ] other The object to compare to.
42
+ #
43
+ # @return [ true, false ] If the objects are equal.
44
+ #
45
+ # @since 2.0.0
46
+ def ==(other)
47
+ return false unless other.is_a?(Client)
48
+ cluster == other.cluster && options == other.options
49
+ end
50
+ alias_method :eql?, :==
51
+
52
+ # Get a collection object for the provided collection name.
53
+ #
54
+ # @example Get the collection.
55
+ # client[:users]
56
+ #
57
+ # @param [ String, Symbol ] collection_name The name of the collection.
58
+ # @param [ Hash ] options The options to the collection.
59
+ #
60
+ # @return [ Mongo::Collection ] The collection.
61
+ #
62
+ # @since 2.0.0
63
+ def [](collection_name, options = {})
64
+ database[collection_name, options]
65
+ end
66
+
67
+ # Get the hash value of the client.
68
+ #
69
+ # @example Get the client hash value.
70
+ # client.hash
71
+ #
72
+ # @return [ Integer ] The client hash value.
73
+ #
74
+ # @since 2.0.0
75
+ def hash
76
+ [cluster, options].hash
77
+ end
78
+
79
+ # Instantiate a new driver client.
80
+ #
81
+ # @example Instantiate a single server or mongos client.
82
+ # Mongo::Client.new([ '127.0.0.1:27017' ])
83
+ #
84
+ # @example Instantiate a client for a replica set.
85
+ # Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27021' ])
86
+ #
87
+ # @param [ Array<String>, String ] addresses_or_uri The array of server addresses in the
88
+ # form of host:port or a MongoDB URI connection string.
89
+ # @param [ Hash ] options The options to be used by the client.
90
+ #
91
+ # @option options [ Symbol ] :auth_mech The authentication mechanism to
92
+ # use. One of :mongodb_cr, :mongodb_x509, :plain, :scram
93
+ # @option options [ String ] :auth_source The source to authenticate from.
94
+ # @option options [ Symbol ] :connect The connection method to use. This
95
+ # forces the cluster to behave in the specified way instead of
96
+ # auto-discovering. One of :direct, :replica_set, :sharded
97
+ # @option options [ String ] :database The database to connect to.
98
+ # @option options [ Hash ] :auth_mech_properties
99
+ # @option options [ Float ] :heartbeat_frequency The number of seconds for
100
+ # the server monitor to refresh it's description via ismaster.
101
+ # @option options [ Integer ] :local_threshold
102
+ # @option options [ Integer ] :server_selection_timeout
103
+ # @option options [ String ] :password The user's password.
104
+ # @option options [ Integer ] :max_pool_size The maximum size of the
105
+ # connection pool.
106
+ # @option options [ Integer ] :min_pool_size The minimum size of the
107
+ # connection pool.
108
+ # @option options [ Float ] :wait_queue_timeout The time to wait, in
109
+ # seconds, in the connection pool for a connection to be checked in.
110
+ # @option options [ Float ] :connect_timeout The timeout, in seconds, to
111
+ # attempt a connection.
112
+ # @option options [ Symbol ] :read The read preference options. :mode can
113
+ # be one of :secondary, :secondary_preferred, :primary,
114
+ # :primary_preferred, :nearest.
115
+ # @option options [ Array<Hash, String> ] :roles The list of roles for the
116
+ # user.
117
+ # @option options [ Symbol ] :replica_set The name of the replica set to
118
+ # connect to. Servers not in this replica set will be ignored.
119
+ # @option options [ true, false ] :ssl Whether to use SSL.
120
+ # @option options [ Float ] :socket_timeout The timeout, in seconds, to
121
+ # execute operations on a socket.
122
+ # @option options [ String ] :user The user name.
123
+ # @option options [ Hash ] :write The write concern options. Can be :w =>
124
+ # Integer, :fsync => Boolean, :j => Boolean.
125
+ #
126
+ # @since 2.0.0
127
+ def initialize(addresses_or_uri, options = {})
128
+ if addresses_or_uri.is_a?(::String)
129
+ create_from_uri(addresses_or_uri, options)
130
+ else
131
+ create_from_addresses(addresses_or_uri, options)
132
+ end
133
+ end
134
+
135
+ # Get an inspection of the client as a string.
136
+ #
137
+ # @example Inspect the client.
138
+ # client.inspect
139
+ #
140
+ # @return [ String ] The inspection string.
141
+ #
142
+ # @since 2.0.0
143
+ def inspect
144
+ "<Mongo::Client:0x#{object_id} cluster=#{cluster.addresses.join(', ')}>"
145
+ end
146
+
147
+ # Get the read preference from the options passed to the client.
148
+ #
149
+ # @example Get the read preference.
150
+ # client.read_preference
151
+ #
152
+ # @return [ Object ] The appropriate read preference or primary if none
153
+ # was provided to the client.
154
+ #
155
+ # @since 2.0.0
156
+ def read_preference
157
+ @read_preference ||= ServerSelector.get(options[:read] || {}, options)
158
+ end
159
+
160
+ # Use the database with the provided name. This will switch the current
161
+ # database the client is operating on.
162
+ #
163
+ # @example Use the provided database.
164
+ # client.use(:users)
165
+ #
166
+ # @param [ String, Symbol ] name The name of the database to use.
167
+ #
168
+ # @return [ Mongo::Client ] The new client with new database.
169
+ #
170
+ # @since 2.0.0
171
+ def use(name)
172
+ with(database: name)
173
+ end
174
+
175
+ # Provides a new client with the passed options merged over the existing
176
+ # options of this client. Useful for one-offs to change specific options
177
+ # without altering the original client.
178
+ #
179
+ # @example Get a client with changed options.
180
+ # client.with(:read => { :mode => :primary_preferred })
181
+ #
182
+ # @param [ Hash ] new_options The new options to use.
183
+ #
184
+ # @return [ Mongo::Client ] A new client instance.
185
+ #
186
+ # @since 2.0.0
187
+ def with(new_options = {})
188
+ clone.tap do |client|
189
+ client.options.update(new_options)
190
+ Database.create(client)
191
+ # We can't use the same cluster if authentication details have changed.
192
+ if new_options[:user] || new_options[:password]
193
+ Cluster.create(client)
194
+ end
195
+ end
196
+ end
197
+
198
+ # Get the write concern for this client. If no option was provided, then a
199
+ # default single server acknowledgement will be used.
200
+ #
201
+ # @example Get the client write concern.
202
+ # client.write_concern
203
+ #
204
+ # @return [ Mongo::WriteConcern ] The write concern.
205
+ #
206
+ # @since 2.0.0
207
+ def write_concern
208
+ @write_concern ||= WriteConcern.get(options[:write])
209
+ end
210
+
211
+ private
212
+
213
+ def create_from_addresses(addresses, opts = {})
214
+ @options = Database::DEFAULT_OPTIONS.merge(opts).freeze
215
+ @cluster = Cluster.new(addresses, options)
216
+ @database = Database.new(self, options[:database], options)
217
+ end
218
+
219
+ def create_from_uri(connection_string, opts = {})
220
+ uri = URI.new(connection_string)
221
+ @options = Database::DEFAULT_OPTIONS.merge(uri.client_options.merge(opts)).freeze
222
+ @cluster = Cluster.new(uri.servers, options)
223
+ @database = Database.new(self, options[:database], options)
224
+ end
225
+
226
+ def initialize_copy(original)
227
+ @options = original.options.dup
228
+ @database = nil
229
+ @read_preference = nil
230
+ @write_concern = nil
231
+ end
232
+ end
233
+ end
@@ -0,0 +1,203 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'mongo/cluster/topology'
16
+
17
+ module Mongo
18
+
19
+ # Represents a group of servers on the server side, either as a single server, a
20
+ # replica set, or a single or multiple mongos.
21
+ #
22
+ # @since 2.0.0
23
+ class Cluster
24
+ extend Forwardable
25
+ include Event::Subscriber
26
+ include Loggable
27
+
28
+ # @return [ Array<String> ] The provided seed addresses.
29
+ attr_reader :addresses
30
+
31
+ # @return [ Hash ] The options hash.
32
+ attr_reader :options
33
+
34
+ # @return [ Object ] The cluster topology.
35
+ attr_reader :topology
36
+
37
+ def_delegators :topology, :replica_set?, :replica_set_name, :sharded?, :standalone?, :unknown?
38
+
39
+ # Determine if this cluster of servers is equal to another object. Checks the
40
+ # servers currently in the cluster, not what was configured.
41
+ #
42
+ # @example Is the cluster equal to the object?
43
+ # cluster == other
44
+ #
45
+ # @param [ Object ] other The object to compare to.
46
+ #
47
+ # @return [ true, false ] If the objects are equal.
48
+ #
49
+ # @since 2.0.0
50
+ def ==(other)
51
+ return false unless other.is_a?(Cluster)
52
+ addresses == other.addresses && options == other.options
53
+ end
54
+
55
+ # Add a server to the cluster with the provided address. Useful in
56
+ # auto-discovery of new servers when an existing server executes an ismaster
57
+ # and potentially non-configured servers were included.
58
+ #
59
+ # @example Add the server for the address to the cluster.
60
+ # cluster.add('127.0.0.1:27018')
61
+ #
62
+ # @param [ String ] host The address of the server to add.
63
+ #
64
+ # @return [ Server ] The newly added server, if not present already.
65
+ #
66
+ # @since 2.0.0
67
+ def add(host)
68
+ address = Address.new(host)
69
+ unless addresses.include?(address)
70
+ log_debug([ "Adding #{address.to_s} to the cluster." ])
71
+ addresses.push(address)
72
+ server = Server.new(address, event_listeners, options)
73
+ @servers.push(server)
74
+ server
75
+ end
76
+ end
77
+
78
+ # Instantiate the new cluster.
79
+ #
80
+ # @example Instantiate the cluster.
81
+ # Mongo::Cluster.new(["127.0.0.1:27017"])
82
+ #
83
+ # @param [ Array<String> ] seeds The addresses of the configured servers.
84
+ # @param [ Hash ] options The options.
85
+ #
86
+ # @since 2.0.0
87
+ def initialize(seeds, options = {})
88
+ @addresses = []
89
+ @servers = []
90
+ @event_listeners = Event::Listeners.new
91
+ @options = options.freeze
92
+ @topology = Topology.initial(seeds, options)
93
+
94
+ subscribe_to(Event::SERVER_ADDED, Event::ServerAdded.new(self))
95
+ subscribe_to(Event::SERVER_REMOVED, Event::ServerRemoved.new(self))
96
+ subscribe_to(Event::PRIMARY_ELECTED, Event::PrimaryElected.new(self))
97
+
98
+ seeds.each{ |seed| add(seed) }
99
+ end
100
+
101
+ # Get the nicer formatted string for use in inspection.
102
+ #
103
+ # @example Inspect the cluster.
104
+ # cluster.inspect
105
+ #
106
+ # @return [ String ] The cluster inspection.
107
+ #
108
+ # @since 2.0.0
109
+ def inspect
110
+ "#<Mongo::Cluster:0x#{object_id} servers=#{servers} topology=#{topology.display_name}>"
111
+ end
112
+
113
+ # Get the next primary server we can send an operation to.
114
+ #
115
+ # @example Get the next primary server.
116
+ # cluster.next_primary
117
+ #
118
+ # @return [ Mongo::Server ] A primary server.
119
+ #
120
+ # @since 2.0.0
121
+ def next_primary
122
+ ServerSelector.get({ mode: :primary }, options).select_server(self)
123
+ end
124
+
125
+ # Elect a primary server from the description that has just changed to a
126
+ # primary.
127
+ #
128
+ # @example Elect a primary server.
129
+ # cluster.elect_primary!(description)
130
+ #
131
+ # @param [ Server::Description ] description The newly elected primary.
132
+ #
133
+ # @return [ Topology ] The cluster topology.
134
+ #
135
+ # @since 2.0.0
136
+ def elect_primary!(description)
137
+ @topology = topology.elect_primary(description, @servers)
138
+ end
139
+
140
+ # Removed the server from the cluster for the provided address, if it
141
+ # exists.
142
+ #
143
+ # @example Remove the server from the cluster.
144
+ # server.remove('127.0.0.1:27017')
145
+ #
146
+ # @param [ String ] host The host/port or socket address.
147
+ #
148
+ # @since 2.0.0
149
+ def remove(host)
150
+ log_debug([ "#{host} being removed from the cluster." ])
151
+ address = Address.new(host)
152
+ removed_servers = @servers.reject!{ |server| server.address == address }
153
+ removed_servers.each{ |server| server.disconnect! } if removed_servers
154
+ addresses.reject!{ |addr| addr == address }
155
+ end
156
+
157
+ # Force a scan of all known servers in the cluster.
158
+ #
159
+ # @example Force a full cluster scan.
160
+ # cluster.scan!
161
+ #
162
+ # @note This operation is done synchronously. If servers in the cluster are
163
+ # down or slow to respond this can potentially be a slow operation.
164
+ #
165
+ # @return [ true ] Always true.
166
+ #
167
+ # @since 2.0.0
168
+ def scan!
169
+ @servers.each{ |server| server.scan! } and true
170
+ end
171
+
172
+ # Get a list of server candidates from the cluster that can have operations
173
+ # executed on them.
174
+ #
175
+ # @example Get the server candidates for an operation.
176
+ # cluster.servers
177
+ #
178
+ # @return [ Array<Server> ] The candidate servers.
179
+ #
180
+ # @since 2.0.0
181
+ def servers
182
+ topology.servers(@servers)
183
+ end
184
+
185
+ # Create a cluster for the provided client, for use when we don't want the
186
+ # client's original cluster instance to be the same.
187
+ #
188
+ # @api private
189
+ #
190
+ # @example Create a cluster for the client.
191
+ # Cluster.create(client)
192
+ #
193
+ # @param [ Client ] client The client to create on.
194
+ #
195
+ # @return [ Cluster ] The cluster.
196
+ #
197
+ # @since 2.0.0
198
+ def self.create(client)
199
+ cluster = Cluster.new(client.cluster.addresses.map(&:to_s), client.options)
200
+ client.instance_variable_set(:@cluster, cluster)
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,60 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'mongo/cluster/topology/replica_set'
16
+ require 'mongo/cluster/topology/sharded'
17
+ require 'mongo/cluster/topology/standalone'
18
+ require 'mongo/cluster/topology/unknown'
19
+
20
+ module Mongo
21
+ class Cluster
22
+
23
+ # Defines behaviour for getting servers.
24
+ #
25
+ # @since 2.0.0
26
+ module Topology
27
+ extend self
28
+
29
+ # The 2 various topologies for server selection.
30
+ #
31
+ # @since 2.0.0
32
+ OPTIONS = {
33
+ replica_set: ReplicaSet,
34
+ sharded: Sharded,
35
+ direct: Standalone
36
+ }
37
+
38
+ # Get the initial cluster topology for the provided options.
39
+ #
40
+ # @example Get the initial cluster topology.
41
+ # Topology.initial(topology: :replica_set)
42
+ #
43
+ # @param [ Hash ] options The cluster options.
44
+ #
45
+ # @return [ ReplicaSet, Sharded, Standalone ] The topology.
46
+ #
47
+ # @since 2.0.0
48
+ def initial(seeds, options)
49
+ if options.has_key?(:connect)
50
+ return OPTIONS.fetch(options[:connect]).new(options)
51
+ end
52
+ if options.has_key?(:replica_set)
53
+ ReplicaSet.new(options)
54
+ else
55
+ seeds.size > 1 ? Unknown.new(options) : Standalone.new(options)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end