mongo 2.22.0 → 2.24.0

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 (467) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mongo_console +0 -1
  3. data/lib/mongo/active_support.rb +1 -2
  4. data/lib/mongo/address/ipv4.rb +3 -6
  5. data/lib/mongo/address/ipv6.rb +6 -10
  6. data/lib/mongo/address/unix.rb +1 -4
  7. data/lib/mongo/address/validator.rb +16 -28
  8. data/lib/mongo/address.rb +30 -40
  9. data/lib/mongo/auth/aws/conversation.rb +6 -10
  10. data/lib/mongo/auth/aws/credentials.rb +0 -1
  11. data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
  13. data/lib/mongo/auth/aws/request.rb +20 -35
  14. data/lib/mongo/auth/aws.rb +1 -2
  15. data/lib/mongo/auth/base.rb +20 -29
  16. data/lib/mongo/auth/conversation_base.rb +14 -18
  17. data/lib/mongo/auth/cr/conversation.rb +0 -3
  18. data/lib/mongo/auth/cr.rb +1 -4
  19. data/lib/mongo/auth/credential_cache.rb +0 -2
  20. data/lib/mongo/auth/gssapi/conversation.rb +3 -8
  21. data/lib/mongo/auth/gssapi.rb +1 -4
  22. data/lib/mongo/auth/ldap/conversation.rb +0 -3
  23. data/lib/mongo/auth/ldap.rb +1 -4
  24. data/lib/mongo/auth/roles.rb +16 -19
  25. data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
  26. data/lib/mongo/auth/scram/conversation.rb +2 -5
  27. data/lib/mongo/auth/scram.rb +5 -10
  28. data/lib/mongo/auth/scram256/conversation.rb +2 -5
  29. data/lib/mongo/auth/scram256.rb +1 -3
  30. data/lib/mongo/auth/scram_conversation_base.rb +18 -24
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
  32. data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
  35. data/lib/mongo/auth/stringprep.rb +9 -12
  36. data/lib/mongo/auth/user/view.rb +3 -5
  37. data/lib/mongo/auth/user.rb +14 -24
  38. data/lib/mongo/auth/x509/conversation.rb +0 -3
  39. data/lib/mongo/auth/x509.rb +7 -9
  40. data/lib/mongo/auth.rb +18 -30
  41. data/lib/mongo/background_thread.rb +9 -17
  42. data/lib/mongo/bson.rb +0 -2
  43. data/lib/mongo/bulk_write/combineable.rb +0 -3
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
  45. data/lib/mongo/bulk_write/result.rb +11 -16
  46. data/lib/mongo/bulk_write/result_combiner.rb +9 -12
  47. data/lib/mongo/bulk_write/transformable.rb +16 -19
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
  49. data/lib/mongo/bulk_write/validatable.rb +11 -18
  50. data/lib/mongo/bulk_write.rb +76 -91
  51. data/lib/mongo/caching_cursor.rb +2 -7
  52. data/lib/mongo/client.rb +267 -276
  53. data/lib/mongo/client_encryption.rb +4 -5
  54. data/lib/mongo/cluster/periodic_executor.rb +2 -5
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
  57. data/lib/mongo/cluster/sdam_flow.rb +136 -159
  58. data/lib/mongo/cluster/topology/base.rb +15 -18
  59. data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
  63. data/lib/mongo/cluster/topology/sharded.rb +19 -9
  64. data/lib/mongo/cluster/topology/single.rb +24 -14
  65. data/lib/mongo/cluster/topology/unknown.rb +20 -10
  66. data/lib/mongo/cluster/topology.rb +29 -25
  67. data/lib/mongo/cluster.rb +152 -184
  68. data/lib/mongo/cluster_time.rb +14 -31
  69. data/lib/mongo/collection/helpers.rb +5 -8
  70. data/lib/mongo/collection/view/aggregation/behavior.rb +1 -1
  71. data/lib/mongo/collection/view/aggregation.rb +10 -12
  72. data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
  73. data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
  74. data/lib/mongo/collection/view/builder.rb +0 -1
  75. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
  76. data/lib/mongo/collection/view/change_stream.rb +59 -58
  77. data/lib/mongo/collection/view/explainable.rb +11 -20
  78. data/lib/mongo/collection/view/immutable.rb +1 -3
  79. data/lib/mongo/collection/view/iterable.rb +44 -35
  80. data/lib/mongo/collection/view/map_reduce.rb +20 -25
  81. data/lib/mongo/collection/view/readable.rb +96 -94
  82. data/lib/mongo/collection/view/writable.rb +104 -114
  83. data/lib/mongo/collection/view.rb +11 -8
  84. data/lib/mongo/collection.rb +103 -106
  85. data/lib/mongo/condition_variable.rb +4 -4
  86. data/lib/mongo/config/options.rb +0 -3
  87. data/lib/mongo/config/validators/option.rb +3 -5
  88. data/lib/mongo/config.rb +6 -4
  89. data/lib/mongo/crypt/auto_decryption_context.rb +9 -3
  90. data/lib/mongo/crypt/auto_encrypter.rb +34 -43
  91. data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
  92. data/lib/mongo/crypt/binary.rb +5 -9
  93. data/lib/mongo/crypt/binding.rb +150 -156
  94. data/lib/mongo/crypt/context.rb +20 -17
  95. data/lib/mongo/crypt/data_key_context.rb +2 -7
  96. data/lib/mongo/crypt/encryption_io.rb +29 -39
  97. data/lib/mongo/crypt/explicit_decryption_context.rb +9 -3
  98. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  99. data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
  100. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
  101. data/lib/mongo/crypt/handle.rb +42 -48
  102. data/lib/mongo/crypt/hooks.rb +12 -15
  103. data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
  104. data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
  105. data/lib/mongo/crypt/kms/aws.rb +0 -2
  106. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
  107. data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
  108. data/lib/mongo/crypt/kms/azure.rb +0 -1
  109. data/lib/mongo/crypt/kms/credentials.rb +13 -27
  110. data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
  111. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
  112. data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
  113. data/lib/mongo/crypt/kms/gcp.rb +0 -2
  114. data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
  115. data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
  116. data/lib/mongo/crypt/kms/kmip.rb +0 -1
  117. data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
  118. data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
  119. data/lib/mongo/crypt/kms/local.rb +0 -1
  120. data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
  121. data/lib/mongo/crypt/kms.rb +14 -16
  122. data/lib/mongo/crypt/kms_context.rb +0 -2
  123. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
  124. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
  125. data/lib/mongo/crypt/status.rb +12 -14
  126. data/lib/mongo/crypt.rb +0 -1
  127. data/lib/mongo/csot_timeout_holder.rb +3 -2
  128. data/lib/mongo/cursor/kill_spec.rb +7 -10
  129. data/lib/mongo/cursor.rb +74 -64
  130. data/lib/mongo/cursor_host.rb +8 -10
  131. data/lib/mongo/database/view.rb +23 -39
  132. data/lib/mongo/database.rb +68 -65
  133. data/lib/mongo/dbref.rb +0 -1
  134. data/lib/mongo/deprecations.rb +98 -0
  135. data/lib/mongo/distinguishing_semaphore.rb +0 -1
  136. data/lib/mongo/error/auth_error.rb +0 -2
  137. data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
  138. data/lib/mongo/error/bulk_write_error.rb +7 -10
  139. data/lib/mongo/error/change_stream_resumable.rb +0 -2
  140. data/lib/mongo/error/client_closed.rb +0 -2
  141. data/lib/mongo/error/closed_stream.rb +1 -4
  142. data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
  143. data/lib/mongo/error/connection_perished.rb +0 -2
  144. data/lib/mongo/error/connection_unavailable.rb +0 -2
  145. data/lib/mongo/error/credential_check_error.rb +0 -2
  146. data/lib/mongo/error/crypt_error.rb +0 -2
  147. data/lib/mongo/error/extra_file_chunk.rb +1 -4
  148. data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
  149. data/lib/mongo/error/file_not_found.rb +0 -3
  150. data/lib/mongo/error/handshake_error.rb +0 -2
  151. data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
  152. data/lib/mongo/error/internal_driver_error.rb +0 -2
  153. data/lib/mongo/error/invalid_address.rb +0 -2
  154. data/lib/mongo/error/invalid_application_name.rb +0 -3
  155. data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
  156. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
  157. data/lib/mongo/error/invalid_collection_name.rb +1 -4
  158. data/lib/mongo/error/invalid_config_option.rb +0 -3
  159. data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
  160. data/lib/mongo/error/invalid_database_name.rb +1 -4
  161. data/lib/mongo/error/invalid_document.rb +1 -4
  162. data/lib/mongo/error/invalid_file.rb +0 -3
  163. data/lib/mongo/error/invalid_file_revision.rb +0 -3
  164. data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
  165. data/lib/mongo/error/invalid_nonce.rb +0 -3
  166. data/lib/mongo/error/invalid_read_concern.rb +2 -4
  167. data/lib/mongo/error/invalid_read_option.rb +0 -3
  168. data/lib/mongo/error/invalid_replacement_document.rb +2 -5
  169. data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
  170. data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
  171. data/lib/mongo/error/invalid_server_preference.rb +7 -16
  172. data/lib/mongo/error/invalid_session.rb +1 -4
  173. data/lib/mongo/error/invalid_signature.rb +0 -3
  174. data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
  175. data/lib/mongo/error/invalid_txt_record.rb +0 -2
  176. data/lib/mongo/error/invalid_update_document.rb +2 -5
  177. data/lib/mongo/error/invalid_uri.rb +1 -4
  178. data/lib/mongo/error/invalid_write_concern.rb +2 -5
  179. data/lib/mongo/error/kms_error.rb +0 -2
  180. data/lib/mongo/error/labelable.rb +0 -3
  181. data/lib/mongo/error/lint_error.rb +0 -2
  182. data/lib/mongo/error/max_bson_size.rb +8 -11
  183. data/lib/mongo/error/max_message_size.rb +2 -5
  184. data/lib/mongo/error/mismatched_domain.rb +0 -2
  185. data/lib/mongo/error/missing_connection.rb +0 -2
  186. data/lib/mongo/error/missing_file_chunk.rb +0 -3
  187. data/lib/mongo/error/missing_password.rb +0 -2
  188. data/lib/mongo/error/missing_resume_token.rb +1 -4
  189. data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
  190. data/lib/mongo/error/missing_service_id.rb +0 -2
  191. data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
  192. data/lib/mongo/error/multi_index_drop.rb +0 -3
  193. data/lib/mongo/error/need_primary_server.rb +0 -2
  194. data/lib/mongo/error/no_server_available.rb +3 -8
  195. data/lib/mongo/error/no_service_connection_available.rb +1 -3
  196. data/lib/mongo/error/no_srv_records.rb +0 -2
  197. data/lib/mongo/error/notable.rb +8 -16
  198. data/lib/mongo/error/operation_failure.rb +22 -35
  199. data/lib/mongo/error/parser.rb +33 -75
  200. data/lib/mongo/error/pool_cleared_error.rb +1 -3
  201. data/lib/mongo/error/pool_closed_error.rb +0 -3
  202. data/lib/mongo/error/pool_error.rb +0 -3
  203. data/lib/mongo/error/pool_paused_error.rb +0 -2
  204. data/lib/mongo/error/raise_original_error.rb +1 -3
  205. data/lib/mongo/error/read_write_retryable.rb +14 -17
  206. data/lib/mongo/error/sdam_error_detection.rb +3 -5
  207. data/lib/mongo/error/server_api_conflict.rb +0 -2
  208. data/lib/mongo/error/server_certificate_revoked.rb +0 -2
  209. data/lib/mongo/error/server_not_usable.rb +0 -2
  210. data/lib/mongo/error/session_ended.rb +1 -3
  211. data/lib/mongo/error/session_not_materialized.rb +1 -3
  212. data/lib/mongo/error/sessions_not_supported.rb +1 -4
  213. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
  214. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
  215. data/lib/mongo/error/socket_error.rb +0 -2
  216. data/lib/mongo/error/socket_timeout_error.rb +0 -2
  217. data/lib/mongo/error/transactions_not_supported.rb +3 -6
  218. data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
  219. data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
  220. data/lib/mongo/error/unexpected_response.rb +1 -4
  221. data/lib/mongo/error/unknown_payload_type.rb +0 -3
  222. data/lib/mongo/error/unmet_dependency.rb +0 -2
  223. data/lib/mongo/error/unsupported_array_filters.rb +3 -24
  224. data/lib/mongo/error/unsupported_collation.rb +3 -24
  225. data/lib/mongo/error/unsupported_features.rb +0 -2
  226. data/lib/mongo/error/unsupported_message_type.rb +0 -2
  227. data/lib/mongo/error/unsupported_option.rb +19 -21
  228. data/lib/mongo/error/write_retryable.rb +0 -2
  229. data/lib/mongo/error.rb +10 -24
  230. data/lib/mongo/event/base.rb +0 -2
  231. data/lib/mongo/event/listeners.rb +0 -3
  232. data/lib/mongo/event/publisher.rb +0 -3
  233. data/lib/mongo/event/subscriber.rb +0 -4
  234. data/lib/mongo/event.rb +4 -6
  235. data/lib/mongo/grid/file/chunk.rb +7 -10
  236. data/lib/mongo/grid/file/info.rb +20 -24
  237. data/lib/mongo/grid/file.rb +7 -8
  238. data/lib/mongo/grid/fs_bucket.rb +40 -48
  239. data/lib/mongo/grid/stream/read.rb +25 -35
  240. data/lib/mongo/grid/stream/write.rb +17 -22
  241. data/lib/mongo/grid/stream.rb +2 -4
  242. data/lib/mongo/grid.rb +0 -1
  243. data/lib/mongo/id.rb +0 -1
  244. data/lib/mongo/index/view.rb +68 -58
  245. data/lib/mongo/index.rb +7 -10
  246. data/lib/mongo/lint.rb +31 -37
  247. data/lib/mongo/loggable.rb +5 -8
  248. data/lib/mongo/logger.rb +1 -7
  249. data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
  250. data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
  251. data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
  252. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
  253. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
  254. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
  255. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
  256. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
  257. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
  258. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
  259. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
  260. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
  261. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
  262. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
  263. data/lib/mongo/monitoring/event/cmap.rb +0 -1
  264. data/lib/mongo/monitoring/event/command_failed.rb +5 -9
  265. data/lib/mongo/monitoring/event/command_started.rb +8 -12
  266. data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
  267. data/lib/mongo/monitoring/event/secure.rb +15 -20
  268. data/lib/mongo/monitoring/event/server_closed.rb +1 -4
  269. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
  270. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
  271. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
  272. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
  273. data/lib/mongo/monitoring/event/server_opening.rb +1 -4
  274. data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
  275. data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
  276. data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
  277. data/lib/mongo/monitoring/event.rb +0 -1
  278. data/lib/mongo/monitoring/publishable.rb +20 -30
  279. data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
  280. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
  281. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
  282. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
  283. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
  284. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
  285. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
  286. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
  287. data/lib/mongo/monitoring.rb +38 -39
  288. data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
  289. data/lib/mongo/operation/aggregate/result.rb +3 -6
  290. data/lib/mongo/operation/aggregate.rb +0 -2
  291. data/lib/mongo/operation/collections_info/result.rb +0 -3
  292. data/lib/mongo/operation/collections_info.rb +0 -2
  293. data/lib/mongo/operation/command/op_msg.rb +1 -4
  294. data/lib/mongo/operation/command.rb +0 -2
  295. data/lib/mongo/operation/context.rb +13 -16
  296. data/lib/mongo/operation/count/op_msg.rb +2 -4
  297. data/lib/mongo/operation/count.rb +0 -2
  298. data/lib/mongo/operation/create/op_msg.rb +2 -5
  299. data/lib/mongo/operation/create.rb +4 -2
  300. data/lib/mongo/operation/create_index/op_msg.rb +3 -7
  301. data/lib/mongo/operation/create_index.rb +0 -2
  302. data/lib/mongo/operation/create_user/op_msg.rb +2 -4
  303. data/lib/mongo/operation/create_user.rb +0 -2
  304. data/lib/mongo/operation/delete/bulk_result.rb +2 -3
  305. data/lib/mongo/operation/delete/op_msg.rb +3 -10
  306. data/lib/mongo/operation/delete/result.rb +0 -3
  307. data/lib/mongo/operation/delete.rb +1 -5
  308. data/lib/mongo/operation/distinct/op_msg.rb +2 -5
  309. data/lib/mongo/operation/distinct.rb +0 -2
  310. data/lib/mongo/operation/drop/op_msg.rb +0 -2
  311. data/lib/mongo/operation/drop.rb +0 -2
  312. data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
  313. data/lib/mongo/operation/drop_database.rb +0 -2
  314. data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
  315. data/lib/mongo/operation/drop_index.rb +0 -2
  316. data/lib/mongo/operation/explain/op_msg.rb +0 -2
  317. data/lib/mongo/operation/explain/result.rb +0 -3
  318. data/lib/mongo/operation/explain.rb +0 -2
  319. data/lib/mongo/operation/find/builder/command.rb +4 -12
  320. data/lib/mongo/operation/find/builder/flags.rb +9 -15
  321. data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
  322. data/lib/mongo/operation/find/builder.rb +0 -1
  323. data/lib/mongo/operation/find/op_msg.rb +4 -12
  324. data/lib/mongo/operation/find/result.rb +0 -3
  325. data/lib/mongo/operation/find.rb +0 -2
  326. data/lib/mongo/operation/get_more/command_builder.rb +1 -6
  327. data/lib/mongo/operation/get_more/op_msg.rb +10 -4
  328. data/lib/mongo/operation/get_more/result.rb +0 -3
  329. data/lib/mongo/operation/get_more.rb +0 -2
  330. data/lib/mongo/operation/indexes/op_msg.rb +0 -2
  331. data/lib/mongo/operation/indexes/result.rb +1 -5
  332. data/lib/mongo/operation/indexes.rb +0 -2
  333. data/lib/mongo/operation/insert/bulk_result.rb +2 -6
  334. data/lib/mongo/operation/insert/op_msg.rb +7 -6
  335. data/lib/mongo/operation/insert/result.rb +0 -3
  336. data/lib/mongo/operation/insert.rb +2 -5
  337. data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
  338. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
  339. data/lib/mongo/operation/kill_cursors.rb +0 -2
  340. data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
  341. data/lib/mongo/operation/list_collections/result.rb +1 -4
  342. data/lib/mongo/operation/list_collections.rb +0 -2
  343. data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
  344. data/lib/mongo/operation/map_reduce/result.rb +3 -6
  345. data/lib/mongo/operation/map_reduce.rb +0 -2
  346. data/lib/mongo/operation/op_msg_base.rb +0 -1
  347. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
  348. data/lib/mongo/operation/parallel_scan/result.rb +2 -5
  349. data/lib/mongo/operation/parallel_scan.rb +0 -2
  350. data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
  351. data/lib/mongo/operation/remove_user.rb +0 -2
  352. data/lib/mongo/operation/result.rb +38 -48
  353. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
  354. data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
  355. data/lib/mongo/operation/shared/executable.rb +29 -31
  356. data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
  357. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
  358. data/lib/mongo/operation/shared/idable.rb +3 -6
  359. data/lib/mongo/operation/shared/limited.rb +0 -3
  360. data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
  361. data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
  362. data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
  363. data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
  364. data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
  365. data/lib/mongo/operation/shared/response_handling.rb +13 -26
  366. data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
  367. data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
  368. data/lib/mongo/operation/shared/specifiable.rb +37 -59
  369. data/lib/mongo/operation/shared/write.rb +12 -17
  370. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
  371. data/lib/mongo/operation/update/bulk_result.rb +13 -17
  372. data/lib/mongo/operation/update/op_msg.rb +2 -5
  373. data/lib/mongo/operation/update/result.rb +5 -5
  374. data/lib/mongo/operation/update.rb +1 -5
  375. data/lib/mongo/operation/update_user/op_msg.rb +2 -4
  376. data/lib/mongo/operation/update_user.rb +0 -2
  377. data/lib/mongo/operation/users_info/op_msg.rb +2 -4
  378. data/lib/mongo/operation/users_info/result.rb +1 -4
  379. data/lib/mongo/operation/users_info.rb +0 -2
  380. data/lib/mongo/operation/write_command/op_msg.rb +2 -10
  381. data/lib/mongo/operation/write_command.rb +0 -2
  382. data/lib/mongo/operation.rb +9 -14
  383. data/lib/mongo/options/mapper.rb +8 -15
  384. data/lib/mongo/options/redacted.rb +7 -9
  385. data/lib/mongo/options.rb +0 -1
  386. data/lib/mongo/protocol/bit_vector.rb +3 -5
  387. data/lib/mongo/protocol/caching_hash.rb +2 -7
  388. data/lib/mongo/protocol/compressed.rb +5 -10
  389. data/lib/mongo/protocol/get_more.rb +2 -8
  390. data/lib/mongo/protocol/kill_cursors.rb +2 -8
  391. data/lib/mongo/protocol/message.rb +103 -105
  392. data/lib/mongo/protocol/msg.rb +48 -63
  393. data/lib/mongo/protocol/query.rb +32 -41
  394. data/lib/mongo/protocol/registry.rb +2 -5
  395. data/lib/mongo/protocol/reply.rb +10 -16
  396. data/lib/mongo/protocol/serializers.rb +41 -59
  397. data/lib/mongo/protocol.rb +0 -1
  398. data/lib/mongo/query_cache.rb +7 -15
  399. data/lib/mongo/retryable/backpressure.rb +31 -0
  400. data/lib/mongo/retryable/base_worker.rb +39 -13
  401. data/lib/mongo/retryable/read_worker.rb +77 -21
  402. data/lib/mongo/retryable/retry_policy.rb +59 -0
  403. data/lib/mongo/retryable/write_worker.rb +155 -56
  404. data/lib/mongo/retryable.rb +70 -9
  405. data/lib/mongo/search_index/view.rb +30 -10
  406. data/lib/mongo/semaphore.rb +0 -1
  407. data/lib/mongo/server/app_metadata/environment.rb +3 -3
  408. data/lib/mongo/server/app_metadata/platform.rb +17 -4
  409. data/lib/mongo/server/app_metadata.rb +4 -5
  410. data/lib/mongo/server/connection.rb +79 -61
  411. data/lib/mongo/server/connection_base.rb +43 -53
  412. data/lib/mongo/server/connection_common.rb +41 -64
  413. data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
  414. data/lib/mongo/server/connection_pool/populator.rb +1 -4
  415. data/lib/mongo/server/connection_pool.rb +195 -167
  416. data/lib/mongo/server/description/features.rb +51 -59
  417. data/lib/mongo/server/description/load_balancer.rb +0 -2
  418. data/lib/mongo/server/description.rb +117 -138
  419. data/lib/mongo/server/monitor/app_metadata.rb +3 -4
  420. data/lib/mongo/server/monitor/connection.rb +28 -35
  421. data/lib/mongo/server/monitor.rb +65 -60
  422. data/lib/mongo/server/pending_connection.rb +70 -71
  423. data/lib/mongo/server/push_monitor/connection.rb +0 -3
  424. data/lib/mongo/server/push_monitor.rb +21 -29
  425. data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
  426. data/lib/mongo/server.rb +62 -94
  427. data/lib/mongo/server_selector/base.rb +133 -157
  428. data/lib/mongo/server_selector/nearest.rb +2 -5
  429. data/lib/mongo/server_selector/primary.rb +1 -5
  430. data/lib/mongo/server_selector/primary_preferred.rb +2 -6
  431. data/lib/mongo/server_selector/secondary.rb +2 -6
  432. data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
  433. data/lib/mongo/server_selector.rb +3 -4
  434. data/lib/mongo/session/server_session.rb +6 -7
  435. data/lib/mongo/session/session_pool.rb +20 -34
  436. data/lib/mongo/session.rb +334 -199
  437. data/lib/mongo/socket/ocsp_cache.rb +8 -13
  438. data/lib/mongo/socket/ocsp_verifier.rb +69 -70
  439. data/lib/mongo/socket/ssl.rb +44 -43
  440. data/lib/mongo/socket/tcp.rb +5 -8
  441. data/lib/mongo/socket/unix.rb +0 -4
  442. data/lib/mongo/socket.rb +80 -102
  443. data/lib/mongo/srv/monitor.rb +10 -11
  444. data/lib/mongo/srv/resolver.rb +15 -24
  445. data/lib/mongo/srv/result.rb +25 -21
  446. data/lib/mongo/srv.rb +0 -1
  447. data/lib/mongo/timeout.rb +4 -11
  448. data/lib/mongo/topology_version.rb +8 -13
  449. data/lib/mongo/tracing/open_telemetry/command_tracer.rb +320 -0
  450. data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +227 -0
  451. data/lib/mongo/tracing/open_telemetry/tracer.rb +236 -0
  452. data/lib/mongo/{error/server_api_not_supported.rb → tracing/open_telemetry.rb} +10 -10
  453. data/lib/mongo/tracing.rb +42 -0
  454. data/lib/mongo/uri/options_mapper.rb +135 -126
  455. data/lib/mongo/uri/srv_protocol.rb +34 -42
  456. data/lib/mongo/uri.rb +95 -139
  457. data/lib/mongo/utils.rb +5 -12
  458. data/lib/mongo/version.rb +1 -1
  459. data/lib/mongo/write_concern/acknowledged.rb +0 -2
  460. data/lib/mongo/write_concern/base.rb +6 -6
  461. data/lib/mongo/write_concern/unacknowledged.rb +0 -2
  462. data/lib/mongo/write_concern.rb +14 -15
  463. data/lib/mongo.rb +4 -3
  464. data/mongo.gemspec +17 -17
  465. metadata +11 -5
  466. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
  467. data/lib/mongo/operation/shared/validatable.rb +0 -87
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2020 MongoDB Inc.
5
4
  #
@@ -17,7 +16,6 @@
17
16
 
18
17
  module Mongo
19
18
  class URI
20
-
21
19
  # Performs mapping between URI options and Ruby options.
22
20
  #
23
21
  # This class contains:
@@ -37,10 +35,9 @@ module Mongo
37
35
  #
38
36
  # @api private
39
37
  class OptionsMapper
40
-
41
38
  include Loggable
42
39
 
43
- # Instantates the options mapper.
40
+ # Instantiates the options mapper.
44
41
  #
45
42
  # @option opts [ Logger ] :logger A custom logger to use.
46
43
  def initialize(**opts)
@@ -68,21 +65,19 @@ module Mongo
68
65
 
69
66
  group = strategy[:group]
70
67
  target = if group
71
- uri_options[group] || {}
72
- else
73
- uri_options
74
- end
68
+ uri_options[group] || {}
69
+ else
70
+ uri_options
71
+ end
75
72
  value = apply_transform(key, value, strategy[:type])
76
73
  # Sometimes the value here would be nil, for example if we are processing
77
74
  # read preference tags or auth mechanism properties and all of the
78
75
  # data within is invalid. Ignore such options.
79
- unless value.nil?
80
- merge_uri_option(target, value, strategy[:name])
81
- end
76
+ merge_uri_option(target, value, strategy[:name]) unless value.nil?
82
77
 
83
- if group && !target.empty? && !uri_options.key?(group)
84
- uri_options[group] = target
85
- end
78
+ return unless group && !target.empty? && !uri_options.key?(group)
79
+
80
+ uri_options[group] = target
86
81
  end
87
82
 
88
83
  def smc_to_ruby(opts)
@@ -97,22 +92,18 @@ module Mongo
97
92
 
98
93
  group = strategy[:group]
99
94
  target = if group
100
- uri_options[group] || {}
101
- else
102
- uri_options
103
- end
95
+ uri_options[group] || {}
96
+ else
97
+ uri_options
98
+ end
104
99
 
105
100
  value = apply_transform(key, value, strategy[:type])
106
101
  # Sometimes the value here would be nil, for example if we are processing
107
102
  # read preference tags or auth mechanism properties and all of the
108
103
  # data within is invalid. Ignore such options.
109
- unless value.nil?
110
- merge_uri_option(target, value, strategy[:name])
111
- end
104
+ merge_uri_option(target, value, strategy[:name]) unless value.nil?
112
105
 
113
- if group && !target.empty? && !uri_options.key?(group)
114
- uri_options[group] = target
115
- end
106
+ uri_options[group] = target if group && !target.empty? && !uri_options.key?(group)
116
107
  end
117
108
 
118
109
  uri_options
@@ -128,35 +119,30 @@ module Mongo
128
119
  URI_OPTION_MAP.each do |uri_key, spec|
129
120
  if spec[:group]
130
121
  v = opts[spec[:group]]
131
- v = v && v[spec[:name]]
122
+ v &&= v[spec[:name]]
132
123
  else
133
124
  v = opts[spec[:name]]
134
125
  end
135
- unless v.nil?
136
- if type = spec[:type]
137
- v = send("revert_#{type}", v)
138
- end
139
- canonical_key = URI_OPTION_CANONICAL_NAMES[uri_key]
140
- unless canonical_key
141
- raise ArgumentError, "Option #{uri_key} is not known"
142
- end
143
- rv[canonical_key] = v
126
+ next if v.nil?
127
+
128
+ if type = spec[:type]
129
+ v = send("revert_#{type}", v)
144
130
  end
131
+ canonical_key = URI_OPTION_CANONICAL_NAMES[uri_key]
132
+ raise ArgumentError, "Option #{uri_key} is not known" unless canonical_key
133
+
134
+ rv[canonical_key] = v
145
135
  end
146
136
  # For options that default to true, remove the value if it is true.
147
- %w(retryReads retryWrites).each do |k|
148
- if rv[k]
149
- rv.delete(k)
150
- end
137
+ %w[retryReads retryWrites].each do |k|
138
+ rv.delete(k) if rv[k]
151
139
  end
152
140
  # Remove auth source when it is $external for mechanisms that default
153
141
  # (or require) that auth source.
154
- if %w(MONGODB-AWS).include?(rv['authMechanism']) && rv['authSource'] == '$external'
155
- rv.delete('authSource')
156
- end
142
+ rv.delete('authSource') if %w[MONGODB-AWS].include?(rv['authMechanism']) && rv['authSource'] == '$external'
157
143
  # ssl and tls are aliases, remove ssl ones
158
144
  rv.delete('ssl')
159
- # TODO remove authSource if it is the same as the database,
145
+ # TODO: remove authSource if it is the same as the database,
160
146
  # requires this method to know the database specified in the client.
161
147
  rv
162
148
  end
@@ -171,39 +157,56 @@ module Mongo
171
157
  URI_OPTION_MAP.each do |uri_key, spec|
172
158
  if spec[:group]
173
159
  v = opts[spec[:group]]
174
- v = v && v[spec[:name]]
160
+ v &&= v[spec[:name]]
175
161
  else
176
162
  v = opts[spec[:name]]
177
163
  end
178
- unless v.nil?
179
- if type = spec[:type]
180
- v = send("stringify_#{type}", v)
181
- end
182
- canonical_key = URI_OPTION_CANONICAL_NAMES[uri_key]
183
- unless canonical_key
184
- raise ArgumentError, "Option #{uri_key} is not known"
185
- end
186
- rv[canonical_key] = v
164
+ next if v.nil?
165
+
166
+ if type = spec[:type]
167
+ v = send("stringify_#{type}", v)
187
168
  end
169
+ canonical_key = URI_OPTION_CANONICAL_NAMES[uri_key]
170
+ raise ArgumentError, "Option #{uri_key} is not known" unless canonical_key
171
+
172
+ rv[canonical_key] = v
188
173
  end
189
174
  # For options that default to true, remove the value if it is true.
190
- %w(retryReads retryWrites).each do |k|
191
- if rv[k]
192
- rv.delete(k)
193
- end
175
+ %w[retryReads retryWrites].each do |k|
176
+ rv.delete(k) if rv[k]
194
177
  end
195
178
  # Remove auth source when it is $external for mechanisms that default
196
179
  # (or require) that auth source.
197
- if %w(MONGODB-AWS).include?(rv['authMechanism']) && rv['authSource'] == '$external'
198
- rv.delete('authSource')
199
- end
180
+ rv.delete('authSource') if %w[MONGODB-AWS].include?(rv['authMechanism']) && rv['authSource'] == '$external'
200
181
  # ssl and tls are aliases, remove ssl ones
201
182
  rv.delete('ssl')
202
- # TODO remove authSource if it is the same as the database,
183
+ # TODO: remove authSource if it is the same as the database,
203
184
  # requires this method to know the database specified in the client.
204
185
  rv
205
186
  end
206
187
 
188
+ # Hash for storing map of URI option parameters to conversion strategies
189
+ # @api private
190
+ URI_OPTION_MAP = {}
191
+
192
+ # @return [ Hash<String, String> ] Map from lowercased to canonical URI
193
+ # option names.
194
+ # @api private
195
+ URI_OPTION_CANONICAL_NAMES = {}
196
+
197
+ # Simple internal dsl to register a MongoDB URI option in the URI_OPTION_MAP.
198
+ #
199
+ # @param [ String ] uri_key The MongoDB URI option to register.
200
+ # @param [ Symbol ] name The name of the option in the driver.
201
+ # @param [ Hash ] extra Extra options.
202
+ # * :group [ Symbol ] Nested hash where option will go.
203
+ # * :type [ Symbol ] Name of function to transform value.
204
+ # @api private
205
+ def self.uri_option(uri_key, name, **extra)
206
+ URI_OPTION_MAP[uri_key.downcase] = { name: name }.update(extra)
207
+ URI_OPTION_CANONICAL_NAMES[uri_key.downcase] = uri_key
208
+ end
209
+
207
210
  private
208
211
 
209
212
  # Applies URI value transformation by either using the default cast
@@ -243,25 +246,6 @@ module Mongo
243
246
  end
244
247
  end
245
248
 
246
- # Hash for storing map of URI option parameters to conversion strategies
247
- URI_OPTION_MAP = {}
248
-
249
- # @return [ Hash<String, String> ] Map from lowercased to canonical URI
250
- # option names.
251
- URI_OPTION_CANONICAL_NAMES = {}
252
-
253
- # Simple internal dsl to register a MongoDB URI option in the URI_OPTION_MAP.
254
- #
255
- # @param [ String ] uri_key The MongoDB URI option to register.
256
- # @param [ Symbol ] name The name of the option in the driver.
257
- # @param [ Hash ] extra Extra options.
258
- # * :group [ Symbol ] Nested hash where option will go.
259
- # * :type [ Symbol ] Name of function to transform value.
260
- def self.uri_option(uri_key, name, **extra)
261
- URI_OPTION_MAP[uri_key.downcase] = { name: name }.update(extra)
262
- URI_OPTION_CANONICAL_NAMES[uri_key.downcase] = uri_key
263
- end
264
-
265
249
  # Replica Set Options
266
250
  uri_option 'replicaSet', :replica_set
267
251
 
@@ -303,7 +287,7 @@ module Mongo
303
287
  uri_option 'tlsCertificateKeyFilePassword', :ssl_key_pass_phrase
304
288
  uri_option 'tlsInsecure', :ssl_verify, type: :inverse_bool
305
289
  uri_option 'tlsDisableOCSPEndpointCheck', :ssl_verify_ocsp_endpoint,
306
- type: :inverse_bool
290
+ type: :inverse_bool
307
291
 
308
292
  # Topology options
309
293
  uri_option 'directConnection', :direct_connection, type: :bool
@@ -323,8 +307,13 @@ module Mongo
323
307
  uri_option 'readConcernLevel', :level, group: :read_concern, type: :symbol
324
308
  uri_option 'retryReads', :retry_reads, type: :bool
325
309
  uri_option 'retryWrites', :retry_writes, type: :bool
310
+ uri_option 'enableOverloadRetargeting', :enable_overload_retargeting, type: :bool
311
+ uri_option 'maxAdaptiveRetries', :max_adaptive_retries, type: :integer
326
312
  uri_option 'zlibCompressionLevel', :zlib_compression_level, type: :zlib_compression_level
327
313
 
314
+ # Monitoring Options
315
+ uri_option 'serverMonitoringMode', :server_monitoring_mode, type: :server_monitoring_mode
316
+
328
317
  # Converts +value+ to a boolean.
329
318
  #
330
319
  # Returns true for 'true', false for 'false', otherwise nil.
@@ -335,9 +324,9 @@ module Mongo
335
324
  # @return [ true | false | nil ] Converted value.
336
325
  def convert_bool(name, value)
337
326
  case value
338
- when true, "true", 'TRUE'
327
+ when true, 'true', 'TRUE'
339
328
  true
340
- when false, "false", 'FALSE'
329
+ when false, 'false', 'FALSE'
341
330
  false
342
331
  else
343
332
  log_warn("invalid boolean option for #{name}: #{value}")
@@ -371,7 +360,7 @@ module Mongo
371
360
  # @return [ Array<true | false> | nil ] The boolean value parsed and wraped
372
361
  # in an array.
373
362
  def convert_repeated_bool(name, value)
374
- [convert_bool(name, value)]
363
+ [ convert_bool(name, value) ]
375
364
  end
376
365
 
377
366
  # Reverts a repeated boolean type.
@@ -391,7 +380,7 @@ module Mongo
391
380
  def stringify_repeated_bool(value)
392
381
  rep = revert_repeated_bool(value)
393
382
  if rep&.is_a?(Array)
394
- rep.join(",")
383
+ rep.join(',')
395
384
  else
396
385
  rep
397
386
  end
@@ -480,7 +469,7 @@ module Mongo
480
469
  def convert_ms(name, value)
481
470
  case value
482
471
  when String
483
- if /\A-?\d+(\.\d+)?\z/ !~ value
472
+ unless /\A-?\d+(\.\d+)?\z/.match?(value)
484
473
  log_warn("Invalid ms value for #{name}: #{value}")
485
474
  return nil
486
475
  end
@@ -524,7 +513,7 @@ module Mongo
524
513
  # @param [ String | Symbol ] value URI option value.
525
514
  #
526
515
  # @return [ Symbol ] Converted value.
527
- def convert_symbol(name, value)
516
+ def convert_symbol(_name, value)
528
517
  value.to_sym
529
518
  end
530
519
 
@@ -536,7 +525,7 @@ module Mongo
536
525
  def revert_symbol(value)
537
526
  value.to_s
538
527
  end
539
- alias :stringify_symbol :revert_symbol
528
+ alias stringify_symbol revert_symbol
540
529
 
541
530
  # Extract values from the string and put them into an array.
542
531
  #
@@ -544,7 +533,7 @@ module Mongo
544
533
  # @param [ String ] value The string to build an array from.
545
534
  #
546
535
  # @return [ Array<String> ] The array built from the string.
547
- def convert_array(name, value)
536
+ def convert_array(_name, value)
548
537
  value.split(',')
549
538
  end
550
539
 
@@ -572,9 +561,9 @@ module Mongo
572
561
  # @param [ String ] value The authentication mechanism.
573
562
  #
574
563
  # @return [ Symbol ] The transformed authentication mechanism.
575
- def convert_auth_mech(name, value)
564
+ def convert_auth_mech(_name, value)
576
565
  auth_mech = AUTH_MECH_MAP[value.upcase]
577
- (auth_mech || value).tap do |mech|
566
+ (auth_mech || value).tap do |_mech|
578
567
  log_warn("#{value} is not a valid auth mechanism") unless auth_mech
579
568
  end
580
569
  end
@@ -587,14 +576,12 @@ module Mongo
587
576
  #
588
577
  # @raise [ ArgumentError ] if its an invalid auth mechanism.
589
578
  def revert_auth_mech(value)
590
- found = AUTH_MECH_MAP.detect do |k, v|
579
+ found = AUTH_MECH_MAP.detect do |_k, v|
591
580
  v == value
592
581
  end
593
- if found
594
- found.first
595
- else
596
- raise ArgumentError, "Unknown auth mechanism #{value}"
597
- end
582
+ raise ArgumentError, "Unknown auth mechanism #{value}" unless found
583
+
584
+ found.first
598
585
  end
599
586
 
600
587
  # Stringifies auth mechanism.
@@ -603,7 +590,9 @@ module Mongo
603
590
  #
604
591
  # @return [ String | nil ] The auth mechanism as a string.
605
592
  def stringify_auth_mech(value)
606
- revert_auth_mech(value) rescue nil
593
+ revert_auth_mech(value)
594
+ rescue StandardError
595
+ nil
607
596
  end
608
597
 
609
598
  # Auth mechanism properties extractor.
@@ -612,13 +601,11 @@ module Mongo
612
601
  # @param [ String ] value The auth mechanism properties string.
613
602
  #
614
603
  # @return [ Hash | nil ] The auth mechanism properties hash.
615
- def convert_auth_mech_props(name, value)
604
+ def convert_auth_mech_props(_name, value)
616
605
  properties = hash_extractor('authMechanismProperties', value)
617
606
  if properties
618
607
  properties.each do |k, v|
619
- if k.to_s.downcase == 'canonicalize_host_name' && v
620
- properties[k] = (v.downcase == 'true')
621
- end
608
+ properties[k] = (v.downcase == 'true') if k.to_s.downcase == 'canonicalize_host_name' && v
622
609
  end
623
610
  end
624
611
  properties
@@ -640,6 +627,7 @@ module Mongo
640
627
  # @return [ String | nil ] The string.
641
628
  def stringify_auth_mech_props(value)
642
629
  return if value.nil?
630
+
643
631
  value.map { |k, v| "#{k}:#{v}" }.join(',')
644
632
  end
645
633
 
@@ -651,23 +639,21 @@ module Mongo
651
639
  #
652
640
  # @return [ Integer | nil ] The max staleness integer parsed out if it is valid, otherwise nil
653
641
  # (and a warning will be logged).
654
- def convert_max_staleness(name, value)
642
+ def convert_max_staleness(_name, value)
655
643
  int = if value.is_a?(String) && /\A-?\d+\z/ =~ value
656
- value.to_i
657
- elsif value.is_a?(Integer)
658
- value
659
- end
644
+ value.to_i
645
+ elsif value.is_a?(Integer)
646
+ value
647
+ end
660
648
 
661
649
  if int.nil?
662
650
  log_warn("Invalid max staleness value: #{value}")
663
651
  return nil
664
652
  end
665
653
 
666
- if int == -1
667
- int = nil
668
- end
654
+ int = nil if int == -1
669
655
 
670
- if int && (int > 0 && int < 90 || int < 0)
656
+ if int && ((int > 0 && int < 90) || int < 0)
671
657
  log_warn("max staleness should be either 0 or greater than 90: #{value}")
672
658
  int = nil
673
659
  end
@@ -699,7 +685,7 @@ module Mongo
699
685
  # @param [ String ] value The read mode string value.
700
686
  #
701
687
  # @return [ Symbol | String ] The read mode.
702
- def convert_read_mode(name, value)
688
+ def convert_read_mode(_name, value)
703
689
  READ_MODE_MAP[value.downcase] || value
704
690
  end
705
691
 
@@ -709,9 +695,34 @@ module Mongo
709
695
  #
710
696
  # @return [ String ] The read mode as a string.
711
697
  def revert_read_mode(value)
712
- value.to_s.gsub(/_(\w)/) { $1.upcase }
698
+ value.to_s.gsub(/_(\w)/) { ::Regexp.last_match(1).upcase }
699
+ end
700
+ alias stringify_read_mode revert_read_mode
701
+
702
+ # Server monitoring mode transformation.
703
+ #
704
+ # @param [ String ] name Name of the URI option being processed.
705
+ # @param [ String ] value The server monitoring mode string value.
706
+ #
707
+ # @return [ Symbol | nil ] The server monitoring mode symbol.
708
+ def convert_server_monitoring_mode(_name, value)
709
+ mode = value.downcase
710
+ if SERVER_MONITORING_MODES.include?(mode)
711
+ mode.to_sym
712
+ else
713
+ log_warn("#{value} is not a valid server monitoring mode")
714
+ nil
715
+ end
716
+ end
717
+
718
+ # Stringifies server monitoring mode.
719
+ #
720
+ # @param [ Symbol ] value The server monitoring mode.
721
+ #
722
+ # @return [ String ] The server monitoring mode as a string.
723
+ def stringify_server_monitoring_mode(value)
724
+ value.to_s
713
725
  end
714
- alias :stringify_read_mode :revert_read_mode
715
726
 
716
727
  # Read preference tags transformation.
717
728
  #
@@ -721,11 +732,9 @@ module Mongo
721
732
  # @return [ Array<Hash> | nil ] Array with tag set.
722
733
  def convert_read_tags(name, value)
723
734
  converted = convert_read_set(name, value)
724
- if converted
725
- [converted]
726
- else
727
- nil
728
- end
735
+ return unless converted
736
+
737
+ [ converted ]
729
738
  end
730
739
 
731
740
  # Reverts read tags.
@@ -752,7 +761,7 @@ module Mongo
752
761
  # @param [ String ] value The tag set string.
753
762
  #
754
763
  # @return [ Hash ] The tag set hash.
755
- def convert_read_set(name, value)
764
+ def convert_read_set(_name, value)
756
765
  hash_extractor('readPreferenceTags', value)
757
766
  end
758
767
 
@@ -766,7 +775,7 @@ module Mongo
766
775
  # @param [ String | Integer ] value URI option value.
767
776
  #
768
777
  # @return [ Integer | Symbol | String ] Converted value.
769
- def convert_w(name, value)
778
+ def convert_w(_name, value)
770
779
  case value
771
780
  when 'majority'
772
781
  :majority
@@ -807,14 +816,14 @@ module Mongo
807
816
  #
808
817
  # @return [ Integer | nil ] The compression level value if it is between -1 and 9 (inclusive),
809
818
  # otherwise nil (and a warning will be logged).
810
- def convert_zlib_compression_level(name, value)
819
+ def convert_zlib_compression_level(_name, value)
811
820
  i = if value.is_a?(String) && /\A-?\d+\z/ =~ value
812
- value.to_i
813
- elsif value.is_a?(Integer)
814
- value
815
- end
821
+ value.to_i
822
+ elsif value.is_a?(Integer)
823
+ value
824
+ end
816
825
 
817
- if i && (i >= -1 && i <= 9)
826
+ if i && i >= -1 && i <= 9
818
827
  i
819
828
  else
820
829
  log_warn("#{value} is not a valid zlibCompressionLevel")