mirror of
https://github.com/bec-project/ophyd_devices.git
synced 2026-02-06 23:28:41 +01:00
fix: smarter strip for computed signal
This commit is contained in:
@@ -3,6 +3,7 @@ This module provides a class for creating a pseudo signal that is computed from
|
||||
"""
|
||||
|
||||
import ast
|
||||
import re
|
||||
from functools import reduce
|
||||
from typing import Callable
|
||||
|
||||
@@ -14,6 +15,15 @@ from ophyd.ophydobj import Kind
|
||||
|
||||
logger = bec_logger.logger
|
||||
|
||||
_FIRST_DEF = re.compile(r"(^|\\n)\s*def", re.MULTILINE)
|
||||
|
||||
|
||||
def _smart_strip(method: str) -> str:
|
||||
if (first_def := _FIRST_DEF.search(method)) is not None:
|
||||
return method[first_def.span()[1] - 3 :]
|
||||
else:
|
||||
raise ValueError(f"No 'def' keyword found in function definition: {method}")
|
||||
|
||||
|
||||
def rgetattr(obj, attr, *args):
|
||||
"""See https://stackoverflow.com/questions/31174295/getattr-and-setattr-on-nested-objects"""
|
||||
@@ -96,8 +106,7 @@ class ComputedSignal(SignalRO):
|
||||
|
||||
"""
|
||||
logger.info(f"Updating compute method for {self.name}.")
|
||||
method = method.strip()
|
||||
|
||||
method = _smart_strip(method)
|
||||
# Parse and validate the function using AST
|
||||
try:
|
||||
tree = ast.parse(method)
|
||||
|
||||
@@ -3,7 +3,7 @@ from unittest import mock
|
||||
import pytest
|
||||
from bec_server.device_server.tests.utils import DMMock
|
||||
|
||||
from ophyd_devices.utils.dynamic_pseudo import ComputedSignal
|
||||
from ophyd_devices.utils.dynamic_pseudo import ComputedSignal, _smart_strip
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -24,6 +24,9 @@ def device_manager_with_devices():
|
||||
"def test(a, b): return a.get() + b.get()",
|
||||
"def test(a, b): return a.get() + b.get()",
|
||||
" def my_compute_method(a,b):\n return a.get() + b.get()\n",
|
||||
"#comment goes here\n def my_compute_method(a,b):\n return a.get() + b.get()\n",
|
||||
"#comment goes here\n\n\n def my_compute_method(a,b):\n return a.get() + b.get()\n",
|
||||
"#comment goes here\n\n\n def my_compute_method(a,b):\n#comment inside\n return a.get() + b.get()\n",
|
||||
],
|
||||
)
|
||||
def test_computed_signal(device_manager_with_devices, compute_method_str):
|
||||
@@ -41,4 +44,4 @@ def test_computed_signal(device_manager_with_devices, compute_method_str):
|
||||
|
||||
# pylint: disable=protected-access
|
||||
assert callable(signal._compute_method)
|
||||
assert signal._compute_method_str == compute_method_str.strip()
|
||||
assert signal._compute_method_str == _smart_strip(compute_method_str)
|
||||
|
||||
Reference in New Issue
Block a user