diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38b0bb9..96a1da3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a8bb52..77dd4ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/docs/support.md b/docs/support.md index e4fcdc8..7ca0cd1 100644 --- a/docs/support.md +++ b/docs/support.md @@ -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 @@ -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 diff --git a/docs/versioning.md b/docs/versioning.md index 320cc75..9969168 100644 --- a/docs/versioning.md +++ b/docs/versioning.md @@ -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. | diff --git a/examples/14_arithmetic_operations.py b/examples/14_arithmetic_operations.py index efe2987..1282d1f 100644 --- a/examples/14_arithmetic_operations.py +++ b/examples/14_arithmetic_operations.py @@ -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. diff --git a/pyproject.toml b/pyproject.toml index b6f8efb..4f36177 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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" @@ -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 @@ -96,7 +96,7 @@ 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}" @@ -104,7 +104,7 @@ repair-wheel-command = "DYLD_LIBRARY_PATH=$HOME/wirelog-install/lib delocate-whe [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}" diff --git a/tests/data/wirelog_abi.txt b/tests/data/wirelog_abi.txt index 8a25372..3381a71 100644 --- a/tests/data/wirelog_abi.txt +++ b/tests/data/wirelog_abi.txt @@ -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 diff --git a/tests/docs/test_support_matrix.py b/tests/docs/test_support_matrix.py index 5f22b0a..ebe28b3 100644 --- a/tests/docs/test_support_matrix.py +++ b/tests/docs/test_support_matrix.py @@ -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"] @@ -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 @@ -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 diff --git a/tests/docs/test_versioning_contract.py b/tests/docs/test_versioning_contract.py index 4090766..0c2e0b7 100644 --- a/tests/docs/test_versioning_contract.py +++ b/tests/docs/test_versioning_contract.py @@ -12,7 +12,7 @@ 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" @@ -20,7 +20,8 @@ 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: @@ -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") diff --git a/tests/integration/test_examples.py b/tests/integration/test_examples.py index 37db03d..452eecf 100644 --- a/tests/integration/test_examples.py +++ b/tests/integration/test_examples.py @@ -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,)] diff --git a/tests/test_changelog_format.py b/tests/test_changelog_format.py index db7ca52..61f0ead 100644 --- a/tests/test_changelog_format.py +++ b/tests/test_changelog_format.py @@ -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(): diff --git a/tests/test_ci_workflow.py b/tests/test_ci_workflow.py index 9c548ee..b3f43e2 100644 --- a/tests/test_ci_workflow.py +++ b/tests/test_ci_workflow.py @@ -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():