Initial SFERA platform baseline

This commit is contained in:
2026-05-16 19:03:49 +03:00
commit 3b845c8fce
282 changed files with 55045 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
from sir import SirDelta
def test_delta_defaults():
delta = SirDelta(delta_id="delta.1", snapshot_from="a", snapshot_to="b")
assert delta.added_nodes == []
assert delta.updated_nodes == []
assert delta.removed_nodes == []
+15
View File
@@ -0,0 +1,15 @@
from sir import NodeKind, SemanticNode, SirSnapshot, SourceRef, compute_snapshot_hash
def test_snapshot_hash_deterministic_ignores_created_at():
node = SemanticNode(
semantic_id="module.demo",
lineage_id="lineage.module.demo",
kind=NodeKind.MODULE,
name="Module",
qualified_name="Module",
source_ref=SourceRef(source_path="module.bsl"),
)
a = SirSnapshot(snapshot_id="snapshot.demo", project_id="demo", nodes=[node])
b = SirSnapshot(snapshot_id="snapshot.demo", project_id="demo", nodes=[node])
assert compute_snapshot_hash(a) == compute_snapshot_hash(b)
+17
View File
@@ -0,0 +1,17 @@
from sir import NodeKind, SemanticNode, SirSnapshot, SourceRef, snapshot_from_json, snapshot_to_json
def test_snapshot_serialization_roundtrip():
node = SemanticNode(
semantic_id="module.demo",
lineage_id="lineage.module.demo",
kind=NodeKind.MODULE,
name="Module",
qualified_name="Module",
source_ref=SourceRef(source_path="module.bsl"),
)
snapshot = SirSnapshot(snapshot_id="snapshot.demo", project_id="demo", nodes=[node])
data = snapshot_to_json(snapshot)
restored = snapshot_from_json(data)
assert restored.snapshot_id == snapshot.snapshot_id
assert restored.nodes[0].lineage_id == node.lineage_id
@@ -0,0 +1,51 @@
import pytest
from sir import EdgeKind, NodeKind, SemanticEdge, SemanticNode, SirSnapshot, SourceRef
from sir import SnapshotValidationError, validate_snapshot
def make_nodes():
module = SemanticNode(
semantic_id="module.demo",
lineage_id="lineage.module.demo",
kind=NodeKind.MODULE,
name="Module",
qualified_name="Module",
source_ref=SourceRef(source_path="module.bsl"),
)
procedure = SemanticNode(
semantic_id="procedure.posting",
lineage_id="lineage.procedure.posting",
kind=NodeKind.PROCEDURE,
name="Проведение",
qualified_name="Module.Проведение",
source_ref=SourceRef(source_path="module.bsl"),
)
return module, procedure
def test_snapshot_validation_ok():
module, procedure = make_nodes()
edge = SemanticEdge(
edge_id="edge.declares.1",
kind=EdgeKind.DECLARES,
source_lineage=module.lineage_id,
target_lineage=procedure.lineage_id,
)
snapshot = SirSnapshot(
snapshot_id="snapshot.demo", project_id="demo", nodes=[module, procedure], edges=[edge]
)
validate_snapshot(snapshot)
def test_snapshot_validation_dangling_edge():
module, _procedure = make_nodes()
edge = SemanticEdge(
edge_id="edge.bad.1",
kind=EdgeKind.CALLS,
source_lineage=module.lineage_id,
target_lineage="lineage.missing",
)
snapshot = SirSnapshot(snapshot_id="snapshot.demo", project_id="demo", nodes=[module], edges=[edge])
with pytest.raises(SnapshotValidationError):
validate_snapshot(snapshot)