Sha256: f41a6c3d78138607123f672bfe46962700fff32aa468dcbe90050c618b539644

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

class Measured::Unit
  include Comparable

  def initialize(name, aliases: [], case_sensitive: false, value: nil)
    @name = name.to_s
    @names = ([@name] + aliases.map{|n| n.to_s }).sort

    @case_sensitive = case_sensitive
    @conversion_amount, @conversion_unit = parse_value(value) if value
  end

  attr_reader :name, :names, :case_sensitive, :conversion_amount, :conversion_unit

  def name_eql?(name_to_compare)
    with_case_sensitivity(self.name).include?(with_case_sensitivity(name_to_compare).join)
  end

  def names_include?(name_to_compare)
    with_case_sensitivity(self.names).include?(with_case_sensitivity(name_to_compare).join)
  end

  def add_alias(aliases)
    @names = (@names << aliases).flatten.sort
  end

  def to_s
    if conversion_string
      "#{ @name } (#{ conversion_string })"
    else
      @name
    end
  end

  def inspect
    "#<Measured::Unit: #{ @name } (#{ @names.join(", ") }) #{ conversion_string }>"
  end

  def <=>(other)
    if self.class == other.class
      if other.names != @names
        other.names <=> @names
      else
        other.conversion_amount <=> @conversion_amount
      end
    else
      @name <=> other
    end
  end

  def inverse_conversion_amount
    1 / conversion_amount.to_r
  end

  private

  def with_case_sensitivity(comparison)
    comparison = [comparison].flatten
    case_sensitive ? comparison : comparison.map(&:downcase)
  end

  def conversion_string
    "#{ conversion_amount } #{ conversion_unit }" if @conversion_amount || @conversion_unit
  end

  def parse_value(tokens)
    tokens = tokens.split(" ") if tokens.is_a?(String)
    raise Measured::UnitError, "Cannot parse 'number unit' or [number, unit] formatted tokens from #{ tokens }." unless tokens.size == 2

    tokens[0] = BigDecimal(tokens[0]) unless tokens[0].is_a?(BigDecimal) || tokens[0].is_a?(Rational)

    tokens
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
measured-1.0.0 lib/measured/unit.rb