Class: Measured::Unit

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/measured/unit.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, aliases: [], value: nil, unit_system: nil) ⇒ Unit

Returns a new instance of Unit.



6
7
8
9
10
11
# File 'lib/measured/unit.rb', line 6

def initialize(name, aliases: [], value: nil, unit_system: nil)
  @name = name.to_s.freeze
  @aliases = aliases.map(&:to_s).map(&:freeze).freeze
  @conversion_amount, @conversion_unit = parse_value(value) if value
  @unit_system = unit_system
end

Instance Attribute Details

#aliasesObject (readonly)

Returns the value of attribute aliases.



4
5
6
# File 'lib/measured/unit.rb', line 4

def aliases
  @aliases
end

#conversion_amountObject (readonly)

Returns the value of attribute conversion_amount.



4
5
6
# File 'lib/measured/unit.rb', line 4

def conversion_amount
  @conversion_amount
end

#conversion_unitObject (readonly)

Returns the value of attribute conversion_unit.



4
5
6
# File 'lib/measured/unit.rb', line 4

def conversion_unit
  @conversion_unit
end

#nameObject (readonly)

Returns the value of attribute name.



4
5
6
# File 'lib/measured/unit.rb', line 4

def name
  @name
end

#unit_systemObject (readonly)

Returns the value of attribute unit_system.



4
5
6
# File 'lib/measured/unit.rb', line 4

def unit_system
  @unit_system
end

Instance Method Details

#<=>(other) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/measured/unit.rb', line 43

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

#inspectObject



34
35
36
37
38
39
40
41
# File 'lib/measured/unit.rb', line 34

def inspect
  @inspect ||= begin
    pieces = [name]
    pieces << "(#{aliases.join(", ")})" if aliases.any?
    pieces << conversion_string if conversion_string
    "#<#{self.class.name}: #{pieces.join(" ")}>".freeze
  end
end

#inverse_conversion_amountObject



56
57
58
# File 'lib/measured/unit.rb', line 56

def inverse_conversion_amount
  @inverse_conversion_amount ||= 1 / conversion_amount if conversion_amount
end

#namesObject



22
23
24
# File 'lib/measured/unit.rb', line 22

def names
  @names ||= ([name] + aliases).sort!.freeze
end

#to_sObject



26
27
28
29
30
31
32
# File 'lib/measured/unit.rb', line 26

def to_s
  @to_s ||= if conversion_string
    "#{name} (#{conversion_string})".freeze
  else
    name
  end
end

#with_unit_system(unit_system) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/measured/unit.rb', line 13

def with_unit_system(unit_system)
  self.class.new(
    name,
    aliases: aliases,
    value: conversion_string,
    unit_system: unit_system
  )
end