lib/runby_pace/distance.rb in runby_pace-0.5.86 vs lib/runby_pace/distance.rb in runby_pace-0.6.87

- old
+ new

@@ -1,46 +1,47 @@ module Runby # Represents a distance (distance UOM and multiplier) class Distance attr_reader :uom, :multiplier def initialize(uom = :km, multiplier = 1) - raise 'Invalid multiplier' unless multiplier.is_a?(Numeric) case uom when Distance return init_from_clone uom + when DistanceUnit + return init_from_distance_unit uom, multiplier when String return init_from_string uom when Symbol - return init_from_symbol(uom, multiplier) + return init_from_symbol uom, multiplier else raise 'Invalid distance unit of measure' end end def meters - kilometers = @multiplier * Runby::DistanceUnits.conversion_factor(@uom) + kilometers = @multiplier * @uom.conversion_factor kilometers * 1000.0 end def self.parse(str) str = str.strip.chomp.downcase multiplier = str.scan(/[\d,.]+/).first.to_f uom = str.scan(/[-_a-z ]+$/).first raise "Unable to find distance unit in '#{str}'" if uom.nil? - parsed_uom = Runby::DistanceUnits.parse uom - raise "'#{uom.strip}' is not recognized as a distance unit" if parsed_uom[:uom].nil? + parsed_uom = Runby::DistanceUnit.parse uom + raise "'#{uom.strip}' is not recognized as a distance unit" if parsed_uom.nil? - self.new parsed_uom[:uom], parsed_uom[:factor] * multiplier + self.new parsed_uom, multiplier end def to_s "#{format('%g', @multiplier.round(2))} #{pluralized_uom}" end def pluralized_uom - uom_description = DistanceUnits.description(@uom).downcase + uom_description = @uom.description.downcase if @multiplier > 1 then uom_description += 's' end uom_description end @@ -50,16 +51,22 @@ def init_from_clone(distance) @uom = distance.uom @multiplier = distance.multiplier end + def init_from_distance_unit(uom, multiplier) + @uom = uom + @multiplier = 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 + def init_from_symbol(distance_uom_symbol, multiplier) + raise "Unknown unit of measure #{distance_uom_symbol}" unless Runby::DistanceUnit.known_uom? distance_uom_symbol + raise 'Invalid multiplier' unless multiplier.is_a?(Numeric) + @uom = DistanceUnit.new distance_uom_symbol @multiplier = multiplier * 1.0 end end end