Dataclasses for the data representation

This commit is contained in:
2026-07-23 14:24:53 +02:00
commit 7e99669b31
5 changed files with 482 additions and 0 deletions

124
src/bedit_core/models.py Normal file
View 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