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" 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( 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, + } + }