Skip to content

Commit 6b3e1d1

Browse files
authored
feat: unserializable metadata (#1035)
Signed-off-by: Henry Schreiner <[email protected]>
1 parent 79de128 commit 6b3e1d1

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

src/boost_histogram/serialization/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ def to_uhi(h: histogram.Histogram, /) -> dict[str, Any]:
2626
"storage": _storage_to_dict(h.storage_type(), h.view(flow=True)),
2727
}
2828
if h.metadata is not None:
29-
data["metadata"] = h.metadata
29+
data["metadata"] = {
30+
k: v for k, v in h.metadata.items() if not k.startswith("@")
31+
}
3032

3133
return data
3234

src/boost_histogram/serialization/_axis.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ def _(ax: axis.Regular | axis.Integer, /) -> dict[str, Any]:
5656
if isinstance(ax, axis.Integer):
5757
data["writer_info"] = {"boost-histogram": {"orig_type": "Integer"}}
5858
if ax.metadata is not None:
59-
data["metadata"] = ax.metadata
59+
data["metadata"] = {
60+
k: v for k, v in ax.metadata.items() if not k.startswith("@")
61+
}
6062

6163
return data
6264

@@ -72,7 +74,9 @@ def _(ax: axis.Variable, /) -> dict[str, Any]:
7274
"circular": ax.traits.circular,
7375
}
7476
if ax.metadata is not None:
75-
data["metadata"] = ax.metadata
77+
data["metadata"] = {
78+
k: v for k, v in ax.metadata.items() if not k.startswith("@")
79+
}
7680

7781
return data
7882

@@ -86,7 +90,9 @@ def _(ax: axis.IntCategory, /) -> dict[str, Any]:
8690
"flow": ax.traits.overflow,
8791
}
8892
if ax.metadata is not None:
89-
data["metadata"] = ax.metadata
93+
data["metadata"] = {
94+
k: v for k, v in ax.metadata.items() if not k.startswith("@")
95+
}
9096

9197
return data
9298

@@ -100,19 +106,23 @@ def _(ax: axis.StrCategory, /) -> dict[str, Any]:
100106
"flow": ax.traits.overflow,
101107
}
102108
if ax.metadata is not None:
103-
data["metadata"] = ax.metadata
109+
data["metadata"] = {
110+
k: v for k, v in ax.metadata.items() if not k.startswith("@")
111+
}
104112

105113
return data
106114

107115

108116
@_axis_to_dict.register
109117
def _(ax: axis.Boolean, /) -> dict[str, Any]:
110118
"""Convert a Boolean axis to a dictionary."""
111-
data = {
119+
data: dict[str, Any] = {
112120
"type": "boolean",
113121
}
114122
if ax.metadata is not None:
115-
data["metadata"] = ax.metadata
123+
data["metadata"] = {
124+
k: v for k, v in ax.metadata.items() if not k.startswith("@")
125+
}
116126

117127
return data
118128

tests/test_serialization_uhi.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,13 @@ def test_round_trip_clean() -> None:
235235

236236
assert isinstance(h2.axes[0], bh.axis.Regular)
237237
assert h2.storage_type is bh.storage.Int64
238+
239+
240+
def test_unserializable_metadata() -> None:
241+
h = bh.Histogram(
242+
bh.axis.Integer(0, 10, metadata={"c": 3, "@d": 4}), metadata={"a": 1, "@b": 2}
243+
)
244+
data = to_uhi(h)
245+
246+
assert data["metadata"] == {"a": 1}
247+
assert data["axes"][0]["metadata"] == {"c": 3}

0 commit comments

Comments
 (0)