Skip to content

v0.10.0 - Serialization overhaul, public interfaces for stores and link resolvers

Latest

Choose a tag to compare

@github-actions github-actions released this 04 Sep 10:24
· 7 commits to main since this release

MATLAB Versions Tested

This release rebuilds how openMINDS_MATLAB reads metadata and resolves links, opens the store and resolver interfaces to external code, and fixes a long tail of collection and store bugs. A few behaviours change; see Removed and Deprecated before upgrading.

Added

  • A JSON-LD deserializer that mirrors the serializer, so reading and writing follow the same rules. Nodes that cannot be read are reported once, by identifier, rather than failing one at a time (#110).
  • Documents written for any known openMINDS namespace are read, regardless of the active model version (#112).
  • Public extension interfaces: openminds.interface.MetadataStore and openminds.interface.LinkResolver moved out of the internal namespace (#116), and a registered link resolver can be replaced (#117). They are exercised by a mock external backend with its own serializer, deserializer, store and resolver (#118).
  • IsReference=true creates a reference explicitly: Type("id", iri, "IsReference", true) (#133).
  • Interoperability tests against the Python reference implementation (#129), and schema-driven round-trip and golden-fixture tests (#102).

Changed

  • Serialization and link resolution run on a shared graph-traversal core (#108, #111). Resolution terminates on cyclic graphs, respects the link budget whatever order nodes are reached in, unifies references that share an identifier, and keeps the reference identifier when a resolver replaces a node.
  • A folder store saves every node reachable from what it is given, one file each, so the references in the saved files can be followed on load (#131).
  • A reference is never turned into a node. It is not counted by a Collection, gets no file of its own, and stays a reference in every document that links to it across a save and load. isReference is the public query for this (#133).
  • Dates are written as ISO 8601 and read with a UTC offset, and files are read and written as UTF-8 explicitly (#127).
  • The node order in a collection document is deterministic across MATLAB releases (#113).

Deprecated

  • isUnresolved in favour of isReference. It still works and warns once per session (#133).

Removed

  • FolderMetadataStore no longer takes RecursionDepth or IncludeIdentifier. It always writes every linked node and always writes identifiers (#131).
  • Creating an instance with only an https:// id no longer makes it a reference. Use IsReference=true; an id alone makes a node (#133).
  • The unused resolver option of Collection.save (#115).

Fixed

  • Collection.save uses the store passed to it (#115).
  • A collection can be built from several files, an empty collection saves, and a vocabulary IRI inside a string value survives decoding (#127).
  • Controlled-term values are preserved when deserializing (#107), and every element is kept when constructing controlled terms from a struct array (#109).
  • Array handling in Schema.resolve (#106).
  • Property introspection in meta.Type (#103).

Internal

These do not affect v0.9.8 users. Two fix defects introduced earlier in this cycle: the seven findings of the traversal and deserialization review (#130) and decoding controlled instance files through the shared JSON-LD path (#119). The rest is CI: the MATLAB versions tested (#101) and a release step that updates codemeta.json (#85).

All merged pull requests

What's Changed

  • Update MATLAB versions in CI workflow by @ehennestad in #101
  • fix: make collection document node order deterministic by @ehennestad in #113
  • test: add schema-driven round-trip and fixture tests by @ehennestad in #102
  • fix: correct property introspection in meta.Type by @ehennestad in #103
  • fix: correct array handling in Schema.resolve by @ehennestad in #106
  • fix: preserve controlled term values when deserializing by @ehennestad in #107
  • refactor: add graph traversal core and move resolution onto it by @ehennestad in #108
  • fix: keep every element when constructing controlled terms from a struct array by @ehennestad in #109
  • refactor: add a JSON-LD deserializer symmetric with the serializer by @ehennestad in #110
  • refactor: move serialization onto the shared traversal core by @ehennestad in #111
  • feat: read documents written for any known openMINDS namespace by @ehennestad in #112
  • fix: use the store passed to Collection.save and drop the dead resolver option by @ehennestad in #115
  • refactor: promote the extension interfaces out of the internal namespace by @ehennestad in #116
  • feat: allow replacing a registered link resolver by @ehennestad in #117
  • test: exercise the extension points with a mock external backend by @ehennestad in #118
  • fix: decode controlled instance files through the shared JSON-LD path by @ehennestad in #119
  • fix: collection, store, encoding and date regressions by @ehennestad in #127
  • test: interoperability with the Python reference implementation by @ehennestad in #129
  • fix: resolve the seven open defects from the traversal and deserialization review by @ehennestad in #130
  • fix: save every linked node from a folder store, one file each by @ehennestad in #131
  • fix: keep references as references, and create them explicitly by @ehennestad in #133
  • Add codemeta.json update step to prepare-release workflow by @ehennestad with @Copilot in #85

Contributors

@ehennestad, with Claude (Anthropic) as co-author on most of the commits in this release, working through Claude Code. Review, design decisions and merges were human.

Full Changelog: v0.9.8...v0.10.0