lib/restful_model_collection.rb in nylas-3.1.1 vs lib/restful_model_collection.rb in nylas-3.2.0
- old
+ new
@@ -13,20 +13,14 @@
end
def each
return enum_for(:each) unless block_given?
- offset = 0
- chunk_size = 100
- finished = false
- while (!finished) do
- results = get_model_collection(offset, chunk_size)
- results.each { |item|
+ get_model_collection do |items|
+ items.each do |item|
yield item
- }
- offset += results.length
- finished = results.length < chunk_size
+ end
end
end
def count
RestClient.get(url, params: @filters.merge(view: 'count')) { |response,request,result|
@@ -58,26 +52,13 @@
collection.filters.merge!(filters)
collection
end
def range(offset = 0, limit = 100)
- accumulated = []
- finished = false
- chunk_size = 100
- if limit < chunk_size
- chunk_size = limit
- end
+ accumulated = get_model_collection(offset, limit)
- while (!finished && accumulated.length < limit) do
- results = get_model_collection(offset + accumulated.length, chunk_size)
- accumulated = accumulated.concat(results)
-
- # we're done if we have more than 'limit' items, or if we asked for 50 and got less than 50...
- finished = accumulated.length >= limit || results.length == 0 || (results.length % chunk_size != 0)
- end
-
accumulated = accumulated[0..limit] if limit < Float::INFINITY
accumulated
end
def delete(item_or_id)
@@ -134,23 +115,40 @@
end
}
model
end
- def get_model_collection(offset = 0, limit = 100)
+ def get_model_collection(offset = nil, limit = nil, pagination_options = { per_page: 100 })
filters = @filters.clone
- filters[:offset] = offset
- filters[:limit] = limit
- models = []
+ filters[:offset] = offset || filters[:offset] || 0
+ filters[:limit] = limit || filters[:limit] || 100
- RestClient.get(url, :params => filters){ |response,request,result|
- items = Nylas.interpret_response(result, response, {:expected_class => Array})
- models = inflate_collection(items)
- }
- models
+ accumulated = []
+
+ finished = false
+
+ current_calls_filters = filters.clone
+ while (!finished) do
+ current_calls_filters[:limit] = pagination_options[:per_page] > filters[:limit] ? filters[:limit] : pagination_options[:per_page]
+ RestClient.get(url, :params => current_calls_filters) do |response, request, result|
+ items = Nylas.interpret_response(result, response, { :expected_class => Array })
+ new_items = inflate_collection(items)
+ yield new_items if block_given?
+ accumulated = accumulated.concat(new_items)
+ finished = no_more_pages?(accumulated, items, filters, pagination_options)
+ end
+
+ current_calls_filters[:offset] += pagination_options[:per_page]
+ end
+
+ accumulated
end
+ def no_more_pages?(accumulated, items, filters, pagination_options)
+ accumulated.length >= filters[:limit] || items.length < pagination_options[:per_page]
+ end
end
+
# a ManagementModelCollection is similar to a RestfulModelCollection except
# it's used by models under the /a/<app_id> namespace (mostly account status
# and billing methods).
class ManagementModelCollection < RestfulModelCollection