feat: adding support for enums

- handling fronend upates
- adding serialization for DataService classes
- adapting notification emission
This commit is contained in:
Mose Müller 2023-08-02 12:06:20 +02:00
parent f30cd15d3f
commit e48e33c948
3 changed files with 21 additions and 1 deletions

View File

@ -1,6 +1,7 @@
import asyncio import asyncio
import inspect import inspect
from collections.abc import Callable from collections.abc import Callable
from enum import Enum
from itertools import chain from itertools import chain
from typing import Any from typing import Any
@ -517,6 +518,15 @@ class DataService(rpyc.Service):
"readonly": prop.fset is None, "readonly": prop.fset is None,
"doc": inspect.getdoc(prop), "doc": inspect.getdoc(prop),
} }
elif isinstance(value, Enum):
result[key] = {
"type": "Enum",
"value": value.name,
"enum": {
name: member.value
for name, member in value.__class__.__members__.items()
},
}
else: else:
result[key] = { result[key] = {
"type": type(value).__name__, "type": type(value).__name__,

View File

@ -3,6 +3,7 @@ import os
import signal import signal
import threading import threading
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from enum import Enum
from types import FrameType from types import FrameType
from typing import Any, Optional from typing import Any, Optional
@ -147,7 +148,11 @@ class Server:
"data": { "data": {
"parent_path": parent_path, "parent_path": parent_path,
"name": name, "name": name,
"value": value, "value": value.name
if isinstance(
value, Enum
) # enums are not JSON serializable
else value,
} }
}, },
) )

View File

@ -1,3 +1,4 @@
from enum import Enum
from pathlib import Path from pathlib import Path
from typing import Any, TypedDict from typing import Any, TypedDict
@ -55,6 +56,10 @@ class WebAPI:
attr = getattr(self.service, data["name"]) attr = getattr(self.service, data["name"])
if isinstance(attr, DataService): if isinstance(attr, DataService):
attr.apply_updates(data["value"]) attr.apply_updates(data["value"])
elif isinstance(attr, Enum):
setattr(
self.service, data["name"], attr.__class__[data["value"]["value"]]
)
else: else:
setattr(self.service, data["name"], data["value"]) setattr(self.service, data["name"], data["value"])