vws-python-mock 2026.4.26__tar.gz → 2026.8.4.1__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 (158) hide show
  1. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.github/workflows/docker-build.yml +3 -3
  2. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.github/workflows/lint.yml +5 -2
  3. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.github/workflows/release.yml +26 -34
  4. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.github/workflows/test.yml +35 -13
  5. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.pre-commit-config.yaml +14 -2
  6. vws_python_mock-2026.8.4.1/CHANGELOG.rst +140 -0
  7. {vws_python_mock-2026.4.26/src/vws_python_mock.egg-info → vws_python_mock-2026.8.4.1}/PKG-INFO +34 -32
  8. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/README.rst +1 -1
  9. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/admin/create_secrets_files.py +35 -1
  10. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/conftest.py +2 -2
  11. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/conf.py +9 -0
  12. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/differences-to-vws.rst +68 -5
  13. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/index.rst +1 -0
  14. vws_python_mock-2026.8.4.1/docs/source/installation.rst +8 -0
  15. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/mock-api-reference.rst +4 -0
  16. vws_python_mock-2026.8.4.1/docs/source/unreleased.rst +8 -0
  17. vws_python_mock-2026.8.4.1/docs/towncrier_template.rst.jinja +14 -0
  18. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/pyproject.toml +228 -185
  19. vws_python_mock-2026.8.4.1/secrets.tar.gpg +0 -0
  20. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/spelling_private_dict.txt +1 -0
  21. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/__init__.py +2 -0
  22. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_constants.py +6 -2
  23. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_flask_server/target_manager.py +44 -9
  24. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_flask_server/vwq.py +6 -5
  25. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_flask_server/vws.py +202 -6
  26. vws_python_mock-2026.8.4.1/src/mock_vws/_model_target_web_api.py +486 -0
  27. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_requests_mock_server/decorators.py +16 -2
  28. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_requests_mock_server/mock_web_query_api.py +14 -2
  29. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_requests_mock_server/mock_web_services_api.py +171 -0
  30. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_respx_mock_server/decorators.py +4 -1
  31. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/__init__.py +30 -0
  32. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/exceptions.py +165 -0
  33. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/project_state_validators.py +13 -1
  34. vws_python_mock-2026.8.4.1/src/mock_vws/_services_validators/request_quota_validators.py +42 -0
  35. vws_python_mock-2026.8.4.1/src/mock_vws/_services_validators/request_rate_validators.py +83 -0
  36. vws_python_mock-2026.8.4.1/src/mock_vws/_services_validators/target_quota_validators.py +41 -0
  37. vws_python_mock-2026.8.4.1/src/mock_vws/cloud_query.py +22 -0
  38. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/database.py +21 -1
  39. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/image_matchers.py +16 -57
  40. vws_python_mock-2026.8.4.1/src/mock_vws/model_target.py +80 -0
  41. vws_python_mock-2026.8.4.1/src/mock_vws/py.typed +0 -0
  42. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/states.py +4 -0
  43. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/target_manager.py +30 -0
  44. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/target_raters.py +13 -21
  45. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1/src/vws_python_mock.egg-info}/PKG-INFO +34 -32
  46. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/vws_python_mock.egg-info/SOURCES.txt +13 -0
  47. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/vws_python_mock.egg-info/requires.txt +32 -30
  48. vws_python_mock-2026.8.4.1/src/vws_python_mock.egg-info/scm_file_list.json +149 -0
  49. vws_python_mock-2026.8.4.1/src/vws_python_mock.egg-info/scm_version.json +8 -0
  50. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/fixtures/credentials.py +35 -0
  51. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/fixtures/prepared_requests.py +2 -2
  52. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/fixtures/vuforia_backends.py +79 -2
  53. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_authorization_header.py +1 -1
  54. vws_python_mock-2026.8.4.1/tests/mock_vws/test_cloud_query_failure_response.py +132 -0
  55. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_date_header.py +1 -1
  56. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_docker.py +36 -11
  57. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_flask_app_usage.py +149 -1
  58. vws_python_mock-2026.8.4.1/tests/mock_vws/test_model_target_web_api.py +690 -0
  59. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_requests_mock_usage.py +363 -1
  60. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_respx_mock_usage.py +48 -0
  61. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/utils/retries.py +7 -3
  62. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/vuforia_secrets.env.example +4 -0
  63. vws_python_mock-2026.4.26/CHANGELOG.rst +0 -105
  64. vws_python_mock-2026.4.26/docs/source/installation.rst +0 -34
  65. vws_python_mock-2026.4.26/secrets.tar.gpg +0 -0
  66. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.git_archival.txt +0 -0
  67. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.gitattributes +0 -0
  68. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.github/dependabot.yml +0 -0
  69. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.github/workflows/dependabot-merge.yml +0 -0
  70. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.github/workflows/publish-site.yml +0 -0
  71. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.gitignore +0 -0
  72. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.prettierrc +0 -0
  73. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.vscode/extensions.json +0 -0
  74. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/.vscode/settings.json +0 -0
  75. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/CODE_OF_CONDUCT.rst +0 -0
  76. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/LICENSE +0 -0
  77. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/MANIFEST.in +0 -0
  78. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/admin/__init__.py +0 -0
  79. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/admin/vumark_template.svg +0 -0
  80. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/ci/__init__.py +0 -0
  81. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/ci/decrypt_secret.sh +0 -0
  82. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/ci/test_custom_linters.py +0 -0
  83. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docker-bake.hcl +0 -0
  84. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/__init__.py +0 -0
  85. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/basic-example.rst +0 -0
  86. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/changelog.rst +0 -0
  87. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/ci-setup.rst +0 -0
  88. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/contributing.rst +0 -0
  89. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/docker.rst +0 -0
  90. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/getting-started.rst +0 -0
  91. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/httpx-example.rst +0 -0
  92. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/release-process.rst +0 -0
  93. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/docs/source/versioning-and-api-stability.rst +0 -0
  94. /vws_python_mock-2026.4.26/src/mock_vws/py.typed → /vws_python_mock-2026.8.4.1/newsfragments/.gitkeep +0 -0
  95. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/setup.cfg +0 -0
  96. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_base64_decoding.py +0 -0
  97. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_database_matchers.py +0 -0
  98. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_flask_server/Dockerfile +0 -0
  99. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_flask_server/__init__.py +0 -0
  100. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_flask_server/healthcheck.py +0 -0
  101. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_mock_common.py +0 -0
  102. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_tools.py +0 -0
  103. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/__init__.py +0 -0
  104. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/accept_header_validators.py +0 -0
  105. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/auth_validators.py +0 -0
  106. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/content_length_validators.py +0 -0
  107. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/content_type_validators.py +0 -0
  108. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/date_validators.py +0 -0
  109. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/exceptions.py +0 -0
  110. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/fields_validators.py +0 -0
  111. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/image_validators.py +0 -0
  112. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/include_target_data_validators.py +0 -0
  113. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/num_results_validators.py +0 -0
  114. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_query_validators/project_state_validators.py +0 -0
  115. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_requests_mock_server/__init__.py +0 -0
  116. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_respx_mock_server/__init__.py +0 -0
  117. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/active_flag_validators.py +0 -0
  118. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/auth_validators.py +0 -0
  119. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/content_length_validators.py +0 -0
  120. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/content_type_validators.py +0 -0
  121. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/date_validators.py +0 -0
  122. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/image_validators.py +0 -0
  123. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/json_validators.py +0 -0
  124. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/key_validators.py +0 -0
  125. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/metadata_validators.py +0 -0
  126. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/name_validators.py +0 -0
  127. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/target_validators.py +0 -0
  128. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/_services_validators/width_validators.py +0 -0
  129. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/database_type.py +0 -0
  130. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/mock_vws/target.py +0 -0
  131. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/vws_python_mock.egg-info/dependency_links.txt +0 -0
  132. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/vws_python_mock.egg-info/not-zip-safe +0 -0
  133. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/src/vws_python_mock.egg-info/top_level.txt +0 -0
  134. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/__init__.py +0 -0
  135. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/conftest.py +0 -0
  136. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/__init__.py +0 -0
  137. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/fixtures/__init__.py +0 -0
  138. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_add_target.py +0 -0
  139. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_content_length.py +0 -0
  140. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_database_summary.py +0 -0
  141. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_delete_target.py +0 -0
  142. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_get_duplicates.py +0 -0
  143. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_get_target.py +0 -0
  144. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_invalid_given_id.py +0 -0
  145. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_invalid_json.py +0 -0
  146. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_query.py +0 -0
  147. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_target_list.py +0 -0
  148. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_target_raters.py +0 -0
  149. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_target_summary.py +0 -0
  150. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_target_validators.py +0 -0
  151. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_unexpected_json.py +0 -0
  152. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_update_target.py +0 -0
  153. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/test_vumark_generation_api.py +0 -0
  154. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/utils/__init__.py +0 -0
  155. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/utils/assertions.py +0 -0
  156. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/utils/too_many_requests.py +0 -0
  157. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/tests/mock_vws/utils/usage_test_helpers.py +0 -0
  158. {vws_python_mock-2026.4.26 → vws_python_mock-2026.8.4.1}/zizmor.yml +0 -0
@@ -24,7 +24,7 @@ jobs:
24
24
  runs-on: ubuntu-latest
25
25
 
26
26
  steps:
27
- - uses: actions/checkout@v6
27
+ - uses: actions/checkout@v7
28
28
  with:
29
29
  persist-credentials: false
30
30
 
@@ -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.1.0
38
+ uses: docker/bake-action@v7.3.0
39
39
  with:
40
40
  call: check
41
41
 
42
42
  - name: Build Docker images
43
- uses: docker/bake-action@v7.1.0
43
+ uses: docker/bake-action@v7.3.0
44
44
  with:
45
45
  push: false
@@ -25,12 +25,12 @@ jobs:
25
25
  runs-on: ${{ matrix.platform }}
26
26
 
27
27
  steps:
28
- - uses: actions/checkout@v6
28
+ - uses: actions/checkout@v7
29
29
  with:
30
30
  persist-credentials: false
31
31
 
32
32
  - name: Install uv
33
- uses: astral-sh/setup-uv@v7
33
+ uses: astral-sh/setup-uv@v9.0.0
34
34
  with:
35
35
  enable-cache: true
36
36
  cache-dependency-glob: '**/pyproject.toml'
@@ -42,6 +42,9 @@ jobs:
42
42
  run: uv run --extra=dev prek run --all-files --hook-stage ${{ matrix.hook-stage }}
43
43
  --verbose
44
44
  env:
45
+ # Avoid intermittent uv distribution cache rename failures while
46
+ # prek installs hook environments on Windows.
47
+ UV_NO_CACHE: '1'
45
48
  UV_PYTHON: ${{ matrix.python-version }}
46
49
 
47
50
  - uses: pre-commit-ci/lite-action@v1.1.0
@@ -18,7 +18,7 @@ jobs:
18
18
  tag: ${{ steps.tag_version.outputs.new_tag }}
19
19
 
20
20
  steps:
21
- - uses: actions/checkout@v6
21
+ - uses: actions/checkout@v7
22
22
  with:
23
23
  # Fetch all history including tags.
24
24
  # Needed to find the latest tag.
@@ -34,6 +34,12 @@ jobs:
34
34
  # The default GITHUB_TOKEN cannot bypass rulesets.
35
35
  token: ${{ secrets.RELEASE_PAT }}
36
36
 
37
+ - name: Install uv
38
+ uses: astral-sh/setup-uv@v9.0.0
39
+ with:
40
+ enable-cache: true
41
+ cache-dependency-glob: '**/pyproject.toml'
42
+
37
43
  - name: Calver calculate version
38
44
  uses: StephaneBour/actions-calver@master
39
45
  id: calver
@@ -43,41 +49,27 @@ jobs:
43
49
  env:
44
50
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
45
51
 
46
- - name: Get the changelog underline
47
- id: changelog_underline
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
48
56
  env:
49
57
  RELEASE: ${{ steps.calver.outputs.release }}
50
- run: |
51
- underline="$(echo "$RELEASE" | tr -c '\n' '-')"
52
- echo "underline=${underline}" >> "$GITHUB_OUTPUT"
58
+ run: uv run --extra=release towncrier build --draft --version "$RELEASE" >
59
+ release-notes.md
53
60
 
54
- - name: Update changelog
55
- id: update_changelog
56
- uses: jacobtomlinson/gha-find-replace@v3
57
- with:
58
- find: "Next\n----"
59
- replace: |
60
- Next
61
- ----
62
-
63
- ${{ steps.calver.outputs.release }}
64
- ${{ steps.changelog_underline.outputs.underline }}
65
- include: CHANGELOG.rst
66
- regex: false
67
-
68
- - name: Check Update changelog was modified
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
69
64
  env:
70
- MODIFIED_FILES: ${{ steps.update_changelog.outputs.modifiedFiles }}
71
- run: |
72
- if [ "$MODIFIED_FILES" = "0" ]; then
73
- echo "Error: No files were modified when updating changelog"
74
- exit 1
75
- fi
65
+ RELEASE: ${{ steps.calver.outputs.release }}
66
+ run: uv run --extra=release towncrier build --yes --version "$RELEASE"
67
+
76
68
  - uses: stefanzweifel/git-auto-commit-action@v7
77
69
  id: commit
78
70
  with:
79
71
  commit_message: Bump CHANGELOG
80
- file_pattern: CHANGELOG.rst
72
+ file_pattern: CHANGELOG.rst newsfragments
81
73
  # Error if there are no changes.
82
74
  skip_dirty_check: true
83
75
 
@@ -96,7 +88,7 @@ jobs:
96
88
  tag: ${{ steps.tag_version.outputs.new_tag }}
97
89
  makeLatest: true
98
90
  name: Release ${{ steps.tag_version.outputs.new_tag }}
99
- body: ${{ steps.tag_version.outputs.changelog }}
91
+ bodyFile: release-notes.md
100
92
 
101
93
  pypi:
102
94
  name: Publish to PyPI
@@ -113,7 +105,7 @@ jobs:
113
105
  id-token: write
114
106
 
115
107
  steps:
116
- - uses: actions/checkout@v6
108
+ - uses: actions/checkout@v7
117
109
  with:
118
110
  ref: ${{ needs.release.outputs.tag }}
119
111
  # Fetch all history including tags.
@@ -122,7 +114,7 @@ jobs:
122
114
  persist-credentials: false
123
115
 
124
116
  - name: Install uv
125
- uses: astral-sh/setup-uv@v7
117
+ uses: astral-sh/setup-uv@v9.0.0
126
118
  with:
127
119
  enable-cache: true
128
120
  cache-dependency-glob: '**/pyproject.toml'
@@ -149,13 +141,13 @@ jobs:
149
141
  packages: write
150
142
 
151
143
  steps:
152
- - uses: actions/checkout@v6
144
+ - uses: actions/checkout@v7
153
145
  with:
154
146
  ref: ${{ needs.release.outputs.tag }}
155
147
  persist-credentials: false
156
148
 
157
149
  - name: Login to GHCR
158
- uses: docker/login-action@v4
150
+ uses: docker/login-action@v4.6.0
159
151
  with:
160
152
  registry: ghcr.io
161
153
  username: ${{ github.actor }}
@@ -168,7 +160,7 @@ jobs:
168
160
  uses: docker/setup-qemu-action@v4
169
161
 
170
162
  - name: Build and push Docker images
171
- uses: docker/bake-action@v7.1.0
163
+ uses: docker/bake-action@v7.3.0
172
164
  with:
173
165
  push: true
174
166
  env:
@@ -59,6 +59,7 @@ jobs:
59
59
  - tests/mock_vws/test_authorization_header.py::TestMalformed::test_one_part_with_space
60
60
  - tests/mock_vws/test_authorization_header.py::TestMalformed::test_missing_signature
61
61
  - tests/mock_vws/test_authorization_header.py::TestBadKey
62
+ - tests/mock_vws/test_cloud_query_failure_response.py
62
63
  - tests/mock_vws/test_content_length.py::TestIncorrect::test_not_integer
63
64
  - tests/mock_vws/test_content_length.py::TestIncorrect::test_too_large
64
65
  - tests/mock_vws/test_content_length.py::TestIncorrect::test_too_small
@@ -115,6 +116,7 @@ jobs:
115
116
  - tests/mock_vws/test_requests_mock_usage.py
116
117
  - tests/mock_vws/test_respx_mock_usage.py
117
118
  - tests/mock_vws/test_flask_app_usage.py
119
+ - tests/mock_vws/test_model_target_web_api.py
118
120
  - tests/mock_vws/test_vumark_generation_api.py
119
121
  - tests/mock_vws/test_target_validators.py
120
122
  - tests/mock_vws/test_docker.py
@@ -123,12 +125,12 @@ jobs:
123
125
  - docs/
124
126
 
125
127
  steps:
126
- - uses: actions/checkout@v6
128
+ - uses: actions/checkout@v7
127
129
  with:
128
130
  persist-credentials: false
129
131
 
130
132
  - name: Install uv
131
- uses: astral-sh/setup-uv@v7
133
+ uses: astral-sh/setup-uv@v9.0.0
132
134
  with:
133
135
  enable-cache: true
134
136
  cache-dependency-glob: '**/pyproject.toml'
@@ -195,12 +197,12 @@ jobs:
195
197
  platform: [ubuntu-latest]
196
198
 
197
199
  steps:
198
- - uses: actions/checkout@v6
200
+ - uses: actions/checkout@v7
199
201
  with:
200
202
  persist-credentials: false
201
203
 
202
204
  - name: Install uv
203
- uses: astral-sh/setup-uv@v7
205
+ uses: astral-sh/setup-uv@v9.0.0
204
206
  with:
205
207
  enable-cache: true
206
208
  cache-dependency-glob: '**/pyproject.toml'
@@ -240,12 +242,12 @@ jobs:
240
242
  python-version: ['3.14']
241
243
 
242
244
  steps:
243
- - uses: actions/checkout@v6
245
+ - uses: actions/checkout@v7
244
246
  with:
245
247
  persist-credentials: false
246
248
 
247
249
  - name: Install uv
248
- uses: astral-sh/setup-uv@v7
250
+ uses: astral-sh/setup-uv@v9.0.0
249
251
  with:
250
252
  enable-cache: true
251
253
  cache-dependency-glob: '**/pyproject.toml'
@@ -254,17 +256,29 @@ jobs:
254
256
  run: |
255
257
  cp ./vuforia_secrets.env.example ./vuforia_secrets.env
256
258
 
259
+ - name: Start Docker
260
+ shell: pwsh
261
+ run: |
262
+ $service = Get-Service docker -ErrorAction Stop
263
+ if ($service.Status -ne "Running") {
264
+ Start-Service docker
265
+ }
266
+ $deadline = (Get-Date).AddMinutes(2)
267
+ do {
268
+ docker info
269
+ if ($LASTEXITCODE -eq 0) {
270
+ exit 0
271
+ }
272
+ Start-Sleep -Seconds 5
273
+ } while ((Get-Date) -lt $deadline)
274
+ docker info
275
+
257
276
  - name: Run tests
258
277
  shell: bash
259
278
  run: |
260
279
  # We use pytest-xdist to make this run much faster.
261
280
  # The downside is that we cannot use -s / --capture=no.
262
281
  #
263
- # We use coverage to collect coverage data but we currently
264
- # do not upload / use it because combining Windows and Linux
265
- # coverage is challenging.
266
- #
267
- # We therefore have a few ``# pragma: no cover`` statements.
268
282
  uv run --extra=dev \
269
283
  coverage run -m pytest \
270
284
  --skip-real \
@@ -275,6 +289,14 @@ jobs:
275
289
  env:
276
290
  UV_PYTHON: ${{ matrix.python-version }}
277
291
 
292
+ - name: Upload coverage data
293
+ uses: actions/upload-artifact@v7
294
+ with:
295
+ name: coverage-data-windows-${{ matrix.python-version }}
296
+ path: .coverage.*
297
+ include-hidden-files: true
298
+ if-no-files-found: error
299
+
278
300
  coverage:
279
301
  name: Combine & check coverage
280
302
  needs: [ci-tests, skip-tests, windows-tests]
@@ -282,12 +304,12 @@ jobs:
282
304
  runs-on: ubuntu-latest
283
305
 
284
306
  steps:
285
- - uses: actions/checkout@v6
307
+ - uses: actions/checkout@v7
286
308
  with:
287
309
  persist-credentials: false
288
310
 
289
311
  - name: Install uv
290
- uses: astral-sh/setup-uv@v7
312
+ uses: astral-sh/setup-uv@v9.0.0
291
313
  with:
292
314
  enable-cache: true
293
315
  cache-dependency-glob: '**/pyproject.toml'
@@ -9,6 +9,7 @@ ci:
9
9
  skip:
10
10
  - actionlint
11
11
  - sphinx-lint
12
+ - strict-kwargs-fix
12
13
  - check-manifest
13
14
  - custom-linters
14
15
  - deptry
@@ -174,7 +175,7 @@ repos:
174
175
  - id: mypy
175
176
  name: mypy
176
177
  stages: [pre-push]
177
- entry: uv run --extra=dev -m mypy
178
+ entry: uv run --extra=dev -m mypy --num-workers=4
178
179
  language: python
179
180
  types_or: [python, toml]
180
181
  pass_filenames: false
@@ -185,7 +186,8 @@ repos:
185
186
  - id: mypy-docs
186
187
  name: mypy-docs
187
188
  stages: [pre-push]
188
- entry: uv run --extra=dev doccmd --no-write-to-file --language=python --command="mypy"
189
+ entry: uv run --extra=dev doccmd --no-write-to-file --language=python --command="mypy
190
+ --num-workers=4"
189
191
  language: python
190
192
  types_or: [markdown, rst]
191
193
 
@@ -337,6 +339,16 @@ repos:
337
339
  - *uv_version
338
340
  stages: [pre-commit]
339
341
 
342
+ - id: strict-kwargs-fix
343
+ name: strict-kwargs
344
+ entry: uv run --extra=dev strict-kwargs check --fix
345
+ language: python
346
+ types_or: [python]
347
+ additional_dependencies:
348
+ - *uv_version
349
+ stages: [pre-commit]
350
+ require_serial: true
351
+
340
352
  - id: doc8
341
353
  name: doc8
342
354
  entry: uv run --extra=dev -m doc8
@@ -0,0 +1,140 @@
1
+ Changelog
2
+ =========
3
+
4
+ .. towncrier release notes start
5
+
6
+ 2026.08.04.1
7
+ ------------
8
+
9
+ - Replace the PyTorch image-quality stack with OpenCV and a lightweight BRISQUE
10
+ implementation. This reduces dependency download and installation sizes and
11
+ removes the need to configure PyTorch's CPU-only package index.
12
+
13
+ - 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).
14
+ Keep each Model Target dataset status response internally consistent when processing completes while the response is being generated.
15
+
16
+ - Add configurable ``TooManyRequests`` responses from VWS endpoints using the
17
+ ``CloudDatabase.requests_per_second_limit`` setting.
18
+
19
+ - 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.
20
+
21
+ 2026.08.04
22
+ ----------
23
+
24
+ - Cloud databases with ``request_quota=0`` now return a
25
+ ``RequestQuotaReached`` response from VWS endpoints.
26
+
27
+ - 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.
28
+
29
+ - Improve Model Target Web API mock authentication failure responses.
30
+
31
+ - 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).
32
+
33
+ - 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).
34
+
35
+ - Make synthetic Model Target dataset zip downloads byte-for-byte reproducible.
36
+
37
+ - 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.
38
+
39
+ - Add configurable ``TargetQuotaReached``, ``ProjectSuspended``, and
40
+ ``ProjectHasNoAPIAccess`` responses from VWS endpoints.
41
+
42
+ 2026.04.26
43
+ ----------
44
+
45
+
46
+ 2026.02.22.3
47
+ ------------
48
+
49
+
50
+ - ``MockVWS`` now intercepts both ``requests`` (via ``responses``) and ``httpx`` (via ``respx``) simultaneously.
51
+ ``MockVWSForHttpx`` has been removed — ``MockVWS`` handles both HTTP libraries.
52
+
53
+ 2026.02.22.2
54
+ ------------
55
+
56
+
57
+ 2026.02.22.1
58
+ ------------
59
+
60
+
61
+ 2026.02.22
62
+ ----------
63
+
64
+
65
+ 2026.02.21
66
+ ----------
67
+
68
+
69
+ - Add ``VuMarkTarget`` class for VuMark template targets, alongside the renamed ``ImageTarget`` class (previously ``Target``).
70
+ ``ImageTarget`` is for image-based targets and ``VuMarkTarget`` is for VuMark template targets.
71
+ Both can be stored in a ``VuforiaDatabase``.
72
+
73
+ 2026.02.18.2
74
+ ------------
75
+
76
+
77
+ 2026.02.18.1
78
+ ------------
79
+
80
+
81
+ 2026.02.18
82
+ ----------
83
+
84
+
85
+ 2026.02.15.5
86
+ ------------
87
+
88
+
89
+ 2026.02.15.4
90
+ ------------
91
+
92
+
93
+ - Add ``sleep_fn`` parameter to ``MockVWS`` for injecting a custom delay strategy, enabling deterministic and fast tests without monkey-patching.
94
+
95
+ 2026.02.15.3
96
+ ------------
97
+
98
+
99
+ - Add ``response_delay_seconds`` parameter to ``MockVWS`` for simulating slow server responses and testing timeout handling.
100
+ - Add ``response_delay_seconds`` setting to the Flask mock (``VWSSettings`` and ``VWQSettings``) for simulating slow server responses.
101
+
102
+ 2025.03.10.1
103
+ ------------
104
+
105
+ 2025.03.10
106
+ ----------
107
+
108
+ 2025.02.21
109
+ ----------
110
+
111
+ 2025.02.18
112
+ ----------
113
+
114
+ 2024.08.30
115
+ ------------
116
+
117
+ 2024.07.15
118
+ ------------
119
+
120
+ - Support passing data as strings.
121
+
122
+ 2024.07.02.1
123
+ ------------
124
+
125
+ - Fix installation on Windows now that ``numpy`` 2.0.0 has been released.
126
+
127
+ 2024.02.16
128
+ ------------
129
+
130
+ - Add a structural similarity image matcher.
131
+
132
+ 2018.12.01.0
133
+ ------------
134
+
135
+ - Distribute type information.
136
+
137
+ 2018.09.10.0
138
+ ------------
139
+
140
+ - Initial release
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python-mock
3
- Version: 2026.4.26
3
+ Version: 2026.8.4.1
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
@@ -20,16 +20,14 @@ License-File: LICENSE
20
20
  Requires-Dist: beartype>=0.22.9
21
21
  Requires-Dist: flask>=3.0.3
22
22
  Requires-Dist: httpx>=0.27.0
23
- Requires-Dist: numpy>=1.26.4
24
- Requires-Dist: pillow>=11.0.0
25
- Requires-Dist: piq>=0.8.0
23
+ Requires-Dist: numpy>=2.4.4
24
+ Requires-Dist: opencv-contrib-python-headless>=5.0.0.93
25
+ Requires-Dist: pillow>=12.2.0
26
26
  Requires-Dist: pydantic-settings>=2.6.1
27
+ Requires-Dist: pyteenybrisque>=0.1.1
27
28
  Requires-Dist: requests>=2.32.3
28
29
  Requires-Dist: responses>=0.25.3
29
30
  Requires-Dist: respx>=0.21.0
30
- Requires-Dist: torch>=2.5.1
31
- Requires-Dist: torchmetrics>=1.5.1
32
- Requires-Dist: torchvision>=0.20.1
33
31
  Requires-Dist: tzdata; sys_platform == "win32"
34
32
  Requires-Dist: vws-auth-tools>=2024.7.12
35
33
  Requires-Dist: werkzeug>=3.1.2
@@ -37,59 +35,63 @@ Provides-Extra: dev
37
35
  Requires-Dist: actionlint-py==1.7.12.24; extra == "dev"
38
36
  Requires-Dist: check-manifest==0.51; extra == "dev"
39
37
  Requires-Dist: check-wheel-contents==0.6.3; extra == "dev"
40
- Requires-Dist: coverage==7.13.5; extra == "dev"
38
+ Requires-Dist: coverage==7.15.2; extra == "dev"
41
39
  Requires-Dist: deptry==0.25.1; extra == "dev"
42
40
  Requires-Dist: dirty-equals==0.11; extra == "dev"
43
41
  Requires-Dist: doc8==2.0.0; extra == "dev"
44
- Requires-Dist: doccmd==2026.3.26.2; extra == "dev"
45
- Requires-Dist: docker==7.1.0; extra == "dev"
42
+ Requires-Dist: doccmd==2026.7.19; extra == "dev"
43
+ Requires-Dist: docker==7.2.0; extra == "dev"
46
44
  Requires-Dist: freezegun==1.5.5; extra == "dev"
47
45
  Requires-Dist: furo==2025.12.19; extra == "dev"
48
46
  Requires-Dist: interrogate==1.7.0; extra == "dev"
49
- Requires-Dist: mypy[faster-cache]==1.20.2; extra == "dev"
50
- Requires-Dist: mypy-strict-kwargs==2026.1.12; extra == "dev"
51
- Requires-Dist: prek==0.3.10; extra == "dev"
52
- Requires-Dist: pydocstringformatter==0.7.5; extra == "dev"
47
+ Requires-Dist: mypy[faster-cache]==2.3.0; extra == "dev"
48
+ Requires-Dist: mypy-strict-kwargs==2026.7.19.1; extra == "dev"
49
+ Requires-Dist: prek==0.4.11; extra == "dev"
50
+ Requires-Dist: pydocstringformatter==1.0.0; extra == "dev"
53
51
  Requires-Dist: pydocstyle==6.3; extra == "dev"
54
- Requires-Dist: pylint[spelling]==4.0.5; extra == "dev"
52
+ Requires-Dist: pylint[spelling]==4.0.6; extra == "dev"
55
53
  Requires-Dist: pylint-per-file-ignores==3.2.1; extra == "dev"
56
- Requires-Dist: pyproject-fmt==2.21.1; extra == "dev"
57
- Requires-Dist: pyrefly==0.62.0; extra == "dev"
58
- Requires-Dist: pyright==1.1.409; extra == "dev"
54
+ Requires-Dist: pyproject-fmt==2.26.0; extra == "dev"
55
+ Requires-Dist: pyrefly==1.1.1; extra == "dev"
56
+ Requires-Dist: pyright==1.1.411; extra == "dev"
59
57
  Requires-Dist: pyroma==5.0.1; extra == "dev"
60
- Requires-Dist: pytest==9.0.3; extra == "dev"
58
+ Requires-Dist: pytest==9.1.1; extra == "dev"
61
59
  Requires-Dist: pytest-beartype-tests==2026.4.26; extra == "dev"
62
60
  Requires-Dist: pytest-retry==1.7.0; extra == "dev"
63
61
  Requires-Dist: pytest-xdist==3.8.0; extra == "dev"
64
62
  Requires-Dist: pyyaml==6.0.3; extra == "dev"
65
63
  Requires-Dist: requests-mock-flask==2026.4.2; extra == "dev"
66
- Requires-Dist: ruff==0.15.11; extra == "dev"
64
+ Requires-Dist: ruff==0.16.1; extra == "dev"
67
65
  Requires-Dist: shellcheck-py==0.11.0.1; extra == "dev"
68
- Requires-Dist: shfmt-py==3.12.0.2; extra == "dev"
66
+ Requires-Dist: shfmt-py==4.0.0; extra == "dev"
69
67
  Requires-Dist: sphinx==9.1.0; extra == "dev"
70
68
  Requires-Dist: sphinx-copybutton==0.5.2; extra == "dev"
71
69
  Requires-Dist: sphinx-lint==1.0.2; extra == "dev"
72
70
  Requires-Dist: sphinx-paramlinks==0.6; extra == "dev"
73
71
  Requires-Dist: sphinx-pyproject==0.3.0; extra == "dev"
74
- Requires-Dist: sphinx-substitution-extensions==2026.1.12; extra == "dev"
75
- Requires-Dist: sphinx-toolbox==4.2.0rc1; extra == "dev"
72
+ Requires-Dist: sphinx-substitution-extensions==2026.6.17; extra == "dev"
73
+ Requires-Dist: sphinx-toolbox==4.3.0; extra == "dev"
76
74
  Requires-Dist: sphinxcontrib-httpdomain==2.0.0; extra == "dev"
77
75
  Requires-Dist: sphinxcontrib-spelling==8.0.2; extra == "dev"
78
- Requires-Dist: sybil==10.0.1; extra == "dev"
76
+ Requires-Dist: sphinxcontrib-towncrier==0.5.0a0; extra == "dev"
77
+ Requires-Dist: strict-kwargs==2026.7.24; extra == "dev"
78
+ Requires-Dist: sybil==10.1.0; extra == "dev"
79
79
  Requires-Dist: tenacity==9.1.4; extra == "dev"
80
- Requires-Dist: ty==0.0.32; extra == "dev"
81
- Requires-Dist: types-docker==7.1.0.20260409; extra == "dev"
82
- Requires-Dist: types-pyyaml==6.0.12.20260408; extra == "dev"
83
- Requires-Dist: types-requests==2.33.0.20260408; extra == "dev"
84
- Requires-Dist: urllib3==2.6.3; extra == "dev"
80
+ Requires-Dist: towncrier==25.8.0; extra == "dev"
81
+ Requires-Dist: ty==0.0.65; extra == "dev"
82
+ Requires-Dist: types-docker==7.2.0.20260728; extra == "dev"
83
+ Requires-Dist: types-pyyaml==6.0.12.20260724; extra == "dev"
84
+ Requires-Dist: types-requests==2.33.0.20260712; extra == "dev"
85
+ Requires-Dist: urllib3==2.7.0; extra == "dev"
85
86
  Requires-Dist: vulture==2.16; extra == "dev"
86
87
  Requires-Dist: vws-python==2026.2.25.1; extra == "dev"
87
88
  Requires-Dist: vws-test-fixtures==2023.3.5; extra == "dev"
88
- Requires-Dist: vws-web-tools==2026.2.22.1; extra == "dev"
89
+ Requires-Dist: vws-web-tools==2026.5.21; extra == "dev"
89
90
  Requires-Dist: yamlfix==1.19.1; extra == "dev"
90
- Requires-Dist: zizmor==1.24.1; extra == "dev"
91
+ Requires-Dist: zizmor==1.28.0; extra == "dev"
91
92
  Provides-Extra: release
92
93
  Requires-Dist: check-wheel-contents==0.6.3; extra == "release"
94
+ Requires-Dist: towncrier==25.8.0; extra == "release"
93
95
  Dynamic: license-file
94
96
 
95
97
  |Build Status| |PyPI|
@@ -100,7 +102,7 @@ VWS Mock
100
102
  .. contents::
101
103
  :local:
102
104
 
103
- Mock for the Vuforia Web Services (VWS) API and the Vuforia Web Query API.
105
+ Mock for the Vuforia Web Services (VWS) API, the Vuforia Web Query API, and the Model Target Web API.
104
106
 
105
107
  Mocking calls made to Vuforia
106
108
  ------------------------------
@@ -6,7 +6,7 @@ VWS Mock
6
6
  .. contents::
7
7
  :local:
8
8
 
9
- Mock for the Vuforia Web Services (VWS) API and the Vuforia Web Query API.
9
+ Mock for the Vuforia Web Services (VWS) API, the Vuforia Web Query API, and the Model Target Web API.
10
10
 
11
11
  Mocking calls made to Vuforia
12
12
  ------------------------------