From dd554e4e92e6a7700637fec78b85099c76c35bdb Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Thu, 8 Oct 2026 04:15:48 +0100 Subject: [PATCH] Use native Markdown for release notes and changelog history --- .github/workflows/release.yml | 19 +-- CHANGELOG.md | 3 + CHANGELOG.rst | 121 ------------------ docs/source/changelog.md | 11 ++ docs/source/changelog.rst | 1 - docs/source/changelog/2021.10.08.0.md | 3 + docs/source/changelog/2025.03.10.md | 3 + docs/source/changelog/2026.01.22.1.md | 1 + docs/source/changelog/2026.01.22.2.md | 1 + docs/source/changelog/2026.01.22.3.md | 1 + docs/source/changelog/2026.01.22.md | 1 + docs/source/changelog/2026.01.25.1.md | 1 + docs/source/changelog/2026.01.25.md | 1 + docs/source/changelog/2026.02.07.1.md | 1 + docs/source/changelog/2026.02.07.2.md | 1 + docs/source/changelog/2026.02.07.md | 3 + docs/source/changelog/2026.02.15.1.md | 1 + docs/source/changelog/2026.02.15.2.md | 1 + docs/source/changelog/2026.02.15.md | 1 + docs/source/changelog/2026.02.22.md | 1 + docs/source/changelog/2026.08.16.1.md | 3 + docs/source/changelog/2026.08.16.md | 5 + docs/source/changelog/2026.08.30.1.md | 3 + docs/source/changelog/2026.08.30.2.md | 3 + docs/source/changelog/2026.08.30.3.md | 3 + docs/source/changelog/2026.08.30.4.md | 3 + docs/source/changelog/2026.08.30.5.md | 3 + docs/source/changelog/2026.08.30.md | 5 + docs/source/changelog/2026.09.08.md | 3 + docs/source/conf.py | 7 +- docs/source/contributing.rst | 7 + docs/source/unreleased.md | 7 + docs/source/unreleased.rst | 7 - docs/towncrier_template.rst.jinja | 14 -- newsfragments/+native-markdown.change.md | 1 + .../{2588.change.rst => 2588.change.md} | 0 .../{2589.change.rst => 2589.change.md} | 0 .../{2596.change.rst => 2596.change.md} | 0 newsfragments/README.md | 10 ++ prek.toml | 4 +- pyproject.toml | 37 ++---- spelling_private_dict.txt | 2 + uv.lock | 20 +-- 43 files changed, 125 insertions(+), 198 deletions(-) create mode 100644 CHANGELOG.md delete mode 100644 CHANGELOG.rst create mode 100644 docs/source/changelog.md delete mode 100644 docs/source/changelog.rst create mode 100644 docs/source/changelog/2021.10.08.0.md create mode 100644 docs/source/changelog/2025.03.10.md create mode 100644 docs/source/changelog/2026.01.22.1.md create mode 100644 docs/source/changelog/2026.01.22.2.md create mode 100644 docs/source/changelog/2026.01.22.3.md create mode 100644 docs/source/changelog/2026.01.22.md create mode 100644 docs/source/changelog/2026.01.25.1.md create mode 100644 docs/source/changelog/2026.01.25.md create mode 100644 docs/source/changelog/2026.02.07.1.md create mode 100644 docs/source/changelog/2026.02.07.2.md create mode 100644 docs/source/changelog/2026.02.07.md create mode 100644 docs/source/changelog/2026.02.15.1.md create mode 100644 docs/source/changelog/2026.02.15.2.md create mode 100644 docs/source/changelog/2026.02.15.md create mode 100644 docs/source/changelog/2026.02.22.md create mode 100644 docs/source/changelog/2026.08.16.1.md create mode 100644 docs/source/changelog/2026.08.16.md create mode 100644 docs/source/changelog/2026.08.30.1.md create mode 100644 docs/source/changelog/2026.08.30.2.md create mode 100644 docs/source/changelog/2026.08.30.3.md create mode 100644 docs/source/changelog/2026.08.30.4.md create mode 100644 docs/source/changelog/2026.08.30.5.md create mode 100644 docs/source/changelog/2026.08.30.md create mode 100644 docs/source/changelog/2026.09.08.md create mode 100644 docs/source/unreleased.md delete mode 100644 docs/source/unreleased.rst delete mode 100644 docs/towncrier_template.rst.jinja create mode 100644 newsfragments/+native-markdown.change.md rename newsfragments/{2588.change.rst => 2588.change.md} (100%) rename newsfragments/{2589.change.rst => 2589.change.md} (100%) rename newsfragments/{2596.change.rst => 2596.change.md} (100%) create mode 100644 newsfragments/README.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c309db1a..b4b5f087 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,21 +52,12 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # towncrier writes the rendered notes to stdout (informational - # chatter goes to stderr), so this is the curated release body for - # this version, not github-tag-action's commit-derived changelog. - - name: Generate the GitHub release notes + - name: Assemble native Markdown release notes env: RELEASE: ${{ steps.calver.outputs.release }} - run: uv run --group=release towncrier build --draft --version "$RELEASE" > - release-notes.md - - # Assemble the same fragments into CHANGELOG.rst under a new - # ``$RELEASE`` section and delete the consumed fragment files. - - name: Update the changelog - env: - RELEASE: ${{ steps.calver.outputs.release }} - run: uv run --group=release towncrier build --yes --version "$RELEASE" + run: | + uv run --group=release towncrier build --yes --version "$RELEASE" + cp "docs/source/changelog/$RELEASE.md" release-notes.md - name: Update VERSION file for Nix flake env: @@ -78,7 +69,7 @@ jobs: id: commit with: commit_message: Bump CHANGELOG and VERSION - file_pattern: CHANGELOG.rst newsfragments VERSION + file_pattern: CHANGELOG.md docs/source/changelog newsfragments VERSION # Error if there are no changes. skip_dirty_check: true diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..76e4dab1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +# Changelog + +Release notes are stored as [one Markdown file per version](docs/source/changelog/). diff --git a/CHANGELOG.rst b/CHANGELOG.rst deleted file mode 100644 index 2ef819fb..00000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,121 +0,0 @@ -Changelog -========= - -.. towncrier release notes start - -2026.09.08 ----------- - -- Check that Gatekeeper accepts the signed and notarized macOS binaries during the release, and remove the quarantine workaround from the install docs. - -2026.08.30.5 ------------- - -No documented changes. - -2026.08.30.4 ------------- - -No documented changes. - -2026.08.30.3 ------------- - -No documented changes. - -2026.08.30.2 ------------- - -No documented changes. - -2026.08.30.1 ------------- - -No documented changes. - -2026.08.30 ----------- - -- Handle all VWS and Cloud Reco service errors with clear CLI messages, and use consistent messages for target status and polling timeout errors. - -- Test Model Target authentication, client, rate-limit, and server failures through public CLI commands and the configurable mock. - -- Update vws-python and vws-python-mock to their releases containing configurable Model Target failure coverage. - -2026.08.16.1 ------------- - -No documented changes. - -2026.08.16 ----------- - -- Drop Python 3.13 support, and update VWS Python so that the documented ``ProjectHasNoApiAccess`` result code spelling gives a friendly error message. - -- Add Model Target dataset commands: ``vws create-model-target-dataset``, ``vws get-model-target-dataset-status``, ``vws wait-for-model-target-dataset-generated``, ``vws download-model-target-dataset`` and ``vws delete-model-target-dataset``. - -- Add a ``vws get-database-reco-counts-report`` command, which requests a per-target recognition counts report for a month, waits for Vuforia to generate it, and writes the CSV to stdout or to a given path. - -2026.02.22 ----------- - - -2026.02.15.2 ------------- - - -2026.02.15.1 ------------- - - -2026.02.15 ----------- - - -2026.02.07.2 ------------- - - -2026.02.07.1 ------------- - - -2026.02.07 ----------- - - -* Add support for installing with winget on Windows. - -2026.01.25.1 ------------- - - -2026.01.25 ----------- - - -2026.01.22.3 ------------- - - -2026.01.22.2 ------------- - - -2026.01.22.1 ------------- - - -2026.01.22 ----------- - - -2025.03.10 ----------- - -* Move documentation to GitHub Pages. - -2021.10.08.0 ------------- - -Initial release. diff --git a/docs/source/changelog.md b/docs/source/changelog.md new file mode 100644 index 00000000..770dbed2 --- /dev/null +++ b/docs/source/changelog.md @@ -0,0 +1,11 @@ +# Changelog + +Releases are assembled from `newsfragments/` using Towncrier. + +```{toctree} +:maxdepth: 1 +:glob: +:reversed: + +changelog/* +``` diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst deleted file mode 100644 index 09929fe4..00000000 --- a/docs/source/changelog.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../CHANGELOG.rst diff --git a/docs/source/changelog/2021.10.08.0.md b/docs/source/changelog/2021.10.08.0.md new file mode 100644 index 00000000..15bb8da9 --- /dev/null +++ b/docs/source/changelog/2021.10.08.0.md @@ -0,0 +1,3 @@ +# 2021.10.08.0 + +Initial release. diff --git a/docs/source/changelog/2025.03.10.md b/docs/source/changelog/2025.03.10.md new file mode 100644 index 00000000..866c0ed4 --- /dev/null +++ b/docs/source/changelog/2025.03.10.md @@ -0,0 +1,3 @@ +# 2025.03.10 + +- Move documentation to GitHub Pages. diff --git a/docs/source/changelog/2026.01.22.1.md b/docs/source/changelog/2026.01.22.1.md new file mode 100644 index 00000000..698a6cd0 --- /dev/null +++ b/docs/source/changelog/2026.01.22.1.md @@ -0,0 +1 @@ +# 2026.01.22.1 diff --git a/docs/source/changelog/2026.01.22.2.md b/docs/source/changelog/2026.01.22.2.md new file mode 100644 index 00000000..11c76073 --- /dev/null +++ b/docs/source/changelog/2026.01.22.2.md @@ -0,0 +1 @@ +# 2026.01.22.2 diff --git a/docs/source/changelog/2026.01.22.3.md b/docs/source/changelog/2026.01.22.3.md new file mode 100644 index 00000000..2a1196d3 --- /dev/null +++ b/docs/source/changelog/2026.01.22.3.md @@ -0,0 +1 @@ +# 2026.01.22.3 diff --git a/docs/source/changelog/2026.01.22.md b/docs/source/changelog/2026.01.22.md new file mode 100644 index 00000000..0dbe54ab --- /dev/null +++ b/docs/source/changelog/2026.01.22.md @@ -0,0 +1 @@ +# 2026.01.22 diff --git a/docs/source/changelog/2026.01.25.1.md b/docs/source/changelog/2026.01.25.1.md new file mode 100644 index 00000000..cc615e51 --- /dev/null +++ b/docs/source/changelog/2026.01.25.1.md @@ -0,0 +1 @@ +# 2026.01.25.1 diff --git a/docs/source/changelog/2026.01.25.md b/docs/source/changelog/2026.01.25.md new file mode 100644 index 00000000..c2ea7a3a --- /dev/null +++ b/docs/source/changelog/2026.01.25.md @@ -0,0 +1 @@ +# 2026.01.25 diff --git a/docs/source/changelog/2026.02.07.1.md b/docs/source/changelog/2026.02.07.1.md new file mode 100644 index 00000000..78ae4e2e --- /dev/null +++ b/docs/source/changelog/2026.02.07.1.md @@ -0,0 +1 @@ +# 2026.02.07.1 diff --git a/docs/source/changelog/2026.02.07.2.md b/docs/source/changelog/2026.02.07.2.md new file mode 100644 index 00000000..6a120863 --- /dev/null +++ b/docs/source/changelog/2026.02.07.2.md @@ -0,0 +1 @@ +# 2026.02.07.2 diff --git a/docs/source/changelog/2026.02.07.md b/docs/source/changelog/2026.02.07.md new file mode 100644 index 00000000..f0aeadd2 --- /dev/null +++ b/docs/source/changelog/2026.02.07.md @@ -0,0 +1,3 @@ +# 2026.02.07 + +- Add support for installing with winget on Windows. diff --git a/docs/source/changelog/2026.02.15.1.md b/docs/source/changelog/2026.02.15.1.md new file mode 100644 index 00000000..878e83f3 --- /dev/null +++ b/docs/source/changelog/2026.02.15.1.md @@ -0,0 +1 @@ +# 2026.02.15.1 diff --git a/docs/source/changelog/2026.02.15.2.md b/docs/source/changelog/2026.02.15.2.md new file mode 100644 index 00000000..efab86ea --- /dev/null +++ b/docs/source/changelog/2026.02.15.2.md @@ -0,0 +1 @@ +# 2026.02.15.2 diff --git a/docs/source/changelog/2026.02.15.md b/docs/source/changelog/2026.02.15.md new file mode 100644 index 00000000..e15ef11d --- /dev/null +++ b/docs/source/changelog/2026.02.15.md @@ -0,0 +1 @@ +# 2026.02.15 diff --git a/docs/source/changelog/2026.02.22.md b/docs/source/changelog/2026.02.22.md new file mode 100644 index 00000000..03ef9d33 --- /dev/null +++ b/docs/source/changelog/2026.02.22.md @@ -0,0 +1 @@ +# 2026.02.22 diff --git a/docs/source/changelog/2026.08.16.1.md b/docs/source/changelog/2026.08.16.1.md new file mode 100644 index 00000000..8b09bc8e --- /dev/null +++ b/docs/source/changelog/2026.08.16.1.md @@ -0,0 +1,3 @@ +# 2026.08.16.1 + +No documented changes. diff --git a/docs/source/changelog/2026.08.16.md b/docs/source/changelog/2026.08.16.md new file mode 100644 index 00000000..8c9fe3be --- /dev/null +++ b/docs/source/changelog/2026.08.16.md @@ -0,0 +1,5 @@ +# 2026.08.16 + +- Drop Python 3.13 support, and update VWS Python so that the documented `ProjectHasNoApiAccess` result code spelling gives a friendly error message. +- Add Model Target dataset commands: `vws create-model-target-dataset`, `vws get-model-target-dataset-status`, `vws wait-for-model-target-dataset-generated`, `vws download-model-target-dataset` and `vws delete-model-target-dataset`. +- Add a `vws get-database-reco-counts-report` command, which requests a per-target recognition counts report for a month, waits for Vuforia to generate it, and writes the CSV to stdout or to a path. diff --git a/docs/source/changelog/2026.08.30.1.md b/docs/source/changelog/2026.08.30.1.md new file mode 100644 index 00000000..418cd95a --- /dev/null +++ b/docs/source/changelog/2026.08.30.1.md @@ -0,0 +1,3 @@ +# 2026.08.30.1 + +No documented changes. diff --git a/docs/source/changelog/2026.08.30.2.md b/docs/source/changelog/2026.08.30.2.md new file mode 100644 index 00000000..509c03fd --- /dev/null +++ b/docs/source/changelog/2026.08.30.2.md @@ -0,0 +1,3 @@ +# 2026.08.30.2 + +No documented changes. diff --git a/docs/source/changelog/2026.08.30.3.md b/docs/source/changelog/2026.08.30.3.md new file mode 100644 index 00000000..143370e0 --- /dev/null +++ b/docs/source/changelog/2026.08.30.3.md @@ -0,0 +1,3 @@ +# 2026.08.30.3 + +No documented changes. diff --git a/docs/source/changelog/2026.08.30.4.md b/docs/source/changelog/2026.08.30.4.md new file mode 100644 index 00000000..192220f2 --- /dev/null +++ b/docs/source/changelog/2026.08.30.4.md @@ -0,0 +1,3 @@ +# 2026.08.30.4 + +No documented changes. diff --git a/docs/source/changelog/2026.08.30.5.md b/docs/source/changelog/2026.08.30.5.md new file mode 100644 index 00000000..3dd8bf71 --- /dev/null +++ b/docs/source/changelog/2026.08.30.5.md @@ -0,0 +1,3 @@ +# 2026.08.30.5 + +No documented changes. diff --git a/docs/source/changelog/2026.08.30.md b/docs/source/changelog/2026.08.30.md new file mode 100644 index 00000000..6ed7660b --- /dev/null +++ b/docs/source/changelog/2026.08.30.md @@ -0,0 +1,5 @@ +# 2026.08.30 + +- Handle all VWS and Cloud Reco service errors with clear CLI messages, and use consistent messages for target status and polling timeout errors. +- Test Model Target authentication, client, rate-limit, and server failures through public CLI commands and the configurable mock. +- Update vws-python and vws-python-mock to their releases containing configurable Model Target failure coverage. diff --git a/docs/source/changelog/2026.09.08.md b/docs/source/changelog/2026.09.08.md new file mode 100644 index 00000000..eea2f88b --- /dev/null +++ b/docs/source/changelog/2026.09.08.md @@ -0,0 +1,3 @@ +# 2026.09.08 + +- Check that Gatekeeper accepts the signed and notarized macOS binaries during the release, and remove the quarantine workaround from the install docs. diff --git a/docs/source/conf.py b/docs/source/conf.py index 9b7fa2bb..3d39ba86 100755 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -20,6 +20,7 @@ author = _pyproject_config.author extensions = [ + "myst_parser", "sphinx_copybutton", "sphinxcontrib.spelling", "sphinxcontrib.towncrier.ext", @@ -29,15 +30,15 @@ ] # Render the unreleased ``newsfragments/`` entries into -# ``docs/source/unreleased.rst`` so the Sphinx spelling, doc-build and +# ``docs/source/unreleased.md`` so the Sphinx spelling, doc-build and # link-checking gates cover the prose before it is assembled into -# CHANGELOG.rst at release time. +# the versioned Markdown notes at release time. towncrier_draft_autoversion_mode = "draft" towncrier_draft_include_empty = True towncrier_draft_working_directory = f"{_pyproject_file.parent}" templates_path = ["_templates"] -source_suffix = ".rst" +source_suffix = {".rst": "restructuredtext", ".md": "markdown"} master_doc = "index" project_copyright = f"%Y, {author}" diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst index 16284a5d..3868e8e0 100644 --- a/docs/source/contributing.rst +++ b/docs/source/contributing.rst @@ -77,3 +77,10 @@ Performing a release -------------------- See :doc:`release-process`. + +Release notes +------------- + +Write user-facing changes as Markdown in ``newsfragments/.change.md``. +Towncrier writes one Markdown file per version, used directly for GitHub release notes. +Invalid fragment names fail release assembly. diff --git a/docs/source/unreleased.md b/docs/source/unreleased.md new file mode 100644 index 00000000..e9ba1c80 --- /dev/null +++ b/docs/source/unreleased.md @@ -0,0 +1,7 @@ +# Unreleased changes + +Changes merged into the main branch but not yet part of a tagged release. +These entries are assembled into the {doc}`changelog` when the next release is published. + +```{towncrier-draft-entries} +``` diff --git a/docs/source/unreleased.rst b/docs/source/unreleased.rst deleted file mode 100644 index 16b73765..00000000 --- a/docs/source/unreleased.rst +++ /dev/null @@ -1,7 +0,0 @@ -Unreleased changes -================== - -Changes merged into the main branch but not yet part of a tagged release. -These entries are assembled into the :doc:`changelog` when the next release is published. - -.. towncrier-draft-entries:: diff --git a/docs/towncrier_template.rst.jinja b/docs/towncrier_template.rst.jinja deleted file mode 100644 index 68de618d..00000000 --- a/docs/towncrier_template.rst.jinja +++ /dev/null @@ -1,14 +0,0 @@ - -{% for section_name, section in sections.items() %} -{% if section %} -{% for category, entries in section.items() %} -{% for text, _ in entries.items() %} -- {{ text }} - -{% endfor %} -{% endfor %} -{% else %} -No documented changes. - -{% endif %} -{% endfor %} diff --git a/newsfragments/+native-markdown.change.md b/newsfragments/+native-markdown.change.md new file mode 100644 index 00000000..d19b771e --- /dev/null +++ b/newsfragments/+native-markdown.change.md @@ -0,0 +1 @@ +Publish native Markdown release notes and use the same notes in documentation where available. diff --git a/newsfragments/2588.change.rst b/newsfragments/2588.change.md similarity index 100% rename from newsfragments/2588.change.rst rename to newsfragments/2588.change.md diff --git a/newsfragments/2589.change.rst b/newsfragments/2589.change.md similarity index 100% rename from newsfragments/2589.change.rst rename to newsfragments/2589.change.md diff --git a/newsfragments/2596.change.rst b/newsfragments/2596.change.md similarity index 100% rename from newsfragments/2596.change.rst rename to newsfragments/2596.change.md diff --git a/newsfragments/README.md b/newsfragments/README.md new file mode 100644 index 00000000..adf0ad97 --- /dev/null +++ b/newsfragments/README.md @@ -0,0 +1,10 @@ +# Release notes + +Add user-facing changes in `newsfragments/..md`, using an issue or pull request number. +The available types are `change`. +Use `+name..md` for changes without an issue number. + +Write GitHub-compatible Markdown, including inline code, explicit links, and lists. +Towncrier writes one Markdown file per version and rejects invalid fragment names. +GitHub publishes that file directly as the release description. +Sphinx uses MyST to read the same release notes. diff --git a/prek.toml b/prek.toml index 11fb7015..3174f8f2 100644 --- a/prek.toml +++ b/prek.toml @@ -453,7 +453,7 @@ hooks = [ name = "linkcheck", entry = "uv run --group=dev sphinx-build -M linkcheck docs/source docs/build -W", language = "python", - types_or = ["rst"], + types_or = ["rst", "markdown"], stages = ["manual"], pass_filenames = false, additional_dependencies = ["uv==0.11.7"] @@ -463,7 +463,7 @@ hooks = [ name = "spelling", entry = "uv run --group=dev sphinx-build -M spelling docs/source docs/build -W", language = "python", - types_or = ["rst"], + types_or = ["rst", "markdown"], stages = ["manual"], pass_filenames = false, additional_dependencies = ["uv==0.11.7"] diff --git a/pyproject.toml b/pyproject.toml index 00286d9e..f1046b85 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,7 @@ dev = [ "mypy==2.4.0", "mypy-pytest-parametrize==2026.10.5", "mypy-strict-kwargs==2026.8.25.1", + "myst-parser==5.1.0", "no-defaults==2026.9.1", "prek==0.5.4", "pydocstringformatter==1.0.0", @@ -85,7 +86,7 @@ dev = [ "sphinx-substitution-extensions==2026.8.13.1", "sphinxcontrib-spelling==8.0.2", # ``sphinxcontrib-towncrier`` renders unreleased news fragments - # into docs/source/unreleased.rst during Sphinx builds. + # as Markdown in docs/source/unreleased.md during Sphinx builds. "sphinxcontrib-towncrier==0.5.0a0", "strict-kwargs==2026.8.28.post2", "towncrier==26.9.0", @@ -306,7 +307,7 @@ ignore = [ ".yamlfmt", "bin", "bin/*", - "CHANGELOG.rst", + "CHANGELOG.md", "ci", "ci/**", "CODE_OF_CONDUCT.rst", @@ -438,33 +439,15 @@ report.exclude_also = [ report.show_missing = true [tool.towncrier] -# The changelog and the per-release GitHub release notes are both built -# from news fragments under ``newsfragments/``. The release workflow -# runs ``towncrier build`` to assemble them; contributors add one -# fragment file per user-facing change. +# Write the same native Markdown file used by documentation and GitHub releases. directory = "newsfragments" -filename = "CHANGELOG.rst" -# Custom template so an assembled version reproduces the historical -# style exactly: a bare ```` heading (no project name, no -# date) followed by a flat bullet list with no per-type sub-headings. -template = "docs/towncrier_template.rst.jinja" -title_format = "{version}" -issue_format = "#{issue}" -# ``title_format`` underline first, then any nested headings. A bare -# version such as ``2026.05.18`` underlined with ``-`` matches every -# pre-towncrier entry in CHANGELOG.rst. -underlines = [ "-", "~", "^" ] -# Setting ``ignore`` makes ``towncrier build`` fail on any file in -# the fragment directory whose suffix is not a declared fragment -# type, instead of silently dropping it. Only the listed -# non-fragment files are allowed through. +filename = "docs/source/changelog/{version}.md" +title_format = "# {version} ({project_date})" +issue_format = "[#{issue}](https://github.com/VWS-Python/vws-cli/issues/{issue})" +single_file = false +# Reject invalid fragment names instead of silently losing release entries. ignore = [ ".gitkeep" ] -type = [ - # A single, unnamed fragment type keeps the assembled output as one - # flat bullet list, matching the historical changelog (which never - # grouped entries under "Features"/"Bugfixes"/... sub-headings). - { directory = "change", name = "", showcontent = true }, -] +type = [ { directory = "change", name = "Changes", showcontent = true } ] [tool.pydocstringformatter] write = true diff --git a/spelling_private_dict.txt b/spelling_private_dict.txt index 60fd2fcb..44774892 100644 --- a/spelling_private_dict.txt +++ b/spelling_private_dict.txt @@ -1,5 +1,7 @@ CSV +MyST OAuth +Towncrier Winget admin api diff --git a/uv.lock b/uv.lock index 19c7be09..c59d3a3b 100644 --- a/uv.lock +++ b/uv.lock @@ -775,14 +775,14 @@ wheels = [ [[package]] name = "markdown-it-py" -version = "4.0.0" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, ] [[package]] @@ -826,14 +826,14 @@ wheels = [ [[package]] name = "mdit-py-plugins" -version = "0.5.0" +version = "0.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, ] [[package]] @@ -936,7 +936,7 @@ wheels = [ [[package]] name = "myst-parser" -version = "5.0.0" +version = "5.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, @@ -946,9 +946,9 @@ dependencies = [ { name = "pyyaml" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", size = 98535, upload-time = "2026-01-15T09:08:18.036Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", size = 84533, upload-time = "2026-01-15T09:08:16.788Z" }, + { url = "https://files.pythonhosted.org/packages/09/dc/f3dfb7488b770f3f67e6545085bf2abea5172e88f57b8ad25ef860ca704c/myst_parser-5.1.0-py3-none-any.whl", hash = "sha256:9c91c52b3cdb4d94a6506e4fab4e2f296c7623a0da0dcbe6de1565c3dad67a8a", size = 85817, upload-time = "2026-05-13T09:38:17.904Z" }, ] [[package]] @@ -2263,6 +2263,7 @@ dev = [ { name = "mypy" }, { name = "mypy-pytest-parametrize" }, { name = "mypy-strict-kwargs" }, + { name = "myst-parser" }, { name = "no-defaults" }, { name = "prek" }, { name = "pydocstringformatter" }, @@ -2329,6 +2330,7 @@ dev = [ { name = "mypy", specifier = "==2.4.0" }, { name = "mypy-pytest-parametrize", specifier = "==2026.10.5" }, { name = "mypy-strict-kwargs", specifier = "==2026.8.25.1" }, + { name = "myst-parser", specifier = "==5.1.0" }, { name = "no-defaults", specifier = "==2026.9.1" }, { name = "prek", specifier = "==0.5.4" }, { name = "pydocstringformatter", specifier = "==1.0.0" },