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,521 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Collection::View do
4
+
5
+ let(:selector) do
6
+ {}
7
+ end
8
+
9
+ let(:options) do
10
+ {}
11
+ end
12
+
13
+ let(:view) do
14
+ described_class.new(authorized_collection, selector, options)
15
+ end
16
+
17
+ after do
18
+ authorized_collection.find.remove_many
19
+ end
20
+
21
+ describe '#==' do
22
+
23
+ context 'when the other object is not a collection view' do
24
+
25
+ let(:other) { 'test' }
26
+
27
+ it 'returns false' do
28
+ expect(view).to_not eq(other)
29
+ end
30
+ end
31
+
32
+ context 'when the views have the same collection, selector, and options' do
33
+
34
+ let(:other) do
35
+ described_class.new(authorized_collection, selector, options)
36
+ end
37
+
38
+ it 'returns true' do
39
+ expect(view).to eq(other)
40
+ end
41
+ end
42
+
43
+ context 'when two views have a different collection' do
44
+
45
+ let(:other_collection) do
46
+ authorized_client[:other]
47
+ end
48
+
49
+ let(:other) do
50
+ described_class.new(other_collection, selector, options)
51
+ end
52
+
53
+ it 'returns false' do
54
+ expect(view).not_to eq(other)
55
+ end
56
+ end
57
+
58
+ context 'when two views have a different selector' do
59
+
60
+ let(:other_selector) do
61
+ { 'name' => 'Emily' }
62
+ end
63
+
64
+ let(:other) do
65
+ described_class.new(authorized_collection, other_selector, options)
66
+ end
67
+
68
+ it 'returns false' do
69
+ expect(view).not_to eq(other)
70
+ end
71
+ end
72
+
73
+ context 'when two views have different options' do
74
+
75
+ let(:other_options) do
76
+ { 'limit' => 20 }
77
+ end
78
+
79
+ let(:other) do
80
+ described_class.new(authorized_collection, selector, other_options)
81
+ end
82
+
83
+ it 'returns false' do
84
+ expect(view).not_to eq(other)
85
+ end
86
+ end
87
+ end
88
+
89
+ describe 'copy' do
90
+
91
+ let(:view_clone) do
92
+ view.clone
93
+ end
94
+
95
+ it 'dups the options' do
96
+ expect(view.options).not_to be(view_clone.options)
97
+ end
98
+
99
+ it 'dups the selector' do
100
+ expect(view.selector).not_to be(view_clone.selector)
101
+ end
102
+
103
+ it 'references the same collection' do
104
+ expect(view.collection).to be(view_clone.collection)
105
+ end
106
+ end
107
+
108
+ describe '#each' do
109
+
110
+ let(:documents) do
111
+ (1..10).map{ |i| { field: "test#{i}" }}
112
+ end
113
+
114
+ before do
115
+ authorized_collection.insert_many(documents)
116
+ end
117
+
118
+ after do
119
+ authorized_collection.find.remove_many
120
+ end
121
+
122
+ context 'when sending the initial query' do
123
+
124
+ context 'when limit is specified' do
125
+
126
+ let(:options) do
127
+ { :limit => 5 }
128
+ end
129
+
130
+ before do
131
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
132
+ expect(spec[:options][:limit]).to eq(options[:limit])
133
+ end.and_call_original
134
+ end
135
+
136
+ let(:returned) do
137
+ view.to_a
138
+ end
139
+
140
+ it 'returns limited documents' do
141
+ expect(returned.count).to eq(5)
142
+ end
143
+
144
+ it 'allows iteration of the documents' do
145
+ returned.each do |doc|
146
+ expect(doc).to have_key('field')
147
+ end
148
+ end
149
+ end
150
+
151
+ context 'when batch size is specified' do
152
+
153
+ let(:options) do
154
+ { :batch_size => 5 }
155
+ end
156
+
157
+ before do
158
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
159
+ expect(spec[:options][:limit]).to eq(options[:batch_size])
160
+ end.and_call_original
161
+ end
162
+
163
+ let(:returned) do
164
+ view.to_a
165
+ end
166
+
167
+ it 'returns all the documents' do
168
+ expect(returned.count).to eq(10)
169
+ end
170
+
171
+ it 'allows iteration of all documents' do
172
+ returned.each do |doc|
173
+ expect(doc).to have_key('field')
174
+ end
175
+ end
176
+ end
177
+
178
+ context 'when no limit is specified' do
179
+
180
+ before do
181
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
182
+ expect(spec[:options][:limit]).to eq(nil)
183
+ end.and_call_original
184
+ end
185
+
186
+ let(:returned) do
187
+ view.to_a
188
+ end
189
+
190
+ it 'returns all the documents' do
191
+ expect(returned.count).to eq(10)
192
+ end
193
+
194
+ it 'allows iteration of all documents' do
195
+ returned.each do |doc|
196
+ expect(doc).to have_key('field')
197
+ end
198
+ end
199
+ end
200
+
201
+ context 'when batch size is greater than limit' do
202
+
203
+ let(:options) do
204
+ { :batch_size => 5, :limit => 3 }
205
+ end
206
+
207
+ before do
208
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
209
+ expect(spec[:options][:limit]).to eq(options[:limit])
210
+ end.and_call_original
211
+ end
212
+
213
+ let(:returned) do
214
+ view.to_a
215
+ end
216
+
217
+ it 'returns the limit of documents' do
218
+ expect(returned.count).to eq(3)
219
+ end
220
+
221
+ it 'allows iteration of the documents' do
222
+ returned.each do |doc|
223
+ expect(doc).to have_key('field')
224
+ end
225
+ end
226
+ end
227
+
228
+ context 'when limit is greater than batch size' do
229
+
230
+ let(:options) do
231
+ { :limit => 5, :batch_size => 3 }
232
+ end
233
+
234
+ before do
235
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
236
+ expect(spec[:options][:limit]).to eq(options[:batch_size])
237
+ end.and_call_original
238
+ end
239
+
240
+ let(:returned) do
241
+ view.to_a
242
+ end
243
+
244
+ it 'returns the limit of documents' do
245
+ expect(returned.count).to eq(5)
246
+ end
247
+
248
+ it 'allows iteration of the documents' do
249
+ returned.each do |doc|
250
+ expect(doc).to have_key('field')
251
+ end
252
+ end
253
+ end
254
+
255
+ context 'when the selector has special fields' do
256
+
257
+ context 'when a snapshot option is provided' do
258
+
259
+ let(:options) do
260
+ { :snapshot => true }
261
+ end
262
+
263
+ before do
264
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
265
+ expect(spec[:selector][:$query]).to eq(selector)
266
+ end.and_call_original
267
+ end
268
+
269
+ it 'creates a special query selector' do
270
+ view.each do |doc|
271
+ expect(doc).to have_key('field')
272
+ end
273
+ end
274
+ end
275
+
276
+ context 'when a max_scan option is provided' do
277
+
278
+ let(:options) do
279
+ { :max_scan => 100 }
280
+ end
281
+
282
+ before do
283
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
284
+ expect(spec[:selector][:$query]).to eq(selector)
285
+ end.and_call_original
286
+ end
287
+
288
+ it 'creates a special query selector' do
289
+ view.each do |doc|
290
+ expect(doc).to have_key('field')
291
+ end
292
+ end
293
+ end
294
+
295
+ context 'when a show_disk_loc option is provided' do
296
+
297
+ let(:options) do
298
+ { :show_disk_loc => true }
299
+ end
300
+
301
+ before do
302
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
303
+ expect(spec[:selector][:$query]).to eq(selector)
304
+ end.and_call_original
305
+ end
306
+
307
+ it 'creates a special query selector' do
308
+ view.each do |doc|
309
+ expect(doc).to have_key('field')
310
+ break
311
+ end
312
+ end
313
+ end
314
+ end
315
+
316
+ context 'when sorting' do
317
+
318
+ let(:options) do
319
+ { :sort => {'x' => Mongo::Index::ASCENDING }}
320
+ end
321
+
322
+ before do
323
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
324
+ expect(spec[:selector][:$query]).to eq(selector)
325
+ end.and_call_original
326
+ end
327
+
328
+ it 'creates a special query selector' do
329
+ view.each do |doc|
330
+ expect(doc).to have_key('field')
331
+ end
332
+ end
333
+ end
334
+
335
+ context 'when providing a hint' do
336
+
337
+ let(:options) do
338
+ { :hint => { 'x' => Mongo::Index::ASCENDING }}
339
+ end
340
+
341
+ before do
342
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
343
+ expect(spec[:selector][:$query]).to eq(selector)
344
+ end.and_call_original
345
+ end
346
+
347
+ it'creates a special query selector' do
348
+ view.each do |doc|
349
+ expect(doc).to have_key('$err')
350
+ end
351
+ end
352
+ end
353
+
354
+ context 'when providing a comment' do
355
+
356
+ let(:options) do
357
+ { :comment => 'query1' }
358
+ end
359
+
360
+ before do
361
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
362
+ expect(spec[:selector][:$query]).to eq(selector)
363
+ end.and_call_original
364
+ end
365
+
366
+ it 'creates a special query selector' do
367
+ view.each do |doc|
368
+ expect(doc).to have_key('field')
369
+ end
370
+ end
371
+ end
372
+
373
+ context 'when the cluster is sharded' do
374
+
375
+ before do
376
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
377
+ expect(spec[:selector][:$query]).to eq(selector)
378
+ end.and_call_original
379
+ end
380
+
381
+ it 'creates a special query selector' do
382
+ view.each do |doc|
383
+ expect(doc).to have_key('field')
384
+ end
385
+ end
386
+ end
387
+ end
388
+
389
+ context 'when there are no special fields' do
390
+
391
+ before do
392
+ expect(Mongo::Operation::Read::Query).to receive(:new) do |spec|
393
+ expect(spec[:selector]).to eq(selector)
394
+ end.and_call_original
395
+ end
396
+
397
+ it 'creates a normal query spec' do
398
+ view.each do |doc|
399
+ expect(doc).to have_key('field')
400
+ end
401
+ end
402
+ end
403
+
404
+ pending 'when the cursor is created'
405
+ pending 'when a block is provided'
406
+ pending 'when a block is not provided'
407
+ end
408
+
409
+ describe '#hash' do
410
+
411
+ let(:other) do
412
+ described_class.new(authorized_collection, selector, options)
413
+ end
414
+
415
+ it 'returns a unique value based on collection, selector, options' do
416
+ expect(view.hash).to eq(other.hash)
417
+ end
418
+
419
+ context 'when two views only have different collections' do
420
+
421
+ let(:other_collection) do
422
+ authorized_client[:other]
423
+ end
424
+
425
+ let(:other) do
426
+ described_class.new(other_collection, selector, options)
427
+ end
428
+
429
+ it 'returns different hash values' do
430
+ expect(view.hash).not_to eq(other.hash)
431
+ end
432
+ end
433
+
434
+ context 'when two views only have different selectors' do
435
+
436
+ let(:other_selector) do
437
+ { 'name' => 'Emily' }
438
+ end
439
+
440
+ let(:other) do
441
+ described_class.new(authorized_collection, other_selector, options)
442
+ end
443
+
444
+ it 'returns different hash values' do
445
+ expect(view.hash).not_to eq(other.hash)
446
+ end
447
+ end
448
+
449
+ context 'when two views only have different options' do
450
+
451
+ let(:other_options) do
452
+ { 'limit' => 20 }
453
+ end
454
+
455
+ let(:other) do
456
+ described_class.new(authorized_collection, selector, other_options)
457
+ end
458
+
459
+ it 'returns different hash values' do
460
+ expect(view.hash).not_to eq(other.hash)
461
+ end
462
+ end
463
+ end
464
+
465
+ describe '#initialize' do
466
+
467
+ let(:options) do
468
+ { :limit => 5 }
469
+ end
470
+
471
+ it 'sets the collection' do
472
+ expect(view.collection).to eq(authorized_collection)
473
+ end
474
+
475
+ it 'sets the selector' do
476
+ expect(view.selector).to eq(selector)
477
+ end
478
+
479
+ it 'dups the selector' do
480
+ expect(view.selector).not_to be(selector)
481
+ end
482
+
483
+ it 'sets the options' do
484
+ expect(view.options).to eq(options)
485
+ end
486
+
487
+ it 'dups the options' do
488
+ expect(view.options).not_to be(options)
489
+ end
490
+ end
491
+
492
+ describe '#inspect' do
493
+
494
+ context 'when there is a namespace, selector, and options' do
495
+
496
+ let(:options) do
497
+ { :limit => 5 }
498
+ end
499
+
500
+ let(:selector) do
501
+ { 'name' => 'Emily' }
502
+ end
503
+
504
+ it 'returns a string' do
505
+ expect(view.inspect).to be_a(String)
506
+ end
507
+
508
+ it 'returns a string containing the collection namespace' do
509
+ expect(view.inspect).to match(/.*#{authorized_collection.namespace}.*/)
510
+ end
511
+
512
+ it 'returns a string containing the selector' do
513
+ expect(view.inspect).to match(/.*#{selector.inspect}.*/)
514
+ end
515
+
516
+ it 'returns a string containing the options' do
517
+ expect(view.inspect).to match(/.*#{options.inspect}.*/)
518
+ end
519
+ end
520
+ end
521
+ end