Class: Runby::DistanceUnit

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

Overview

Represents the distance units (e.g. kilometers, miles) used in paces

including the human-readable description of each unit
and the factor used to convert it to kilometers.

Constant Summary collapse

@@_uom_definitions =
{ km: { description: 'Kilometer', conversion_factor: 1.0, synonyms: %w(k km kms kilometer kilometers) },
  m:  { description: 'Meter', conversion_factor: 0.001, synonyms: %w(m meter meters) },
  mi: { description: 'Mile', conversion_factor: 1.609344, synonyms: %w(mi mile miles) },
  ft: { description: 'Feet', conversion_factor: 0.0003048, synonyms: %w(ft foot feet) },
  yd: { description: 'Yards', conversion_factor: 1093.61, synonyms: %w(y yd yds yard yards) },
  # Fun distance unit of measures
  marathon: { description: 'Marathon', conversion_factor: 42.1648128, synonyms: %w(marathon) }
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(unit_of_measure) ⇒ DistanceUnit

Returns a new instance of DistanceUnit.



8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/runby_pace/distance_unit.rb', line 8

def initialize(unit_of_measure)
  if unit_of_measure.is_a? Symbol
    raise "':#{unit_of_measure.to_s}' is an unknown unit of measure" unless DistanceUnit.known_uom? unit_of_measure
    @symbol = unit_of_measure
    @conversion_factor = @@_uom_definitions[@symbol][:conversion_factor]
  elsif unit_of_measure.is_a? String
    parsed_uom = DistanceUnit.parse(unit_of_measure)
    @symbol = parsed_uom.symbol
    @conversion_factor = @@_uom_definitions[@symbol][:conversion_factor]
  end

  @description = @@_uom_definitions[@symbol][:description]
end

Instance Attribute Details

#conversion_factorObject (readonly)

Returns the value of attribute conversion_factor.



6
7
8
# File 'lib/runby_pace/distance_unit.rb', line 6

def conversion_factor
  @conversion_factor
end

#descriptionObject (readonly)

Returns the value of attribute description.



6
7
8
# File 'lib/runby_pace/distance_unit.rb', line 6

def description
  @description
end

#symbolObject (readonly)

Returns the value of attribute symbol.



6
7
8
# File 'lib/runby_pace/distance_unit.rb', line 6

def symbol
  @symbol
end

Class Method Details

.known_uom?(symbol) ⇒ Boolean

Returns:

  • (Boolean)


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

def self.known_uom?(symbol)
  # TODO: test
  @@_uom_definitions.has_key?(symbol)
end

.parse(description) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/runby_pace/distance_unit.rb', line 22

def self.parse(description)
  description = description.strip.chomp.downcase
  found_uom = nil
  @@_uom_definitions.each do |uom, details|
    if details[:synonyms].include? description
      found_uom = uom
      break
    end
  end
  raise "Error parsing distance unit '#{description}'" unless found_uom
  return DistanceUnit.new found_uom
end

.try_parse(str) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/runby_pace/distance_unit.rb', line 35

def self.try_parse(str)
  uom, error_message = nil
  begin
    uom = parse str
  rescue StandardError => ex
    error_message = "#{ex.message}"
  end
  { uom: uom, error: error_message }
end

Instance Method Details

#==(other) ⇒ Object



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

def ==(other)
  if other.is_a? DistanceUnit
    @symbol == other.symbol
  elsif other.is_a? String
    @symbol == DistanceUnit.parse(other)
  else
    raise "Error comparing DistanceUnit to #{other.class}"
  end
end