From ba9dbc03f1f866428da99ef99e963854b3f07456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Tue, 21 May 2024 14:03:21 +0200 Subject: [PATCH 1/2] removes attribute key from observers dict if list of observers is empty --- src/pydase/observer_pattern/observable/observable_object.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pydase/observer_pattern/observable/observable_object.py b/src/pydase/observer_pattern/observable/observable_object.py index aa39413..d749ef5 100644 --- a/src/pydase/observer_pattern/observable/observable_object.py +++ b/src/pydase/observer_pattern/observable/observable_object.py @@ -32,6 +32,10 @@ class ObservableObject(ABC): if attribute in self._observers: self._observers[attribute].remove(observer) + # remove attribute key from observers dict if list of observers is empty + if not self._observers[attribute]: + del self._observers[attribute] + @abstractmethod def _remove_observer_if_observable(self, name: str) -> None: """Removes the current object as an observer from an observable attribute. From 9c3c92361b2558784ca1bdf0ff39f880ee056bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Tue, 21 May 2024 14:03:25 +0200 Subject: [PATCH 2/2] updates tests --- .../observable/test_observable_dict.py | 4 +--- .../observable/test_observable_object.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tests/observer_pattern/observable/test_observable_dict.py b/tests/observer_pattern/observable/test_observable_dict.py index e29dc94..f06c00d 100644 --- a/tests/observer_pattern/observable/test_observable_dict.py +++ b/tests/observer_pattern/observable/test_observable_dict.py @@ -138,7 +138,6 @@ def test_removed_observer_on_class_dict_attr(caplog: pytest.LogCaptureFixture) - caplog.clear() assert nested_instance._observers == { - '["nested"]': [], "nested_attr": [instance], } @@ -172,7 +171,6 @@ def test_removed_observer_on_instance_dict_attr( caplog.clear() assert nested_instance._observers == { - '["nested"]': [], "nested_attr": [instance], } @@ -211,6 +209,6 @@ def test_pop(caplog: pytest.LogCaptureFixture) -> None: instance = MyObservable() MyObserver(instance) assert instance.dict_attr.pop("nested") == nested_instance - assert nested_instance._observers == {'["nested"]': []} + assert nested_instance._observers == {} assert f"'dict_attr' changed to '{instance.dict_attr}'" in caplog.text diff --git a/tests/observer_pattern/observable/test_observable_object.py b/tests/observer_pattern/observable/test_observable_object.py index 74c8a47..a5b6d6b 100644 --- a/tests/observer_pattern/observable/test_observable_object.py +++ b/tests/observer_pattern/observable/test_observable_object.py @@ -81,11 +81,21 @@ def test_removed_observer_on_class_list_attr(caplog: pytest.LogCaptureFixture) - instance = MyObservable() MyObserver(instance) + + assert nested_instance._observers == { + "[0]": [instance.changed_list_attr], + "nested_attr": [instance], + } + instance.changed_list_attr[0] = "Ciao" assert "'changed_list_attr[0]' changed to 'Ciao'" in caplog.text caplog.clear() + assert nested_instance._observers == { + "nested_attr": [instance], + } + instance.nested_attr.name = "Hi" assert "'nested_attr.name' changed to 'Hi'" in caplog.text @@ -115,6 +125,10 @@ def test_removed_observer_on_instance_list_attr( assert "'changed_list_attr[0]' changed to 'Ciao'" in caplog.text caplog.clear() + assert nested_instance._observers == { + "nested_attr": [instance], + } + instance.nested_attr.name = "Hi" assert "'nested_attr.name' changed to 'Hi'" in caplog.text