Class: Runby::DistanceUnit
- Inherits:
-
Object
- Object
- Runby::DistanceUnit
- 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
-
#conversion_factor ⇒ Object
readonly
Returns the value of attribute conversion_factor.
-
#description ⇒ Object
readonly
Returns the value of attribute description.
-
#symbol ⇒ Object
readonly
Returns the value of attribute symbol.
Class Method Summary collapse
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#initialize(unit_of_measure) ⇒ DistanceUnit
constructor
A new instance of DistanceUnit.
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_factor ⇒ Object (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 |
#description ⇒ Object (readonly)
Returns the value of attribute description.
6 7 8 |
# File 'lib/runby_pace/distance_unit.rb', line 6 def description @description end |
#symbol ⇒ Object (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
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, = nil begin uom = parse str rescue StandardError => ex = "#{ex.message}" end { uom: uom, error: } 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 |