From f85da4c81d576b772e594718ad57a316cf544ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Elio=20Petten=C3=B2?= Date: Thu, 28 Dec 2017 12:06:02 +0000 Subject: Use Python3 Enum class for glucose units. This makes the code more idiomatic and less brittle. --- glucometer.py | 3 ++- glucometerutils/common.py | 26 +++++++++----------------- glucometerutils/drivers/accuchek_reports.py | 4 ++-- glucometerutils/drivers/fsinsulinx.py | 2 +- glucometerutils/drivers/fslibre.py | 2 +- glucometerutils/drivers/fsoptium.py | 8 ++++---- glucometerutils/drivers/fsprecisionneo.py | 2 +- glucometerutils/drivers/otultra2.py | 8 ++++---- glucometerutils/drivers/otultraeasy.py | 4 ++-- glucometerutils/drivers/otverio2015.py | 4 ++-- glucometerutils/drivers/sdcodefree.py | 2 +- test/test_common.py | 14 +++++++------- 12 files changed, 36 insertions(+), 43 deletions(-) diff --git a/glucometer.py b/glucometer.py index 9ec781c..abed647 100755 --- a/glucometer.py +++ b/glucometer.py @@ -48,7 +48,8 @@ def main(): parser_dump = subparsers.add_parser( 'dump', help='Dump the readings stored in the device.') parser_dump.add_argument( - '--unit', action='store', choices=common.VALID_UNITS, + '--unit', action='store', + choices=[unit.value for unit in common.Unit], help='Select the unit to use for the dumped data.') parser_dump.add_argument( '--sort-by', action='store', default='timestamp', diff --git a/glucometerutils/common.py b/glucometerutils/common.py index 3f61932..9350983 100644 --- a/glucometerutils/common.py +++ b/glucometerutils/common.py @@ -7,15 +7,14 @@ __copyright__ = 'Copyright © 2013, Diego Elio Pettenò' __license__ = 'MIT' import collections +import enum import textwrap from glucometerutils import exceptions -# Constants for units -UNIT_MGDL = 'mg/dL' -UNIT_MMOLL = 'mmol/L' - -VALID_UNITS = [UNIT_MGDL, UNIT_MMOLL] +class Unit(enum.Enum): + MG_DL = 'mg/dL' + MMOL_L = 'mmol/L' # Constants for meal information NO_MEAL = '' @@ -41,17 +40,10 @@ def convert_glucose_unit(value, from_unit, to_unit=None): Raises: exceptions.InvalidGlucoseUnit: If the parameters are incorrect. """ - if from_unit not in VALID_UNITS: - raise exceptions.InvalidGlucoseUnit(from_unit) - if from_unit == to_unit: return value - if to_unit is not None: - if to_unit not in VALID_UNITS: - raise exceptions.InvalidGlucoseUnit(to_unit) - - if from_unit is UNIT_MGDL: + if from_unit is Unit.MG_DL: return round(value / 18.0, 2) else: return round(value * 18.0, 0) @@ -86,9 +78,9 @@ class GlucoseReading(_ReadingBase): """Returns the reading value as the given unit. Args: - to_unit: (UNIT_MGDL|UNIT_MMOLL) The unit to return the value to. + to_unit: (Unit) The unit to return the value to. """ - return convert_glucose_unit(self.value, UNIT_MGDL, to_unit) + return convert_glucose_unit(self.value, Unit.MG_DL, to_unit) def as_csv(self, unit): """Returns the reading as a formatted comma-separated value string.""" @@ -129,14 +121,14 @@ _MeterInfoBase = collections.namedtuple( class MeterInfo(_MeterInfoBase): def __new__(cls, model, serial_number='N/A', version_info=(), - native_unit=UNIT_MGDL): + native_unit=Unit.MG_DL): """Construct a meter information object. Args: model: (string) Human-readable model name, depending on driver. serial_number: (string) Optional serial number to identify the device. version_info: (list(string)) Optional hardware/software version information. - native_unit: (UNIT_MGDL|UNIT_MMOLL) Native unit of the device for display. + native_unit: (Unit) Native unit of the device for display. """ return super(MeterInfo, cls).__new__( cls, model=model, serial_number=serial_number, version_info=version_info, diff --git a/glucometerutils/drivers/accuchek_reports.py b/glucometerutils/drivers/accuchek_reports.py index 2ae41ba..03eeddd 100644 --- a/glucometerutils/drivers/accuchek_reports.py +++ b/glucometerutils/drivers/accuchek_reports.py @@ -26,8 +26,8 @@ from glucometerutils import common from glucometerutils import exceptions _UNIT_MAP = { - 'mmol/l': common.UNIT_MMOLL, - 'mg/dl': common.UNIT_MGDL, + 'mmol/l': common.Unit.MMOL_L, + 'mg/dl': common.Unit.MG_DL, } _DATE_CSV_KEY = 'Date' diff --git a/glucometerutils/drivers/fsinsulinx.py b/glucometerutils/drivers/fsinsulinx.py index 90abc7e..15bc131 100644 --- a/glucometerutils/drivers/fsinsulinx.py +++ b/glucometerutils/drivers/fsinsulinx.py @@ -57,7 +57,7 @@ class Device(freestyle.FreeStyleHidDevice): def get_glucose_unit(self): """Returns the glucose unit of the device.""" - return common.UNIT_MGDL + return common.Unit.MG_DL def get_readings(self): """Iterate through the reading records in the device.""" diff --git a/glucometerutils/drivers/fslibre.py b/glucometerutils/drivers/fslibre.py index a0f0517..52632b3 100644 --- a/glucometerutils/drivers/fslibre.py +++ b/glucometerutils/drivers/fslibre.py @@ -209,7 +209,7 @@ class Device(freestyle.FreeStyleHidDevice): """Returns the glucose unit of the device.""" # TODO(Flameeyes): figure out how to identify the actual unit on the # device. - return common.UNIT_MGDL + return common.Unit.MG_DL def get_readings(self): diff --git a/glucometerutils/drivers/fsoptium.py b/glucometerutils/drivers/fsoptium.py index 121d8d6..5c57ae3 100644 --- a/glucometerutils/drivers/fsoptium.py +++ b/glucometerutils/drivers/fsoptium.py @@ -119,9 +119,9 @@ class Device(serial.SerialDevice): elif parsed_line[0] == 'Ver:': self.device_version_ = parsed_line[1] if parsed_line[2] == 'MMOL': - self.device_glucose_unit_ = common.UNIT_MMOLL + self.device_glucose_unit_ = common.Unit.MMOL_L else: # I only have a mmol/l device, so I can't be sure. - self.device_glucose_unit_ = common.UNIT_MGDL + self.device_glucose_unit_ = common.Unit.MG_DL # There are more entries: Clock, Market, ROM and Usage, but we don't care # for those here. elif parsed_line[0] == 'CMD OK': @@ -164,8 +164,8 @@ class Device(serial.SerialDevice): """Returns a constant representing the unit displayed by the meter. Returns: - common.UNIT_MGDL: if the glucometer displays in mg/dL - common.UNIT_MMOLL: if the glucometer displays in mmol/L + common.Unit.MG_DL: if the glucometer displays in mg/dL + common.Unit.MMOL_L: if the glucometer displays in mmol/L """ return self.device_glucose_unit_ diff --git a/glucometerutils/drivers/fsprecisionneo.py b/glucometerutils/drivers/fsprecisionneo.py index 6fd07c2..cb58263 100644 --- a/glucometerutils/drivers/fsprecisionneo.py +++ b/glucometerutils/drivers/fsprecisionneo.py @@ -66,7 +66,7 @@ class Device(freestyle.FreeStyleHidDevice): def get_glucose_unit(self): """Returns the glucose unit of the device.""" - return common.UNIT_MGDL + return common.Unit.MG_DL def get_readings(self): """Iterate through the reading records in the device.""" diff --git a/glucometerutils/drivers/otultra2.py b/glucometerutils/drivers/otultra2.py index e9f60bb..f44bc15 100644 --- a/glucometerutils/drivers/otultra2.py +++ b/glucometerutils/drivers/otultra2.py @@ -262,8 +262,8 @@ class Device(serial.SerialDevice): """Returns a constant representing the unit displayed by the meter. Returns: - common.UNIT_MGDL: if the glucometer displays in mg/dL - common.UNIT_MMOLL: if the glucometer displays in mmol/L + common.Unit.MG_DL: if the glucometer displays in mg/dL + common.Unit.MMOL_L: if the glucometer displays in mmol/L Raises: exceptions.InvalidGlucoseUnit: if the unit is not recognized @@ -279,9 +279,9 @@ class Device(serial.SerialDevice): unit = match.group(1) if unit == 'MG/DL ': - return common.UNIT_MGDL + return common.Unit.MG_DL elif unit == 'MMOL/L': - return common.UNIT_MMOLL + return common.Unit.MMOL_L else: raise exceptions.InvalidGlucoseUnit(string) diff --git a/glucometerutils/drivers/otultraeasy.py b/glucometerutils/drivers/otultraeasy.py index 461de26..0538dac 100644 --- a/glucometerutils/drivers/otultraeasy.py +++ b/glucometerutils/drivers/otultraeasy.py @@ -295,9 +295,9 @@ class Device(serial.SerialDevice): response = self._read_response() if response.data[2] == 0: - return common.UNIT_MGDL + return common.Unit.MG_DL elif response.data[2] == 1: - return common.UNIT_MMOLL + return common.Unit.MMOL_L else: raise lifescan.MalformedCommand( 'at position PM1 invalid value %02x for unit' % response.data[2]) diff --git a/glucometerutils/drivers/otverio2015.py b/glucometerutils/drivers/otverio2015.py index 9dc9393..c416678 100644 --- a/glucometerutils/drivers/otverio2015.py +++ b/glucometerutils/drivers/otverio2015.py @@ -243,9 +243,9 @@ class Device(object): def get_glucose_unit(self): unit_value = self._read_parameter(_PARAMETER_KEY_UNIT) if unit_value == b'\x00\x00\x00\x00': - return common.UNIT_MGDL + return common.Unit.MG_DL elif unit_value == b'\x01\x00\x00\x00': - return common.UNIT_MMOLL + return common.Unit.MMOL_L else: raise exceptions.InvalidGlucoseUnit('%r' % unit_value) diff --git a/glucometerutils/drivers/sdcodefree.py b/glucometerutils/drivers/sdcodefree.py index 8b07ab5..4939361 100644 --- a/glucometerutils/drivers/sdcodefree.py +++ b/glucometerutils/drivers/sdcodefree.py @@ -164,7 +164,7 @@ class Device(serial.SerialDevice): def get_glucose_unit(self): # Device does not provide information on glucose unit. - return common.UNIT_MGDL + return common.Unit.MG_DL def get_datetime(self): raise NotImplementedError diff --git a/test/test_common.py b/test/test_common.py index 07b65d9..febf578 100644 --- a/test/test_common.py +++ b/test/test_common.py @@ -19,31 +19,31 @@ class TestCommon(unittest.TestCase): def test_glucose_conversion(self): self.assertEqual( 5.56, common.convert_glucose_unit( - 100, common.UNIT_MGDL, common.UNIT_MMOLL)) + 100, common.Unit.MG_DL, common.Unit.MMOL_L)) self.assertEqual( 5.56, common.convert_glucose_unit( - 100, common.UNIT_MGDL)) + 100, common.Unit.MG_DL)) self.assertEqual( 180, common.convert_glucose_unit( - 10, common.UNIT_MMOLL, common.UNIT_MGDL)) + 10, common.Unit.MMOL_L, common.Unit.MG_DL)) self.assertEqual( 180, common.convert_glucose_unit( - 10, common.UNIT_MMOLL)) + 10, common.Unit.MMOL_L)) self.assertEqual( 100, common.convert_glucose_unit( - 100, common.UNIT_MGDL, common.UNIT_MGDL)) + 100, common.Unit.MG_DL, common.Unit.MG_DL)) self.assertEqual( 10, common.convert_glucose_unit( - 10, common.UNIT_MMOLL, common.UNIT_MMOLL)) + 10, common.Unit.MMOL_L, common.Unit.MMOL_L)) self.assertRaises( exceptions.InvalidGlucoseUnit, - common.convert_glucose_unit, common.UNIT_MMOLL, 'foo') + common.convert_glucose_unit, common.Unit.MMOL_L, 'foo') if __name__ == '__main__': unittest.main() -- cgit v1.2.3