vws-python 2026.9.7__tar.gz → 2026.10.9__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 (159) hide show
  1. {vws_python-2026.9.7 → vws_python-2026.10.9}/.github/workflows/autofix.yml +2 -2
  2. {vws_python-2026.9.7 → vws_python-2026.10.9}/.github/workflows/ci.yml +3 -3
  3. {vws_python-2026.9.7 → vws_python-2026.10.9}/.github/workflows/lint.yml +3 -3
  4. {vws_python-2026.9.7 → vws_python-2026.10.9}/.github/workflows/publish-site.yml +1 -1
  5. {vws_python-2026.9.7 → vws_python-2026.10.9}/.github/workflows/release.yml +8 -17
  6. {vws_python-2026.9.7 → vws_python-2026.10.9}/.vale.ini +2 -2
  7. vws_python-2026.10.9/CHANGELOG.md +3 -0
  8. {vws_python-2026.9.7 → vws_python-2026.10.9}/CODE_OF_CONDUCT.rst +10 -15
  9. {vws_python-2026.9.7/src/vws_python.egg-info → vws_python-2026.10.9}/PKG-INFO +4 -57
  10. {vws_python-2026.9.7 → vws_python-2026.10.9}/README.rst +3 -5
  11. {vws_python-2026.9.7 → vws_python-2026.10.9}/conftest.py +8 -3
  12. {vws_python-2026.9.7 → vws_python-2026.10.9}/docs/source/api-reference.rst +4 -0
  13. vws_python-2026.10.9/docs/source/changelog/2019.11.23.0.md +3 -0
  14. vws_python-2026.10.9/docs/source/changelog/2020.03.21.0.md +3 -0
  15. vws_python-2026.10.9/docs/source/changelog/2020.06.19.0.md +1 -0
  16. vws_python-2026.10.9/docs/source/changelog/2020.08.21.0.md +3 -0
  17. vws_python-2026.10.9/docs/source/changelog/2020.09.07.0.md +5 -0
  18. vws_python-2026.10.9/docs/source/changelog/2021.03.28.0.md +5 -0
  19. vws_python-2026.10.9/docs/source/changelog/2021.03.28.1.md +1 -0
  20. vws_python-2026.10.9/docs/source/changelog/2021.03.28.2.md +1 -0
  21. vws_python-2026.10.9/docs/source/changelog/2023.03.05.md +1 -0
  22. vws_python-2026.10.9/docs/source/changelog/2023.03.25.md +3 -0
  23. vws_python-2026.10.9/docs/source/changelog/2023.05.21.md +3 -0
  24. vws_python-2026.10.9/docs/source/changelog/2023.12.26.md +1 -0
  25. vws_python-2026.10.9/docs/source/changelog/2023.12.27.md +4 -0
  26. vws_python-2026.10.9/docs/source/changelog/2024.02.04.1.md +1 -0
  27. vws_python-2026.10.9/docs/source/changelog/2024.02.04.md +3 -0
  28. vws_python-2026.10.9/docs/source/changelog/2024.02.06.md +3 -0
  29. vws_python-2026.10.9/docs/source/changelog/2024.02.19.md +3 -0
  30. vws_python-2026.10.9/docs/source/changelog/2024.09.02.md +5 -0
  31. vws_python-2026.10.9/docs/source/changelog/2024.09.03.md +3 -0
  32. vws_python-2026.10.9/docs/source/changelog/2024.09.04.1.md +1 -0
  33. vws_python-2026.10.9/docs/source/changelog/2024.09.04.md +4 -0
  34. vws_python-2026.10.9/docs/source/changelog/2024.09.21.md +1 -0
  35. vws_python-2026.10.9/docs/source/changelog/2025.03.10.1.md +1 -0
  36. vws_python-2026.10.9/docs/source/changelog/2025.03.10.md +3 -0
  37. vws_python-2026.10.9/docs/source/changelog/2026.02.15.md +5 -0
  38. vws_python-2026.10.9/docs/source/changelog/2026.02.21.md +1 -0
  39. vws_python-2026.10.9/docs/source/changelog/2026.02.22.md +1 -0
  40. vws_python-2026.10.9/docs/source/changelog/2026.02.23.md +1 -0
  41. vws_python-2026.10.9/docs/source/changelog/2026.02.24.md +1 -0
  42. vws_python-2026.10.9/docs/source/changelog/2026.02.25.1.md +1 -0
  43. vws_python-2026.10.9/docs/source/changelog/2026.02.25.md +1 -0
  44. vws_python-2026.10.9/docs/source/changelog/2026.08.14.md +13 -0
  45. vws_python-2026.10.9/docs/source/changelog/2026.08.26.md +3 -0
  46. vws_python-2026.10.9/docs/source/changelog/2026.09.07.md +5 -0
  47. vws_python-2026.10.9/docs/source/changelog/2026.10.09.md +10 -0
  48. vws_python-2026.10.9/docs/source/changelog.md +11 -0
  49. {vws_python-2026.9.7 → vws_python-2026.10.9}/docs/source/conf.py +4 -3
  50. {vws_python-2026.9.7 → vws_python-2026.10.9}/docs/source/contributing.rst +9 -2
  51. {vws_python-2026.9.7 → vws_python-2026.10.9}/docs/source/index.rst +2 -2
  52. vws_python-2026.10.9/docs/source/unreleased.md +7 -0
  53. vws_python-2026.10.9/newsfragments/README.md +10 -0
  54. {vws_python-2026.9.7 → vws_python-2026.10.9}/prek.toml +57 -42
  55. {vws_python-2026.9.7 → vws_python-2026.10.9}/pyproject.toml +63 -59
  56. {vws_python-2026.9.7 → vws_python-2026.10.9}/spelling_private_dict.txt +4 -0
  57. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/_async_vws_request.py +2 -2
  58. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/_image_utils.py +2 -2
  59. vws_python-2026.10.9/src/vws/_json_utils.py +90 -0
  60. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/_model_targets.py +27 -16
  61. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/_reco_counts.py +2 -2
  62. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/_vws_request.py +2 -2
  63. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/async_model_target_service.py +4 -3
  64. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/async_query.py +40 -23
  65. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/async_vumark_service.py +7 -8
  66. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/async_vws.py +24 -18
  67. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/exceptions/custom_exceptions.py +1 -1
  68. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/exceptions/model_target_exceptions.py +21 -45
  69. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/exceptions/vws_exceptions.py +13 -14
  70. vws_python-2026.10.9/src/vws/json_types.py +6 -0
  71. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/model_target_datasets.py +1 -1
  72. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/model_target_service.py +5 -4
  73. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/query.py +35 -15
  74. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/reports.py +132 -57
  75. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/transports.py +13 -10
  76. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/vumark_service.py +7 -8
  77. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/vws.py +27 -19
  78. {vws_python-2026.9.7 → vws_python-2026.10.9/src/vws_python.egg-info}/PKG-INFO +4 -57
  79. vws_python-2026.10.9/src/vws_python.egg-info/SOURCES.txt +142 -0
  80. vws_python-2026.10.9/src/vws_python.egg-info/requires.txt +6 -0
  81. vws_python-2026.10.9/src/vws_python.egg-info/scm_file_list.json +138 -0
  82. vws_python-2026.10.9/src/vws_python.egg-info/scm_version.json +8 -0
  83. vws_python-2026.10.9/styles/snapper/LongProseLine.yml +11 -0
  84. vws_python-2026.10.9/styles/snapper/SemanticLineBreaks.yml +11 -0
  85. vws_python-2026.10.9/tests/async_model_targets/__init__.py +1 -0
  86. vws_python-2026.10.9/tests/async_model_targets/test_authentication.py +143 -0
  87. vws_python-2026.10.9/tests/async_model_targets/test_datasets.py +350 -0
  88. vws_python-2026.10.9/tests/async_vws/__init__.py +1 -0
  89. vws_python-2026.10.9/tests/async_vws/test_configuration.py +40 -0
  90. vws_python-2026.10.9/tests/async_vws/test_processing.py +77 -0
  91. vws_python-2026.10.9/tests/async_vws/test_reports.py +281 -0
  92. vws_python-2026.10.9/tests/async_vws/test_targets.py +297 -0
  93. vws_python-2026.10.9/tests/async_vws/test_vumark.py +46 -0
  94. {vws_python-2026.9.7 → vws_python-2026.10.9}/tests/conftest.py +18 -9
  95. vws_python-2026.10.9/tests/model_target_credentials.py +6 -0
  96. vws_python-2026.10.9/tests/model_targets/__init__.py +1 -0
  97. vws_python-2026.10.9/tests/model_targets/responses.py +34 -0
  98. vws_python-2026.10.9/tests/model_targets/test_authentication.py +236 -0
  99. vws_python-2026.10.9/tests/model_targets/test_configuration.py +44 -0
  100. vws_python-2026.10.9/tests/model_targets/test_datasets.py +445 -0
  101. vws_python-2026.10.9/tests/model_targets/test_errors.py +84 -0
  102. {vws_python-2026.9.7 → vws_python-2026.10.9}/tests/test_async_cloud_reco_exceptions.py +7 -2
  103. vws_python-2026.10.9/tests/test_async_query.py +257 -0
  104. {vws_python-2026.9.7 → vws_python-2026.10.9}/tests/test_async_vws_exceptions.py +8 -3
  105. {vws_python-2026.9.7 → vws_python-2026.10.9}/tests/test_cloud_reco_exceptions.py +13 -8
  106. vws_python-2026.10.9/tests/test_query.py +493 -0
  107. vws_python-2026.10.9/tests/test_reports.py +40 -0
  108. {vws_python-2026.9.7 → vws_python-2026.10.9}/tests/test_vws_exceptions.py +38 -18
  109. vws_python-2026.10.9/tests/transports/__init__.py +1 -0
  110. vws_python-2026.10.9/tests/transports/test_httpx.py +523 -0
  111. vws_python-2026.10.9/tests/transports/test_httpx2.py +728 -0
  112. vws_python-2026.10.9/tests/vws/__init__.py +1 -0
  113. vws_python-2026.10.9/tests/vws/test_configuration.py +175 -0
  114. vws_python-2026.10.9/tests/vws/test_processing.py +176 -0
  115. vws_python-2026.10.9/tests/vws/test_reports.py +354 -0
  116. vws_python-2026.10.9/tests/vws/test_targets.py +374 -0
  117. vws_python-2026.10.9/tests/vws/test_vumark.py +33 -0
  118. vws_python-2026.9.7/CHANGELOG.rst +0 -178
  119. vws_python-2026.9.7/docs/source/changelog.rst +0 -1
  120. vws_python-2026.9.7/docs/source/unreleased.rst +0 -8
  121. vws_python-2026.9.7/docs/towncrier_template.rst.jinja +0 -14
  122. vws_python-2026.9.7/src/vws_python.egg-info/SOURCES.txt +0 -82
  123. vws_python-2026.9.7/src/vws_python.egg-info/requires.txt +0 -59
  124. vws_python-2026.9.7/src/vws_python.egg-info/scm_file_list.json +0 -78
  125. vws_python-2026.9.7/src/vws_python.egg-info/scm_version.json +0 -8
  126. vws_python-2026.9.7/tests/test_async_model_targets.py +0 -505
  127. vws_python-2026.9.7/tests/test_async_query.py +0 -225
  128. vws_python-2026.9.7/tests/test_async_vws.py +0 -731
  129. vws_python-2026.9.7/tests/test_model_targets.py +0 -791
  130. vws_python-2026.9.7/tests/test_query.py +0 -437
  131. vws_python-2026.9.7/tests/test_transports.py +0 -1111
  132. vws_python-2026.9.7/tests/test_vws.py +0 -1045
  133. {vws_python-2026.9.7 → vws_python-2026.10.9}/.git_archival.txt +0 -0
  134. {vws_python-2026.9.7 → vws_python-2026.10.9}/.gitattributes +0 -0
  135. {vws_python-2026.9.7 → vws_python-2026.10.9}/.github/dependabot.yml +0 -0
  136. {vws_python-2026.9.7 → vws_python-2026.10.9}/.github/workflows/dependabot-merge.yml +0 -0
  137. {vws_python-2026.9.7 → vws_python-2026.10.9}/.gitignore +0 -0
  138. {vws_python-2026.9.7 → vws_python-2026.10.9}/.prettierrc +0 -0
  139. {vws_python-2026.9.7 → vws_python-2026.10.9}/.vscode/extensions.json +0 -0
  140. {vws_python-2026.9.7 → vws_python-2026.10.9}/.vscode/settings.json +0 -0
  141. {vws_python-2026.9.7 → vws_python-2026.10.9}/LICENSE +0 -0
  142. {vws_python-2026.9.7 → vws_python-2026.10.9}/docs/source/__init__.py +0 -0
  143. {vws_python-2026.9.7 → vws_python-2026.10.9}/docs/source/exceptions.rst +0 -0
  144. {vws_python-2026.9.7 → vws_python-2026.10.9}/docs/source/release-process.rst +0 -0
  145. {vws_python-2026.9.7 → vws_python-2026.10.9}/newsfragments/.gitkeep +0 -0
  146. {vws_python-2026.9.7 → vws_python-2026.10.9}/setup.cfg +0 -0
  147. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/__init__.py +0 -0
  148. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/exceptions/__init__.py +0 -0
  149. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/exceptions/base_exceptions.py +0 -0
  150. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/exceptions/cloud_reco_exceptions.py +0 -0
  151. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/include_target_data.py +0 -0
  152. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/py.typed +0 -0
  153. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/response.py +0 -0
  154. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws/vumark_accept.py +0 -0
  155. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws_python.egg-info/dependency_links.txt +0 -0
  156. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws_python.egg-info/not-zip-safe +0 -0
  157. {vws_python-2026.9.7 → vws_python-2026.10.9}/src/vws_python.egg-info/top_level.txt +0 -0
  158. {vws_python-2026.9.7 → vws_python-2026.10.9}/tests/__init__.py +0 -0
  159. {vws_python-2026.9.7 → vws_python-2026.10.9}/zizmor.yml +0 -0
@@ -21,10 +21,10 @@ jobs:
21
21
  persist-credentials: false
22
22
 
23
23
  - name: Install uv
24
- uses: astral-sh/setup-uv@v10.0.1
24
+ uses: astral-sh/setup-uv@v10.2.0
25
25
 
26
26
  - name: Run fixers
27
- uses: j178/prek-action@v3.0.0
27
+ uses: j178/prek-action@v3.0.1
28
28
  with:
29
29
  prek-version: 0.4.11
30
30
  extra-args: >-
@@ -28,7 +28,7 @@ jobs:
28
28
  persist-credentials: false
29
29
 
30
30
  - name: Install uv
31
- uses: astral-sh/setup-uv@v10.0.1
31
+ uses: astral-sh/setup-uv@v10.2.0
32
32
  with:
33
33
  enable-cache: true
34
34
  cache-dependency-glob: '**/pyproject.toml'
@@ -37,12 +37,12 @@ jobs:
37
37
  run: |
38
38
  # We run tests against "." and not the tests directory as we test the README
39
39
  # and documentation.
40
- uv run --extra=dev --python=${{ matrix.python-version }} pytest -s -vvv --cov-fail-under 100 --cov=src/ --cov=tests/ .
40
+ uv run --group=dev --python=${{ matrix.python-version }} pytest -s -vvv . --cov --cov-config=pyproject.toml
41
41
 
42
42
  completion-ci:
43
43
  needs: build
44
44
  runs-on: ubuntu-latest
45
- if: always() # Run even if one matrix job fails
45
+ if: ${{ !cancelled() }} # Run even if one matrix job fails
46
46
  steps:
47
47
  - name: Check matrix job status
48
48
  run: |-
@@ -29,13 +29,13 @@ jobs:
29
29
  persist-credentials: false
30
30
 
31
31
  - name: Install uv
32
- uses: astral-sh/setup-uv@v10.0.1
32
+ uses: astral-sh/setup-uv@v10.2.0
33
33
  with:
34
34
  enable-cache: true
35
35
  cache-dependency-glob: '**/pyproject.toml'
36
36
 
37
37
  - name: Lint
38
- uses: j178/prek-action@v3.0.0
38
+ uses: j178/prek-action@v3.0.1
39
39
  with:
40
40
  prek-version: 0.4.11
41
41
  cache: false
@@ -48,7 +48,7 @@ jobs:
48
48
  completion-lint:
49
49
  needs: build
50
50
  runs-on: ubuntu-latest
51
- if: always() # Run even if one matrix job fails
51
+ if: ${{ !cancelled() }} # Run even if one matrix job fails
52
52
  steps:
53
53
  - name: Check matrix job status
54
54
  run: |-
@@ -21,7 +21,7 @@ jobs:
21
21
  uses: sphinx-notes/pages@v3
22
22
  with:
23
23
  documentation_path: docs/source
24
- pyproject_extras: dev
24
+ pyproject_group: dev
25
25
  python_version: '3.14'
26
26
  sphinx_build_options: -W
27
27
  cache: true
@@ -33,7 +33,7 @@ jobs:
33
33
  fetch-depth: 0
34
34
 
35
35
  - name: Install uv
36
- uses: astral-sh/setup-uv@v10.0.1
36
+ uses: astral-sh/setup-uv@v10.2.0
37
37
  with:
38
38
  enable-cache: true
39
39
  cache-dependency-glob: '**/pyproject.toml'
@@ -47,33 +47,24 @@ jobs:
47
47
  env:
48
48
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49
49
 
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
50
+ - name: Assemble native Markdown release notes
54
51
  env:
55
52
  RELEASE: ${{ steps.calver.outputs.release }}
56
- run: uv run --extra=release towncrier build --draft --version "$RELEASE" >
57
- release-notes.md
58
-
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"
53
+ run: |
54
+ uv run --group=release towncrier build --yes --version "$RELEASE"
55
+ cp "docs/source/changelog/$RELEASE.md" release-notes.md
65
56
 
66
57
  - uses: stefanzweifel/git-auto-commit-action@v7
67
58
  id: commit
68
59
  with:
69
60
  commit_message: Bump CHANGELOG
70
- file_pattern: CHANGELOG.rst newsfragments
61
+ file_pattern: CHANGELOG.md docs/source/changelog newsfragments
71
62
  # Error if there are no changes.
72
63
  skip_dirty_check: true
73
64
 
74
65
  - name: Bump version and push tag
75
66
  id: tag_version
76
- uses: mathieudutour/github-tag-action@v6.2
67
+ uses: mathieudutour/github-tag-action@v7
77
68
  with:
78
69
  github_token: ${{ secrets.GITHUB_TOKEN }}
79
70
  custom_tag: ${{ steps.calver.outputs.release }}
@@ -95,7 +86,7 @@ jobs:
95
86
  git fetch --tags
96
87
  git checkout "$NEW_TAG"
97
88
  uv build --sdist --wheel --out-dir dist/
98
- uv run --extra=release check-wheel-contents dist/*.whl
89
+ uv run --group=release check-wheel-contents dist/*.whl
99
90
 
100
91
  - name: Publish distribution 📦 to PyPI
101
92
  # We use PyPI trusted publishing rather than a PyPI API token.
@@ -4,12 +4,12 @@ MinAlertLevel = error
4
4
  Packages = https://github.com/tbhb/vale-ai-tells/releases/download/v1.29.0/ai-tells.zip
5
5
 
6
6
  [*.{rst,md}]
7
- BasedOnStyles = ai-tells
7
+ BasedOnStyles = ai-tells, snapper
8
+ snapper.SemanticLineBreaks = error
8
9
 
9
10
  # These rules misclassify established technical, example, or release-note prose
10
11
  # in this repository. All other ai-tells rules remain enforced.
11
12
  ai-tells.ColonUsage = NO
12
- ai-tells.FigurativeLands = NO
13
13
  ai-tells.FormalTransitions = NO
14
14
  ai-tells.OverusedVocabularyVerbs = NO
15
15
  ai-tells.VerbTricolon = NO
@@ -0,0 +1,3 @@
1
+ # Changelog
2
+
3
+ Release notes are stored as [one Markdown file per version](docs/source/changelog/).
@@ -11,19 +11,9 @@ Our Standards
11
11
 
12
12
  Examples of behavior that contributes to creating a positive environment include:
13
13
 
14
- Using welcoming and inclusive language
15
- Being respectful of differing viewpoints and experiences
16
- Gracefully accepting constructive criticism
17
- Focusing on what is best for the community
18
- Showing empathy towards other community members
19
- Examples of unacceptable behavior by participants include:
20
-
21
- The use of sexualized language or imagery and unwelcome sexual attention or advances
22
- Trolling, insulting/derogatory comments, and personal or political attacks
23
- Public or private harassment
24
- Publishing others' private information, such as a physical or electronic address, without explicit permission
25
- Other conduct which could reasonably be considered inappropriate in a professional setting
26
- Our Responsibilities
14
+ Using welcoming and inclusive language Being respectful of differing viewpoints and experiences Gracefully accepting constructive criticism Focusing on what is best for the community Showing empathy towards other community members Examples of unacceptable behavior by participants include:
15
+
16
+ The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Our Responsibilities
27
17
 
28
18
  Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
29
19
 
@@ -32,12 +22,17 @@ Project maintainers have the right and responsibility to remove, edit, or reject
32
22
  Scope
33
23
  -----
34
24
 
35
- This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
25
+ This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
26
+ Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
27
+ Representation of a project may be further defined and clarified by project maintainers.
36
28
 
37
29
  Enforcement
38
30
  -----------
39
31
 
40
- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at adamdangoor@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
32
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at adamdangoor@gmail.com.
33
+ All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
34
+ The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
35
+ Further details of specific enforcement policies may be posted separately.
41
36
 
42
37
  Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
43
38
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python
3
- Version: 2026.9.7
3
+ Version: 2026.10.9
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
@@ -22,57 +22,6 @@ Requires-Dist: httpx2>=2.12
22
22
  Requires-Dist: requests>=2.32.3
23
23
  Requires-Dist: urllib3>=2.2.3
24
24
  Requires-Dist: vws-auth-tools>=2024.7.12
25
- Provides-Extra: dev
26
- Requires-Dist: actionlint-py==1.7.12.24; extra == "dev"
27
- Requires-Dist: check-manifest==0.51; extra == "dev"
28
- Requires-Dist: deptry==0.25.1; extra == "dev"
29
- Requires-Dist: doc8==2.0.0; extra == "dev"
30
- Requires-Dist: doccmd==2026.9.1; extra == "dev"
31
- Requires-Dist: freezegun==1.5.5; extra == "dev"
32
- Requires-Dist: furo==2025.12.19; extra == "dev"
33
- Requires-Dist: interrogate==1.7.0; extra == "dev"
34
- Requires-Dist: mypy[faster-cache]==2.3.1; extra == "dev"
35
- Requires-Dist: mypy-strict-kwargs==2026.8.25.1; extra == "dev"
36
- Requires-Dist: no-defaults==2026.9.1; extra == "dev"
37
- Requires-Dist: prek==0.5.2; extra == "dev"
38
- Requires-Dist: pydocstringformatter==1.0.0; extra == "dev"
39
- Requires-Dist: pydocstyle==6.3; extra == "dev"
40
- Requires-Dist: pygments==2.21.0; extra == "dev"
41
- Requires-Dist: pylint[spelling]==4.0.8; extra == "dev"
42
- Requires-Dist: pylint-per-file-ignores==3.2.1; extra == "dev"
43
- Requires-Dist: pyproject-fmt==2.29.3; extra == "dev"
44
- Requires-Dist: pyrefly==1.2.0; extra == "dev"
45
- Requires-Dist: pyright==1.1.411; extra == "dev"
46
- Requires-Dist: pyroma==5.0.1; extra == "dev"
47
- Requires-Dist: pytest==9.1.1; extra == "dev"
48
- Requires-Dist: pytest-asyncio==1.4.0; extra == "dev"
49
- Requires-Dist: pytest-beartype-tests==2026.8.16; extra == "dev"
50
- Requires-Dist: pytest-cov==7.1.0; extra == "dev"
51
- Requires-Dist: pyyaml==6.0.3; extra == "dev"
52
- Requires-Dist: ruff==0.16.6; extra == "dev"
53
- Requires-Dist: shellcheck-py==0.11.0.1; extra == "dev"
54
- Requires-Dist: shfmt-py==4.1.0; extra == "dev"
55
- Requires-Dist: sphinx==9.1.0; extra == "dev"
56
- Requires-Dist: sphinx-copybutton==0.5.2; extra == "dev"
57
- Requires-Dist: sphinx-lint==1.0.2; extra == "dev"
58
- Requires-Dist: sphinx-pyproject==0.3.0; extra == "dev"
59
- Requires-Dist: sphinx-substitution-extensions==2026.8.13.1; extra == "dev"
60
- Requires-Dist: sphinxcontrib-spelling==8.0.2; extra == "dev"
61
- Requires-Dist: sphinxcontrib-towncrier==0.5.0a0; extra == "dev"
62
- Requires-Dist: strict-kwargs==2026.8.28.post2; extra == "dev"
63
- Requires-Dist: sybil==10.1.0; extra == "dev"
64
- Requires-Dist: towncrier==25.8.0; extra == "dev"
65
- Requires-Dist: ty==0.0.78; extra == "dev"
66
- Requires-Dist: types-requests==2.33.0.20260712; extra == "dev"
67
- Requires-Dist: vale==3.20.0.0; extra == "dev"
68
- Requires-Dist: vulture==2.16; extra == "dev"
69
- Requires-Dist: vws-python-mock==2026.9.6; extra == "dev"
70
- Requires-Dist: vws-test-fixtures==2026.8.26; extra == "dev"
71
- Requires-Dist: yamlfix==1.19.1; extra == "dev"
72
- Requires-Dist: zizmor==1.30.0; extra == "dev"
73
- Provides-Extra: release
74
- Requires-Dist: check-wheel-contents==0.6.3; extra == "release"
75
- Requires-Dist: towncrier==25.8.0; extra == "release"
76
25
  Dynamic: license-file
77
26
 
78
27
  |Build Status| |PyPI|
@@ -80,8 +29,7 @@ Dynamic: license-file
80
29
  vws-python
81
30
  ==========
82
31
 
83
- Python library for the Vuforia Web Services (VWS) API and the Vuforia
84
- Web Query API.
32
+ Python library for the Vuforia Web Services (VWS) API and the Vuforia Web Query API.
85
33
 
86
34
  Installation
87
35
  ------------
@@ -90,9 +38,8 @@ Installation
90
38
 
91
39
  pip install vws-python
92
40
 
93
- This is tested on Python |minimum-python-version|\+. Get in touch with
94
- ``adamdangoor@gmail.com`` if you would like to use this with another
95
- language.
41
+ This is tested on Python |minimum-python-version|\+.
42
+ Get in touch with ``adamdangoor@gmail.com`` if you would like to use this with another language.
96
43
 
97
44
  Getting Started
98
45
  ---------------
@@ -3,8 +3,7 @@
3
3
  vws-python
4
4
  ==========
5
5
 
6
- Python library for the Vuforia Web Services (VWS) API and the Vuforia
7
- Web Query API.
6
+ Python library for the Vuforia Web Services (VWS) API and the Vuforia Web Query API.
8
7
 
9
8
  Installation
10
9
  ------------
@@ -13,9 +12,8 @@ Installation
13
12
 
14
13
  pip install vws-python
15
14
 
16
- This is tested on Python |minimum-python-version|\+. Get in touch with
17
- ``adamdangoor@gmail.com`` if you would like to use this with another
18
- language.
15
+ This is tested on Python |minimum-python-version|\+.
16
+ Get in touch with ``adamdangoor@gmail.com`` if you would like to use this with another language.
19
17
 
20
18
  Getting Started
21
19
  ---------------
@@ -1,10 +1,11 @@
1
1
  """Setup for Sybil."""
2
2
 
3
- import io # noqa: TC003
3
+ from __future__ import annotations
4
+
4
5
  import uuid
5
- from collections.abc import Generator # noqa: TC003
6
6
  from doctest import ELLIPSIS
7
7
  from pathlib import Path
8
+ from typing import TYPE_CHECKING
8
9
 
9
10
  import pytest
10
11
  from mock_vws import MockVWS
@@ -16,6 +17,10 @@ from sybil.parsers.rest import (
16
17
  PythonCodeBlockParser,
17
18
  )
18
19
 
20
+ if TYPE_CHECKING:
21
+ import io
22
+ from collections.abc import Generator
23
+
19
24
 
20
25
  @pytest.fixture(name="make_image_file")
21
26
  def fixture_make_image_file(
@@ -28,7 +33,7 @@ def fixture_make_image_file(
28
33
  """
29
34
  new_image = Path("high_quality_image.jpg")
30
35
  buffer = high_quality_image.getvalue()
31
- new_image.write_bytes(data=buffer)
36
+ _ = new_image.write_bytes(data=buffer)
32
37
  yield
33
38
  new_image.unlink()
34
39
 
@@ -33,6 +33,10 @@ API Reference
33
33
  :undoc-members:
34
34
  :members:
35
35
 
36
+ .. automodule:: vws.json_types
37
+ :undoc-members:
38
+ :members:
39
+
36
40
  .. automodule:: vws.include_target_data
37
41
  :undoc-members:
38
42
  :members:
@@ -0,0 +1,3 @@
1
+ # 2019.11.23.0
2
+
3
+ - Make `active_flag` and `application_metadata` required on `add_target`.
@@ -0,0 +1,3 @@
1
+ # 2020.03.21.0
2
+
3
+ - Add Windows support.
@@ -0,0 +1 @@
1
+ # 2020.06.19.0
@@ -0,0 +1,3 @@
1
+ # 2020.08.21.0
2
+
3
+ - Change the return type of `vws_client.get_target_record` to match what is returned by the web API.
@@ -0,0 +1,5 @@
1
+ # 2020.09.07.0
2
+
3
+ - Breaking change: Move exceptions and create base exceptions.
4
+ It is now possible to, for example, catch `vws.exceptions.base_exceptions.VWSException` to catch many of the exceptions raised by the `VWS` client.
5
+ Credit to `@laymonage` for this change.
@@ -0,0 +1,5 @@
1
+ # 2021.03.28.0
2
+
3
+ - Breaking change: The `vws.exceptions.cloud_reco_exceptions.MatchProcessing` is now `vws.exceptions.custom_exceptions.ActiveMatchingTargetsDeleteProcessing`.
4
+ - Added new exception `vws.exceptions.custom_exceptions.RequestEntityTooLarge`.
5
+ - Add better exception handling when querying a server which does not serve the Vuforia API.
@@ -0,0 +1 @@
1
+ # 2021.03.28.1
@@ -0,0 +1 @@
1
+ # 2021.03.28.2
@@ -0,0 +1 @@
1
+ # 2023.03.05
@@ -0,0 +1,3 @@
1
+ # 2023.03.25
2
+
3
+ - Support file-like objects in every method which accepts a file.
@@ -0,0 +1,3 @@
1
+ # 2023.05.21
2
+
3
+ - Breaking change: the `vws.exceptions.custom_exceptions.ActiveMatchingTargetsDeleteProcessing` exception has been removed as Vuforia no longer returns this error.
@@ -0,0 +1 @@
1
+ # 2023.12.26
@@ -0,0 +1,4 @@
1
+ # 2023.12.27
2
+
3
+ - Breaking change: The `vws.exceptions.cloud_reco_exceptions.UnknownVWSErrorPossiblyBadName` is now `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName`.
4
+ - `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName` now has a `response` parameter and attribute.
@@ -0,0 +1 @@
1
+ # 2024.02.04.1
@@ -0,0 +1,3 @@
1
+ # 2024.02.04
2
+
3
+ - Return a new error (`vws.custom_exceptions.ServerError`) when the server returns a 5xx status code.
@@ -0,0 +1,3 @@
1
+ # 2024.02.06
2
+
3
+ - Exception response attributes are now `vws.exceptions.response.Response` instances rather than `requests.Response` objects.
@@ -0,0 +1,3 @@
1
+ # 2024.02.19
2
+
3
+ - Add exception response attribute to `vws.exceptions.custom_exceptions.RequestEntityTooLarge`.
@@ -0,0 +1,5 @@
1
+ # 2024.09.02
2
+
3
+ - Breaking change: Exception names now end with `Error`.
4
+ - Use a timeout (30 seconds) when making requests to the VWS API.
5
+ - Type hint changes: images are now `io.BytesIO` instances or `io.BufferedRandom`.
@@ -0,0 +1,3 @@
1
+ # 2024.09.03
2
+
3
+ - Make `VWS.make_request` a public method.
@@ -0,0 +1 @@
1
+ # 2024.09.04.1
@@ -0,0 +1,4 @@
1
+ # 2024.09.04
2
+
3
+ - Move `Response` from `vws.exceptions.response` to `vws.types`.
4
+ - Add `raw` field to `Response`.
@@ -0,0 +1 @@
1
+ # 2024.09.21
@@ -0,0 +1 @@
1
+ # 2025.03.10.1
@@ -0,0 +1,3 @@
1
+ # 2025.03.10
2
+
3
+ - Removed `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName` which now does not occur in VWS.
@@ -0,0 +1,5 @@
1
+ # 2026.02.15
2
+
3
+ - Add `request_timeout_seconds` parameter to `VWS` and `CloudRecoService`, allowing customization of the request timeout.
4
+ This accepts a float or a `(connect, read)` tuple, matching the `requests` library's timeout interface.
5
+ The default remains 30 seconds.
@@ -0,0 +1 @@
1
+ # 2026.02.21
@@ -0,0 +1 @@
1
+ # 2026.02.22
@@ -0,0 +1 @@
1
+ # 2026.02.23
@@ -0,0 +1 @@
1
+ # 2026.02.24
@@ -0,0 +1 @@
1
+ # 2026.02.25.1
@@ -0,0 +1 @@
1
+ # 2026.02.25
@@ -0,0 +1,13 @@
1
+ # 2026.08.14
2
+
3
+ - Drop Python 3.13 support, update VWS Python Mock, and test quota and project-state error responses against the mock.
4
+ - Add `QuotaExceededError`, `LicenseCheckFailedError`, and `AuthorizationFailedError` for documented VuMark Generation API result codes.
5
+ - Fix `target_id` on target exceptions when `base_vws_url` includes a path prefix.
6
+ - Retain explicitly provided falsy custom transports instead of replacing them with defaults.
7
+ - Raise a response-carrying `CloudRecoError` when Cloud Query returns a documented empty or non-JSON 4xx response instead of leaking `JSONDecodeError`.
8
+ - Add support for the Model Target Web API.
9
+ `ModelTargetService` and `AsyncModelTargetService` create standard and advanced Model Target datasets, wait for them to be generated, download them and delete them.
10
+ - Map the `ProjectHasNoApiAccess` result code, as spelled in Vuforia's result codes table, to `ProjectHasNoAPIAccessError`.
11
+ The previously mapped `ProjectHasNoAPIAccess` casing, which Vuforia does not document, is no longer mapped.
12
+ - Add support for the Database Reco Counts report.
13
+ `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.
@@ -0,0 +1,3 @@
1
+ # 2026.08.26
2
+
3
+ - Test synchronous and asynchronous Model Target error responses through the public mock API, and include rate-limit and server-error branches in coverage.
@@ -0,0 +1,5 @@
1
+ # 2026.09.07
2
+
3
+ - Add `HTTPX2Transport` and `AsyncHTTPX2Transport`, which make requests with `httpx2`, the continuation of `httpx` maintained by Pydantic.
4
+ The `requests` and `httpx` transports are unchanged.
5
+ `httpx` and `httpx2` objects are never mixed: the `httpx` transports raise `httpx` exceptions and the `httpx2` transports raise `httpx2` exceptions.
@@ -0,0 +1,10 @@
1
+ # 2026.10.09 (2026-10-09)
2
+
3
+ ## Changes
4
+
5
+ - Cover server errors from synchronous and asynchronous cloud recognition queries. ([#3214](https://github.com/VWS-Python/vws-python/issues/3214))
6
+ - Model test credentials as pairs and name OAuth endpoint metadata precisely, avoiding secret false positives. ([#3215](https://github.com/VWS-Python/vws-python/issues/3215))
7
+ - Remove supported inline type-checking comments by teaching Ruff about runtime-evaluated `beartype` annotations and postponing test annotations. ([#3216](https://github.com/VWS-Python/vws-python/issues/3216))
8
+ - Validate query and Model Target report response values at construction time. ([#3218](https://github.com/VWS-Python/vws-python/issues/3218))
9
+ - Type decoded report response dictionaries as JSON values. ([#3223](https://github.com/VWS-Python/vws-python/issues/3223))
10
+ - Publish native Markdown release notes and use the same notes in documentation where available.
@@ -0,0 +1,11 @@
1
+ # Changelog
2
+
3
+ Releases are assembled from `newsfragments/` using Towncrier.
4
+
5
+ ```{toctree}
6
+ :maxdepth: 1
7
+ :glob:
8
+ :reversed:
9
+
10
+ changelog/*
11
+ ```
@@ -17,6 +17,7 @@ project = _pyproject_config.name
17
17
  author = _pyproject_config.author
18
18
 
19
19
  extensions = [
20
+ "myst_parser",
20
21
  "sphinx_copybutton",
21
22
  "sphinx.ext.autodoc",
22
23
  "sphinx.ext.intersphinx",
@@ -27,15 +28,15 @@ extensions = [
27
28
  ]
28
29
 
29
30
  # Render the unreleased ``newsfragments/`` entries into
30
- # ``docs/source/unreleased.rst`` so the Sphinx spelling, doc-build and
31
+ # ``docs/source/unreleased.md`` so the Sphinx spelling, doc-build and
31
32
  # link-checking gates cover the prose before it is assembled into
32
- # CHANGELOG.rst at release time.
33
+ # the versioned Markdown notes at release time.
33
34
  towncrier_draft_autoversion_mode = "draft"
34
35
  towncrier_draft_include_empty = True
35
36
  towncrier_draft_working_directory = f"{_pyproject_file.parent}"
36
37
 
37
38
  templates_path = ["_templates"]
38
- source_suffix = ".rst"
39
+ source_suffix = {".rst": "restructuredtext", ".md": "markdown"}
39
40
  master_doc = "index"
40
41
 
41
42
  project_copyright = f"%Y, {author}"
@@ -12,7 +12,7 @@ Install Python dependencies in a virtual environment.
12
12
 
13
13
  .. code-block:: console
14
14
 
15
- $ pip install --editable '.[dev]'
15
+ $ pip install --editable . --group dev
16
16
 
17
17
  Spell checking requires ``enchant``.
18
18
  This can be installed on macOS, for example, with `Homebrew`_:
@@ -64,7 +64,7 @@ Run the following commands to build and view documentation locally:
64
64
 
65
65
  .. code-block:: console
66
66
 
67
- $ uv run --extra=dev sphinx-build -M html docs/source docs/build -W
67
+ $ uv run --group=dev sphinx-build -M html docs/source docs/build -W
68
68
  $ python -c 'import os, webbrowser; webbrowser.open("file://" + os.path.abspath("docs/build/html/index.html"))'
69
69
 
70
70
  Continuous integration
@@ -77,3 +77,10 @@ Performing a release
77
77
  --------------------
78
78
 
79
79
  See :doc:`release-process`.
80
+
81
+ Release notes
82
+ -------------
83
+
84
+ Write user-facing changes as Markdown in ``newsfragments/<issue>.change.md``.
85
+ Towncrier writes one Markdown file per version, used directly for GitHub release notes.
86
+ Invalid fragment names fail release assembly.
@@ -108,7 +108,7 @@ The report is generated in the background, and the URL it is served from expires
108
108
  }
109
109
 
110
110
  # This database has no targets, so nothing has been recognized.
111
- assert not reco_counts_by_target_id
111
+ assert reco_counts_by_target_id == {}
112
112
 
113
113
  Model Targets
114
114
  -------------
@@ -218,7 +218,7 @@ Transports are available for `requests`_, `httpx`_ and `HTTPX2`_.
218
218
  )
219
219
 
220
220
  # This database has no targets.
221
- assert not vws_client.list_targets()
221
+ assert len(vws_client.list_targets()) == 0
222
222
 
223
223
  .. _requests: https://pypi.org/project/requests/
224
224
  .. _httpx: https://pypi.org/project/httpx/
@@ -0,0 +1,7 @@
1
+ # Unreleased changes
2
+
3
+ Changes merged into the main branch but not yet part of a tagged release.
4
+ These entries are assembled into the {doc}`changelog` when the next release is published.
5
+
6
+ ```{towncrier-draft-entries}
7
+ ```