26 commits since v0.5.3. Validated as v0.5.4-rc1 against schema-automator and dm-bip before release; this ships the identical tree.
Heads up: enum expressions now respect --unrestricted-eval
Enum expressions were bypassing the --unrestricted-eval gate, evaluating unrestricted even when the flag was absent. They now route through the gated path like every other expression.
This can turn a previously-working spec into a failure. If you have enum expressions that need unrestricted evaluation, they were silently getting it before and now require the flag explicitly. That's the intended behaviour — the gate exists so unrestricted evaluation is always a deliberate choice — but it is a behaviour change rather than a pure fix, so it is worth checking before you upgrade.
Python 3.14
The <3.14 upper cap on requires-python is gone. It was conservative rather than a real incompatibility — the full dependency tree resolves and the suite passes on 3.14. Downstream packages that support 3.14 could not install a valid linkml-map before this.
New: columnar output formats
map-data can now write Parquet and DuckDB directly:
linkml-map map-data -T transform.yaml -s schema.yaml \
--source-type Person -o agents.parquet data/Person.tsvUnlike TSV and CSV, these preserve nested structure — a nested object becomes a STRUCT column and a list of them STRUCT[], so consumers read nested fields with a column access instead of a join. DuckDB output writes one table per run (--table-name, defaulting to the file stem), so repeated runs against one path build up a database covering several target classes. Both work as -O targets alongside a text primary output.
No new dependency: duckdb was already required by the join engine.
Fixes
-q/--quietwas unusable. Declared withoutis_flag=True, so click treated it as value-taking and it swallowed the following argument —linkml-map -q map-data ...consumedmap-dataand printed the group help instead of running anything.jsonschemais now declared. It is imported at runtime byvalidator.pybut was only resolving transitively throughlinkml.- Clearer error for comprehension variables.
[c.code for c in codes]reportedunknown 'c' ... Typo or stale reference?, sending you after a typo that did not exist. It now names the real cause and points atclass_derivations. ucumvertheld at 0.2.x while Python 3.10 is supported; 0.3 requirespint>=0.25, which is 3.11+.
Deprecations
The function-based stream writers still work but now emit DeprecationWarning. map-data uses a single writer stack whether or not -O was passed. You may see new warnings without having changed anything.
Internal
Substantial cleanup that should not be user-visible: ~750 lines of unreferenced source removed, the per-row join fallback given real coverage (it had never once been exercised with an actual join), mock-based unit-conversion tests replaced with end-to-end ones, and the pivot, unit-conversion and spec-normalizer blocks extracted out of oversized modules. A ReferenceValidator is now cached in _shape_normalize. The compliance doc generates reproducibly and is drift-checked in CI.
Full changelog: v0.5.3...v0.5.4