vws-python-mock 2026.9.12__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 (278) hide show
  1. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.dockerignore +1 -1
  2. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/workflows/autofix.yml +2 -2
  3. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/workflows/docker-build.yml +2 -2
  4. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/workflows/lint.yml +3 -3
  5. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/workflows/release.yml +9 -18
  6. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/workflows/test.yml +12 -12
  7. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.vale.ini +0 -1
  8. vws_python_mock-2026.10.9/CHANGELOG.md +3 -0
  9. vws_python_mock-2026.10.9/MANIFEST.in +1 -0
  10. {vws_python_mock-2026.9.12/src/vws_python_mock.egg-info → vws_python_mock-2026.10.9}/PKG-INFO +4 -4
  11. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/README.rst +3 -3
  12. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/admin/create_secrets_files.py +1 -6
  13. vws_python_mock-2026.10.9/docs/source/changelog/2018.09.10.0.md +3 -0
  14. vws_python_mock-2026.10.9/docs/source/changelog/2018.12.01.0.md +3 -0
  15. vws_python_mock-2026.10.9/docs/source/changelog/2024.02.16.md +3 -0
  16. vws_python_mock-2026.10.9/docs/source/changelog/2024.07.02.1.md +3 -0
  17. vws_python_mock-2026.10.9/docs/source/changelog/2024.07.15.md +3 -0
  18. vws_python_mock-2026.10.9/docs/source/changelog/2024.08.30.md +1 -0
  19. vws_python_mock-2026.10.9/docs/source/changelog/2025.02.18.md +1 -0
  20. vws_python_mock-2026.10.9/docs/source/changelog/2025.02.21.md +1 -0
  21. vws_python_mock-2026.10.9/docs/source/changelog/2025.03.10.1.md +1 -0
  22. vws_python_mock-2026.10.9/docs/source/changelog/2025.03.10.md +1 -0
  23. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.15.3.md +4 -0
  24. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.15.4.md +3 -0
  25. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.15.5.md +1 -0
  26. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.18.1.md +1 -0
  27. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.18.2.md +1 -0
  28. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.18.md +1 -0
  29. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.21.md +5 -0
  30. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.22.1.md +1 -0
  31. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.22.2.md +1 -0
  32. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.22.3.md +4 -0
  33. vws_python_mock-2026.10.9/docs/source/changelog/2026.02.22.md +1 -0
  34. vws_python_mock-2026.10.9/docs/source/changelog/2026.04.26.md +1 -0
  35. vws_python_mock-2026.10.9/docs/source/changelog/2026.08.04.2.md +16 -0
  36. vws_python_mock-2026.10.9/docs/source/changelog/2026.08.14.md +39 -0
  37. vws_python_mock-2026.10.9/docs/source/changelog/2026.08.26.1.md +3 -0
  38. vws_python_mock-2026.10.9/docs/source/changelog/2026.08.26.md +9 -0
  39. vws_python_mock-2026.10.9/docs/source/changelog/2026.09.06.md +31 -0
  40. vws_python_mock-2026.10.9/docs/source/changelog/2026.09.08.1.md +6 -0
  41. vws_python_mock-2026.10.9/docs/source/changelog/2026.09.08.md +6 -0
  42. vws_python_mock-2026.10.9/docs/source/changelog/2026.09.12.md +6 -0
  43. vws_python_mock-2026.10.9/docs/source/changelog/2026.10.09.md +13 -0
  44. vws_python_mock-2026.10.9/docs/source/changelog.md +11 -0
  45. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/ci-setup.rst +2 -1
  46. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/conf.py +4 -7
  47. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/contributing.rst +58 -4
  48. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/differences-to-vws.rst +13 -34
  49. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/docker.rst +97 -6
  50. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/index.rst +3 -3
  51. vws_python_mock-2026.10.9/docs/source/unreleased.md +7 -0
  52. vws_python_mock-2026.10.9/newsfragments/README.md +10 -0
  53. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/prek.toml +7 -5
  54. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/pyproject.toml +48 -61
  55. vws_python_mock-2026.10.9/secrets.tar.gpg +0 -0
  56. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/spelling_private_dict.txt +5 -0
  57. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_flask_server/healthcheck.py +2 -1
  58. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_flask_server/target_manager.py +5 -1
  59. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_flask_server/vwq.py +10 -8
  60. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_flask_server/vws.py +27 -16
  61. vws_python_mock-2026.10.9/src/mock_vws/_httpx2_mock_server/decorators.py +89 -0
  62. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_model_target_web_api.py +259 -173
  63. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/content_length_validators.py +1 -2
  64. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/exceptions.py +2 -6
  65. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/image_validators.py +1 -4
  66. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_reco_counts_web_api.py +2 -6
  67. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_requests_mock_server/mock_web_services_api.py +3 -1
  68. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_respx_mock_server/decorators.py +61 -11
  69. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/content_length_validators.py +1 -2
  70. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/exceptions.py +1 -2
  71. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/project_state_validators.py +19 -20
  72. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/decorators.py +5 -3
  73. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/image_matchers.py +1 -3
  74. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/model_target.py +2 -2
  75. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/target.py +16 -11
  76. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/target_raters.py +1 -3
  77. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9/src/vws_python_mock.egg-info}/PKG-INFO +4 -4
  78. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/vws_python_mock.egg-info/SOURCES.txt +83 -10
  79. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/vws_python_mock.egg-info/scm_file_list.json +82 -9
  80. vws_python_mock-2026.10.9/src/vws_python_mock.egg-info/scm_version.json +8 -0
  81. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/conftest.py +40 -19
  82. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/fixtures/model_target_prepared_requests.py +6 -3
  83. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/fixtures/prepared_requests.py +1 -2
  84. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/fixtures/vuforia_backends.py +6 -2
  85. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/__init__.py +1 -0
  86. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/conftest.py +83 -0
  87. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_concurrency.py +303 -0
  88. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_databases.py +470 -0
  89. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_delays.py +72 -0
  90. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_images.py +397 -0
  91. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_model_targets.py +191 -0
  92. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_processing.py +64 -0
  93. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_quotas.py +110 -0
  94. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_reports.py +48 -0
  95. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_routing.py +24 -0
  96. vws_python_mock-2026.10.9/tests/mock_vws/flask_app/test_vumark.py +129 -0
  97. vws_python_mock-2026.10.9/tests/mock_vws/httpx2_mock/__init__.py +1 -0
  98. vws_python_mock-2026.10.9/tests/mock_vws/httpx2_mock/test_async_vws.py +93 -0
  99. vws_python_mock-2026.10.9/tests/mock_vws/httpx2_mock/test_model_targets.py +59 -0
  100. vws_python_mock-2026.10.9/tests/mock_vws/httpx2_mock/test_query.py +95 -0
  101. vws_python_mock-2026.10.9/tests/mock_vws/httpx2_mock/test_transports.py +102 -0
  102. vws_python_mock-2026.10.9/tests/mock_vws/httpx2_mock/test_vumark.py +71 -0
  103. vws_python_mock-2026.10.9/tests/mock_vws/httpx2_mock/test_vws.py +136 -0
  104. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/__init__.py +1 -0
  105. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/assertions.py +50 -0
  106. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/authentication.py +25 -0
  107. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/responses.py +83 -0
  108. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/sample_data.py +37 -0
  109. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/test_authentication.py +787 -0
  110. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/test_datasets.py +795 -0
  111. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/test_errors.py +795 -0
  112. vws_python_mock-2026.10.9/tests/mock_vws/model_target_web_api/test_requests.py +382 -0
  113. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/__init__.py +1 -0
  114. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/conftest.py +29 -0
  115. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_databases.py +361 -0
  116. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_decorator.py +449 -0
  117. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_delays.py +199 -0
  118. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_headers.py +34 -0
  119. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_images.py +439 -0
  120. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_model_targets.py +161 -0
  121. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_network.py +313 -0
  122. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_payloads.py +37 -0
  123. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_quotas.py +444 -0
  124. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_targets.py +312 -0
  125. vws_python_mock-2026.10.9/tests/mock_vws/requests_mock/test_vumark.py +51 -0
  126. vws_python_mock-2026.10.9/tests/mock_vws/respx_mock/__init__.py +1 -0
  127. vws_python_mock-2026.10.9/tests/mock_vws/respx_mock/test_model_targets.py +59 -0
  128. vws_python_mock-2026.10.9/tests/mock_vws/respx_mock/test_query.py +41 -0
  129. vws_python_mock-2026.10.9/tests/mock_vws/respx_mock/test_vumark.py +32 -0
  130. vws_python_mock-2026.10.9/tests/mock_vws/respx_mock/test_vws.py +113 -0
  131. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_add_target.py +3 -2
  132. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_content_length.py +8 -2
  133. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_database_summary.py +25 -29
  134. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_docker.py +234 -138
  135. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_healthcheck.py +42 -0
  136. vws_python_mock-2026.10.9/tests/mock_vws/test_model_target_retries.py +221 -0
  137. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_query.py +40 -5
  138. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_target_raters.py +23 -27
  139. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_update_target.py +3 -2
  140. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/__init__.py +1 -0
  141. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/assertions.py +4 -8
  142. vws_python_mock-2026.10.9/typings/pyprojroot/__init__.pyi +23 -0
  143. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/uv.lock +507 -497
  144. vws_python_mock-2026.9.12/CHANGELOG.rst +0 -283
  145. vws_python_mock-2026.9.12/MANIFEST.in +0 -0
  146. vws_python_mock-2026.9.12/docs/source/changelog.rst +0 -1
  147. vws_python_mock-2026.9.12/docs/source/unreleased.rst +0 -8
  148. vws_python_mock-2026.9.12/docs/towncrier_template.rst.jinja +0 -14
  149. vws_python_mock-2026.9.12/secrets.tar.gpg +0 -0
  150. vws_python_mock-2026.9.12/src/mock_vws/_httpx2_mock_server/decorators.py +0 -393
  151. vws_python_mock-2026.9.12/src/vws_python_mock.egg-info/scm_version.json +0 -8
  152. vws_python_mock-2026.9.12/tests/mock_vws/test_flask_app_usage.py +0 -1769
  153. vws_python_mock-2026.9.12/tests/mock_vws/test_httpx2_mock_usage.py +0 -537
  154. vws_python_mock-2026.9.12/tests/mock_vws/test_model_target_retries.py +0 -229
  155. vws_python_mock-2026.9.12/tests/mock_vws/test_model_target_web_api.py +0 -2786
  156. vws_python_mock-2026.9.12/tests/mock_vws/test_requests_mock_usage.py +0 -2698
  157. vws_python_mock-2026.9.12/tests/mock_vws/test_respx_mock_usage.py +0 -239
  158. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.git_archival.txt +0 -0
  159. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.gitattributes +0 -0
  160. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/dependabot.yml +0 -0
  161. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/workflows/dependabot-merge.yml +0 -0
  162. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.github/workflows/publish-site.yml +0 -0
  163. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.gitignore +0 -0
  164. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.prettierrc +0 -0
  165. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.vscode/extensions.json +0 -0
  166. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/.vscode/settings.json +0 -0
  167. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/CODE_OF_CONDUCT.rst +0 -0
  168. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/LICENSE +0 -0
  169. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/admin/__init__.py +0 -0
  170. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/admin/vumark_template.svg +0 -0
  171. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/ci/__init__.py +0 -0
  172. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/ci/decrypt_secret.sh +0 -0
  173. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/conftest.py +0 -0
  174. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docker-bake.hcl +0 -0
  175. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/__init__.py +0 -0
  176. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/basic-example.rst +0 -0
  177. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/getting-started.rst +0 -0
  178. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/httpx-example.rst +0 -0
  179. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/httpx2-example.rst +0 -0
  180. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/installation.rst +0 -0
  181. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/mock-api-reference.rst +0 -0
  182. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/release-process.rst +0 -0
  183. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/unverified-behavior.rst +0 -0
  184. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/docs/source/versioning-and-api-stability.rst +0 -0
  185. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/newsfragments/.gitkeep +0 -0
  186. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/setup.cfg +0 -0
  187. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/__init__.py +0 -0
  188. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_base64_decoding.py +0 -0
  189. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_constants.py +0 -0
  190. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_database_matchers.py +0 -0
  191. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_flask_server/Dockerfile +0 -0
  192. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_flask_server/__init__.py +0 -0
  193. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_httpx2_mock_server/__init__.py +0 -0
  194. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_image_opening.py +0 -0
  195. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_matching.py +0 -0
  196. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_mock_common.py +0 -0
  197. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_tools.py +0 -0
  198. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/__init__.py +0 -0
  199. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/accept_header_validators.py +0 -0
  200. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/auth_validators.py +0 -0
  201. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/content_type_validators.py +0 -0
  202. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/date_validators.py +0 -0
  203. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/fields_validators.py +0 -0
  204. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/header_size_validators.py +0 -0
  205. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/include_target_data_validators.py +0 -0
  206. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/multipart.py +0 -0
  207. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/num_results_validators.py +0 -0
  208. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_query_validators/project_state_validators.py +0 -0
  209. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_requests_mock_server/__init__.py +0 -0
  210. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_requests_mock_server/mock_web_query_api.py +0 -0
  211. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_respx_mock_server/__init__.py +0 -0
  212. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/__init__.py +0 -0
  213. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/active_flag_validators.py +0 -0
  214. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/auth_validators.py +0 -0
  215. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/content_type_validators.py +0 -0
  216. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/context.py +0 -0
  217. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/database_id_validators.py +0 -0
  218. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/date_validators.py +0 -0
  219. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/header_size_validators.py +0 -0
  220. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/image_validators.py +0 -0
  221. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/instance_id_validators.py +0 -0
  222. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/json_validators.py +0 -0
  223. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/key_validators.py +0 -0
  224. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/metadata_validators.py +0 -0
  225. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/name_validators.py +0 -0
  226. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/request_quota_validators.py +0 -0
  227. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/request_rate_limiter.py +0 -0
  228. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/routes.py +0 -0
  229. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/target_quota_validators.py +0 -0
  230. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/target_validators.py +0 -0
  231. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/_services_validators/width_validators.py +0 -0
  232. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/cloud_query.py +0 -0
  233. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/database.py +0 -0
  234. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/database_type.py +0 -0
  235. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/py.typed +0 -0
  236. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/reco_counts.py +0 -0
  237. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/request_rate_limits.py +0 -0
  238. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/states.py +0 -0
  239. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/target_manager.py +0 -0
  240. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/mock_vws/vumark.py +0 -0
  241. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/vws_python_mock.egg-info/dependency_links.txt +0 -0
  242. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/vws_python_mock.egg-info/not-zip-safe +0 -0
  243. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/vws_python_mock.egg-info/requires.txt +0 -0
  244. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/src/vws_python_mock.egg-info/top_level.txt +0 -0
  245. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/styles/snapper/LongProseLine.yml +0 -0
  246. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/styles/snapper/SemanticLineBreaks.yml +0 -0
  247. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/__init__.py +0 -0
  248. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/__init__.py +0 -0
  249. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/fixtures/__init__.py +0 -0
  250. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/fixtures/credentials.py +0 -0
  251. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_authorization_header.py +0 -0
  252. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_cloud_query_failure_response.py +0 -0
  253. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_date_header.py +0 -0
  254. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_delete_target.py +0 -0
  255. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_get_duplicates.py +0 -0
  256. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_get_target.py +0 -0
  257. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_header_size.py +0 -0
  258. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_invalid_given_id.py +0 -0
  259. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_invalid_json.py +0 -0
  260. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_model_target_failure_response.py +0 -0
  261. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_model_target_generation_failure.py +0 -0
  262. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_model_target_generation_warning.py +0 -0
  263. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_model_target_training_allowance.py +0 -0
  264. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_reco_counts_report.py +0 -0
  265. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_target_list.py +0 -0
  266. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_target_summary.py +0 -0
  267. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_target_validators.py +0 -0
  268. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_unexpected_json.py +0 -0
  269. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_vumark_generation_api.py +0 -0
  270. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/test_vumark_generation_failure.py +0 -0
  271. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/cloud_databases.py +0 -0
  272. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/model_target_retries.py +0 -0
  273. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/recognition_counts.py +0 -0
  274. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/retries.py +0 -0
  275. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/too_many_requests.py +0 -0
  276. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/tests/mock_vws/utils/usage_test_helpers.py +0 -0
  277. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/vuforia_secrets.env.example +0 -0
  278. {vws_python_mock-2026.9.12 → vws_python_mock-2026.10.9}/zizmor.yml +0 -0
@@ -17,7 +17,7 @@ prek.toml
17
17
  .vale.ini
18
18
  .yamlfmt
19
19
  admin
20
- CHANGELOG.rst
20
+ CHANGELOG.md
21
21
  ci
22
22
  CODE_OF_CONDUCT.rst
23
23
  CONTRIBUTING.rst
@@ -20,10 +20,10 @@ jobs:
20
20
  persist-credentials: false
21
21
 
22
22
  - name: Install uv
23
- uses: astral-sh/setup-uv@v10.0.1
23
+ uses: astral-sh/setup-uv@v10.2.0
24
24
 
25
25
  - name: Run fixers
26
- uses: j178/prek-action@v3.0.0
26
+ uses: j178/prek-action@v3.0.1
27
27
  with:
28
28
  prek-version: 0.4.11
29
29
  extra-args: >-
@@ -35,11 +35,11 @@ jobs:
35
35
  uses: docker/setup-buildx-action@v4
36
36
 
37
37
  - name: Check Docker bake definition
38
- uses: docker/bake-action@v7.3.0
38
+ uses: docker/bake-action@v7.4.0
39
39
  with:
40
40
  call: check
41
41
 
42
42
  - name: Build Docker images
43
- uses: docker/bake-action@v7.3.0
43
+ uses: docker/bake-action@v7.4.0
44
44
  with:
45
45
  push: false
@@ -30,10 +30,10 @@ jobs:
30
30
  persist-credentials: false
31
31
 
32
32
  - name: Install uv
33
- uses: astral-sh/setup-uv@v10.0.1
33
+ uses: astral-sh/setup-uv@v10.2.0
34
34
 
35
35
  - name: Lint
36
- uses: j178/prek-action@v3.0.0
36
+ uses: j178/prek-action@v3.0.1
37
37
  with:
38
38
  prek-version: 0.4.11
39
39
  extra-args: >-
@@ -49,7 +49,7 @@ jobs:
49
49
  completion-lint:
50
50
  needs: build
51
51
  runs-on: ubuntu-latest
52
- if: always() # Run even if one matrix job fails
52
+ if: ${{ !cancelled() }} # Run even if one matrix job fails
53
53
  steps:
54
54
  - name: Check matrix job status
55
55
  run: |-
@@ -35,7 +35,7 @@ jobs:
35
35
  token: ${{ secrets.RELEASE_PAT }}
36
36
 
37
37
  - name: Install uv
38
- uses: astral-sh/setup-uv@v10.0.1
38
+ uses: astral-sh/setup-uv@v10.2.0
39
39
  with:
40
40
  enable-cache: true
41
41
  cache-dependency-glob: '**/pyproject.toml'
@@ -49,33 +49,24 @@ jobs:
49
49
  env:
50
50
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
51
51
 
52
- # towncrier writes the rendered notes to stdout (informational
53
- # chatter goes to stderr), so this is the curated release body for
54
- # this version, not github-tag-action's commit-derived changelog.
55
- - name: Generate the GitHub release notes
52
+ - name: Assemble native Markdown release notes
56
53
  env:
57
54
  RELEASE: ${{ steps.calver.outputs.release }}
58
- run: uv run --group=release towncrier build --draft --version "$RELEASE" >
59
- release-notes.md
60
-
61
- # Assemble the same fragments into CHANGELOG.rst under a new
62
- # ``$RELEASE`` section and delete the consumed fragment files.
63
- - name: Update the changelog
64
- env:
65
- RELEASE: ${{ steps.calver.outputs.release }}
66
- run: uv run --group=release towncrier build --yes --version "$RELEASE"
55
+ run: |
56
+ uv run --group=release towncrier build --yes --version "$RELEASE"
57
+ cp "docs/source/changelog/$RELEASE.md" release-notes.md
67
58
 
68
59
  - uses: stefanzweifel/git-auto-commit-action@v7
69
60
  id: commit
70
61
  with:
71
62
  commit_message: Bump CHANGELOG
72
- file_pattern: CHANGELOG.rst newsfragments
63
+ file_pattern: CHANGELOG.md docs/source/changelog newsfragments
73
64
  # Error if there are no changes.
74
65
  skip_dirty_check: true
75
66
 
76
67
  - name: Bump version and push tag
77
68
  id: tag_version
78
- uses: mathieudutour/github-tag-action@v6.2
69
+ uses: mathieudutour/github-tag-action@v7
79
70
  with:
80
71
  github_token: ${{ secrets.GITHUB_TOKEN }}
81
72
  custom_tag: ${{ steps.calver.outputs.release }}
@@ -114,7 +105,7 @@ jobs:
114
105
  persist-credentials: false
115
106
 
116
107
  - name: Install uv
117
- uses: astral-sh/setup-uv@v10.0.1
108
+ uses: astral-sh/setup-uv@v10.2.0
118
109
  with:
119
110
  enable-cache: true
120
111
  cache-dependency-glob: '**/pyproject.toml'
@@ -160,7 +151,7 @@ jobs:
160
151
  uses: docker/setup-qemu-action@v4
161
152
 
162
153
  - name: Build and push Docker images
163
- uses: docker/bake-action@v7.3.0
154
+ uses: docker/bake-action@v7.4.0
164
155
  with:
165
156
  push: true
166
157
  env:
@@ -74,7 +74,7 @@ jobs:
74
74
  - tests/mock_vws/test_database_summary.py::TestDatabaseSummary::test_inactive_images
75
75
  - tests/mock_vws/test_database_summary.py::TestDatabaseSummary::test_inactive_failed
76
76
  - tests/mock_vws/test_database_summary.py::TestDatabaseSummary::test_deleted
77
- - tests/mock_vws/test_database_summary.py::TestProcessingImages
77
+ - tests/mock_vws/test_database_summary.py::test_processing_images
78
78
  - tests/mock_vws/test_database_summary.py::TestQuotas
79
79
  - tests/mock_vws/test_database_summary.py::TestRecos
80
80
  - tests/mock_vws/test_database_summary.py::TestRequestUsage
@@ -128,15 +128,15 @@ jobs:
128
128
  - tests/mock_vws/test_model_target_generation_warning.py
129
129
  - tests/mock_vws/test_model_target_failure_response.py
130
130
  - tests/mock_vws/test_model_target_training_allowance.py
131
- - tests/mock_vws/test_model_target_web_api.py
131
+ - tests/mock_vws/model_target_web_api
132
132
  - tests/mock_vws/test_model_target_retries.py
133
133
  - tests/mock_vws/test_vumark_generation_api.py
134
134
  - tests/mock_vws/test_vumark_generation_failure.py
135
135
  - tests/mock_vws/test_target_validators.py
136
- - tests/mock_vws/test_requests_mock_usage.py
137
- - tests/mock_vws/test_respx_mock_usage.py
138
- - tests/mock_vws/test_httpx2_mock_usage.py
139
- - tests/mock_vws/test_flask_app_usage.py
136
+ - tests/mock_vws/requests_mock
137
+ - tests/mock_vws/respx_mock
138
+ - tests/mock_vws/httpx2_mock
139
+ - tests/mock_vws/flask_app
140
140
  - tests/mock_vws/test_healthcheck.py
141
141
  - tests/mock_vws/test_docker.py
142
142
  - README.rst
@@ -148,7 +148,7 @@ jobs:
148
148
  persist-credentials: false
149
149
 
150
150
  - name: Install uv
151
- uses: astral-sh/setup-uv@v10.0.1
151
+ uses: astral-sh/setup-uv@v10.2.0
152
152
  with:
153
153
  enable-cache: true
154
154
  cache-dependency-glob: '**/pyproject.toml'
@@ -226,7 +226,7 @@ jobs:
226
226
  persist-credentials: false
227
227
 
228
228
  - name: Install uv
229
- uses: astral-sh/setup-uv@v10.0.1
229
+ uses: astral-sh/setup-uv@v10.2.0
230
230
  with:
231
231
  enable-cache: true
232
232
  cache-dependency-glob: '**/pyproject.toml'
@@ -271,7 +271,7 @@ jobs:
271
271
  persist-credentials: false
272
272
 
273
273
  - name: Install uv
274
- uses: astral-sh/setup-uv@v10.0.1
274
+ uses: astral-sh/setup-uv@v10.2.0
275
275
  with:
276
276
  enable-cache: true
277
277
  cache-dependency-glob: '**/pyproject.toml'
@@ -324,7 +324,7 @@ jobs:
324
324
  coverage:
325
325
  name: Combine & check coverage
326
326
  needs: [ci-tests, skip-tests, windows-tests]
327
- if: always()
327
+ if: ${{ !cancelled() }}
328
328
  runs-on: ubuntu-latest
329
329
 
330
330
  steps:
@@ -333,7 +333,7 @@ jobs:
333
333
  persist-credentials: false
334
334
 
335
335
  - name: Install uv
336
- uses: astral-sh/setup-uv@v10.0.1
336
+ uses: astral-sh/setup-uv@v10.2.0
337
337
  with:
338
338
  enable-cache: true
339
339
  cache-dependency-glob: '**/pyproject.toml'
@@ -368,7 +368,7 @@ jobs:
368
368
  completion-ci:
369
369
  needs: [ci-tests, skip-tests, windows-tests, coverage]
370
370
  runs-on: ubuntu-latest
371
- if: always()
371
+ if: ${{ !cancelled() }}
372
372
  steps:
373
373
  - name: Check all jobs status
374
374
  run: |-
@@ -14,7 +14,6 @@ ai-tells.ContrastiveFormulas = NO
14
14
  ai-tells.ContrastiveNegation = NO
15
15
  ai-tells.EmptyPadding = NO
16
16
  ai-tells.EmptyPaddingStacked = NO
17
- ai-tells.FigurativeLands = NO
18
17
  ai-tells.FillerPhrases = NO
19
18
  ai-tells.FormalRegister = NO
20
19
  ai-tells.FormalTransitions = NO
@@ -0,0 +1,3 @@
1
+ # Changelog
2
+
3
+ Release notes are stored as [one Markdown file per version](docs/source/changelog/).
@@ -0,0 +1 @@
1
+ recursive-include docs *.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python-mock
3
- Version: 2026.9.12
3
+ Version: 2026.10.9
4
4
  Summary: A mock for the Vuforia Web Services (VWS) API.
5
5
  Author-email: Adam Dangoor <adamdangoor@gmail.com>
6
6
  License-Expression: MIT
@@ -114,10 +114,10 @@ By default, an exception will be raised if any requests to unmocked addresses ar
114
114
  .. _httpx: https://pypi.org/project/httpx/
115
115
  .. _HTTPX2: https://httpx2.pydantic.dev/
116
116
 
117
- Using Docker to mock calls to Vuforia from any language
118
- -------------------------------------------------------
117
+ Using containers to mock calls to Vuforia from any language
118
+ -----------------------------------------------------------
119
119
 
120
- It is possible run a Mock VWS instance using Docker containers.
120
+ You can run a Mock VWS instance using Docker or Apple's ``container`` CLI.
121
121
 
122
122
  This allows you to run tests against a mock VWS instance regardless of the language or tooling you are using.
123
123
 
@@ -76,10 +76,10 @@ By default, an exception will be raised if any requests to unmocked addresses ar
76
76
  .. _httpx: https://pypi.org/project/httpx/
77
77
  .. _HTTPX2: https://httpx2.pydantic.dev/
78
78
 
79
- Using Docker to mock calls to Vuforia from any language
80
- -------------------------------------------------------
79
+ Using containers to mock calls to Vuforia from any language
80
+ -----------------------------------------------------------
81
81
 
82
- It is possible run a Mock VWS instance using Docker containers.
82
+ You can run a Mock VWS instance using Docker or Apple's ``container`` CLI.
83
83
 
84
84
  This allows you to run tests against a mock VWS instance regardless of the language or tooling you are using.
85
85
 
@@ -290,11 +290,8 @@ def main() -> None:
290
290
  for i in range(num_databases)
291
291
  ]
292
292
  files_to_create = [file for file in required_files if not file.exists()]
293
- driver: WebDriver | None = None
294
-
295
293
  while bool(files_to_create):
296
- if driver is None:
297
- driver = vws_web_tools.create_chrome_driver()
294
+ driver = vws_web_tools.create_chrome_driver()
298
295
  file = files_to_create[-1]
299
296
  _ = sys.stdout.write(f"Creating database {file.name}\n")
300
297
  (
@@ -327,11 +324,9 @@ def main() -> None:
327
324
  except TimeoutException:
328
325
  _ = sys.stderr.write("Timed out during database setup\n")
329
326
  driver.quit()
330
- driver = None
331
327
  continue
332
328
 
333
329
  driver.quit()
334
- driver = None
335
330
 
336
331
  file_contents = _generate_secrets_file_content(
337
332
  cloud_database_details=cloud_database_details,
@@ -0,0 +1,3 @@
1
+ # 2018.09.10.0
2
+
3
+ - Initial release
@@ -0,0 +1,3 @@
1
+ # 2018.12.01.0
2
+
3
+ - Distribute type information.
@@ -0,0 +1,3 @@
1
+ # 2024.02.16
2
+
3
+ - Add a structural similarity image matcher.
@@ -0,0 +1,3 @@
1
+ # 2024.07.02.1
2
+
3
+ - Fix installation on Windows now that `numpy` 2.0.0 has been released.
@@ -0,0 +1,3 @@
1
+ # 2024.07.15
2
+
3
+ - Support passing data as strings.
@@ -0,0 +1 @@
1
+ # 2024.08.30
@@ -0,0 +1 @@
1
+ # 2025.02.18
@@ -0,0 +1 @@
1
+ # 2025.02.21
@@ -0,0 +1 @@
1
+ # 2025.03.10.1
@@ -0,0 +1 @@
1
+ # 2025.03.10
@@ -0,0 +1,4 @@
1
+ # 2026.02.15.3
2
+
3
+ - Add `response_delay_seconds` parameter to `MockVWS` for simulating slow server responses and testing timeout handling.
4
+ - Add `response_delay_seconds` setting to the Flask mock (`VWSSettings` and `VWQSettings`) for simulating slow server responses.
@@ -0,0 +1,3 @@
1
+ # 2026.02.15.4
2
+
3
+ - Add `sleep_fn` parameter to `MockVWS` for injecting a custom delay strategy, enabling deterministic and fast tests without monkey-patching.
@@ -0,0 +1 @@
1
+ # 2026.02.15.5
@@ -0,0 +1 @@
1
+ # 2026.02.18.1
@@ -0,0 +1 @@
1
+ # 2026.02.18.2
@@ -0,0 +1 @@
1
+ # 2026.02.18
@@ -0,0 +1,5 @@
1
+ # 2026.02.21
2
+
3
+ - Add `VuMarkTarget` class for VuMark template targets, alongside the renamed `ImageTarget` class (previously `Target`).
4
+ `ImageTarget` is for image-based targets and `VuMarkTarget` is for VuMark template targets.
5
+ Both can be stored in a `VuforiaDatabase`.
@@ -0,0 +1 @@
1
+ # 2026.02.22.1
@@ -0,0 +1 @@
1
+ # 2026.02.22.2
@@ -0,0 +1,4 @@
1
+ # 2026.02.22.3
2
+
3
+ - `MockVWS` now intercepts both `requests` (via `responses`) and `httpx` (via `respx`) simultaneously.
4
+ `MockVWSForHttpx` has been removed: `MockVWS` handles both HTTP libraries.
@@ -0,0 +1 @@
1
+ # 2026.02.22
@@ -0,0 +1 @@
1
+ # 2026.04.26
@@ -0,0 +1,16 @@
1
+ # 2026.08.04.2
2
+
3
+ - Replace the PyTorch image-quality stack with OpenCV and a lightweight BRISQUE implementation.
4
+ This reduces dependency download and installation sizes and removes the need to configure PyTorch's CPU-only package index.
5
+ - Allow VuMark generation requests to be configured to return `QuotaExceeded`, `LicenseCheckFailed`, or `AuthorizationFailed` responses.
6
+ - Cloud databases with `request_quota=0` now return a `RequestQuotaReached` response from VWS endpoints.
7
+ - Add a mock implementation of the Model Target Web API, including OAuth2 token creation, standard and advanced dataset creation, status polling, dataset download, and deletion.
8
+ - Improve Model Target Web API mock authentication failure responses, including malformed and unsecured JSON Web Token headers.
9
+ - Match real Vuforia Model Target dataset creation validation error shape, including per-request UUID, details list, and status codes (415 for unsupported media type, 400 with `BAD_REQUEST` validation details).
10
+ - Match real Vuforia Model Target unknown-dataset response shape (`NOT_FOUND` code, `Could not find a model-view database with uuid <uuid>` message, `userId:` target).
11
+ Keep each Model Target dataset status response internally consistent when processing completes while the response is being generated.
12
+ - Make synthetic Model Target dataset zip downloads byte-for-byte reproducible.
13
+ - Match real Vuforia Model Target Web API error responses for invalid request bodies, invalid dataset creation payloads, unknown datasets, and downloads of still-processing datasets.
14
+ - Add configurable `TargetQuotaReached`, `ProjectSuspended`, and `ProjectHasNoAPIAccess` responses from VWS endpoints.
15
+ - Add configurable `TooManyRequests` responses from VWS endpoints using the `CloudDatabase.requests_per_second_limit` setting.
16
+ - Add `CloudQueryFailureResponse` and the `MockVWS.cloud_query_failure_response` parameter for returning configurable Cloud Query failure status codes, headers, and raw bodies through the `requests` and `httpx` backends.
@@ -0,0 +1,39 @@
1
+ # 2026.08.14
2
+
3
+ - Give `CloudDatabase` a `database_id`, and reject a reco counts report request whose path names a database which the request's server keys do not belong to, as real Vuforia does.
4
+ - Return a response, rather than raising an uncaught `PIL.Image.DecompressionBombError`, when an image with a small file size but a huge number of pixels is given to `POST /targets` or `POST /v1/query`.
5
+ As real Vuforia does, `POST /targets` now returns the `ImageTooLarge` result code for an image with more than 37748736 pixels, and the Query API applies no pixel count limit.
6
+ - Return targets in a deterministic order from the Query API, `GET /targets` and `GET /duplicates/{target_id}`.
7
+ Targets are ordered by upload date and then by target ID, so repeated runs agree with each other.
8
+ This order is not Vuforia's match score order.
9
+ - Document the Docker containers' configuration with the environment variable names and values which the applications actually read, starting with `TARGET_MANAGER_BASE_URL`.
10
+ - Build the Docker images from a committed `uv.lock` with a `.dockerignore`, so that image contents are reproducible from a commit, source edits no longer invalidate the dependency layer, and repository files such as tests and documentation are no longer copied into the images.
11
+ - Store Model Target datasets in the target manager service rather than in the VWS application.
12
+ In the Docker deployment, datasets now survive a restart of the VWS container, matching how cloud databases and their targets are stored.
13
+ The VWS application also no longer imports the target manager module's state: it constructs its own request rate limiter and reco counts report store.
14
+ - Report the Docker containers as unhealthy without a traceback in the health check probe output while nothing is yet listening on the port.
15
+ - Support `cadDataBlob` and `cadDataFormat` in Model Target dataset creation requests, and require exactly one of `cadDataUrl` and `cadDataBlob` for each model.
16
+ - Reject Model Target Web API and OAuth2 token requests with a `Content-Length` header which is not an integer, matching the load balancer in front of real Vuforia.
17
+ - Reject Model Target dataset creation requests with wrongly typed `name`, `targetSdk` or `models` entry values.
18
+ - Treat standard and advanced Model Target datasets as separate resources: status, download and delete requests made through the other dataset type's routes now return the unknown-dataset error rather than acting on the dataset.
19
+ - Reject Model Target dataset creation requests with values outside the documented enumerations for the `automaticColoring`, `motionHint`, `optimizeTrackingFor`, `realisticAppearance`, `simplify` and `trackingMode` model fields.
20
+ - Report the `failed` training status when downloading a Model Target dataset whose generation failed, rather than the `not-started` status which a still-processing dataset reports.
21
+ - Add configurable failed Model Target dataset status responses.
22
+ - Add configurable Model Target dataset generation warning responses.
23
+ - Reject Model Target dataset creation requests with `guideViewPosition` objects which are missing `rotation` or `translation`, or which have `rotation` or `translation` values that are not JSON arrays.
24
+ - Reject Model Target dataset creation requests with `guideViewPosition` `rotation` or `translation` arrays which contain values that are not JSON numbers.
25
+ - Reject Model Target bearer tokens whose JWT payload is not a JSON object.
26
+ - Reject Model Target bearer tokens with empty or malformed JWT signatures.
27
+ - Reject Model Target dataset creation requests with models which are missing `name`, or which have wrongly typed `cadDataUrl`, `name` or `views` values.
28
+ - Reject Model Target dataset creation requests with a body which is valid JSON but not a JSON object, rather than raising an error in the mock.
29
+ - Accept State-Based Model Target configuration and validate per-view state selections against its declared states.
30
+ - Reject Model Target dataset creation requests with `views` entries which are not JSON objects, which are missing `guideViewPosition` or `name`, or which have wrongly typed `guideViewPosition` or `name` values.
31
+ - Model VWS request rate limits per endpoint with the new `CloudDatabase.request_rate_limits` setting, including the limits which Vuforia documents as `mock_vws.request_rate_limits.DOCUMENTED_REQUEST_RATE_LIMITS`.
32
+ No request rate limit is applied by default.
33
+ - Change the `ProjectHasNoAPIAccess` result code to `ProjectHasNoApiAccess`, matching Vuforia's result codes table.
34
+ - Add the reco counts report endpoint, and a download URL for the generated CSV report.
35
+ - Preserve the recognition count fields, the reco rating and the reco threshold when dumping a `CloudDatabase` or an `ImageTarget` to a dictionary and loading it back.
36
+ - Rate an image of a single color as `0` rather than raising an uncaught `ZeroDivisionError`.
37
+ - Return a 404 response from the Flask and Docker mock for a request to a path which it does not serve, and for a request to a served path with a method which that path does not serve, as real Vuforia does, rather than raising an error.
38
+ - Reject VuMark instance generation requests whose `instance_id` is not a string with a `BadRequest` result, as real Vuforia does, and move the `instance_id` checks into validators shared by both mock backends.
39
+ - Reject Model Target dataset creation requests with a body which cannot be decoded as UTF-8, rather than raising an error in the mock, and decode OAuth2 token request bodies leniently.
@@ -0,0 +1,3 @@
1
+ # 2026.08.26.1
2
+
3
+ - Add configurable Model Target HTTP failure responses for selected dataset request phases.
@@ -0,0 +1,9 @@
1
+ # 2026.08.26
2
+
3
+ - Guard the state which the Docker containers share between requests with a lock.
4
+ The containers serve requests on threads, so concurrent requests, such as those made by a test suite which runs in parallel, could previously race with each other: listing databases while a target was added could return a 500 response, and a target which was being updated or deleted could briefly be missing from a database.
5
+ - Give each call of a function decorated with a `MockVWS` instance its own databases and targets.
6
+ Previously, every use of an instance shared one set of databases and targets, so decorating two test functions with one instance made them affect each other.
7
+ A database can still be inspected during a call, and its targets are what they were before the call again once it returns.
8
+ Using an instance as a context manager is unchanged: a `with` block still shares its state with every other use of the same instance.
9
+ - - Add configurable Model Target `TRAINING_ALLOWANCE_EXCEEDED` responses to the in-process and Flask/Docker mocks.
@@ -0,0 +1,31 @@
1
+ # 2026.09.06
2
+
3
+ - Add `MockVWS.set_target_recognition_counts` and a matching target manager endpoint for the Flask and Docker mock, for setting the recognition counts which the target summary report and the reco counts report show for a target.
4
+ A reco counts report now has a row for each target with recognitions in the requested month, and the recognition counts and recognition threshold of a cloud database are kept when the database is created in the Flask and Docker mock.
5
+
6
+ - Order Query API and `GET /duplicates/{target_id}` results by match score, with the best match first, as the real Query API does.
7
+ Matches with equal scores keep the existing upload date and then target ID order.
8
+
9
+ Image matchers now return a score, or `None` for no match, rather than a `bool`.
10
+ `StructuralSimilarityMatcher` returns the images' SSIM score, and `ExactMatcher` gives every match the same score.
11
+ A custom `query_match_checker` or `duplicate_match_checker` which returns a `bool` now raises a `TypeError`; return a score, such as `1.0`, for a match and `None` for no match instead.
12
+ The mock's ranking is its matcher's opinion, not Vuforia's proprietary one, so the mock's order still need not agree with the real Query API's order.
13
+
14
+ - Respond, rather than failing to respond, to a request body which is not UTF-8 and to a query request whose `multipart/form-data` body ends before its closing boundary.
15
+
16
+ - Return a `400` response which names the offending field and the accepted values, rather than a `500` response, when the target manager container is given an invalid cloud database or VuMark database to create.
17
+ Return a `404` response, rather than a `500` response, when the target manager container is asked to add a target to a database which does not exist.
18
+
19
+ - Say which claims about the real Vuforia Web Services the mock has not had checked against them.
20
+ `unverified-behavior` lists each such claim and what would verify it, and `differences-to-vws` marks the unverified assumptions among its deliberate differences.
21
+
22
+ - Return a `BadImage` response, rather than failing to respond, when an image given to the Target API is truncated before the end of its image data.
23
+
24
+ - `MockVWS` now intercepts `httpx2` requests, synchronous and asynchronous, alongside `requests` and `httpx`.
25
+ The `httpx2` path uses native `httpx2` requests and responses, and does not need `httpx2.alias_httpx()`.
26
+
27
+ - Fix nested `MockVWS` instances on the `httpx` backend: an inner mock is now the only one which answers while it is running, matching the `requests` and `httpx2` backends.
28
+ Previously the outer mock kept answering and requests to the inner mock's URL were refused.
29
+
30
+ - Return a response, rather than raising an uncaught `JSONDecodeError`, when an empty body is given to a VWS endpoint which takes a JSON body.
31
+ As real Vuforia does, `POST /targets` and `PUT /targets/<target_id>` now return a 500 `Fail` response, the reco counts report endpoint returns a 400 `Fail` response, and the VuMark instance generation endpoint returns a 400 `BadRequest` response.
@@ -0,0 +1,6 @@
1
+ # 2026.09.08.1
2
+
3
+ - The URL of a reco counts report now has the shape of the presigned cloud storage URL which real Vuforia returns.
4
+ The report file is named `{date}-{hour}.csv` for the current month and `{month}.csv` for the previous month, so two requests for the same month in the same hour name the same file and serve the report which the first request generated.
5
+ The URL carries the query parameters of a presigned URL, and the mock honors `X-Amz-Date` and `X-Amz-Expires` as real Vuforia's storage does, so a URL which is out of date or which has no query parameters gives the `403` XML error document which Amazon S3 gives.
6
+ A report which is not yet generated gives the `404` `NoSuchKey` XML error document which Amazon S3 gives, as real Vuforia has now been observed to do, rather than an empty body.
@@ -0,0 +1,6 @@
1
+ # 2026.09.08
2
+
3
+ - The response delay and client timeout simulation is now provided by the `mock-response-delay` package.
4
+ - The mock now returns NGINX's `400 Request Header Or Cookie Too Large` response for any request header line longer than 8190 bytes, as real Vuforia does.
5
+ - Match real Vuforia's request rate limiting, which was checked against it on 2026-09-08.
6
+ `DOCUMENTED_REQUEST_RATE_LIMITS` now allows two `GET /targets` requests per minute rather than one, a rate-limited request gets Envoy's empty-bodied `429` response rather than a JSON `TooManyRequests` body, and the limits are applied before the request's signature is checked.
@@ -0,0 +1,6 @@
1
+ # 2026.09.12
2
+
3
+ - Validate decoded Model Target request values before processing them.
4
+ - Type target-manager request defaults as database dictionaries instead of arbitrary mappings.
5
+ - Type parsed Target Manager request bodies using recursive JSON values.
6
+ - Accept integer `response_delay_seconds` values when mocking `requests` calls.
@@ -0,0 +1,13 @@
1
+ # 2026.10.09 (2026-10-09)
2
+
3
+ ## Changes
4
+
5
+ - Make VuMark targets with zero processing time immediately ready for instance generation, even when their last modified timestamp is equal to or ahead of the server clock.
6
+ Targets with positive processing time become ready at their exact completion timestamp. ([#3705](https://github.com/VWS-Python/vws-python-mock/issues/3705))
7
+ - Clean up Docker deployment test images and containers even when fixture setup fails partway through. ([#3711](https://github.com/VWS-Python/vws-python-mock/issues/3711))
8
+ - Bound Flask health-check HTTP requests to five seconds so an unresponsive server is reported as unhealthy. ([#3712](https://github.com/VWS-Python/vws-python-mock/issues/3712))
9
+ - Set `VWS_BASE_URL` in the Docker setup instructions so report download URLs point to the published mock service. ([#3713](https://github.com/VWS-Python/vws-python-mock/issues/3713))
10
+ - Wait for Docker test services through their published HTTP ports as well as their native Docker health checks. ([#3714](https://github.com/VWS-Python/vws-python-mock/issues/3714))
11
+ - - Document running and building the mock directly with Apple's container CLI using the same images as Docker.
12
+ Support the existing deployment tests through Socktainer's optional Docker API, allow an explicit API version, and bind all test service ports to loopback.
13
+ - 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
+ ```
@@ -24,7 +24,8 @@ Create environment variable files for secrets:
24
24
  $ cp vuforia_secrets.env.example ci_secrets/vuforia_secrets_1.env
25
25
  $ ...
26
26
 
27
- Populate every variable listed in :file:`vuforia_secrets.env.example`. Each file needs distinct active Cloud database credentials so concurrent jobs do not modify the same database.
27
+ Populate every variable listed in :file:`vuforia_secrets.env.example`.
28
+ Each file needs distinct active Cloud database credentials so concurrent jobs do not modify the same database.
28
29
  The files can share the inactive Cloud, active and inactive VuMark, and Model Target credentials.
29
30
  Add at least as many consecutively numbered files, starting at zero, as there are builds in the GitHub test matrix.
30
31
 
@@ -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",
@@ -30,19 +31,15 @@ extensions = [
30
31
  ]
31
32
 
32
33
  # Render the unreleased ``newsfragments/`` entries into
33
- # ``docs/source/unreleased.rst`` so the Sphinx spelling, doc-build and
34
+ # ``docs/source/unreleased.md`` so the Sphinx spelling, doc-build and
34
35
  # link-checking gates cover the prose before it is assembled into
35
- # CHANGELOG.rst at release time.
36
+ # the versioned Markdown notes at release time.
36
37
  towncrier_draft_autoversion_mode = "draft"
37
38
  towncrier_draft_include_empty = True
38
39
  towncrier_draft_working_directory = f"{_pyproject_file.parent}"
39
40
 
40
- # Required by sphinx-toolbox 4.2.0rc1 for compatibility with Sphinx 9.
41
- # See https://github.com/sphinx-toolbox/sphinx-toolbox/issues/201#issuecomment-4313483053.
42
- autodoc_use_legacy_class_based = True
43
-
44
41
  templates_path = ["_templates"]
45
- source_suffix = ".rst"
42
+ source_suffix = {".rst": "restructuredtext", ".md": "markdown"}
46
43
  master_doc = "index"
47
44
 
48
45
  project_copyright = f"%Y, {author}"