runby_pace 0.4.79 → 0.4.81
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/runby_pace/distance.rb +64 -0
- data/lib/runby_pace/pace.rb +14 -0
- data/lib/runby_pace/pace_units.rb +47 -7
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NmNmZDQzMjZjOWJmNGEzYWQzMzdkZjVmNDMyMTQ1ZWZkZjk3ZWMxZg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YjYzYTBjZTUwNjc4NGNlMGNlN2EyNWVkNmNjYjM4OWViZmIyYzFiMA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTBhNmVjNjBiMmQyODgxYTliNzQ1YTkzMjEwMmZiNDM4MTFhZmVlYjhhNzBk
|
10
|
+
ODYxY2Y0ODdkNGE2YTcwM2QzOTMwZmMwMDMxZDJlN2MwYjgwOTllZmFkODE4
|
11
|
+
ZGNmYjYzZThiN2Y1NzVhOTk1MGJkNTEzMGJkMjNhMzI5MThiOWQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NGVmYmMzM2EyOTMxY2EyYWY4NjNkZDM0ZGZhZWE5ODgyNjkzMWNiYzQxMDhj
|
14
|
+
ZDViYjRiZGRlZmVjZDA0YzYzZWY4ZTA3NmIzZmRlOGM5YTBjNmEzMTNmZTU2
|
15
|
+
YWYyYTg4ZDE3OTU2NjZlZjFmNmEzYTczMTNlZGIwODI1ZTc3YzA=
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Runby
|
2
|
+
# Represents a distance (distance UOM and multiplier)
|
3
|
+
class Distance
|
4
|
+
attr_reader :uom, :multiplier
|
5
|
+
def initialize(distance_uom = :km, multiplier = 1)
|
6
|
+
# TODO: Test and cleanup
|
7
|
+
if distance_uom.is_a? Distance
|
8
|
+
return init_from_clone distance_uom
|
9
|
+
end
|
10
|
+
|
11
|
+
raise 'Invalid distance unit of measure' unless [String, Symbol].include? distance_uom.class
|
12
|
+
raise 'Invalid multiplier' unless multiplier.is_a?(Numeric)
|
13
|
+
|
14
|
+
if distance_uom.is_a? Symbol
|
15
|
+
raise "Unknown unit of measure #{distance_uom}" unless Runby::PaceUnits.known_uom? distance_uom
|
16
|
+
@uom = distance_uom
|
17
|
+
@multiplier = multiplier * 1.0
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
distance = Distance.parse distance_uom
|
22
|
+
@uom = distance.uom
|
23
|
+
@multiplier = distance.multiplier
|
24
|
+
end
|
25
|
+
|
26
|
+
def meters
|
27
|
+
kilometers = @multiplier * Runby::PaceUnits.distance_conversion_factor(@uom)
|
28
|
+
kilometers * 1000.0
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.parse(str)
|
32
|
+
str = str.strip.chomp.downcase
|
33
|
+
# TODO: handle multipliers with commas/spaces
|
34
|
+
multiplier = str.scan(/[\d,.]+/).first.to_f
|
35
|
+
uom = str.scan(/[-_a-z ]+$/).first
|
36
|
+
# TODO: test V
|
37
|
+
raise "Unable to find distance unit in #{str}" if uom.nil?
|
38
|
+
|
39
|
+
parsed_uom = Runby::PaceUnits.parse_unit_of_measure uom
|
40
|
+
# TODO: test
|
41
|
+
raise "#{uom} is not recognized as a distance unit" if parsed_uom[:uom].nil?
|
42
|
+
|
43
|
+
self.new parsed_uom[:uom], parsed_uom[:factor] * multiplier
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_s
|
47
|
+
"#{format('%g', @multiplier.round(2))} #{pluralized_uom}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def pluralized_uom
|
51
|
+
uom_description = PaceUnits.description(@uom).downcase
|
52
|
+
if @multiplier > 1 then
|
53
|
+
uom_description += 's'
|
54
|
+
end
|
55
|
+
uom_description
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def init_from_clone(distance)
|
60
|
+
@uom = distance.uom
|
61
|
+
@multiplier = distance.multiplier
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Runby
|
2
|
+
# Represents a pace consisting of a distance and a time in which that distance was covered
|
3
|
+
class Pace
|
4
|
+
attr_reader :time, :distance
|
5
|
+
def initialize(time, distance = '1K')
|
6
|
+
@time = Runby::RunbyTime.parse(time)
|
7
|
+
@distance = Runby::Distance.new(distance)
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
"#{time} per #{distance.pluralized_uom}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -3,22 +3,62 @@ module Runby
|
|
3
3
|
# including the human-readable description of each unit
|
4
4
|
# and the factor used to convert it to kilometers.
|
5
5
|
class PaceUnits
|
6
|
-
def self.description(
|
7
|
-
|
6
|
+
def self.description(uom)
|
7
|
+
@@_distance_uom_definition[uom][:description]
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.parse_unit_of_measure(description)
|
11
|
+
description = description.strip.chomp
|
12
|
+
found_uom = nil
|
13
|
+
found_uom_factor = 1
|
14
|
+
@@_distance_uom_definition.each do |uom, details|
|
15
|
+
if details[:synonyms].include? description
|
16
|
+
found_uom = uom
|
17
|
+
break
|
18
|
+
end
|
19
|
+
end
|
20
|
+
if found_uom.nil?
|
21
|
+
# Search the special UOMs
|
22
|
+
@@_distance_uom_definition_special.each_value do |details|
|
23
|
+
if details[:synonyms].include? description
|
24
|
+
found_uom = details[:uom]
|
25
|
+
found_uom_factor = details[:factor]
|
26
|
+
break
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
{ uom: found_uom, factor: found_uom_factor }
|
8
31
|
end
|
9
32
|
|
10
33
|
def self.distance_conversion_factor(units)
|
11
34
|
distance_conversion_factors[units]
|
12
35
|
end
|
13
36
|
|
37
|
+
def self.known_uom?(symbol)
|
38
|
+
# TODO: test
|
39
|
+
@@_distance_uom_definition.has_key?(symbol) || @@_distance_uom_definition_special.has_key?(symbol)
|
40
|
+
end
|
41
|
+
|
14
42
|
### -- Private class methods --
|
15
43
|
|
16
|
-
|
17
|
-
{ km: '
|
18
|
-
|
44
|
+
@@_distance_uom_definition =
|
45
|
+
{ km: { description: 'Kilometer', synonyms: %w(k km kms kilometer kilometers) },
|
46
|
+
m: { description: 'Meter', synonyms: %w(m meter meters) },
|
47
|
+
mi: { description: 'Mile', synonyms: %w(mi mile miles) },
|
48
|
+
ft: { description: 'Feet', synonyms: %w(ft foot feet) }
|
49
|
+
}
|
50
|
+
|
51
|
+
@@_distance_uom_definition_special =
|
52
|
+
{
|
53
|
+
marathon: { description: 'Marathon', uom: :mi, factor: 26.2, synonyms: %w(marathon) }
|
54
|
+
}
|
19
55
|
|
20
|
-
private_class_method
|
21
|
-
|
56
|
+
private_class_method
|
57
|
+
def self.distance_conversion_factors
|
58
|
+
{ km: 1.0,
|
59
|
+
m: 0.001,
|
60
|
+
mi: 1.609344,
|
61
|
+
ft: 0.0003048 }
|
22
62
|
end
|
23
63
|
end
|
24
64
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runby_pace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.81
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ty Walls
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -73,6 +73,8 @@ files:
|
|
73
73
|
- bin/guard
|
74
74
|
- bin/setup
|
75
75
|
- lib/runby_pace.rb
|
76
|
+
- lib/runby_pace/distance.rb
|
77
|
+
- lib/runby_pace/pace.rb
|
76
78
|
- lib/runby_pace/pace_data.rb
|
77
79
|
- lib/runby_pace/pace_range.rb
|
78
80
|
- lib/runby_pace/pace_units.rb
|
@@ -97,7 +99,7 @@ homepage: https://github.com/tygerbytes/runby-pace
|
|
97
99
|
licenses:
|
98
100
|
- MIT
|
99
101
|
metadata:
|
100
|
-
commit-hash:
|
102
|
+
commit-hash: ce69f37e02c05d0a2e6bff809c8bb152e4ec13cf
|
101
103
|
post_install_message:
|
102
104
|
rdoc_options: []
|
103
105
|
require_paths:
|