parsley/lib/unit_conversion/parsed_unit.rb

64 lines
1.3 KiB
Ruby

module UnitConversion
class ParsedUnit
attr_reader :original_unit, :unit
def initialize(str)
@original_unit = str
@unit = normalize_unit_names(str)
end
def to_s
unit.gsub(/[a-z_\[\]]+/) do |match|
if aliases = UNIT_ALIASES[match.to_sym]
aliases.first
else
match
end
end
end
def density?
compatible? 'g/ml'
end
def volume?
compatible? 'ml'
end
def mass?
compatible? 'g'
end
def metric?
METRIC_UNIT_ALIASES.keys.include? unit.to_sym
end
def unitwise(value = 1)
begin
Unitwise(value, unit)
rescue Unitwise::ExpressionError => err
raise UnknownUnitError, err.message
end
end
def compatible?(unit_str)
begin
unitwise.compatible_with? Unitwise(1, unit_str)
rescue UnknownUnitError
false
end
end
def normalize_unit_names(unit_description)
return unit_description.to_s if UNIT_ALIASES.include?(unit_description.to_sym)
# fluid ounce is the only known unit with a space; fix it up before the following replacement
unit_description = unit_description.gsub(/fl oz/i, 'floz')
unit_description.downcase.gsub(/[a-z_\[\]]+/) do |match|
UNIT_ALIAS_MAP[match] || match
end
end
end
end