Skip to content

v0.8.2

Latest

Choose a tag to compare

@github-actions github-actions released this 10 Jun 02:22

Added

  • mrrc.StaleFieldError (subclass of MrrcException), raised when a field
    handle is used after fields were removed from its record.
  • Coverage-guided fuzz targets for the JSON (parse_json, parse_marcjson),
    MARCXML (parse_marcxml), MODS (parse_mods), and MARC-8 (decode_marc8)
    read paths, run nightly alongside the existing binary-MARC targets.
  • CI and .cargo/check.sh now run stubtest to verify mrrc/_mrrc.pyi
    matches the compiled extension, preventing type-stub drift.
  • A documentation-build check runs on pull requests that touch docs/,
    mkdocs.yml, or the Python sources the API reference is generated from, so a
    broken docs build is caught before merge instead of only on the main deploy.
    The docs build now uses mkdocs build --strict everywhere (PR check, deploy,
    and .cargo/check.sh), turning broken links and unresolved mkdocstrings
    references into errors.
  • A process-label lint (in .cargo/check.sh and CI) fails the build when
    source, tests, or non-CHANGELOG docs embed implementation-process labels
    (bead IDs, PR/issue numbers, or release-tagged claims like "since 0.8.1"),
    which belong in git history and the CHANGELOG instead.

Changed

  • The Python API reference is now generated from source with mkdocstrings
    instead of hand-maintained signature tables, so it cannot drift from the
    code. The page also gained reference sections for the query DSL
    (FieldQuery, TagRangeQuery, SubfieldPatternQuery,
    SubfieldValueQuery) and the parallel-processing classes.
  • Documentation fixes: the BIBFRAME-to-MARC guide example now uses the real
    RdfGraph.parse(...) API (it previously referenced a nonexistent
    BibframeGraph.from_turtle), and docstring examples are fenced so they
    render as code blocks rather than leaking headings into the reference.
  • Reader option arguments (recovery_mode, validation_level, max_errors)
    are now keyword-only on MARCReader, AuthorityMARCReader, and
    HoldingsMARCReader, matching the documented signatures; pass them by name.
    The record source remains the first positional argument.
  • The mrrc/_mrrc.pyi type stubs now match the compiled extension exactly:
    missing members were added and entries absent at runtime were removed, so
    stub-driven type checking reflects the real API.
  • CI PR workflows add cancel-in-progress concurrency groups and per-job
    timeouts, skip the heavy wheel and benchmark jobs on Dependabot pull requests
    (lint, tests, and semver still run), and share one rust-cache configuration
    across the Rust compile jobs.
  • Documentation now states explicitly that CSV and Dublin Core are write-only
    (export) formats: both are lossy projections of a MARC record, so MRRC emits
    them but does not parse them back into MARC.
  • Documentation no longer presents specific throughput figures or pymarc
    multipliers as current measurements; early benchmark results are summarized
    with the caveat that they need re-measurement, and the benchmark docs now
    describe the measurement infrastructure and the procedure for producing
    citable numbers.
  • The Python CodSpeed CI job now runs in simulation mode (previously walltime),
    making PR performance-regression detection deterministic on hosted runners.
    Parallel-throughput benchmarks (Python and Rust) are excluded from CodSpeed,
    since Valgrind serializes threads; they remain runnable locally via pytest
    and criterion.
  • CI Windows jobs are pinned to windows-2025 (previously windows-latest)
    ahead of GitHub's 2026-06-15 redirect of that label to a new image.
  • Pull requests now build and test a slim wheel matrix (8 jobs) instead of the
    full 30; the full os × python matrix still runs on push to main and on
    release tags. The standalone Rust build.yml workflow is removed; its
    examples-compile step moved into the test workflow, and cross-OS core
    compilation remains covered by the maturin wheel matrix. .cargo/check.sh
    gains a --release flag to build the Python extension in release mode for
    perf-sensitive debugging.
  • Continuous integration trims redundant work: the Python pull-request
    benchmark matrix (pytest-benchmark across five Python versions) is dropped
    in favor of the CodSpeed regression gate, CHANGELOG linting now runs in CI,
    and commits that touch only .beads/** no longer trigger the test, benchmark,
    wheel, and lint workflows.
  • .cargo/check.sh now compiles examples/ and benchmarks (cargo bench --no-run) in its full pre-push run, catching breakage that previously
    surfaced only in CI.

Removed

  • The Python Record.fields_by_tag(tag) method. Use the pymarc-standard
    get_fields(tag), which returns the same live-handle fields for a data tag
    and also accepts multiple tags and control (00X) tags. The Rust
    Record::fields_by_tag is unchanged.

Fixed

  • Record.remove_field(field) now removes exactly the given field instead of
    every field sharing its tag, matching pymarc; detached fields match by value
    and raise ValueError when absent. remove_field/remove_fields with a
    control tag now remove the control field (previously a silent no-op).
    fields() now enumerates repeated control tags (006/007) identically to
    get_fields(). (#248)
  • Python in-place field edits now persist to the record, matching pymarc.
    Fields obtained from a record (record[tag], get_field, get_fields,
    fields) are live handles: indicator and subfield edits, and control-field
    .data assignment, write through to the record. (#241)
  • Corrected documentation to match the current API. The Rust API-reference
    "Key Methods" tables now use real method names, distinguish public fields
    from methods, and show accurate return types; the AuthorityRecord /
    HoldingsRecord examples use the real ::builder(leader) API. Several Rust
    and Python tutorial/reference examples were fixed (query DSL types,
    subfields_by_code, error matching, batch parsing, get_fields for
    pymarc-style access, record.leader()). Removed documentation for MARC-8
    output, which is not supported — MRRC writes UTF-8. Reported by @acdha.

Dependencies

  • Bump ruff from 0.15.12 to 0.15.15
  • Bump syrupy from 5.1.0 to 5.3.1
  • Bump pyright from 1.1.409 to 1.1.410
  • Bump astral-sh/setup-uv from 7 to 8.1.0
  • Bump CodSpeedHQ/action from 4 to 4.17.0
  • Bump actions/checkout from 6 to 6.0.3
  • Bump codecov/codecov-action from 6 to 6.0.1