triathlon 0.0.7 → 0.0.8
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.
- data/lib/bike.rb +3 -18
- data/lib/converter.rb +15 -0
- data/lib/splits.rb +7 -35
- data/lib/triathlon.rb +2 -1
- data/test/unit/test_bike.rb +0 -4
- data/test/unit/test_converter.rb +10 -0
- data/test/unit/test_splits.rb +8 -13
- metadata +4 -4
data/lib/bike.rb
CHANGED
@@ -1,23 +1,8 @@
|
|
1
1
|
require 'converter'
|
2
|
-
|
3
|
-
class TimePresenter
|
4
|
-
def self.present_hours_as_string(time)
|
5
|
-
hours = time.floor
|
6
|
-
fraction = time - hours
|
7
|
-
minutes = (60.0 * fraction)
|
8
|
-
minutes_string = minutes.floor.to_s
|
9
|
-
minutes_string = "0#{minutes_string}" if minutes < 10.0
|
10
|
-
fraction = minutes - minutes.floor
|
11
|
-
seconds = (60.0 * fraction)
|
12
|
-
seconds_string = seconds.round.to_s
|
13
|
-
seconds_string = "0#{seconds_string}" if seconds < 10.0
|
14
|
-
"#{hours}:#{minutes_string}:#{seconds_string}"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
2
|
+
require 'time_presenter'
|
18
3
|
class Bike
|
19
4
|
attr_accessor :distance, :speed
|
20
|
-
|
5
|
+
include TimePresenter
|
21
6
|
def initialize(distance, speed)
|
22
7
|
self.distance = distance.to_f
|
23
8
|
self.speed = speed.to_f
|
@@ -25,7 +10,7 @@ class Bike
|
|
25
10
|
|
26
11
|
def compute_time
|
27
12
|
time = distance / speed # time in hours
|
28
|
-
|
13
|
+
present_hours_as_string(time)
|
29
14
|
end
|
30
15
|
|
31
16
|
def to_s
|
data/lib/converter.rb
CHANGED
@@ -1,13 +1,28 @@
|
|
1
1
|
class Converter
|
2
2
|
SecondsPerHour = 3600
|
3
3
|
SecondsPerMinute = 60
|
4
|
+
|
4
5
|
def hours_to_seconds(hours)
|
5
6
|
hours * SecondsPerHour
|
6
7
|
end
|
8
|
+
|
7
9
|
def minutes_to_seconds(minutes)
|
8
10
|
minutes * SecondsPerMinute
|
9
11
|
end
|
12
|
+
|
10
13
|
def mps_to_mph(mps)
|
11
14
|
mps * SecondsPerHour
|
12
15
|
end
|
16
|
+
|
17
|
+
def string_to_seconds(time_string)
|
18
|
+
pace_times = time_string.split(':').map{|string| string.to_i}
|
19
|
+
converter = Converter.new
|
20
|
+
if pace_times.size == 3
|
21
|
+
@total_pace_in_seconds = converter.hours_to_seconds(pace_times[0]) + converter.minutes_to_seconds(pace_times[1]) + pace_times[2]
|
22
|
+
elsif pace_times.size == 2
|
23
|
+
@total_pace_in_seconds = converter.minutes_to_seconds(pace_times[0]) + pace_times[1]
|
24
|
+
else
|
25
|
+
@total_pace_in_seconds = pace_times[0]
|
26
|
+
end
|
27
|
+
end
|
13
28
|
end
|
data/lib/splits.rb
CHANGED
@@ -1,27 +1,7 @@
|
|
1
1
|
require 'converter'
|
2
|
-
|
3
|
-
class SplitPresenter
|
4
|
-
def initialize(seconds)
|
5
|
-
@total_seconds = seconds.to_f
|
6
|
-
end
|
7
|
-
|
8
|
-
def to_s
|
9
|
-
if @total_seconds > 3600.0
|
10
|
-
return 'NYI'
|
11
|
-
end
|
12
|
-
|
13
|
-
minutes = (@total_seconds / 60.0).truncate
|
14
|
-
seconds = (@total_seconds - (minutes * 60.0)).round
|
15
|
-
seconds_string = seconds.to_s
|
16
|
-
if seconds < 10
|
17
|
-
seconds_string = "0#{seconds_string}"
|
18
|
-
end
|
19
|
-
return "#{minutes}:#{seconds_string}"
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
2
|
+
require 'time_presenter'
|
24
3
|
class Splits
|
4
|
+
include TimePresenter
|
25
5
|
def initialize(pace)
|
26
6
|
pace_times = pace.split(':').map{|string| string.to_i}
|
27
7
|
converter = Converter.new
|
@@ -33,20 +13,12 @@ class Splits
|
|
33
13
|
@total_pace_in_seconds = pace_times[0]
|
34
14
|
end
|
35
15
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
def get_eight_hundred()
|
42
|
-
return SplitPresenter.new(@total_pace_in_seconds / 2.0)
|
43
|
-
end
|
44
|
-
|
45
|
-
def get_one_hundred()
|
46
|
-
return SplitPresenter.new(@total_pace_in_seconds / 16.0)
|
16
|
+
def split(meters)
|
17
|
+
ratio = meters.to_f / 1600.0
|
18
|
+
split = @total_pace_in_seconds * ratio
|
19
|
+
present_seconds_as_string split
|
47
20
|
end
|
48
|
-
|
49
21
|
def pace
|
50
|
-
|
22
|
+
present_seconds_as_string @total_pace_in_seconds
|
51
23
|
end
|
52
24
|
end
|
data/lib/triathlon.rb
CHANGED
data/test/unit/test_bike.rb
CHANGED
@@ -13,12 +13,8 @@ class TestBike < Test::Unit::TestCase
|
|
13
13
|
bike = Bike.new(distance, speed)
|
14
14
|
assert_in_delta(distance, bike.distance, 0.001)
|
15
15
|
assert_in_delta(speed, bike.speed, 0.001)
|
16
|
-
|
17
|
-
puts bike
|
18
|
-
|
19
16
|
time = bike.compute_time
|
20
17
|
expected_time = "1:04:42"
|
21
|
-
p time
|
22
18
|
assert_equal(expected_time, time)
|
23
19
|
end
|
24
20
|
end
|
data/test/unit/test_converter.rb
CHANGED
@@ -22,4 +22,14 @@ class TestConverter < Test::Unit::TestCase
|
|
22
22
|
expected_mph = 24.5
|
23
23
|
assert_in_delta(expected_mph, mph, 0.001)
|
24
24
|
end
|
25
|
+
|
26
|
+
should 'convert a time string to seconds' do
|
27
|
+
converter = Converter.new
|
28
|
+
seconds = converter.string_to_seconds "1:45"
|
29
|
+
expected_seconds = 105
|
30
|
+
assert expected_seconds == seconds
|
31
|
+
seconds = converter.string_to_seconds "5:44"
|
32
|
+
expected_seconds = 344
|
33
|
+
assert expected_seconds == seconds
|
34
|
+
end
|
25
35
|
end
|
data/test/unit/test_splits.rb
CHANGED
@@ -3,36 +3,31 @@ require 'test_helper'
|
|
3
3
|
require 'splits'
|
4
4
|
|
5
5
|
class TestSplits < Test::Unit::TestCase
|
6
|
-
should 'return split as a string' do
|
7
|
-
split = SplitPresenter.new(430)
|
8
|
-
assert_equal split.to_s, "7:10"
|
9
|
-
end
|
10
|
-
|
11
6
|
should 'compute 400m pace' do
|
12
7
|
splits = Splits.new("10:00")
|
13
|
-
four_hundred = splits.
|
14
|
-
assert_equal four_hundred
|
8
|
+
four_hundred = splits.split 400
|
9
|
+
assert_equal four_hundred, "2:30"
|
15
10
|
end
|
16
11
|
|
17
12
|
should 'compute 800m pace' do
|
18
13
|
splits = Splits.new("6:53")
|
19
|
-
eight_hundred = splits.
|
20
|
-
assert_equal eight_hundred
|
14
|
+
eight_hundred = splits.split 800
|
15
|
+
assert_equal eight_hundred, "3:27"
|
21
16
|
end
|
22
17
|
|
23
18
|
should 'compute 100m pace' do
|
24
19
|
splits = Splits.new("5:00")
|
25
|
-
one_hundred = splits.
|
26
|
-
assert_equal one_hundred
|
20
|
+
one_hundred = splits.split 100
|
21
|
+
assert_equal one_hundred, "0:19"
|
27
22
|
end
|
28
23
|
|
29
24
|
should 'return original pace' do
|
30
25
|
splits = Splits.new("7:15")
|
31
|
-
assert_equal splits.pace
|
26
|
+
assert_equal splits.pace, "7:15"
|
32
27
|
end
|
33
28
|
|
34
29
|
should 'present time with seconds less than ten correctly' do
|
35
30
|
splits = Splits.new("6:16")
|
36
|
-
assert_equal splits.
|
31
|
+
assert_equal splits.split(800), "3:08"
|
37
32
|
end
|
38
33
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: triathlon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Waylon Calabrese
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-13 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|