simplifies serializer logic

This commit is contained in:
Mose Müller 2024-03-06 18:50:50 +01:00
parent a88a0c6133
commit 51ffd8be4d
2 changed files with 27 additions and 23 deletions

View File

@ -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"]

View File

@ -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(