module GiantBombApi::CollectionResource

Public Class Methods

extended(base) click to toggle source
# File lib/giant_bomb_api/collection_resource.rb, line 4
def self.extended(base)
  base.extend Resource
end

Public Instance Methods

collection_resource_name(collection_resource_name = nil) click to toggle source
# File lib/giant_bomb_api/collection_resource.rb, line 8
def collection_resource_name(collection_resource_name = nil)
  if collection_resource_name.present?
    self.instance_variable_set("@collection_resource_name", collection_resource_name)
  end
  self.instance_variable_get("@collection_resource_name") || self.resource_name.pluralize
end
each_page(sort: {}, limit: 100, offset: 0, should_rate_limit: false, rate_per_hour: 200) { |response| ... } click to toggle source
# File lib/giant_bomb_api/collection_resource.rb, line 15
def each_page(sort: {}, limit: 100, offset: 0, should_rate_limit: false, rate_per_hour: 200)
  rate_limit(should_rate_limit, rate_per_hour) do
    response = where(sort: sort, limit: limit, offset: offset, tries: 5)
    yield response
    offset += limit
    break unless response.has_more_results?
  end
end
find(id, params = {}) click to toggle source
# File lib/giant_bomb_api/collection_resource.rb, line 24
def find(id, params = {})
  GiantBombApi.client.send_request(Request::Detail.new(resource_name, id, params))
end
where(params = {}) click to toggle source
# File lib/giant_bomb_api/collection_resource.rb, line 28
def where(params = {})
  return GiantBombApi.client.send_request(Request::Collection.new(self)) unless params.present?

  sort = params[:sort]
  limit = params[:limit]
  offset = params[:offset]
  tries ||= (params[:tries] || 0)

  args = {}
  args[:filter] = params.reject {|key,value| %i(sort limit offset tries).include?(key) }
  args[:sort] = sort if sort.present?
  args[:limit] = limit if limit.present?
  args[:offset] = offset if offset.present?

  GiantBombApi.client.send_request(Request::Collection.new(self, args))
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
  if (tries -= 1) > 0
    sleep 5
    retry
  end

  raise e
end

Private Instance Methods

rate_limit(should_rate_limit, rate_per_hour, &block) click to toggle source
# File lib/giant_bomb_api/collection_resource.rb, line 54
def rate_limit(should_rate_limit, rate_per_hour, &block)
  started_at = Time.now
  num_of_requests = 0

  loop do
    t1 = Time.now
    block.call
    num_of_requests += 1
    t2 = Time.now

    if should_rate_limit
      if t2 - started_at >= 1.hour
        started_at = Time.now
        num_of_requests = 0
      end

      request_time = t2 - t1
      time_to_one_hour = (started_at + 1.hour) - t2
      remaining_requests = rate_per_hour - num_of_requests
      min_time_per_request = remaining_requests.zero? ? time_to_one_hour : time_to_one_hour / remaining_requests
      sleep(min_time_per_request - request_time) if request_time < min_time_per_request
    end
  end
end