From 008e1262bbe17562b148018d9703670e5f8e44a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Mon, 23 Sep 2024 08:57:00 +0200 Subject: [PATCH] updates PropertyObserver to support descriptors returning observables If a class attribute is a descriptor, get its value before checking if it is an Observable. --- .../observer/property_observer.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/pydase/observer_pattern/observer/property_observer.py b/src/pydase/observer_pattern/observer/property_observer.py index f9a125e..0e8ae4c 100644 --- a/src/pydase/observer_pattern/observer/property_observer.py +++ b/src/pydase/observer_pattern/observer/property_observer.py @@ -5,6 +5,7 @@ from typing import Any from pydase.observer_pattern.observable.observable import Observable from pydase.observer_pattern.observer.observer import Observer +from pydase.utils.helpers import is_descriptor logger = logging.getLogger(__name__) @@ -61,17 +62,27 @@ class PropertyObserver(Observer): self, obj: Observable, deps: dict[str, Any], prefix: str ) -> None: for k, value in {**vars(type(obj)), **vars(obj)}.items(): + actual_value = value prefix = ( f"{prefix}." if prefix != "" and not prefix.endswith(".") else prefix ) parent_path = f"{prefix}{k}" - if isinstance(value, Observable): + + # Get value from descriptor + if not isinstance(value, property) and is_descriptor(value): + actual_value = getattr(obj, k) + + if isinstance(actual_value, Observable): new_prefix = f"{parent_path}." deps.update( - self._get_properties_and_their_dependencies(value, new_prefix) + self._get_properties_and_their_dependencies( + actual_value, new_prefix + ) ) elif isinstance(value, list | dict): - self._process_collection_item_properties(value, deps, parent_path) + self._process_collection_item_properties( + actual_value, deps, parent_path + ) def _process_collection_item_properties( self,