mirror of
https://github.com/tiqi-group/pydase.git
synced 2025-04-22 17:10:02 +02:00
moves state manager from DataService to Server
This commit is contained in:
parent
f852dea9e5
commit
75a69204b5
@ -6,7 +6,6 @@ from typing import TYPE_CHECKING, Any, Optional
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from pydase.data_service.callback_manager import CallbackManager
|
from pydase.data_service.callback_manager import CallbackManager
|
||||||
from pydase.data_service.data_service import DataService
|
from pydase.data_service.data_service import DataService
|
||||||
from pydase.data_service.state_manager import StateManager
|
|
||||||
from pydase.data_service.task_manager import TaskManager
|
from pydase.data_service.task_manager import TaskManager
|
||||||
|
|
||||||
|
|
||||||
@ -14,6 +13,5 @@ class AbstractDataService(ABC):
|
|||||||
__root__: DataService
|
__root__: DataService
|
||||||
_task_manager: TaskManager
|
_task_manager: TaskManager
|
||||||
_callback_manager: CallbackManager
|
_callback_manager: CallbackManager
|
||||||
_state_manager: Optional[StateManager]
|
|
||||||
_autostart_tasks: dict[str, tuple[Any]]
|
_autostart_tasks: dict[str, tuple[Any]]
|
||||||
_filename: Optional[str]
|
_filename: Optional[str]
|
||||||
|
@ -43,7 +43,6 @@ class DataService(rpyc.Service, AbstractDataService):
|
|||||||
self._filename: Optional[str] = filename
|
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: Optional[StateManager] = None
|
|
||||||
|
|
||||||
if not hasattr(self, "_autostart_tasks"):
|
if not hasattr(self, "_autostart_tasks"):
|
||||||
self._autostart_tasks = {}
|
self._autostart_tasks = {}
|
||||||
@ -56,10 +55,6 @@ class DataService(rpyc.Service, AbstractDataService):
|
|||||||
self.__check_instance_classes()
|
self.__check_instance_classes()
|
||||||
self._initialised = True
|
self._initialised = True
|
||||||
|
|
||||||
if self._filename is not None:
|
|
||||||
self._state_manager = StateManager(self)
|
|
||||||
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
|
||||||
if not isinstance(getattr(type(self), __name, None), property):
|
if not isinstance(getattr(type(self), __name, None), property):
|
||||||
@ -135,11 +130,9 @@ class DataService(rpyc.Service, AbstractDataService):
|
|||||||
"""
|
"""
|
||||||
Serialize the DataService instance and write it to a JSON file.
|
Serialize the DataService instance and write it to a JSON file.
|
||||||
|
|
||||||
Args:
|
|
||||||
filename (str): The name of the file to write to.
|
|
||||||
"""
|
"""
|
||||||
if self._state_manager is not None:
|
if hasattr(self, "_state_manager"):
|
||||||
self._state_manager.save_state()
|
getattr(self, "_state_manager").save_state()
|
||||||
|
|
||||||
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
|
||||||
|
@ -5,6 +5,7 @@ import signal
|
|||||||
import threading
|
import threading
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
from pathlib import Path
|
||||||
from types import FrameType
|
from types import FrameType
|
||||||
from typing import Any, Optional, Protocol, TypedDict
|
from typing import Any, Optional, Protocol, TypedDict
|
||||||
|
|
||||||
@ -158,15 +159,13 @@ class Server:
|
|||||||
web_port: int = 8001,
|
web_port: int = 8001,
|
||||||
enable_rpc: bool = True,
|
enable_rpc: bool = True,
|
||||||
enable_web: bool = True,
|
enable_web: bool = True,
|
||||||
|
filename: Optional[str | Path] = None,
|
||||||
use_forking_server: bool = False,
|
use_forking_server: bool = False,
|
||||||
web_settings: dict[str, Any] = {},
|
web_settings: dict[str, Any] = {},
|
||||||
additional_servers: list[AdditionalServer] = [],
|
additional_servers: list[AdditionalServer] = [],
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> None:
|
) -> None:
|
||||||
self._service = service
|
self._service = service
|
||||||
if self._service._state_manager is None:
|
|
||||||
self._service._state_manager = StateManager(self._service)
|
|
||||||
self._service._state_manager.load_state()
|
|
||||||
self._host = host
|
self._host = host
|
||||||
self._rpc_port = rpc_port
|
self._rpc_port = rpc_port
|
||||||
self._web_port = web_port
|
self._web_port = web_port
|
||||||
@ -191,6 +190,10 @@ class Server:
|
|||||||
"additional_servers": [],
|
"additional_servers": [],
|
||||||
**kwargs,
|
**kwargs,
|
||||||
}
|
}
|
||||||
|
self._state_manager = StateManager(self._service, filename)
|
||||||
|
if self._service._filename is not None:
|
||||||
|
self._service._state_manager = self._state_manager
|
||||||
|
self._state_manager.load_state()
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
"""
|
"""
|
||||||
@ -275,6 +278,7 @@ class Server:
|
|||||||
self._wapi: WebAPI = WebAPI(
|
self._wapi: WebAPI = WebAPI(
|
||||||
service=self._service,
|
service=self._service,
|
||||||
info=self._info,
|
info=self._info,
|
||||||
|
state_manager=self._state_manager,
|
||||||
**self._kwargs,
|
**self._kwargs,
|
||||||
)
|
)
|
||||||
web_server = uvicorn.Server(
|
web_server = uvicorn.Server(
|
||||||
@ -326,9 +330,9 @@ class Server:
|
|||||||
async def shutdown(self) -> None:
|
async def shutdown(self) -> None:
|
||||||
logger.info("Shutting down")
|
logger.info("Shutting down")
|
||||||
|
|
||||||
logger.info(f"Saving data to {self._service._filename}.")
|
logger.info(f"Saving data to {self._state_manager.filename}.")
|
||||||
if self._service._state_manager is not None:
|
if self._state_manager is not None:
|
||||||
self._service._state_manager.save_state()
|
self._state_manager.save_state()
|
||||||
|
|
||||||
await self.__cancel_servers()
|
await self.__cancel_servers()
|
||||||
await self.__cancel_tasks()
|
await self.__cancel_tasks()
|
||||||
|
@ -9,6 +9,7 @@ from fastapi.responses import FileResponse
|
|||||||
from fastapi.staticfiles import StaticFiles
|
from fastapi.staticfiles import StaticFiles
|
||||||
|
|
||||||
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__
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -50,6 +51,7 @@ class WebAPI:
|
|||||||
def __init__( # noqa: CFQ002
|
def __init__( # noqa: CFQ002
|
||||||
self,
|
self,
|
||||||
service: DataService,
|
service: DataService,
|
||||||
|
state_manager: StateManager,
|
||||||
frontend: str | Path | None = None,
|
frontend: str | Path | None = None,
|
||||||
css: str | Path | None = None,
|
css: str | Path | None = None,
|
||||||
enable_CORS: bool = True,
|
enable_CORS: bool = True,
|
||||||
@ -58,6 +60,7 @@ class WebAPI:
|
|||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
):
|
):
|
||||||
self.service = service
|
self.service = service
|
||||||
|
self.state_manager = state_manager
|
||||||
self.frontend = frontend
|
self.frontend = frontend
|
||||||
self.css = css
|
self.css = css
|
||||||
self.enable_CORS = enable_CORS
|
self.enable_CORS = enable_CORS
|
||||||
@ -114,11 +117,7 @@ class WebAPI:
|
|||||||
|
|
||||||
@app.get("/service-properties")
|
@app.get("/service-properties")
|
||||||
def service_properties() -> dict[str, Any]:
|
def service_properties() -> dict[str, Any]:
|
||||||
if self.service._state_manager is not None:
|
return self.state_manager.cache.cache
|
||||||
return self.service._state_manager.cache
|
|
||||||
else:
|
|
||||||
logger.error("Exposed service does not have a state manager.")
|
|
||||||
return {}
|
|
||||||
|
|
||||||
# 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