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

#initialize(case_sensitive: false) ⇒ Conversion

Returns a new instance of Conversion.



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

def initialize(case_sensitive: false)
  @base_unit = nil
  @units = []
  @case_sensitive = case_sensitive
end

Instance Attribute Details

#base_unitObject (readonly)

Returns the value of attribute base_unit.



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

def base_unit
  @base_unit
end

#case_sensitiveObject (readonly)

Returns the value of attribute case_sensitive.



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

def case_sensitive
  @case_sensitive
end

#unitsObject (readonly)

Returns the value of attribute units.



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

def units
  @units
end

Instance Method Details

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



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

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

#conversion_tableObject



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

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

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



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

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: []) ⇒ Object



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

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

#to_unit_name(name) ⇒ Object



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

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

#unit?(name) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#unit_namesObject



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

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

#unit_names_with_aliasesObject



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

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

#unit_or_alias?(name) ⇒ Boolean

Returns:

  • (Boolean)


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

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