Class: Ably::Models::PaginatedResult

Inherits:
Object
  • Object
show all
Includes:
Ably::Modules::AsyncWrapper
Defined in:
lib/ably/models/paginated_result.rb

Overview

Contains a page of results for message or presence history, stats, or REST presence requests. A PaginatedResult response from a REST API paginated query is also accompanied by metadata that indicates the relative queries available to the PaginatedResult object.

Direct Known Subclasses

HttpPaginatedResponse

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(http_response, base_url, client, options = {}) {|Object| ... } ⇒ PaginatedResult

Parameters:

  • http_response (Faraday::Response)

    Initial HTTP response from an Ably request to a paged resource

  • base_url (String)

    Base URL for request that generated the http_response so that subsequent paged requests can be made

  • client (Client)

    Client used to make the request to Ably

  • options (Hash) (defaults to: {})

    Options for this paged resource

Options Hash (options):

  • :coerce_into (Symbol, String)

    symbol or string representing class that should be used to create each item in the PaginatedResult

Yields:

  • (Object)

    block will be called for each resource object for the current page. This is a useful way to apply a transformation to any page resources after they are retrieved



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/ably/models/paginated_result.rb', line 28

def initialize(http_response, base_url, client, options = {}, &each_block)
  @http_response = http_response
  @client        = client
  @base_url      = "#{base_url.gsub(%r{/[^/]*$}, '')}/"
  @coerce_into   = options[:coerce_into]
  @raw_body      = http_response.body
  @each_block    = each_block
  @make_async    = options.fetch(:async_blocking_operations, false)

  @items = http_response.body
  if @items.nil? || @items.to_s.strip.empty?
    @items = []
  end
  @items = [@items] if @items.kind_of?(Hash)

  @items = coerce_items_into(items, @coerce_into) if @coerce_into
  @items = items.map { |item| yield item } if block_given?
end

Instance Attribute Details

#itemsArray (readonly)

Contains the current page of results; for example, an array of Message or Ably::Models::PresenceMessage objects for a channel history request.

Returns:

  • (Array)


16
17
18
# File 'lib/ably/models/paginated_result.rb', line 16

def items
  @items
end

Instance Method Details

#first(&success_callback) ⇒ PaginatedResult, Ably::Util::SafeDeferrable

Returns a new PaginatedResult for the first page of results.



53
54
55
56
57
58
# File 'lib/ably/models/paginated_result.rb', line 53

def first(&success_callback)
  async_wrap_if_realtime(success_callback) do
    return nil unless supports_pagination?
    PaginatedResult.new(client.get(pagination_url('first')), base_url, client, pagination_options, &each_block)
  end
end

#has_next?Boolean

Returns true if there are more pages available by calling next and returns false if this page is the last page available.

Returns:

  • (Boolean)


93
94
95
# File 'lib/ably/models/paginated_result.rb', line 93

def has_next?
  supports_pagination? && !last?
end

#inspectObject



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/ably/models/paginated_result.rb', line 105

def inspect
  <<-EOF.gsub(/^        /, '')
    #<#{self.class.name}:#{self.object_id}
     @base_url="#{base_url}",
     @last?=#{!!last?},
     @has_next?=#{!!has_next?},
     @items=
       #{items.map { |item| item.inspect }.join(",\n           ") }
    >
  EOF
end

#last?Boolean

Returns true if this page is the last page and returns false if there are more pages available by calling next available.

Returns:

  • (Boolean)


82
83
84
85
# File 'lib/ably/models/paginated_result.rb', line 82

def last?
  !supports_pagination? ||
    pagination_header('next').nil?
end

#next(&success_callback) ⇒ PaginatedResult, Ably::Util::SafeDeferrable

Retrieve the next page of results.

When used as part of the Realtime library, it will return a Util::SafeDeferrable object, and allows an optional success callback block to be provided.



69
70
71
72
73
74
# File 'lib/ably/models/paginated_result.rb', line 69

def next(&success_callback)
  async_wrap_if_realtime(success_callback) do
    return nil unless has_next?
    PaginatedResult.new(client.get(pagination_url('next')), base_url, client, pagination_options, &each_block)
  end
end

#supports_pagination?Boolean

True if the HTTP response supports paging with the expected LINK HTTP headers

Returns:

  • (Boolean)


101
102
103
# File 'lib/ably/models/paginated_result.rb', line 101

def supports_pagination?
  !pagination_headers.empty?
end