vws-python-mock 2026.9.8__tar.gz → 2026.9.12__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 (194) hide show
  1. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.vale.ini +2 -1
  2. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/CHANGELOG.rst +36 -21
  3. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/CODE_OF_CONDUCT.rst +10 -15
  4. {vws_python_mock-2026.9.8/src/vws_python_mock.egg-info → vws_python_mock-2026.9.12}/PKG-INFO +2 -2
  5. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/ci-setup.rst +3 -6
  6. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/contributing.rst +3 -6
  7. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/differences-to-vws.rst +110 -177
  8. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/docker.rst +2 -4
  9. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/mock-api-reference.rst +4 -0
  10. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/unreleased.rst +2 -2
  11. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/unverified-behavior.rst +0 -13
  12. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/prek.toml +13 -0
  13. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/pyproject.toml +6 -3
  14. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_flask_server/target_manager.py +138 -47
  15. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_flask_server/vws.py +77 -37
  16. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_httpx2_mock_server/decorators.py +1 -4
  17. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_mock_common.py +44 -7
  18. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_model_target_web_api.py +44 -29
  19. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_tools.py +8 -12
  20. vws_python_mock-2026.9.12/src/mock_vws/_reco_counts_web_api.py +430 -0
  21. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_requests_mock_server/mock_web_query_api.py +12 -22
  22. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_requests_mock_server/mock_web_services_api.py +56 -33
  23. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_respx_mock_server/decorators.py +1 -4
  24. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/context.py +16 -5
  25. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/instance_id_validators.py +1 -1
  26. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/metadata_validators.py +12 -2
  27. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/name_validators.py +11 -5
  28. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/width_validators.py +1 -4
  29. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/decorators.py +12 -10
  30. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/model_target.py +34 -10
  31. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/reco_counts.py +6 -3
  32. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/target_manager.py +2 -2
  33. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12/src/vws_python_mock.egg-info}/PKG-INFO +2 -2
  34. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/vws_python_mock.egg-info/SOURCES.txt +3 -0
  35. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/vws_python_mock.egg-info/requires.txt +1 -1
  36. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/vws_python_mock.egg-info/scm_file_list.json +3 -0
  37. vws_python_mock-2026.9.12/src/vws_python_mock.egg-info/scm_version.json +8 -0
  38. vws_python_mock-2026.9.12/styles/snapper/LongProseLine.yml +11 -0
  39. vws_python_mock-2026.9.12/styles/snapper/SemanticLineBreaks.yml +11 -0
  40. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/conftest.py +12 -6
  41. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/fixtures/vuforia_backends.py +10 -0
  42. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_add_target.py +13 -8
  43. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_authorization_header.py +12 -4
  44. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_docker.py +8 -4
  45. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_flask_app_usage.py +25 -8
  46. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_healthcheck.py +8 -2
  47. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_httpx2_mock_usage.py +6 -4
  48. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_model_target_failure_response.py +19 -10
  49. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_model_target_generation_failure.py +13 -8
  50. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_model_target_generation_warning.py +13 -8
  51. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_model_target_retries.py +12 -4
  52. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_model_target_training_allowance.py +2 -2
  53. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_model_target_web_api.py +25 -7
  54. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_query.py +3 -6
  55. vws_python_mock-2026.9.12/tests/mock_vws/test_reco_counts_report.py +808 -0
  56. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_requests_mock_usage.py +15 -33
  57. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/utils/assertions.py +16 -7
  58. vws_python_mock-2026.9.12/tests/mock_vws/utils/cloud_databases.py +47 -0
  59. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/utils/model_target_retries.py +2 -1
  60. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/uv.lock +27 -12
  61. vws_python_mock-2026.9.8/src/mock_vws/_reco_counts_web_api.py +0 -231
  62. vws_python_mock-2026.9.8/src/vws_python_mock.egg-info/scm_version.json +0 -8
  63. vws_python_mock-2026.9.8/tests/mock_vws/test_reco_counts_report.py +0 -300
  64. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.dockerignore +0 -0
  65. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.git_archival.txt +0 -0
  66. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.gitattributes +0 -0
  67. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/dependabot.yml +0 -0
  68. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/workflows/autofix.yml +0 -0
  69. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/workflows/dependabot-merge.yml +0 -0
  70. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/workflows/docker-build.yml +0 -0
  71. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/workflows/lint.yml +0 -0
  72. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/workflows/publish-site.yml +0 -0
  73. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/workflows/release.yml +0 -0
  74. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.github/workflows/test.yml +0 -0
  75. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.gitignore +0 -0
  76. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.prettierrc +0 -0
  77. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.vscode/extensions.json +0 -0
  78. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/.vscode/settings.json +0 -0
  79. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/LICENSE +0 -0
  80. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/MANIFEST.in +0 -0
  81. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/README.rst +0 -0
  82. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/admin/__init__.py +0 -0
  83. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/admin/create_secrets_files.py +0 -0
  84. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/admin/vumark_template.svg +0 -0
  85. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/ci/__init__.py +0 -0
  86. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/ci/decrypt_secret.sh +0 -0
  87. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/conftest.py +0 -0
  88. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docker-bake.hcl +0 -0
  89. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/__init__.py +0 -0
  90. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/basic-example.rst +0 -0
  91. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/changelog.rst +0 -0
  92. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/conf.py +0 -0
  93. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/getting-started.rst +0 -0
  94. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/httpx-example.rst +0 -0
  95. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/httpx2-example.rst +0 -0
  96. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/index.rst +0 -0
  97. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/installation.rst +0 -0
  98. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/release-process.rst +0 -0
  99. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/source/versioning-and-api-stability.rst +0 -0
  100. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/docs/towncrier_template.rst.jinja +0 -0
  101. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/newsfragments/.gitkeep +0 -0
  102. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/secrets.tar.gpg +0 -0
  103. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/setup.cfg +0 -0
  104. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/spelling_private_dict.txt +0 -0
  105. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/__init__.py +0 -0
  106. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_base64_decoding.py +0 -0
  107. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_constants.py +0 -0
  108. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_database_matchers.py +0 -0
  109. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_flask_server/Dockerfile +0 -0
  110. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_flask_server/__init__.py +0 -0
  111. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_flask_server/healthcheck.py +0 -0
  112. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_flask_server/vwq.py +0 -0
  113. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_httpx2_mock_server/__init__.py +0 -0
  114. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_image_opening.py +0 -0
  115. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_matching.py +0 -0
  116. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/__init__.py +0 -0
  117. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/accept_header_validators.py +0 -0
  118. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/auth_validators.py +0 -0
  119. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/content_length_validators.py +0 -0
  120. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/content_type_validators.py +0 -0
  121. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/date_validators.py +0 -0
  122. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/exceptions.py +0 -0
  123. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/fields_validators.py +0 -0
  124. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/header_size_validators.py +0 -0
  125. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/image_validators.py +0 -0
  126. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/include_target_data_validators.py +0 -0
  127. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/multipart.py +0 -0
  128. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/num_results_validators.py +0 -0
  129. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_query_validators/project_state_validators.py +0 -0
  130. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_requests_mock_server/__init__.py +0 -0
  131. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_respx_mock_server/__init__.py +0 -0
  132. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/__init__.py +0 -0
  133. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/active_flag_validators.py +0 -0
  134. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/auth_validators.py +0 -0
  135. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/content_length_validators.py +0 -0
  136. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/content_type_validators.py +0 -0
  137. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/database_id_validators.py +0 -0
  138. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/date_validators.py +0 -0
  139. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/exceptions.py +0 -0
  140. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/header_size_validators.py +0 -0
  141. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/image_validators.py +0 -0
  142. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/json_validators.py +0 -0
  143. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/key_validators.py +0 -0
  144. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/project_state_validators.py +0 -0
  145. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/request_quota_validators.py +0 -0
  146. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/request_rate_limiter.py +0 -0
  147. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/routes.py +0 -0
  148. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/target_quota_validators.py +0 -0
  149. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/_services_validators/target_validators.py +0 -0
  150. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/cloud_query.py +0 -0
  151. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/database.py +0 -0
  152. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/database_type.py +0 -0
  153. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/image_matchers.py +0 -0
  154. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/py.typed +0 -0
  155. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/request_rate_limits.py +0 -0
  156. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/states.py +0 -0
  157. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/target.py +0 -0
  158. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/target_raters.py +0 -0
  159. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/mock_vws/vumark.py +0 -0
  160. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/vws_python_mock.egg-info/dependency_links.txt +0 -0
  161. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/vws_python_mock.egg-info/not-zip-safe +0 -0
  162. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/src/vws_python_mock.egg-info/top_level.txt +0 -0
  163. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/__init__.py +0 -0
  164. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/__init__.py +0 -0
  165. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/fixtures/__init__.py +0 -0
  166. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/fixtures/credentials.py +0 -0
  167. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/fixtures/model_target_prepared_requests.py +0 -0
  168. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/fixtures/prepared_requests.py +0 -0
  169. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_cloud_query_failure_response.py +0 -0
  170. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_content_length.py +0 -0
  171. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_database_summary.py +0 -0
  172. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_date_header.py +0 -0
  173. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_delete_target.py +0 -0
  174. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_get_duplicates.py +0 -0
  175. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_get_target.py +0 -0
  176. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_header_size.py +0 -0
  177. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_invalid_given_id.py +0 -0
  178. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_invalid_json.py +0 -0
  179. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_respx_mock_usage.py +0 -0
  180. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_target_list.py +0 -0
  181. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_target_raters.py +0 -0
  182. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_target_summary.py +0 -0
  183. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_target_validators.py +0 -0
  184. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_unexpected_json.py +0 -0
  185. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_update_target.py +0 -0
  186. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_vumark_generation_api.py +0 -0
  187. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/test_vumark_generation_failure.py +0 -0
  188. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/utils/__init__.py +0 -0
  189. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/utils/recognition_counts.py +0 -0
  190. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/utils/retries.py +0 -0
  191. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/utils/too_many_requests.py +0 -0
  192. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/tests/mock_vws/utils/usage_test_helpers.py +0 -0
  193. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/vuforia_secrets.env.example +0 -0
  194. {vws_python_mock-2026.9.8 → vws_python_mock-2026.9.12}/zizmor.yml +0 -0
@@ -4,7 +4,8 @@ MinAlertLevel = error
4
4
  Packages = https://github.com/tbhb/vale-ai-tells/releases/download/v1.29.0/ai-tells.zip
5
5
 
6
6
  [*.{rst,md}]
7
- BasedOnStyles = ai-tells
7
+ BasedOnStyles = ai-tells, snapper
8
+ snapper.SemanticLineBreaks = error
8
9
 
9
10
  # These rules misclassify established technical, example, or release-note prose
10
11
  # in this repository. All other ai-tells rules remain enforced.
@@ -3,6 +3,25 @@ Changelog
3
3
 
4
4
  .. towncrier release notes start
5
5
 
6
+ 2026.09.12
7
+ ----------
8
+
9
+ - Validate decoded Model Target request values before processing them.
10
+
11
+ - Type target-manager request defaults as database dictionaries instead of arbitrary mappings.
12
+
13
+ - Type parsed Target Manager request bodies using recursive JSON values.
14
+
15
+ - Accept integer ``response_delay_seconds`` values when mocking ``requests`` calls.
16
+
17
+ 2026.09.08.1
18
+ ------------
19
+
20
+ - The URL of a reco counts report now has the shape of the presigned cloud storage URL which real Vuforia returns.
21
+ 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.
22
+ 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.
23
+ 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.
24
+
6
25
  2026.09.08
7
26
  ----------
8
27
 
@@ -36,9 +55,11 @@ Changelog
36
55
 
37
56
  - 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.
38
57
 
39
- - ``MockVWS`` now intercepts ``httpx2`` requests, synchronous and asynchronous, alongside ``requests`` and ``httpx``. The ``httpx2`` path uses native ``httpx2`` requests and responses, and does not need ``httpx2.alias_httpx()``.
58
+ - ``MockVWS`` now intercepts ``httpx2`` requests, synchronous and asynchronous, alongside ``requests`` and ``httpx``.
59
+ The ``httpx2`` path uses native ``httpx2`` requests and responses, and does not need ``httpx2.alias_httpx()``.
40
60
 
41
- - 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. Previously the outer mock kept answering and requests to the inner mock's URL were refused.
61
+ - 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.
62
+ Previously the outer mock kept answering and requests to the inner mock's URL were refused.
42
63
 
43
64
  - Return a response, rather than raising an uncaught ``JSONDecodeError``, when an empty body is given to a VWS endpoint which takes a JSON body.
44
65
  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.
@@ -69,16 +90,17 @@ Changelog
69
90
  - 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``.
70
91
  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.
71
92
 
72
- - Return targets in a deterministic order from the Query API, ``GET /targets``
73
- and ``GET /duplicates/{target_id}``. Targets are ordered by upload date and
74
- then by target ID, so repeated runs agree with each other. This order is not
75
- Vuforia's match score order.
93
+ - Return targets in a deterministic order from the Query API, ``GET /targets`` and ``GET /duplicates/{target_id}``.
94
+ Targets are ordered by upload date and then by target ID, so repeated runs agree with each other.
95
+ This order is not Vuforia's match score order.
76
96
 
77
97
  - Document the Docker containers' configuration with the environment variable names and values which the applications actually read, starting with ``TARGET_MANAGER_BASE_URL``.
78
98
 
79
99
  - 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.
80
100
 
81
- - Store Model Target datasets in the target manager service rather than in the VWS application. In the Docker deployment, datasets now survive a restart of the VWS container, matching how cloud databases and their targets are stored. 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.
101
+ - Store Model Target datasets in the target manager service rather than in the VWS application.
102
+ In the Docker deployment, datasets now survive a restart of the VWS container, matching how cloud databases and their targets are stored.
103
+ 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.
82
104
 
83
105
  - Report the Docker containers as unhealthy without a traceback in the health check probe output while nothing is yet listening on the port.
84
106
 
@@ -114,9 +136,7 @@ Changelog
114
136
 
115
137
  - 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.
116
138
 
117
- - Model VWS request rate limits per endpoint with the new
118
- ``CloudDatabase.request_rate_limits`` setting, including the limits which
119
- Vuforia documents as ``mock_vws.request_rate_limits.DOCUMENTED_REQUEST_RATE_LIMITS``.
139
+ - 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``.
120
140
  No request rate limit is applied by default.
121
141
 
122
142
  - Change the ``ProjectHasNoAPIAccess`` result code to ``ProjectHasNoApiAccess``, matching Vuforia's result codes table.
@@ -136,19 +156,16 @@ Changelog
136
156
  2026.08.04.2
137
157
  ------------
138
158
 
139
- - Replace the PyTorch image-quality stack with OpenCV and a lightweight BRISQUE
140
- implementation. This reduces dependency download and installation sizes and
141
- removes the need to configure PyTorch's CPU-only package index.
159
+ - Replace the PyTorch image-quality stack with OpenCV and a lightweight BRISQUE implementation.
160
+ This reduces dependency download and installation sizes and removes the need to configure PyTorch's CPU-only package index.
142
161
 
143
162
  - Allow VuMark generation requests to be configured to return ``QuotaExceeded``, ``LicenseCheckFailed``, or ``AuthorizationFailed`` responses.
144
163
 
145
- - Cloud databases with ``request_quota=0`` now return a
146
- ``RequestQuotaReached`` response from VWS endpoints.
164
+ - Cloud databases with ``request_quota=0`` now return a ``RequestQuotaReached`` response from VWS endpoints.
147
165
 
148
166
  - 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.
149
167
 
150
- - Improve Model Target Web API mock authentication failure responses, including
151
- malformed and unsecured JSON Web Token headers.
168
+ - Improve Model Target Web API mock authentication failure responses, including malformed and unsecured JSON Web Token headers.
152
169
 
153
170
  - 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).
154
171
 
@@ -159,11 +176,9 @@ Changelog
159
176
 
160
177
  - 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.
161
178
 
162
- - Add configurable ``TargetQuotaReached``, ``ProjectSuspended``, and
163
- ``ProjectHasNoAPIAccess`` responses from VWS endpoints.
179
+ - Add configurable ``TargetQuotaReached``, ``ProjectSuspended``, and ``ProjectHasNoAPIAccess`` responses from VWS endpoints.
164
180
 
165
- - Add configurable ``TooManyRequests`` responses from VWS endpoints using the
166
- ``CloudDatabase.requests_per_second_limit`` setting.
181
+ - Add configurable ``TooManyRequests`` responses from VWS endpoints using the ``CloudDatabase.requests_per_second_limit`` setting.
167
182
 
168
183
  - 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.
169
184
 
@@ -11,19 +11,9 @@ Our Standards
11
11
 
12
12
  Examples of behavior that contributes to creating a positive environment include:
13
13
 
14
- Using welcoming and inclusive language
15
- Being respectful of differing viewpoints and experiences
16
- Gracefully accepting constructive criticism
17
- Focusing on what is best for the community
18
- Showing empathy towards other community members
19
- Examples of unacceptable behavior by participants include:
20
-
21
- The use of sexualized language or imagery and unwelcome sexual attention or advances
22
- Trolling, insulting/derogatory comments, and personal or political attacks
23
- Public or private harassment
24
- Publishing others' private information, such as a physical or electronic address, without explicit permission
25
- Other conduct which could reasonably be considered inappropriate in a professional setting
26
- Our Responsibilities
14
+ Using welcoming and inclusive language Being respectful of differing viewpoints and experiences Gracefully accepting constructive criticism Focusing on what is best for the community Showing empathy towards other community members Examples of unacceptable behavior by participants include:
15
+
16
+ The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Our Responsibilities
27
17
 
28
18
  Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
29
19
 
@@ -32,12 +22,17 @@ Project maintainers have the right and responsibility to remove, edit, or reject
32
22
  Scope
33
23
  -----
34
24
 
35
- This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
25
+ This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
26
+ Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
27
+ Representation of a project may be further defined and clarified by project maintainers.
36
28
 
37
29
  Enforcement
38
30
  -----------
39
31
 
40
- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at adamdangoor@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
32
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at adamdangoor@gmail.com.
33
+ All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
34
+ The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
35
+ Further details of specific enforcement policies may be posted separately.
41
36
 
42
37
  Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
43
38
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python-mock
3
- Version: 2026.9.8
3
+ Version: 2026.9.12
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
@@ -21,7 +21,7 @@ Requires-Dist: beartype>=0.22.9
21
21
  Requires-Dist: flask>=3.0.3
22
22
  Requires-Dist: httpx>=0.27.0
23
23
  Requires-Dist: httpx2>=2.12
24
- Requires-Dist: mock-response-delay>=2026.9.7
24
+ Requires-Dist: mock-response-delay>=2026.9.12
25
25
  Requires-Dist: numpy>=2.4.4
26
26
  Requires-Dist: opencv-contrib-python-headless>=5.0.0.93
27
27
  Requires-Dist: pillow>=12.2.0
@@ -24,12 +24,9 @@ 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`.
28
- Each file needs distinct active Cloud database credentials so concurrent jobs
29
- do not modify the same database. The files can share the inactive Cloud,
30
- active and inactive VuMark, and Model Target credentials.
31
- Add at least as many consecutively numbered files, starting at zero, as there
32
- are builds in the GitHub test matrix.
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.
28
+ The files can share the inactive Cloud, active and inactive VuMark, and Model Target credentials.
29
+ Add at least as many consecutively numbered files, starting at zero, as there are builds in the GitHub test matrix.
33
30
 
34
31
  Choose a passphrase for the secrets.
35
32
  In the GitHub repository > Settings > Secrets, add a secret with the name ``PASSPHRASE_FOR_VUFORIA_SECRETS`` and the chosen passphrase.
@@ -56,8 +56,7 @@ Create an environment variable file for secrets:
56
56
  $ cp vuforia_secrets.env.example vuforia_secrets.env
57
57
 
58
58
  Some tests require Vuforia credentials.
59
- To run these tests, add the Vuforia credentials to the file :file:`vuforia_secrets.env`.
60
- See :ref:`connecting-to-vuforia`.
59
+ To run these tests, add the Vuforia credentials to the file :file:`vuforia_secrets.env`. See :ref:`connecting-to-vuforia`.
61
60
 
62
61
  Then run ``pytest``:
63
62
 
@@ -73,14 +72,12 @@ Connecting to Vuforia
73
72
  To connect to Vuforia, Vuforia target databases must be created via the Vuforia Web UI.
74
73
  Then, secret keys must be set as environment variables.
75
74
 
76
- The test infrastructure allows those keys to be set in the file :file:`vuforia_secrets.env`.
77
- See :file:`vuforia_secrets.env.example` for the environment variables to set.
75
+ The test infrastructure allows those keys to be set in the file :file:`vuforia_secrets.env`. See :file:`vuforia_secrets.env.example` for the environment variables to set.
78
76
 
79
77
  Do not use a target database that you are using for other purposes.
80
78
  This is because the test suite adds and deletes targets.
81
79
 
82
- To create a target database, first create a license key in the `Vuforia License Manager`_.
83
- Then, add a database from the `Vuforia Target Manager`_.
80
+ To create a target database, first create a license key in the `Vuforia License Manager`_. Then, add a database from the `Vuforia Target Manager`_.
84
81
 
85
82
  To find the environment variables to set in the :file:`vuforia_secrets.env` file, visit the Target Database in the `Vuforia Target Manager`_ and view the "Database Access Keys".
86
83