Class: Measured::Conversion

Inherits:
Object
  • Object
show all
Defined in:
lib/measured/conversion.rb

Constant Summary collapse

ARBITRARY_CONVERSION_PRECISION =
20

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConversion

Returns a new instance of Conversion.



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

def initialize
  @base_unit = nil
  @units = []
end

Instance Attribute Details

#base_unitObject (readonly)

Returns the value of attribute base_unit.



8
9
10
# File 'lib/measured/conversion.rb', line 8

def base_unit
  @base_unit
end

#unitsObject (readonly)

Returns the value of attribute units.



8
9
10
# File 'lib/measured/conversion.rb', line 8

def units
  @units
end

Instance Method Details

#add(unit_name, aliases: [], case_sensitive: false, value:) ⇒ Object



14
15
16
# File 'lib/measured/conversion.rb', line 14

def add(unit_name, aliases: [], case_sensitive: false, value:)
  add_new_unit(unit_name, aliases: aliases, case_sensitive: case_sensitive, value: value)
end

#conversion_tableObject



52
53
54
# File 'lib/measured/conversion.rb', line 52

def conversion_table
  @conversion_table ||= Measured::ConversionTable.new(@units).to_h
end

#convert(value, from:, to:) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/measured/conversion.rb', line 40

def convert(value, from:, to:)
  raise Measured::UnitError, "Source unit #{ from } does not exits." unless unit?(from)
  raise Measured::UnitError, "Converted unit #{ to } does not exits." unless unit?(to)

  from_unit = unit_for(from)
  to_unit = unit_for(to)

  raise Measured::UnitError, "Cannot find conversion entry from #{ from } to #{ to }" unless conversion = conversion_table[from][to]

  BigDecimal(value.to_r * conversion,ARBITRARY_CONVERSION_PRECISION)
end

#set_base(unit_name, aliases: [], case_sensitive: false) ⇒ Object



10
11
12
# File 'lib/measured/conversion.rb', line 10

def set_base(unit_name, aliases: [], case_sensitive: false)
  add_new_unit(unit_name, aliases: aliases, case_sensitive: case_sensitive, base: true)
end

#to_unit_name(name) ⇒ Object



36
37
38
# File 'lib/measured/conversion.rb', line 36

def to_unit_name(name)
  unit_for(name).name
end

#unit?(name) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
34
# File 'lib/measured/conversion.rb', line 31

def unit?(name)
  @units.each{|unit| return true if unit.name_eql?(name)}
  false
end

#unit_namesObject



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

def unit_names
  @units.map{|u| u.name}.sort
end

#unit_names_with_aliasesObject



18
19
20
# File 'lib/measured/conversion.rb', line 18

def unit_names_with_aliases
  @units.map{|u| u.names}.flatten.sort
end

#unit_or_alias?(name) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
29
# File 'lib/measured/conversion.rb', line 26

def unit_or_alias?(name)
  @units.each{|unit| return true if unit.names_include?(name)}
  false
end