From 6ef9b26d17b73972016d10ecfa905e88461fd12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Apple?= Date: Thu, 5 Dec 2024 20:44:22 +0100 Subject: [PATCH] changing approach to mapping dicts in encoding and decoding --- uds/database/text_data_record.py | 49 +++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/uds/database/text_data_record.py b/uds/database/text_data_record.py index 9ca111d..491ac33 100644 --- a/uds/database/text_data_record.py +++ b/uds/database/text_data_record.py @@ -1,5 +1,8 @@ """Definition of TextDataRecord which is class for encode and decode values of data records.""" +import copy from typing import Optional, Tuple, Union, Dict +from uu import decode + from uds.database.abstract_data_record import (AbstractDataRecord, DataRecordType, DataRecordPhysicalValueAlias, DecodedDataRecord) @@ -15,7 +18,8 @@ def __init__(self, name: str, length: int, mapping: Dict[int, str] = None) -> No """ super().__init__(name) self.length = length - self.mapping = mapping + # self.__reversed_mapping = None ### should it be deleted? + self.__mapping = mapping @property # noqa: F841 def length(self) -> int: @@ -67,6 +71,25 @@ def contains(self) -> Tuple["AbstractDataRecord", ...]: """Get Data Records contained by this Data Record.""" # TODO + @property + def mapping(self): + """Get mapping dict.""" + return self.__mapping + + @mapping.setter + def mapping(self, mapping: dict) -> None: + """Set the mapping. + + :param mapping: dict contains mapping. + """ + self.__mapping = mapping + self.__reversed_mapping = {v: k for k, v in self.__mapping.items()} + + @property + def reversed_mapping(self): + """Get reversed mapping dict.""" + return self.__reversed_mapping + def decode(self, raw_value: int) -> DecodedDataRecord: # noqa: F841 """ Decode physical value for provided raw value. @@ -75,13 +98,13 @@ def decode(self, raw_value: int) -> DecodedDataRecord: # noqa: F841 :return: Dictionary with physical value for this Data Record. """ - if self.mapping: - for k, v in self.mapping.items(): - if v == raw_value: - return DecodedDataRecord(name=self.name, raw_value=k, physical_value=raw_value) - raise ValueError("physical_value not found in provided mapping.") - else: - return DecodedDataRecord(name=self.name, raw_value=raw_value, physical_value=raw_value) + if self.__reversed_mapping: + try: + decoded_value = self.__reversed_mapping[raw_value] + return DecodedDataRecord(name=self.name, raw_value=decoded_value, physical_value=raw_value) + except KeyError as error: + raise KeyError("raw_value not found in provided mapping.") from error + return DecodedDataRecord(name=self.name, raw_value=raw_value, physical_value=raw_value) def encode(self, physical_value: DataRecordPhysicalValueAlias) -> int: # noqa: F841 """ @@ -94,10 +117,10 @@ def encode(self, physical_value: DataRecordPhysicalValueAlias) -> int: # noqa: if isinstance(physical_value, int): return physical_value elif isinstance(physical_value, str): - if self.mapping: - for k, v in self.mapping.items(): - if v == physical_value: - return k - raise ValueError("physical_value not found in provided mapping.") + if self.__mapping: + try: + return self.__mapping[physical_value] + except KeyError as error: + raise KeyError("physical_value not found in provided mapping.") from error else: raise TypeError("During encoding of str mapping must be provided.")