Dataclasses for the data representation
This commit is contained in:
124
src/bedit_core/models.py
Normal file
124
src/bedit_core/models.py
Normal file
@@ -0,0 +1,124 @@
|
||||
from __future__ import annotations
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
from typing import Any, Annotated
|
||||
from uuid import uuid4
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class ID:
|
||||
value: str = field(default_factory=lambda: str(uuid4()))
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
if not isinstance(self.value, str):
|
||||
raise TypeError("ID value must be a string")
|
||||
if not self.value:
|
||||
raise ValueError("ID value cannot be empty")
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.value
|
||||
|
||||
class ComponentID(ID):
|
||||
pass
|
||||
|
||||
class ConnectionID(ID):
|
||||
pass
|
||||
|
||||
class ParameterID(ID):
|
||||
pass
|
||||
|
||||
class PortID(ID):
|
||||
pass
|
||||
|
||||
class SignalDirection(Enum):
|
||||
INPUT = "input"
|
||||
OUTPUT = "output"
|
||||
|
||||
class BondCausality(Enum):
|
||||
NONE = "none"
|
||||
EFFORT_OUT = "effort_out"
|
||||
FLOW_OUT = "flow_out"
|
||||
|
||||
class PortCausality(Enum):
|
||||
INDIFFERENT = "indifferent"
|
||||
FIXED_EFFORT_OUT = "fixed_effort_out"
|
||||
FIXED_FLOW_OUT = "fixed_flow_out"
|
||||
PREFERRED_EFFORT_OUT = "preferred_effort_out"
|
||||
PREFERRED_FLOW_OUT = "preferred_flow_out"
|
||||
LIKES_EFFORT_OUT = "likes_effort_out"
|
||||
LIKES_FLOW_OUT = "likes_flow_out"
|
||||
|
||||
@dataclass
|
||||
class Document:
|
||||
format_version: int
|
||||
id: ID
|
||||
name: str
|
||||
root: dict[ComponentID, Component]
|
||||
metadata: dict[str, Any] | None = None
|
||||
|
||||
@dataclass
|
||||
class Component:
|
||||
name: str
|
||||
interface: Interface
|
||||
parameters: dict[ParameterID, Parameter]
|
||||
implementation: GraphImplementation | EquationImplementation
|
||||
|
||||
@dataclass
|
||||
class Interface:
|
||||
ports: dict[PortID, Port] = field(default_factory=dict)
|
||||
|
||||
@dataclass
|
||||
class Port:
|
||||
name: str
|
||||
direction: SignalDirection
|
||||
multiplicity: bool = False
|
||||
matrix_size: Annotated[list[int], 2] = field(default_factory=lambda: [1, 1])
|
||||
description: str | None = None
|
||||
|
||||
@dataclass
|
||||
class SignalPort(Port):
|
||||
value_type: str = "Real"
|
||||
quantity: str | None = None
|
||||
unit: str | None = None
|
||||
|
||||
@dataclass
|
||||
class BondPort(Port):
|
||||
domain: str = ""
|
||||
causality_preference: PortCausality = PortCausality.INDIFFERENT
|
||||
|
||||
@dataclass
|
||||
class Parameter:
|
||||
name: str
|
||||
value: Any = 1.0
|
||||
value_type: str = "Real"
|
||||
quantity: str | None = None
|
||||
unit: str | None = None
|
||||
description: str | None = None
|
||||
|
||||
@dataclass
|
||||
class GraphImplementation:
|
||||
graph: Graph
|
||||
|
||||
@dataclass
|
||||
class EquationImplementation:
|
||||
declarations: list[str] = field(default_factory=list)
|
||||
initial_equations: list[str] = field(default_factory=list)
|
||||
equations: list[str] = field(default_factory=list)
|
||||
|
||||
@dataclass
|
||||
class Graph:
|
||||
components: dict[ComponentID, Component] = field(default_factory=dict)
|
||||
connections: dict[ConnectionID, Connection] = field(default_factory=dict)
|
||||
|
||||
@dataclass
|
||||
class Connection:
|
||||
source: PortID
|
||||
target: PortID
|
||||
|
||||
@dataclass
|
||||
class SignalConnection(Connection):
|
||||
pass
|
||||
|
||||
@dataclass
|
||||
class BondConnection(Connection):
|
||||
causality: BondCausality = BondCausality.NONE
|
||||
undesired: bool = False
|
||||
Reference in New Issue
Block a user