Skip to content
Closed
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
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ jobs:
python: ["3.11", "3.12", "3.13", "3.14"]
env:
# WIRELOG_VERSION here is the exact wirelog ref CI builds against.
# The default is pinned to the wirelog v0.60.0 release commit;
# The default is pinned to the wirelog v0.62.0 release commit;
# override the repository variable to test another ref before
# updating this fallback.
WIRELOG_VERSION: ${{ vars.WIRELOG_VERSION || '300f3e5150095c85331b561f1f42d99c27b4746f' }}
WIRELOG_VERSION: ${{ vars.WIRELOG_VERSION || '39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c' }}
# `runner.temp` is NOT available in job-level `env:` (only in
# step-level contexts) — using it here caused the whole workflow
# to fail at startup (#114). `github.workspace` IS resolvable at
Expand Down
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,27 @@ wirelog floor and a validated wirelog ref (see

## [Unreleased]

### Changed
- The bundled and validated wirelog ref moves from `v0.60.0` to
`v0.62.0` at peeled SHA
`39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c`.
- The minimum compatible runtime wirelog version remains `0.52.0`.
PyreWire's public API is unchanged. wirelog 0.62.0 exposes
`wirelog_program_get_plan_error()`, which PyreWire records in its ABI
smoke manifest but does not wrap yet.
- Wheels now bundle the wirelog 0.62.0 engine. The bump picks up
wirelog's session memory-budget admission, bounded CSV staging,
resumable keyed-join sub-batches, memory-ledger coverage, and fixes
for incomplete unfused recursive SCC results, early-exit join filter
cleanup, intern-table governor rebinding, memory-governor overflow
reporting, arithmetic precedence, and Darwin threading namespace
collisions.
- wirelog 0.61.0 changed arithmetic precedence from left-associative
evaluation in 0.60.x to conventional operator precedence. This can
change results for expressions such as `A + B * C`; PyreWire's
arithmetic example and integration expectations now document and
account for both behaviors.

## [1.0.6] - 2026-09-05

### Changed
Expand Down
10 changes: 5 additions & 5 deletions docs/support.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Support Matrix

This page documents the supported PyreWire v1.0 installation targets.
This page documents the supported PyreWire v1 installation targets.
It is a release contract, not a list of every platform that might work
from source.

## Python

PyreWire v1.0 supports CPython 3.11, 3.12, 3.13, and 3.14.
PyreWire v1 supports CPython 3.11, 3.12, 3.13, and 3.14.

## Wheels

Expand All @@ -16,11 +16,11 @@ not need to install wirelog separately.
| Platform | Wheel target | Build and test runner | Notes |
| -------- | ------------ | --------------------- | ----- |
| Linux | `manylinux_2_28` `x86_64` | `ubuntu-24.04` | Built with cibuildwheel's manylinux container and repaired with auditwheel. |
| macOS | `arm64` | `macos-15` | Apple Silicon only for v1.0; no macOS Intel or universal2 wheel is produced. |
| macOS | `arm64` | `macos-15` | Apple Silicon only for v1; no macOS Intel or universal2 wheel is produced. |
| Windows | `win_amd64` / `AMD64` | `windows-2025-vs2026` | Built with MSVC and repaired with delvewheel. |

The bundled library is built from wirelog v0.60.0, using peeled SHA
`300f3e5150095c85331b561f1f42d99c27b4746f`.
The bundled library is built from wirelog v0.62.0, using peeled SHA
`39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c`.

## Source Distributions

Expand Down
1 change: 1 addition & 0 deletions docs/versioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ release to publish; it is **not** tied to the wirelog change.

| PyreWire | Minimum wirelog | Validated wirelog ref | Notes |
| --------------- | --------------- | ------------------------------------------ | ----------------------- |
| `current-development` | `0.52.0` | `39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c` | Validated against wirelog `v0.62.0` (peeled tag SHA); runtime minimum remains `0.52.0`. Wheels built from this branch bundle v0.62.0. wirelog 0.61.0 changed arithmetic from 0.60.x left associativity to conventional precedence, which can change results such as `A + B * C`. PyreWire's public API is unchanged; the new plan-error C accessor is recorded in the ABI smoke manifest but is not wrapped yet. |
| `1.0.0` | `0.44.0` | `272edf3a24b25676f12c4b843d55510f5048dd2f` | Validated against wirelog `v0.50.0` (peeled tag SHA); runtime minimum remains `0.44.0`. |
| `1.0.1` | `0.44.0` | `0c6e0cdaee7db069be5d8d896bb59bdcb15673e9` | Validated against wirelog `v0.51.0` (peeled tag SHA); runtime minimum remains `0.44.0`. Bundled engine bumped to pick up the wirelog#914 single-body-rule derivation fix (#165). |
| `1.0.2` | `0.44.0` | `0c6e0cdaee7db069be5d8d896bb59bdcb15673e9` | Validated against wirelog `v0.51.0` (peeled tag SHA); runtime minimum remains `0.44.0`. PyreWire-only maintenance release (CI action bumps, SPDX headers, docs); no engine change. |
Expand Down
8 changes: 4 additions & 4 deletions examples/14_arithmetic_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@

Two behaviors are easy to misread and are demonstrated deliberately:

- Arithmetic parses left-associatively. `A + B * C` means `(A + B) * C`,
not the conventional multiplication-first grouping, so the
`precedence` row derives `22` rather than `14`. Use explicit
intermediate relations when conventional grouping is needed.
- Wirelog 0.60.x evaluates arithmetic chains left-to-right, so
`A + B * C` means `(A + B) * C` and the `precedence` row derives `22`.
Starting with wirelog 0.61.0, conventional precedence applies:
`A + B * C` means `A + (B * C)` and the row derives `14`.
- The typed float ingress canonicalizes `-0.0` and `+0.0` to the same
`+0.0` value, so the two `zero_input` facts collapse to one row.

Expand Down
8 changes: 4 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ test-requires = ["pytest", "pytest-cov"]
before-build = "python {project}/scripts/bundle_libwirelog.py"
# Pin the wirelog source ref here too so the environment matches the
# `WIRELOG_VERSION` used by the test-matrix workflow.
environment = { WIRELOG_VERSION = "300f3e5150095c85331b561f1f42d99c27b4746f" }
environment = { WIRELOG_VERSION = "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c" }

[tool.cibuildwheel.linux]
manylinux-x86_64-image = "manylinux_2_28"
Expand All @@ -83,7 +83,7 @@ before-all = """
pip install meson && \
WIRELOG_PREFIX=/wirelog-install bash {project}/scripts/build_wirelog.sh
"""
environment = { WIRELOG_VERSION = "300f3e5150095c85331b561f1f42d99c27b4746f", WIRELOG_PREFIX = "/wirelog-install", WIRELOG_LIB = "/wirelog-install/lib/libwirelog.so.1", LD_LIBRARY_PATH = "/wirelog-install/lib" }
environment = { WIRELOG_VERSION = "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c", WIRELOG_PREFIX = "/wirelog-install", WIRELOG_LIB = "/wirelog-install/lib/libwirelog.so.1", LD_LIBRARY_PATH = "/wirelog-install/lib" }
# `auditwheel` bundles libwirelog.so.1 into the wheel and patches the
# RPATH (#31). Without this every wheel would ship as a manylinux
# wheel that immediately fails at import time on systems without the
Expand All @@ -96,15 +96,15 @@ before-all = """
brew install ninja meson pkg-config && \
WIRELOG_PREFIX=$HOME/wirelog-install bash {project}/scripts/build_wirelog.sh
"""
environment = { WIRELOG_VERSION = "300f3e5150095c85331b561f1f42d99c27b4746f", WIRELOG_PREFIX = "$HOME/wirelog-install", WIRELOG_LIB = "$HOME/wirelog-install/lib/libwirelog.1.dylib", DYLD_LIBRARY_PATH = "$HOME/wirelog-install/lib" }
environment = { WIRELOG_VERSION = "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c", WIRELOG_PREFIX = "$HOME/wirelog-install", WIRELOG_LIB = "$HOME/wirelog-install/lib/libwirelog.1.dylib", DYLD_LIBRARY_PATH = "$HOME/wirelog-install/lib" }
# `delocate` is macOS's auditwheel equivalent — copies the dylib into
# the wheel and rewrites install names so the bundled copy wins.
repair-wheel-command = "DYLD_LIBRARY_PATH=$HOME/wirelog-install/lib delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}"

[tool.cibuildwheel.windows]
archs = ["AMD64"]
before-all = "powershell {project}\\scripts\\build_wirelog.ps1"
environment = { WIRELOG_VERSION = "300f3e5150095c85331b561f1f42d99c27b4746f", WIRELOG_PREFIX = "C:/wirelog-install", WIRELOG_LIB = "C:/wirelog-install/bin/wirelog-1.dll" }
environment = { WIRELOG_VERSION = "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c", WIRELOG_PREFIX = "C:/wirelog-install", WIRELOG_LIB = "C:/wirelog-install/bin/wirelog-1.dll" }
# `delvewheel` is the Windows analogue. The bundled DLL ends up in
# `pyrewire/_lib/` and the loader (#2) finds it ahead of system paths.
repair-wheel-command = "pip install delvewheel && delvewheel repair -w {dest_dir} --no-mangle-all --add-path C:/wirelog-install/bin {wheel}"
Expand Down
1 change: 1 addition & 0 deletions tests/data/wirelog_abi.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ wirelog_parse_with_error_info
wirelog_program_free
wirelog_program_get_facts
wirelog_program_get_intern
wirelog_program_get_plan_error
wirelog_program_get_rule_count
wirelog_program_get_schema
wirelog_program_get_stratum
Expand Down
5 changes: 3 additions & 2 deletions tests/docs/test_support_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

yaml = pytest.importorskip("yaml")

PINNED_WIRELOG_SHA = "300f3e5150095c85331b561f1f42d99c27b4746f"
PINNED_WIRELOG_SHA = "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c"
SUPPORTED_PYTHONS = ["3.11", "3.12", "3.13", "3.14"]
SUPPORTED_CP_TAGS = ["cp311", "cp312", "cp313", "cp314"]
SUPPORTED_RUNNERS = ["ubuntu-24.04", "macos-15", "windows-2025-vs2026"]
Expand Down Expand Up @@ -46,6 +46,7 @@ def test_support_page_is_linked_from_mkdocs_nav():
def test_readme_installation_links_support_matrix_and_python_contract():
readme = _read("README.md")
assert "[support matrix](docs/support.md)" in readme
assert "v1.0 wheel targets" in readme
assert "CPython 3.11, 3.12, 3.13, or 3.14" in readme
assert "3.10" not in readme

Expand Down Expand Up @@ -122,7 +123,7 @@ def test_support_wirelog_bundle_contract_matches_config_and_versioning():
assert cibw["macos"]["environment"]["WIRELOG_VERSION"] == PINNED_WIRELOG_SHA
assert cibw["windows"]["environment"]["WIRELOG_VERSION"] == PINNED_WIRELOG_SHA

assert "wirelog v0.60.0" in support
assert "wirelog v0.62.0" in support
assert PINNED_WIRELOG_SHA in support
assert "peeled SHA" in support
assert "Wheels bundle" in versioning
Expand Down
17 changes: 15 additions & 2 deletions tests/docs/test_versioning_contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,16 @@
yaml = pytest.importorskip("yaml")

# The wirelog ref the current release bundles and validates against.
PINNED_WIRELOG_SHA = "300f3e5150095c85331b561f1f42d99c27b4746f"
PINNED_WIRELOG_SHA = "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c"
# Historical pins kept frozen in the compatibility table, one per release.
WIRELOG_SHA_100 = "272edf3a24b25676f12c4b843d55510f5048dd2f"
WIRELOG_SHA_101 = "0c6e0cdaee7db069be5d8d896bb59bdcb15673e9"
WIRELOG_SHA_102 = WIRELOG_SHA_101
WIRELOG_SHA_103 = "da82a14a7e1472e33aa6ed753b3bc3dfe28a68ba"
WIRELOG_SHA_104 = "668f82ad69c2bbfc8e8111839302adf1360f55da"
WIRELOG_SHA_105 = "9f80877c82564cb92ea45bd6fffc2d681b0e13de"
WIRELOG_SHA_106 = PINNED_WIRELOG_SHA
WIRELOG_SHA_106 = "300f3e5150095c85331b561f1f42d99c27b4746f"
WIRELOG_SHA_CURRENT_DEVELOPMENT = PINNED_WIRELOG_SHA


def _repo_root() -> Path:
Expand Down Expand Up @@ -98,6 +99,18 @@ def test_versioning_documents_106_wirelog_pin_and_runtime_floor():
assert "peeled tag SHA" in notes


def test_versioning_documents_current_development_wirelog_pin_and_runtime_floor():
minimum, validated_ref, notes = _versioning_row("current-development")

assert minimum == "`0.52.0`"
assert validated_ref == f"`{WIRELOG_SHA_CURRENT_DEVELOPMENT}`"
assert "v0.62.0" in notes
assert "runtime minimum remains `0.52.0`" in notes
assert "peeled tag SHA" in notes
assert "wirelog 0.61.0 changed arithmetic" in notes
assert "which can change results" in notes


def test_versioning_explains_sdist_and_wheel_wirelog_behavior():
text = _read("docs/versioning.md")

Expand Down
18 changes: 13 additions & 5 deletions tests/integration/test_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,19 @@ def test_arithmetic_operations_example_matches_wirelog_golden_output() -> None:
mod = _import_example("14_arithmetic_operations")
out = mod.run()

assert out["result"] == [
("negative", -12, -22, -85, -3, -2, -24),
("positive", 22, 12, 85, 3, 2, 44),
("precedence", 11, 5, 24, 2, 2, 22),
]
if _wirelog_ver() >= (0, 61, 0):
expected_result = [
("negative", -12, -22, -85, -3, -2, -7),
("positive", 22, 12, 85, 3, 2, 27),
("precedence", 11, 5, 24, 2, 2, 14),
]
else:
expected_result = [
("negative", -12, -22, -85, -3, -2, -24),
("positive", 22, 12, 85, 3, 2, 44),
("precedence", 11, 5, 24, 2, 2, 22),
]
assert out["result"] == expected_result
assert out["minimum"] == [(-17,)]
assert out["maximum"] == [(17,)]
assert out["average_value"] == [(2.5,)]
Expand Down
8 changes: 6 additions & 2 deletions tests/test_changelog_format.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,13 @@ def test_changelog_keep_a_changelog_intro_present():
assert "Keep a Changelog" in text


def test_unreleased_section_is_empty_for_100_release():
def test_unreleased_section_records_current_wirelog_pin_change():
changelog = (_repo_root() / "CHANGELOG.md").read_text(encoding="utf-8")
assert _section(changelog, "Unreleased") == "## [Unreleased]"
section = _section(changelog, "Unreleased")

assert "v0.62.0" in section
assert "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c" in section
assert "minimum compatible runtime wirelog version remains `0.52.0`" in section


def test_100_release_notes_include_publishable_contract_facts():
Expand Down
2 changes: 1 addition & 1 deletion tests/test_ci_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def _workflow() -> dict[str, Any]:
def test_ci_default_wirelog_version_is_exact_sha():
env = _workflow()["jobs"]["test"]["env"]
default = str(env["WIRELOG_VERSION"])
assert "300f3e5150095c85331b561f1f42d99c27b4746f" in default
assert "39a57cf3c4cdf02f97df0e951fe8ecea7a831e2c" in default


def test_ci_matrix_drops_python_310():
Expand Down