f1results 0.1.1 → 0.2.pre.alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/bin/f1results +21 -26
- data/lib/f1results/agent.rb +8 -38
- data/lib/f1results/event.rb +63 -10
- data/lib/f1results/result.rb +39 -29
- data/lib/f1results/version.rb +1 -1
- data/test/agent_test.rb +26 -45
- data/test/event_test.rb +30 -0
- data/test/result_test.rb +29 -31
- metadata +47 -31
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c381557affdd5f2d9ce7294b915df1120a78a04f
|
|
4
|
+
data.tar.gz: 067d5b07bae14ce0c051997d0668cf5d69fe85b3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7cec638c906397d24bfdfa57162387c800ad1fa571c83e6944d16feaca4885c5675aaa4f39ab5efde1b0b541265aa39230bd044e8a484a09094eaba2c6af09b1
|
|
7
|
+
data.tar.gz: e844bd99064029f4c3ac02f1c25580462f4726a410df61c5e7e86bc9a1a5d88b95a4a098b978e8b90646ab5bd05647aa57d98fcc07ee3461eace8c91e02f837c
|
data/Rakefile
CHANGED
data/bin/f1results
CHANGED
|
@@ -3,51 +3,46 @@
|
|
|
3
3
|
require 'rubygems'
|
|
4
4
|
require 'optparse'
|
|
5
5
|
require 'terminal-table'
|
|
6
|
-
require 'f1results'
|
|
6
|
+
require File.expand_path('../../lib/f1results.rb', __FILE__)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
year = Time.now.year
|
|
9
|
+
country = ''
|
|
10
|
+
event_type = :race
|
|
9
11
|
|
|
10
12
|
optparse = OptionParser.new do |opts|
|
|
11
|
-
|
|
12
|
-
opts.on('-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
optparse.parse!
|
|
18
|
-
|
|
19
|
-
season = ARGV[0] || Time.now.year
|
|
20
|
-
country = if country = ARGV[1]
|
|
21
|
-
country.to_i == 0 ? country : country.to_i
|
|
22
|
-
else
|
|
23
|
-
:latest
|
|
13
|
+
opts.on('-y', '--year=YEAR', Integer) { |val| year = val }
|
|
14
|
+
opts.on('-c', '--country=COUNTRY', String) { |val| country = val.downcase }
|
|
15
|
+
opts.on('-e', '--event=EVENT', String) { |val| event_type = val.downcase.to_sym }
|
|
16
|
+
opts.parse!
|
|
24
17
|
end
|
|
25
18
|
|
|
26
19
|
begin
|
|
27
|
-
event = F1Results.get(
|
|
20
|
+
event = F1Results.get(year, country, event_type)
|
|
28
21
|
rescue Exception => e
|
|
29
22
|
puts e
|
|
30
23
|
exit
|
|
31
24
|
end
|
|
32
25
|
|
|
33
|
-
title =
|
|
34
|
-
table = Terminal::Table.new :
|
|
26
|
+
title = "#{event.season} #{event.country} #{event.type_name}\n#{event.name}"
|
|
27
|
+
table = Terminal::Table.new title: title, rows: event.to_a
|
|
35
28
|
|
|
36
|
-
if event.
|
|
37
|
-
|
|
29
|
+
if event.practice?
|
|
30
|
+
table.headings = %W(Pos Driver Team Time Laps)
|
|
31
|
+
table.align_column 0, :right
|
|
32
|
+
table.align_column 4, :right
|
|
33
|
+
|
|
34
|
+
elsif event.qualifying?
|
|
35
|
+
table.headings = %W(Pos Driver Team Q1 Q2 Q3 Laps)
|
|
38
36
|
table.align_column 0, :right
|
|
39
37
|
table.align_column 1, :right
|
|
40
|
-
table.align_column
|
|
38
|
+
table.align_column 6, :right
|
|
41
39
|
|
|
42
40
|
elsif event.race?
|
|
43
|
-
|
|
41
|
+
table.headings = %W(Pos Driver Country Team Time/Retired Points)
|
|
44
42
|
table.align_column 0, :right
|
|
45
|
-
table.align_column
|
|
43
|
+
table.align_column 2, :center
|
|
46
44
|
table.align_column 4, :right
|
|
47
45
|
table.align_column 5, :right
|
|
48
|
-
table.align_column 6, :right
|
|
49
|
-
table.align_column 7, :right
|
|
50
46
|
end
|
|
51
47
|
|
|
52
|
-
table.headings = cols
|
|
53
48
|
puts table
|
data/lib/f1results/agent.rb
CHANGED
|
@@ -3,49 +3,19 @@ require 'mechanize'
|
|
|
3
3
|
module F1Results
|
|
4
4
|
class Agent < ::Mechanize
|
|
5
5
|
def get_event(season, country, type)
|
|
6
|
-
event = Event.new(:
|
|
6
|
+
event = Event.new(season: season, country: country, type: type)
|
|
7
|
+
path = "content/fom-website/en/championship/results/#{season}-race-results/#{season}-#{event.country_slug}-results/#{event.type_slug}.html"
|
|
7
8
|
|
|
8
9
|
begin
|
|
9
|
-
get(::File.join(F1Results::BASEURL,
|
|
10
|
-
rescue Mechanize::ResponseCodeError,
|
|
11
|
-
raise
|
|
10
|
+
get(::File.join(F1Results::BASEURL, path))
|
|
11
|
+
rescue Mechanize::ResponseCodeError, Net::HTTPNotFound
|
|
12
|
+
raise 'No results'
|
|
12
13
|
end
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
event.country = country
|
|
17
|
-
page.link_with(:text => event.country)
|
|
18
|
-
when country.is_a?(Integer)
|
|
15
|
+
event.name = page.parser.xpath('//a[contains(@class, "level-0")]').text
|
|
16
|
+
table = page.parser.xpath('//tbody')
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
next_page = page.parser.at_xpath("//tr[not(position()=1)][#{country}]/td[1]/a")
|
|
23
|
-
event.country = next_page.text
|
|
24
|
-
page.link_with(:node => next_page)
|
|
25
|
-
when country == :latest
|
|
26
|
-
|
|
27
|
-
# Get the link to the country in the last row where results are present
|
|
28
|
-
|
|
29
|
-
next_page = page.parser.at_xpath('(//tr/td[3][node()])[last()]/../td[1]/a')
|
|
30
|
-
event.country = next_page.text
|
|
31
|
-
page.link_with(:node => next_page)
|
|
32
|
-
end
|
|
33
|
-
raise "Grand Prix not found: #{season} #{country}" if season_country_link.nil?
|
|
34
|
-
|
|
35
|
-
click(season_country_link)
|
|
36
|
-
event.grand_prix = page.parser.at_xpath('//h2').text
|
|
37
|
-
|
|
38
|
-
results_link = if event.qualifying?
|
|
39
|
-
page.link_with(:text => 'QUALIFYING') || page.link_with(:text => 'SUNDAY QUALIFYING')
|
|
40
|
-
elsif event.race?
|
|
41
|
-
page.link_with(:text => 'RACE', :dom_class => 'L3Selected')
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
raise "No #{event.type} results for: #{season} #{country}" if results_link.nil?
|
|
45
|
-
click(results_link) if event.qualifying?
|
|
46
|
-
table = page.parser.xpath('//table[contains(@class, "raceResults")]')
|
|
47
|
-
|
|
48
|
-
event.parse_results_table(table)
|
|
18
|
+
return event.parse_results_table(table)
|
|
49
19
|
end
|
|
50
20
|
end
|
|
51
21
|
end
|
data/lib/f1results/event.rb
CHANGED
|
@@ -1,14 +1,49 @@
|
|
|
1
|
+
require 'active_support/core_ext/string'
|
|
2
|
+
|
|
1
3
|
module F1Results
|
|
2
4
|
class Event
|
|
3
|
-
attr_accessor :season, :country, :type, :
|
|
5
|
+
attr_accessor :season, :country, :type, :name, :results
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
TYPES = {
|
|
8
|
+
p1: :practice1,
|
|
9
|
+
p2: :practice2,
|
|
10
|
+
p3: :practice3,
|
|
11
|
+
q: :qualifying,
|
|
12
|
+
r: :race
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
def initialize(args = {})
|
|
7
16
|
@results = []
|
|
17
|
+
args.each { |k,v| send("#{k}=", v) }
|
|
8
18
|
end
|
|
9
19
|
|
|
10
20
|
def country
|
|
11
|
-
@country.
|
|
21
|
+
@country.titleize
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def country_slug
|
|
25
|
+
@country.parameterize
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def type=(type)
|
|
29
|
+
if type.to_s.length <= 2
|
|
30
|
+
@type = TYPES[type]
|
|
31
|
+
else
|
|
32
|
+
@type = type
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Human readable type, e.g. "Practice 1", "Qualifying"
|
|
37
|
+
def type_name
|
|
38
|
+
@type.to_s.gsub(/\d/, ' \0').capitalize
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def type_slug
|
|
42
|
+
type_name.parameterize
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def practice?
|
|
46
|
+
@type.to_s.gsub(/\d/, '') == 'practice'
|
|
12
47
|
end
|
|
13
48
|
|
|
14
49
|
def qualifying?
|
|
@@ -32,17 +67,35 @@ module F1Results
|
|
|
32
67
|
end
|
|
33
68
|
|
|
34
69
|
def parse_results_table(table)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
70
|
+
@results = []
|
|
71
|
+
|
|
72
|
+
# Remove driver abbreviation from cell, shown only in race results
|
|
73
|
+
table.xpath('//span[@class="tla"]').each(&:remove)
|
|
74
|
+
|
|
75
|
+
# Turn HTML table into an array of arrays
|
|
76
|
+
data = table.xpath('//tr').map do |row|
|
|
77
|
+
row.xpath('./td').map do |cell|
|
|
78
|
+
cell = cell.text.gsub(/[[:space:]]+/, ' ').strip
|
|
79
|
+
cell.blank? ? nil : cell
|
|
38
80
|
end
|
|
39
81
|
end
|
|
40
82
|
|
|
83
|
+
# Remove rows with empty position cells (Q1 107% Time), and table header if it's there
|
|
84
|
+
data.reject! { |row| row[0].nil? || row[0] == 'P' }
|
|
85
|
+
|
|
41
86
|
data.each_with_index do |row, i|
|
|
42
|
-
klass =
|
|
87
|
+
klass = case
|
|
88
|
+
when practice?
|
|
89
|
+
PracticeResult
|
|
90
|
+
when qualifying?
|
|
91
|
+
QualifyingResult
|
|
92
|
+
when race?
|
|
93
|
+
RaceResult
|
|
94
|
+
end
|
|
95
|
+
|
|
43
96
|
result = klass.new(row)
|
|
44
|
-
result.index = i
|
|
45
|
-
@results << result
|
|
97
|
+
result.index = i
|
|
98
|
+
@results << result
|
|
46
99
|
end
|
|
47
100
|
|
|
48
101
|
self
|
data/lib/f1results/result.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module F1Results
|
|
2
2
|
class Result
|
|
3
|
-
attr_accessor :index, :position, :driver, :
|
|
3
|
+
attr_accessor :index, :position, :driver, :team, :laps
|
|
4
4
|
|
|
5
5
|
def initialize(row = nil)
|
|
6
6
|
build(row) unless row.nil?
|
|
@@ -8,7 +8,7 @@ module F1Results
|
|
|
8
8
|
|
|
9
9
|
def position=(n)
|
|
10
10
|
@position = case
|
|
11
|
-
when n
|
|
11
|
+
when n.to_s.empty?
|
|
12
12
|
nil
|
|
13
13
|
when n.to_i == 0
|
|
14
14
|
n
|
|
@@ -19,24 +19,35 @@ module F1Results
|
|
|
19
19
|
|
|
20
20
|
private
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
def build(row)
|
|
23
|
+
self.position = row[0]
|
|
24
|
+
@driver = row[1]
|
|
25
|
+
row
|
|
26
26
|
end
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class PracticeResult < Result
|
|
30
|
+
attr_accessor :time
|
|
31
|
+
|
|
32
|
+
def to_a
|
|
33
|
+
[position, driver, team, time, laps]
|
|
32
34
|
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def build(row)
|
|
39
|
+
row = super
|
|
40
|
+
@team = row[2]
|
|
41
|
+
@time = row[3]
|
|
42
|
+
@laps = row[4].to_i
|
|
43
|
+
end
|
|
33
44
|
end
|
|
34
45
|
|
|
35
46
|
class QualifyingResult < Result
|
|
36
47
|
attr_accessor :q1, :q2, :q3
|
|
37
48
|
|
|
38
49
|
def to_a
|
|
39
|
-
[position,
|
|
50
|
+
[position, driver, team, q1, q2, q3, laps]
|
|
40
51
|
end
|
|
41
52
|
|
|
42
53
|
def time
|
|
@@ -45,22 +56,21 @@ module F1Results
|
|
|
45
56
|
|
|
46
57
|
private
|
|
47
58
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@q2
|
|
53
|
-
@q3
|
|
54
|
-
@laps = row[
|
|
59
|
+
def build(row)
|
|
60
|
+
row = super
|
|
61
|
+
@team = row[2]
|
|
62
|
+
@q1 = row[3]
|
|
63
|
+
@q2 = row[4]
|
|
64
|
+
@q3 = row[5]
|
|
65
|
+
@laps = row[6].to_i
|
|
55
66
|
end
|
|
56
|
-
end
|
|
57
67
|
end
|
|
58
68
|
|
|
59
69
|
class RaceResult < Result
|
|
60
|
-
attr_accessor :
|
|
70
|
+
attr_accessor :driver_country_abbr, :time, :retired, :points
|
|
61
71
|
|
|
62
72
|
def to_a
|
|
63
|
-
[position,
|
|
73
|
+
[position, driver, driver_country_abbr, team, time_or_retired, points]
|
|
64
74
|
end
|
|
65
75
|
|
|
66
76
|
def time_or_retired=(str)
|
|
@@ -77,12 +87,12 @@ module F1Results
|
|
|
77
87
|
|
|
78
88
|
private
|
|
79
89
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
def build(row)
|
|
91
|
+
row = super
|
|
92
|
+
@driver_country_abbr = row[2]
|
|
93
|
+
@team = row[3]
|
|
94
|
+
self.time_or_retired = row[4]
|
|
95
|
+
@points = row[5].to_i
|
|
96
|
+
end
|
|
87
97
|
end
|
|
88
98
|
end
|
data/lib/f1results/version.rb
CHANGED
data/test/agent_test.rb
CHANGED
|
@@ -1,70 +1,51 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
1
|
require 'test_helper'
|
|
3
2
|
|
|
4
|
-
class AgentTest < MiniTest::
|
|
3
|
+
class AgentTest < MiniTest::Test
|
|
5
4
|
include Fixtures
|
|
6
5
|
|
|
7
6
|
def setup
|
|
8
7
|
@agent = F1Results::Agent.new
|
|
9
8
|
end
|
|
10
9
|
|
|
11
|
-
def
|
|
12
|
-
event = @agent.get_event(
|
|
10
|
+
def test_get_event_2015_australia_race
|
|
11
|
+
event = @agent.get_event(2015, 'Australia', :race)
|
|
13
12
|
assert event.race?
|
|
14
|
-
assert_equal '
|
|
15
|
-
assert_equal '
|
|
16
|
-
assert_equal
|
|
17
|
-
assert_equal '
|
|
18
|
-
assert_equal '
|
|
13
|
+
assert_equal 'Australia', event.country
|
|
14
|
+
assert_equal '2015 FORMULA 1 ROLEX AUSTRALIAN GRAND PRIX', event.name
|
|
15
|
+
assert_equal 17, event.results.length
|
|
16
|
+
assert_equal 'Lewis Hamilton', event.winner
|
|
17
|
+
assert_equal 'Kevin Magnussen', event.loser
|
|
19
18
|
end
|
|
20
19
|
|
|
21
|
-
def
|
|
22
|
-
event = @agent.get_event(
|
|
20
|
+
def test_get_event_2015_australia_qualifying
|
|
21
|
+
event = @agent.get_event(2015, 'Australia', :qualifying)
|
|
23
22
|
assert event.qualifying?
|
|
24
|
-
assert_equal 'Great Britain', event.country
|
|
25
|
-
assert_equal '2012 FORMULA 1 SANTANDER BRITISH GRAND PRIX', event.grand_prix
|
|
26
|
-
assert_equal 24, event.results.size
|
|
27
|
-
assert_equal 'Fernando Alonso', event.winner
|
|
28
|
-
assert_equal 'Charles Pic', event.loser
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def test_get_event_2005_australia_qualifyng
|
|
32
|
-
event = @agent.get_event(2005, 'Australia', :qualifying)
|
|
33
23
|
assert_equal 'Australia', event.country
|
|
34
|
-
assert_equal
|
|
35
|
-
assert_equal 20, event.results.
|
|
36
|
-
assert_equal '
|
|
24
|
+
assert_equal '2015 FORMULA 1 ROLEX AUSTRALIAN GRAND PRIX', event.name
|
|
25
|
+
assert_equal 20, event.results.length
|
|
26
|
+
assert_equal 'Lewis Hamilton', event.winner
|
|
27
|
+
assert_equal 'Roberto Merhi', event.loser
|
|
37
28
|
end
|
|
38
29
|
|
|
39
|
-
def
|
|
40
|
-
event = @agent.get_event(
|
|
41
|
-
|
|
42
|
-
assert_equal '
|
|
43
|
-
assert_equal
|
|
44
|
-
assert_equal
|
|
30
|
+
def test_get_event_2015_australia_practice1
|
|
31
|
+
event = @agent.get_event(2015, 'Australia', :practice1)
|
|
32
|
+
assert event.practice?
|
|
33
|
+
assert_equal 'Australia', event.country
|
|
34
|
+
assert_equal '2015 FORMULA 1 ROLEX AUSTRALIAN GRAND PRIX', event.name
|
|
35
|
+
assert_equal 16, event.results.length
|
|
36
|
+
assert_equal 'Nico Rosberg', event.winner
|
|
37
|
+
assert_equal 'Romain Grosjean', event.loser
|
|
45
38
|
end
|
|
46
39
|
|
|
47
40
|
def test_get_event_with_bad_year
|
|
48
|
-
assert_raises RuntimeError, '
|
|
49
|
-
@agent.get_event(
|
|
41
|
+
assert_raises RuntimeError, 'No results' do
|
|
42
|
+
@agent.get_event(1900, 'Australia', :race)
|
|
50
43
|
end
|
|
51
44
|
end
|
|
52
45
|
|
|
53
46
|
def test_get_event_with_bad_grand_prix
|
|
54
|
-
assert_raises RuntimeError, '
|
|
55
|
-
@agent.get_event(
|
|
47
|
+
assert_raises RuntimeError, 'No results' do
|
|
48
|
+
@agent.get_event(2015, 'New Zealand', :race)
|
|
56
49
|
end
|
|
57
50
|
end
|
|
58
|
-
|
|
59
|
-
def test_get_event_2012_9th
|
|
60
|
-
event = @agent.get_event(2012, 9, :race)
|
|
61
|
-
assert_equal 'Great Britain', event.country
|
|
62
|
-
assert_equal '2012 FORMULA 1 SANTANDER BRITISH GRAND PRIX', event.grand_prix
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def test_get_event_2012_latest
|
|
66
|
-
event = @agent.get_event(2012, :latest, :race)
|
|
67
|
-
assert_equal 'Hungary', event.country
|
|
68
|
-
assert_equal 'FORMULA 1 ENI MAGYAR NAGYDÍJ 2012', event.grand_prix
|
|
69
|
-
end
|
|
70
51
|
end
|
data/test/event_test.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class EventTest < MiniTest::Test
|
|
4
|
+
def setup
|
|
5
|
+
@event = F1Results::Event.new
|
|
6
|
+
@event.results << F1Results::RaceResult.new([1, 'Mark Webber', 'AUS', 'Red Bull Racing-Renault', '1:25:11.288', 2])
|
|
7
|
+
@event.results << F1Results::RaceResult.new([2, 'Fernando Alonso', 'ESP', 'Ferrari', '+3.0 secs', 1])
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_type
|
|
11
|
+
@event.type = :qualifying
|
|
12
|
+
assert_equal 'qualifying', @event.type_slug
|
|
13
|
+
@event.type = :practice3
|
|
14
|
+
assert_equal 'practice-3', @event.type_slug
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_country
|
|
18
|
+
@event.country = 'Australia'
|
|
19
|
+
assert_equal 'Australia', @event.country
|
|
20
|
+
@event.country = 'great britain'
|
|
21
|
+
assert_equal 'Great Britain', @event.country
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_to_array
|
|
25
|
+
array = @event.to_a
|
|
26
|
+
assert_equal 2, array.length
|
|
27
|
+
assert_kind_of Array, array.first
|
|
28
|
+
assert_kind_of F1Results::RaceResult, @event.results.first
|
|
29
|
+
end
|
|
30
|
+
end
|
data/test/result_test.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
1
|
require 'test_helper'
|
|
3
2
|
|
|
4
|
-
class ResultTest < MiniTest::
|
|
3
|
+
class ResultTest < MiniTest::Test
|
|
5
4
|
def test_time
|
|
6
5
|
result = F1Results::RaceResult.new
|
|
7
6
|
result.time_or_retired = '1:25:11.288'
|
|
@@ -30,46 +29,45 @@ class ResultTest < MiniTest::Unit::TestCase
|
|
|
30
29
|
assert_equal '1:46.515', result.time
|
|
31
30
|
end
|
|
32
31
|
|
|
33
|
-
def
|
|
34
|
-
result = F1Results::
|
|
35
|
-
assert_equal
|
|
36
|
-
assert_equal
|
|
37
|
-
assert_equal '
|
|
38
|
-
assert_equal '
|
|
39
|
-
assert_equal
|
|
40
|
-
assert_equal '+10.3 secs', result.time
|
|
41
|
-
assert_equal 6, result.grid
|
|
42
|
-
assert_equal 10, result.points
|
|
32
|
+
def test_parse_practice
|
|
33
|
+
result = F1Results::PracticeResult.new(['4', 'Carlos Sainz', 'Toro Rosso', '1:31.014', '32'])
|
|
34
|
+
assert_equal 4, result.position
|
|
35
|
+
assert_equal 'Carlos Sainz', result.driver
|
|
36
|
+
assert_equal 'Toro Rosso', result.team
|
|
37
|
+
assert_equal '1:31.014', result.time
|
|
38
|
+
assert_equal 32, result.laps
|
|
43
39
|
end
|
|
44
40
|
|
|
45
41
|
def test_parse_qualifying
|
|
46
|
-
result = F1Results::QualifyingResult.new(['
|
|
47
|
-
assert_equal
|
|
48
|
-
assert_equal
|
|
49
|
-
assert_equal '
|
|
42
|
+
result = F1Results::QualifyingResult.new(['2', 'Nico Rosberg', 'Mercedes', '1:28.906', '1:27.097', '1:26.921', '14'])
|
|
43
|
+
assert_equal 2, result.position
|
|
44
|
+
assert_equal 'Nico Rosberg', result.driver
|
|
45
|
+
assert_equal 'Mercedes', result.team
|
|
46
|
+
assert_equal '1:28.906', result.q1
|
|
47
|
+
assert_equal '1:27.097', result.q2
|
|
48
|
+
assert_equal '1:26.921', result.q3
|
|
49
|
+
assert_equal 14, result.laps
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def test_parse_race
|
|
53
|
+
result = F1Results::RaceResult.new(['3', 'Sebastian Vettel', 'GER', 'Ferrari', '+34.523s', '15'])
|
|
54
|
+
assert_equal 3, result.position
|
|
55
|
+
assert_equal 'Sebastian Vettel', result.driver
|
|
50
56
|
assert_equal 'Ferrari', result.team
|
|
51
|
-
assert_equal '
|
|
52
|
-
assert_equal
|
|
53
|
-
assert_equal '1:51.746', result.q3
|
|
54
|
-
assert_equal 25, result.laps
|
|
57
|
+
assert_equal '+34.523s', result.time
|
|
58
|
+
assert_equal 15, result.points
|
|
55
59
|
end
|
|
56
60
|
|
|
57
61
|
def test_parse_qualifying_with_blank_values
|
|
58
|
-
result = F1Results::QualifyingResult.new(['
|
|
59
|
-
assert_equal '1:
|
|
62
|
+
result = F1Results::QualifyingResult.new(['16', 'Marcus Ericsson', 'Sauber', '1:31.376', nil, nil, 10])
|
|
63
|
+
assert_equal '1:31.376', result.q1
|
|
60
64
|
assert_equal nil, result.q2
|
|
61
65
|
assert_equal nil, result.q3
|
|
62
|
-
assert_equal
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def test_parse_with_extra_whitespace
|
|
66
|
-
result = F1Results::RaceResult.new(['14', '17', 'Valtteri Bottas', " \n\nWilliams-Renault ", '57', '+1 Lap', '16', ''])
|
|
67
|
-
assert_equal 'Valtteri Bottas', result.driver
|
|
68
|
-
assert_equal 'Williams-Renault', result.team
|
|
66
|
+
assert_equal 10, result.laps
|
|
69
67
|
end
|
|
70
68
|
|
|
71
69
|
def test_race_to_a
|
|
72
|
-
result = F1Results::RaceResult.new(['
|
|
73
|
-
assert_equal [
|
|
70
|
+
result = F1Results::RaceResult.new(['3', 'Sebastian Vettel', 'GER', 'Ferrari', '+34.523s', '15'])
|
|
71
|
+
assert_equal [3, 'Sebastian Vettel', 'GER', 'Ferrari', '+34.523s', 15], result.to_a
|
|
74
72
|
end
|
|
75
73
|
end
|
metadata
CHANGED
|
@@ -1,85 +1,99 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: f1results
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.pre.alpha.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Darren Jeacocke
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2015-03-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: mechanize
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '2.7'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- -
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '2.7'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: terminal-table
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '1.4'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '1.4'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: activesupport
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '4'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '4'
|
|
41
55
|
- !ruby/object:Gem::Dependency
|
|
42
56
|
name: rake
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
|
44
58
|
requirements:
|
|
45
|
-
- -
|
|
59
|
+
- - "~>"
|
|
46
60
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
61
|
+
version: '10.1'
|
|
48
62
|
type: :development
|
|
49
63
|
prerelease: false
|
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
65
|
requirements:
|
|
52
|
-
- -
|
|
66
|
+
- - "~>"
|
|
53
67
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
68
|
+
version: '10.1'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: minitest
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
58
72
|
requirements:
|
|
59
|
-
- -
|
|
73
|
+
- - "~>"
|
|
60
74
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
75
|
+
version: '5.3'
|
|
62
76
|
type: :development
|
|
63
77
|
prerelease: false
|
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
79
|
requirements:
|
|
66
|
-
- -
|
|
80
|
+
- - "~>"
|
|
67
81
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
82
|
+
version: '5.3'
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
84
|
name: webmock
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
72
86
|
requirements:
|
|
73
|
-
- -
|
|
87
|
+
- - "~>"
|
|
74
88
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
89
|
+
version: '1.17'
|
|
76
90
|
type: :development
|
|
77
91
|
prerelease: false
|
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
93
|
requirements:
|
|
80
|
-
- -
|
|
94
|
+
- - "~>"
|
|
81
95
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
96
|
+
version: '1.17'
|
|
83
97
|
description: Get F1 results from formula1.com
|
|
84
98
|
email: dazonic@me.com
|
|
85
99
|
executables:
|
|
@@ -87,19 +101,21 @@ executables:
|
|
|
87
101
|
extensions: []
|
|
88
102
|
extra_rdoc_files: []
|
|
89
103
|
files:
|
|
104
|
+
- LICENSE
|
|
105
|
+
- README.md
|
|
106
|
+
- Rakefile
|
|
90
107
|
- bin/f1results
|
|
108
|
+
- lib/f1results.rb
|
|
91
109
|
- lib/f1results/agent.rb
|
|
92
110
|
- lib/f1results/event.rb
|
|
93
111
|
- lib/f1results/result.rb
|
|
94
112
|
- lib/f1results/version.rb
|
|
95
|
-
- lib/f1results.rb
|
|
96
113
|
- test/agent_test.rb
|
|
114
|
+
- test/event_test.rb
|
|
97
115
|
- test/result_test.rb
|
|
98
|
-
- Rakefile
|
|
99
|
-
- README.md
|
|
100
|
-
- LICENSE
|
|
101
116
|
homepage: https://github.com/daz/f1results
|
|
102
|
-
licenses:
|
|
117
|
+
licenses:
|
|
118
|
+
- MIT
|
|
103
119
|
metadata: {}
|
|
104
120
|
post_install_message:
|
|
105
121
|
rdoc_options: []
|
|
@@ -107,17 +123,17 @@ require_paths:
|
|
|
107
123
|
- lib
|
|
108
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
109
125
|
requirements:
|
|
110
|
-
- -
|
|
126
|
+
- - ">="
|
|
111
127
|
- !ruby/object:Gem::Version
|
|
112
128
|
version: '0'
|
|
113
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
130
|
requirements:
|
|
115
|
-
- -
|
|
131
|
+
- - ">"
|
|
116
132
|
- !ruby/object:Gem::Version
|
|
117
|
-
version:
|
|
133
|
+
version: 1.3.1
|
|
118
134
|
requirements: []
|
|
119
135
|
rubyforge_project:
|
|
120
|
-
rubygems_version: 2.
|
|
136
|
+
rubygems_version: 2.4.6
|
|
121
137
|
signing_key:
|
|
122
138
|
specification_version: 4
|
|
123
139
|
summary: F1 Results
|