From 3384d1bebff942e60e43f0bcf129c59e2165e4fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Tue, 30 Apr 2024 13:15:42 +0200 Subject: [PATCH] adds dict.pop method to ObservableDict --- .../observable/observable_object.py | 10 ++++++++- .../observable/test_observable_dict.py | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/pydase/observer_pattern/observable/observable_object.py b/src/pydase/observer_pattern/observable/observable_object.py index 477ff64..92577c1 100644 --- a/src/pydase/observer_pattern/observable/observable_object.py +++ b/src/pydase/observer_pattern/observable/observable_object.py @@ -226,7 +226,7 @@ class _ObservableList(ObservableObject, list[Any]): return instance_attr_name -class _ObservableDict(dict[str, Any], ObservableObject): +class _ObservableDict(ObservableObject, dict[str, Any]): def __init__( self, original_dict: dict[str, Any], @@ -266,3 +266,11 @@ class _ObservableDict(dict[str, Any], ObservableObject): if observer_attr_name != "": return f"{observer_attr_name}{instance_attr_name}" return instance_attr_name + + def pop(self, key: str) -> Any: + self._remove_observer_if_observable(f'["{key}"]') + + popped_item = super().pop(key) + + self._notify_changed("", self) + return popped_item diff --git a/tests/observer_pattern/observable/test_observable_dict.py b/tests/observer_pattern/observable/test_observable_dict.py index de72a30..e29dc94 100644 --- a/tests/observer_pattern/observable/test_observable_dict.py +++ b/tests/observer_pattern/observable/test_observable_dict.py @@ -193,3 +193,24 @@ def test_dotted_dict_key(caplog: pytest.LogCaptureFixture) -> None: instance.dict_attr["dotted.key"] = "Ciao" assert "'dict_attr[\"dotted.key\"]' changed to 'Ciao'" in caplog.text + + +def test_pop(caplog: pytest.LogCaptureFixture) -> None: + class NestedObservable(Observable): + def __init__(self) -> None: + super().__init__() + self.name = "Hello" + + nested_instance = NestedObservable() + + class MyObservable(Observable): + def __init__(self) -> None: + super().__init__() + self.dict_attr = {"nested": nested_instance} + + instance = MyObservable() + MyObserver(instance) + assert instance.dict_attr.pop("nested") == nested_instance + assert nested_instance._observers == {'["nested"]': []} + + assert f"'dict_attr' changed to '{instance.dict_attr}'" in caplog.text