Coverage for backend/django/Economics/shared/unit_conversion.py: 90%

18 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-06-23 21:51 +0000

1from __future__ import annotations 

2 

3from decimal import Decimal, InvalidOperation, localcontext 

4 

5from pint.errors import PintError 

6 

7from idaes_factory.unit_conversion.unit_conversion import pint_registry 

8 

9 

10def convert_quantity( 

11 *, 

12 value: Decimal, 

13 source_unit: str, 

14 target_unit: str, 

15 multiplier=None, 

16) -> Decimal | None: 

17 """Convert a physical quantity between compatible units.""" 

18 try: 

19 quantity = pint_registry.Quantity(value, source_unit) 

20 if multiplier is not None: 

21 quantity = quantity * multiplier 

22 converted = quantity.to(target_unit) 

23 except (PintError, AttributeError, ValueError, TypeError): 

24 return None 

25 try: 

26 with localcontext() as context: 

27 context.prec = 34 

28 return Decimal(str(converted.magnitude)) 

29 except (InvalidOperation, ValueError): 

30 return None