From 4e78804f1aafbb7c4e48220e71163d33e4c74eb3 Mon Sep 17 00:00:00 2001 From: Adam Dangoor Date: Thu, 8 Oct 2026 04:13:58 +0100 Subject: [PATCH] Use native Markdown for release notes and changelog history --- .github/workflows/release.yml | 19 +- CHANGELOG.md | 3 + CHANGELOG.rst | 180 ------------------ docs/source/changelog.md | 11 ++ docs/source/changelog.rst | 1 - docs/source/changelog/2019.11.23.0.md | 3 + docs/source/changelog/2020.03.21.0.md | 3 + docs/source/changelog/2020.06.19.0.md | 1 + docs/source/changelog/2020.08.21.0.md | 3 + docs/source/changelog/2020.09.07.0.md | 5 + docs/source/changelog/2021.03.28.0.md | 5 + docs/source/changelog/2021.03.28.1.md | 1 + docs/source/changelog/2021.03.28.2.md | 1 + docs/source/changelog/2023.03.05.md | 1 + docs/source/changelog/2023.03.25.md | 3 + docs/source/changelog/2023.05.21.md | 3 + docs/source/changelog/2023.12.26.md | 1 + docs/source/changelog/2023.12.27.md | 4 + docs/source/changelog/2024.02.04.1.md | 1 + docs/source/changelog/2024.02.04.md | 3 + docs/source/changelog/2024.02.06.md | 3 + docs/source/changelog/2024.02.19.md | 3 + docs/source/changelog/2024.09.02.md | 5 + docs/source/changelog/2024.09.03.md | 3 + docs/source/changelog/2024.09.04.1.md | 1 + docs/source/changelog/2024.09.04.md | 4 + docs/source/changelog/2024.09.21.md | 1 + docs/source/changelog/2025.03.10.1.md | 1 + docs/source/changelog/2025.03.10.md | 3 + docs/source/changelog/2026.02.15.md | 5 + docs/source/changelog/2026.02.21.md | 1 + docs/source/changelog/2026.02.22.md | 1 + docs/source/changelog/2026.02.23.md | 1 + docs/source/changelog/2026.02.24.md | 1 + docs/source/changelog/2026.02.25.1.md | 1 + docs/source/changelog/2026.02.25.md | 1 + docs/source/changelog/2026.08.14.md | 13 ++ docs/source/changelog/2026.08.26.md | 3 + docs/source/changelog/2026.09.07.md | 5 + 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 + .../{3214.change.rst => 3214.change.md} | 0 .../{3215.change.rst => 3215.change.md} | 0 newsfragments/3216.change.md | 1 + newsfragments/3216.change.rst | 1 - .../{3218.change.rst => 3218.change.md} | 0 .../{3223.change.rst => 3223.change.md} | 0 newsfragments/README.md | 10 + prek.toml | 4 +- pyproject.toml | 37 +--- spelling_private_dict.txt | 2 + 55 files changed, 157 insertions(+), 249 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/2019.11.23.0.md create mode 100644 docs/source/changelog/2020.03.21.0.md create mode 100644 docs/source/changelog/2020.06.19.0.md create mode 100644 docs/source/changelog/2020.08.21.0.md create mode 100644 docs/source/changelog/2020.09.07.0.md create mode 100644 docs/source/changelog/2021.03.28.0.md create mode 100644 docs/source/changelog/2021.03.28.1.md create mode 100644 docs/source/changelog/2021.03.28.2.md create mode 100644 docs/source/changelog/2023.03.05.md create mode 100644 docs/source/changelog/2023.03.25.md create mode 100644 docs/source/changelog/2023.05.21.md create mode 100644 docs/source/changelog/2023.12.26.md create mode 100644 docs/source/changelog/2023.12.27.md create mode 100644 docs/source/changelog/2024.02.04.1.md create mode 100644 docs/source/changelog/2024.02.04.md create mode 100644 docs/source/changelog/2024.02.06.md create mode 100644 docs/source/changelog/2024.02.19.md create mode 100644 docs/source/changelog/2024.09.02.md create mode 100644 docs/source/changelog/2024.09.03.md create mode 100644 docs/source/changelog/2024.09.04.1.md create mode 100644 docs/source/changelog/2024.09.04.md create mode 100644 docs/source/changelog/2024.09.21.md create mode 100644 docs/source/changelog/2025.03.10.1.md create mode 100644 docs/source/changelog/2025.03.10.md create mode 100644 docs/source/changelog/2026.02.15.md create mode 100644 docs/source/changelog/2026.02.21.md create mode 100644 docs/source/changelog/2026.02.22.md create mode 100644 docs/source/changelog/2026.02.23.md create mode 100644 docs/source/changelog/2026.02.24.md create mode 100644 docs/source/changelog/2026.02.25.1.md create mode 100644 docs/source/changelog/2026.02.25.md create mode 100644 docs/source/changelog/2026.08.14.md create mode 100644 docs/source/changelog/2026.08.26.md create mode 100644 docs/source/changelog/2026.09.07.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/{3214.change.rst => 3214.change.md} (100%) rename newsfragments/{3215.change.rst => 3215.change.md} (100%) create mode 100644 newsfragments/3216.change.md delete mode 100644 newsfragments/3216.change.rst rename newsfragments/{3218.change.rst => 3218.change.md} (100%) rename newsfragments/{3223.change.rst => 3223.change.md} (100%) create mode 100644 newsfragments/README.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 973bd5658..8c021288e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,27 +47,18 @@ 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 - uses: stefanzweifel/git-auto-commit-action@v7 id: commit with: commit_message: Bump CHANGELOG - file_pattern: CHANGELOG.rst newsfragments + file_pattern: CHANGELOG.md docs/source/changelog newsfragments # Error if there are no changes. skip_dirty_check: true diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..76e4dab17 --- /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 cf6b1a123..000000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,180 +0,0 @@ -Changelog -========= - -.. towncrier release notes start - -2026.09.07 ----------- - -- Add ``HTTPX2Transport`` and ``AsyncHTTPX2Transport``, which make requests with ``httpx2``, the continuation of ``httpx`` maintained by Pydantic. - The ``requests`` and ``httpx`` transports are unchanged. - ``httpx`` and ``httpx2`` objects are never mixed: the ``httpx`` transports raise ``httpx`` exceptions and the ``httpx2`` transports raise ``httpx2`` exceptions. - -2026.08.26 ----------- - -- Test synchronous and asynchronous Model Target error responses through the public mock API, and include rate-limit and server-error branches in coverage. - -2026.08.14 ----------- - -- Drop Python 3.13 support, update VWS Python Mock, and test quota and project-state error responses against the mock. - -- Add ``QuotaExceededError``, ``LicenseCheckFailedError``, and ``AuthorizationFailedError`` for documented VuMark Generation API result codes. - -- Fix ``target_id`` on target exceptions when ``base_vws_url`` includes a path prefix. - -- Retain explicitly provided falsy custom transports instead of replacing them with defaults. - -- Raise a response-carrying ``CloudRecoError`` when Cloud Query returns a documented empty or non-JSON 4xx response instead of leaking ``JSONDecodeError``. - -- Add support for the Model Target Web API. - ``ModelTargetService`` and ``AsyncModelTargetService`` create standard and advanced Model Target datasets, wait for them to be generated, download them and delete them. - -- Map the ``ProjectHasNoApiAccess`` result code, as spelled in Vuforia's result codes table, to ``ProjectHasNoAPIAccessError``. - The previously mapped ``ProjectHasNoAPIAccess`` casing, which Vuforia does not document, is no longer mapped. - -- Add support for the Database Reco Counts report. - ``VWS`` and ``AsyncVWS`` take an optional ``database_id``, and have new ``request_database_reco_counts_report``, ``download_reco_counts_report`` and ``wait_for_reco_counts_report`` methods. - -2026.02.25.1 ------------- - - -2026.02.25 ----------- - - -2026.02.24 ----------- - - -2026.02.23 ----------- - - -2026.02.22 ----------- - - -2026.02.21 ----------- - - -2026.02.15 ----------- - - -* Add ``request_timeout_seconds`` parameter to ``VWS`` and ``CloudRecoService``, allowing customization of the request timeout. - This accepts a float or a ``(connect, read)`` tuple, matching the ``requests`` library's timeout interface. - The default remains 30 seconds. - -2025.03.10.1 ------------- - -2025.03.10 ----------- - -* Removed ``vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName`` which now does not occur in VWS. - -2024.09.21 ------------- - -2024.09.04.1 ------------- - -2024.09.04 ------------- - -* Move ``Response`` from ``vws.exceptions.response`` to ``vws.types``. -* Add ``raw`` field to ``Response``. - -2024.09.03 ------------- - -* Make ``VWS.make_request`` a public method. - -2024.09.02 ------------- - -* Breaking change: Exception names now end with ``Error``. -* Use a timeout (30 seconds) when making requests to the VWS API. -* Type hint changes: images are now ``io.BytesIO`` instances or ``io.BufferedRandom``. - -2024.02.19 ------------- - -* Add exception response attribute to ``vws.exceptions.custom_exceptions.RequestEntityTooLarge``. - -2024.02.06 ------------- - -* Exception response attributes are now ``vws.exceptions.response.Response`` instances rather than ``requests.Response`` objects. - -2024.02.04.1 ------------- - -2024.02.04 ------------- - -* Return a new error (``vws.custom_exceptions.ServerError``) when the server returns a 5xx status code. - -2023.12.27 ------------- - -* Breaking change: The ``vws.exceptions.cloud_reco_exceptions.UnknownVWSErrorPossiblyBadName`` is now ``vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName``. -* ``vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName`` now has a ``response`` parameter and attribute. - -2023.12.26 ------------- - -2023.05.21 ------------- - -* Breaking change: the ``vws.exceptions.custom_exceptions.ActiveMatchingTargetsDeleteProcessing`` exception has been removed as Vuforia no longer returns this error. - -2023.03.25 ------------- - -* Support file-like objects in every method which accepts a file. - -2023.03.05 ------------- - -2021.03.28.2 ------------- - -2021.03.28.1 ------------- - -2021.03.28.0 ------------- - -* Breaking change: The ``vws.exceptions.cloud_reco_exceptions.MatchProcessing`` is now ``vws.exceptions.custom_exceptions.ActiveMatchingTargetsDeleteProcessing``. -* Added new exception ``vws.exceptions.custom_exceptions.RequestEntityTooLarge``. -* Add better exception handling when querying a server which does not serve the Vuforia API. - -2020.09.07.0 ------------- - -* Breaking change: Move exceptions and create base exceptions. - It is now possible to, for example, catch ``vws.exceptions.base_exceptions.VWSException`` to catch many of the exceptions raised by the ``VWS`` client. - Credit to ``@laymonage`` for this change. - -2020.08.21.0 ------------- - -* Change the return type of ``vws_client.get_target_record`` to match what is returned by the web API. - -2020.06.19.0 ------------- - -2020.03.21.0 ------------- - -* Add Windows support. - -2019.11.23.0 ------------- - -* Make ``active_flag`` and ``application_metadata`` required on ``add_target``. diff --git a/docs/source/changelog.md b/docs/source/changelog.md new file mode 100644 index 000000000..770dbed26 --- /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 09929fe43..000000000 --- a/docs/source/changelog.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../../CHANGELOG.rst diff --git a/docs/source/changelog/2019.11.23.0.md b/docs/source/changelog/2019.11.23.0.md new file mode 100644 index 000000000..0398c1995 --- /dev/null +++ b/docs/source/changelog/2019.11.23.0.md @@ -0,0 +1,3 @@ +# 2019.11.23.0 + +- Make `active_flag` and `application_metadata` required on `add_target`. diff --git a/docs/source/changelog/2020.03.21.0.md b/docs/source/changelog/2020.03.21.0.md new file mode 100644 index 000000000..ab7d217fd --- /dev/null +++ b/docs/source/changelog/2020.03.21.0.md @@ -0,0 +1,3 @@ +# 2020.03.21.0 + +- Add Windows support. diff --git a/docs/source/changelog/2020.06.19.0.md b/docs/source/changelog/2020.06.19.0.md new file mode 100644 index 000000000..6f47513b1 --- /dev/null +++ b/docs/source/changelog/2020.06.19.0.md @@ -0,0 +1 @@ +# 2020.06.19.0 diff --git a/docs/source/changelog/2020.08.21.0.md b/docs/source/changelog/2020.08.21.0.md new file mode 100644 index 000000000..0a1a42a44 --- /dev/null +++ b/docs/source/changelog/2020.08.21.0.md @@ -0,0 +1,3 @@ +# 2020.08.21.0 + +- Change the return type of `vws_client.get_target_record` to match what is returned by the web API. diff --git a/docs/source/changelog/2020.09.07.0.md b/docs/source/changelog/2020.09.07.0.md new file mode 100644 index 000000000..bebf58a03 --- /dev/null +++ b/docs/source/changelog/2020.09.07.0.md @@ -0,0 +1,5 @@ +# 2020.09.07.0 + +- Breaking change: Move exceptions and create base exceptions. + It is now possible to, for example, catch `vws.exceptions.base_exceptions.VWSException` to catch many of the exceptions raised by the `VWS` client. + Credit to `@laymonage` for this change. diff --git a/docs/source/changelog/2021.03.28.0.md b/docs/source/changelog/2021.03.28.0.md new file mode 100644 index 000000000..330f05598 --- /dev/null +++ b/docs/source/changelog/2021.03.28.0.md @@ -0,0 +1,5 @@ +# 2021.03.28.0 + +- Breaking change: The `vws.exceptions.cloud_reco_exceptions.MatchProcessing` is now `vws.exceptions.custom_exceptions.ActiveMatchingTargetsDeleteProcessing`. +- Added new exception `vws.exceptions.custom_exceptions.RequestEntityTooLarge`. +- Add better exception handling when querying a server which does not serve the Vuforia API. diff --git a/docs/source/changelog/2021.03.28.1.md b/docs/source/changelog/2021.03.28.1.md new file mode 100644 index 000000000..9a442ac8c --- /dev/null +++ b/docs/source/changelog/2021.03.28.1.md @@ -0,0 +1 @@ +# 2021.03.28.1 diff --git a/docs/source/changelog/2021.03.28.2.md b/docs/source/changelog/2021.03.28.2.md new file mode 100644 index 000000000..e9ff3dc4e --- /dev/null +++ b/docs/source/changelog/2021.03.28.2.md @@ -0,0 +1 @@ +# 2021.03.28.2 diff --git a/docs/source/changelog/2023.03.05.md b/docs/source/changelog/2023.03.05.md new file mode 100644 index 000000000..efbdab488 --- /dev/null +++ b/docs/source/changelog/2023.03.05.md @@ -0,0 +1 @@ +# 2023.03.05 diff --git a/docs/source/changelog/2023.03.25.md b/docs/source/changelog/2023.03.25.md new file mode 100644 index 000000000..3f9e76843 --- /dev/null +++ b/docs/source/changelog/2023.03.25.md @@ -0,0 +1,3 @@ +# 2023.03.25 + +- Support file-like objects in every method which accepts a file. diff --git a/docs/source/changelog/2023.05.21.md b/docs/source/changelog/2023.05.21.md new file mode 100644 index 000000000..cdacb4d9f --- /dev/null +++ b/docs/source/changelog/2023.05.21.md @@ -0,0 +1,3 @@ +# 2023.05.21 + +- Breaking change: the `vws.exceptions.custom_exceptions.ActiveMatchingTargetsDeleteProcessing` exception has been removed as Vuforia no longer returns this error. diff --git a/docs/source/changelog/2023.12.26.md b/docs/source/changelog/2023.12.26.md new file mode 100644 index 000000000..f23557e38 --- /dev/null +++ b/docs/source/changelog/2023.12.26.md @@ -0,0 +1 @@ +# 2023.12.26 diff --git a/docs/source/changelog/2023.12.27.md b/docs/source/changelog/2023.12.27.md new file mode 100644 index 000000000..449be1e09 --- /dev/null +++ b/docs/source/changelog/2023.12.27.md @@ -0,0 +1,4 @@ +# 2023.12.27 + +- Breaking change: The `vws.exceptions.cloud_reco_exceptions.UnknownVWSErrorPossiblyBadName` is now `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName`. +- `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName` now has a `response` parameter and attribute. diff --git a/docs/source/changelog/2024.02.04.1.md b/docs/source/changelog/2024.02.04.1.md new file mode 100644 index 000000000..86f05e8bd --- /dev/null +++ b/docs/source/changelog/2024.02.04.1.md @@ -0,0 +1 @@ +# 2024.02.04.1 diff --git a/docs/source/changelog/2024.02.04.md b/docs/source/changelog/2024.02.04.md new file mode 100644 index 000000000..0a2864c46 --- /dev/null +++ b/docs/source/changelog/2024.02.04.md @@ -0,0 +1,3 @@ +# 2024.02.04 + +- Return a new error (`vws.custom_exceptions.ServerError`) when the server returns a 5xx status code. diff --git a/docs/source/changelog/2024.02.06.md b/docs/source/changelog/2024.02.06.md new file mode 100644 index 000000000..dd395d8a5 --- /dev/null +++ b/docs/source/changelog/2024.02.06.md @@ -0,0 +1,3 @@ +# 2024.02.06 + +- Exception response attributes are now `vws.exceptions.response.Response` instances rather than `requests.Response` objects. diff --git a/docs/source/changelog/2024.02.19.md b/docs/source/changelog/2024.02.19.md new file mode 100644 index 000000000..02519f488 --- /dev/null +++ b/docs/source/changelog/2024.02.19.md @@ -0,0 +1,3 @@ +# 2024.02.19 + +- Add exception response attribute to `vws.exceptions.custom_exceptions.RequestEntityTooLarge`. diff --git a/docs/source/changelog/2024.09.02.md b/docs/source/changelog/2024.09.02.md new file mode 100644 index 000000000..1a0eddd10 --- /dev/null +++ b/docs/source/changelog/2024.09.02.md @@ -0,0 +1,5 @@ +# 2024.09.02 + +- Breaking change: Exception names now end with `Error`. +- Use a timeout (30 seconds) when making requests to the VWS API. +- Type hint changes: images are now `io.BytesIO` instances or `io.BufferedRandom`. diff --git a/docs/source/changelog/2024.09.03.md b/docs/source/changelog/2024.09.03.md new file mode 100644 index 000000000..76fd8debd --- /dev/null +++ b/docs/source/changelog/2024.09.03.md @@ -0,0 +1,3 @@ +# 2024.09.03 + +- Make `VWS.make_request` a public method. diff --git a/docs/source/changelog/2024.09.04.1.md b/docs/source/changelog/2024.09.04.1.md new file mode 100644 index 000000000..59d97aeeb --- /dev/null +++ b/docs/source/changelog/2024.09.04.1.md @@ -0,0 +1 @@ +# 2024.09.04.1 diff --git a/docs/source/changelog/2024.09.04.md b/docs/source/changelog/2024.09.04.md new file mode 100644 index 000000000..fad4040e4 --- /dev/null +++ b/docs/source/changelog/2024.09.04.md @@ -0,0 +1,4 @@ +# 2024.09.04 + +- Move `Response` from `vws.exceptions.response` to `vws.types`. +- Add `raw` field to `Response`. diff --git a/docs/source/changelog/2024.09.21.md b/docs/source/changelog/2024.09.21.md new file mode 100644 index 000000000..0ea9e169a --- /dev/null +++ b/docs/source/changelog/2024.09.21.md @@ -0,0 +1 @@ +# 2024.09.21 diff --git a/docs/source/changelog/2025.03.10.1.md b/docs/source/changelog/2025.03.10.1.md new file mode 100644 index 000000000..58011245b --- /dev/null +++ b/docs/source/changelog/2025.03.10.1.md @@ -0,0 +1 @@ +# 2025.03.10.1 diff --git a/docs/source/changelog/2025.03.10.md b/docs/source/changelog/2025.03.10.md new file mode 100644 index 000000000..fb554b98c --- /dev/null +++ b/docs/source/changelog/2025.03.10.md @@ -0,0 +1,3 @@ +# 2025.03.10 + +- Removed `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName` which now does not occur in VWS. diff --git a/docs/source/changelog/2026.02.15.md b/docs/source/changelog/2026.02.15.md new file mode 100644 index 000000000..713ec19d0 --- /dev/null +++ b/docs/source/changelog/2026.02.15.md @@ -0,0 +1,5 @@ +# 2026.02.15 + +- Add `request_timeout_seconds` parameter to `VWS` and `CloudRecoService`, allowing customization of the request timeout. + This accepts a float or a `(connect, read)` tuple, matching the `requests` library's timeout interface. + The default remains 30 seconds. diff --git a/docs/source/changelog/2026.02.21.md b/docs/source/changelog/2026.02.21.md new file mode 100644 index 000000000..af3c30bd6 --- /dev/null +++ b/docs/source/changelog/2026.02.21.md @@ -0,0 +1 @@ +# 2026.02.21 diff --git a/docs/source/changelog/2026.02.22.md b/docs/source/changelog/2026.02.22.md new file mode 100644 index 000000000..03ef9d33d --- /dev/null +++ b/docs/source/changelog/2026.02.22.md @@ -0,0 +1 @@ +# 2026.02.22 diff --git a/docs/source/changelog/2026.02.23.md b/docs/source/changelog/2026.02.23.md new file mode 100644 index 000000000..7baa48eed --- /dev/null +++ b/docs/source/changelog/2026.02.23.md @@ -0,0 +1 @@ +# 2026.02.23 diff --git a/docs/source/changelog/2026.02.24.md b/docs/source/changelog/2026.02.24.md new file mode 100644 index 000000000..cdf788fe7 --- /dev/null +++ b/docs/source/changelog/2026.02.24.md @@ -0,0 +1 @@ +# 2026.02.24 diff --git a/docs/source/changelog/2026.02.25.1.md b/docs/source/changelog/2026.02.25.1.md new file mode 100644 index 000000000..f1531f77c --- /dev/null +++ b/docs/source/changelog/2026.02.25.1.md @@ -0,0 +1 @@ +# 2026.02.25.1 diff --git a/docs/source/changelog/2026.02.25.md b/docs/source/changelog/2026.02.25.md new file mode 100644 index 000000000..822ae9199 --- /dev/null +++ b/docs/source/changelog/2026.02.25.md @@ -0,0 +1 @@ +# 2026.02.25 diff --git a/docs/source/changelog/2026.08.14.md b/docs/source/changelog/2026.08.14.md new file mode 100644 index 000000000..fb0438ff5 --- /dev/null +++ b/docs/source/changelog/2026.08.14.md @@ -0,0 +1,13 @@ +# 2026.08.14 + +- Drop Python 3.13 support, update VWS Python Mock, and test quota and project-state error responses against the mock. +- Add `QuotaExceededError`, `LicenseCheckFailedError`, and `AuthorizationFailedError` for documented VuMark Generation API result codes. +- Fix `target_id` on target exceptions when `base_vws_url` includes a path prefix. +- Retain explicitly provided falsy custom transports instead of replacing them with defaults. +- Raise a response-carrying `CloudRecoError` when Cloud Query returns a documented empty or non-JSON 4xx response instead of leaking `JSONDecodeError`. +- Add support for the Model Target Web API. + `ModelTargetService` and `AsyncModelTargetService` create standard and advanced Model Target datasets, wait for them to be generated, download them and delete them. +- Map the `ProjectHasNoApiAccess` result code, as spelled in Vuforia's result codes table, to `ProjectHasNoAPIAccessError`. + The previously mapped `ProjectHasNoAPIAccess` casing, which Vuforia does not document, is no longer mapped. +- Add support for the Database Reco Counts report. + `VWS` and `AsyncVWS` take an optional `database_id`, and have new `request_database_reco_counts_report`, `download_reco_counts_report` and `wait_for_reco_counts_report` methods. diff --git a/docs/source/changelog/2026.08.26.md b/docs/source/changelog/2026.08.26.md new file mode 100644 index 000000000..19de7f567 --- /dev/null +++ b/docs/source/changelog/2026.08.26.md @@ -0,0 +1,3 @@ +# 2026.08.26 + +- Test synchronous and asynchronous Model Target error responses through the public mock API, and include rate-limit and server-error branches in coverage. diff --git a/docs/source/changelog/2026.09.07.md b/docs/source/changelog/2026.09.07.md new file mode 100644 index 000000000..dbefc1456 --- /dev/null +++ b/docs/source/changelog/2026.09.07.md @@ -0,0 +1,5 @@ +# 2026.09.07 + +- Add `HTTPX2Transport` and `AsyncHTTPX2Transport`, which make requests with `httpx2`, the continuation of `httpx` maintained by Pydantic. + The `requests` and `httpx` transports are unchanged. + `httpx` and `httpx2` objects are never mixed: the `httpx` transports raise `httpx` exceptions and the `httpx2` transports raise `httpx2` exceptions. diff --git a/docs/source/conf.py b/docs/source/conf.py index 12553403f..9199087e0 100755 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -17,6 +17,7 @@ author = _pyproject_config.author extensions = [ + "myst_parser", "sphinx_copybutton", "sphinx.ext.autodoc", "sphinx.ext.intersphinx", @@ -27,15 +28,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 28cb6d568..215fdc548 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 000000000..e9ba1c80d --- /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 16b737650..000000000 --- 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 6da878330..000000000 --- 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 significant changes. - -{% endif %} -{% endfor %} diff --git a/newsfragments/+native-markdown.change.md b/newsfragments/+native-markdown.change.md new file mode 100644 index 000000000..d19b771e0 --- /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/3214.change.rst b/newsfragments/3214.change.md similarity index 100% rename from newsfragments/3214.change.rst rename to newsfragments/3214.change.md diff --git a/newsfragments/3215.change.rst b/newsfragments/3215.change.md similarity index 100% rename from newsfragments/3215.change.rst rename to newsfragments/3215.change.md diff --git a/newsfragments/3216.change.md b/newsfragments/3216.change.md new file mode 100644 index 000000000..1b6a11155 --- /dev/null +++ b/newsfragments/3216.change.md @@ -0,0 +1 @@ +Remove supported inline type-checking comments by teaching Ruff about runtime-evaluated `beartype` annotations and postponing test annotations. diff --git a/newsfragments/3216.change.rst b/newsfragments/3216.change.rst deleted file mode 100644 index 5c892d5ff..000000000 --- a/newsfragments/3216.change.rst +++ /dev/null @@ -1 +0,0 @@ -Remove supported inline type-checking comments by teaching Ruff about runtime-evaluated ``beartype`` annotations and postponing test annotations. diff --git a/newsfragments/3218.change.rst b/newsfragments/3218.change.md similarity index 100% rename from newsfragments/3218.change.rst rename to newsfragments/3218.change.md diff --git a/newsfragments/3223.change.rst b/newsfragments/3223.change.md similarity index 100% rename from newsfragments/3223.change.rst rename to newsfragments/3223.change.md diff --git a/newsfragments/README.md b/newsfragments/README.md new file mode 100644 index 000000000..adf0ad975 --- /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 49e0883af..9a6d5defd 100644 --- a/prek.toml +++ b/prek.toml @@ -428,7 +428,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"] @@ -438,7 +438,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 8928df3ed..4fd0ef93d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,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", "sybil==10.1.0", @@ -299,7 +300,7 @@ ignore = [ ".vale.ini", ".vscode/*.json", ".yamlfmt", - "CHANGELOG.rst", + "CHANGELOG.md", "ci", "ci/**", "CODE_OF_CONDUCT.rst", @@ -444,33 +445,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-python/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 ab682abae..beec3e04b 100644 --- a/spelling_private_dict.txt +++ b/spelling_private_dict.txt @@ -12,6 +12,7 @@ LicenseCheckFailed MatchProcessing MaxNumResultsOutOfRange MetadataTooLarge +MyST OAuth OopsAnErrorOccurredPossiblyBadName OopsAnErrorOccurredPossiblyBadNameError @@ -28,6 +29,7 @@ TargetQuotaReached TargetStatusNotSuccess TargetStatusProcessing TooManyRequests +Towncrier Ubuntu UnknownTarget admin