Source code for ts_lib_units.convert
try:
from pint import UnitRegistry as _UnitRegistry
from ts_ids_core.schema import RawValueUnit, ValueUnit
except ImportError as exc:
raise ImportError(
"The 'convert' extras are required for unit conversion. Please install it via:\n"
"poetry add ts-lib-units[convert]"
) from exc
from typing import Union
from ts_lib_units import Unit
from ts_lib_units.tetra_unit import TetraUnit
_ureg = _UnitRegistry()
_ureg.define("endotoxin_unit = [endotoxin] = EU")
[docs]
def convert_unit(
raw_value_unit: Union[RawValueUnit, ValueUnit],
to_unit: TetraUnit,
ureg: _UnitRegistry = _ureg,
) -> ValueUnit:
"""Convert a value from one unit to another
Args:
raw_value_unit: The RawValueUnit or ValueUnit object to convert
to_unit: The unit to convert to
ureg (optional): The `pint` unit registry to use for conversion
Returns:
ValueUnit: A new ValueUnit object with the converted value and unit
"""
if not raw_value_unit.unit:
raise ValueError("'unit' is not defined in input object")
unit = Unit.get(raw_value_unit.unit)
if not unit.pint_format or not to_unit.pint_format:
raise ValueError(
f"Cannot convert between {unit.ts_format} and {to_unit.ts_format}: missing pint format"
)
quantity = raw_value_unit.value * ureg(unit.pint_format)
converted_quantity = quantity.to(to_unit.pint_format)
return ValueUnit(
value=converted_quantity.magnitude,
unit=to_unit.ts_format,
)