From f92d5255889b827820693b741f0cefee7c931f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Thu, 22 May 2025 11:55:19 +0200 Subject: [PATCH 1/4] fix: fixes regex pattern to get property dependencies --- src/pydase/observer_pattern/observer/property_observer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pydase/observer_pattern/observer/property_observer.py b/src/pydase/observer_pattern/observer/property_observer.py index a686765..3aa77d0 100644 --- a/src/pydase/observer_pattern/observer/property_observer.py +++ b/src/pydase/observer_pattern/observer/property_observer.py @@ -22,7 +22,7 @@ def reverse_dict(original_dict: dict[str, list[str]]) -> dict[str, list[str]]: def get_property_dependencies(prop: property, prefix: str = "") -> list[str]: source_code_string = inspect.getsource(prop.fget) # type: ignore[arg-type] - pattern = r"self\.([^\s\{\}]+)" + pattern = r"self\.([^\s\{\}\)]+)" matches = re.findall(pattern, source_code_string) return [prefix + match for match in matches if "(" not in match] From f6b5c1b56739a240118fe72df7c6524916c4ee40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Thu, 22 May 2025 14:51:33 +0200 Subject: [PATCH 2/4] tests: property dependency as function argument --- .../test_data_service_observer.py | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tests/data_service/test_data_service_observer.py b/tests/data_service/test_data_service_observer.py index e06198a..aae9844 100644 --- a/tests/data_service/test_data_service_observer.py +++ b/tests/data_service/test_data_service_observer.py @@ -1,8 +1,9 @@ import logging from typing import Any -import pydase import pytest + +import pydase from pydase.data_service.data_service_observer import DataServiceObserver from pydase.data_service.state_manager import StateManager from pydase.utils.serialization.serializer import SerializationError, dump @@ -241,3 +242,22 @@ def test_read_only_dict_property(caplog: pytest.LogCaptureFixture) -> None: service_instance._dict_attr["dotted.key"] = 2.0 assert "'dict_attr[\"dotted.key\"]' changed to '2.0'" in caplog.text + + +def test_dependency_as_function_argument(caplog: pytest.LogCaptureFixture) -> None: + import time + + class MyObservable(pydase.DataService): + time_ms = 0 + + @property + def datetime(self) -> str: + return time.ctime(self.time_ms) + + service_instance = MyObservable() + state_manager = StateManager(service=service_instance) + DataServiceObserver(state_manager) + + service_instance.time_ms = 1746136800 + + assert "'datetime' changed to 'Fri May 2 00:00:00 2025'" in caplog.text From a97b8eb2b412a2fde353de2f481588ecc338f638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Thu, 22 May 2025 15:06:30 +0200 Subject: [PATCH 3/4] fix: exclude ( from regex, as well --- src/pydase/observer_pattern/observer/property_observer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pydase/observer_pattern/observer/property_observer.py b/src/pydase/observer_pattern/observer/property_observer.py index 3aa77d0..9d0b8d1 100644 --- a/src/pydase/observer_pattern/observer/property_observer.py +++ b/src/pydase/observer_pattern/observer/property_observer.py @@ -22,7 +22,7 @@ def reverse_dict(original_dict: dict[str, list[str]]) -> dict[str, list[str]]: def get_property_dependencies(prop: property, prefix: str = "") -> list[str]: source_code_string = inspect.getsource(prop.fget) # type: ignore[arg-type] - pattern = r"self\.([^\s\{\}\)]+)" + pattern = r"self\.([^\s\{\}\(\)]+)" matches = re.findall(pattern, source_code_string) return [prefix + match for match in matches if "(" not in match] From 4c28cbaf7d2ce7dc04ca56c2dc81e7a77e9d81d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Thu, 22 May 2025 15:07:10 +0200 Subject: [PATCH 4/4] tests: updates tests s.t. timezones don't matter --- tests/data_service/test_data_service_observer.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/data_service/test_data_service_observer.py b/tests/data_service/test_data_service_observer.py index aae9844..e6e9cb1 100644 --- a/tests/data_service/test_data_service_observer.py +++ b/tests/data_service/test_data_service_observer.py @@ -245,19 +245,20 @@ def test_read_only_dict_property(caplog: pytest.LogCaptureFixture) -> None: def test_dependency_as_function_argument(caplog: pytest.LogCaptureFixture) -> None: - import time - class MyObservable(pydase.DataService): - time_ms = 0 + some_int = 0 @property - def datetime(self) -> str: - return time.ctime(self.time_ms) + def other_int(self) -> int: + return self.add_one(self.some_int) + + def add_one(self, value: int) -> int: + return value + 1 service_instance = MyObservable() state_manager = StateManager(service=service_instance) DataServiceObserver(state_manager) - service_instance.time_ms = 1746136800 + service_instance.some_int = 1337 - assert "'datetime' changed to 'Fri May 2 00:00:00 2025'" in caplog.text + assert "'other_int' changed to '1338'" in caplog.text