Skip to content

Commit f089931

Browse files
authored
feat(py)!: enable Model as default BINARY envelope format (#2317)
- Makes default binary config MODEL_WITH_EXTS with default zstd compression - Validates tests against default text and binary configs - Skips Value Function tests (not supported by model and intended to be removed in core) Closes #2305 BREAKING CHANGE: `EnvelopeConfig::BINARY` now uses the model binary encoding. BREAKING CHANGE: `EnvelopeFormat.MODULE` is now `EnvelopeFormat.MODEL`. `EnvelopeFormat.MODULE_WITH_EXTS` is now `EnvelopeFormat.MODEL_WITH_EXTS`
1 parent d21b43a commit f089931

File tree

3 files changed

+13
-12
lines changed

3 files changed

+13
-12
lines changed

hugr-py/src/hugr/envelope.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ def make_envelope(package: Package | Hugr, config: EnvelopeConfig) -> bytes:
6565
# `make_envelope_str`, but we prioritize speed for binary formats.
6666
payload = json_str.encode("utf-8")
6767

68-
case EnvelopeFormat.MODULE:
68+
case EnvelopeFormat.MODEL:
6969
payload = bytes(package.to_model())
7070

71-
case EnvelopeFormat.MODULE_WITH_EXTS:
71+
case EnvelopeFormat.MODEL_WITH_EXTS:
7272
package_bytes = bytes(package.to_model())
7373
extension_str = json.dumps(
7474
[ext._to_serial().model_dump(mode="json") for ext in package.extensions]
@@ -105,7 +105,7 @@ def read_envelope(envelope: bytes) -> Package:
105105
match header.format:
106106
case EnvelopeFormat.JSON:
107107
return ext_s.Package.model_validate_json(payload).deserialize()
108-
case EnvelopeFormat.MODULE | EnvelopeFormat.MODULE_WITH_EXTS:
108+
case EnvelopeFormat.MODEL | EnvelopeFormat.MODEL_WITH_EXTS:
109109
msg = "Decoding HUGR envelopes in MODULE format is not supported yet."
110110
raise ValueError(msg)
111111

@@ -150,10 +150,10 @@ def read_envelope_hugr_str(envelope: str) -> Hugr:
150150
class EnvelopeFormat(Enum):
151151
"""Format used to encode a HUGR envelope."""
152152

153-
MODULE = 1
154-
"""A capnp-encoded hugr-module."""
155-
MODULE_WITH_EXTS = 2
156-
"""A capnp-encoded hugr-module, immediately followed by a json-encoded
153+
MODEL = 1
154+
"""A capnp-encoded hugr-model."""
155+
MODEL_WITH_EXTS = 2
156+
"""A capnp-encoded hugr-model, immediately followed by a json-encoded
157157
extension registry."""
158158
JSON = 63 # '?' in ASCII
159159
"""A json-encoded hugr-package. This format is ASCII-printable."""
@@ -232,4 +232,4 @@ def _make_header(self) -> EnvelopeHeader:
232232
# Set EnvelopeConfig's class variables.
233233
# These can only be initialized _after_ the class is defined.
234234
EnvelopeConfig.TEXT = EnvelopeConfig(format=EnvelopeFormat.JSON, zstd=None)
235-
EnvelopeConfig.BINARY = EnvelopeConfig(format=EnvelopeFormat.JSON, zstd=None)
235+
EnvelopeConfig.BINARY = EnvelopeConfig(format=EnvelopeFormat.MODEL_WITH_EXTS, zstd=0)

hugr-py/tests/conftest.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,12 @@ def validate(
146146
snapshot: A hugr render snapshot. If not None, it will be compared against the
147147
rendered HUGR. Pass `--snapshot-update` to pytest to update the snapshot file.
148148
"""
149-
# TODO: Use envelopes instead of legacy hugr-json
150149
cmd = [*_base_command(), "validate", "-"]
151150

152-
serial = h.to_bytes(EnvelopeConfig.BINARY)
153-
_run_hugr_cmd(serial, cmd)
151+
# validate text and binary formats
152+
for fmt in (EnvelopeConfig.TEXT, EnvelopeConfig.BINARY):
153+
serial = h.to_bytes(fmt)
154+
_run_hugr_cmd(serial, cmd)
154155

155156
if not roundtrip:
156157
return

hugr-py/tests/test_hugr_build.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ def test_ancestral_sibling():
215215
@pytest.mark.parametrize(
216216
"val",
217217
[
218-
val.Function(simple_id().hugr),
219218
val.Sum(1, tys.Sum([[INT_T], [tys.Bool, INT_T]]), [val.TRUE, IntVal(34)]),
220219
val.Tuple(val.TRUE, IntVal(23)),
221220
],
@@ -346,6 +345,7 @@ def test_invalid_recursive_function() -> None:
346345
f_recursive.set_outputs(f_recursive.input_node[0])
347346

348347

348+
@pytest.mark.skip("Value::Function is deprecated and not supported by model encoding.")
349349
def test_higher_order(snapshot) -> None:
350350
noop_fn = Dfg(tys.Qubit)
351351
noop_fn.set_outputs(noop_fn.add(ops.Noop()(noop_fn.input_node[0])))

0 commit comments

Comments
 (0)