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,34 @@
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 Operation
17
+
18
+ # Adds behaviour for queries that need to take read preference into account.
19
+ #
20
+ # @since 2.0.0
21
+ module ReadPreferrable
22
+
23
+ private
24
+
25
+ def message(context)
26
+ sel = (context.mongos? && read_pref = read.to_mongos) ?
27
+ selector.merge(:$readPreference => read_pref) : selector
28
+ opts = context.standalone? || read.slave_ok? ?
29
+ options.merge(flags: [:slave_ok]) : options
30
+ Protocol::Query.new(db_name, query_coll, sel, opts)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,259 @@
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 Operation
17
+
18
+ # Result wrapper for operations.
19
+ #
20
+ # @since 2.0.0
21
+ class Result
22
+ extend Forwardable
23
+ include Enumerable
24
+
25
+ # The number of documents updated in the write.
26
+ #
27
+ # @since 2.0.0
28
+ N = 'n'.freeze
29
+
30
+ # The ok status field in the result.
31
+ #
32
+ # @since 2.0.0
33
+ OK = 'ok'.freeze
34
+
35
+ # @return [ Array<Protocol::Reply> ] replies The wrapped wire protocol replies.
36
+ attr_reader :replies
37
+
38
+ # Is the result acknowledged?
39
+ #
40
+ # @note On MongoDB 2.6 and higher all writes are acknowledged since the
41
+ # driver uses write commands for all write operations. On 2.4 and
42
+ # lower, the result is acknowledged if the GLE has been executed after
43
+ # the command. If not, no replies will be specified. Reads will always
44
+ # return true here since a replies is always provided.
45
+ #
46
+ # @return [ true, false ] If the result is acknowledged.
47
+ #
48
+ # @since 2.0.0
49
+ def acknowledged?
50
+ !!@replies
51
+ end
52
+
53
+ # Determine if this result is a collection of multiple replies from the
54
+ # server.
55
+ #
56
+ # @example Is the result for multiple replies?
57
+ # result.multiple?
58
+ #
59
+ # @return [ true, false ] If the result is for multiple replies.
60
+ #
61
+ # @since 2.0.0
62
+ def multiple?
63
+ replies.size > 1
64
+ end
65
+
66
+ # Get the cursor id if the response is acknowledged.
67
+ #
68
+ # @note Cursor ids of 0 indicate there is no cursor on the server.
69
+ #
70
+ # @example Get the cursor id.
71
+ # result.cursor_id
72
+ #
73
+ # @return [ Integer ] The cursor id.
74
+ #
75
+ # @since 2.0.0
76
+ def cursor_id
77
+ acknowledged? ? replies.last.cursor_id : 0
78
+ end
79
+
80
+ # Get the namespace of the cursor. The method should be defined in
81
+ # result classes where 'ns' is in the server response.
82
+ #
83
+ # @return [ Nil ]
84
+ #
85
+ # @since 2.0.0
86
+ def namespace
87
+ nil
88
+ end
89
+
90
+ # Get the documents in the result.
91
+ #
92
+ # @example Get the documents.
93
+ # result.documents
94
+ #
95
+ # @return [ Array<BSON::Document> ] The documents.
96
+ #
97
+ # @since 2.0.0
98
+ def documents
99
+ if acknowledged?
100
+ replies.flat_map{ |reply| reply.documents }
101
+ else
102
+ []
103
+ end
104
+ end
105
+
106
+ # Iterate over the documents in the replies.
107
+ #
108
+ # @example Iterate over the documents.
109
+ # result.each do |doc|
110
+ # p doc
111
+ # end
112
+ #
113
+ # @return [ Enumerator ] The enumerator.
114
+ #
115
+ # @since 2.0.0
116
+ #
117
+ # @yieldparam [ BSON::Document ] Each document in the result.
118
+ def each(&block)
119
+ documents.each(&block)
120
+ end
121
+
122
+ # Initialize a new result result.
123
+ #
124
+ # @example Instantiate the result.
125
+ # Result.new(replies)
126
+ #
127
+ # @param [ Protocol::Reply ] replies The wire protocol replies.
128
+ #
129
+ # @since 2.0.0
130
+ def initialize(replies)
131
+ @replies = replies.is_a?(Protocol::Reply) ? [ replies ] : replies
132
+ end
133
+
134
+ # Get the pretty formatted inspection of the result.
135
+ #
136
+ # @example Inspect the result.
137
+ # result.inspect
138
+ #
139
+ # @return [ String ] The inspection.
140
+ #
141
+ # @since 2.0.0
142
+ def inspect
143
+ "#<Mongo::Operation::Result:#{object_id} documents=#{documents}>"
144
+ end
145
+
146
+ # Get the first reply from the result.
147
+ #
148
+ # @example Get the first reply.
149
+ # result.reply
150
+ #
151
+ # @return [ Protocol::Reply ] The first reply.
152
+ #
153
+ # @since 2.0.0
154
+ def reply
155
+ if acknowledged?
156
+ replies.first
157
+ else
158
+ nil
159
+ end
160
+ end
161
+
162
+ # Get the count of documents returned by the server.
163
+ #
164
+ # @example Get the number returned.
165
+ # result.returned_count
166
+ #
167
+ # @return [ Integer ] The number of documents returned.
168
+ #
169
+ # @since 2.0.0
170
+ def returned_count
171
+ if acknowledged?
172
+ multiple? ? aggregate_returned_count : reply.number_returned
173
+ else
174
+ 0
175
+ end
176
+ end
177
+
178
+ # If the result was a command then determine if it was considered a
179
+ # success.
180
+ #
181
+ # @note If the write was unacknowledged, then this will always return
182
+ # true.
183
+ #
184
+ # @example Was the command successful?
185
+ # result.successful?
186
+ #
187
+ # @return [ true, false ] If the command was successful.
188
+ #
189
+ # @since 2.0.0
190
+ def successful?
191
+ return true if !acknowledged?
192
+ if first_document.has_key?(OK)
193
+ first_document[OK] == 1 && parser.message.empty?
194
+ else
195
+ parser.message.empty?
196
+ end
197
+ end
198
+
199
+ # Validate the result by checking for any errors.
200
+ #
201
+ # @note This only checks for errors with writes since authentication is
202
+ # handled at the connection level and any authentication errors would
203
+ # be raised there, before a Result is ever created.
204
+ #
205
+ # @example Validate the result.
206
+ # result.validate!
207
+ #
208
+ # @raise [ Error::OperationFailure ] If an error is in the result.
209
+ #
210
+ # @return [ Result ] The result if verification passed.
211
+ #
212
+ # @since 2.0.0
213
+ def validate!
214
+ !successful? ? raise(Error::OperationFailure.new(parser.message)) : self
215
+ end
216
+
217
+ # Get the number of documents written by the server.
218
+ #
219
+ # @example Get the number of documents written.
220
+ # result.written_count
221
+ #
222
+ # @return [ Integer ] The number of documents written.
223
+ #
224
+ # @since 2.0.0
225
+ def written_count
226
+ if acknowledged?
227
+ multiple? ? aggregate_written_count : (first_document[N] || 0)
228
+ else
229
+ 0
230
+ end
231
+ end
232
+ alias :n :written_count
233
+
234
+ private
235
+
236
+ def aggregate_returned_count
237
+ replies.reduce(0) do |n, reply|
238
+ n += reply.number_returned
239
+ n
240
+ end
241
+ end
242
+
243
+ def aggregate_written_count
244
+ documents.reduce(0) do |n, document|
245
+ n += (document[N] || 0)
246
+ n
247
+ end
248
+ end
249
+
250
+ def parser
251
+ @parser ||= Error::Parser.new(first_document)
252
+ end
253
+
254
+ def first_document
255
+ @first_document ||= first || BSON::Document.new
256
+ end
257
+ end
258
+ end
259
+ end
@@ -0,0 +1,380 @@
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 Operation
17
+
18
+ # This module contains common functionality for convenience methods getting
19
+ # various values from the spec.
20
+ #
21
+ # @since 2.0.0
22
+ module Specifiable
23
+
24
+ # The field for database name.
25
+ #
26
+ # @since 2.0.0
27
+ DB_NAME = :db_name.freeze
28
+
29
+ # The field for deletes.
30
+ #
31
+ # @since 2.0.0
32
+ DELETES = :deletes.freeze
33
+
34
+ # The field for delete.
35
+ #
36
+ # @since 2.0.0
37
+ DELETE = :delete.freeze
38
+
39
+ # The field for documents.
40
+ #
41
+ # @since 2.0.0
42
+ DOCUMENTS = :documents.freeze
43
+
44
+ # The field for collection name.
45
+ #
46
+ # @since 2.0.0
47
+ COLL_NAME = :coll_name.freeze
48
+
49
+ # The field for cursor count.
50
+ #
51
+ # @since 2.0.0
52
+ CURSOR_COUNT = :cursor_count.freeze
53
+
54
+ # The field for cursor id.
55
+ #
56
+ # @since 2.0.0
57
+ CURSOR_ID = :cursor_id.freeze
58
+
59
+ # The field for cursor ids.
60
+ #
61
+ # @since 2.0.0
62
+ CURSOR_IDS = :cursor_ids.freeze
63
+
64
+ # The field for indexes.
65
+ #
66
+ # @since 2.0.0
67
+ INDEX = :index.freeze
68
+
69
+ # The field for index names.
70
+ #
71
+ # @since 2.0.0
72
+ INDEX_NAME = :index_name.freeze
73
+
74
+ # The field for options.
75
+ #
76
+ # @since 2.0.0
77
+ OPTIONS = :options.freeze
78
+
79
+ # The field for a selector.
80
+ #
81
+ # @since 2.0.0
82
+ SELECTOR = :selector.freeze
83
+
84
+ # The field for number to return.
85
+ #
86
+ # @since 2.0.0
87
+ TO_RETURN = :to_return.freeze
88
+
89
+ # The field for updates.
90
+ #
91
+ # @since 2.0.0
92
+ UPDATES = :updates.freeze
93
+
94
+ # The field for update.
95
+ #
96
+ # @since 2.0.0
97
+ UPDATE = :update.freeze
98
+
99
+ # The field name for a user.
100
+ #
101
+ # @since 2.0.0
102
+ USER = :user.freeze
103
+
104
+ # The field name for user name.
105
+ #
106
+ # @since 2.0.0
107
+ USER_NAME = :user_name.freeze
108
+
109
+ # The field name for a write concern.
110
+ #
111
+ # @since 2.0.0
112
+ WRITE_CONCERN = :write_concern.freeze
113
+
114
+ # The field name for the read preference.
115
+ #
116
+ # @since 2.0.0
117
+ READ = :read.freeze
118
+
119
+ # @return [ Hash ] spec The specification for the operation.
120
+ attr_reader :spec
121
+
122
+ # Check equality of two specifiable operations.
123
+ #
124
+ # @example Are the operations equal?
125
+ # operation == other
126
+ #
127
+ # @param [ Object ] other The other operation.
128
+ #
129
+ # @return [ true, false ] Whether the objects are equal.
130
+ #
131
+ # @since 2.0.0
132
+ def ==(other)
133
+ return false unless other.is_a?(Specifiable)
134
+ spec == other.spec
135
+ end
136
+ alias_method :eql?, :==
137
+
138
+ # Get the cursor count from the spec.
139
+ #
140
+ # @example Get the cursor count.
141
+ # specifiable.cursor_count
142
+ #
143
+ # @return [ Integer ] The cursor count.
144
+ #
145
+ # @since 2.0.0
146
+ def cursor_count
147
+ spec[CURSOR_COUNT]
148
+ end
149
+
150
+ # The name of the database to which the operation should be sent.
151
+ #
152
+ # @example Get the database name.
153
+ # specifiable.db_name
154
+ #
155
+ # @return [ String ] Database name.
156
+ #
157
+ # @since 2.0.0
158
+ def db_name
159
+ spec[DB_NAME]
160
+ end
161
+
162
+ # Get the deletes from the specification.
163
+ #
164
+ # @example Get the deletes.
165
+ # specifiable.deletes
166
+ #
167
+ # @return [ Array<BSON::Document> ] The deletes.
168
+ #
169
+ # @since 2.0.0
170
+ def deletes
171
+ spec[DELETES]
172
+ end
173
+
174
+ # Get the delete document from the specification.
175
+ #
176
+ # @example Get the delete document.
177
+ # specifiable.delete
178
+ #
179
+ # @return [ Hash ] The delete document.
180
+ #
181
+ # @since 2.0.0
182
+ def delete
183
+ spec[DELETE]
184
+ end
185
+
186
+ # The documents to in the specification.
187
+ #
188
+ # @example Get the documents.
189
+ # specifiable.documents
190
+ #
191
+ # @return [ Array<BSON::Document> ] The documents.
192
+ #
193
+ # @since 2.0.0
194
+ def documents
195
+ spec[DOCUMENTS]
196
+ end
197
+
198
+ # The name of the collection to which the operation should be sent.
199
+ #
200
+ # @example Get the collection name.
201
+ # specifiable.coll_name
202
+ #
203
+ # @return [ String ] Collection name.
204
+ #
205
+ # @since 2.0.0
206
+ def coll_name
207
+ spec[COLL_NAME]
208
+ end
209
+
210
+ # The id of the cursor created on the server.
211
+ #
212
+ # @example Get the cursor id.
213
+ # specifiable.cursor_id
214
+ #
215
+ # @return [ Integer ] The cursor id.
216
+ #
217
+ # @since 2.0.0
218
+ def cursor_id
219
+ spec[CURSOR_ID]
220
+ end
221
+
222
+ # The ids of the cursors to kill from the spec.
223
+ #
224
+ # @example Get the cursor ids from the spec.
225
+ # specifiable.cursor_ids
226
+ #
227
+ # @return [ Array<Integer> ] The cursor ids.
228
+ #
229
+ # @since 2.0.0
230
+ def cursor_ids
231
+ spec[CURSOR_IDS]
232
+ end
233
+
234
+ # Get the index from the specification.
235
+ #
236
+ # @example Get the index specification.
237
+ # specifiable.index
238
+ #
239
+ # @return [ Hash ] The index specification.
240
+ #
241
+ # @since 2.0.0
242
+ def index
243
+ spec[INDEX]
244
+ end
245
+
246
+ # Get the index name from the spec.
247
+ #
248
+ # @example Get the index name.
249
+ # specifiable.index_name
250
+ #
251
+ # @return [ String ] The index name.
252
+ #
253
+ # @since 2.0.0
254
+ def index_name
255
+ spec[INDEX_NAME]
256
+ end
257
+
258
+ # Create the new specifiable operation.
259
+ #
260
+ # @example Create the new specifiable operation.
261
+ # Specifiable.new(spec)
262
+ #
263
+ # @param [ Hash ] spec The operation specification.
264
+ #
265
+ # @see The individual operations for the values they require in their
266
+ # specs.
267
+ #
268
+ # @since 2.0.0
269
+ def initialize(spec)
270
+ @spec = spec
271
+ end
272
+
273
+ # Get the options for the operation.
274
+ #
275
+ # @example Get the options.
276
+ # specifiable.options
277
+ #
278
+ # @return [ Hash ] The options.
279
+ #
280
+ # @since 2.0.0
281
+ def options
282
+ spec[OPTIONS] || {}
283
+ end
284
+
285
+ # The selector for from the specification.
286
+ #
287
+ # @example Get a selector specification.
288
+ # specifiable.selector.
289
+ #
290
+ # @return [ Hash ] The selector spec.
291
+ #
292
+ # @since 2.0.0
293
+ def selector
294
+ spec[SELECTOR]
295
+ end
296
+
297
+ # The number of documents to request from the server.
298
+ #
299
+ # @example Get the to return value from the spec.
300
+ # specifiable.to_return
301
+ #
302
+ # @return [ Integer ] The number of documents to return.
303
+ #
304
+ # @since 2.0.0
305
+ def to_return
306
+ spec[TO_RETURN]
307
+ end
308
+
309
+ # The update documents from the spec.
310
+ #
311
+ # @example Get the update documents.
312
+ #
313
+ # @return [ Array<BSON::Document> ] The update documents.
314
+ #
315
+ # @since 2.0.0
316
+ def updates
317
+ spec[UPDATES]
318
+ end
319
+
320
+ # The update document from the spec.
321
+ #
322
+ # @example Get the update document.
323
+ #
324
+ # @return [ Hash ] The update document.
325
+ #
326
+ # @since 2.0.0
327
+ def update
328
+ spec[UPDATE]
329
+ end
330
+
331
+ # The user for user related operations.
332
+ #
333
+ # @example Get the user.
334
+ # specifiable.user
335
+ #
336
+ # @return [ Auth::User ] The user.
337
+ #
338
+ # @since 2.0.0
339
+ def user
340
+ spec[USER]
341
+ end
342
+
343
+ # The user name from the specification.
344
+ #
345
+ # @example Get the user name.
346
+ # specifiable.user_name
347
+ #
348
+ # @return [ String ] The user name.
349
+ #
350
+ # @since 2.0.
351
+ def user_name
352
+ spec[USER_NAME]
353
+ end
354
+
355
+ # The write concern to use for this operation.
356
+ #
357
+ # @example Get the write concern.
358
+ # specifiable.write_concern
359
+ #
360
+ # @return [ Mongo::WriteConcern ] The write concern.
361
+ #
362
+ # @since 2.0.0
363
+ def write_concern
364
+ @spec[WRITE_CONCERN] || WriteConcern.get(WriteConcern::DEFAULT)
365
+ end
366
+
367
+ # The read preference for this operation.
368
+ #
369
+ # @example Get the read preference.
370
+ # specifiable.read
371
+ #
372
+ # @return [ Mongo::ServerSelector ] The read preference.
373
+ #
374
+ # @since 2.0.0
375
+ def read
376
+ @spec[READ] || ServerSelector.get
377
+ end
378
+ end
379
+ end
380
+ end