#2888: Add ConfigSchema to Application class.
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
# © Crown-owned copyright 2024, Defence Science and Technology Laboratory UK
|
# © Crown-owned copyright 2024, Defence Science and Technology Laboratory UK
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from abc import abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Any, ClassVar, Dict, Optional, Set, Type
|
from typing import Any, ClassVar, Dict, Optional, Set, Type
|
||||||
|
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from primaite.interface.request import RequestFormat, RequestResponse
|
from primaite.interface.request import RequestFormat, RequestResponse
|
||||||
from primaite.simulator.core import RequestManager, RequestPermissionValidator, RequestType
|
from primaite.simulator.core import RequestManager, RequestPermissionValidator, RequestType
|
||||||
from primaite.simulator.system.software import IOSoftware, SoftwareHealthState
|
from primaite.simulator.system.software import IOSoftware, SoftwareHealthState
|
||||||
@@ -27,6 +29,7 @@ class Application(IOSoftware):
|
|||||||
|
|
||||||
Applications are user-facing programs that may perform input/output operations.
|
Applications are user-facing programs that may perform input/output operations.
|
||||||
"""
|
"""
|
||||||
|
config: "Application.ConfigSchema"
|
||||||
|
|
||||||
operating_state: ApplicationOperatingState = ApplicationOperatingState.CLOSED
|
operating_state: ApplicationOperatingState = ApplicationOperatingState.CLOSED
|
||||||
"The current operating state of the Application."
|
"The current operating state of the Application."
|
||||||
@@ -44,6 +47,11 @@ class Application(IOSoftware):
|
|||||||
_registry: ClassVar[Dict[str, Type["Application"]]] = {}
|
_registry: ClassVar[Dict[str, Type["Application"]]] = {}
|
||||||
"""Registry of application types. Automatically populated when subclasses are defined."""
|
"""Registry of application types. Automatically populated when subclasses are defined."""
|
||||||
|
|
||||||
|
class ConfigSchema(BaseModel, ABC):
|
||||||
|
"""Config Schema for Application class."""
|
||||||
|
|
||||||
|
type: str
|
||||||
|
|
||||||
def __init_subclass__(cls, identifier: str = "default", **kwargs: Any) -> None:
|
def __init_subclass__(cls, identifier: str = "default", **kwargs: Any) -> None:
|
||||||
"""
|
"""
|
||||||
Register an application type.
|
Register an application type.
|
||||||
@@ -59,6 +67,21 @@ class Application(IOSoftware):
|
|||||||
raise ValueError(f"Tried to define new application {identifier}, but this name is already reserved.")
|
raise ValueError(f"Tried to define new application {identifier}, but this name is already reserved.")
|
||||||
cls._registry[identifier] = cls
|
cls._registry[identifier] = cls
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_config(cls, config: Dict) -> "Application":
|
||||||
|
"""Create an application from a config dictionary.
|
||||||
|
|
||||||
|
:param config: dict of options for application components constructor
|
||||||
|
:type config: dict
|
||||||
|
:return: The application component.
|
||||||
|
:rtype: Application
|
||||||
|
"""
|
||||||
|
if config["type"] not in cls._registry:
|
||||||
|
raise ValueError(f"Invalid Application type {config['type']}")
|
||||||
|
application_class = cls._registry[config["type"]]
|
||||||
|
application_object = application_class(config=application_class.ConfigSchema(**config))
|
||||||
|
return application_object
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user