class Rowling::Client

Constants

CONFIGURATION_KEYS

Public Class Methods

new(args={}) click to toggle source
# File lib/rowling/client.rb, line 6
def initialize(args={})
  CONFIGURATION_KEYS.each do |key|
    send("#{key}=", args[key])
  end
  set_defaults
end

Public Instance Methods

base_template() click to toggle source
# File lib/rowling/client.rb, line 20
def base_template
  template = Addressable::Template.new("http://api.usatoday.com/open/bestsellers/books{/segments*}{?query*}")
end
build_uri(args) click to toggle source
# File lib/rowling/client.rb, line 122
def build_uri(args)
  query = { "api_key" => self.api_key }
  query.merge!(args[:query]) if args[:query]
  base_template.expand({segments: args[:segments], query: query}).to_s
end
check_errors(response) click to toggle source
# File lib/rowling/client.rb, line 128
def check_errors(response)
  if response.code == 503
    raise Rowling::Response503Error
  elsif response.code == 400
    raise Rowling::Response400Error
  elsif response.code == 403
    raise Rowling::Response403Error
  elsif response.code != 200
    raise Rowling::ResponseError, "Request Failed. Code #{response.code}."
  else
    response
  end
end
find_book_by_isbn(isbn) click to toggle source
# File lib/rowling/client.rb, line 55
def find_book_by_isbn(isbn)
  segments = ["titles", isbn]
  if self.raw
    make_request({ segments: segments })
  else
    begin
      book_response = make_request({ segments: segments })
      Rowling::Book.new(book_response["Title"])
    rescue Rowling::Response503Error, Rowling::Response400Error => e
      return nil
    end
  end
end
get_booklists(args={}) click to toggle source
# File lib/rowling/client.rb, line 69
def get_booklists(args={})
  date_segments = [:year, :month, :day].map do |segment|
    args.delete(segment)
  end
  segments = ["booklists"].concat(date_segments.compact)
  response = make_request({ segments: segments, args: args})
  if self.raw
    response
  elsif lists = response["BookLists"]
    lists.map{ |list| BookList.new(list) }
  else
    {}
  end
end
get_categories(args={}) click to toggle source
# File lib/rowling/client.rb, line 29
def get_categories(args={})
  category_response = make_request({segments: "categories", query: args})
  category_response["Categories"]
end
get_classes(args={}) click to toggle source
# File lib/rowling/client.rb, line 24
def get_classes(args={})
  class_response = make_request({segments: "classes", query: args})
  class_response["Classes"]
end
get_dates(args={}) click to toggle source
# File lib/rowling/client.rb, line 34
def get_dates(args={})
  date_response = make_request({segments: "dates", query: args})
  date_response["Dates"]
end
get_detailed_version(book) click to toggle source
# File lib/rowling/client.rb, line 84
def get_detailed_version(book)
  if book.title_api_url
    segments = book.title_api_url
    book_response = make_request({ segments: segments })
    if self.raw
      book_response
    else
      Rowling::Book.new(book_response["Title"])
    end
  else
    raise Rowling::ResponseError "Can't retrieve details for book without title api url set"
  end
end
make_request(args={}, tries=0) click to toggle source
# File lib/rowling/client.rb, line 98
def make_request(args={}, tries=0)
  if self.api_key
    uri = build_uri(args)
    response = HTTParty.get(uri)
    if self.raw
      response
    else
      if tries < self.retries
        begin
          check_errors(response)
        rescue Rowling::Response403Error
          tries += 1
          sleep(1)
          make_request(args, tries)
        end
      else
        check_errors(response)
      end
    end
  else
    raise Rowling::NoAPIKeyError
  end
end
search_books(args={}) click to toggle source
# File lib/rowling/client.rb, line 39
def search_books(args={})
  segments = "titles"
  book_response = make_request({segments: segments, query: args})
  if self.raw
    book_response
  else
    if titles = book_response["Titles"]
      titles.map do |title|
        Rowling::Book.new(title)
      end
    else
      []
    end
  end
end
set_defaults() click to toggle source
# File lib/rowling/client.rb, line 15
def set_defaults
  @raw ||= false
  @retries ||= 0
end