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.
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/CHANGELOG.rst +12 -0
- {vws_python_mock-2026.2.18.2/src/vws_python_mock.egg-info → vws_python_mock-2026.2.22}/PKG-INFO +32 -6
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/README.rst +27 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/ci/test_custom_linters.py +1 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/basic-example.rst +3 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/docker.rst +3 -3
- vws_python_mock-2026.2.22/docs/source/getting-started.rst +12 -0
- vws_python_mock-2026.2.22/docs/source/httpx-example.rst +22 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/index.rst +5 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/mock-api-reference.rst +18 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/pyproject.toml +13 -10
- vws_python_mock-2026.2.22/secrets.tar.gpg +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/spelling_private_dict.txt +3 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/__init__.py +2 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_constants.py +1 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_database_matchers.py +8 -6
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/target_manager.py +171 -54
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/vwq.py +7 -5
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/vws.py +88 -29
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_mock_common.py +20 -1
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_tools.py +2 -2
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/__init__.py +2 -2
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/auth_validators.py +3 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/content_type_validators.py +1 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/date_validators.py +1 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/image_validators.py +1 -0
- {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
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/project_state_validators.py +3 -2
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_requests_mock_server/decorators.py +43 -10
- {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
- {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
- vws_python_mock-2026.2.22/src/mock_vws/_respx_mock_server/__init__.py +1 -0
- vws_python_mock-2026.2.22/src/mock_vws/_respx_mock_server/decorators.py +275 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/__init__.py +6 -2
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/auth_validators.py +6 -4
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/exceptions.py +40 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/key_validators.py +1 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/name_validators.py +6 -4
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/project_state_validators.py +9 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/target_validators.py +5 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/database.py +111 -19
- vws_python_mock-2026.2.22/src/mock_vws/database_type.py +13 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/target.py +83 -7
- vws_python_mock-2026.2.22/src/mock_vws/target_manager.py +158 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22/src/vws_python_mock.egg-info}/PKG-INFO +32 -6
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/SOURCES.txt +5 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/requires.txt +4 -2
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/conftest.py +9 -6
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/credentials.py +14 -14
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/prepared_requests.py +15 -13
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/vuforia_backends.py +55 -53
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_add_target.py +26 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_authorization_header.py +7 -5
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_database_summary.py +13 -5
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_delete_target.py +2 -2
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_docker.py +4 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_flask_app_usage.py +228 -48
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_get_duplicates.py +5 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_get_target.py +4 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_invalid_given_id.py +4 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_query.py +63 -24
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_requests_mock_usage.py +118 -38
- vws_python_mock-2026.2.22/tests/mock_vws/test_respx_mock_usage.py +350 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_list.py +2 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_summary.py +5 -3
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_validators.py +8 -8
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_update_target.py +26 -5
- vws_python_mock-2026.2.22/tests/mock_vws/test_vumark_generation_api.py +360 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/__init__.py +5 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/assertions.py +1 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/usage_test_helpers.py +4 -2
- vws_python_mock-2026.2.18.2/docs/source/getting-started.rst +0 -4
- vws_python_mock-2026.2.18.2/secrets.tar.gpg +0 -0
- vws_python_mock-2026.2.18.2/src/mock_vws/target_manager.py +0 -87
- vws_python_mock-2026.2.18.2/tests/mock_vws/test_vumark_generation_api.py +0 -137
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.git_archival.txt +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.gitattributes +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/dependabot.yml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/dependabot-merge.yml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/docker-build.yml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/lint.yml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/publish-site.yml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/release.yml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.github/workflows/test.yml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.gitignore +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.pre-commit-config.yaml +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.prettierrc +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.vscode/extensions.json +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/.vscode/settings.json +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/CODE_OF_CONDUCT.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/LICENSE +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/MANIFEST.in +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/admin/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/admin/create_secrets_files.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/admin/vumark_template.svg +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/ci/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/ci/decrypt_secret.sh +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/conftest.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docker-bake.hcl +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/changelog.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/ci-setup.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/conf.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/contributing.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/differences-to-vws.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/installation.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/release-process.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/versioning-and-api-stability.rst +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/setup.cfg +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_base64_decoding.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/Dockerfile +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_flask_server/healthcheck.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/accept_header_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/content_length_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/exceptions.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/fields_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_query_validators/num_results_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_requests_mock_server/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/active_flag_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/content_length_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/content_type_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/date_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/image_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/json_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/metadata_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_services_validators/width_validators.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/image_matchers.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/py.typed +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/states.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/target_raters.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/dependency_links.txt +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/not-zip-safe +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/vws_python_mock.egg-info/top_level.txt +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/fixtures/__init__.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_content_length.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_date_header.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_invalid_json.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_target_raters.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/test_unexpected_json.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/retries.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/tests/mock_vws/utils/too_many_requests.py +0 -0
- {vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/vuforia_secrets.env.example +0 -0
- {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
|
|
{vws_python_mock-2026.2.18.2/src/vws_python_mock.egg-info → vws_python_mock-2026.2.22}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vws-python-mock
|
|
3
|
-
Version: 2026.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.
|
|
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.
|
|
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
|
|
124
|
+
from mock_vws.database import CloudDatabase
|
|
123
125
|
|
|
124
126
|
with MockVWS() as mock:
|
|
125
|
-
database =
|
|
126
|
-
mock.
|
|
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
|
|
29
|
+
from mock_vws.database import CloudDatabase
|
|
30
30
|
|
|
31
31
|
with MockVWS() as mock:
|
|
32
|
-
database =
|
|
33
|
-
mock.
|
|
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
|
|
|
@@ -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
|
|
10
|
+
from mock_vws.database import CloudDatabase
|
|
11
11
|
|
|
12
12
|
with MockVWS() as mock:
|
|
13
|
-
database =
|
|
14
|
-
mock.
|
|
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:
|
|
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/
|
|
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:
|
|
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
|
|
{vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/docs/source/mock-api-reference.rst
RENAMED
|
@@ -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
|
|
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.
|
|
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
|
-
..
|
|
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.
|
|
108
|
+
"vws-python==2026.2.21",
|
|
107
109
|
"vws-test-fixtures==2023.3.5",
|
|
108
|
-
"vws-web-tools==2026.2.
|
|
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
|
-
|
|
333
|
-
|
|
334
|
-
|
|
334
|
+
xfail_strict = true
|
|
335
|
+
log_cli = true
|
|
336
|
+
addopts = [
|
|
335
337
|
"--strict-markers",
|
|
336
338
|
]
|
|
337
|
-
|
|
339
|
+
markers = [
|
|
338
340
|
"requires_docker_build",
|
|
339
341
|
]
|
|
340
342
|
# Options for pytest-retry.
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
"
|
|
455
|
+
"CloudDatabaseDict",
|
|
454
456
|
"VuMarkDatabaseDict",
|
|
457
|
+
"VuMarkTargetDict",
|
|
455
458
|
]
|
|
456
459
|
# Duplicate some of .gitignore
|
|
457
460
|
exclude = [ ".venv" ]
|
|
Binary file
|
|
@@ -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
|
{vws_python_mock-2026.2.18.2 → vws_python_mock-2026.2.22}/src/mock_vws/_database_matchers.py
RENAMED
|
@@ -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
|
|
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[
|
|
19
|
-
) ->
|
|
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[
|
|
68
|
-
) ->
|
|
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.
|