class Franklin::Search

Constants

JS_VARIABLE

Attributes

library[R]

Public Class Methods

new(library) click to toggle source
# File lib/franklin/search.rb, line 10
def initialize(library)
  @library = library
end

Public Instance Methods

perform(search_term) click to toggle source
# File lib/franklin/search.rb, line 14
def perform(search_term)
  results_page = search_library(search_term)
  results_json = extract_json(page: results_page)
  parse(json: results_json)
end

Private Instance Methods

extract_json(page:) click to toggle source
# File lib/franklin/search.rb, line 34
def extract_json(page:)
  script_tag = page.search("script").find { |script| script.text =~ JS_VARIABLE }
  var_assignment_line = script_tag.text.lines.find { |line| line =~ JS_VARIABLE }
  raw_javascript_object = var_assignment_line.scan(/{.*}/).first
  JSON.parse(raw_javascript_object)
end
parse(json:) click to toggle source
# File lib/franklin/search.rb, line 41
def parse(json:)
  json.each_with_object({}) { |raw, result|
    id, data = raw
    result[parse_item(id: id, data: data)] = parse_availability(data: data)
  }
end
parse_availability(data:) click to toggle source
# File lib/franklin/search.rb, line 52
def parse_availability(data:)
  Availability.new(library, data["ownedCopies"], data["availableCopies"], data["holdsCount"])
end
parse_item(id:, data:) click to toggle source
# File lib/franklin/search.rb, line 48
def parse_item(id:, data:)
  Item.new(id, data["title"], data["firstCreatorName"], data["type"]["name"])
end
prepare_form(search_term) click to toggle source
# File lib/franklin/search.rb, line 28
def prepare_form(search_term)
  ::Mechanize.new.get(library.url).form_with(action: "/search") { |form|
    form.query = search_term
  }
end
search_library(search_term) click to toggle source
# File lib/franklin/search.rb, line 24
def search_library(search_term)
  prepare_form(search_term).submit
end