From ff0cfb7b1dade03d9e883a14b218fc2172fae88d Mon Sep 17 00:00:00 2001 From: "Ware, Joseph (DLSLtd,RAL,LSCI)" Date: Mon, 11 Mar 2024 15:08:52 +0000 Subject: [PATCH] Simplify metadata handling --- src/ophyd_async/epics/_backend/_aioca.py | 30 +++++++++--------------- tests/epics/test_signals.py | 10 ++++---- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/ophyd_async/epics/_backend/_aioca.py b/src/ophyd_async/epics/_backend/_aioca.py index fe95397350..da5a0bca50 100644 --- a/src/ophyd_async/epics/_backend/_aioca.py +++ b/src/ophyd_async/epics/_backend/_aioca.py @@ -38,9 +38,7 @@ dbr.DBR_DOUBLE: "number", dbr.DBR_ENUM: "string", } -_number_dbr = {dbr.DBR_SHORT, dbr.DBR_CHAR, dbr.DBR_LONG, dbr.DBR_FLOAT, dbr.DBR_DOUBLE} -_floating_dbr = {dbr.DBR_FLOAT, dbr.DBR_DOUBLE} -_number_meta = { +_common_meta = { "units", "lower_alarm_limit", "upper_alarm_limit", @@ -50,20 +48,18 @@ "upper_disp_limit", "lower_warning_limit", "upper_warning_limit", + "precision", + "timestamp", } -def _if_has_meta_add_meta( - d: Dict[str, Any], value: AugmentedValue, key: Union[str, Set[str]] -): - if isinstance(key, str): - key = {key} - for k in key: - if not hasattr(value, k): +def _if_has_meta_add_meta(d: Dict[str, Any], value: AugmentedValue, keys: Set[str]): + for key in keys: + if not hasattr(value, key): continue - attr = getattr(value, k) + attr = getattr(value, key) if isinstance(attr, str) or not isnan(attr): - d[k] = attr + d[key] = attr def _data_key_from_augmented_value(value: AugmentedValue, **kwargs) -> Descriptor: @@ -83,22 +79,18 @@ def _data_key_from_augmented_value(value: AugmentedValue, **kwargs) -> Descripto assert value.ok, f"Error reading {source}: {value}" scalar = value.element_count == 1 + dtype = dbr_to_dtype[value.datatype] d = Descriptor( source=source, - dtype=dbr_to_dtype[value.datatype] if scalar else "array", + dtype=dtype if scalar else "array", # strictly value.element_count >= len(value) shape=[] if scalar else [len(value)], ) - if value.datatype in _number_dbr: - _if_has_meta_add_meta(d, value, _number_meta) - if value.datatype in _floating_dbr: - _if_has_meta_add_meta(d, value, "precision") + _if_has_meta_add_meta(d, value, _common_meta) if value.datatype is dbr.DBR_ENUM: d["choices"] = value.enums - if value.datatype is dbr.DBR_STRING: - _if_has_meta_add_meta(d, value, "timestamp") d.update(kwargs) return d diff --git a/tests/epics/test_signals.py b/tests/epics/test_signals.py index e6455e7e5b..18e9de6dff 100644 --- a/tests/epics/test_signals.py +++ b/tests/epics/test_signals.py @@ -155,10 +155,10 @@ class MyEnum(str, Enum): } _int_metadata = { - "lower_alarm_limit": 0, - "lower_warning_limit": 0, - "upper_alarm_limit": 0, - "upper_warning_limit": 0, + "lower_alarm_limit": ANY, + "lower_warning_limit": ANY, + "upper_alarm_limit": ANY, + "upper_warning_limit": ANY, } _metadata: Dict[str, Dict[str, Any]] = { @@ -171,7 +171,7 @@ class MyEnum(str, Enum): def descriptor(protocol: str, suffix: str, value=None) -> Descriptor: def get_internal_dtype(suffix: str) -> str: - # uint32, int64, uint64 all backed by DBR_DOUBLE which has precision + # uint32, [u]int64 backed by DBR_DOUBLE, have precision if "float" in suffix or "uint32" in suffix or "int64" in suffix: return "number" if "int" in suffix or "bool" in suffix: