Skip to content

v0.1.2

Choose a tag to compare

@github-actions github-actions released this 26 Jul 10:48

Added

  • A single data-driven conformance expectation suite. conformance/ holds redistributable
    matrices — every literal, every formula, and the value a recorded oracle saved for it — and
    the normal workspace test run reconstructs every matrix and compares CellRune's calculation
    against the oracle. New functions and syntax extend the same data set.
    The first matrix is the Apache POI FormulaEvalTestData corpus (Apache-2.0): 1,295 cases
    against a saved Microsoft Excel 2013 calculation cache, 1,290 matching within a
    scale-relative 1e-8 and 5 divergences documented case by case. A documented divergence is
    enforced in both directions, so neither the oracle side nor the CellRune side of it can drift
    silently, and a divergence without an explanatory note fails the test. An extraction tool
    (extract_conformance_matrix) accepts ordinary and resolved shared formulas and rejects
    workbook metadata the v1 matrix cannot reproduce.
  • A semver invariant inside the existing test suite (tests/public_api.rs). The sixteen exported
    enums that are not non_exhaustive are matched without wildcard arms with every variant
    payload bound at its exact type, and function-pointer constants pin the positional signatures
    of WorkbookSnapshot::new_with_metadata and the monomorphic read → calculate → write entry
    points. This remains one test as the API grows.

Changed

  • Rust dependency requirements now declare the oldest API-compatible, advisory-clean versions
    instead of using the release that happened to be newest when each manifest was edited. All
    workspace requirements live in the root manifest, the lockfile still selects the reproducible
    current graph, and every release family a broad range admits is exercised by the floor or the
    newest-compatible suite. Fifteen of the twenty external workspace floors moved down; five
    remain at their current releases because they are the first secure version or belong to the
    same release family (quick-xml, PyO3 and its build helper, and calamine), or because their
    types appear in CellRune's public signatures and a public dependency must stay within one
    semver family (cap-std). The fuzz crate's libfuzzer-sys stays exact-pinned as a tool
    input: its graph is excluded from the workspace and always built --locked, so no suite
    could exercise a range there.
  • The conformance/ fixtures now live in binding-contract/, which is what they are: a
    cross-binding API behavior contract exercised by the Rust interop, Python, and Node test
    suites. Two 1 KB fixtures cannot carry an Excel conformance claim, so the conformance/ name
    is reserved for the Excel expectation suite that can.
  • The nightly sanitizer campaign remains one job over four stable trust boundaries. It records
    every target's result before failing, so one crash cannot starve later campaigns and new
    functions do not create new fuzz jobs.
  • The MSRV check covers --all-targets rather than --lib, so tests, benches, and the
    extraction tool must also build on the declared floor.
  • The 50k benchmark is demoted from a scheduled nightly job and a required release gate to an
    explicit observational command, documented in CONTRIBUTING.md, and its output-verifier
    script is removed with the jobs. Release gates are deliberately limited to stable validation
    boundaries that guard irreversible failures; the benchmark keeps its internal correctness
    assertions, and functional correctness remains covered by the generated-workbook tests.
  • Release publish jobs are re-run safe. The crates.io, npm, and GitHub-release jobs probe for
    what is already live and skip it — the GitHub release also counts its attached bundles, so an
    interrupted asset upload is completed rather than skipped — and the PyPI upload passes
    skip-existing. A rerun of a partially published tag therefore converges on fully published
    instead of ending red: the final runs of both prior releases stayed red because their
    already-published registries could only fail again or be rejected by hand.

Fixed

  • A workbook containing an empty sheet was rejected with xlsx.invalid_worksheet. Excel and
    every mainstream producer serialize an empty sheet as a self-closing <sheetData/>, which
    the reader's required-sheetData rule did not recognize as the element's empty form, so even a
    brand-new workbook saved by Excel failed to open. Empty sheets now read as sheets with no
    cells; a duplicated <sheetData/> is still rejected.

Documentation

  • The README carries a Verification section: the public conformance-suite numbers with their
    exact oracle, and the private-audit results (Excel for Mac 16.111 corpus recalculation,
    14-workbook full-span audits, the 250k-formula timing, and the 4-of-4 producer matrix) with
    their provenance and non-distribution stated.