mongo 2.5.3 → 2.6.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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/LICENSE +1 -1
- data/README.md +3 -2
- data/lib/mongo.rb +2 -2
- data/lib/mongo/address.rb +10 -2
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +26 -5
- data/lib/mongo/address/unix.rb +1 -1
- data/lib/mongo/auth.rb +10 -3
- data/lib/mongo/auth/cr.rb +4 -1
- data/lib/mongo/auth/cr/conversation.rb +4 -1
- data/lib/mongo/auth/ldap.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/roles.rb +1 -1
- data/lib/mongo/auth/scram.rb +24 -7
- data/lib/mongo/auth/scram/conversation.rb +52 -19
- data/lib/mongo/auth/stringprep.rb +114 -0
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +73 -0
- data/lib/mongo/auth/stringprep/tables.rb +3232 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +174 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1170 -0
- data/lib/mongo/auth/user.rb +14 -3
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/auth/x509.rb +1 -1
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write.rb +8 -8
- data/lib/mongo/bulk_write/combineable.rb +1 -1
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +4 -4
- data/lib/mongo/bulk_write/transformable.rb +1 -1
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +1 -1
- data/lib/mongo/client.rb +115 -24
- data/lib/mongo/cluster.rb +17 -10
- data/lib/mongo/cluster/app_metadata.rb +7 -1
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
- data/lib/mongo/cluster/topology.rb +12 -2
- data/lib/mongo/cluster/topology/replica_set.rb +9 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/collection.rb +75 -19
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/builder/aggregation.rb +3 -3
- data/lib/mongo/collection/view/builder/find_command.rb +1 -1
- data/lib/mongo/collection/view/builder/flags.rb +1 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +193 -17
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -20
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/immutable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +2 -2
- data/lib/mongo/collection/view/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/readable.rb +108 -29
- data/lib/mongo/collection/view/writable.rb +3 -3
- data/lib/mongo/cursor.rb +44 -4
- data/lib/mongo/cursor/builder.rb +1 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
- data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
- data/lib/mongo/database.rb +46 -3
- data/lib/mongo/database/view.rb +11 -11
- data/lib/mongo/dbref.rb +1 -1
- data/lib/mongo/error.rb +57 -1
- data/lib/mongo/error/bulk_write_error.rb +2 -2
- data/lib/mongo/error/change_stream_resumable.rb +37 -0
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/extra_file_chunk.rb +1 -1
- data/lib/mongo/error/failed_stringprep_validation.rb +38 -0
- data/lib/mongo/error/file_not_found.rb +1 -1
- data/lib/mongo/error/insufficient_iteration_count.rb +38 -0
- data/lib/mongo/error/invalid_application_name.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
- data/lib/mongo/error/invalid_collection_name.rb +1 -1
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +1 -1
- data/lib/mongo/error/invalid_read_option.rb +35 -0
- data/lib/mongo/error/invalid_replacement_document.rb +1 -1
- data/lib/mongo/error/invalid_server_preference.rb +1 -1
- data/lib/mongo/error/invalid_session.rb +1 -1
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +82 -0
- data/lib/mongo/error/invalid_txt_record.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +1 -1
- data/lib/mongo/error/invalid_uri.rb +1 -1
- data/lib/mongo/error/invalid_write_concern.rb +1 -1
- data/lib/mongo/error/max_bson_size.rb +1 -1
- data/lib/mongo/error/max_message_size.rb +1 -1
- data/lib/mongo/error/mismatched_domain.rb +1 -1
- data/lib/mongo/error/missing_file_chunk.rb +1 -1
- data/lib/mongo/error/missing_resume_token.rb +1 -1
- data/lib/mongo/error/multi_index_drop.rb +1 -1
- data/lib/mongo/error/need_primary_server.rb +1 -1
- data/lib/mongo/error/no_server_available.rb +1 -1
- data/lib/mongo/error/no_srv_records.rb +1 -1
- data/lib/mongo/error/operation_failure.rb +108 -14
- data/lib/mongo/error/parser.rb +50 -1
- data/lib/mongo/error/socket_error.rb +5 -2
- data/lib/mongo/error/socket_timeout_error.rb +5 -2
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
- data/lib/mongo/error/unexpected_response.rb +1 -1
- data/lib/mongo/error/unknown_payload_type.rb +1 -1
- data/lib/mongo/error/unsupported_array_filters.rb +1 -1
- data/lib/mongo/error/unsupported_collation.rb +1 -1
- data/lib/mongo/error/unsupported_features.rb +1 -1
- data/lib/mongo/error/unsupported_message_type.rb +1 -1
- data/lib/mongo/error/write_retryable.rb +27 -0
- data/lib/mongo/event.rb +10 -9
- data/lib/mongo/event/base.rb +33 -0
- data/lib/mongo/event/description_changed.rb +2 -2
- data/lib/mongo/event/listeners.rb +1 -1
- data/lib/mongo/event/member_discovered.rb +4 -2
- data/lib/mongo/event/primary_elected.rb +2 -2
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/standalone_discovered.rb +2 -2
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +3 -3
- data/lib/mongo/grid/file/info.rb +26 -3
- data/lib/mongo/grid/fs_bucket.rb +1 -1
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +1 -1
- data/lib/mongo/index.rb +1 -1
- data/lib/mongo/index/view.rb +1 -1
- data/lib/mongo/loggable.rb +1 -1
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring.rb +99 -62
- data/lib/mongo/monitoring/command_log_subscriber.rb +2 -2
- data/lib/mongo/monitoring/event.rb +2 -1
- data/lib/mongo/monitoring/event/command_failed.rb +19 -6
- data/lib/mongo/monitoring/event/command_started.rb +14 -3
- data/lib/mongo/monitoring/event/command_succeeded.rb +5 -3
- data/lib/mongo/monitoring/event/secure.rb +1 -1
- data/lib/mongo/monitoring/event/server_closed.rb +2 -2
- data/lib/mongo/monitoring/event/server_description_changed.rb +2 -2
- data/lib/mongo/monitoring/event/server_opening.rb +11 -2
- data/lib/mongo/monitoring/event/topology_changed.rb +13 -2
- data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
- data/lib/mongo/monitoring/event/topology_opening.rb +11 -2
- data/lib/mongo/monitoring/publishable.rb +10 -6
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
- data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
- data/lib/mongo/operation/create/op_msg.rb +9 -0
- data/lib/mongo/operation/create_index/op_msg.rb +9 -0
- data/lib/mongo/operation/create_user/command.rb +1 -1
- data/lib/mongo/operation/create_user/op_msg.rb +10 -1
- data/lib/mongo/operation/delete/op_msg.rb +3 -0
- data/lib/mongo/operation/distinct/op_msg.rb +9 -0
- data/lib/mongo/operation/drop/op_msg.rb +9 -0
- data/lib/mongo/operation/drop_database/op_msg.rb +9 -0
- data/lib/mongo/operation/drop_index/op_msg.rb +9 -0
- data/lib/mongo/operation/explain/op_msg.rb +3 -0
- data/lib/mongo/operation/find/op_msg.rb +3 -0
- data/lib/mongo/operation/get_more.rb +1 -1
- data/lib/mongo/operation/get_more/command.rb +1 -1
- data/lib/mongo/operation/get_more/legacy.rb +1 -1
- data/lib/mongo/operation/get_more/op_msg.rb +3 -0
- data/lib/mongo/operation/indexes/op_msg.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +1 -1
- data/lib/mongo/operation/insert/bulk_result.rb +32 -2
- data/lib/mongo/operation/insert/op_msg.rb +3 -0
- data/lib/mongo/operation/insert/result.rb +1 -1
- data/lib/mongo/operation/kill_cursors/op_msg.rb +9 -0
- data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -1
- data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
- data/lib/mongo/operation/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
- data/lib/mongo/operation/remove_user/op_msg.rb +9 -0
- data/lib/mongo/operation/result.rb +27 -14
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +78 -7
- data/lib/mongo/operation/shared/specifiable.rb +18 -2
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
- data/lib/mongo/operation/update/op_msg.rb +3 -0
- data/lib/mongo/operation/update_user/command.rb +1 -1
- data/lib/mongo/operation/update_user/op_msg.rb +10 -1
- data/lib/mongo/operation/users_info/op_msg.rb +3 -0
- data/lib/mongo/options.rb +1 -1
- data/lib/mongo/options/mapper.rb +1 -1
- data/lib/mongo/options/redacted.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +1 -1
- data/lib/mongo/protocol/delete.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +7 -7
- data/lib/mongo/protocol/insert.rb +1 -1
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +5 -5
- data/lib/mongo/protocol/msg.rb +9 -7
- data/lib/mongo/protocol/query.rb +1 -1
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +10 -10
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/protocol/update.rb +1 -1
- data/lib/mongo/retryable.rb +22 -14
- data/lib/mongo/server.rb +1 -1
- data/lib/mongo/server/connectable.rb +1 -1
- data/lib/mongo/server/connection.rb +16 -4
- data/lib/mongo/server/connection_pool.rb +1 -1
- data/lib/mongo/server/connection_pool/queue.rb +1 -1
- data/lib/mongo/server/context.rb +1 -1
- data/lib/mongo/server/description.rb +14 -2
- data/lib/mongo/server/description/features.rb +10 -9
- data/lib/mongo/server/description/inspector.rb +1 -1
- data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
- data/lib/mongo/server/description/inspector/member_discovered.rb +1 -1
- data/lib/mongo/server/description/inspector/primary_elected.rb +1 -1
- data/lib/mongo/server/description/inspector/standalone_discovered.rb +1 -1
- data/lib/mongo/server/monitor.rb +15 -3
- data/lib/mongo/server/monitor/connection.rb +1 -1
- data/lib/mongo/server_selector.rb +1 -1
- data/lib/mongo/server_selector/nearest.rb +1 -1
- data/lib/mongo/server_selector/primary.rb +1 -1
- data/lib/mongo/server_selector/primary_preferred.rb +1 -1
- data/lib/mongo/server_selector/secondary.rb +1 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
- data/lib/mongo/server_selector/selectable.rb +7 -2
- data/lib/mongo/session.rb +389 -12
- data/lib/mongo/session/server_session.rb +7 -2
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +1 -1
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/uri.rb +6 -4
- data/lib/mongo/uri/srv_protocol.rb +1 -1
- data/lib/mongo/version.rb +2 -2
- data/lib/mongo/write_concern.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +1 -1
- data/lib/mongo/write_concern/normalizable.rb +1 -1
- data/lib/mongo/write_concern/unacknowledged.rb +1 -1
- data/mongo.gemspec +4 -1
- data/spec/atlas/atlas_connectivity_spec.rb +54 -0
- data/spec/integration/bulk_insert_spec.rb +78 -0
- data/spec/integration/change_stream_spec.rb +365 -0
- data/spec/integration/command_monitoring_spec.rb +92 -0
- data/spec/lite_spec_helper.rb +63 -0
- data/spec/mongo/address/ipv6_spec.rb +29 -1
- data/spec/mongo/address_spec.rb +34 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +326 -120
- data/spec/mongo/auth/scram/negotiation_spec.rb +574 -0
- data/spec/mongo/auth/scram_spec.rb +107 -38
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +113 -0
- data/spec/mongo/auth/stringprep_spec.rb +188 -0
- data/spec/mongo/auth/user/view_spec.rb +5 -2
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write/result_spec.rb +120 -0
- data/spec/mongo/bulk_write_spec.rb +42 -2
- data/spec/mongo/client_spec.rb +121 -9
- data/spec/mongo/cluster/app_metadata_spec.rb +14 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -23
- data/spec/mongo/collection/view/change_stream_spec.rb +62 -180
- data/spec/mongo/collection_spec.rb +45 -12
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -7
- data/spec/mongo/cursor_spec.rb +2 -2
- data/spec/mongo/database_spec.rb +3 -3
- data/spec/mongo/docs_examples_spec.rb +194 -0
- data/spec/mongo/error/operation_failure_spec.rb +152 -0
- data/spec/mongo/error/parser_spec.rb +127 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +32 -0
- data/spec/mongo/grid/stream/write_spec.rb +40 -1
- data/spec/mongo/monitoring/event/command_failed_spec.rb +30 -0
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -4
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +29 -7
- data/spec/mongo/monitoring_spec.rb +28 -3
- data/spec/mongo/protocol/get_more_spec.rb +2 -2
- data/spec/mongo/retryable_spec.rb +252 -34
- data/spec/mongo/retryable_writes_spec.rb +468 -544
- data/spec/mongo/server/connection_spec.rb +5 -5
- data/spec/mongo/server/description_spec.rb +23 -6
- data/spec/mongo/session/server_session_spec.rb +2 -2
- data/spec/mongo/session/session_pool_spec.rb +2 -2
- data/spec/mongo/transactions_examples_spec.rb +227 -0
- data/spec/mongo/transactions_spec.rb +44 -0
- data/spec/spec_helper.rb +135 -49
- data/spec/spec_tests/change_streams_spec.rb +42 -0
- data/spec/{mongo → spec_tests}/command_monitoring_spec.rb +8 -2
- data/spec/{mongo → spec_tests}/connection_string_spec.rb +1 -1
- data/spec/{mongo → spec_tests}/crud_spec.rb +5 -7
- data/spec/{mongo → spec_tests}/dns_seedlist_discovery_spec.rb +1 -1
- data/spec/{mongo → spec_tests}/gridfs_spec.rb +0 -0
- data/spec/{mongo → spec_tests}/max_staleness_spec.rb +0 -0
- data/spec/spec_tests/retryable_writes_spec.rb +78 -0
- data/spec/{mongo → spec_tests}/sdam_monitoring_spec.rb +4 -3
- data/spec/{mongo → spec_tests}/sdam_spec.rb +7 -7
- data/spec/{mongo → spec_tests}/server_selection_rtt_spec.rb +0 -0
- data/spec/{mongo → spec_tests}/server_selection_spec.rb +0 -0
- data/spec/support/authorization.rb +18 -6
- data/spec/support/change_streams.rb +265 -0
- data/spec/support/change_streams/operation.rb +62 -0
- data/spec/support/change_streams_tests/change-streams-errors.yml +53 -0
- data/spec/support/change_streams_tests/change-streams.yml +299 -0
- data/spec/support/command_monitoring.rb +1 -1
- data/spec/support/command_monitoring/bulkWrite.yml +4 -28
- data/spec/support/command_monitoring/command.yml +19 -0
- data/spec/support/command_monitoring/find.yml +17 -19
- data/spec/support/command_monitoring/insertMany.yml +2 -8
- data/spec/support/command_monitoring/unacknowledgedBulkWrite.yml +34 -0
- data/spec/support/connection_string.rb +1 -1
- data/spec/support/constraints.rb +56 -0
- data/spec/support/crud.rb +9 -4
- data/spec/support/crud/read.rb +24 -3
- data/spec/support/crud/write.rb +7 -2
- data/spec/support/crud_tests/read/count-collation.yml +12 -2
- data/spec/support/crud_tests/read/count.yml +43 -5
- data/spec/support/gridfs.rb +1 -1
- data/spec/support/primary_socket.rb +21 -0
- data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +90 -0
- data/spec/support/retryable_writes_tests/bulkWrite.yml +99 -1
- data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +50 -0
- data/spec/support/retryable_writes_tests/deleteOne.yml +10 -1
- data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +50 -0
- data/spec/support/retryable_writes_tests/findOneAndDelete.yml +39 -30
- data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +54 -0
- data/spec/support/retryable_writes_tests/findOneAndReplace.yml +9 -0
- data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +54 -0
- data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +9 -0
- data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +59 -0
- data/spec/support/retryable_writes_tests/insertMany.yml +11 -6
- data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +471 -0
- data/spec/support/retryable_writes_tests/insertOne.yml +9 -0
- data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +58 -0
- data/spec/support/retryable_writes_tests/replaceOne.yml +9 -0
- data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +58 -0
- data/spec/support/retryable_writes_tests/updateOne.yml +71 -53
- data/spec/support/sdam/rs/normalize_case_me.yml +100 -0
- data/spec/support/sdam/sharded/compatible.yml +38 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +9 -3
- data/spec/support/sdam/sharded/multiple_mongoses.yml +6 -2
- data/spec/support/sdam/sharded/non_mongos_removed.yml +6 -2
- data/spec/support/sdam/sharded/too_new.yml +36 -0
- data/spec/support/sdam/sharded/too_old.yml +36 -0
- data/spec/support/sdam/single/compatible.yml +26 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +3 -1
- data/spec/support/sdam/single/direct_connection_mongos.yml +3 -1
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +3 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +3 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +3 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +3 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +3 -1
- data/spec/support/sdam/single/not_ok_response.yml +6 -2
- data/spec/support/sdam/single/standalone_removed.yml +3 -1
- data/spec/support/sdam/single/too_new.yml +26 -0
- data/spec/support/sdam/single/too_old.yml +24 -0
- data/spec/support/shared/session.rb +107 -0
- data/spec/support/transactions.rb +391 -0
- data/spec/support/transactions/operation.rb +373 -0
- data/spec/support/transactions_tests/abort.yml +403 -0
- data/spec/support/transactions_tests/bulk.yml +267 -0
- data/spec/support/transactions_tests/causal-consistency.yml +173 -0
- data/spec/support/transactions_tests/commit.yml +593 -0
- data/spec/support/transactions_tests/delete.yml +184 -0
- data/spec/support/transactions_tests/error-labels.yml +948 -0
- data/spec/support/transactions_tests/errors.yml +125 -0
- data/spec/support/transactions_tests/findOneAndDelete.yml +126 -0
- data/spec/support/transactions_tests/findOneAndReplace.yml +140 -0
- data/spec/support/transactions_tests/findOneAndUpdate.yml +228 -0
- data/spec/support/transactions_tests/insert.yml +264 -0
- data/spec/support/transactions_tests/isolation.yml +125 -0
- data/spec/support/transactions_tests/read-pref.yml +340 -0
- data/spec/support/transactions_tests/reads.yml +298 -0
- data/spec/support/transactions_tests/retryable-abort.yml +1292 -0
- data/spec/support/transactions_tests/retryable-commit.yml +1332 -0
- data/spec/support/transactions_tests/retryable-writes.yml +208 -0
- data/spec/support/transactions_tests/run-command.yml +189 -0
- data/spec/support/transactions_tests/transaction-options.yml +877 -0
- data/spec/support/transactions_tests/update.yml +246 -0
- data/spec/support/transactions_tests/write-concern.yml +236 -0
- metadata +494 -359
- metadata.gz.sig +0 -0
- data/lib/csasl/csasl.bundle +0 -0
@@ -47,13 +47,13 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
shared_examples_for 'a
|
50
|
+
shared_examples_for 'a getMore command builder' do
|
51
51
|
|
52
52
|
it 'includes the database name' do
|
53
53
|
expect(specification[:db_name]).to eq(TEST_DB)
|
54
54
|
end
|
55
55
|
|
56
|
-
it 'includes
|
56
|
+
it 'includes getMore with cursor id' do
|
57
57
|
expect(selector[:getMore]).to eq(cursor.id)
|
58
58
|
end
|
59
59
|
|
@@ -68,7 +68,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
|
|
68
68
|
Mongo::Collection::View.new(authorized_collection)
|
69
69
|
end
|
70
70
|
|
71
|
-
it_behaves_like 'a
|
71
|
+
it_behaves_like 'a getMore command builder'
|
72
72
|
|
73
73
|
it 'does not include max time' do
|
74
74
|
expect(selector[:maxTimeMS]).to be_nil
|
@@ -85,7 +85,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
|
|
85
85
|
Mongo::Collection::View.new(authorized_collection, {}, batch_size: 10)
|
86
86
|
end
|
87
87
|
|
88
|
-
it_behaves_like 'a
|
88
|
+
it_behaves_like 'a getMore command builder'
|
89
89
|
|
90
90
|
it 'does not include max time' do
|
91
91
|
expect(selector[:maxTimeMS]).to be_nil
|
@@ -104,7 +104,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
|
|
104
104
|
Mongo::Collection::View.new(authorized_collection, {}, max_await_time_ms: 100)
|
105
105
|
end
|
106
106
|
|
107
|
-
it_behaves_like 'a
|
107
|
+
it_behaves_like 'a getMore command builder'
|
108
108
|
|
109
109
|
it 'does not include max time' do
|
110
110
|
expect(selector[:maxTimeMS]).to be_nil
|
@@ -133,7 +133,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
|
|
133
133
|
)
|
134
134
|
end
|
135
135
|
|
136
|
-
it_behaves_like 'a
|
136
|
+
it_behaves_like 'a getMore command builder'
|
137
137
|
|
138
138
|
it 'includes max time' do
|
139
139
|
expect(selector[:maxTimeMS]).to eq(100)
|
@@ -159,7 +159,7 @@ describe Mongo::Cursor::Builder::GetMoreCommand do
|
|
159
159
|
)
|
160
160
|
end
|
161
161
|
|
162
|
-
it_behaves_like 'a
|
162
|
+
it_behaves_like 'a getMore command builder'
|
163
163
|
|
164
164
|
it 'does not include max time' do
|
165
165
|
expect(selector[:maxTimeMS]).to be_nil
|
data/spec/mongo/cursor_spec.rb
CHANGED
@@ -61,7 +61,7 @@ describe Mongo::Cursor do
|
|
61
61
|
authorized_collection.delete_many
|
62
62
|
end
|
63
63
|
|
64
|
-
context 'when a
|
64
|
+
context 'when a getMore gets a socket error' do
|
65
65
|
|
66
66
|
let(:op) do
|
67
67
|
double('operation')
|
@@ -374,7 +374,7 @@ describe Mongo::Cursor do
|
|
374
374
|
end
|
375
375
|
end
|
376
376
|
|
377
|
-
context 'when a
|
377
|
+
context 'when a getMore is needed to retrieve all results', if: sessions_enabled? && !sharded? do
|
378
378
|
|
379
379
|
let(:documents) do
|
380
380
|
(1..4).map{ |i| { field: "test#{i}" }}
|
data/spec/mongo/database_spec.rb
CHANGED
@@ -122,7 +122,7 @@ describe Mongo::Database do
|
|
122
122
|
|
123
123
|
context 'when specifying a batch size' do
|
124
124
|
|
125
|
-
it 'returns the stripped names of the collections' do
|
125
|
+
it 'returns the stripped names of the collections', unless: need_to_skip_on_sharded_auth_40? do
|
126
126
|
expect(database.collection_names(batch_size: 1).to_a).to include('users')
|
127
127
|
end
|
128
128
|
end
|
@@ -141,7 +141,7 @@ describe Mongo::Database do
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
-
it 'returns all collections' do
|
144
|
+
it 'returns all collections', unless: need_to_skip_on_sharded_auth_40? do
|
145
145
|
expect(database.collection_names(batch_size: 1).select { |c| c =~ /dalmatians/}.size).to eq(2)
|
146
146
|
end
|
147
147
|
|
@@ -268,7 +268,7 @@ describe Mongo::Database do
|
|
268
268
|
|
269
269
|
|
270
270
|
let(:full_command) do
|
271
|
-
EventSubscriber.started_events.find { |cmd| cmd.command_name ==
|
271
|
+
EventSubscriber.started_events.find { |cmd| cmd.command_name == 'ismaster' }.command
|
272
272
|
end
|
273
273
|
|
274
274
|
it 'does not add a afterClusterTime field' do
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'aggregation examples in Ruby' do
|
4
|
+
|
5
|
+
let(:client) do
|
6
|
+
authorized_client
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'Aggregation Example 1 - Simple aggregation' do
|
10
|
+
|
11
|
+
let(:example_code) do
|
12
|
+
|
13
|
+
# Start Aggregation Example 1
|
14
|
+
|
15
|
+
client[:sales].aggregate(
|
16
|
+
[
|
17
|
+
{ '$match' => { 'items.fruit' => 'banana' } },
|
18
|
+
{ '$sort' => { 'date' => 1 } }
|
19
|
+
])
|
20
|
+
|
21
|
+
# End Aggregation Example 1
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'successfully executes the aggregation' do
|
25
|
+
example_code.to_a
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'Aggregation Example 2 - $match, $group, $project, $unwind, $sum, $sort, $dayOfWeek' do
|
30
|
+
|
31
|
+
let(:example_code) do
|
32
|
+
|
33
|
+
# Start Aggregation Example 2
|
34
|
+
|
35
|
+
client[:sales].aggregate(
|
36
|
+
[
|
37
|
+
{ '$unwind' => '$items' },
|
38
|
+
{ '$match' => { 'items.fruit' => 'banana' } },
|
39
|
+
{ '$group' => {
|
40
|
+
'_id' => { 'day' => { '$dayOfWeek' => '$date' } },
|
41
|
+
'count' => { '$sum' => '$items.quantity' } }
|
42
|
+
},
|
43
|
+
{ '$project' => {
|
44
|
+
'dayOfWeek' => '$_id.day',
|
45
|
+
'numberSold' => '$count',
|
46
|
+
'_id' => 0 }
|
47
|
+
},
|
48
|
+
{ '$sort' => { 'numberSold' => 1 } }
|
49
|
+
])
|
50
|
+
|
51
|
+
# End Aggregation Example 2
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'successfully executes the aggregation' do
|
55
|
+
example_code.to_a
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'Aggregation Example 3 - $unwind, $group, $sum, $dayOfWeek, $multiply, $project, $cond' do
|
60
|
+
|
61
|
+
let(:example_code) do
|
62
|
+
|
63
|
+
# Start Aggregation Example 3
|
64
|
+
|
65
|
+
client[:sales].aggregate(
|
66
|
+
[
|
67
|
+
{ '$unwind' => '$items' },
|
68
|
+
{ '$group' => {
|
69
|
+
'_id' => { 'day' => { '$dayOfWeek' => '$date' } },
|
70
|
+
'items_sold' => { '$sum' => '$items.quantity' },
|
71
|
+
'revenue' => { '$sum' => { '$multiply' => [ '$items.quantity', '$items.price' ] } } }
|
72
|
+
},
|
73
|
+
{ '$project' => { 'day' => '$_id.day',
|
74
|
+
'revenue' => 1,
|
75
|
+
'items_sold' => 1,
|
76
|
+
'discount' => {
|
77
|
+
'$cond' => { 'if' => { '$lte' => ['$revenue', 250]},
|
78
|
+
'then' => 25, 'else' => 0 } } }
|
79
|
+
}
|
80
|
+
])
|
81
|
+
|
82
|
+
# End Aggregation Example 3
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'successfully executes the aggregation' do
|
86
|
+
example_code.to_a
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'Aggregation Example 4 - $lookup, $filter, $match', if: op_msg_enabled? do
|
91
|
+
|
92
|
+
let(:example_code) do
|
93
|
+
|
94
|
+
# Start Aggregation Example 4
|
95
|
+
|
96
|
+
client[:sales].aggregate(
|
97
|
+
[
|
98
|
+
{ '$lookup' => {
|
99
|
+
'from' => 'air_airlines',
|
100
|
+
'let' => { 'constituents' => '$airlines' },
|
101
|
+
'pipeline' => [ { '$match' => { '$expr' =>
|
102
|
+
{ '$in' => ['$name', '$$constituents'] } } }],
|
103
|
+
'as' => 'airlines' }
|
104
|
+
},
|
105
|
+
{ '$project' => { '_id' => 0,
|
106
|
+
'name' => 1,
|
107
|
+
'airlines' => {
|
108
|
+
'$filter' => { 'input' => '$airlines',
|
109
|
+
'as' => 'airline',
|
110
|
+
'cond' => { '$eq' => ['$$airline.country', 'Canada'] } } } }
|
111
|
+
}
|
112
|
+
])
|
113
|
+
|
114
|
+
# End Aggregation Example 4
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'successfully executes the aggregation' do
|
118
|
+
example_code.to_a
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'runCommand Example 1' do
|
123
|
+
|
124
|
+
let(:example_code) do
|
125
|
+
|
126
|
+
# Start runCommand Example 1
|
127
|
+
|
128
|
+
client.database.command(buildInfo: 1)
|
129
|
+
|
130
|
+
# End runCommand Example 1
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'successfully executes the command' do
|
134
|
+
example_code
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'runCommand Example 2' do
|
139
|
+
|
140
|
+
before do
|
141
|
+
client[:restaurants].create
|
142
|
+
end
|
143
|
+
|
144
|
+
after do
|
145
|
+
client[:restaurants].drop
|
146
|
+
end
|
147
|
+
|
148
|
+
let(:example_code) do
|
149
|
+
|
150
|
+
# Start runCommand Example 2
|
151
|
+
|
152
|
+
client.database.command(collStats: 'restaurants')
|
153
|
+
|
154
|
+
# End runCommand Example 2
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'successfully executes the command' do
|
158
|
+
example_code
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'Index Example 1 - build simple ascending index' do
|
163
|
+
|
164
|
+
let(:example_code) do
|
165
|
+
|
166
|
+
# Start Index Example 1
|
167
|
+
|
168
|
+
client[:records].indexes.create_one(score: 1)
|
169
|
+
|
170
|
+
# End Index Example 1
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'successfully executes the command' do
|
174
|
+
example_code
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'Index Example 2 - build multikey index with partial filter expression' do
|
179
|
+
|
180
|
+
let(:example_code) do
|
181
|
+
|
182
|
+
# Start Index Example 2
|
183
|
+
|
184
|
+
client[:records].indexes.create_one({ cuisine: 1, name: 1 },
|
185
|
+
{ partialFilterExpression: { rating: { '$gt' => 5 } } })
|
186
|
+
|
187
|
+
# End Index Example 2
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'successfully executes the command' do
|
191
|
+
example_code
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Error::OperationFailure do
|
4
|
+
|
5
|
+
describe '#code' do
|
6
|
+
subject do
|
7
|
+
described_class.new('not master (10107)', nil,
|
8
|
+
:code => 10107, :code_name => 'NotMaster')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns the code' do
|
12
|
+
expect(subject.code).to eq(10107)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#code_name' do
|
17
|
+
subject do
|
18
|
+
described_class.new('not master (10107)', nil,
|
19
|
+
:code => 10107, :code_name => 'NotMaster')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'returns the code name' do
|
23
|
+
expect(subject.code_name).to eq('NotMaster')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#write_retryable?' do
|
28
|
+
context 'when there is a read retryable message' do
|
29
|
+
let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception', nil) }
|
30
|
+
|
31
|
+
it 'returns false' do
|
32
|
+
expect(error.write_retryable?).to eql(false)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when there is a write retryable message' do
|
37
|
+
let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering', nil) }
|
38
|
+
|
39
|
+
it 'returns true' do
|
40
|
+
expect(error.write_retryable?).to eql(true)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when there is a non-retryable message' do
|
45
|
+
let(:error) { Mongo::Error::OperationFailure.new('something happened', nil) }
|
46
|
+
|
47
|
+
it 'returns false' do
|
48
|
+
expect(error.write_retryable?).to eql(false)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when there is a retryable code' do
|
53
|
+
let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
|
54
|
+
:code => 91, :code_name => 'ShutdownInProgress') }
|
55
|
+
|
56
|
+
it 'returns true' do
|
57
|
+
expect(error.write_retryable?).to eql(true)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when there is a non-retryable code' do
|
62
|
+
let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
|
63
|
+
:code => 43, :code_name => 'SomethingHappened') }
|
64
|
+
|
65
|
+
it 'returns false' do
|
66
|
+
expect(error.write_retryable?).to eql(false)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#change_stream_resumable?' do
|
72
|
+
context 'when there is a network error' do
|
73
|
+
context 'getMore' do
|
74
|
+
let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception',
|
75
|
+
Mongo::Operation::GetMore::Result.new([])) }
|
76
|
+
|
77
|
+
it 'returns true' do
|
78
|
+
expect(error.change_stream_resumable?).to be true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'not getMore' do
|
83
|
+
let(:error) { Mongo::Error::OperationFailure.new('problem: socket exception', nil) }
|
84
|
+
|
85
|
+
it 'returns false' do
|
86
|
+
expect(error.change_stream_resumable?).to be false
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when there is a resumable message' do
|
92
|
+
context 'getMore response' do
|
93
|
+
let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering',
|
94
|
+
Mongo::Operation::GetMore::Result.new([])) }
|
95
|
+
|
96
|
+
it 'returns true' do
|
97
|
+
expect(error.change_stream_resumable?).to eql(true)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'not a getMore response' do
|
102
|
+
let(:error) { Mongo::Error::OperationFailure.new('problem: node is recovering', nil) }
|
103
|
+
|
104
|
+
it 'returns false' do
|
105
|
+
expect(error.change_stream_resumable?).to eql(false)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'when there is a resumable code' do
|
111
|
+
context 'getMore response' do
|
112
|
+
let(:error) { Mongo::Error::OperationFailure.new('no message',
|
113
|
+
Mongo::Operation::GetMore::Result.new([]),
|
114
|
+
:code => 91, :code_name => 'ShutdownInProgress') }
|
115
|
+
|
116
|
+
it 'returns true' do
|
117
|
+
expect(error.change_stream_resumable?).to eql(true)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'not a getMore response' do
|
122
|
+
let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
|
123
|
+
:code => 91, :code_name => 'ShutdownInProgress') }
|
124
|
+
|
125
|
+
it 'returns false' do
|
126
|
+
expect(error.change_stream_resumable?).to eql(false)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'when there is a non-resumable code' do
|
132
|
+
context 'getMore response' do
|
133
|
+
let(:error) { Mongo::Error::OperationFailure.new('no message',
|
134
|
+
Mongo::Operation::GetMore::Result.new([]),
|
135
|
+
:code => 136, :code_name => 'CappedPositionLost') }
|
136
|
+
|
137
|
+
it 'returns false' do
|
138
|
+
expect(error.change_stream_resumable?).to eql(false)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'not a getMore response' do
|
143
|
+
let(:error) { Mongo::Error::OperationFailure.new('no message', nil,
|
144
|
+
:code => 136, :code_name => 'CappedPositionLost') }
|
145
|
+
|
146
|
+
it 'returns false' do
|
147
|
+
expect(error.change_stream_resumable?).to eql(false)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|