class F1Results::Parser
Public Class Methods
new(page)
click to toggle source
# File lib/f1results/parser.rb, line 3 def initialize(page) @page = page @event = Event.new end
Public Instance Methods
parse()
click to toggle source
# File lib/f1results/parser.rb, line 8 def parse @event.name = event_name @event.type = event_type @event.country = event_country @event.results = event_results # TODO: date return @event end
Private Instance Methods
event_country()
click to toggle source
# File lib/f1results/parser.rb, line 38 def event_country node = @page.parser.at_xpath('//select[@name="meetingKey"]/option[@selected]') slug = node.attr('value').split('/')[-1] text = node.text return text end
event_name()
click to toggle source
# File lib/f1results/parser.rb, line 19 def event_name # TODO: make helper method for .gsub(/[[:space:]]+/, ' ').strip return @page.parser.xpath('//title').text .gsub(/[[:space:]]+/, ' ').strip end
event_results()
click to toggle source
# File lib/f1results/parser.rb, line 45 def event_results results = [] table = @page.parser.xpath('//tbody') # Remove driver abbreviation from driver cell table.xpath('//span[@class="uppercase hide-for-desktop"]').each(&:remove) # Turn HTML table into an array of arrays data = table.xpath('//tr').map do |row| row.xpath('./td|./th').map do |cell| cell = cell.text.gsub(/[[:space:]]+/, ' ').strip cell.blank? ? nil : cell end end # Shift top row of table and convert cell text into symbols header = data.shift.map do |cell| cell.to_s.parameterize('_').to_sym end # Set result class type result_class = case when @event.practice? PracticeResult when @event.qualifying? QualifyingResult else RaceResult end # Make each table row a Result data.each_with_index do |row, i| hash = Hash[header.zip(row)] hash[:position] = i + 1 result = result_class.new(hash) results << result end return results end
event_type()
click to toggle source
# File lib/f1results/parser.rb, line 25 def event_type if match = @event.name.match(/(?:.+) - (.+)/) result_title = match[1] .gsub(/(?<=RACE )RESULT/, '') .gsub(/OVERALL(?= QUALIFYING)/, '') .gsub(/(?<=PRACTICE)( )(?=[1|2|3])/, '') .parameterize('_') return result_title.to_sym else return nil end end