From cddb83451a1fba1687cb863d18ef8b09f8f8cfbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Thu, 4 Jul 2024 17:25:18 +0200 Subject: [PATCH 1/2] observer: first check if full access path contains private or protected attributes As protected and private attributes are not stored in the cache, it does not make sense to compare the cached value against the new value. --- src/pydase/data_service/data_service_observer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pydase/data_service/data_service_observer.py b/src/pydase/data_service/data_service_observer.py index 424a199..febd157 100644 --- a/src/pydase/data_service/data_service_observer.py +++ b/src/pydase/data_service/data_service_observer.py @@ -37,8 +37,9 @@ class DataServiceObserver(PropertyObserver): ) cached_value = cached_value_dict.get("value") - if cached_value != dump(value)["value"] and all( - part[0] != "_" for part in full_access_path.split(".") + if ( + all(part[0] != "_" for part in full_access_path.split(".")) + and cached_value != dump(value)["value"] ): logger.debug("'%s' changed to '%s'", full_access_path, value) From 44d73c3b7775fd225041e8f723088ba28b0bcf24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Thu, 4 Jul 2024 17:37:44 +0200 Subject: [PATCH 2/2] adds function testing if private attributes can take values that are not serializable --- .../test_data_service_observer.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/data_service/test_data_service_observer.py b/tests/data_service/test_data_service_observer.py index 9e487fb..974eca9 100644 --- a/tests/data_service/test_data_service_observer.py +++ b/tests/data_service/test_data_service_observer.py @@ -1,9 +1,11 @@ import logging +from typing import Any import pydase import pytest from pydase.data_service.data_service_observer import DataServiceObserver from pydase.data_service.state_manager import StateManager +from pydase.utils.serialization.serializer import SerializationError logger = logging.getLogger() @@ -122,3 +124,25 @@ def test_dynamic_list_entry_with_property(caplog: pytest.LogCaptureFixture) -> N assert "'list_attr[0].name' changed to 'Hello'" not in caplog.text assert "'list_attr[0].name' changed to 'Hoooo'" in caplog.text + + +def test_private_attribute_does_not_have_to_be_serializable() -> None: + class MyService(pydase.DataService): + def __init__(self) -> None: + super().__init__() + self.publ_attr: Any = 1 + self.__priv_attr = (1,) + + def change_publ_attr(self) -> None: + self.publ_attr = (2,) # cannot be serialized + + def change_priv_attr(self) -> None: + self.__priv_attr = (2,) + + service_instance = MyService() + pydase.Server(service_instance) + + with pytest.raises(SerializationError): + service_instance.change_publ_attr() + + service_instance.change_priv_attr()