Skip to content

Releases: scikit-build/dynamic-metadata

Version 0.5.0

Choose a tag to compare

@henryiii henryiii released this 04 Jul 02:42
a83114c

Feature release adding four new bundled plugins and the backend collection loops.

✨ Features

  • ast plugin (#81) — read a module-level global by name from a Python file via ast.literal_eval, without importing it. Values keep their Python shape, so list/table fields can be filled directly (not just strings).
  • pin_installed plugin (#80) — pin dependencies to build-environment versions using templates like "torch==x.x.*" (x = installed release component, x+N, trailing *). Implements dynamic_wheel (dependencies are Dynamic in the SDist) and get_requires_for_dynamic_metadata (the bare package names).
  • from_file plugin (#82) — fill a field from a file: stripped contents for a string field, requirements.txt-style lines for a list field, or a dotted key (optional-dependencies.test) for a table field, one entry per key. pip option lines (-r, …) are a hard error.
  • Backend collection loops in the loader (#78) — loader.py now provides get_requires_for_dynamic_metadata(entries) and dynamic_wheel_fields(entries), so backends get the METADATA 2.2 dynamic set and extra build requirements from one place. Both load providers fresh, keeping dynamic_wheel stateless.

📚 Docs

  • Add a scikit-build-core migration guide (#79).

Full Changelog: v0.4.0...v0.5.0

Version 0.4.0

Version 0.4.0 Pre-release
Pre-release

Choose a tag to compare

@henryiii henryiii released this 01 Jul 18:57
aa989ef

First feature release since the reference implementation landed. Development status is still Alpha — the protocol is still subject to change.

⚠️ Breaking changes

  • Providers are discovered via entry points (#74). provider now takes one of two shapes: a name registered in the dynamic_metadata.provider entry-point group (bundled plugins use dynamic_metadata.-prefixed names), or an inline { path, module } table for a local in-project plugin. This replaces the old import-path + provider-path scheme — there is no bare-import fallback, and a name registered by two distributions is a hard error. Unknown names raise with a "did you mean …?" suggestion.

✨ Features

  • dynamic-metadata show CLI (#69) — preview the resolved [project] table as JSON, mirroring scikit-build-core's build project-table. Also runs as python -m dynamic_metadata; --pyproject-toml and --state select the input file and build state.
  • fragment and substitute plugins (#71) — build a readme (or other text field) from pieces, the hatch-fancy-pypi-readme feature set expressed as one ordered entry per fragment. readme_fragment appends literal or file-sliced fragments; substitute runs re.sub over a scalar field produced by an earlier entry.
  • static plugin (#72) — return settings verbatim as a [project] fragment, for feeding a transform pipeline a dynamic value or hiding metadata from tools that read [project] directly.
  • Opt-in format setting on substitute (#73) — lets replacement reference other fields via {project[...]}, gated behind a format boolean so existing replacements with literal braces are unaffected.

🧹 Refactors

  • Move the plugin protocols into a leaf protocols.py so loader.py stays focused on loading and resolution (#76).

📚 Docs

  • Split the backend-authors page into "use the loader" vs "reimplement the loader" (#75); document custom plugins with the local provider form (#70); trim prose and modernize the loader examples (#77).

📦 Packaging & CI

  • Update pre-commit hooks (#68).

Full Changelog: v0.3.0...v0.4.0

v0.3.0

v0.3.0 Pre-release
Pre-release

Choose a tag to compare

@henryiii henryiii released this 29 Jun 18:55
6eeb4b6

First substantive release of the dynamic-metadata plugin spec and reference implementation. Development status is Alpha — the protocol is still subject to change.

⚠️ Breaking changes

  • Plugins are now configured as an ordered list of providers (#59). [tool.dynamic-metadata] is an ordered array of tables, [[tool.dynamic-metadata]], each with a provider (module or module:Class) and optional provider-path. Entries run in order, and a later entry can read an earlier one's results.

✨ Features

  • Mix static and dynamic metadata (PEP 808) (#57) — fields can be partially static and extended dynamically; lists append, tables add keys (add-only).
  • Build-state hook (#58) — providers can receive the current build state via the optional build_state hook before dynamic_metadata runs.
  • get_requires_for_dynamic_metadata hook (#30) — providers can declare extra build-time requirements.

🐛 Fixes

  • Load provider-path providers via a meta-path finder (#56).
  • Reject unknown plugin settings and correct the provider protocol (#55).
  • Add missing dict-of-str fields to the taxonomy (#37); pull in fixes from scikit-build-core (#39).

🧹 Refactors

  • Simplify the [project] field taxonomy (#61).
  • Remove the setuptools_scm and fancy_pypi_readme wrapper plugins, leaving the bundled regex and template plugins (#67).

📦 Packaging & CI

  • Switch the build backend to flit-core and add check-sdist (#66).
  • Test and classify against Python 3.8–3.15, including 3.14 (#65, #40).

📚 Docs

  • Split the README into per-audience Sphinx pages (users / plugin authors / backend authors) and expand the backend-authors guide (#62, #64); modernize the Read the Docs build (#63).

Full Changelog: v0.1.0...v0.3.0

Version 0.1.0

Version 0.1.0 Pre-release
Pre-release

Choose a tag to compare

@henryiii henryiii released this 07 Jul 17:35
668504d