Class: Measured::UnitSystem
- Inherits:
-
Object
- Object
- Measured::UnitSystem
- Defined in:
- lib/measured/unit_system.rb
Instance Attribute Summary collapse
-
#unit_names ⇒ Object
readonly
Returns the value of attribute unit_names.
-
#unit_names_with_aliases ⇒ Object
readonly
Returns the value of attribute unit_names_with_aliases.
-
#units ⇒ Object
readonly
Returns the value of attribute units.
Instance Method Summary collapse
- #cached? ⇒ Boolean
- #convert(value, from:, to:) ⇒ Object
-
#initialize(units, cache: nil) ⇒ UnitSystem
constructor
A new instance of UnitSystem.
- #unit?(name) ⇒ Boolean
- #unit_for(name) ⇒ Object
- #unit_for!(name) ⇒ Object
- #unit_or_alias?(name) ⇒ Boolean
- #update_cache ⇒ Object
Constructor Details
#initialize(units, cache: nil) ⇒ UnitSystem
Returns a new instance of UnitSystem.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/measured/unit_system.rb', line 5 def initialize(units, cache: nil) @units = units.map { |unit| unit.with(unit_system: self) } @units = @units.map do |unit| next unit unless unit.conversion_unit conversion_unit = @units.find { |u| u.names.include?(unit.conversion_unit) } next unit unless conversion_unit unit.with(value: [unit.conversion_amount, conversion_unit.name]) end @unit_names = @units.map(&:name).sort.freeze @unit_names_with_aliases = @units.flat_map(&:names).sort.freeze @unit_name_to_unit = @units.each_with_object({}) do |unit, hash| unit.names.each { |name| hash[name.to_s] = unit } end @conversion_table_builder = Measured::ConversionTableBuilder.new(@units, cache: cache) @conversion_table = @conversion_table_builder.to_h.freeze end |
Instance Attribute Details
#unit_names ⇒ Object (readonly)
Returns the value of attribute unit_names.
3 4 5 |
# File 'lib/measured/unit_system.rb', line 3 def unit_names @unit_names end |
#unit_names_with_aliases ⇒ Object (readonly)
Returns the value of attribute unit_names_with_aliases.
3 4 5 |
# File 'lib/measured/unit_system.rb', line 3 def unit_names_with_aliases @unit_names_with_aliases end |
#units ⇒ Object (readonly)
Returns the value of attribute units.
3 4 5 |
# File 'lib/measured/unit_system.rb', line 3 def units @units end |
Instance Method Details
#cached? ⇒ Boolean
53 54 55 |
# File 'lib/measured/unit_system.rb', line 53 def cached? @conversion_table_builder.cached? end |
#convert(value, from:, to:) ⇒ Object
41 42 43 44 45 46 47 |
# File 'lib/measured/unit_system.rb', line 41 def convert(value, from:, to:) conversion = conversion_table.fetch(from.name, {})[to.name] raise Measured::UnitError, "Cannot find conversion entry from #{from} to #{to}" unless conversion value.to_r * conversion end |
#unit?(name) ⇒ Boolean
26 27 28 29 |
# File 'lib/measured/unit_system.rb', line 26 def unit?(name) unit = unit_for(name) unit ? unit.name == name.to_s : false end |
#unit_for(name) ⇒ Object
31 32 33 |
# File 'lib/measured/unit_system.rb', line 31 def unit_for(name) unit_name_to_unit[name.to_s] end |
#unit_for!(name) ⇒ Object
35 36 37 38 39 |
# File 'lib/measured/unit_system.rb', line 35 def unit_for!(name) unit = unit_for(name) raise Measured::UnitError, "Unit '#{name}' does not exist" unless unit unit end |
#unit_or_alias?(name) ⇒ Boolean
22 23 24 |
# File 'lib/measured/unit_system.rb', line 22 def unit_or_alias?(name) !!unit_for(name) end |
#update_cache ⇒ Object
49 50 51 |
# File 'lib/measured/unit_system.rb', line 49 def update_cache @conversion_table_builder.update_cache end |