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, )