Skip to content

v0.3.0: No cracks in this rock 🪨

Choose a tag to compare

@github-actions github-actions released this 24 Jun 12:08
· 46 commits to main since this release
Immutable release. Only release title and notes can be modified.
4571093

🪨 We went looking for cracks, and fixed them.

YAMLRocks now passes the complete official YAML test suite (after we found we missed a bunch 🙈): every case loads, round-trips, and matches its canonical JSON, with no baseline to quietly absorb a regression.

To get there and stay there, we built a differential fuzzer that re-emits a document under every formatting option and checks it loads back unchanged. It promptly found a string of subtle, silent-corruption bugs in the scanner and emitter (block scalars, indentless sequences, tagged nodes, plain-scalar line wrapping). They are all fixed and pinned with tests, exactly the bug class a "rock-solid" library cannot ship.

Loading got leaner along the way: doomed number parses are skipped, plain scalars are trimmed in one pass instead of per byte, and scalar text now moves straight out of the event stream with no throwaway copy.

New this release: you can delete keys from round-trip documents (thanks @pdecat for #59), and there are wheels for Python 3.15, both the standard and free-threaded builds.

pip install yamlrocks

📚 Docs: https://yaml.rocks

Same rock. Fewer cracks. 🪨

../Frenck

                       

Blogging my personal ramblings at frenck.dev

What's changed

✨ New features

  • ✨ Support key deletion on round-trip documents and views @pdecat (#59)

🐛 Bug fixes

  • 🐛 Decode escaped tabs in double-quoted scalars @frenck (#80)
  • 🐛 Reject tabs that indent block collections, accept tabs that separate scalars @frenck (#82)
  • 🐛 Fix empty block scalars and reject tab indentation in scalars @frenck (#83)
  • 🐛 Reject a directive that does not start a document @frenck (#84)
  • 🐛 Support compact block mappings and sequences as explicit keys @frenck (#86)
  • 🐛 Clear the speculative simple key after a block scalar @frenck (#93)
  • 🐛 Keep an empty indentless sequence entry before a sibling key @frenck (#96)
  • 🐛 Wrap long plain scalars by quoting, not unsafe plain folding @frenck (#95)
  • 🐛 Indent a tagged sequence under its tag in indentless mode @frenck (#97)

🚀 Enhancements

  • ♻️ Share the single- and double-quoted scalar fetch tail @frenck (#89)
  • ⚡ Skip doomed numeric parses and the merge pass on common loads @frenck (#90)
  • ⚡ Trim plain-scalar trailing blanks after the scan, not per byte @frenck (#91)
  • ⚡ Move scalar text out of events during decode, dropping the pre-pass @frenck (#92)

🧰 Maintenance

  • ✅ Cover yaml-test-suite case variants in the compliance harness @frenck (#81)
  • ✅ Assert full YAML test suite compliance without a baseline @frenck (#88)
  • ✅ Add an emit-options differential fuzz target @frenck (#98)
  • 👷 Give the coverage job more address-space headroom @frenck (#99)
  • 👷 Build Python 3.15 wheels (GIL and free-threaded) on native legs @frenck (#101)

📚 Documentation

  • 📝 State full YAML test suite compliance and document compact block keys @frenck (#87)
  • 📝 Drop the stale scalar-string side table note from the decode fuzz docs @frenck (#94)

⬆️ Dependency updates

33 changes