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
@@ -1,260 +0,0 @@
1
- # Copyright (C) 2009-2013 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 BasicAuthTests
16
-
17
- def init_auth_basic
18
- @test_user = 'bob'
19
- @test_user_pwd = 'user'
20
-
21
- # db user for cleanup (for pre-2.4)
22
- @db.add_user('admin', 'cleanup', nil, :roles => [])
23
- end
24
-
25
- def teardown
26
- return unless @client && @db
27
- unless has_auth?(TEST_DB, TEST_USER)
28
- @client[TEST_DB].authenticate(TEST_USER, TEST_USER_PWD)
29
- end
30
-
31
- if @client.server_version < '2.5'
32
- @db['system.users'].remove
33
- else
34
- @db.command(:dropAllUsersFromDatabase => 1)
35
- end
36
- end
37
-
38
- def remove_user(database, username, password)
39
- database.authenticate(username, password) unless has_auth?(database.name, username)
40
- database.remove_user(username)
41
- database.logout
42
- end
43
-
44
- def has_auth?(db_name, username)
45
- @client.auths.any? { |a| a[:source] == db_name && a[:username] == username }
46
- end
47
-
48
- def test_descriptive_mech_error
49
- assert_raise_error Mongo::MongoArgumentError, Mongo::Authentication::MECHANISM_ERROR do
50
- @db.authenticate('emily', nil, nil, nil, 'FAKE_MECHANISM')
51
- end
52
- assert_raise_error Mongo::MongoArgumentError, Mongo::Authentication::MECHANISM_ERROR do
53
- uri = "mongodb://user:pwd@host:port/example?authSource=$external&authMechanism=FAKE_MECHANISM"
54
- Mongo::MongoClient.from_uri(uri)
55
- end
56
- end
57
-
58
- def test_add_remove_user
59
- init_auth_basic
60
-
61
- # add user
62
- silently { @db.add_user(@test_user, @test_user_pwd) }
63
- assert @db.authenticate(@test_user, @test_user_pwd)
64
-
65
- # remove user
66
- assert @db.remove_user(@test_user)
67
- end
68
-
69
- def test_update_user
70
- init_auth_basic
71
-
72
- # add user
73
- silently { @db.add_user(@test_user, @test_user_pwd) }
74
- assert @db.authenticate(@test_user, @test_user_pwd)
75
- @db.logout
76
-
77
- # update user
78
- silently { @db.add_user(@test_user, 'updated') }
79
- assert_raise Mongo::AuthenticationError do
80
- @db.authenticate('bob', 'user')
81
- end
82
- assert @db.authenticate('bob', 'updated')
83
- end
84
-
85
- def test_remove_non_existent_user
86
- init_auth_basic
87
-
88
- if @client.server_version < '2.5'
89
- assert_equal false, @db.remove_user('joe')
90
- else
91
- assert_raise Mongo::OperationFailure do
92
- assert @db.remove_user('joe')
93
- end
94
- end
95
- end
96
-
97
- def test_authenticate
98
- init_auth_basic
99
- silently { @db.add_user(@test_user, @test_user_pwd) }
100
- assert @db.authenticate(@test_user, @test_user_pwd)
101
- end
102
-
103
- def test_authenticate_non_existent_user
104
- init_auth_basic
105
- assert_raise Mongo::AuthenticationError do
106
- @db.authenticate('frank', 'thetank')
107
- end
108
- end
109
-
110
- def test_logout
111
- init_auth_basic
112
- silently { @db.add_user(@test_user, @test_user_pwd) }
113
- assert @db.authenticate(@test_user, @test_user_pwd)
114
- assert @db.logout
115
- end
116
-
117
- def test_authenticate_with_special_characters
118
- init_auth_basic
119
- silently { assert @db.add_user('foo:bar','@foo') }
120
- assert @db.authenticate('foo:bar','@foo')
121
- end
122
-
123
- def test_authenticate_read_only
124
- init_auth_basic
125
- silently { @db.add_user(@test_user, @test_user_pwd, true) }
126
- assert @db.authenticate(@test_user, @test_user_pwd)
127
- end
128
-
129
- def test_authenticate_with_connection_uri
130
- init_auth_basic
131
- silently { @db.add_user(@test_user, @test_user_pwd) }
132
-
133
- uri = "mongodb://#{@test_user}:#{@test_user_pwd}@#{@host_info}/#{@db.name}"
134
- client = Mongo::URIParser.new(uri).connection
135
-
136
- assert client
137
- assert_equal client.auths.size, 1
138
- assert client[@db.name]['auth_test'].count
139
-
140
- auth = client.auths.first
141
- assert_equal @db.name, auth[:db_name]
142
- assert_equal @test_user, auth[:username]
143
- assert_equal @test_user_pwd, auth[:password]
144
- end
145
-
146
- def test_socket_auths
147
- init_auth_basic
148
- # setup
149
- db_a = @client[TEST_DB + '_a']
150
- silently { db_a.add_user('user_a', 'password') }
151
- assert db_a.authenticate('user_a', 'password')
152
-
153
- db_b = @client[TEST_DB + '_b']
154
- silently { db_b.add_user('user_b', 'password') }
155
- assert db_b.authenticate('user_b', 'password')
156
-
157
- db_c = @client[TEST_DB + '_c']
158
- silently { db_c.add_user('user_c', 'password') }
159
- assert db_c.authenticate('user_c', 'password')
160
-
161
- # client auths should be applied to socket on checkout
162
- socket = @client.checkout_reader(:mode => :primary)
163
- assert_equal 4, socket.auths.size
164
- assert_equal @client.auths, socket.auths
165
- @client.checkin(socket)
166
-
167
- # logout should remove saved auth on socket and client
168
- assert db_b.logout
169
- socket = @client.checkout_reader(:mode => :primary)
170
- assert_equal 3, socket.auths.size
171
- assert_equal @client.auths, socket.auths
172
- @client.checkin(socket)
173
-
174
- # clean-up
175
- db_b.authenticate('user_b', 'password')
176
- remove_user(db_a, 'user_a', 'password')
177
- remove_user(db_b, 'user_b', 'password')
178
- remove_user(db_c, 'user_c', 'password')
179
- end
180
-
181
- def test_default_roles_non_admin
182
- init_auth_basic
183
- @db.stubs(:command).returns({}, true)
184
- @db.expects(:command).with do |command, cmd_opts|
185
- command[:createUser] == @test_user
186
- cmd_opts[:roles] == ['dbOwner'] if cmd_opts
187
- end
188
-
189
- silently { @db.add_user(@test_user, @test_user_pwd) }
190
- end
191
-
192
- def test_default_roles_non_admin_read_only
193
- init_auth_basic
194
- @db.stubs(:command).returns({}, true)
195
- @db.expects(:command).with do |command, cmd_opts|
196
- command[:createUser] == @test_user
197
- cmd_opts[:roles] == ['read'] if cmd_opts
198
- end
199
- silently { @db.add_user(@test_user, @test_user_pwd, true) }
200
- end
201
-
202
- def test_delegated_authentication
203
- return unless @client.server_version >= '2.4' && @client.server_version < '2.5'
204
- with_auth(@client) do
205
- init_auth_basic
206
- # create user in test databases
207
- accounts = @client[TEST_DB + '_accounts']
208
- silently do
209
- accounts.add_user('emily', 'password')
210
- @db.add_user('emily', nil, nil, :roles => ['read'], :userSource => accounts.name)
211
- end
212
- @admin.logout
213
-
214
- # validate that direct authentication is not allowed
215
- assert_raise Mongo::AuthenticationError do
216
- @db.authenticate('emily', 'password')
217
- end
218
-
219
- # validate delegated authentication
220
- assert accounts.authenticate('emily', 'password')
221
- assert @db.collection_names
222
- accounts.logout
223
- assert_raise Mongo::OperationFailure do
224
- @db.collection_names
225
- end
226
-
227
- # validate auth using source database
228
- @db.authenticate('emily', 'password', nil, accounts.name)
229
- assert @db.collection_names
230
- accounts.logout
231
- assert_raise Mongo::OperationFailure do
232
- @db.collection_names
233
- end
234
-
235
- remove_user(accounts, 'emily', 'password')
236
- end
237
- end
238
-
239
- def test_update_user_to_read_only
240
- with_auth(@client) do
241
- init_auth_basic
242
- silently { @db.add_user(@test_user, @test_user_pwd) }
243
- @admin.logout
244
- @db.authenticate(@test_user, @test_user_pwd)
245
- @db['test'].insert({})
246
- @db.logout
247
-
248
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
249
- silently { @db.add_user('emily', 'password', true) }
250
- @admin.logout
251
-
252
- silently { @db.authenticate('emily', 'password') }
253
- assert_raise Mongo::OperationFailure do
254
- @db['test'].insert({})
255
- end
256
- @db.logout
257
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
258
- end
259
- end
260
- end
@@ -1,249 +0,0 @@
1
- # Copyright (C) 2009-2013 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.0x
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 BulkAPIAuthTests
16
-
17
- include Mongo
18
-
19
- def init_auth_bulk
20
- # Set up the test db
21
- @collection = @db["bulk-api-auth-tests"]
22
-
23
- # db user can insert but not remove
24
- res = BSON::OrderedHash.new
25
- res[:db] = @db.name
26
- res[:collection] = ""
27
-
28
- cmd = BSON::OrderedHash.new
29
- cmd[:createRole] = "insertOnly"
30
- cmd[:privileges] = [{:resource => res, :actions => [ "insert", "find" ]}]
31
- cmd[:roles] = []
32
- @db.command(cmd)
33
- @db.add_user('insertOnly', 'password', nil, :roles => ['insertOnly'])
34
-
35
- # db user can insert and remove
36
- cmd = BSON::OrderedHash.new
37
- cmd[:createRole] = "insertAndRemove"
38
- cmd[:privileges] = [{:resource => res, :actions => [ "insert", "remove", "find" ]}]
39
- cmd[:roles] = []
40
- @db.command(cmd)
41
- @db.add_user('insertAndRemove', 'password', nil, :roles => ['insertAndRemove'])
42
-
43
- @admin.logout
44
- end
45
-
46
- def clear_collection(collection)
47
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
48
- collection.remove
49
- @admin.logout
50
- end
51
-
52
- def teardown_bulk
53
- remove_all_users_and_roles(@db)
54
- remove_all_users_and_roles(@admin)
55
- end
56
-
57
- def remove_all_users_and_roles(database)
58
- @admin.authenticate(TEST_USER, TEST_USER_PWD)
59
- if @version < '2.5.3'
60
- database['system.users'].remove
61
- else
62
- database.command({:dropAllRolesFromDatabase => 1})
63
- # Don't delete the TEST_USER from the TEST_DB, it is needed for future tests
64
- database.command({:dropAllUsersFromDatabase => 1}) unless database.name == TEST_DB
65
- end
66
- @admin.logout
67
- end
68
-
69
- def test_auth_no_error
70
- return unless @version >= '2.5.3'
71
- init_auth_bulk
72
- with_write_commands_and_operations(@db.connection) do |wire_version|
73
- clear_collection(@collection)
74
- @db.authenticate('insertAndRemove', 'password')
75
- bulk = @collection.initialize_ordered_bulk_op
76
- bulk.insert({:a => 1})
77
- bulk.find({:a => 1}).remove_one
78
-
79
- result = bulk.execute
80
- assert_match_document(
81
- {
82
- "ok" => 1,
83
- "nInserted" => 1,
84
- "nRemoved" => 1
85
- }, result, "wire_version:#{wire_version}")
86
- assert_equal 0, @collection.count
87
- @db.logout
88
- end
89
- teardown_bulk
90
- end
91
-
92
- def test_auth_error
93
- return unless @version >= '2.5.3'
94
- init_auth_bulk
95
- with_write_commands_and_operations(@db.connection) do |wire_version|
96
- clear_collection(@collection)
97
- @db.authenticate('insertOnly', 'password')
98
- bulk = @collection.initialize_ordered_bulk_op
99
- bulk.insert({:a => 1})
100
- bulk.find({:a => 1}).remove
101
- bulk.insert({:a => 2})
102
-
103
- ex = assert_raise Mongo::BulkWriteError do
104
- bulk.execute
105
- end
106
- result = ex.result
107
- assert_match_document(
108
- {
109
- "ok" => 1,
110
- "n" => 1,
111
- "writeErrors" =>
112
- [{
113
- "index" => 1,
114
- "code" => 13,
115
- "errmsg" => /not authorized/
116
- }],
117
- "code" => 65,
118
- "errmsg" => "batch item errors occurred",
119
- "nInserted" => 1
120
- }, result, "wire_version:#{wire_version}")
121
- assert_equal 1, @collection.count
122
- @db.logout
123
- end
124
- teardown_bulk
125
- end
126
-
127
- def test_auth_error_unordered
128
- return unless @version >= '2.5.3'
129
- init_auth_bulk
130
- with_write_commands_and_operations(@db.connection) do |wire_version|
131
- clear_collection(@collection)
132
- @db.authenticate('insertOnly', 'password')
133
- bulk = @collection.initialize_unordered_bulk_op
134
- bulk.insert({:a => 1})
135
- bulk.find({:a => 1}).remove_one
136
- bulk.insert({:a => 2})
137
-
138
- ex = assert_raise Mongo::BulkWriteError do
139
- bulk.execute
140
- end
141
- result = ex.result
142
- assert_equal 1, result["writeErrors"].length
143
- assert_equal 2, result["n"]
144
- assert_equal 2, result["nInserted"]
145
- assert_equal 2, @collection.count
146
- @db.logout
147
- end
148
- teardown_bulk
149
- end
150
-
151
- def test_duplicate_key_with_auth_error
152
- return unless @version >= '2.5.3'
153
- init_auth_bulk
154
- with_write_commands_and_operations(@db.connection) do |wire_version|
155
- clear_collection(@collection)
156
- @db.authenticate('insertOnly', 'password')
157
- bulk = @collection.initialize_ordered_bulk_op
158
- bulk.insert({:_id => 1, :a => 1})
159
- bulk.insert({:_id => 1, :a => 2})
160
- bulk.find({:a => 1}).remove_one
161
-
162
- ex = assert_raise Mongo::BulkWriteError do
163
- bulk.execute
164
- end
165
- result = ex.result
166
- assert_match_document(
167
- {
168
- "ok" => 1,
169
- "n" => 1,
170
- "writeErrors" =>
171
- [{
172
- "index" => 1,
173
- "code" => 11000,
174
- "errmsg" => /duplicate key error/
175
- }],
176
- "code" => 65,
177
- "errmsg" => "batch item errors occurred",
178
- "nInserted" => 1
179
- }, result, "wire_version:#{wire_version}")
180
- assert_equal 1, @collection.count
181
- @db.logout
182
- end
183
- teardown_bulk
184
- end
185
-
186
- def test_duplicate_key_with_auth_error_unordered
187
- return unless @version >= '2.5.3'
188
- init_auth_bulk
189
- with_write_commands_and_operations(@db.connection) do |wire_version|
190
- clear_collection(@collection)
191
- @db.authenticate('insertOnly', 'password')
192
- bulk = @collection.initialize_unordered_bulk_op
193
- bulk.insert({:_id => 1, :a => 1})
194
- bulk.insert({:_id => 1, :a => 1})
195
- bulk.find({:a => 1}).remove_one
196
-
197
- ex = assert_raise Mongo::BulkWriteError do
198
- bulk.execute
199
- end
200
- result = ex.result
201
- assert_equal 2, result["writeErrors"].length
202
- assert_equal 1, result["n"]
203
- assert_equal 1, result["nInserted"]
204
- assert_equal 1, @collection.count
205
- @db.logout
206
- end
207
- teardown_bulk
208
- end
209
-
210
- def test_write_concern_error_with_auth_error
211
- with_no_replication(@db.connection) do
212
- return unless @version >= '2.5.3'
213
- init_auth_bulk
214
- with_write_commands_and_operations(@db.connection) do |wire_version|
215
- clear_collection(@collection)
216
- @db.authenticate('insertOnly', 'password')
217
- bulk = @collection.initialize_ordered_bulk_op
218
- bulk.insert({:_id => 1, :a => 1})
219
- bulk.insert({:_id => 2, :a => 1})
220
- bulk.find({:a => 1}).remove_one
221
-
222
- ex = assert_raise Mongo::BulkWriteError do
223
- bulk.execute({:w => 2})
224
- end
225
- result = ex.result
226
-
227
- assert_match_document(
228
- {
229
- "ok" => 0,
230
- "n" => 0,
231
- "nInserted" => 0,
232
- "writeErrors" =>
233
- [{
234
- "index" => 0,
235
- "code" => 2,
236
- "errmsg" => /'w' > 1/
237
- }],
238
- "code" => 65,
239
- "errmsg" => "batch item errors occurred"
240
- }, result, "wire_version#{wire_version}")
241
- # Re-visit this when RUBY-731 is resolved:
242
- assert (@collection.count == batch_commands?(wire_version) ? 0 : 1)
243
- @db.logout
244
- end
245
- teardown_bulk
246
- end
247
- end
248
-
249
- end