From 7405d2cafc5ff7d3a42e78379a89ffac84721628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Wed, 27 Mar 2024 16:26:24 +0100 Subject: [PATCH] adds serialization module, moves types into separate file --- src/pydase/utils/serialization/__init__.py | 0 src/pydase/utils/serialization/types.py | 113 +++++++++++++++++++ src/pydase/utils/serializer.py | 123 +++------------------ 3 files changed, 131 insertions(+), 105 deletions(-) create mode 100644 src/pydase/utils/serialization/__init__.py create mode 100644 src/pydase/utils/serialization/types.py diff --git a/src/pydase/utils/serialization/__init__.py b/src/pydase/utils/serialization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/pydase/utils/serialization/types.py b/src/pydase/utils/serialization/types.py new file mode 100644 index 0000000..19b84da --- /dev/null +++ b/src/pydase/utils/serialization/types.py @@ -0,0 +1,113 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Any, Literal, TypedDict + +if TYPE_CHECKING: + import pydase.units as u + +logger = logging.getLogger(__name__) + + +class SignatureDict(TypedDict): + parameters: dict[str, dict[str, Any]] + return_annotation: dict[str, Any] + + +class SerializedObjectBase(TypedDict): + full_access_path: str + doc: str | None + readonly: bool + + +class SerializedInteger(SerializedObjectBase): + value: int + type: Literal["int"] + + +class SerializedFloat(SerializedObjectBase): + value: float + type: Literal["float"] + + +class SerializedQuantity(SerializedObjectBase): + value: u.QuantityDict + type: Literal["Quantity"] + + +class SerializedBool(SerializedObjectBase): + value: bool + type: Literal["bool"] + + +class SerializedString(SerializedObjectBase): + value: str + type: Literal["str"] + + +class SerializedEnum(SerializedObjectBase): + name: str + value: str + type: Literal["Enum", "ColouredEnum"] + enum: dict[str, Any] + + +class SerializedList(SerializedObjectBase): + value: list[SerializedObject] + type: Literal["list"] + + +class SerializedDict(SerializedObjectBase): + value: dict[str, SerializedObject] + type: Literal["dict"] + + +class SerializedNoneType(SerializedObjectBase): + value: None + type: Literal["NoneType"] + + +SerializedMethod = TypedDict( + "SerializedMethod", + { + "full_access_path": str, + "value": Literal["RUNNING"] | None, + "type": Literal["method"], + "doc": str | None, + "readonly": bool, + "async": bool, + "signature": SignatureDict, + "frontend_render": bool, + }, +) + + +class SerializedException(SerializedObjectBase): + name: str + value: str + type: Literal["Exception"] + + +DataServiceTypes = Literal["DataService", "Image", "NumberSlider", "DeviceConnection"] + + +class SerializedDataService(SerializedObjectBase): + name: str + value: dict[str, SerializedObject] + type: DataServiceTypes + + +SerializedObject = ( + SerializedBool + | SerializedFloat + | SerializedInteger + | SerializedString + | SerializedList + | SerializedDict + | SerializedNoneType + | SerializedMethod + | SerializedException + | SerializedDataService + | SerializedEnum + | SerializedQuantity +) diff --git a/src/pydase/utils/serializer.py b/src/pydase/utils/serializer.py index 7a22c12..2aede1f 100644 --- a/src/pydase/utils/serializer.py +++ b/src/pydase/utils/serializer.py @@ -4,7 +4,7 @@ import inspect import logging import sys from enum import Enum -from typing import TYPE_CHECKING, Any, Literal, TypedDict, cast +from typing import TYPE_CHECKING, Any, Literal, cast import pydase.units as u from pydase.data_service.abstract_data_service import AbstractDataService @@ -16,6 +16,23 @@ from pydase.utils.helpers import ( parse_list_attr_and_index, render_in_frontend, ) +from pydase.utils.serialization.types import ( + DataServiceTypes, + SerializedBool, + SerializedDataService, + SerializedDict, + SerializedEnum, + SerializedException, + SerializedFloat, + SerializedInteger, + SerializedList, + SerializedMethod, + SerializedNoneType, + SerializedObject, + SerializedQuantity, + SerializedString, + SignatureDict, +) if TYPE_CHECKING: from collections.abc import Callable @@ -35,110 +52,6 @@ class SerializationValueError(Exception): pass -class SignatureDict(TypedDict): - parameters: dict[str, dict[str, Any]] - return_annotation: dict[str, Any] - - -class SerializedObjectBase(TypedDict): - full_access_path: str - doc: str | None - readonly: bool - - -class SerializedInteger(SerializedObjectBase): - value: int - type: Literal["int"] - - -class SerializedFloat(SerializedObjectBase): - value: float - type: Literal["float"] - - -class SerializedQuantity(SerializedObjectBase): - value: u.QuantityDict - type: Literal["Quantity"] - - -class SerializedBool(SerializedObjectBase): - value: bool - type: Literal["bool"] - - -class SerializedString(SerializedObjectBase): - value: str - type: Literal["str"] - - -class SerializedEnum(SerializedObjectBase): - name: str - value: str - type: Literal["Enum", "ColouredEnum"] - enum: dict[str, Any] - - -class SerializedList(SerializedObjectBase): - value: list[SerializedObject] - type: Literal["list"] - - -class SerializedDict(SerializedObjectBase): - value: dict[str, SerializedObject] - type: Literal["dict"] - - -class SerializedNoneType(SerializedObjectBase): - value: None - type: Literal["NoneType"] - - -SerializedMethod = TypedDict( - "SerializedMethod", - { - "full_access_path": str, - "value": Literal["RUNNING"] | None, - "type": Literal["method"], - "doc": str | None, - "readonly": bool, - "async": bool, - "signature": SignatureDict, - "frontend_render": bool, - }, -) - - -class SerializedException(SerializedObjectBase): - name: str - value: str - type: Literal["Exception"] - - -DataServiceTypes = Literal["DataService", "Image", "NumberSlider", "DeviceConnection"] - - -class SerializedDataService(SerializedObjectBase): - name: str - value: dict[str, SerializedObject] - type: DataServiceTypes - - -SerializedObject = ( - SerializedBool - | SerializedFloat - | SerializedInteger - | SerializedString - | SerializedList - | SerializedDict - | SerializedNoneType - | SerializedMethod - | SerializedException - | SerializedDataService - | SerializedEnum - | SerializedQuantity -) - - class Serializer: @staticmethod def serialize_object(obj: Any, access_path: str = "") -> SerializedObject: