Initial SFERA platform baseline
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from sir import EdgeKind, NodeKind, SemanticNode, SirSnapshot
|
||||
|
||||
|
||||
class FormSemantics(BaseModel):
|
||||
form: SemanticNode
|
||||
commands: list[SemanticNode] = Field(default_factory=list)
|
||||
elements: list[SemanticNode] = Field(default_factory=list)
|
||||
command_handlers: dict[str, SemanticNode] = Field(default_factory=dict)
|
||||
|
||||
|
||||
def form_semantics(snapshot: SirSnapshot) -> list[FormSemantics]:
|
||||
nodes = {node.lineage_id: node for node in snapshot.nodes}
|
||||
forms = {
|
||||
node.lineage_id: FormSemantics(form=node)
|
||||
for node in snapshot.nodes
|
||||
if node.kind == NodeKind.FORM
|
||||
}
|
||||
for edge in snapshot.edges:
|
||||
form = forms.get(edge.source_lineage)
|
||||
target = nodes.get(edge.target_lineage)
|
||||
if form is None or target is None:
|
||||
continue
|
||||
if edge.kind == EdgeKind.HAS_COMMAND:
|
||||
form.commands.append(target)
|
||||
elif edge.kind == EdgeKind.HAS_ELEMENT:
|
||||
form.elements.append(target)
|
||||
command_to_form = {
|
||||
command.lineage_id: form
|
||||
for form in forms.values()
|
||||
for command in form.commands
|
||||
}
|
||||
for edge in snapshot.edges:
|
||||
if edge.kind != EdgeKind.HANDLES:
|
||||
continue
|
||||
form = command_to_form.get(edge.source_lineage)
|
||||
handler = nodes.get(edge.target_lineage)
|
||||
if form is not None and handler is not None:
|
||||
form.command_handlers[edge.source_lineage] = handler
|
||||
return sorted(forms.values(), key=lambda item: item.form.qualified_name)
|
||||
|
||||
|
||||
__all__ = ["FormSemantics", "form_semantics"]
|
||||
Reference in New Issue
Block a user