Class: Runby::Distance

Inherits:
Object
  • Object
show all
Defined in:
lib/runby_pace/distance.rb

Overview

Represents a distance (distance UOM and multiplier)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(distance_uom = :km, multiplier = 1) ⇒ Distance

Returns a new instance of Distance.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/runby_pace/distance.rb', line 5

def initialize(distance_uom = :km, multiplier = 1)
  # TODO: Test and cleanup
  if distance_uom.is_a? Distance
    return init_from_clone distance_uom
  end

  raise 'Invalid distance unit of measure' unless [String, Symbol].include? distance_uom.class
  raise 'Invalid multiplier' unless multiplier.is_a?(Numeric)

  if distance_uom.is_a? Symbol
    raise "Unknown unit of measure #{distance_uom}" unless Runby::PaceUnits.known_uom? distance_uom
    @uom = distance_uom
    @multiplier = multiplier * 1.0
    return
  end

  distance = Distance.parse distance_uom
  @uom = distance.uom
  @multiplier = distance.multiplier
end

Instance Attribute Details

#multiplier ⇒ Object (readonly)

Returns the value of attribute multiplier.



4
5
6
# File 'lib/runby_pace/distance.rb', line 4

def multiplier
  @multiplier
end

#uom ⇒ Object (readonly)

Returns the value of attribute uom.



4
5
6
# File 'lib/runby_pace/distance.rb', line 4

def uom
  @uom
end

Class Method Details

.parse(str) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/runby_pace/distance.rb', line 31

def self.parse(str)
  str = str.strip.chomp.downcase
  # TODO: handle multipliers with commas/spaces
  multiplier = str.scan(/[\d,.]+/).first.to_f
  uom = str.scan(/[-_a-z ]+$/).first
  # TODO: test V
  raise "Unable to find distance unit in #{str}" if uom.nil?

  parsed_uom = Runby::PaceUnits.parse_unit_of_measure uom
  # TODO: test
  raise "#{uom} is not recognized as a distance unit" if parsed_uom[:uom].nil?

  self.new parsed_uom[:uom], parsed_uom[:factor] * multiplier
end

Instance Method Details

#meters ⇒ Object



26
27
28
29
# File 'lib/runby_pace/distance.rb', line 26

def meters
  kilometers = @multiplier * Runby::PaceUnits.distance_conversion_factor(@uom)
  kilometers * 1000.0
end

#pluralized_uom ⇒ Object



50
51
52
53
54
55
56
# File 'lib/runby_pace/distance.rb', line 50

def pluralized_uom
  uom_description = PaceUnits.description(@uom).downcase
  if @multiplier > 1 then
    uom_description += 's'
  end
  uom_description
end

#to_s ⇒ Object



46
47
48
# File 'lib/runby_pace/distance.rb', line 46

def to_s
  "#{format('%g', @multiplier.round(2))} #{pluralized_uom}"
end