couchbase 3.4.3-arm64-darwin-20 → 3.4.4-arm64-darwin-20
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 +4 -4
- data/README.md +2 -2
- data/lib/couchbase/cluster.rb +1 -1
- data/lib/couchbase/collection.rb +108 -0
- data/lib/couchbase/collection_options.rb +100 -0
- data/lib/couchbase/errors.rb +5 -0
- data/lib/couchbase/key_value_scan.rb +125 -0
- data/lib/couchbase/libcouchbase.bundle +0 -0
- data/lib/couchbase/options.rb +151 -0
- data/lib/couchbase/scope.rb +1 -1
- data/lib/couchbase/utils/time.rb +14 -1
- data/lib/couchbase/version.rb +1 -1
- metadata +6 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 114c1f905e9873c1e6c8ae96badf29c0c795c9dc653a66584ec41415b5a504c3
         | 
| 4 | 
            +
              data.tar.gz: 7993c632a1513ab6359a91063bc22ce8aaf6402be1353f0fb0f7c2a975f5e57d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8220a5639d0c7b74b2a6376371ef495239178a49f29b836a6f902569c7f0491ab7df09fb6e049639ed7e6aeb21ee9c6fac145208cfff23095cc428cd1b12651b
         | 
| 7 | 
            +
              data.tar.gz: 42c503acdc73e22ad85f346e56e47b7edc0d8b30c5887a5d8b2d2280e8e1edd288f19e09d8c1c294f422a559fb5970d8d6257e292aafb2045260fbd831ae5483
         | 
    
        data/README.md
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            [](https://opensource.org/licenses/Apache-2.0)
         | 
| 4 4 | 
             
            [](https://rubygems.org/gems/couchbase)
         | 
| 5 | 
            -
            [](https://github.com/couchbase/couchbase-ruby-client/commits/ | 
| 5 | 
            +
            [](https://github.com/couchbase/couchbase-ruby-client/commits/main)
         | 
| 6 6 | 
             
            [](https://github.com/couchbase/couchbase-ruby-client/actions?query=workflow%3Alinters)
         | 
| 7 7 |  | 
| 8 8 | 
             
            This repository contains the third generation of the official Couchbase SDK for Ruby (aka. SDKv3)
         | 
| @@ -23,7 +23,7 @@ The library has been tested with MRI 3.0, 3.1 and 3.2. Supported platforms are L | |
| 23 23 | 
             
            Add this line to your application's Gemfile:
         | 
| 24 24 |  | 
| 25 25 | 
             
            ```ruby
         | 
| 26 | 
            -
            gem "couchbase", "3.4. | 
| 26 | 
            +
            gem "couchbase", "3.4.4"
         | 
| 27 27 | 
             
            ```
         | 
| 28 28 |  | 
| 29 29 | 
             
            And then execute:
         | 
    
        data/lib/couchbase/cluster.rb
    CHANGED
    
    | @@ -124,7 +124,7 @@ module Couchbase | |
| 124 124 | 
             
                          metrics.warning_count = resp[:meta][:metrics][:warning_count]
         | 
| 125 125 | 
             
                        end
         | 
| 126 126 | 
             
                      end
         | 
| 127 | 
            -
                       | 
| 127 | 
            +
                      meta.warnings = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
         | 
| 128 128 | 
             
                    end
         | 
| 129 129 | 
             
                    res.instance_variable_set(:@rows, resp[:rows])
         | 
| 130 130 | 
             
                  end
         | 
    
        data/lib/couchbase/collection.rb
    CHANGED
    
    | @@ -15,6 +15,7 @@ | |
| 15 15 | 
             
            require "couchbase/errors"
         | 
| 16 16 | 
             
            require "couchbase/collection_options"
         | 
| 17 17 | 
             
            require "couchbase/binary_collection"
         | 
| 18 | 
            +
            require "couchbase/key_value_scan"
         | 
| 18 19 |  | 
| 19 20 | 
             
            module Couchbase
         | 
| 20 21 | 
             
              # Provides access to all collection APIs
         | 
| @@ -481,11 +482,68 @@ module Couchbase | |
| 481 482 | 
             
                        f.index = field[:index]
         | 
| 482 483 | 
             
                        f.path = field[:path]
         | 
| 483 484 | 
             
                        f.value = field[:value]
         | 
| 485 | 
            +
                        f.error = field[:error]
         | 
| 484 486 | 
             
                      end
         | 
| 485 487 | 
             
                    end
         | 
| 486 488 | 
             
                  end
         | 
| 487 489 | 
             
                end
         | 
| 488 490 |  | 
| 491 | 
            +
                # Performs lookups to document fragments. Reads from the active node and all available replicas and returns the
         | 
| 492 | 
            +
                # first result found
         | 
| 493 | 
            +
                #
         | 
| 494 | 
            +
                # @param [String] id the document id which is used to uniquely identify it.
         | 
| 495 | 
            +
                # @param [Array<LookupInSpec>] specs the list of specifications which describe the types of the lookups to perform
         | 
| 496 | 
            +
                # @param [Options::LookupInAnyReplica] options request customization
         | 
| 497 | 
            +
                #
         | 
| 498 | 
            +
                # @return [LookupInReplicaResult]
         | 
| 499 | 
            +
                #
         | 
| 500 | 
            +
                # @raise [Error::DocumentIrretrievable]
         | 
| 501 | 
            +
                # @raise [Error::Timeout]
         | 
| 502 | 
            +
                # @raise [Error::CouchbaseError]
         | 
| 503 | 
            +
                # @raise [Error::FeatureNotAvailable]
         | 
| 504 | 
            +
                def lookup_in_any_replica(id, specs, options = Options::LookupInAnyReplica::DEFAULT)
         | 
| 505 | 
            +
                  resp = @backend.document_lookup_in_any_replica(
         | 
| 506 | 
            +
                    bucket_name, @scope_name, @name, id,
         | 
| 507 | 
            +
                    specs.map do |s|
         | 
| 508 | 
            +
                      {
         | 
| 509 | 
            +
                        opcode: s.type,
         | 
| 510 | 
            +
                        xattr: s.xattr?,
         | 
| 511 | 
            +
                        path: s.path,
         | 
| 512 | 
            +
                      }
         | 
| 513 | 
            +
                    end, options.to_backend
         | 
| 514 | 
            +
                  )
         | 
| 515 | 
            +
                  extract_lookup_in_replica_result(resp, options)
         | 
| 516 | 
            +
                end
         | 
| 517 | 
            +
             | 
| 518 | 
            +
                # Performs lookups to document fragments. Reads from the active node and all available replicas and returns all of
         | 
| 519 | 
            +
                # the results
         | 
| 520 | 
            +
                #
         | 
| 521 | 
            +
                # @param [String] id the document id which is used to uniquely identify it.
         | 
| 522 | 
            +
                # @param [Array<LookupInSpec>] specs the list of specifications which describe the types of the lookups to perform
         | 
| 523 | 
            +
                # @param [Options::LookupInAllReplicas] options request customization
         | 
| 524 | 
            +
                #
         | 
| 525 | 
            +
                # @return [Array<LookupInReplicaResult>]
         | 
| 526 | 
            +
                #
         | 
| 527 | 
            +
                # @raise [Error::DocumentNotFound]
         | 
| 528 | 
            +
                # @raise [Error::Timeout]
         | 
| 529 | 
            +
                # @raise [Error::CouchbaseError]
         | 
| 530 | 
            +
                # @raise [Error::FeatureNotAvailable]
         | 
| 531 | 
            +
                def lookup_in_all_replicas(id, specs, options = Options::LookupInAllReplicas::DEFAULT)
         | 
| 532 | 
            +
                  resp = @backend.document_lookup_in_all_replicas(
         | 
| 533 | 
            +
                    bucket_name, @scope_name, @name, id,
         | 
| 534 | 
            +
                    specs.map do |s|
         | 
| 535 | 
            +
                      {
         | 
| 536 | 
            +
                        opcode: s.type,
         | 
| 537 | 
            +
                        xattr: s.xattr?,
         | 
| 538 | 
            +
                        path: s.path,
         | 
| 539 | 
            +
                      }
         | 
| 540 | 
            +
                    end, options.to_backend
         | 
| 541 | 
            +
                  )
         | 
| 542 | 
            +
                  resp.map do |entry|
         | 
| 543 | 
            +
                    extract_lookup_in_replica_result(entry, options)
         | 
| 544 | 
            +
                  end
         | 
| 545 | 
            +
                end
         | 
| 546 | 
            +
             | 
| 489 547 | 
             
                # Performs mutations to document fragments
         | 
| 490 548 | 
             
                #
         | 
| 491 549 | 
             
                # @param [String] id the document id which is used to uniquely identify it.
         | 
| @@ -535,6 +593,38 @@ module Couchbase | |
| 535 593 | 
             
                  end
         | 
| 536 594 | 
             
                end
         | 
| 537 595 |  | 
| 596 | 
            +
                # Performs a key-value scan operation on the collection
         | 
| 597 | 
            +
                #
         | 
| 598 | 
            +
                # @api uncommitted
         | 
| 599 | 
            +
                #
         | 
| 600 | 
            +
                # @param [RangeScan, PrefixScan, SamplingScan] scan_type the type of the scan
         | 
| 601 | 
            +
                # @param [Options::Scan] options request customization
         | 
| 602 | 
            +
                #
         | 
| 603 | 
            +
                # @example Get a sample of up to 5 documents from the collection and store their IDs in an array
         | 
| 604 | 
            +
                #   result = collection.scan(SamplingScan.new(5), Options::Scan.new(ids_only: true))
         | 
| 605 | 
            +
                #   ids = result.map { |item| item.id }
         | 
| 606 | 
            +
                #
         | 
| 607 | 
            +
                # @example Get all documents whose ID starts with 'customer_1' and output their content
         | 
| 608 | 
            +
                #   result = collection.scan(PrefixScan.new("customer_1"))
         | 
| 609 | 
            +
                #   result.each { |item| puts item.content }
         | 
| 610 | 
            +
                #
         | 
| 611 | 
            +
                # @example Get all documents with ID between 'customer_1' and 'customer_2', excluding 'customer_2' and output their content
         | 
| 612 | 
            +
                #   result = collection.scan(RangeScan.new(
         | 
| 613 | 
            +
                #     from: ScanTerm.new("customer_1"),
         | 
| 614 | 
            +
                #     to: ScanTerm.new("customer_2", exclusive: true)
         | 
| 615 | 
            +
                #   ))
         | 
| 616 | 
            +
                #   result.each { |item| puts item.content }
         | 
| 617 | 
            +
                #
         | 
| 618 | 
            +
                # @return [ScanResults]
         | 
| 619 | 
            +
                def scan(scan_type, options = Options::Scan::DEFAULT)
         | 
| 620 | 
            +
                  ScanResults.new(
         | 
| 621 | 
            +
                    core_scan_result: @backend.document_scan_create(
         | 
| 622 | 
            +
                      @bucket_name, @scope_name, @name, scan_type.to_backend, options.to_backend
         | 
| 623 | 
            +
                    ),
         | 
| 624 | 
            +
                    transcoder: options.transcoder
         | 
| 625 | 
            +
                  )
         | 
| 626 | 
            +
                end
         | 
| 627 | 
            +
             | 
| 538 628 | 
             
                private
         | 
| 539 629 |  | 
| 540 630 | 
             
                def extract_mutation_token(resp)
         | 
| @@ -548,6 +638,24 @@ module Couchbase | |
| 548 638 | 
             
                  end
         | 
| 549 639 | 
             
                end
         | 
| 550 640 |  | 
| 641 | 
            +
                def extract_lookup_in_replica_result(resp, options)
         | 
| 642 | 
            +
                  LookupInReplicaResult.new do |res|
         | 
| 643 | 
            +
                    res.transcoder = options.transcoder
         | 
| 644 | 
            +
                    res.cas = resp[:cas]
         | 
| 645 | 
            +
                    res.deleted = resp[:deleted]
         | 
| 646 | 
            +
                    res.is_replica = resp[:is_replica]
         | 
| 647 | 
            +
                    res.encoded = resp[:fields].map do |field|
         | 
| 648 | 
            +
                      SubDocumentField.new do |f|
         | 
| 649 | 
            +
                        f.exists = field[:exists]
         | 
| 650 | 
            +
                        f.index = field[:index]
         | 
| 651 | 
            +
                        f.path = field[:path]
         | 
| 652 | 
            +
                        f.value = field[:value]
         | 
| 653 | 
            +
                        f.error = field[:error]
         | 
| 654 | 
            +
                      end
         | 
| 655 | 
            +
                    end
         | 
| 656 | 
            +
                  end
         | 
| 657 | 
            +
                end
         | 
| 658 | 
            +
             | 
| 551 659 | 
             
                # @api private
         | 
| 552 660 | 
             
                # TODO: deprecate in 3.1
         | 
| 553 661 | 
             
                GetOptions = ::Couchbase::Options::Get
         | 
| @@ -15,6 +15,9 @@ | |
| 15 15 | 
             
            require "rubygems/deprecate"
         | 
| 16 16 |  | 
| 17 17 | 
             
            require "couchbase/json_transcoder"
         | 
| 18 | 
            +
            require "couchbase/raw_string_transcoder"
         | 
| 19 | 
            +
            require "couchbase/raw_json_transcoder"
         | 
| 20 | 
            +
            require "couchbase/raw_binary_transcoder"
         | 
| 18 21 | 
             
            require "couchbase/subdoc"
         | 
| 19 22 | 
             
            require "couchbase/mutation_state"
         | 
| 20 23 |  | 
| @@ -164,6 +167,8 @@ module Couchbase | |
| 164 167 | 
             
                  # @return [Object] the decoded
         | 
| 165 168 | 
             
                  def content(path_or_index, transcoder = self.transcoder)
         | 
| 166 169 | 
             
                    field = get_field_at_index(path_or_index)
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                    raise field.error unless field.error.nil?
         | 
| 167 172 | 
             
                    raise Error::PathNotFound, "Path is not found: #{path_or_index}" unless field.exists
         | 
| 168 173 |  | 
| 169 174 | 
             
                    transcoder.decode(field.value, :json)
         | 
| @@ -186,6 +191,8 @@ module Couchbase | |
| 186 191 | 
             
                      end
         | 
| 187 192 | 
             
                    return false unless field
         | 
| 188 193 |  | 
| 194 | 
            +
                    raise field.error unless field.error.nil?
         | 
| 195 | 
            +
             | 
| 189 196 | 
             
                    field.exists
         | 
| 190 197 | 
             
                  end
         | 
| 191 198 |  | 
| @@ -227,6 +234,18 @@ module Couchbase | |
| 227 234 | 
             
                  end
         | 
| 228 235 | 
             
                end
         | 
| 229 236 |  | 
| 237 | 
            +
                class LookupInReplicaResult < LookupInResult
         | 
| 238 | 
            +
                  # @return [Boolean] true if the document was read from a replica node
         | 
| 239 | 
            +
                  attr_accessor :is_replica
         | 
| 240 | 
            +
                  alias replica? is_replica
         | 
| 241 | 
            +
             | 
| 242 | 
            +
                  # @yieldparam [LookupInReplicaResult] self
         | 
| 243 | 
            +
                  def initialize
         | 
| 244 | 
            +
                    super
         | 
| 245 | 
            +
                    yield self if block_given?
         | 
| 246 | 
            +
                  end
         | 
| 247 | 
            +
                end
         | 
| 248 | 
            +
             | 
| 230 249 | 
             
                class MutateInResult < MutationResult
         | 
| 231 250 | 
             
                  # Decodes the content at the given index
         | 
| 232 251 | 
             
                  #
         | 
| @@ -291,10 +310,91 @@ module Couchbase | |
| 291 310 | 
             
                  # @return [String] path
         | 
| 292 311 | 
             
                  attr_accessor :path
         | 
| 293 312 |  | 
| 313 | 
            +
                  # @return [CouchbaseError] error
         | 
| 314 | 
            +
                  attr_accessor :error
         | 
| 315 | 
            +
             | 
| 294 316 | 
             
                  # @yieldparam [SubDocumentField] self
         | 
| 295 317 | 
             
                  def initialize
         | 
| 296 318 | 
             
                    yield self if block_given?
         | 
| 297 319 | 
             
                  end
         | 
| 298 320 | 
             
                end
         | 
| 321 | 
            +
             | 
| 322 | 
            +
                class ScanResult
         | 
| 323 | 
            +
                  # @return [String] identifier of the document
         | 
| 324 | 
            +
                  attr_accessor :id
         | 
| 325 | 
            +
             | 
| 326 | 
            +
                  # @return [Boolean] whether only ids are returned from this scan
         | 
| 327 | 
            +
                  attr_accessor :id_only
         | 
| 328 | 
            +
             | 
| 329 | 
            +
                  # @return [Integer, nil] holds the CAS value of the fetched document
         | 
| 330 | 
            +
                  attr_accessor :cas
         | 
| 331 | 
            +
             | 
| 332 | 
            +
                  # @return [Integer, nil] the expiration if fetched and present
         | 
| 333 | 
            +
                  attr_accessor :expiry
         | 
| 334 | 
            +
             | 
| 335 | 
            +
                  # @return [JsonTranscoder, RawBinaryTranscoder, RawJsonTranscoder, RawStringTranscoder, #decode] The default
         | 
| 336 | 
            +
                  #   transcoder which should be used
         | 
| 337 | 
            +
                  attr_accessor :transcoder
         | 
| 338 | 
            +
             | 
| 339 | 
            +
                  def initialize(id:, id_only:, cas: nil, expiry: nil, encoded: nil, flags: nil, transcoder: JsonTranscoder.new)
         | 
| 340 | 
            +
                    @id = id
         | 
| 341 | 
            +
                    @id_only = id_only
         | 
| 342 | 
            +
                    @cas = cas
         | 
| 343 | 
            +
                    @expiry = expiry
         | 
| 344 | 
            +
                    @encoded = encoded
         | 
| 345 | 
            +
                    @flags = flags
         | 
| 346 | 
            +
                    @transcoder = transcoder
         | 
| 347 | 
            +
             | 
| 348 | 
            +
                    yield self if block_given?
         | 
| 349 | 
            +
                  end
         | 
| 350 | 
            +
             | 
| 351 | 
            +
                  # Decodes the content of the document using given (or default transcoder)
         | 
| 352 | 
            +
                  #
         | 
| 353 | 
            +
                  # @param [JsonTranscoder, RawJsonTranscoder, RawBinaryTranscoder, RawStringTranscoder] transcoder custom transcoder
         | 
| 354 | 
            +
                  #
         | 
| 355 | 
            +
                  # @return [Object, nil]
         | 
| 356 | 
            +
                  def content(transcoder = self.transcoder)
         | 
| 357 | 
            +
                    return nil if @encoded.nil?
         | 
| 358 | 
            +
             | 
| 359 | 
            +
                    transcoder ? transcoder.decode(@encoded, @flags) : @encoded
         | 
| 360 | 
            +
                  end
         | 
| 361 | 
            +
                end
         | 
| 362 | 
            +
             | 
| 363 | 
            +
                class ScanResults
         | 
| 364 | 
            +
                  include Enumerable
         | 
| 365 | 
            +
             | 
| 366 | 
            +
                  def initialize(core_scan_result:, transcoder:)
         | 
| 367 | 
            +
                    @core_scan_result = core_scan_result
         | 
| 368 | 
            +
                    @transcoder = transcoder
         | 
| 369 | 
            +
                  end
         | 
| 370 | 
            +
             | 
| 371 | 
            +
                  def each
         | 
| 372 | 
            +
                    return enum_for(:each) unless block_given?
         | 
| 373 | 
            +
             | 
| 374 | 
            +
                    loop do
         | 
| 375 | 
            +
                      resp = @core_scan_result.next_item
         | 
| 376 | 
            +
             | 
| 377 | 
            +
                      break if resp.nil?
         | 
| 378 | 
            +
             | 
| 379 | 
            +
                      if resp[:id_only]
         | 
| 380 | 
            +
                        yield ScanResult.new(
         | 
| 381 | 
            +
                          id: resp[:id],
         | 
| 382 | 
            +
                          id_only: resp[:id_only],
         | 
| 383 | 
            +
                          transcoder: @transcoder
         | 
| 384 | 
            +
                        )
         | 
| 385 | 
            +
                      else
         | 
| 386 | 
            +
                        yield ScanResult.new(
         | 
| 387 | 
            +
                          id: resp[:id],
         | 
| 388 | 
            +
                          id_only: resp[:id_only],
         | 
| 389 | 
            +
                          cas: resp[:cas],
         | 
| 390 | 
            +
                          expiry: resp[:expiry],
         | 
| 391 | 
            +
                          encoded: resp[:encoded],
         | 
| 392 | 
            +
                          flags: resp[:flags],
         | 
| 393 | 
            +
                          transcoder: @transcoder
         | 
| 394 | 
            +
                        )
         | 
| 395 | 
            +
                      end
         | 
| 396 | 
            +
                    end
         | 
| 397 | 
            +
                  end
         | 
| 398 | 
            +
                end
         | 
| 299 399 | 
             
              end
         | 
| 300 400 | 
             
            end
         | 
    
        data/lib/couchbase/errors.rb
    CHANGED
    
    | @@ -183,6 +183,11 @@ module Couchbase | |
| 183 183 | 
             
                class DurableWriteReCommitInProgress < CouchbaseError
         | 
| 184 184 | 
             
                end
         | 
| 185 185 |  | 
| 186 | 
            +
                # Happens when consistency requirements are specified but the partition uuid of the requirements do not align
         | 
| 187 | 
            +
                # with the server
         | 
| 188 | 
            +
                class MutationTokenOutdated < CouchbaseError
         | 
| 189 | 
            +
                end
         | 
| 190 | 
            +
             | 
| 186 191 | 
             
                # Subdocument exception thrown when a path does not exist in the document. The exact meaning of path existence
         | 
| 187 192 | 
             
                # depends on the operation and inputs.
         | 
| 188 193 | 
             
                class PathNotFound < CouchbaseError
         | 
| @@ -0,0 +1,125 @@ | |
| 1 | 
            +
            #  Copyright 2023. Couchbase, 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 Couchbase
         | 
| 16 | 
            +
              # A scan term used to specify the bounds of a range scan
         | 
| 17 | 
            +
              class ScanTerm
         | 
| 18 | 
            +
                attr_accessor :term # @return [ScanTerm]
         | 
| 19 | 
            +
                attr_accessor :exclusive # @return [Boolean]
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                # Creates an instance of a ScanTerm
         | 
| 22 | 
            +
                #
         | 
| 23 | 
            +
                # @api uncommitted
         | 
| 24 | 
            +
                #
         | 
| 25 | 
            +
                # @param [String] term the key pattern of this term
         | 
| 26 | 
            +
                # @param [Boolean] exclusive specifies if this term is excluded while scanning, the bounds are included by default
         | 
| 27 | 
            +
                def initialize(term, exclusive: false)
         | 
| 28 | 
            +
                  @term = term
         | 
| 29 | 
            +
                  @exclusive = exclusive
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                # @api private
         | 
| 33 | 
            +
                def to_backend
         | 
| 34 | 
            +
                  {
         | 
| 35 | 
            +
                    term: @term,
         | 
| 36 | 
            +
                    exclusive: @exclusive,
         | 
| 37 | 
            +
                  }
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              # A range scan performs a scan on a range of keys
         | 
| 42 | 
            +
              class RangeScan
         | 
| 43 | 
            +
                attr_accessor :from # @return [ScanTerm, nil]
         | 
| 44 | 
            +
                attr_accessor :to # @return [ScanTerm, nil]
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                # Creates an instance of a RangeScan scan type
         | 
| 47 | 
            +
                #
         | 
| 48 | 
            +
                # @api uncommitted
         | 
| 49 | 
            +
                #
         | 
| 50 | 
            +
                # @param [ScanTerm, String, nil] from the lower bound of the range, if set
         | 
| 51 | 
            +
                # @param [ScanTerm, String, nil] to the upper bound of the range, if set
         | 
| 52 | 
            +
                def initialize(from: nil, to: nil)
         | 
| 53 | 
            +
                  @from =
         | 
| 54 | 
            +
                    if from.nil? || from.instance_of?(ScanTerm)
         | 
| 55 | 
            +
                      from
         | 
| 56 | 
            +
                    else
         | 
| 57 | 
            +
                      ScanTerm(from)
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                  @to =
         | 
| 60 | 
            +
                    if to.nil? || to.instance_of?(ScanTerm)
         | 
| 61 | 
            +
                      to
         | 
| 62 | 
            +
                    else
         | 
| 63 | 
            +
                      ScanTerm(to)
         | 
| 64 | 
            +
                    end
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                # @api private
         | 
| 68 | 
            +
                def to_backend
         | 
| 69 | 
            +
                  {
         | 
| 70 | 
            +
                    scan_type: :range,
         | 
| 71 | 
            +
                    from: @from&.to_backend,
         | 
| 72 | 
            +
                    to: @to&.to_backend,
         | 
| 73 | 
            +
                  }
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              # A prefix scan performs a scan that includes all documents whose keys start with the given prefix
         | 
| 78 | 
            +
              class PrefixScan
         | 
| 79 | 
            +
                attr_accessor :prefix # @return [String]
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                # Creates an instance of a PrefixScan scan type
         | 
| 82 | 
            +
                #
         | 
| 83 | 
            +
                # @api uncommitted
         | 
| 84 | 
            +
                #
         | 
| 85 | 
            +
                # @param [String, nil] prefix the prefix all document keys should start with
         | 
| 86 | 
            +
                def initialize(prefix)
         | 
| 87 | 
            +
                  @prefix = prefix
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                # @api private
         | 
| 91 | 
            +
                def to_backend
         | 
| 92 | 
            +
                  {
         | 
| 93 | 
            +
                    scan_type: :prefix,
         | 
| 94 | 
            +
                    prefix: @prefix,
         | 
| 95 | 
            +
                  }
         | 
| 96 | 
            +
                end
         | 
| 97 | 
            +
              end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
              # A sampling scan performs a scan that randomly selects documents up to a configured limit
         | 
| 100 | 
            +
              class SamplingScan
         | 
| 101 | 
            +
                attr_accessor :limit # @return [Integer]
         | 
| 102 | 
            +
                attr_accessor :seed # @return [Integer, nil]
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                # Creates an instance of a SamplingScan scan type
         | 
| 105 | 
            +
                #
         | 
| 106 | 
            +
                # @api uncommitted
         | 
| 107 | 
            +
                #
         | 
| 108 | 
            +
                # @param [Integer] limit the maximum number of documents the sampling scan can return
         | 
| 109 | 
            +
                # @param [Integer, nil] seed the seed used for the random number generator that selects the documents. If not set,
         | 
| 110 | 
            +
                #   a seed is generated at random
         | 
| 111 | 
            +
                def initialize(limit, seed = nil)
         | 
| 112 | 
            +
                  @limit = limit
         | 
| 113 | 
            +
                  @seed = seed
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                # @api private
         | 
| 117 | 
            +
                def to_backend
         | 
| 118 | 
            +
                  {
         | 
| 119 | 
            +
                    scan_type: :sampling,
         | 
| 120 | 
            +
                    limit: @limit,
         | 
| 121 | 
            +
                    seed: @seed,
         | 
| 122 | 
            +
                  }
         | 
| 123 | 
            +
                end
         | 
| 124 | 
            +
              end
         | 
| 125 | 
            +
            end
         | 
| Binary file | 
    
        data/lib/couchbase/options.rb
    CHANGED
    
    | @@ -1026,6 +1026,151 @@ module Couchbase | |
| 1026 1026 | 
             
                  DEFAULT = LookupIn.new.freeze
         | 
| 1027 1027 | 
             
                end
         | 
| 1028 1028 |  | 
| 1029 | 
            +
                # Options for {Collection#lookup_in_any_replica}
         | 
| 1030 | 
            +
                class LookupInAnyReplica < Base
         | 
| 1031 | 
            +
                  attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
         | 
| 1032 | 
            +
             | 
| 1033 | 
            +
                  # Creates an instance of options for {Collection#lookup_in_any_replica}
         | 
| 1034 | 
            +
                  #
         | 
| 1035 | 
            +
                  # @param [JsonTranscoder, #decode(String)] transcoder used for encoding
         | 
| 1036 | 
            +
                  #
         | 
| 1037 | 
            +
                  # @param [Integer, #in_milliseconds, nil] timeout
         | 
| 1038 | 
            +
                  # @param [Proc, nil] retry_strategy the custom retry strategy, if set
         | 
| 1039 | 
            +
                  # @param [Hash, nil] client_context the client context data, if set
         | 
| 1040 | 
            +
                  # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
         | 
| 1041 | 
            +
                  #
         | 
| 1042 | 
            +
                  # @yieldparam [LookupIn] self
         | 
| 1043 | 
            +
                  def initialize(transcoder: JsonTranscoder.new,
         | 
| 1044 | 
            +
                                 timeout: nil,
         | 
| 1045 | 
            +
                                 retry_strategy: nil,
         | 
| 1046 | 
            +
                                 client_context: nil,
         | 
| 1047 | 
            +
                                 parent_span: nil)
         | 
| 1048 | 
            +
                    super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
         | 
| 1049 | 
            +
                    @transcoder = transcoder
         | 
| 1050 | 
            +
                    yield self if block_given?
         | 
| 1051 | 
            +
                  end
         | 
| 1052 | 
            +
             | 
| 1053 | 
            +
                  # @api private
         | 
| 1054 | 
            +
                  def to_backend
         | 
| 1055 | 
            +
                    {
         | 
| 1056 | 
            +
                      timeout: Utils::Time.extract_duration(@timeout),
         | 
| 1057 | 
            +
                    }
         | 
| 1058 | 
            +
                  end
         | 
| 1059 | 
            +
             | 
| 1060 | 
            +
                  # @api private
         | 
| 1061 | 
            +
                  # @return [Boolean]
         | 
| 1062 | 
            +
                  attr_accessor :access_deleted
         | 
| 1063 | 
            +
             | 
| 1064 | 
            +
                  # @api private
         | 
| 1065 | 
            +
                  DEFAULT = LookupInAnyReplica.new.freeze
         | 
| 1066 | 
            +
                end
         | 
| 1067 | 
            +
             | 
| 1068 | 
            +
                # Options for {Collection#lookup_in_all_replicas}
         | 
| 1069 | 
            +
                class LookupInAllReplicas < Base
         | 
| 1070 | 
            +
                  attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
         | 
| 1071 | 
            +
             | 
| 1072 | 
            +
                  # Creates an instance of options for {Collection#lookup_in_all_replicas}
         | 
| 1073 | 
            +
                  #
         | 
| 1074 | 
            +
                  # @param [JsonTranscoder, #decode(String)] transcoder used for encoding
         | 
| 1075 | 
            +
                  #
         | 
| 1076 | 
            +
                  # @param [Integer, #in_milliseconds, nil] timeout
         | 
| 1077 | 
            +
                  # @param [Proc, nil] retry_strategy the custom retry strategy, if set
         | 
| 1078 | 
            +
                  # @param [Hash, nil] client_context the client context data, if set
         | 
| 1079 | 
            +
                  # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
         | 
| 1080 | 
            +
                  #
         | 
| 1081 | 
            +
                  # @yieldparam [LookupInAllReplicas] self
         | 
| 1082 | 
            +
                  def initialize(transcoder: JsonTranscoder.new,
         | 
| 1083 | 
            +
                                 timeout: nil,
         | 
| 1084 | 
            +
                                 retry_strategy: nil,
         | 
| 1085 | 
            +
                                 client_context: nil,
         | 
| 1086 | 
            +
                                 parent_span: nil)
         | 
| 1087 | 
            +
                    super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
         | 
| 1088 | 
            +
                    @transcoder = transcoder
         | 
| 1089 | 
            +
                    yield self if block_given?
         | 
| 1090 | 
            +
                  end
         | 
| 1091 | 
            +
             | 
| 1092 | 
            +
                  # @api private
         | 
| 1093 | 
            +
                  def to_backend
         | 
| 1094 | 
            +
                    {
         | 
| 1095 | 
            +
                      timeout: Utils::Time.extract_duration(@timeout),
         | 
| 1096 | 
            +
                    }
         | 
| 1097 | 
            +
                  end
         | 
| 1098 | 
            +
             | 
| 1099 | 
            +
                  # @api private
         | 
| 1100 | 
            +
                  DEFAULT = LookupInAllReplicas.new.freeze
         | 
| 1101 | 
            +
                end
         | 
| 1102 | 
            +
             | 
| 1103 | 
            +
                # Options for {Collection#scan}
         | 
| 1104 | 
            +
                class Scan < Base
         | 
| 1105 | 
            +
                  attr_accessor :ids_only # @return [Boolean]
         | 
| 1106 | 
            +
                  attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
         | 
| 1107 | 
            +
                  attr_accessor :mutation_state # @return [MutationState, nil]
         | 
| 1108 | 
            +
                  attr_accessor :batch_byte_limit # @return [Integer, nil]
         | 
| 1109 | 
            +
                  attr_accessor :batch_item_limit # @return [Integer, nil]
         | 
| 1110 | 
            +
                  attr_accessor :concurrency # @return [Integer, nil]
         | 
| 1111 | 
            +
             | 
| 1112 | 
            +
                  # Creates an instance of options for {Collection#scan}
         | 
| 1113 | 
            +
                  #
         | 
| 1114 | 
            +
                  # @param [Boolean] ids_only if set to true, the content of the documents is not included in the results
         | 
| 1115 | 
            +
                  # @param [JsonTranscoder, #decode(String)] transcoder used for decoding
         | 
| 1116 | 
            +
                  # @param [MutationState, nil] mutation_state sets the mutation tokens this scan should be consistent with
         | 
| 1117 | 
            +
                  # @param [Integer, nil] batch_byte_limit allows to limit the maximum amount of bytes that are sent from the server
         | 
| 1118 | 
            +
                  #   to the client on each partition batch, defaults to 15,000
         | 
| 1119 | 
            +
                  # @param [Integer, nil] batch_item_limit allows to limit the maximum amount of items that are sent from the server
         | 
| 1120 | 
            +
                  #   to the client on each partition batch, defaults to 50
         | 
| 1121 | 
            +
                  # @param [Integer, nil] concurrency specifies the maximum number of partitions that can be scanned concurrently,
         | 
| 1122 | 
            +
                  #   defaults to 1
         | 
| 1123 | 
            +
                  #
         | 
| 1124 | 
            +
                  # @param [Integer, #in_milliseconds, nil] timeout
         | 
| 1125 | 
            +
                  # @param [Proc, nil] retry_strategy the custom retry strategy, if set
         | 
| 1126 | 
            +
                  # @param [Hash, nil] client_context the client context data, if set
         | 
| 1127 | 
            +
                  # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
         | 
| 1128 | 
            +
                  #
         | 
| 1129 | 
            +
                  # @yieldparam [LookupIn] self
         | 
| 1130 | 
            +
                  def initialize(ids_only: false,
         | 
| 1131 | 
            +
                                 transcoder: JsonTranscoder.new,
         | 
| 1132 | 
            +
                                 mutation_state: nil,
         | 
| 1133 | 
            +
                                 batch_byte_limit: nil,
         | 
| 1134 | 
            +
                                 batch_item_limit: nil,
         | 
| 1135 | 
            +
                                 concurrency: nil,
         | 
| 1136 | 
            +
                                 timeout: nil,
         | 
| 1137 | 
            +
                                 retry_strategy: nil,
         | 
| 1138 | 
            +
                                 client_context: nil,
         | 
| 1139 | 
            +
                                 parent_span: nil)
         | 
| 1140 | 
            +
                    super(timeout: timeout, retry_strategy: retry_strategy, client_context: client_context, parent_span: parent_span)
         | 
| 1141 | 
            +
                    @ids_only = ids_only
         | 
| 1142 | 
            +
                    @transcoder = transcoder
         | 
| 1143 | 
            +
                    @mutation_state = mutation_state
         | 
| 1144 | 
            +
                    @batch_byte_limit = batch_byte_limit
         | 
| 1145 | 
            +
                    @batch_item_limit = batch_item_limit
         | 
| 1146 | 
            +
                    @concurrency = concurrency
         | 
| 1147 | 
            +
                    yield self if block_given?
         | 
| 1148 | 
            +
                  end
         | 
| 1149 | 
            +
             | 
| 1150 | 
            +
                  # Sets the mutation tokens this query should be consistent with
         | 
| 1151 | 
            +
                  #
         | 
| 1152 | 
            +
                  # @note overrides consistency level set by {#scan_consistency=}
         | 
| 1153 | 
            +
                  #
         | 
| 1154 | 
            +
                  # @param [MutationState] mutation_state the mutation state containing the mutation tokens
         | 
| 1155 | 
            +
                  def consistent_with(mutation_state)
         | 
| 1156 | 
            +
                    @mutation_state = mutation_state
         | 
| 1157 | 
            +
                  end
         | 
| 1158 | 
            +
             | 
| 1159 | 
            +
                  # @api private
         | 
| 1160 | 
            +
                  def to_backend
         | 
| 1161 | 
            +
                    {
         | 
| 1162 | 
            +
                      timeout: Utils::Time.extract_duration(@timeout),
         | 
| 1163 | 
            +
                      ids_only: @ids_only,
         | 
| 1164 | 
            +
                      mutation_state: @mutation_state.to_a,
         | 
| 1165 | 
            +
                      batch_byte_limit: @batch_byte_limit,
         | 
| 1166 | 
            +
                      batch_item_limit: @batch_item_limit,
         | 
| 1167 | 
            +
                      concurrency: @concurrency,
         | 
| 1168 | 
            +
                    }
         | 
| 1169 | 
            +
                  end
         | 
| 1170 | 
            +
             | 
| 1171 | 
            +
                  DEFAULT = Scan.new.freeze
         | 
| 1172 | 
            +
                end
         | 
| 1173 | 
            +
             | 
| 1029 1174 | 
             
                # Options for {BinaryCollection#append}
         | 
| 1030 1175 | 
             
                class Append < Base
         | 
| 1031 1176 | 
             
                  attr_accessor :cas # @return [Integer]
         | 
| @@ -1849,6 +1994,7 @@ module Couchbase | |
| 1849 1994 | 
             
                  attr_accessor :profile # @return [Symbol]
         | 
| 1850 1995 | 
             
                  attr_accessor :flex_index # @return [Boolean]
         | 
| 1851 1996 | 
             
                  attr_accessor :preserve_expiry # @return [Boolean]
         | 
| 1997 | 
            +
                  attr_accessor :use_replica # @return [Boolean, nil]
         | 
| 1852 1998 | 
             
                  attr_accessor :scope_qualifier # @return [String]
         | 
| 1853 1999 | 
             
                  attr_accessor :transcoder # @return [JsonTranscoder, #decode(String)]
         | 
| 1854 2000 |  | 
| @@ -1894,6 +2040,8 @@ module Couchbase | |
| 1894 2040 | 
             
                  # @param [Boolean, nil] flex_index Tells the query engine to use a flex index (utilizing the search service)
         | 
| 1895 2041 | 
             
                  # @param [Boolean, nil] preserve_expiry Tells the query engine to preserve expiration values set on any documents
         | 
| 1896 2042 | 
             
                  #   modified by this query.
         | 
| 2043 | 
            +
                  # @param [Boolean, nil] use_replica Specifies that the query engine should use replica nodes for KV fetches if
         | 
| 2044 | 
            +
                  #   the active node is down. If not provided, the server default will be used
         | 
| 1897 2045 | 
             
                  # @param [String, nil] scope_qualifier Associate scope qualifier (also known as +query_context+) with the query.
         | 
| 1898 2046 | 
             
                  #   The qualifier must be in form +{bucket_name}.{scope_name}+ or +default:{bucket_name}.{scope_name}+.
         | 
| 1899 2047 | 
             
                  # @param [JsonTranscoder] transcoder to decode rows
         | 
| @@ -1925,6 +2073,7 @@ module Couchbase | |
| 1925 2073 | 
             
                                 profile: :off,
         | 
| 1926 2074 | 
             
                                 flex_index: nil,
         | 
| 1927 2075 | 
             
                                 preserve_expiry: nil,
         | 
| 2076 | 
            +
                                 use_replica: nil,
         | 
| 1928 2077 | 
             
                                 scope_qualifier: nil,
         | 
| 1929 2078 | 
             
                                 scan_consistency: :not_bounded,
         | 
| 1930 2079 | 
             
                                 mutation_state: nil,
         | 
| @@ -1950,6 +2099,7 @@ module Couchbase | |
| 1950 2099 | 
             
                    @profile = profile
         | 
| 1951 2100 | 
             
                    @flex_index = flex_index
         | 
| 1952 2101 | 
             
                    @preserve_expiry = preserve_expiry
         | 
| 2102 | 
            +
                    @use_replica = use_replica
         | 
| 1953 2103 | 
             
                    @scope_qualifier = scope_qualifier
         | 
| 1954 2104 | 
             
                    @scan_consistency = scan_consistency
         | 
| 1955 2105 | 
             
                    @mutation_state = mutation_state
         | 
| @@ -2043,6 +2193,7 @@ module Couchbase | |
| 2043 2193 | 
             
                      readonly: @readonly,
         | 
| 2044 2194 | 
             
                      flex_index: @flex_index,
         | 
| 2045 2195 | 
             
                      preserve_expiry: @preserve_expiry,
         | 
| 2196 | 
            +
                      use_replica: @use_replica,
         | 
| 2046 2197 | 
             
                      scan_wait: Utils::Time.extract_duration(@scan_wait),
         | 
| 2047 2198 | 
             
                      scan_cap: @scan_cap,
         | 
| 2048 2199 | 
             
                      pipeline_batch: @pipeline_batch,
         | 
    
        data/lib/couchbase/scope.rb
    CHANGED
    
    | @@ -79,7 +79,7 @@ module Couchbase | |
| 79 79 | 
             
                          metrics.warning_count = resp[:meta][:metrics][:warning_count]
         | 
| 80 80 | 
             
                        end
         | 
| 81 81 | 
             
                      end
         | 
| 82 | 
            -
                       | 
| 82 | 
            +
                      meta.warnings = resp[:warnings].map { |warn| Cluster::QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
         | 
| 83 83 | 
             
                    end
         | 
| 84 84 | 
             
                    res.instance_variable_set(:@rows, resp[:rows])
         | 
| 85 85 | 
             
                  end
         | 
    
        data/lib/couchbase/utils/time.rb
    CHANGED
    
    | @@ -48,8 +48,21 @@ module Couchbase | |
| 48 48 | 
             
                    end
         | 
| 49 49 | 
             
                  end
         | 
| 50 50 |  | 
| 51 | 
            +
                  # This method converts its argument to milliseconds
         | 
| 52 | 
            +
                  #
         | 
| 53 | 
            +
                  # 1. Integer values are interpreted as a number of milliseconds
         | 
| 54 | 
            +
                  # 2. If the argument is a Duration-like object and responds to #in_milliseconds,
         | 
| 55 | 
            +
                  #    then use it and convert result to Integer
         | 
| 56 | 
            +
                  # 3. Otherwise invoke #to_i on the argument and interpret it as a number of milliseconds
         | 
| 51 57 | 
             
                  def extract_duration(number_or_duration)
         | 
| 52 | 
            -
                     | 
| 58 | 
            +
                    return unless number_or_duration
         | 
| 59 | 
            +
                    return number_or_duration if number_or_duration.class == Integer # rubocop:disable Style/ClassEqualityComparison avoid overrides of #is_a?, #kind_of?
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    if number_or_duration.respond_to?(:in_milliseconds)
         | 
| 62 | 
            +
                      number_or_duration.public_send(:in_milliseconds)
         | 
| 63 | 
            +
                    else
         | 
| 64 | 
            +
                      number_or_duration
         | 
| 65 | 
            +
                    end.to_i
         | 
| 53 66 | 
             
                  end
         | 
| 54 67 | 
             
                end
         | 
| 55 68 | 
             
              end
         | 
    
        data/lib/couchbase/version.rb
    CHANGED
    
    | @@ -19,5 +19,5 @@ module Couchbase | |
| 19 19 | 
             
              #   $ ruby -rcouchbase -e 'pp Couchbase::VERSION'
         | 
| 20 20 | 
             
              #   {:sdk=>"3.4.0", :ruby_abi=>"3.1.0", :revision=>"416fe68e6029ec8a4c40611cf6e6b30d3b90d20f"}
         | 
| 21 21 | 
             
              VERSION = {} unless defined?(VERSION) # rubocop:disable Style/MutableConstant
         | 
| 22 | 
            -
              VERSION.update(:sdk => "3.4. | 
| 22 | 
            +
              VERSION.update(:sdk => "3.4.4".freeze)
         | 
| 23 23 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: couchbase
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.4. | 
| 4 | 
            +
              version: 3.4.4
         | 
| 5 5 | 
             
            platform: arm64-darwin-20
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Sergey Avseyev
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023- | 
| 11 | 
            +
            date: 2023-08-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: Modern SDK for Couchbase Server
         | 
| 14 14 | 
             
            email:
         | 
| @@ -41,6 +41,7 @@ files: | |
| 41 41 | 
             
            - lib/couchbase/diagnostics.rb
         | 
| 42 42 | 
             
            - lib/couchbase/errors.rb
         | 
| 43 43 | 
             
            - lib/couchbase/json_transcoder.rb
         | 
| 44 | 
            +
            - lib/couchbase/key_value_scan.rb
         | 
| 44 45 | 
             
            - lib/couchbase/libcouchbase.bundle
         | 
| 45 46 | 
             
            - lib/couchbase/logger.rb
         | 
| 46 47 | 
             
            - lib/couchbase/management.rb
         | 
| @@ -77,9 +78,9 @@ metadata: | |
| 77 78 | 
             
              homepage_uri: https://docs.couchbase.com/ruby-sdk/current/hello-world/start-using-sdk.html
         | 
| 78 79 | 
             
              bug_tracker_uri: https://couchbase.com/issues/browse/RCBC
         | 
| 79 80 | 
             
              mailing_list_uri: https://forums.couchbase.com/c/ruby-sdk
         | 
| 80 | 
            -
              source_code_uri: https://github.com/couchbase/couchbase-ruby-client/tree/3.4. | 
| 81 | 
            -
              changelog_uri: https://github.com/couchbase/couchbase-ruby-client/releases/tag/3.4. | 
| 82 | 
            -
              documentation_uri: https://docs.couchbase.com/sdk-api/couchbase-ruby-client-3.4. | 
| 81 | 
            +
              source_code_uri: https://github.com/couchbase/couchbase-ruby-client/tree/3.4.4
         | 
| 82 | 
            +
              changelog_uri: https://github.com/couchbase/couchbase-ruby-client/releases/tag/3.4.4
         | 
| 83 | 
            +
              documentation_uri: https://docs.couchbase.com/sdk-api/couchbase-ruby-client-3.4.4/index.html
         | 
| 83 84 | 
             
              github_repo: ssh://github.com/couchbase/couchbase-ruby-client
         | 
| 84 85 | 
             
              rubygems_mfa_required: 'true'
         | 
| 85 86 | 
             
            post_install_message:
         |