Skip to content

v8.9.0

Choose a tag to compare

@kdeldycke kdeldycke released this 14 Aug 18:54
Immutable release. Only release title and notes can be modified.

Note

8.9.0 is available on 🐍 PyPI and 🐙 GitHub.

  • Add a transform argument to EnumChoice, reshaping the string produced by any choice source, so show_aliases can spell aliases in kebab-case instead of raw Python identifiers.
  • Reject a transform collapsing two EnumChoice members into the same choice string, instead of silently dropping one from the help screen.
  • Point the EnumChoice show_aliases error at transform and explain why ChoiceSource.STR and callable sources cannot see aliases.
  • Add a max_column_widths argument to render_table() and print_table(), and a max_width field to ColumnSpec, capping a column to a character count or to auto.
  • Wrap long cells in the vertical format, aligning continuation lines under the label gutter.
  • Add a WRAPPABLE_FORMATS registry and a TableFormat.is_wrappable property, so formats unable to render a wrapped cell drop column widths instead of corrupting their output.
  • Add wrap_ansi(), wrapping a string to a visible width without counting its ANSI escapes toward the line length, and keeping each line's styling self-contained.
  • Read the input of run_jobs() and run_lanes() lazily, keeping a bounded window of tasks in flight instead of materializing the whole stream.
  • Stop scheduling the rest of a run_jobs() or run_lanes() stream when the caller breaks early, at any worker count and not only at --jobs 1.
  • Declare run_jobs() and run_lanes() as generators, so the early-exit close() they document is visible to type checkers.
  • Render the {matrix} python axis in three states: for a version a release declares, for one its requires-python rules out, and for one it neither claimed nor forbade.
  • Split a Python matrix row when the declared requires-python changes, even if the set of supported versions does not.
  • Read a dependency's requirement from a parsed pyproject.toml instead of a regex over its raw text, so {matrix} follows extras brackets, environment markers and Poetry's inline-table form.
  • Match a tracked dependency on its normalized name, searching runtime and extra dependencies but no longer development dependency groups.
  • Drop the Codecov integration, its badge and its upload steps. Coverage is now gated by the [tool.coverage] report.fail_under ratchet.
  • Move every test job and the full matrix off the ubuntu-slim and ubuntu-24.04-arm runners onto the ubuntu-26.04 pair, and teach actionlint the new labels.
  • Exempt the inline repomatic pin and the test-package-install job from the supply-chain cooldown, so neither resolves to a missing or stale release.
  • Pin the uv version installed by astral-sh/setup-uv in the test workflow.
  • Enable ruff's PLW1514 and disable its unsafe fixes.
  • Skip the test workflow on version-bump pushes again, whose commit titles gained a [changelog] prefix.
  • Cap a Poetry caret range at the component Poetry documents, so ^0.2.3 no longer claims the whole 0.x series instead of stopping at 0.3.0.
  • Translate Poetry's major-only tilde (~1) and its wildcard ranges (*, 1.*, 1.2.*), which used to be unparsable and rendered an all-❌ row.
  • Give an exact == pin a column of its own precision, so the single release it accepts no longer renders as all-❌.
  • Fix the test workflow's metadata job requesting coverage_cells, a key repomatic dropped, which failed the job and skipped every job below it.
  • Skip test_blocks_reexported_from_sphinx_package without the sphinx extra, instead of failing on an ImportError. It is the only test outside tests/sphinx/ importing that package.
  • Skip tests/sphinx/test_sphinx_matrix.py when no git binary is on PATH, instead of failing all 155 of its cases with an unexplained FileNotFoundError.
  • Bind the test suite's local HTTP server to 127.0.0.1 instead of localhost, so the configuration tests serving a config file over HTTP no longer need a name resolver.

Full changelog: v8.8.1...v8.9.0