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,157 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::Reply do
4
+
5
+ let(:length) { 78 }
6
+ let(:request_id) { 0 }
7
+ let(:response_to) { 0 }
8
+ let(:op_code) { 1 }
9
+ let(:flags) { 0 }
10
+ let(:start) { 0 }
11
+ let(:n_returned) { 2 }
12
+ let(:cursor_id) { 999_999 }
13
+ let(:doc) { { 'name' => 'Tyler' } }
14
+ let(:documents) { [doc] * 2 }
15
+
16
+ let(:header) do
17
+ [length, request_id, response_to, op_code].pack('l<l<l<l<')
18
+ end
19
+
20
+ let(:data) do
21
+ data = [flags].pack('l<')
22
+ data << [cursor_id].pack('q<')
23
+ data << [start].pack('l<')
24
+ data << [n_returned].pack('l<')
25
+ data << documents.map(&:to_bson).join
26
+ end
27
+
28
+ let(:io) { StringIO.new(header + data) }
29
+ let(:reply) { described_class.deserialize(io) }
30
+
31
+ describe '#==' do
32
+
33
+ context 'when the other is a reply' do
34
+
35
+ context 'when the fields are equal' do
36
+ let(:other) do
37
+ other = described_class.allocate
38
+ other.instance_variable_set(:@flags, [])
39
+ other.instance_variable_set(:@number_returned, n_returned)
40
+ other.instance_variable_set(:@cursor_id, cursor_id)
41
+ other.instance_variable_set(:@documents, documents)
42
+ other.instance_variable_set(:@starting_from, start)
43
+ other
44
+ end
45
+
46
+ it 'returns true' do
47
+ expect(reply).to eq(other)
48
+ end
49
+ end
50
+
51
+ context 'when fields are not equal' do
52
+ let(:other) do
53
+ other = described_class.allocate
54
+ other.instance_variable_set(:@flags, [:await_capable])
55
+ other.instance_variable_set(:@number_returned, n_returned)
56
+ other.instance_variable_set(:@cursor_id, cursor_id)
57
+ other.instance_variable_set(:@documents, documents)
58
+ other.instance_variable_set(:@starting_from, start)
59
+ other
60
+ end
61
+
62
+ it 'returns false' do
63
+ expect(reply).not_to eq(other)
64
+ end
65
+ end
66
+ end
67
+
68
+ context 'when the other is not a reply' do
69
+ let(:other) do
70
+ expect(message).not_to eq('test')
71
+ end
72
+ end
73
+ end
74
+
75
+ describe '#hash' do
76
+ let(:values) do
77
+ reply.send(:fields).map do |field|
78
+ reply.instance_variable_get(field[:name])
79
+ end
80
+ end
81
+
82
+ it 'returns a hash of the field values' do
83
+ expect(reply.hash).to eq(values.hash)
84
+ end
85
+ end
86
+
87
+ describe '#deserialize' do
88
+
89
+ describe 'response flags' do
90
+
91
+ context 'no flags' do
92
+ it 'sets no flags' do
93
+ expect(reply.flags).to be_empty
94
+ end
95
+ end
96
+
97
+ context 'cursor not found' do
98
+ let(:flags) { 1 }
99
+ it 'sets the cursor not found flag' do
100
+ expect(reply.flags).to eq([:cursor_not_found])
101
+ end
102
+ end
103
+
104
+ context 'query failure' do
105
+ let(:flags) { 2 }
106
+ it 'sets the query failure flag' do
107
+ expect(reply.flags).to eq([:query_failure])
108
+ end
109
+ end
110
+
111
+ context 'shard config stale' do
112
+ let(:flags) { 4 }
113
+ it 'sets the shard config stale flag' do
114
+ expect(reply.flags).to eq([:shard_config_stale])
115
+ end
116
+ end
117
+
118
+ context 'await capable' do
119
+ let(:flags) { 8 }
120
+ it 'sets the await capable flag' do
121
+ expect(reply.flags).to eq([:await_capable])
122
+ end
123
+ end
124
+
125
+ context 'multiple flags' do
126
+ let(:flags) { 10 }
127
+ it 'sets multiple flags' do
128
+ expect(reply.flags).to include(:query_failure, :await_capable)
129
+ end
130
+ end
131
+ end
132
+
133
+ describe 'cursor id' do
134
+ it 'sets the cursor id attribute' do
135
+ expect(reply.cursor_id).to eq(cursor_id)
136
+ end
137
+ end
138
+
139
+ describe 'starting from' do
140
+ it 'sets the starting from attribute' do
141
+ expect(reply.starting_from).to eq(start)
142
+ end
143
+ end
144
+
145
+ describe 'number returned' do
146
+ it 'sets the number returned attribute' do
147
+ expect(reply.number_returned).to eq(n_returned)
148
+ end
149
+ end
150
+
151
+ describe 'documents' do
152
+ it 'sets the documents attribute' do
153
+ expect(reply.documents).to eq(documents)
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Protocol::Update do
4
+
5
+ let(:opcode) { 2001 }
6
+ let(:db) { TEST_DB }
7
+ let(:coll) { TEST_COLL }
8
+ let(:ns) { "#{db}.#{coll}" }
9
+ let(:selector) { { :name => 'Tyler' } }
10
+ let(:update_doc) { { :name => 'Bob' } }
11
+ let(:options) { Hash.new }
12
+
13
+ let(:message) do
14
+ described_class.new(db, coll, selector, update_doc, options)
15
+ end
16
+
17
+ describe '#initialize' do
18
+
19
+ it 'sets the namespace' do
20
+ expect(message.namespace).to eq(ns)
21
+ end
22
+
23
+ it 'sets the selector' do
24
+ expect(message.selector).to eq(selector)
25
+ end
26
+
27
+ it 'sets the update document' do
28
+ expect(message.update).to eq(update_doc)
29
+ end
30
+ end
31
+
32
+ describe '#==' do
33
+
34
+ context 'when the other is an update' do
35
+
36
+ context 'when the fields are equal' do
37
+ let(:other) do
38
+ described_class.new(db, coll, selector, update_doc, options)
39
+ end
40
+
41
+ it 'returns true' do
42
+ expect(message).to eq(other)
43
+ end
44
+ end
45
+
46
+ context 'when the database is not equal' do
47
+ let(:other) do
48
+ described_class.new('tyler', coll, selector, update_doc, options)
49
+ end
50
+
51
+ it 'returns false' do
52
+ expect(message).not_to eq(other)
53
+ end
54
+ end
55
+
56
+ context 'when the collection is not equal' do
57
+ let(:other) do
58
+ described_class.new(db, 'tyler', selector, update_doc, options)
59
+ end
60
+
61
+ it 'returns false' do
62
+ expect(message).not_to eq(other)
63
+ end
64
+ end
65
+
66
+ context 'when the selector is not equal' do
67
+ let(:other) do
68
+ described_class.new(db, coll, { :a => 1 }, update_doc, options)
69
+ end
70
+
71
+ it 'returns false' do
72
+ expect(message).not_to eq(other)
73
+ end
74
+ end
75
+
76
+ context 'when the update document is not equal' do
77
+ let(:other) do
78
+ described_class.new(db, coll, selector, { :a => 1 }, options)
79
+ end
80
+
81
+ it 'returns false' do
82
+ expect(message).not_to eq(other)
83
+ end
84
+ end
85
+
86
+ context 'when the options are not equal' do
87
+ let(:other) do
88
+ described_class.new(db, coll, selector, update_doc,
89
+ :flags => :upsert)
90
+ end
91
+
92
+ it 'returns false' do
93
+ expect(message).not_to eq(other)
94
+ end
95
+ end
96
+ end
97
+
98
+ context 'when the other is not a query' do
99
+ let(:other) do
100
+ expect(message).not_to eq('test')
101
+ end
102
+ end
103
+ end
104
+
105
+ describe '#hash' do
106
+ let(:values) do
107
+ message.send(:fields).map do |field|
108
+ message.instance_variable_get(field[:name])
109
+ end
110
+ end
111
+
112
+ it 'returns a hash of the field values' do
113
+ expect(message.hash).to eq(values.hash)
114
+ end
115
+ end
116
+
117
+ describe '#replyable?' do
118
+
119
+ it 'returns false' do
120
+ expect(message).to_not be_replyable
121
+ end
122
+ end
123
+
124
+ describe '#serialize' do
125
+ let(:bytes) { message.serialize }
126
+
127
+ include_examples 'message with a header'
128
+
129
+ describe 'zero' do
130
+ let(:field) { bytes[16..19] }
131
+
132
+ it 'serializes a zero' do
133
+ expect(field).to be_int32(0)
134
+ end
135
+ end
136
+
137
+ describe 'namespace' do
138
+ let(:field) { bytes[20..36] }
139
+ it 'serializes the namespace' do
140
+ expect(field).to be_cstring(ns)
141
+ end
142
+ end
143
+
144
+ describe 'flags' do
145
+ let(:field) { bytes[37..40] }
146
+
147
+ context 'when no flags are provided' do
148
+ it 'does not set any bits' do
149
+ expect(field).to be_int32(0)
150
+ end
151
+ end
152
+
153
+ context 'when flags are provided' do
154
+ let(:options) { { :flags => flags } }
155
+
156
+ context 'upsert flag' do
157
+ let(:flags) { [:upsert] }
158
+ it 'sets the first bit' do
159
+ expect(field).to be_int32(1)
160
+ end
161
+ end
162
+
163
+ context 'multi update' do
164
+ let(:flags) { [:multi_update] }
165
+ it 'sets the second bit' do
166
+ expect(field).to be_int32(2)
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ describe 'selector' do
173
+ let(:field) { bytes[41..61] }
174
+ it 'serializes the selector' do
175
+ expect(field).to be_bson(selector)
176
+ end
177
+ end
178
+
179
+ describe 'update' do
180
+ let(:field) { bytes[62..80] }
181
+ it 'serializes the update' do
182
+ expect(field).to be_bson(update_doc)
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Server::ConnectionPool::Queue do
4
+
5
+ describe '#dequeue' do
6
+
7
+ let(:connection) do
8
+ double('connection')
9
+ end
10
+
11
+ let(:queue) do
12
+ described_class.new(:max_pool_size => 1) { connection }
13
+ end
14
+
15
+ context 'when the queue is empty' do
16
+
17
+ context 'when the max size is reached' do
18
+
19
+ it 'raises a timeout error' do
20
+ expect {
21
+ queue.dequeue
22
+ queue.dequeue
23
+ }.to raise_error(Timeout::Error)
24
+ end
25
+ end
26
+
27
+ context 'when the max size is not reached' do
28
+
29
+ it 'creates a new connecection' do
30
+ expect(queue.dequeue).to eq(connection)
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'when waiting for a connection to be enqueued' do
36
+
37
+ before do
38
+ Thread.new do
39
+ sleep(0.5)
40
+ queue.enqueue(connection)
41
+ end.join
42
+ end
43
+
44
+ it 'returns the enqueued connection' do
45
+ expect(queue.dequeue).to eq(connection)
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '#enqueue' do
51
+
52
+ let(:connection) do
53
+ double('connection')
54
+ end
55
+
56
+ let(:queue) do
57
+ described_class.new { connection }
58
+ end
59
+
60
+ before do
61
+ queue.enqueue(connection)
62
+ end
63
+
64
+ it 'adds the connection to the queue' do
65
+ expect(queue.dequeue).to eq(connection)
66
+ end
67
+ end
68
+
69
+ describe '#initialize' do
70
+
71
+ context 'when a min size is provided' do
72
+
73
+ let(:queue) do
74
+ described_class.new(:min_pool_size => 2) { double('connection') }
75
+ end
76
+
77
+ it 'creates the queue with the minimum connections' do
78
+ expect(queue.size).to eq(2)
79
+ end
80
+ end
81
+
82
+ context 'when no min size is provided' do
83
+
84
+ let(:queue) do
85
+ described_class.new { double('connection') }
86
+ end
87
+
88
+ it 'creates the queue with the default connections' do
89
+ expect(queue.size).to eq(1)
90
+ end
91
+ end
92
+ end
93
+
94
+ describe '#inspect' do
95
+
96
+ let(:queue) do
97
+ described_class.new(:min_pool_size => 2) { double('connection') }
98
+ end
99
+
100
+ it 'includes the object id' do
101
+ expect(queue.inspect).to include(queue.object_id.to_s)
102
+ end
103
+
104
+ it 'includes the min size' do
105
+ expect(queue.inspect).to include('min_size=2')
106
+ end
107
+
108
+ it 'includes the max size' do
109
+ expect(queue.inspect).to include('max_size=5')
110
+ end
111
+
112
+ it 'includes the wait timeout' do
113
+ expect(queue.inspect).to include('wait_timeout=1')
114
+ end
115
+
116
+ it 'includes the current size' do
117
+ expect(queue.inspect).to include('current_size=2')
118
+ end
119
+ end
120
+
121
+ describe '#max_size' do
122
+
123
+ context 'when a max pool size option is provided' do
124
+
125
+ let(:queue) do
126
+ described_class.new(:max_pool_size => 3) { double('connection') }
127
+ end
128
+
129
+ it 'returns the max size' do
130
+ expect(queue.max_size).to eq(3)
131
+ end
132
+ end
133
+
134
+ context 'when no pool size option is provided' do
135
+
136
+ let(:queue) do
137
+ described_class.new { double('connection') }
138
+ end
139
+
140
+ it 'returns the default size' do
141
+ expect(queue.max_size).to eq(5)
142
+ end
143
+ end
144
+ end
145
+
146
+ describe '#wait_timeout' do
147
+
148
+ context 'when the wait timeout option is provided' do
149
+
150
+ let(:queue) do
151
+ described_class.new(:wait_queue_timeout => 3) { double('connection') }
152
+ end
153
+
154
+ it 'returns the wait timeout' do
155
+ expect(queue.wait_timeout).to eq(3)
156
+ end
157
+ end
158
+
159
+ context 'when the wait timeout option is not provided' do
160
+
161
+ let(:queue) do
162
+ described_class.new { double('connection') }
163
+ end
164
+
165
+ it 'returns the default wait timeout' do
166
+ expect(queue.wait_timeout).to eq(1)
167
+ end
168
+ end
169
+ end
170
+ end