vws-python 2026.2.25.1__tar.gz → 2026.8.26__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.github/dependabot.yml +5 -0
  2. vws_python-2026.8.26/.github/workflows/autofix.yml +37 -0
  3. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.github/workflows/ci.yml +3 -3
  4. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.github/workflows/dependabot-merge.yml +2 -6
  5. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.github/workflows/lint.yml +10 -11
  6. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.github/workflows/publish-site.yml +1 -1
  7. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.github/workflows/release.yml +21 -25
  8. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.gitignore +3 -0
  9. vws_python-2026.8.26/.vale.ini +15 -0
  10. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/CHANGELOG.rst +28 -2
  11. {vws_python-2026.2.25.1/src/vws_python.egg-info → vws_python-2026.8.26}/PKG-INFO +36 -32
  12. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/README.rst +1 -1
  13. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/conftest.py +15 -11
  14. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/docs/source/api-reference.rst +12 -0
  15. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/docs/source/conf.py +9 -0
  16. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/docs/source/exceptions.rst +9 -0
  17. vws_python-2026.8.26/docs/source/index.rst +254 -0
  18. vws_python-2026.8.26/docs/source/unreleased.rst +8 -0
  19. vws_python-2026.8.26/docs/towncrier_template.rst.jinja +14 -0
  20. vws_python-2026.8.26/prek.toml +528 -0
  21. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/pyproject.toml +253 -187
  22. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/spelling_private_dict.txt +11 -1
  23. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/__init__.py +4 -0
  24. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/_async_vws_request.py +2 -2
  25. vws_python-2026.8.26/src/vws/_model_targets.py +319 -0
  26. vws_python-2026.8.26/src/vws/_reco_counts.py +80 -0
  27. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/_vws_request.py +2 -2
  28. vws_python-2026.8.26/src/vws/async_model_target_service.py +381 -0
  29. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/async_query.py +31 -9
  30. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/async_vumark_service.py +17 -32
  31. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/async_vws.py +167 -49
  32. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/exceptions/base_exceptions.py +26 -1
  33. vws_python-2026.8.26/src/vws/exceptions/custom_exceptions.py +107 -0
  34. vws_python-2026.8.26/src/vws/exceptions/model_target_exceptions.py +210 -0
  35. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/exceptions/vws_exceptions.py +76 -24
  36. vws_python-2026.8.26/src/vws/model_target_datasets.py +152 -0
  37. vws_python-2026.8.26/src/vws/model_target_service.py +366 -0
  38. vws_python-2026.8.26/src/vws/py.typed +0 -0
  39. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/query.py +30 -4
  40. vws_python-2026.8.26/src/vws/reports.py +391 -0
  41. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/response.py +1 -1
  42. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/transports.py +71 -34
  43. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/vumark_service.py +16 -29
  44. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/vws.py +165 -46
  45. {vws_python-2026.2.25.1 → vws_python-2026.8.26/src/vws_python.egg-info}/PKG-INFO +36 -32
  46. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws_python.egg-info/SOURCES.txt +16 -1
  47. vws_python-2026.8.26/src/vws_python.egg-info/requires.txt +58 -0
  48. vws_python-2026.8.26/src/vws_python.egg-info/scm_file_list.json +78 -0
  49. vws_python-2026.8.26/src/vws_python.egg-info/scm_version.json +8 -0
  50. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/conftest.py +96 -3
  51. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_async_cloud_reco_exceptions.py +78 -4
  52. vws_python-2026.8.26/tests/test_async_model_targets.py +505 -0
  53. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_async_query.py +1 -1
  54. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_async_vws.py +232 -1
  55. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_async_vws_exceptions.py +133 -2
  56. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_cloud_reco_exceptions.py +75 -4
  57. vws_python-2026.8.26/tests/test_model_targets.py +791 -0
  58. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_query.py +1 -1
  59. vws_python-2026.8.26/tests/test_transports.py +407 -0
  60. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_vws.py +259 -2
  61. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/test_vws_exceptions.py +238 -6
  62. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/zizmor.yml +1 -3
  63. vws_python-2026.2.25.1/.pre-commit-config.yaml +0 -408
  64. vws_python-2026.2.25.1/docs/source/index.rst +0 -127
  65. vws_python-2026.2.25.1/src/vws/exceptions/custom_exceptions.py +0 -52
  66. vws_python-2026.2.25.1/src/vws/reports.py +0 -188
  67. vws_python-2026.2.25.1/src/vws_python.egg-info/requires.txt +0 -53
  68. vws_python-2026.2.25.1/tests/test_transports.py +0 -206
  69. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.git_archival.txt +0 -0
  70. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.gitattributes +0 -0
  71. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.prettierrc +0 -0
  72. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.vscode/extensions.json +0 -0
  73. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/.vscode/settings.json +0 -0
  74. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/CODE_OF_CONDUCT.rst +0 -0
  75. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/LICENSE +0 -0
  76. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/docs/source/__init__.py +0 -0
  77. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/docs/source/changelog.rst +0 -0
  78. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/docs/source/contributing.rst +0 -0
  79. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/docs/source/release-process.rst +0 -0
  80. /vws_python-2026.2.25.1/src/vws/py.typed → /vws_python-2026.8.26/newsfragments/.gitkeep +0 -0
  81. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/setup.cfg +0 -0
  82. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/_image_utils.py +0 -0
  83. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/exceptions/__init__.py +0 -0
  84. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/exceptions/cloud_reco_exceptions.py +0 -0
  85. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/include_target_data.py +0 -0
  86. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws/vumark_accept.py +0 -0
  87. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws_python.egg-info/dependency_links.txt +0 -0
  88. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws_python.egg-info/not-zip-safe +0 -0
  89. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/src/vws_python.egg-info/top_level.txt +0 -0
  90. {vws_python-2026.2.25.1 → vws_python-2026.8.26}/tests/__init__.py +0 -0
@@ -12,3 +12,8 @@ updates:
12
12
  schedule:
13
13
  interval: daily
14
14
  open-pull-requests-limit: 10
15
+
16
+ - package-ecosystem: pre-commit
17
+ directory: /
18
+ schedule:
19
+ interval: daily
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: autofix.ci
3
+
4
+ on:
5
+ pull_request:
6
+ branches: [main]
7
+ push:
8
+ branches: [main]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ autofix:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+ with:
19
+ fetch-depth: 0
20
+ fetch-tags: true
21
+ persist-credentials: false
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v10.0.1
25
+
26
+ - name: Run fixers
27
+ uses: j178/prek-action@v3.0.0
28
+ with:
29
+ prek-version: 0.4.11
30
+ extra-args: >-
31
+ --all-files --hook-stage pre-commit --no-fail-fast --verbose
32
+ env:
33
+ UV_NO_CACHE: '1'
34
+ UV_PYTHON: 3.14
35
+
36
+ - uses: autofix-ci/action@v1.3.4
37
+ if: always()
@@ -17,18 +17,18 @@ jobs:
17
17
  build:
18
18
  strategy:
19
19
  matrix:
20
- python-version: ['3.13', '3.14']
20
+ python-version: ['3.14']
21
21
  platform: [ubuntu-latest, windows-latest]
22
22
 
23
23
  runs-on: ${{ matrix.platform }}
24
24
 
25
25
  steps:
26
- - uses: actions/checkout@v6
26
+ - uses: actions/checkout@v7
27
27
  with:
28
28
  persist-credentials: false
29
29
 
30
30
  - name: Install uv
31
- uses: astral-sh/setup-uv@v7
31
+ uses: astral-sh/setup-uv@v10.0.1
32
32
  with:
33
33
  enable-cache: true
34
34
  cache-dependency-glob: '**/pyproject.toml'
@@ -1,4 +1,5 @@
1
1
  ---
2
+
2
3
  name: Dependabot auto-merge
3
4
  on: pull_request
4
5
 
@@ -9,13 +10,8 @@ permissions:
9
10
  jobs:
10
11
  dependabot:
11
12
  runs-on: ubuntu-latest
12
- if: github.actor == 'dependabot[bot]'
13
+ if: github.event.pull_request.user.login == 'dependabot[bot]'
13
14
  steps:
14
- - name: Dependabot metadata
15
- id: metadata
16
- uses: dependabot/fetch-metadata@v2
17
- with:
18
- github-token: ${{ secrets.GITHUB_TOKEN }}
19
15
  - name: Enable auto-merge for Dependabot PRs
20
16
  run: gh pr merge --auto --merge "$PR_URL"
21
17
  env:
@@ -17,35 +17,34 @@ jobs:
17
17
  build:
18
18
  strategy:
19
19
  matrix:
20
- python-version: ['3.13']
20
+ python-version: ['3.14']
21
21
  platform: [ubuntu-latest, windows-latest]
22
22
  hook-stage: [pre-commit, pre-push, manual]
23
23
 
24
24
  runs-on: ${{ matrix.platform }}
25
25
 
26
26
  steps:
27
- - uses: actions/checkout@v6
27
+ - uses: actions/checkout@v7
28
28
  with:
29
29
  persist-credentials: false
30
30
 
31
31
  - name: Install uv
32
- uses: astral-sh/setup-uv@v7
32
+ uses: astral-sh/setup-uv@v10.0.1
33
33
  with:
34
34
  enable-cache: true
35
35
  cache-dependency-glob: '**/pyproject.toml'
36
36
 
37
37
  - name: Lint
38
- # Use bash to ensure the step fails if any command fails.
39
- # PowerShell does not fail on intermediate command failures by default.
40
- shell: bash
41
- run: uv run --extra=dev prek run --all-files --hook-stage ${{ matrix.hook-stage }}
42
- --verbose
38
+ uses: j178/prek-action@v3.0.0
39
+ with:
40
+ prek-version: 0.4.11
41
+ cache: false
42
+ extra-args: >-
43
+ --all-files --hook-stage ${{ matrix.hook-stage }} --verbose
43
44
  env:
45
+ UV_NO_CACHE: '1'
44
46
  UV_PYTHON: ${{ matrix.python-version }}
45
47
 
46
- - uses: pre-commit-ci/lite-action@v1.1.0
47
- if: always()
48
-
49
48
  completion-lint:
50
49
  needs: build
51
50
  runs-on: ubuntu-latest
@@ -22,7 +22,7 @@ jobs:
22
22
  with:
23
23
  documentation_path: docs/source
24
24
  pyproject_extras: dev
25
- python_version: '3.13'
25
+ python_version: '3.14'
26
26
  sphinx_build_options: -W
27
27
  cache: true
28
28
  publish: ${{ github.ref_name == 'main' }}
@@ -20,7 +20,7 @@ jobs:
20
20
  contents: write
21
21
 
22
22
  steps:
23
- - uses: actions/checkout@v6
23
+ - uses: actions/checkout@v7
24
24
  with: # zizmor: ignore[artipacked] git-auto-commit-action requires credentials
25
25
  # See
26
26
  # https://github.com/stefanzweifel/git-auto-commit-action?tab=readme-ov-file#push-to-protected-branches
@@ -33,7 +33,7 @@ jobs:
33
33
  fetch-depth: 0
34
34
 
35
35
  - name: Install uv
36
- uses: astral-sh/setup-uv@v7
36
+ uses: astral-sh/setup-uv@v10.0.1
37
37
  with:
38
38
  enable-cache: true
39
39
  cache-dependency-glob: '**/pyproject.toml'
@@ -47,33 +47,27 @@ jobs:
47
47
  env:
48
48
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49
49
 
50
- - name: Get the changelog underline
51
- id: changelog_underline
52
- run: |
53
- underline="$(echo "${{ steps.calver.outputs.release }}" | tr -c '\n' '-')"
54
- echo "underline=${underline}" >> "$GITHUB_OUTPUT"
50
+ # towncrier writes the rendered notes to stdout (informational
51
+ # chatter goes to stderr), so this is the curated release body for
52
+ # this version, not github-tag-action's commit-derived changelog.
53
+ - name: Generate the GitHub release notes
54
+ env:
55
+ RELEASE: ${{ steps.calver.outputs.release }}
56
+ run: uv run --extra=release towncrier build --draft --version "$RELEASE" >
57
+ release-notes.md
55
58
 
56
- - name: Update changelog
57
- id: update_changelog
58
- uses: jacobtomlinson/gha-find-replace@v3
59
- with:
60
- find: "Next\n----"
61
- replace: "Next\n----\n\n${{ steps.calver.outputs.release }}\n${{ steps.changelog_underline.outputs.underline\
62
- \ }}\n"
63
- include: CHANGELOG.rst
64
- regex: false
59
+ # Assemble the same fragments into CHANGELOG.rst under a new
60
+ # ``$RELEASE`` section and delete the consumed fragment files.
61
+ - name: Update the changelog
62
+ env:
63
+ RELEASE: ${{ steps.calver.outputs.release }}
64
+ run: uv run --extra=release towncrier build --yes --version "$RELEASE"
65
65
 
66
- - name: Check Update changelog was modified
67
- run: |
68
- if [ "${{ steps.update_changelog.outputs.modifiedFiles }}" = "0" ]; then
69
- echo "Error: No files were modified when updating changelog"
70
- exit 1
71
- fi
72
66
  - uses: stefanzweifel/git-auto-commit-action@v7
73
67
  id: commit
74
68
  with:
75
69
  commit_message: Bump CHANGELOG
76
- file_pattern: CHANGELOG.rst
70
+ file_pattern: CHANGELOG.rst newsfragments
77
71
  # Error if there are no changes.
78
72
  skip_dirty_check: true
79
73
 
@@ -92,12 +86,14 @@ jobs:
92
86
  tag: ${{ steps.tag_version.outputs.new_tag }}
93
87
  makeLatest: true
94
88
  name: Release ${{ steps.tag_version.outputs.new_tag }}
95
- body: ${{ steps.tag_version.outputs.changelog }}
89
+ bodyFile: release-notes.md
96
90
 
97
91
  - name: Build a binary wheel and a source tarball
92
+ env:
93
+ NEW_TAG: ${{ steps.tag_version.outputs.new_tag }}
98
94
  run: |
99
95
  git fetch --tags
100
- git checkout ${{ steps.tag_version.outputs.new_tag }}
96
+ git checkout "$NEW_TAG"
101
97
  uv build --sdist --wheel --out-dir dist/
102
98
  uv run --extra=release check-wheel-contents dist/*.whl
103
99
 
@@ -112,3 +112,6 @@ secrets.tar
112
112
  src/*/_setuptools_scm_version.txt
113
113
 
114
114
  uv.lock
115
+
116
+ # Vale styles downloaded by ``vale sync``
117
+ styles/
@@ -0,0 +1,15 @@
1
+ StylesPath = styles
2
+ MinAlertLevel = error
3
+
4
+ Packages = https://github.com/tbhb/vale-ai-tells/releases/download/v1.29.0/ai-tells.zip
5
+
6
+ [*.{rst,md}]
7
+ BasedOnStyles = ai-tells
8
+
9
+ # These rules misclassify established technical, example, or release-note prose
10
+ # in this repository. All other ai-tells rules remain enforced.
11
+ ai-tells.ColonUsage = NO
12
+ ai-tells.FigurativeLands = NO
13
+ ai-tells.FormalTransitions = NO
14
+ ai-tells.OverusedVocabularyVerbs = NO
15
+ ai-tells.VerbTricolon = NO
@@ -1,8 +1,34 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
- Next
5
- ----
4
+ .. towncrier release notes start
5
+
6
+ 2026.08.26
7
+ ----------
8
+
9
+ - Test synchronous and asynchronous Model Target error responses through the
10
+ public mock API, and include rate-limit and server-error branches in coverage.
11
+
12
+ 2026.08.14
13
+ ----------
14
+
15
+ - Drop Python 3.13 support, update VWS Python Mock, and test quota and project-state error responses against the mock.
16
+
17
+ - Add ``QuotaExceededError``, ``LicenseCheckFailedError``, and ``AuthorizationFailedError`` for documented VuMark Generation API result codes.
18
+
19
+ - Fix ``target_id`` on target exceptions when ``base_vws_url`` includes a path prefix.
20
+
21
+ - Retain explicitly provided falsy custom transports instead of replacing them with defaults.
22
+
23
+ - Raise a response-carrying ``CloudRecoError`` when Cloud Query returns a documented empty or non-JSON 4xx response instead of leaking ``JSONDecodeError``.
24
+
25
+ - Add support for the Model Target Web API.
26
+ ``ModelTargetService`` and ``AsyncModelTargetService`` create standard and advanced Model Target datasets, wait for them to be generated, download them and delete them.
27
+
28
+ - 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.
29
+
30
+ - Add support for the Database Reco Counts report.
31
+ ``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.
6
32
 
7
33
  2026.02.25.1
8
34
  ------------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python
3
- Version: 2026.2.25.1
3
+ Version: 2026.8.26
4
4
  Summary: Interact with the Vuforia Web Services (VWS) API.
5
5
  Author-email: Adam Dangoor <adamdangoor@gmail.com>
6
6
  License-Expression: MIT
@@ -12,9 +12,8 @@ Classifier: Environment :: Web Environment
12
12
  Classifier: Operating System :: Microsoft :: Windows
13
13
  Classifier: Operating System :: POSIX
14
14
  Classifier: Programming Language :: Python :: 3 :: Only
15
- Classifier: Programming Language :: Python :: 3.13
16
15
  Classifier: Programming Language :: Python :: 3.14
17
- Requires-Python: >=3.13
16
+ Requires-Python: >=3.14
18
17
  Description-Content-Type: text/x-rst
19
18
  License-File: LICENSE
20
19
  Requires-Dist: beartype>=0.22.9
@@ -23,51 +22,56 @@ Requires-Dist: requests>=2.32.3
23
22
  Requires-Dist: urllib3>=2.2.3
24
23
  Requires-Dist: vws-auth-tools>=2024.7.12
25
24
  Provides-Extra: dev
26
- Requires-Dist: actionlint-py==1.7.11.24; extra == "dev"
25
+ Requires-Dist: actionlint-py==1.7.12.24; extra == "dev"
27
26
  Requires-Dist: check-manifest==0.51; extra == "dev"
28
- Requires-Dist: deptry==0.24.0; extra == "dev"
27
+ Requires-Dist: deptry==0.25.1; extra == "dev"
29
28
  Requires-Dist: doc8==2.0.0; extra == "dev"
30
- Requires-Dist: doccmd==2026.2.15; extra == "dev"
29
+ Requires-Dist: doccmd==2026.8.16; extra == "dev"
31
30
  Requires-Dist: freezegun==1.5.5; extra == "dev"
32
31
  Requires-Dist: furo==2025.12.19; extra == "dev"
33
32
  Requires-Dist: interrogate==1.7.0; extra == "dev"
34
- Requires-Dist: mypy[faster-cache]==1.19.1; extra == "dev"
35
- Requires-Dist: mypy-strict-kwargs==2026.1.12; extra == "dev"
36
- Requires-Dist: prek==0.3.3; extra == "dev"
37
- Requires-Dist: pydocstringformatter==0.7.5; extra == "dev"
33
+ Requires-Dist: mypy[faster-cache]==2.3.1; extra == "dev"
34
+ Requires-Dist: mypy-strict-kwargs==2026.8.25.1; extra == "dev"
35
+ Requires-Dist: no-defaults==2.1.0; extra == "dev"
36
+ Requires-Dist: prek==0.4.14; extra == "dev"
37
+ Requires-Dist: pydocstringformatter==1.0.0; extra == "dev"
38
38
  Requires-Dist: pydocstyle==6.3; extra == "dev"
39
- Requires-Dist: pygments==2.19.2; extra == "dev"
40
- Requires-Dist: pylint[spelling]==4.0.5; extra == "dev"
41
- Requires-Dist: pylint-per-file-ignores==3.2.0; extra == "dev"
42
- Requires-Dist: pyproject-fmt==2.16.2; extra == "dev"
43
- Requires-Dist: pyrefly==0.54.0; extra == "dev"
44
- Requires-Dist: pyright==1.1.408; extra == "dev"
39
+ Requires-Dist: pygments==2.21.0; extra == "dev"
40
+ Requires-Dist: pylint[spelling]==4.0.7; extra == "dev"
41
+ Requires-Dist: pylint-per-file-ignores==3.2.1; extra == "dev"
42
+ Requires-Dist: pyproject-fmt==2.28.0; extra == "dev"
43
+ Requires-Dist: pyrefly==1.2.0; extra == "dev"
44
+ Requires-Dist: pyright==1.1.411; extra == "dev"
45
45
  Requires-Dist: pyroma==5.0.1; extra == "dev"
46
- Requires-Dist: pytest==9.0.2; extra == "dev"
47
- Requires-Dist: pytest-asyncio==1.3.0; extra == "dev"
48
- Requires-Dist: pytest-cov==7.0.0; extra == "dev"
46
+ Requires-Dist: pytest==9.1.1; extra == "dev"
47
+ Requires-Dist: pytest-asyncio==1.4.0; extra == "dev"
48
+ Requires-Dist: pytest-beartype-tests==2026.8.16; extra == "dev"
49
+ Requires-Dist: pytest-cov==7.1.0; extra == "dev"
49
50
  Requires-Dist: pyyaml==6.0.3; extra == "dev"
50
- Requires-Dist: ruff==0.15.2; extra == "dev"
51
+ Requires-Dist: ruff==0.16.4; extra == "dev"
51
52
  Requires-Dist: shellcheck-py==0.11.0.1; extra == "dev"
52
- Requires-Dist: shfmt-py==3.12.0.2; extra == "dev"
53
+ Requires-Dist: shfmt-py==4.0.0; extra == "dev"
53
54
  Requires-Dist: sphinx==9.1.0; extra == "dev"
54
55
  Requires-Dist: sphinx-copybutton==0.5.2; extra == "dev"
55
56
  Requires-Dist: sphinx-lint==1.0.2; extra == "dev"
56
57
  Requires-Dist: sphinx-pyproject==0.3.0; extra == "dev"
57
- Requires-Dist: sphinx-substitution-extensions==2026.1.12; extra == "dev"
58
+ Requires-Dist: sphinx-substitution-extensions==2026.8.13.1; extra == "dev"
58
59
  Requires-Dist: sphinxcontrib-spelling==8.0.2; extra == "dev"
59
- Requires-Dist: sybil==9.3.0; extra == "dev"
60
- Requires-Dist: torch>=2.5.1; extra == "dev"
61
- Requires-Dist: torchvision>=0.20.1; extra == "dev"
62
- Requires-Dist: ty==0.0.18; extra == "dev"
63
- Requires-Dist: types-requests==2.32.4.20260107; extra == "dev"
64
- Requires-Dist: vulture==2.14; extra == "dev"
65
- Requires-Dist: vws-python-mock==2026.2.22.3; extra == "dev"
66
- Requires-Dist: vws-test-fixtures==2023.3.5; extra == "dev"
60
+ Requires-Dist: sphinxcontrib-towncrier==0.5.0a0; extra == "dev"
61
+ Requires-Dist: strict-kwargs==2026.8.16; extra == "dev"
62
+ Requires-Dist: sybil==10.1.0; extra == "dev"
63
+ Requires-Dist: towncrier==25.8.0; extra == "dev"
64
+ Requires-Dist: ty==0.0.74; extra == "dev"
65
+ Requires-Dist: types-requests==2.33.0.20260712; extra == "dev"
66
+ Requires-Dist: vale==3.18.0.0; extra == "dev"
67
+ Requires-Dist: vulture==2.16; extra == "dev"
68
+ Requires-Dist: vws-python-mock==2026.8.26.1; extra == "dev"
69
+ Requires-Dist: vws-test-fixtures==2026.8.23; extra == "dev"
67
70
  Requires-Dist: yamlfix==1.19.1; extra == "dev"
68
- Requires-Dist: zizmor==1.22.0; extra == "dev"
71
+ Requires-Dist: zizmor==1.29.0; extra == "dev"
69
72
  Provides-Extra: release
70
73
  Requires-Dist: check-wheel-contents==0.6.3; extra == "release"
74
+ Requires-Dist: towncrier==25.8.0; extra == "release"
71
75
  Dynamic: license-file
72
76
 
73
77
  |Build Status| |PyPI|
@@ -145,4 +149,4 @@ See the `full documentation <https://vws-python.github.io/vws-python/>`__.
145
149
  :target: https://github.com/VWS-Python/vws-python/actions
146
150
  .. |PyPI| image:: https://badge.fury.io/py/VWS-Python.svg
147
151
  :target: https://badge.fury.io/py/VWS-Python
148
- .. |minimum-python-version| replace:: 3.13
152
+ .. |minimum-python-version| replace:: 3.14
@@ -73,4 +73,4 @@ See the `full documentation <https://vws-python.github.io/vws-python/>`__.
73
73
  :target: https://github.com/VWS-Python/vws-python/actions
74
74
  .. |PyPI| image:: https://badge.fury.io/py/VWS-Python.svg
75
75
  :target: https://badge.fury.io/py/VWS-Python
76
- .. |minimum-python-version| replace:: 3.13
76
+ .. |minimum-python-version| replace:: 3.14
@@ -1,13 +1,12 @@
1
1
  """Setup for Sybil."""
2
2
 
3
- import io
3
+ import io # noqa: TC003
4
4
  import uuid
5
- from collections.abc import Generator
5
+ from collections.abc import Generator # noqa: TC003
6
6
  from doctest import ELLIPSIS
7
7
  from pathlib import Path
8
8
 
9
9
  import pytest
10
- from beartype import beartype
11
10
  from mock_vws import MockVWS
12
11
  from mock_vws.database import CloudDatabase
13
12
  from sybil import Sybil
@@ -18,14 +17,6 @@ from sybil.parsers.rest import (
18
17
  )
19
18
 
20
19
 
21
- @beartype
22
- def pytest_collection_modifyitems(items: list[pytest.Item]) -> None:
23
- """Apply the beartype decorator to all collected test functions."""
24
- for item in items:
25
- if isinstance(item, pytest.Function):
26
- item.obj = beartype(obj=item.obj)
27
-
28
-
29
20
  @pytest.fixture(name="make_image_file")
30
21
  def fixture_make_image_file(
31
22
  *,
@@ -55,18 +46,31 @@ def fixture_mock_vws(
55
46
  server_secret_key = uuid.uuid4().hex
56
47
  client_access_key = uuid.uuid4().hex
57
48
  client_secret_key = uuid.uuid4().hex
49
+ database_id = uuid.uuid4().hex
58
50
 
59
51
  database = CloudDatabase(
60
52
  server_access_key=server_access_key,
61
53
  server_secret_key=server_secret_key,
62
54
  client_access_key=client_access_key,
63
55
  client_secret_key=client_secret_key,
56
+ database_id=database_id,
64
57
  )
65
58
 
66
59
  monkeypatch.setenv(name="VWS_SERVER_ACCESS_KEY", value=server_access_key)
67
60
  monkeypatch.setenv(name="VWS_SERVER_SECRET_KEY", value=server_secret_key)
68
61
  monkeypatch.setenv(name="VWS_CLIENT_ACCESS_KEY", value=client_access_key)
69
62
  monkeypatch.setenv(name="VWS_CLIENT_SECRET_KEY", value=client_secret_key)
63
+ monkeypatch.setenv(name="VWS_DATABASE_ID", value=database_id)
64
+ # The mock accepts one hard-coded pair of Model Target Web API OAuth2
65
+ # credentials, which it does not expose.
66
+ monkeypatch.setenv(
67
+ name="VWS_MODEL_TARGET_CLIENT_ID",
68
+ value="client-id",
69
+ )
70
+ monkeypatch.setenv(
71
+ name="VWS_MODEL_TARGET_CLIENT_SECRET",
72
+ value="client-secret",
73
+ )
70
74
  # We use a low processing time so that tests run quickly.
71
75
  with MockVWS(processing_time_seconds=0.2) as mock:
72
76
  mock.add_cloud_database(cloud_database=database)
@@ -17,6 +17,18 @@ API Reference
17
17
  :undoc-members:
18
18
  :members:
19
19
 
20
+ .. automodule:: vws.model_target_service
21
+ :undoc-members:
22
+ :members:
23
+
24
+ .. automodule:: vws.async_model_target_service
25
+ :undoc-members:
26
+ :members:
27
+
28
+ .. automodule:: vws.model_target_datasets
29
+ :undoc-members:
30
+ :members:
31
+
20
32
  .. automodule:: vws.reports
21
33
  :undoc-members:
22
34
  :members:
@@ -23,8 +23,17 @@ extensions = [
23
23
  "sphinx.ext.napoleon",
24
24
  "sphinx_substitution_extensions",
25
25
  "sphinxcontrib.spelling",
26
+ "sphinxcontrib.towncrier.ext",
26
27
  ]
27
28
 
29
+ # Render the unreleased ``newsfragments/`` entries into
30
+ # ``docs/source/unreleased.rst`` so the Sphinx spelling, doc-build and
31
+ # link-checking gates cover the prose before it is assembled into
32
+ # CHANGELOG.rst at release time.
33
+ towncrier_draft_autoversion_mode = "draft"
34
+ towncrier_draft_include_empty = True
35
+ towncrier_draft_working_directory = f"{_pyproject_file.parent}"
36
+
28
37
  templates_path = ["_templates"]
29
38
  source_suffix = ".rst"
30
39
  master_doc = "index"
@@ -28,6 +28,15 @@ CloudRecoService exceptions
28
28
  :inherited-members: Exception
29
29
  :exclude-members: errno, filename, filename2, strerror
30
30
 
31
+ ModelTargetService exceptions
32
+ -----------------------------
33
+
34
+ .. automodule:: vws.exceptions.model_target_exceptions
35
+ :members:
36
+ :show-inheritance:
37
+ :inherited-members: Exception
38
+ :exclude-members: errno, filename, filename2, strerror
39
+
31
40
  Custom exceptions
32
41
  -----------------
33
42