Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/boring_semantic_layer/serialization/extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ def _extract_semantic_table(op, context: BSLSerializationContext) -> dict[str, A
metadata["calc_measures"] = calc_data
if op.name:
metadata["name"] = op.name
if op.description:
metadata["description"] = op.description
return metadata


Expand Down
1 change: 1 addition & 0 deletions src/boring_semantic_layer/serialization/reconstruct.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ def _reconstruct_table():
measures=measures,
calc_measures=calc_measures,
name=metadata.get("name"),
description=metadata.get("description"),
)


Expand Down
24 changes: 24 additions & 0 deletions src/boring_semantic_layer/tests/test_xorq_convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,30 @@ def test_to_xorq_returns_xorq_expr():
assert hasattr(tagged_expr, "op")


@pytest.mark.skipif(not xorq, reason="xorq not available")
def test_descriptions_roundtrip_to_tagged_from_tagged():
"""Model, dimension, and measure descriptions survive to_tagged → from_tagged."""
import ibis

from boring_semantic_layer import SemanticModel
from boring_semantic_layer.ops import Dimension, Measure

table = ibis.memtable({"a": [1, 2, 3], "b": [4, 5, 6]})
model = SemanticModel(
table=table,
dimensions={"a": Dimension(expr=lambda t: t.a, description="The A dim")},
measures={"sum_b": Measure(expr=lambda t: t.b.sum(), description="Sum of B")},
name="m",
description="Top-level model description",
)

restored = from_tagged(to_tagged(model))

assert restored.description == "Top-level model description"
assert restored.get_dimensions()["a"].description == "The A dim"
assert restored.get_measures()["sum_b"].description == "Sum of B"


@pytest.mark.skipif(not xorq, reason="xorq not available")
def test_from_xorq_returns_bsl_expr():
from xorq.api import memtable
Expand Down
Loading