vws-python-mock 2026.2.18.2__tar.gz → 2026.2.22__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 (146) hide show
  1. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/CHANGELOG.rst +12 -0
  2. {vws_python_mock-2026.2.18.2/src/vws_python_mock.egg-info → vws_python_mock-2026.2.22}/PKG-INFO +32 -6
  3. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/README.rst +27 -3
  4. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/ci/test_custom_linters.py +1 -0
  5. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/basic-example.rst +3 -3
  6. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/docker.rst +3 -3
  7. vws_python_mock-2026.2.22/docs/source/getting-started.rst +12 -0
  8. vws_python_mock-2026.2.22/docs/source/httpx-example.rst +22 -0
  9. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/index.rst +5 -0
  10. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/mock-api-reference.rst +18 -3
  11. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/pyproject.toml +13 -10
  12. vws_python_mock-2026.2.22/secrets.tar.gpg +0 -0
  13. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/spelling_private_dict.txt +3 -0
  14. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/__init__.py +2 -0
  15. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_constants.py +1 -0
  16. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_database_matchers.py +8 -6
  17. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/target_manager.py +171 -54
  18. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/vwq.py +7 -5
  19. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/vws.py +88 -29
  20. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_mock_common.py +20 -1
  21. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_tools.py +2 -2
  22. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/__init__.py +2 -2
  23. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/auth_validators.py +3 -3
  24. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/content_type_validators.py +1 -0
  25. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/date_validators.py +1 -0
  26. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/image_validators.py +1 -0
  27. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/include_target_data_validators.py +1 -0
  28. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/project_state_validators.py +3 -2
  29. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_requests_mock_server/decorators.py +43 -10
  30. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_requests_mock_server/mock_web_query_api.py +12 -24
  31. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_requests_mock_server/mock_web_services_api.py +144 -129
  32. vws_python_mock-2026.2.22/src/mock_vws/_respx_mock_server/__init__.py +1 -0
  33. vws_python_mock-2026.2.22/src/mock_vws/_respx_mock_server/decorators.py +275 -0
  34. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/__init__.py +6 -2
  35. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/auth_validators.py +6 -4
  36. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/exceptions.py +40 -0
  37. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/key_validators.py +1 -0
  38. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/name_validators.py +6 -4
  39. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/project_state_validators.py +9 -3
  40. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/target_validators.py +5 -3
  41. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/database.py +111 -19
  42. vws_python_mock-2026.2.22/src/mock_vws/database_type.py +13 -0
  43. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/target.py +83 -7
  44. vws_python_mock-2026.2.22/src/mock_vws/target_manager.py +158 -0
  45. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22/src/vws_python_mock.egg-info}/PKG-INFO +32 -6
  46. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/SOURCES.txt +5 -0
  47. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/requires.txt +4 -2
  48. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/conftest.py +9 -6
  49. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/credentials.py +14 -14
  50. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/prepared_requests.py +15 -13
  51. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/vuforia_backends.py +55 -53
  52. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_add_target.py +26 -0
  53. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_authorization_header.py +7 -5
  54. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_database_summary.py +13 -5
  55. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_delete_target.py +2 -2
  56. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_docker.py +4 -3
  57. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_flask_app_usage.py +228 -48
  58. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_get_duplicates.py +5 -0
  59. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_get_target.py +4 -0
  60. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_invalid_given_id.py +4 -0
  61. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_query.py +63 -24
  62. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_requests_mock_usage.py +118 -38
  63. vws_python_mock-2026.2.22/tests/mock_vws/test_respx_mock_usage.py +350 -0
  64. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_list.py +2 -0
  65. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_summary.py +5 -3
  66. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_validators.py +8 -8
  67. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_update_target.py +26 -5
  68. vws_python_mock-2026.2.22/tests/mock_vws/test_vumark_generation_api.py +360 -0
  69. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/__init__.py +5 -0
  70. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/assertions.py +1 -0
  71. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/usage_test_helpers.py +4 -2
  72. vws_python_mock-2026.2.18.2/docs/source/getting-started.rst +0 -4
  73. vws_python_mock-2026.2.18.2/secrets.tar.gpg +0 -0
  74. vws_python_mock-2026.2.18.2/src/mock_vws/target_manager.py +0 -87
  75. vws_python_mock-2026.2.18.2/tests/mock_vws/test_vumark_generation_api.py +0 -137
  76. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.git_archival.txt +0 -0
  77. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.gitattributes +0 -0
  78. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/dependabot.yml +0 -0
  79. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/dependabot-merge.yml +0 -0
  80. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/docker-build.yml +0 -0
  81. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/lint.yml +0 -0
  82. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/publish-site.yml +0 -0
  83. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/release.yml +0 -0
  84. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/test.yml +0 -0
  85. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.gitignore +0 -0
  86. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.pre-commit-config.yaml +0 -0
  87. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.prettierrc +0 -0
  88. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.vscode/extensions.json +0 -0
  89. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.vscode/settings.json +0 -0
  90. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/CODE_OF_CONDUCT.rst +0 -0
  91. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/LICENSE +0 -0
  92. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/MANIFEST.in +0 -0
  93. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/admin/__init__.py +0 -0
  94. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/admin/create_secrets_files.py +0 -0
  95. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/admin/vumark_template.svg +0 -0
  96. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/ci/__init__.py +0 -0
  97. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/ci/decrypt_secret.sh +0 -0
  98. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/conftest.py +0 -0
  99. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docker-bake.hcl +0 -0
  100. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/__init__.py +0 -0
  101. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/changelog.rst +0 -0
  102. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/ci-setup.rst +0 -0
  103. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/conf.py +0 -0
  104. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/contributing.rst +0 -0
  105. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/differences-to-vws.rst +0 -0
  106. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/installation.rst +0 -0
  107. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/release-process.rst +0 -0
  108. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/versioning-and-api-stability.rst +0 -0
  109. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/setup.cfg +0 -0
  110. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_base64_decoding.py +0 -0
  111. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/Dockerfile +0 -0
  112. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/__init__.py +0 -0
  113. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/healthcheck.py +0 -0
  114. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/accept_header_validators.py +0 -0
  115. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/content_length_validators.py +0 -0
  116. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/exceptions.py +0 -0
  117. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/fields_validators.py +0 -0
  118. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/num_results_validators.py +0 -0
  119. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_requests_mock_server/__init__.py +0 -0
  120. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/active_flag_validators.py +0 -0
  121. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/content_length_validators.py +0 -0
  122. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/content_type_validators.py +0 -0
  123. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/date_validators.py +0 -0
  124. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/image_validators.py +0 -0
  125. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/json_validators.py +0 -0
  126. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/metadata_validators.py +0 -0
  127. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/width_validators.py +0 -0
  128. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/image_matchers.py +0 -0
  129. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/py.typed +0 -0
  130. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/states.py +0 -0
  131. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/target_raters.py +0 -0
  132. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/dependency_links.txt +0 -0
  133. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/not-zip-safe +0 -0
  134. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/top_level.txt +0 -0
  135. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/__init__.py +0 -0
  136. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/__init__.py +0 -0
  137. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/__init__.py +0 -0
  138. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_content_length.py +0 -0
  139. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_date_header.py +0 -0
  140. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_invalid_json.py +0 -0
  141. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_raters.py +0 -0
  142. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_unexpected_json.py +0 -0
  143. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/retries.py +0 -0
  144. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/too_many_requests.py +0 -0
  145. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/vuforia_secrets.env.example +0 -0
  146. {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/zizmor.yml +0 -0
@@ -4,6 +4,18 @@ Changelog
4
4
  Next
5
5
  ----
6
6
 
7
+ 2026.02.22
8
+ ----------
9
+
10
+
11
+ 2026.02.21
12
+ ----------
13
+
14
+
15
+ - Add ``VuMarkTarget`` class for VuMark template targets, alongside the renamed ``ImageTarget`` class (previously ``Target``).
16
+ ``ImageTarget`` is for image-based targets and ``VuMarkTarget`` is for VuMark template targets.
17
+ Both can be stored in a ``VuforiaDatabase``.
18
+
7
19
  2026.02.18.2
8
20
  ------------
9
21
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vws-python-mock
3
- Version: 2026.2.18.2
3
+ Version: 2026.2.22
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
@@ -19,12 +19,14 @@ Description-Content-Type: text/x-rst
19
19
  License-File: LICENSE
20
20
  Requires-Dist: beartype>=0.22.9
21
21
  Requires-Dist: flask>=3.0.3
22
+ Requires-Dist: httpx>=0.27.0
22
23
  Requires-Dist: numpy>=1.26.4
23
24
  Requires-Dist: pillow>=11.0.0
24
25
  Requires-Dist: piq>=0.8.0
25
26
  Requires-Dist: pydantic-settings>=2.6.1
26
27
  Requires-Dist: requests>=2.32.3
27
28
  Requires-Dist: responses>=0.25.3
29
+ Requires-Dist: respx>=0.21.0
28
30
  Requires-Dist: torch>=2.5.1
29
31
  Requires-Dist: torchmetrics>=1.5.1
30
32
  Requires-Dist: torchvision>=0.20.1
@@ -82,9 +84,9 @@ Requires-Dist: types-pyyaml==6.0.12.20250915; extra == "dev"
82
84
  Requires-Dist: types-requests==2.32.4.20260107; extra == "dev"
83
85
  Requires-Dist: urllib3==2.6.3; extra == "dev"
84
86
  Requires-Dist: vulture==2.14; extra == "dev"
85
- Requires-Dist: vws-python==2026.2.15; extra == "dev"
87
+ Requires-Dist: vws-python==2026.2.21; extra == "dev"
86
88
  Requires-Dist: vws-test-fixtures==2023.3.5; extra == "dev"
87
- Requires-Dist: vws-web-tools==2026.2.17.1; extra == "dev"
89
+ Requires-Dist: vws-web-tools==2026.2.20; extra == "dev"
88
90
  Requires-Dist: yamlfix==1.19.1; extra == "dev"
89
91
  Requires-Dist: zizmor==1.22.0; extra == "dev"
90
92
  Provides-Extra: release
@@ -119,11 +121,11 @@ This requires Python |minimum-python-version|\+.
119
121
  import requests
120
122
 
121
123
  from mock_vws import MockVWS
122
- from mock_vws.database import VuforiaDatabase
124
+ from mock_vws.database import CloudDatabase
123
125
 
124
126
  with MockVWS() as mock:
125
- database = VuforiaDatabase()
126
- mock.add_database(database=database)
127
+ database = CloudDatabase()
128
+ mock.add_cloud_database(cloud_database=database)
127
129
  # This will use the Vuforia mock.
128
130
  requests.get(url="https://vws.vuforia.com/summary", timeout=30)
129
131
 
@@ -131,6 +133,30 @@ By default, an exception will be raised if any requests to unmocked addresses ar
131
133
 
132
134
  .. _requests: https://pypi.org/project/requests/
133
135
 
136
+ Mocking calls made to Vuforia with Python ``httpx``
137
+ ----------------------------------------------------
138
+
139
+ Using the mock redirects requests to Vuforia made with `httpx`_ to an in-memory implementation.
140
+
141
+ .. code-block:: python
142
+
143
+ """Make a request to the Vuforia Web Services API mock."""
144
+
145
+ import httpx
146
+
147
+ from mock_vws import MockVWSForHttpx
148
+ from mock_vws.database import CloudDatabase
149
+
150
+ with MockVWSForHttpx() as mock:
151
+ database = CloudDatabase()
152
+ mock.add_cloud_database(cloud_database=database)
153
+ # This will use the Vuforia mock.
154
+ httpx.get(url="https://vws.vuforia.com/summary", timeout=30)
155
+
156
+ By default, an exception will be raised if any requests to unmocked addresses are made.
157
+
158
+ .. _httpx: https://pypi.org/project/httpx/
159
+
134
160
  Using Docker to mock calls to Vuforia from any language
135
161
  -------------------------------------------------------
136
162
 
@@ -26,11 +26,11 @@ This requires Python |minimum-python-version|\+.
26
26
  import requests
27
27
 
28
28
  from mock_vws import MockVWS
29
- from mock_vws.database import VuforiaDatabase
29
+ from mock_vws.database import CloudDatabase
30
30
 
31
31
  with MockVWS() as mock:
32
- database = VuforiaDatabase()
33
- mock.add_database(database=database)
32
+ database = CloudDatabase()
33
+ mock.add_cloud_database(cloud_database=database)
34
34
  # This will use the Vuforia mock.
35
35
  requests.get(url="https://vws.vuforia.com/summary", timeout=30)
36
36
 
@@ -38,6 +38,30 @@ By default, an exception will be raised if any requests to unmocked addresses ar
38
38
 
39
39
  .. _requests: https://pypi.org/project/requests/
40
40
 
41
+ Mocking calls made to Vuforia with Python ``httpx``
42
+ ----------------------------------------------------
43
+
44
+ Using the mock redirects requests to Vuforia made with `httpx`_ to an in-memory implementation.
45
+
46
+ .. code-block:: python
47
+
48
+ """Make a request to the Vuforia Web Services API mock."""
49
+
50
+ import httpx
51
+
52
+ from mock_vws import MockVWSForHttpx
53
+ from mock_vws.database import CloudDatabase
54
+
55
+ with MockVWSForHttpx() as mock:
56
+ database = CloudDatabase()
57
+ mock.add_cloud_database(cloud_database=database)
58
+ # This will use the Vuforia mock.
59
+ httpx.get(url="https://vws.vuforia.com/summary", timeout=30)
60
+
61
+ By default, an exception will be raised if any requests to unmocked addresses are made.
62
+
63
+ .. _httpx: https://pypi.org/project/httpx/
64
+
41
65
  Using Docker to mock calls to Vuforia from any language
42
66
  -------------------------------------------------------
43
67
 
@@ -83,6 +83,7 @@ def test_ci_patterns_valid(request: pytest.FixtureRequest) -> None:
83
83
 
84
84
 
85
85
  def test_tests_collected_once(
86
+ *,
86
87
  capsys: pytest.CaptureFixture[str],
87
88
  request: pytest.FixtureRequest,
88
89
  ) -> None:
@@ -7,11 +7,11 @@ Using the mock redirects requests to Vuforia made with `requests`_ to an in-memo
7
7
  import requests
8
8
 
9
9
  from mock_vws import MockVWS
10
- from mock_vws.database import VuforiaDatabase
10
+ from mock_vws.database import CloudDatabase
11
11
 
12
12
  with MockVWS() as mock:
13
- database = VuforiaDatabase()
14
- mock.add_database(database=database)
13
+ database = CloudDatabase()
14
+ mock.add_cloud_database(cloud_database=database)
15
15
  # This will use the Vuforia mock.
16
16
  requests.get(url="https://vws.vuforia.com/summary", timeout=30)
17
17
 
@@ -54,7 +54,7 @@ To mimic this functionality, this mock provides a target manager container which
54
54
  To add a database, make a request to the following endpoint against the target manager container:
55
55
 
56
56
  .. autoflask:: mock_vws._flask_server.target_manager:TARGET_MANAGER_FLASK_APP
57
- :endpoints: create_database
57
+ :endpoints: create_cloud_database
58
58
 
59
59
  For example, with the containers set up as in :ref:`creating-containers`, use ``curl``:
60
60
 
@@ -63,7 +63,7 @@ For example, with the containers set up as in :ref:`creating-containers`, use ``
63
63
  $ curl --request POST \
64
64
  --header "Content-Type: application/json" \
65
65
  --data '{}' \
66
- '127.0.0.1:5005/databases'
66
+ '127.0.0.1:5005/cloud_databases'
67
67
  {
68
68
  "client_access_key": "2d61c1d17bb94694bee77c1f1f41e5d9",
69
69
  "client_secret_key": "b73f8170cf7d42728fa8ce66221ad147",
@@ -80,7 +80,7 @@ Deleting a database
80
80
  To delete a database use the following endpoint:
81
81
 
82
82
  .. autoflask:: mock_vws._flask_server.target_manager:TARGET_MANAGER_FLASK_APP
83
- :endpoints: delete_database
83
+ :endpoints: delete_cloud_database
84
84
 
85
85
 
86
86
  .. _Target Manager: https://developer.vuforia.com/target-manager
@@ -0,0 +1,12 @@
1
+ Getting started
2
+ ---------------
3
+
4
+ Mocking calls made to Vuforia with Python ``requests``
5
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6
+
7
+ .. include:: basic-example.rst
8
+
9
+ Mocking calls made to Vuforia with Python ``httpx``
10
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11
+
12
+ .. include:: httpx-example.rst
@@ -0,0 +1,22 @@
1
+ Using the mock redirects requests to Vuforia made with `httpx`_ to an in-memory implementation.
2
+
3
+ .. code-block:: python
4
+
5
+ """Make a request to the Vuforia Web Services API mock."""
6
+
7
+ import httpx
8
+
9
+ from mock_vws import MockVWSForHttpx
10
+ from mock_vws.database import CloudDatabase
11
+
12
+ with MockVWSForHttpx() as mock:
13
+ database = CloudDatabase()
14
+ mock.add_cloud_database(cloud_database=database)
15
+ # This will use the Vuforia mock.
16
+ httpx.get(url="https://vws.vuforia.com/summary", timeout=30)
17
+
18
+ By default, an exception will be raised if any requests to unmocked addresses are made.
19
+
20
+ See :ref:`mock-api-reference` for details of what can be changed and how.
21
+
22
+ .. _httpx: https://pypi.org/project/httpx/
@@ -12,6 +12,11 @@ This requires Python |minimum-python-version|\+.
12
12
 
13
13
  .. include:: basic-example.rst
14
14
 
15
+ Mocking calls made to Vuforia with Python ``httpx``
16
+ ----------------------------------------------------
17
+
18
+ .. include:: httpx-example.rst
19
+
15
20
  Using Docker to mock calls to Vuforia from any language
16
21
  -------------------------------------------------------
17
22
 
@@ -7,24 +7,39 @@ API Reference
7
7
  :members:
8
8
  :undoc-members:
9
9
 
10
+ .. autoclass:: mock_vws.MockVWSForHttpx
11
+ :members:
12
+ :undoc-members:
13
+
10
14
  .. autoclass:: mock_vws.MissingSchemeError
11
15
  :members:
12
16
  :undoc-members:
13
17
 
14
- .. Many parts of the VuforiaDatabase API are used for the Flask target
18
+ .. Many parts of the CloudDatabase API are used for the Flask target
15
19
  .. database app, but Python users are not expected to use them.
16
20
  .. Therefore, they are not documented.
17
21
 
18
- .. autoclass:: mock_vws.database.VuforiaDatabase
22
+ .. autoclass:: mock_vws.database.CloudDatabase
19
23
  :members:
20
24
  :undoc-members:
21
25
  :exclude-members: to_dict, get_target, from_dict, not_deleted_targets, active_targets, inactive_targets, failed_targets, processing_targets
22
26
 
27
+ .. autoclass:: mock_vws.database.VuMarkDatabase
28
+ :members:
29
+ :undoc-members:
30
+ :exclude-members: to_dict, from_dict, not_deleted_targets
31
+
23
32
  .. autoenum:: mock_vws.states.States
24
33
  :members:
25
34
  :undoc-members:
26
35
 
27
- .. autoclass:: mock_vws.target.Target
36
+ .. autoenum:: mock_vws.database_type.DatabaseType
37
+ :members:
38
+ :undoc-members:
39
+
40
+ .. autoclass:: mock_vws.target.ImageTarget
41
+
42
+ .. autoclass:: mock_vws.target.VuMarkTarget
28
43
 
29
44
  Image matchers
30
45
  --------------
@@ -36,12 +36,14 @@ dynamic = [
36
36
  dependencies = [
37
37
  "beartype>=0.22.9",
38
38
  "flask>=3.0.3",
39
+ "httpx>=0.27.0",
39
40
  "numpy>=1.26.4",
40
41
  "pillow>=11.0.0",
41
42
  "piq>=0.8.0",
42
43
  "pydantic-settings>=2.6.1",
43
44
  "requests>=2.32.3",
44
45
  "responses>=0.25.3",
46
+ "respx>=0.21.0",
45
47
  "torch>=2.5.1",
46
48
  "torchmetrics>=1.5.1",
47
49
  "torchvision>=0.20.1",
@@ -103,9 +105,9 @@ optional-dependencies.dev = [
103
105
  "types-requests==2.32.4.20260107",
104
106
  "urllib3==2.6.3",
105
107
  "vulture==2.14",
106
- "vws-python==2026.2.15",
108
+ "vws-python==2026.2.21",
107
109
  "vws-test-fixtures==2023.3.5",
108
- "vws-web-tools==2026.2.17.1",
110
+ "vws-web-tools==2026.2.20",
109
111
  "yamlfix==1.19.1",
110
112
  "zizmor==1.22.0",
111
113
  ]
@@ -329,18 +331,18 @@ keep_full_version = true
329
331
  max_supported_python = "3.13"
330
332
 
331
333
  [tool.pytest]
332
- ini_options.xfail_strict = true
333
- ini_options.log_cli = true
334
- ini_options.addopts = [
334
+ xfail_strict = true
335
+ log_cli = true
336
+ addopts = [
335
337
  "--strict-markers",
336
338
  ]
337
- ini_options.markers = [
339
+ markers = [
338
340
  "requires_docker_build",
339
341
  ]
340
342
  # Options for pytest-retry.
341
- ini_options.retries = 10
342
- ini_options.retry_delay = 10
343
- ini_options.cumulative_timing = false
343
+ retries = "10"
344
+ retry_delay = "10"
345
+ cumulative_timing = false
344
346
 
345
347
  [tool.coverage]
346
348
  run.branch = true
@@ -450,8 +452,9 @@ ignore_names = [
450
452
  # pydantic-settings
451
453
  "model_config",
452
454
  # Used in TYPE_CHECKING for type hints
453
- "DatabaseDict",
455
+ "CloudDatabaseDict",
454
456
  "VuMarkDatabaseDict",
457
+ "VuMarkTargetDict",
455
458
  ]
456
459
  # Duplicate some of .gitignore
457
460
  exclude = [ ".venv" ]
@@ -3,6 +3,7 @@ MPixel
3
3
  MiB
4
4
  MissingSchema
5
5
  Ubuntu
6
+ VuMark
6
7
  admin
7
8
  another's
8
9
  api
@@ -44,6 +45,7 @@ hmac
44
45
  html
45
46
  http
46
47
  https
48
+ httpx
47
49
  iff
48
50
  io
49
51
  issuecomment
@@ -97,6 +99,7 @@ reqjsonarr
97
99
  resheader
98
100
  resjson
99
101
  resjsonarr
102
+ respx
100
103
  rfc
101
104
  rgb
102
105
  str
@@ -4,8 +4,10 @@ from mock_vws._requests_mock_server.decorators import (
4
4
  MissingSchemeError,
5
5
  MockVWS,
6
6
  )
7
+ from mock_vws._respx_mock_server.decorators import MockVWSForHttpx
7
8
 
8
9
  __all__ = [
9
10
  "MissingSchemeError",
10
11
  "MockVWS",
12
+ "MockVWSForHttpx",
11
13
  ]
@@ -63,6 +63,7 @@ class ResultCodes(Enum):
63
63
  INVALID_ACCEPT_HEADER = "InvalidAcceptHeader"
64
64
  INVALID_INSTANCE_ID = "InvalidInstanceId"
65
65
  BAD_REQUEST = "BadRequest"
66
+ INVALID_TARGET_TYPE = "InvalidTargetType"
66
67
 
67
68
 
68
69
  @beartype
@@ -5,7 +5,9 @@ from collections.abc import Iterable, Mapping
5
5
  from beartype import beartype
6
6
  from vws_auth_tools import authorization_header
7
7
 
8
- from mock_vws.database import VuforiaDatabase
8
+ from mock_vws.database import CloudDatabase, VuMarkDatabase
9
+
10
+ AnyDatabase = CloudDatabase | VuMarkDatabase
9
11
 
10
12
 
11
13
  @beartype
@@ -15,8 +17,8 @@ def get_database_matching_client_keys(
15
17
  request_body: bytes | None,
16
18
  request_method: str,
17
19
  request_path: str,
18
- databases: Iterable[VuforiaDatabase],
19
- ) -> VuforiaDatabase:
20
+ databases: Iterable[CloudDatabase],
21
+ ) -> CloudDatabase:
20
22
  """Return the first of the given databases which is being accessed by
21
23
  the
22
24
  given client request.
@@ -58,14 +60,14 @@ def get_database_matching_client_keys(
58
60
 
59
61
 
60
62
  @beartype
61
- def get_database_matching_server_keys(
63
+ def get_database_matching_server_keys[DatabaseT: AnyDatabase](
62
64
  *,
63
65
  request_headers: Mapping[str, str],
64
66
  request_body: bytes | None,
65
67
  request_method: str,
66
68
  request_path: str,
67
- databases: Iterable[VuforiaDatabase],
68
- ) -> VuforiaDatabase:
69
+ databases: Iterable[DatabaseT],
70
+ ) -> DatabaseT:
69
71
  """Return the first of the given databases which is being accessed by
70
72
  the
71
73
  given server request.