refactor: generalize unit conversion function

main
Ricard Illa 2023-06-23 10:30:07 +02:00
parent 9e3936fdc0
commit a0c868f2f0
4 changed files with 45 additions and 33 deletions

View File

@ -6,6 +6,8 @@ import logging
from typing import Dict, Optional
import re
from helpers.misc import convert_units
UNIT_CONVERSIONS = {"inches": 2.54, "feet": 30.48, "cm": 1}
@ -31,17 +33,6 @@ def parse_dimensions_measure(dimensions: str, measure: str) -> Optional[Dict]:
return None
def units_to_cm(value: float, unit: str) -> Optional[float]:
"""Convert a given dimension unit into centimeters.
If unrecognized unit, return None"""
try:
conversion = UNIT_CONVERSIONS[unit]
except KeyError:
logging.error("unrecognized unit: %s", unit)
return None
return value * conversion
def parse_dimensions(dimensions: Optional[str]) -> Dict[str, Optional[float]]:
"""Parse a string representing dimensions"""
if dimensions is None:
@ -63,5 +54,5 @@ def parse_dimensions(dimensions: Optional[str]) -> Dict[str, Optional[float]]:
if value is None:
result[key] = value
else:
result[key] = units_to_cm(**value)
result[key] = convert_units(**value, unit_conversions=UNIT_CONVERSIONS)
return result

View File

@ -0,0 +1,17 @@
"""Misc helper functions"""
import logging
from typing import Dict, Optional
def convert_units(
value: float, unit: str, unit_conversions: Dict[str, float]
) -> Optional[float]:
"""Convert a given value and unit into a different unit.
If unrecognized unit, return None"""
try:
conversion = unit_conversions[unit]
except KeyError:
logging.error("unrecognized unit: %s", unit)
return None
return value * conversion

View File

@ -0,0 +1,24 @@
"""Test the `convert_units`"""
from helpers.dimensions import UNIT_CONVERSIONS as dimension_unit_conversions
from helpers.misc import convert_units
def test_units_to_cm_inches():
"""Test `convert_units` to cm from inches"""
assert convert_units(0.5, "inches", dimension_unit_conversions) == 1.27
def test_units_to_cm_feet():
"""Test `convert_units` to cm from feet"""
assert convert_units(0.5, "feet", dimension_unit_conversions) == 15.24
def test_units_to_cm_cm():
"""Test `convert_units` to cm from cm"""
assert convert_units(0.5, "cm", dimension_unit_conversions) == 0.5
def test_units_to_cm_unrecognized():
"""Test `convert_units` to cm from unrecognized unit"""
assert convert_units(0.5, "yard", dimension_unit_conversions) is None

View File

@ -1,6 +1,6 @@
"""Test the `parse_dimensions` function and its helpers"""
from helpers.dimensions import parse_dimensions, parse_dimensions_measure, units_to_cm
from helpers.dimensions import parse_dimensions, parse_dimensions_measure
def test_none():
@ -91,23 +91,3 @@ def test_parse_dimensions_missing():
"height": 58.42,
"width": None,
}
def test_units_to_cm_inches():
"""Test `units_to_cm` where the units is inches"""
assert units_to_cm(value=0.5, unit="inches") == 1.27
def test_units_to_cm_feet():
"""Test `units_to_cm` where the units is inches"""
assert units_to_cm(value=0.5, unit="feet") == 15.24
def test_units_to_cm_cm():
"""Test `units_to_cm` where the units is already cm"""
assert units_to_cm(value=0.5, unit="cm") == 0.5
def test_units_to_cm_unrecognized():
"""Test `units_to_cm` where the units are not recognized"""
assert units_to_cm(value=0.5, unit="yard") is None