class BookSearch

Attributes

full_results[R]
selected[R]
url[R]

Public Class Methods

new(args) click to toggle source
# File lib/book_search.rb, line 13
def initialize(args)
  @args = args.dup

  num_results = @args.delete(:num) || 5

  raise ArgumentError unless self.class.searchable_arguments?(@args)

  @args = self.class.format_args(@args)
  @url = self.class.make_url(@args)

  raise NoInternetError unless connected_to_internet?

  response = get_response(@url)
  raise SearchError unless correct_response_code?(response.code)

  @full_results = JSON.parse(response.body)

  num = full_results['totalItems']
  raise NoResults unless num > 0

  @selected = full_results['items'].first(num_results)
  @selected.map! { |res| self.class.format_hash res }

end

Private Class Methods

args() click to toggle source
# File lib/book_search.rb, line 85
def args
  @args
end
format_args(args) click to toggle source
# File lib/book_search.rb, line 69
def format_args(args)
  result = args.map { |k, v| [k,v].map(&:to_s) }.to_h
  result.reject! { |k, v| v.empty? }
  return result.to_h
end
format_hash(hash) click to toggle source
# File lib/book_search.rb, line 81
def format_hash(hash)
  hash['volumeInfo'].merge( { 'id' => hash['id'] } )
end
make_url(args) click to toggle source
# File lib/book_search.rb, line 50
def make_url(args)
  (BASE_API_URL + make_url_arg_list(args)).gsub(/ /, "+")
end
make_url_arg_list(args) click to toggle source
# File lib/book_search.rb, line 54
def make_url_arg_list(args)
  url = ["?q="]

  q = args.delete('search')
  url << q.to_s

  url << args.map do |k,v|
    k = ("in" + k) if %w[title author publisher].include?(k)
    "%s:%s" % [k, v] 
  end

  url.reject!(&:empty?)
  url[0] + url[1, url.length-1].join("+")
end
searchable_arguments?(args) click to toggle source
# File lib/book_search.rb, line 75
def searchable_arguments?(args)
  args.keys.any? do |k| 
    %i[search title author publisher subject isbn lccn oclc].include?(k)
  end
end

Public Instance Methods

[](index) click to toggle source
# File lib/book_search.rb, line 43
def [](index)
  selected[index]
end
each() { |r| ... } click to toggle source
# File lib/book_search.rb, line 38
def each
  return to_enum :each unless block_given?
  selected.each { |r| yield(r) }
end