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