lib/runby_pace/distance.rb in runby_pace-0.5.85 vs lib/runby_pace/distance.rb in runby_pace-0.5.86
- old
+ new
@@ -1,46 +1,36 @@
module Runby
# Represents a distance (distance UOM and multiplier)
class Distance
attr_reader :uom, :multiplier
- 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
+ def initialize(uom = :km, multiplier = 1)
raise 'Invalid multiplier' unless multiplier.is_a?(Numeric)
-
- if distance_uom.is_a? Symbol
- raise "Unknown unit of measure #{distance_uom}" unless Runby::DistanceUnits.known_uom? distance_uom
- @uom = distance_uom
- @multiplier = multiplier * 1.0
- return
+ case uom
+ when Distance
+ return init_from_clone uom
+ when String
+ return init_from_string uom
+ when Symbol
+ return init_from_symbol(uom, multiplier)
+ else
+ raise 'Invalid distance unit of measure'
end
-
- distance = Distance.parse distance_uom
- @uom = distance.uom
- @multiplier = distance.multiplier
end
def meters
kilometers = @multiplier * Runby::DistanceUnits.conversion_factor(@uom)
kilometers * 1000.0
end
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?
+ raise "Unable to find distance unit in '#{str}'" if uom.nil?
parsed_uom = Runby::DistanceUnits.parse uom
- # TODO: test
- raise "#{uom} is not recognized as a distance unit" if parsed_uom[:uom].nil?
+ raise "'#{uom.strip}' is not recognized as a distance unit" if parsed_uom[:uom].nil?
self.new parsed_uom[:uom], parsed_uom[:factor] * multiplier
end
def to_s
@@ -54,11 +44,22 @@
end
uom_description
end
private
+
def init_from_clone(distance)
@uom = distance.uom
@multiplier = distance.multiplier
+ end
+
+ def init_from_string(string)
+ init_from_clone Distance.parse string
+ end
+
+ def init_from_symbol(distance_uom, multiplier)
+ raise "Unknown unit of measure #{distance_uom}" unless Runby::DistanceUnits.known_uom? distance_uom
+ @uom = distance_uom
+ @multiplier = multiplier * 1.0
end
end
end