Sha256: 7da36eb4b6d56f3284ea9d4edddcc451efe7751259622ed6e87e016a4a27084d

Contents?: true

Size: 1.38 KB

Versions: 1

Compression:

Stored size: 1.38 KB

Contents

# frozen_string_literal: true
module Notion
  module Api
    module Pagination
      class Cursor
        include Enumerable

        attr_reader :client
        attr_reader :verb
        attr_reader :sleep_interval
        attr_reader :max_retries
        attr_reader :params

        def initialize(client, verb, params = {})
          @client = client
          @verb = verb
          @params = params.dup
          @sleep_interval = @params.delete(:sleep_interval)
          @max_retries = @params.delete(:max_retries) || client.default_max_retries
        end

        def each
          next_cursor = nil
          retry_count = 0
          loop do
            query = next_cursor.nil? ? params : params.merge(start_cursor: next_cursor)
            begin
              response = client.send(verb, query)
            rescue Notion::Api::Errors::TooManyRequestsError => e
              raise e if retry_count >= max_retries

              client.logger.debug("#{self.class}##{__method__}") { e.to_s }
              retry_count += 1
              sleep(e.retry_after)
              next
            end
            yield response
            break unless response.has_more

            next_cursor = response.next_cursor
            break if next_cursor.nil? || next_cursor == ''

            retry_count = 0
            sleep(sleep_interval) if sleep_interval
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
notion-ruby-client-0.0.4 lib/notion/pagination/cursor.rb