From 51ffd8be4d5528ab64d063ead04817ed9f789e60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Wed, 6 Mar 2024 18:50:50 +0100 Subject: [PATCH] simplifies serializer logic --- src/pydase/utils/serializer.py | 36 +++++++++++++++------------------- tests/utils/test_serializer.py | 14 ++++++++++--- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/pydase/utils/serializer.py b/src/pydase/utils/serializer.py index 9a3e51b..fef2064 100644 --- a/src/pydase/utils/serializer.py +++ b/src/pydase/utils/serializer.py @@ -295,31 +295,22 @@ def set_nested_value_by_path( logger.error(e) return - serialized_value = dump(value) - keys_to_keep = set(serialized_value.keys()) - - if ( - next_level_serialized_object == {} - ): # adding an attribute / element to a list or dict - pass - elif next_level_serialized_object["type"] == "method": # state change of task - keys_to_keep = set(next_level_serialized_object.keys()) - - serialized_value = {} # type: ignore + if next_level_serialized_object["type"] == "method": # state change of task next_level_serialized_object["value"] = ( value.name if isinstance(value, Enum) else None ) else: - # attribute-specific information should not be overwritten by new value - serialized_value.pop("readonly") # type: ignore - serialized_value.pop("doc") # type: ignore + serialized_value = dump(value) + keys_to_keep = set(serialized_value.keys()) - next_level_serialized_object.update(serialized_value) + # TODO: you might want to pop "readonly" and/or "doc" from serialized_value if + # it is overwriting the values of the current dict + next_level_serialized_object.update(serialized_value) - # removes keys that are not present in the serialized new value - for key in list(next_level_serialized_object.keys()): - if key not in keys_to_keep: - next_level_serialized_object.pop(key, None) # type: ignore + # removes keys that are not present in the serialized new value + for key in list(next_level_serialized_object.keys()): + if key not in keys_to_keep: + next_level_serialized_object.pop(key, None) # type: ignore def get_nested_dict_by_path( @@ -383,7 +374,12 @@ def get_next_level_dict_by_key( ): # Appending to list cast(list[SerializedObject], serialization_dict[attr_name]["value"]).append( - {} # type: ignore + { + "value": None, + "type": None, + "doc": None, + "readonly": False, + } ) next_level_serialized_object = cast( list[SerializedObject], serialization_dict[attr_name]["value"] diff --git a/tests/utils/test_serializer.py b/tests/utils/test_serializer.py index 93e7f32..ba7c3e3 100644 --- a/tests/utils/test_serializer.py +++ b/tests/utils/test_serializer.py @@ -21,6 +21,8 @@ from pydase.utils.serializer import ( class MyEnum(enum.Enum): + """MyEnum description""" + RUNNING = "running" FINISHED = "finished" @@ -425,7 +427,7 @@ def test_update_nested_attribute(setup_dict: dict[str, Any]) -> None: def test_update_float_attribute_to_enum(setup_dict: dict[str, Any]) -> None: set_nested_value_by_path(setup_dict, "attr2.attr3", MyEnum.RUNNING) assert setup_dict["attr2"]["value"]["attr3"] == { - "doc": None, + "doc": "MyEnum description", "enum": {"FINISHED": "finished", "RUNNING": "running"}, "readonly": False, "type": "Enum", @@ -471,8 +473,14 @@ def test_update_list_entry(setup_dict: dict[str, SerializedObject]) -> None: def test_update_list_append(setup_dict: dict[str, SerializedObject]) -> None: - set_nested_value_by_path(setup_dict, "attr_list[3]", 20) - assert setup_dict["attr_list"]["value"][3]["value"] == 20 + set_nested_value_by_path(setup_dict, "attr_list[3]", MyEnum.RUNNING) + assert setup_dict["attr_list"]["value"][3] == { + "doc": "MyEnum description", + "enum": {"FINISHED": "finished", "RUNNING": "running"}, + "readonly": False, + "type": "Enum", + "value": "RUNNING", + } def test_update_invalid_list_index(