From 06bf5fb53961617eb276b5400ac7fd65965623c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Tue, 10 Oct 2023 12:18:13 +0200 Subject: [PATCH 1/3] fix: serializing enum properties --- src/pydase/data_service/data_service.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/pydase/data_service/data_service.py b/src/pydase/data_service/data_service.py index 57882c4..36d45e5 100644 --- a/src/pydase/data_service/data_service.py +++ b/src/pydase/data_service/data_service.py @@ -309,16 +309,6 @@ class DataService(rpyc.Service, AbstractDataService): "readonly": True, "value": running_task_info, } - elif isinstance(getattr(self.__class__, key, None), property): - prop: property = getattr(self.__class__, key) - result[key] = { - "type": type(value).__name__, - "value": value - if not isinstance(value, u.Quantity) - else {"magnitude": value.m, "unit": str(value.u)}, - "readonly": prop.fset is None, - "doc": get_attribute_doc(prop), - } elif isinstance(value, Enum): result[key] = { "type": "Enum", @@ -340,6 +330,11 @@ class DataService(rpyc.Service, AbstractDataService): "doc": get_attribute_doc(value), } + if isinstance(getattr(self.__class__, key, None), property): + prop: property = getattr(self.__class__, key) + result[key]["readonly"] = prop.fset is None + result[key]["doc"] = get_attribute_doc(prop) + return result def update_DataService_attribute( From 5f64ec131c8922291d88775c2b7b714393cbe0f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Tue, 10 Oct 2023 12:29:45 +0200 Subject: [PATCH 2/3] feat: adding enum_serialize test --- tests/data_service/test_data_service.py | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/data_service/test_data_service.py diff --git a/tests/data_service/test_data_service.py b/tests/data_service/test_data_service.py new file mode 100644 index 0000000..8d08a3c --- /dev/null +++ b/tests/data_service/test_data_service.py @@ -0,0 +1,64 @@ +from enum import Enum + +import pydase + + +def test_enum_serialize() -> None: + class EnumClass(Enum): + FOO = "foo" + BAR = "bar" + + class EnumAttribute(pydase.DataService): + def __init__(self) -> None: + self.some_enum = EnumClass.FOO + super().__init__() + + class EnumPropertyWithoutSetter(pydase.DataService): + def __init__(self) -> None: + self._some_enum = EnumClass.FOO + super().__init__() + + @property + def some_enum(self) -> EnumClass: + return self._some_enum + + class EnumPropertyWithSetter(pydase.DataService): + def __init__(self) -> None: + self._some_enum = EnumClass.FOO + super().__init__() + + @property + def some_enum(self) -> EnumClass: + return self._some_enum + + @some_enum.setter + def some_enum(self, value: EnumClass) -> None: + self._some_enum = value + + assert EnumAttribute().serialize() == { + "some_enum": { + "type": "Enum", + "value": "FOO", + "enum": {"FOO": "foo", "BAR": "bar"}, + "readonly": False, + "doc": None, + } + } + assert EnumPropertyWithoutSetter().serialize() == { + "some_enum": { + "type": "Enum", + "value": "FOO", + "enum": {"FOO": "foo", "BAR": "bar"}, + "readonly": True, + "doc": None, + } + } + assert EnumPropertyWithSetter().serialize() == { + "some_enum": { + "type": "Enum", + "value": "FOO", + "enum": {"FOO": "foo", "BAR": "bar"}, + "readonly": False, + "doc": None, + } + } From 6fe30fc6ecd884b78a671c956e9d9ddcab787d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Tue, 10 Oct 2023 12:31:43 +0200 Subject: [PATCH 3/3] update version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 62bb2fd..4c8df5f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pydase" -version = "0.1.0" +version = "0.1.1" description = "A flexible and robust Python library for creating, managing, and interacting with data services, with built-in support for web and RPC servers, and customizable features for diverse use cases." authors = ["Mose Mueller "] readme = "README.md"