mirror of
https://github.com/tiqi-group/pydase.git
synced 2025-04-21 00:40:01 +02:00
using StateManger in DataService
This commit is contained in:
parent
b0254daa17
commit
fc7092f14c
@ -1,16 +1,19 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
from typing import TYPE_CHECKING, Any
|
from typing import TYPE_CHECKING, Any, Optional
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .callback_manager import CallbackManager
|
from pydase.data_service.callback_manager import CallbackManager
|
||||||
from .data_service import DataService
|
from pydase.data_service.data_service import DataService
|
||||||
from .task_manager import TaskManager
|
from pydase.data_service.state_manager import StateManager
|
||||||
|
from pydase.data_service.task_manager import TaskManager
|
||||||
|
|
||||||
|
|
||||||
class AbstractDataService(ABC):
|
class AbstractDataService(ABC):
|
||||||
__root__: DataService
|
__root__: DataService
|
||||||
_task_manager: TaskManager
|
_task_manager: TaskManager
|
||||||
_callback_manager: CallbackManager
|
_callback_manager: CallbackManager
|
||||||
|
_state_manager: StateManager
|
||||||
_autostart_tasks: dict[str, tuple[Any]]
|
_autostart_tasks: dict[str, tuple[Any]]
|
||||||
|
_filename: Optional[str]
|
||||||
|
@ -9,6 +9,7 @@ import rpyc
|
|||||||
import pydase.units as u
|
import pydase.units as u
|
||||||
from pydase.data_service.abstract_data_service import AbstractDataService
|
from pydase.data_service.abstract_data_service import AbstractDataService
|
||||||
from pydase.data_service.callback_manager import CallbackManager
|
from pydase.data_service.callback_manager import CallbackManager
|
||||||
|
from pydase.data_service.state_manager import StateManager
|
||||||
from pydase.data_service.task_manager import TaskManager
|
from pydase.data_service.task_manager import TaskManager
|
||||||
from pydase.utils.helpers import (
|
from pydase.utils.helpers import (
|
||||||
convert_arguments_to_hinted_types,
|
convert_arguments_to_hinted_types,
|
||||||
@ -41,8 +42,10 @@ def process_callable_attribute(attr: Any, args: dict[str, Any]) -> Any:
|
|||||||
|
|
||||||
class DataService(rpyc.Service, AbstractDataService):
|
class DataService(rpyc.Service, AbstractDataService):
|
||||||
def __init__(self, filename: Optional[str] = None) -> None:
|
def __init__(self, filename: Optional[str] = None) -> None:
|
||||||
|
self._filename: Optional[str] = filename
|
||||||
self._callback_manager: CallbackManager = CallbackManager(self)
|
self._callback_manager: CallbackManager = CallbackManager(self)
|
||||||
self._task_manager = TaskManager(self)
|
self._task_manager = TaskManager(self)
|
||||||
|
self._state_manager = StateManager(self)
|
||||||
|
|
||||||
if not hasattr(self, "_autostart_tasks"):
|
if not hasattr(self, "_autostart_tasks"):
|
||||||
self._autostart_tasks = {}
|
self._autostart_tasks = {}
|
||||||
@ -51,12 +54,11 @@ class DataService(rpyc.Service, AbstractDataService):
|
|||||||
"""Keep track of the root object. This helps to filter the emission of
|
"""Keep track of the root object. This helps to filter the emission of
|
||||||
notifications."""
|
notifications."""
|
||||||
|
|
||||||
self._filename: Optional[str] = filename
|
|
||||||
|
|
||||||
self._callback_manager.register_callbacks()
|
self._callback_manager.register_callbacks()
|
||||||
self.__check_instance_classes()
|
self.__check_instance_classes()
|
||||||
self._initialised = True
|
self._initialised = True
|
||||||
self._load_values_from_json()
|
|
||||||
|
self._state_manager.load_state()
|
||||||
|
|
||||||
def __setattr__(self, __name: str, __value: Any) -> None:
|
def __setattr__(self, __name: str, __value: Any) -> None:
|
||||||
# converting attributes that are not properties
|
# converting attributes that are not properties
|
||||||
@ -129,15 +131,6 @@ class DataService(rpyc.Service, AbstractDataService):
|
|||||||
# allow all other attributes
|
# allow all other attributes
|
||||||
setattr(self, name, value)
|
setattr(self, name, value)
|
||||||
|
|
||||||
def _load_values_from_json(self) -> None:
|
|
||||||
if self._filename is not None:
|
|
||||||
# Check if the file specified by the filename exists
|
|
||||||
if os.path.exists(self._filename):
|
|
||||||
with open(self._filename, "r") as f:
|
|
||||||
# Load JSON data from file and update class attributes with these
|
|
||||||
# values
|
|
||||||
self.load_DataService_from_JSON(cast(dict[str, Any], json.load(f)))
|
|
||||||
|
|
||||||
def write_to_file(self) -> None:
|
def write_to_file(self) -> None:
|
||||||
"""
|
"""
|
||||||
Serialize the DataService instance and write it to a JSON file.
|
Serialize the DataService instance and write it to a JSON file.
|
||||||
@ -145,14 +138,8 @@ class DataService(rpyc.Service, AbstractDataService):
|
|||||||
Args:
|
Args:
|
||||||
filename (str): The name of the file to write to.
|
filename (str): The name of the file to write to.
|
||||||
"""
|
"""
|
||||||
if self._filename is not None:
|
if self._state_manager is not None:
|
||||||
with open(self._filename, "w") as f:
|
self._state_manager.save_state()
|
||||||
json.dump(self.serialize(), f, indent=4)
|
|
||||||
else:
|
|
||||||
logger.error(
|
|
||||||
f"Class {self.__class__.__name__} was not initialised with a filename. "
|
|
||||||
'Skipping "write_to_file"...'
|
|
||||||
)
|
|
||||||
|
|
||||||
def load_DataService_from_JSON(self, json_dict: dict[str, Any]) -> None:
|
def load_DataService_from_JSON(self, json_dict: dict[str, Any]) -> None:
|
||||||
# Traverse the serialized representation and set the attributes of the class
|
# Traverse the serialized representation and set the attributes of the class
|
||||||
|
@ -17,6 +17,7 @@ from uvicorn.server import HANDLED_SIGNALS
|
|||||||
|
|
||||||
import pydase.units as u
|
import pydase.units as u
|
||||||
from pydase import DataService
|
from pydase import DataService
|
||||||
|
from pydase.data_service.state_manager import StateManager
|
||||||
from pydase.version import __version__
|
from pydase.version import __version__
|
||||||
|
|
||||||
from .web_server import WebAPI
|
from .web_server import WebAPI
|
||||||
@ -323,8 +324,8 @@ class Server:
|
|||||||
logger.info("Shutting down")
|
logger.info("Shutting down")
|
||||||
|
|
||||||
logger.info(f"Saving data to {self._service._filename}.")
|
logger.info(f"Saving data to {self._service._filename}.")
|
||||||
if self._service._filename is not None:
|
if self._service._state_manager is not None:
|
||||||
self._service.write_to_file()
|
self._service._state_manager.save_state()
|
||||||
|
|
||||||
await self.__cancel_servers()
|
await self.__cancel_servers()
|
||||||
await self.__cancel_tasks()
|
await self.__cancel_tasks()
|
||||||
|
@ -114,7 +114,7 @@ class WebAPI:
|
|||||||
|
|
||||||
@app.get("/service-properties")
|
@app.get("/service-properties")
|
||||||
def service_properties() -> dict[str, Any]:
|
def service_properties() -> dict[str, Any]:
|
||||||
return self.service.serialize()
|
return self.service._state_manager.cache
|
||||||
|
|
||||||
# exposing custom.css file provided by user
|
# exposing custom.css file provided by user
|
||||||
if self.css is not None:
|
if self.css is not None:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user