Class: CoreLibrary::PaginatedData

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/apimatic-core/pagination/paginated_data.rb

Overview

Iterator class for handling paginated API responses.

Provides methods to iterate over items and pages, fetch next pages using defined pagination strategies, and access the latest HTTP response and request builder.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_call, paginated_items_converter) ⇒ PaginatedData

Returns a new instance of PaginatedData.

Raises:

  • (ArgumentError)


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/apimatic-core/pagination/paginated_data.rb', line 11

def initialize(api_call, paginated_items_converter)
  raise ArgumentError, 'paginated_items_converter cannot be nil' if paginated_items_converter.nil?

  @api_call = api_call
  @paginated_items_converter = paginated_items_converter
  @initial_request_builder = api_call.request_builder
  @pagination_strategies = @api_call.pagination_strategy_list
  @http_call_context = HttpCallContext.new(
    @api_call.global_configuration.client_configuration.http_callback
  )
  http_client_config = @api_call.global_configuration.client_configuration.clone_with(
    http_callback: @http_call_context
  )
  @global_configuration = @api_call.global_configuration.clone_with(
    client_configuration: http_client_config
  )

  @last_request_builder = nil
  @locked_strategy = nil
  @page_size = 0
end

Instance Attribute Details

#page_sizeObject

Returns the value of attribute page_size.



9
10
11
# File 'lib/apimatic-core/pagination/paginated_data.rb', line 9

def page_size
  @page_size
end

Instance Method Details

#cloneObject

Returns a new independent PaginatedData instance.



88
89
90
91
# File 'lib/apimatic-core/pagination/paginated_data.rb', line 88

def clone
  cloned_api_call = @api_call.clone_with(request_builder: @initial_request_builder)
  PaginatedData.new(cloned_api_call, @paginated_items_converter)
end

#eachObject

Enables iteration over individual items.



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/apimatic-core/pagination/paginated_data.rb', line 44

def each
  return enum_for(:each) unless block_given?

  paginated_data = clone
  current_index = 0
  items = []

  loop do
    if current_index < paginated_data.page_size
      yield items[current_index]
      current_index += 1
    else
      response = paginated_data.fetch_next_page
      break if response.nil?

      items = @paginated_items_converter.call(response.data)
      break if items.nil? || items.empty?

      paginated_data.page_size = items.length
      current_index = 0
    end
  end
end

#last_responseObject

Returns the most recent HTTP response received during pagination.



34
35
36
# File 'lib/apimatic-core/pagination/paginated_data.rb', line 34

def last_response
  @last_request_builder.nil? ? nil : @http_call_context.response
end

#pagesObject

Yields each page of the paginated response.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/apimatic-core/pagination/paginated_data.rb', line 69

def pages
  Enumerator.new do |page|
    paginated_data = clone

    loop do
      response = paginated_data.fetch_next_page
      break if response.nil?

      items = @paginated_items_converter.call(response.data)
      break if items.nil? || items.empty?

      paginated_data.page_size = items.length

      page << response
    end
  end
end

#request_builderObject

Returns the appropriate request builder for the current pagination state.



39
40
41
# File 'lib/apimatic-core/pagination/paginated_data.rb', line 39

def request_builder
  @last_request_builder || @initial_request_builder
end