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,223 @@
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
+ module Grid
17
+ class File
18
+
19
+ # Encapsulates behaviour around GridFS file metadata.
20
+ #
21
+ # @since 2.0.0
22
+ class Metadata
23
+
24
+ # Name of the files collection.
25
+ #
26
+ # @since 2.0.0
27
+ COLLECTION = 'files'.freeze
28
+
29
+ # Mappings of user supplied fields to db specification.
30
+ #
31
+ # @since 2.0.0
32
+ MAPPINGS = {
33
+ :chunk_size => :chunkSize,
34
+ :content_type => :contentType,
35
+ :filename => :filename,
36
+ :_id => :_id,
37
+ :md5 => :md5,
38
+ :metadata => :metadata,
39
+ :upload_date => :uploadDate
40
+ }.freeze
41
+
42
+ # Default content type for stored files.
43
+ #
44
+ # @since 2.0.0
45
+ DEFAULT_CONTENT_TYPE = 'binary/octet-stream'.freeze
46
+
47
+ # @return [ BSON::Document ] document The file metadata document.
48
+ attr_reader :document
49
+
50
+ # Is this metadata equal to another?
51
+ #
52
+ # @example Check metadata equality.
53
+ # metadata == other
54
+ #
55
+ # @param [ Object ] other The object to check against.
56
+ #
57
+ # @return [ true, false ] If the objects are equal.
58
+ #
59
+ # @since 2.0.0
60
+ def ==(other)
61
+ return false unless other.is_a?(Metadata)
62
+ document == other.document
63
+ end
64
+
65
+ # Get the BSON type for a metadata document.
66
+ #
67
+ # @example Get the BSON type.
68
+ # metadata.bson_type
69
+ #
70
+ # @return [ Integer ] The BSON type.
71
+ #
72
+ # @since 2.0.0
73
+ def bson_type
74
+ BSON::Hash::BSON_TYPE
75
+ end
76
+
77
+ # Get the metadata chunk size.
78
+ #
79
+ # @example Get the chunk size.
80
+ # metadata.chunk_size
81
+ #
82
+ # @return [ Integer ] The chunksize in bytes.
83
+ #
84
+ # @since 2.0.0
85
+ def chunk_size
86
+ document[:chunkSize]
87
+ end
88
+
89
+ # Get the metadata content type.
90
+ #
91
+ # @example Get the content type.
92
+ # metadata.content_type
93
+ #
94
+ # @return [ String ] The content type.
95
+ #
96
+ # @since 2.0.0
97
+ def content_type
98
+ document[:contentType]
99
+ end
100
+
101
+ # Get the metadata filename.
102
+ #
103
+ # @example Get the filename.
104
+ # metadata.filename
105
+ #
106
+ # @return [ String ] The filename.
107
+ def filename
108
+ document[:filename]
109
+ end
110
+
111
+ # Get the metadata id.
112
+ #
113
+ # @example Get the metadata id.
114
+ # metadata.id
115
+ #
116
+ # @return [ BSON::ObjectId ] The metadata id.
117
+ #
118
+ # @since 2.0.0
119
+ def id
120
+ document[:_id]
121
+ end
122
+
123
+ # Create the new metadata document.
124
+ #
125
+ # @example Create the new metadata document.
126
+ # Metadata.new(:filename => 'test.txt')
127
+ #
128
+ # @param [ BSON::Document ] document The document to create from.
129
+ #
130
+ # @since 2.0.0
131
+ def initialize(document)
132
+ @document = default_document.merge(normalize(document))
133
+ @client_md5 = Digest::MD5.new
134
+ end
135
+
136
+ # Get the length of the document in bytes.
137
+ #
138
+ # @example Get the length
139
+ # metadata.length
140
+ #
141
+ # @return [ Integer ] The length.
142
+ #
143
+ # @since 2.0.0
144
+ def length
145
+ document[:length]
146
+ end
147
+ alias :size :length
148
+
149
+ # Get the additional metadata.
150
+ #
151
+ # @example Get additional metadata.
152
+ # metadata.metadata
153
+ #
154
+ # @return [ String ] The additional metadata.
155
+ #
156
+ # @since 2.0.0
157
+ def metadata
158
+ document[:metadata]
159
+ end
160
+
161
+ # Get the md5 hash.
162
+ #
163
+ # @example Get the md5 hash.
164
+ # metadata.md5
165
+ #
166
+ # @return [ String ] The md5 hash as a string.
167
+ #
168
+ # @since 2.0.0
169
+ def md5
170
+ document[:md5] || @client_md5
171
+ end
172
+
173
+ # Conver the metadata to BSON for storage.
174
+ #
175
+ # @note If no md5 exists in the metadata (it was loaded from the server
176
+ # and is not a new file) then we digest the md5 and set it.
177
+ #
178
+ # @example Convert the metadata to BSON.
179
+ # metadata.to_bson
180
+ #
181
+ # @param [ String ] encoded The encoded data to append to.
182
+ #
183
+ # @return [ String ] The raw BSON data.
184
+ #
185
+ # @since 2.0.0
186
+ def to_bson(encoded = ''.force_encoding(BSON::BINARY))
187
+ document[:md5] ||= @client_md5.hexdigest
188
+ document.to_bson(encoded)
189
+ end
190
+
191
+ # Get the upload date.
192
+ #
193
+ # @example Get the upload date.
194
+ # metadata.upload_date
195
+ #
196
+ # @return [ Time ] The upload date.
197
+ #
198
+ # @since 2.0.0
199
+ def upload_date
200
+ document[:uploadDate]
201
+ end
202
+
203
+ private
204
+
205
+ def normalize(document)
206
+ document.reduce(BSON::Document.new) do |doc, (key, value)|
207
+ doc[MAPPINGS[key] || key] = value
208
+ doc
209
+ end
210
+ end
211
+
212
+ def default_document
213
+ BSON::Document.new(
214
+ :_id => BSON::ObjectId.new,
215
+ :chunkSize => Chunk::DEFAULT_SIZE,
216
+ :uploadDate => Time.now.utc,
217
+ :contentType => DEFAULT_CONTENT_TYPE
218
+ )
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,149 @@
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
+ module Grid
17
+
18
+ # Represents a view of the GridFS in the database.
19
+ #
20
+ # @since 2.0.0
21
+ class FS
22
+ extend Forwardable
23
+
24
+ # The default root prefix.
25
+ #
26
+ # @since 2.0.0
27
+ DEFAULT_ROOT = 'fs'.freeze
28
+
29
+ # The specification for the chunks index.
30
+ #
31
+ # @since 2.0.0
32
+ INDEX_SPEC = { :files_id => 1, :n => 1 }.freeze
33
+
34
+ # @return [ Collection ] chunks_collection The chunks collection.
35
+ attr_reader :chunks_collection
36
+
37
+ # @return [ Database ] database The database.
38
+ attr_reader :database
39
+
40
+ # @return [ Collection ] files_collection The files collection.
41
+ attr_reader :files_collection
42
+
43
+ # Get write concern from database.
44
+ def_delegators :database, :write_concern
45
+
46
+ # Find a file in the GridFS.
47
+ #
48
+ # @example Find a file by it's id.
49
+ # fs.find_one(_id: id)
50
+ #
51
+ # @example Find a file by it's filename.
52
+ # fs.find_one(filename: 'test.txt')
53
+ #
54
+ # @param [ Hash ] selector The selector.
55
+ #
56
+ # @return [ Grid::File ] The file.
57
+ #
58
+ # @since 2.0.0
59
+ def find_one(selector = nil)
60
+ metadata = files_collection.find(selector).first
61
+ return nil unless metadata
62
+ chunks = chunks_collection.find(:files_id => metadata[:_id]).sort(:n => 1)
63
+ Grid::File.new(chunks.to_a, metadata)
64
+ end
65
+
66
+ # Insert a single file into the GridFS.
67
+ #
68
+ # @example Insert a single file.
69
+ # fs.insert_one(file)
70
+ #
71
+ # @param [ Grid::File ] file The file to insert.
72
+ #
73
+ # @return [ Result ] The result of the insert.
74
+ #
75
+ # @since 2.0.0
76
+ def insert_one(file)
77
+ files_collection.insert_one(file.metadata)
78
+ result = chunks_collection.insert_many(file.chunks)
79
+ if write_concern.get_last_error
80
+ validate_md5!(file)
81
+ else
82
+ result
83
+ end
84
+ end
85
+
86
+ # Create the GridFS.
87
+ #
88
+ # @example Create the GridFS.
89
+ # Grid::FS.new(database)
90
+ #
91
+ # @param [ Database ] database The database the files reside in.
92
+ # @param [ Hash ] options The GridFS options.
93
+ #
94
+ # @option options [ String ] :fs_name The prefix for the files and chunks
95
+ # collections.
96
+ #
97
+ # @since 2.0.0
98
+ def initialize(database, options = {})
99
+ @database = database
100
+ @options = options
101
+ @chunks_collection = database[chunks_name]
102
+ @files_collection = database[files_name]
103
+ chunks_collection.indexes.create(INDEX_SPEC, :unique => true)
104
+ end
105
+
106
+ # Get the prefix for the GridFS
107
+ #
108
+ # @example Get the prefix.
109
+ # fs.prefix
110
+ #
111
+ # @return [ String ] The GridFS prefix.
112
+ #
113
+ # @since 2.0.0
114
+ def prefix
115
+ @options[:fs_name] || DEFAULT_ROOT
116
+ end
117
+
118
+ # Remove a single file from the GridFS.
119
+ #
120
+ # @example Remove a file from the GridFS.
121
+ # fs.remove_one(file)
122
+ #
123
+ # @param [ Grid::File ] file The file to remove.
124
+ #
125
+ # @return [ Result ] The result of the remove.
126
+ #
127
+ # @since 2.0.0
128
+ def remove_one(file)
129
+ files_collection.find(:_id => file.id).remove_one
130
+ chunks_collection.find(:files_id => file.id).remove_many
131
+ end
132
+
133
+ private
134
+
135
+ def chunks_name
136
+ "#{prefix}.#{Grid::File::Chunk::COLLECTION}"
137
+ end
138
+
139
+ def files_name
140
+ "#{prefix}.#{Grid::File::Metadata::COLLECTION}"
141
+ end
142
+
143
+ def validate_md5!(file)
144
+ md5 = database.command(:filemd5 => file.id, :root => prefix).documents[0][:md5]
145
+ raise Error::InvalidFile.new(file.md5, md5) unless file.md5 == md5
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,64 @@
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/index/view'
16
+
17
+ module Mongo
18
+
19
+ # Contains constants for indexing purposes.
20
+ #
21
+ # @since 2.0.0
22
+ module Index
23
+
24
+ # Specify ascending order for an index.
25
+ #
26
+ # @since 2.0.0
27
+ ASCENDING = 1
28
+
29
+ # Specify descending order for an index.
30
+ #
31
+ # @since 2.0.0
32
+ DESCENDING = -1
33
+
34
+ # Specify a 2d Geo index.
35
+ #
36
+ # @since 2.0.0
37
+ GEO2D = '2d'.freeze
38
+
39
+ # Specify a 2d sphere Geo index.
40
+ #
41
+ # @since 2.0.0
42
+ GEO2DSPHERE = '2dsphere'.freeze
43
+
44
+ # Specify a geoHaystack index.
45
+ #
46
+ # @since 2.0.0
47
+ GEOHAYSTACK = 'geoHaystack'.freeze
48
+
49
+ # Encodes a text index.
50
+ #
51
+ # @since 2.0.0
52
+ TEXT = 'text'.freeze
53
+
54
+ # Specify a hashed index.
55
+ #
56
+ # @since 2.0.0
57
+ HASHED = 'hashed'.freeze
58
+
59
+ # Constant for the indexes collection.
60
+ #
61
+ # @since 2.0.0
62
+ COLLECTION = 'system.indexes'.freeze
63
+ end
64
+ end
@@ -0,0 +1,205 @@
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
+ module Index
17
+
18
+ # A class representing a view of indexes.
19
+ #
20
+ # @since 2.0.0
21
+ class View
22
+ extend Forwardable
23
+ include Enumerable
24
+
25
+ # @return [ Collection ] collection The indexes collection.
26
+ attr_reader :collection
27
+
28
+ # @return [ Integer ] batch_size The size of the batch of results
29
+ # when sending the listIndexes command.
30
+ attr_reader :batch_size
31
+
32
+ def_delegators :@collection, :cluster, :database, :read_preference
33
+ def_delegators :cluster, :next_primary
34
+
35
+ # The index key field.
36
+ #
37
+ # @since 2.0.0
38
+ KEY = 'key'.freeze
39
+
40
+ # The index name field.
41
+ #
42
+ # @since 2.0.0
43
+ NAME = 'name'.freeze
44
+
45
+ # Drop an index by its specification.
46
+ #
47
+ # @example Drop the index by spec.
48
+ # view.drop(name: 1)
49
+ #
50
+ # @example Drop an index by its name.
51
+ # view.drop('name_1')
52
+ #
53
+ # @param [ Hash, String ] spec The index spec or name to drop.
54
+ #
55
+ # @return [ Result ] The response.
56
+ #
57
+ # @since 2.0.0
58
+ def drop(spec)
59
+ Operation::Write::DropIndex.new(
60
+ db_name: database.name,
61
+ coll_name: collection.name,
62
+ index_name: spec.is_a?(String) ? spec : index_name(spec)
63
+ ).execute(next_primary.context)
64
+ end
65
+
66
+ # Drop all indexes on the collection.
67
+ #
68
+ # @example Drop all indexes on the collection.
69
+ # view.drop_all
70
+ #
71
+ # @return [ Result ] The response.
72
+ #
73
+ # @since 2.0.0
74
+ def drop_all
75
+ drop('*')
76
+ end
77
+
78
+ # Creates an index on the collection.
79
+ #
80
+ # @param [ Hash ] spec A hash of field name/direction pairs.
81
+ # @param [ Hash ] options Options for this index.
82
+ #
83
+ # @option options [ true, false ] :unique (false) If true, this index will enforce
84
+ # a uniqueness constraint on that field.
85
+ # @option options [ true, false ] :background (false) If true, the index will be built
86
+ # in the background (only available for server versions >= 1.3.2 )
87
+ # @option options [ true, false ] :drop_dups (false) If creating a unique index on
88
+ # this collection, this option will keep the first document the database indexes
89
+ # and drop all subsequent documents with duplicate values on this field.
90
+ # @option options [ Integer ] :bucket_size (nil) For use with geoHaystack indexes.
91
+ # Number of documents to group together within a certain proximity to a given
92
+ # longitude and latitude.
93
+ # @option options [ Integer ] :max (nil) Specify the max latitude and longitude for
94
+ # a geo index.
95
+ # @option options [ Integer ] :min (nil) Specify the min latitude and longitude for
96
+ # a geo index.
97
+ #
98
+ # @note Note that the options listed may be subset of those available.
99
+ # See the MongoDB documentation for a full list of supported options by server version.
100
+ #
101
+ # @return [ Result ] The response.
102
+ #
103
+ # @since 2.0.0
104
+ def create(spec, options = {})
105
+ Operation::Write::EnsureIndex.new(
106
+ index: spec,
107
+ db_name: database.name,
108
+ coll_name: collection.name,
109
+ index_name: options[:name] || index_name(spec),
110
+ options: options
111
+ ).execute(next_primary.context)
112
+ end
113
+
114
+ # Convenience method for getting index information by a specific name or
115
+ # spec.
116
+ #
117
+ # @example Get index information by name.
118
+ # view.get('name_1')
119
+ #
120
+ # @example Get index information by spec.
121
+ # view.get(name: 1)
122
+ #
123
+ # @param [ Hash, String ] spec The index name or spec.
124
+ #
125
+ # @return [ Hash ] The index information.
126
+ #
127
+ # @since 2.0.0
128
+ def get(spec)
129
+ find do |index|
130
+ (index[NAME] == spec) || (index[KEY] == normalize_keys(spec))
131
+ end
132
+ end
133
+
134
+ # Iterate over all indexes for the collection.
135
+ #
136
+ # @example Get all the indexes.
137
+ # view.each do |index|
138
+ # ...
139
+ # end
140
+ #
141
+ # @since 2.0.0
142
+ def each(&block)
143
+ server = next_primary
144
+ cursor = Cursor.new(self, send_initial_query(server), server).to_enum
145
+ cursor.each do |doc|
146
+ yield doc
147
+ end if block_given?
148
+ cursor
149
+ end
150
+
151
+ # Create the new index view.
152
+ #
153
+ # @example Create the new index view.
154
+ # View::Index.new(collection)
155
+ #
156
+ # @param [ Collection ] collection The collection.
157
+ # @param [ Hash ] options Options for getting a list of indexes.
158
+ # Only relevant for when the listIndexes command is used with server
159
+ # versions >=2.8.
160
+ #
161
+ # @option options [ Integer ] :batch_size The batch size for results
162
+ # returned from the listIndexes command.
163
+ #
164
+ # @since 2.0.0
165
+ def initialize(collection, options = {})
166
+ @collection = collection
167
+ @batch_size = options[:batch_size]
168
+ end
169
+
170
+ private
171
+
172
+ def limit
173
+ -1
174
+ end
175
+
176
+ def indexes_spec
177
+ { selector: {
178
+ listIndexes: collection.name,
179
+ cursor: batch_size ? { batchSize: batch_size } : {} },
180
+ coll_name: collection.name,
181
+ db_name: database.name }
182
+ end
183
+
184
+ def initial_query_op
185
+ Operation::Read::Indexes.new(indexes_spec)
186
+ end
187
+
188
+ def send_initial_query(server)
189
+ initial_query_op.execute(server.context)
190
+ end
191
+
192
+ def index_name(spec)
193
+ spec.to_a.join('_')
194
+ end
195
+
196
+ def normalize_keys(spec)
197
+ return false if spec.is_a?(String)
198
+ spec.reduce({}) do |normalized, (key, value)|
199
+ normalized[key.to_s] = value
200
+ normalized
201
+ end
202
+ end
203
+ end
204
+ end
205
+ end