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