vws-python-mock 2026.8.4.2__tar.gz → 2026.8.26__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.8.26/.dockerignore +52 -0
- vws_python_mock-2026.8.26/.github/dependabot.yml +20 -0
- vws_python_mock-2026.8.26/.github/workflows/autofix.yml +39 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.github/workflows/lint.yml +8 -12
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.github/workflows/release.yml +2 -2
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.github/workflows/test.yml +20 -13
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.gitignore +3 -2
- vws_python_mock-2026.8.26/.vale.ini +23 -0
- vws_python_mock-2026.8.26/CHANGELOG.rst +223 -0
- {vws_python_mock-2026.8.4.2/src/vws_python_mock.egg-info → vws_python_mock-2026.8.26}/PKG-INFO +23 -20
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/admin/create_secrets_files.py +18 -1
- vws_python_mock-2026.8.26/docs/source/basic-example.rst +49 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/ci-setup.rst +8 -5
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/contributing.rst +10 -12
- vws_python_mock-2026.8.26/docs/source/differences-to-vws.rst +399 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/docker.rst +43 -9
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/mock-api-reference.rst +24 -0
- vws_python_mock-2026.8.26/prek.toml +554 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/pyproject.toml +34 -30
- vws_python_mock-2026.8.26/secrets.tar.gpg +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/spelling_private_dict.txt +7 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/__init__.py +7 -1
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_constants.py +4 -1
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_flask_server/Dockerfile +14 -5
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_flask_server/healthcheck.py +6 -3
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_flask_server/target_manager.py +251 -99
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_flask_server/vws.py +360 -27
- vws_python_mock-2026.8.26/src/mock_vws/_image_opening.py +47 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_mock_common.py +59 -0
- vws_python_mock-2026.8.26/src/mock_vws/_model_target_web_api.py +1599 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_tools.py +2 -2
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/accept_header_validators.py +1 -1
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/auth_validators.py +1 -0
- vws_python_mock-2026.8.26/src/mock_vws/_query_validators/exceptions.py +507 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/image_validators.py +4 -4
- vws_python_mock-2026.8.26/src/mock_vws/_reco_counts_web_api.py +185 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_requests_mock_server/mock_web_services_api.py +181 -21
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/__init__.py +16 -0
- vws_python_mock-2026.8.26/src/mock_vws/_services_validators/database_id_validators.py +76 -0
- vws_python_mock-2026.8.26/src/mock_vws/_services_validators/exceptions.py +498 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/image_validators.py +44 -5
- vws_python_mock-2026.8.26/src/mock_vws/_services_validators/instance_id_validators.py +71 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/json_validators.py +7 -1
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/key_validators.py +7 -4
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/project_state_validators.py +2 -2
- vws_python_mock-2026.8.26/src/mock_vws/_services_validators/request_rate_validators.py +155 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/target_validators.py +8 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/database.py +50 -3
- vws_python_mock-2026.8.26/src/mock_vws/decorators.py +507 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/image_matchers.py +4 -3
- vws_python_mock-2026.8.26/src/mock_vws/model_target.py +214 -0
- vws_python_mock-2026.8.26/src/mock_vws/reco_counts.py +53 -0
- vws_python_mock-2026.8.26/src/mock_vws/request_rate_limits.py +179 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/target.py +18 -8
- vws_python_mock-2026.8.26/src/mock_vws/target_manager.py +262 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/target_raters.py +9 -3
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26/src/vws_python_mock.egg-info}/PKG-INFO +23 -20
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/vws_python_mock.egg-info/SOURCES.txt +19 -3
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/vws_python_mock.egg-info/requires.txt +22 -19
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/vws_python_mock.egg-info/scm_file_list.json +139 -123
- vws_python_mock-2026.8.26/src/vws_python_mock.egg-info/scm_version.json +8 -0
- vws_python_mock-2026.8.26/tests/backend_harness.py +159 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/conftest.py +118 -10
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/fixtures/credentials.py +18 -1
- vws_python_mock-2026.8.26/tests/mock_vws/fixtures/model_target_prepared_requests.py +202 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/fixtures/prepared_requests.py +0 -27
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/fixtures/vuforia_backends.py +95 -116
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_add_target.py +142 -49
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_database_summary.py +13 -14
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_delete_target.py +6 -3
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_docker.py +123 -5
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_flask_app_usage.py +438 -2
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_get_duplicates.py +37 -0
- vws_python_mock-2026.8.26/tests/mock_vws/test_healthcheck.py +84 -0
- vws_python_mock-2026.8.26/tests/mock_vws/test_invalid_given_id.py +220 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_invalid_json.py +6 -3
- vws_python_mock-2026.8.26/tests/mock_vws/test_model_target_generation_failure.py +130 -0
- vws_python_mock-2026.8.26/tests/mock_vws/test_model_target_generation_warning.py +161 -0
- vws_python_mock-2026.8.26/tests/mock_vws/test_model_target_training_allowance.py +96 -0
- vws_python_mock-2026.8.26/tests/mock_vws/test_model_target_web_api.py +2699 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_query.py +143 -23
- vws_python_mock-2026.8.26/tests/mock_vws/test_reco_counts_report.py +228 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_requests_mock_usage.py +851 -32
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_respx_mock_usage.py +5 -1
- vws_python_mock-2026.8.26/tests/mock_vws/test_target_list.py +72 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_update_target.py +37 -76
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_vumark_generation_api.py +40 -1
- vws_python_mock-2026.8.26/tests/mock_vws/utils/__init__.py +221 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/utils/assertions.py +84 -0
- vws_python_mock-2026.8.26/uv.lock +3013 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/vuforia_secrets.env.example +3 -0
- vws_python_mock-2026.8.4.2/.github/dependabot.yml +0 -13
- vws_python_mock-2026.8.4.2/.pre-commit-config.yaml +0 -471
- vws_python_mock-2026.8.4.2/CHANGELOG.rst +0 -138
- vws_python_mock-2026.8.4.2/ci/test_custom_linters.py +0 -133
- vws_python_mock-2026.8.4.2/docs/source/basic-example.rst +0 -23
- vws_python_mock-2026.8.4.2/docs/source/differences-to-vws.rst +0 -181
- vws_python_mock-2026.8.4.2/secrets.tar.gpg +0 -0
- vws_python_mock-2026.8.4.2/src/mock_vws/_model_target_web_api.py +0 -519
- vws_python_mock-2026.8.4.2/src/mock_vws/_query_validators/exceptions.py +0 -769
- vws_python_mock-2026.8.4.2/src/mock_vws/_requests_mock_server/decorators.py +0 -289
- vws_python_mock-2026.8.4.2/src/mock_vws/_services_validators/exceptions.py +0 -889
- vws_python_mock-2026.8.4.2/src/mock_vws/_services_validators/request_rate_validators.py +0 -83
- vws_python_mock-2026.8.4.2/src/mock_vws/model_target.py +0 -80
- vws_python_mock-2026.8.4.2/src/mock_vws/target_manager.py +0 -188
- vws_python_mock-2026.8.4.2/src/vws_python_mock.egg-info/scm_version.json +0 -8
- vws_python_mock-2026.8.4.2/tests/mock_vws/test_invalid_given_id.py +0 -55
- vws_python_mock-2026.8.4.2/tests/mock_vws/test_model_target_web_api.py +0 -708
- vws_python_mock-2026.8.4.2/tests/mock_vws/test_target_list.py +0 -40
- vws_python_mock-2026.8.4.2/tests/mock_vws/utils/__init__.py +0 -122
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.git_archival.txt +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.gitattributes +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.github/workflows/dependabot-merge.yml +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.github/workflows/docker-build.yml +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.github/workflows/publish-site.yml +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.prettierrc +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.vscode/extensions.json +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/.vscode/settings.json +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/CODE_OF_CONDUCT.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/LICENSE +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/MANIFEST.in +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/README.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/admin/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/admin/vumark_template.svg +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/ci/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/ci/decrypt_secret.sh +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/conftest.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docker-bake.hcl +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/changelog.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/conf.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/getting-started.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/httpx-example.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/index.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/installation.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/release-process.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/unreleased.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/source/versioning-and-api-stability.rst +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/docs/towncrier_template.rst.jinja +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/newsfragments/.gitkeep +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/setup.cfg +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_base64_decoding.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_database_matchers.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_flask_server/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_flask_server/vwq.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/content_length_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/content_type_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/date_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/fields_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/include_target_data_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/num_results_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_query_validators/project_state_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_requests_mock_server/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_requests_mock_server/mock_web_query_api.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_respx_mock_server/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_respx_mock_server/decorators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/active_flag_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/auth_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/content_length_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/content_type_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/date_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/metadata_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/name_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/request_quota_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/target_quota_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/_services_validators/width_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/cloud_query.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/database_type.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/py.typed +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/states.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/mock_vws/vumark.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/vws_python_mock.egg-info/dependency_links.txt +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/vws_python_mock.egg-info/not-zip-safe +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/src/vws_python_mock.egg-info/top_level.txt +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/fixtures/__init__.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_authorization_header.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_cloud_query_failure_response.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_content_length.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_date_header.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_get_target.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_target_raters.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_target_summary.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_target_validators.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_unexpected_json.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/test_vumark_generation_failure.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/utils/retries.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/utils/too_many_requests.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/tests/mock_vws/utils/usage_test_helpers.py +0 -0
- {vws_python_mock-2026.8.4.2 → vws_python_mock-2026.8.26}/zizmor.yml +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Keep the Docker build context to what the image needs: the package
|
|
2
|
+
# source, ``pyproject.toml``, ``uv.lock`` and the ``README.rst`` that
|
|
3
|
+
# ``pyproject.toml`` references. This list follows the
|
|
4
|
+
# ``[tool.check-manifest]`` ignore list in ``pyproject.toml``, plus
|
|
5
|
+
# VCS data, local virtual environments and secrets.
|
|
6
|
+
*.enc
|
|
7
|
+
.checkmake-config.ini
|
|
8
|
+
.dockerignore
|
|
9
|
+
.git
|
|
10
|
+
.git_archival.txt
|
|
11
|
+
.gitattributes
|
|
12
|
+
.github
|
|
13
|
+
.gitignore
|
|
14
|
+
prek.toml
|
|
15
|
+
.vscode
|
|
16
|
+
.prettierrc
|
|
17
|
+
.vale.ini
|
|
18
|
+
.yamlfmt
|
|
19
|
+
admin
|
|
20
|
+
CHANGELOG.rst
|
|
21
|
+
ci
|
|
22
|
+
CODE_OF_CONDUCT.rst
|
|
23
|
+
CONTRIBUTING.rst
|
|
24
|
+
docker-bake.hcl
|
|
25
|
+
docs
|
|
26
|
+
LICENSE
|
|
27
|
+
lint.mk
|
|
28
|
+
Makefile
|
|
29
|
+
MANIFEST.in
|
|
30
|
+
newsfragments
|
|
31
|
+
secrets.tar.gpg
|
|
32
|
+
spelling_private_dict.txt
|
|
33
|
+
tests
|
|
34
|
+
vuforia_secrets.env.example
|
|
35
|
+
zizmor.yml
|
|
36
|
+
|
|
37
|
+
# Local development leftovers.
|
|
38
|
+
**/__pycache__
|
|
39
|
+
**/.DS_Store
|
|
40
|
+
*.egg-info
|
|
41
|
+
.claude
|
|
42
|
+
.context
|
|
43
|
+
.coverage*
|
|
44
|
+
.mypy_cache
|
|
45
|
+
.pytest_cache
|
|
46
|
+
.venv
|
|
47
|
+
ci_secrets
|
|
48
|
+
conftest.py
|
|
49
|
+
docker_venvs
|
|
50
|
+
secrets.tar
|
|
51
|
+
styles
|
|
52
|
+
vuforia_secrets.env
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 2
|
|
3
|
+
|
|
4
|
+
updates:
|
|
5
|
+
# The ``uv`` ecosystem updates ``pyproject.toml`` and ``uv.lock``
|
|
6
|
+
# together, keeping the lockfile in sync so that
|
|
7
|
+
# ``uv sync --locked`` in the Dockerfile keeps working.
|
|
8
|
+
- package-ecosystem: uv
|
|
9
|
+
directory: /
|
|
10
|
+
schedule:
|
|
11
|
+
interval: daily
|
|
12
|
+
open-pull-requests-limit: 10
|
|
13
|
+
- package-ecosystem: github-actions
|
|
14
|
+
directory: /
|
|
15
|
+
schedule:
|
|
16
|
+
interval: daily
|
|
17
|
+
- package-ecosystem: pre-commit
|
|
18
|
+
directory: /
|
|
19
|
+
schedule:
|
|
20
|
+
interval: daily
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: autofix.ci
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
autofix:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v7
|
|
19
|
+
with:
|
|
20
|
+
persist-credentials: false
|
|
21
|
+
|
|
22
|
+
- name: Install uv
|
|
23
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
24
|
+
|
|
25
|
+
- name: Run fixers
|
|
26
|
+
uses: j178/prek-action@v3.0.0
|
|
27
|
+
with:
|
|
28
|
+
prek-version: 0.4.11
|
|
29
|
+
extra-args: >-
|
|
30
|
+
--all-files
|
|
31
|
+
--hook-stage pre-commit
|
|
32
|
+
--no-fail-fast
|
|
33
|
+
--verbose
|
|
34
|
+
env:
|
|
35
|
+
UV_NO_CACHE: '1'
|
|
36
|
+
UV_PYTHON: '3.14'
|
|
37
|
+
|
|
38
|
+
- uses: autofix-ci/action@v1.3.4
|
|
39
|
+
if: always()
|
|
@@ -30,26 +30,22 @@ jobs:
|
|
|
30
30
|
persist-credentials: false
|
|
31
31
|
|
|
32
32
|
- name: Install uv
|
|
33
|
-
uses: astral-sh/setup-uv@
|
|
34
|
-
with:
|
|
35
|
-
enable-cache: true
|
|
36
|
-
cache-dependency-glob: '**/pyproject.toml'
|
|
33
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
37
34
|
|
|
38
35
|
- name: Lint
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
uses: j178/prek-action@v3.0.0
|
|
37
|
+
with:
|
|
38
|
+
prek-version: 0.4.11
|
|
39
|
+
extra-args: >-
|
|
40
|
+
--all-files
|
|
41
|
+
--hook-stage ${{ matrix.hook-stage }}
|
|
42
|
+
--verbose
|
|
44
43
|
env:
|
|
45
44
|
# Avoid intermittent uv distribution cache rename failures while
|
|
46
45
|
# prek installs hook environments on Windows.
|
|
47
46
|
UV_NO_CACHE: '1'
|
|
48
47
|
UV_PYTHON: ${{ matrix.python-version }}
|
|
49
48
|
|
|
50
|
-
- uses: pre-commit-ci/lite-action@v1.1.0
|
|
51
|
-
if: always()
|
|
52
|
-
|
|
53
49
|
completion-lint:
|
|
54
50
|
needs: build
|
|
55
51
|
runs-on: ubuntu-latest
|
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
token: ${{ secrets.RELEASE_PAT }}
|
|
36
36
|
|
|
37
37
|
- name: Install uv
|
|
38
|
-
uses: astral-sh/setup-uv@
|
|
38
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
39
39
|
with:
|
|
40
40
|
enable-cache: true
|
|
41
41
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -114,7 +114,7 @@ jobs:
|
|
|
114
114
|
persist-credentials: false
|
|
115
115
|
|
|
116
116
|
- name: Install uv
|
|
117
|
-
uses: astral-sh/setup-uv@
|
|
117
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
118
118
|
with:
|
|
119
119
|
enable-cache: true
|
|
120
120
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -32,6 +32,7 @@ jobs:
|
|
|
32
32
|
- tests/mock_vws/test_query.py::TestSuccess
|
|
33
33
|
- tests/mock_vws/test_query.py::TestIncorrectFields
|
|
34
34
|
- tests/mock_vws/test_query.py::TestMaxNumResults
|
|
35
|
+
- tests/mock_vws/test_query.py::TestResultOrder
|
|
35
36
|
- tests/mock_vws/test_query.py::TestIncludeTargetData
|
|
36
37
|
- tests/mock_vws/test_query.py::TestAcceptHeader
|
|
37
38
|
- tests/mock_vws/test_query.py::TestActiveFlag
|
|
@@ -87,6 +88,7 @@ jobs:
|
|
|
87
88
|
- tests/mock_vws/test_invalid_json.py::TestInvalidJSON::test_invalid_json
|
|
88
89
|
- tests/mock_vws/test_invalid_json.py::TestInvalidJSON::test_invalid_json_with_skewed_time
|
|
89
90
|
- tests/mock_vws/test_target_list.py
|
|
91
|
+
- tests/mock_vws/test_reco_counts_report.py
|
|
90
92
|
- tests/mock_vws/test_target_raters.py
|
|
91
93
|
- tests/mock_vws/test_target_summary.py
|
|
92
94
|
- tests/mock_vws/test_unexpected_json.py
|
|
@@ -116,12 +118,15 @@ jobs:
|
|
|
116
118
|
- tests/mock_vws/test_requests_mock_usage.py
|
|
117
119
|
- tests/mock_vws/test_respx_mock_usage.py
|
|
118
120
|
- tests/mock_vws/test_flask_app_usage.py
|
|
121
|
+
- tests/mock_vws/test_model_target_generation_failure.py
|
|
122
|
+
- tests/mock_vws/test_model_target_generation_warning.py
|
|
123
|
+
- tests/mock_vws/test_model_target_training_allowance.py
|
|
119
124
|
- tests/mock_vws/test_model_target_web_api.py
|
|
120
125
|
- tests/mock_vws/test_vumark_generation_api.py
|
|
121
126
|
- tests/mock_vws/test_vumark_generation_failure.py
|
|
122
127
|
- tests/mock_vws/test_target_validators.py
|
|
128
|
+
- tests/mock_vws/test_healthcheck.py
|
|
123
129
|
- tests/mock_vws/test_docker.py
|
|
124
|
-
- ci/test_custom_linters.py
|
|
125
130
|
- README.rst
|
|
126
131
|
- docs/
|
|
127
132
|
|
|
@@ -131,7 +136,7 @@ jobs:
|
|
|
131
136
|
persist-credentials: false
|
|
132
137
|
|
|
133
138
|
- name: Install uv
|
|
134
|
-
uses: astral-sh/setup-uv@
|
|
139
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
135
140
|
with:
|
|
136
141
|
enable-cache: true
|
|
137
142
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -146,7 +151,10 @@ jobs:
|
|
|
146
151
|
# See the "CI Setup" document for details of how this was set up.
|
|
147
152
|
ci/decrypt_secret.sh
|
|
148
153
|
tar xvf "${HOME}"/secrets/secrets.tar
|
|
149
|
-
|
|
154
|
+
# Matrix jobs are 0-based; only secrets 0-99 exist. Wrap for overflow
|
|
155
|
+
# (e.g. docs/ at index 100 after the suite grew past 100 patterns).
|
|
156
|
+
SECRET_INDEX=$((JOB_INDEX % 100))
|
|
157
|
+
cp "./ci_secrets/vuforia_secrets_${SECRET_INDEX}.env" ./vuforia_secrets.env
|
|
150
158
|
|
|
151
159
|
# We have seen issues with running out of disk space on test_docker
|
|
152
160
|
- name: Free Disk Space (Ubuntu)
|
|
@@ -203,7 +211,7 @@ jobs:
|
|
|
203
211
|
persist-credentials: false
|
|
204
212
|
|
|
205
213
|
- name: Install uv
|
|
206
|
-
uses: astral-sh/setup-uv@
|
|
214
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
207
215
|
with:
|
|
208
216
|
enable-cache: true
|
|
209
217
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -248,7 +256,7 @@ jobs:
|
|
|
248
256
|
persist-credentials: false
|
|
249
257
|
|
|
250
258
|
- name: Install uv
|
|
251
|
-
uses: astral-sh/setup-uv@
|
|
259
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
252
260
|
with:
|
|
253
261
|
enable-cache: true
|
|
254
262
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -310,7 +318,7 @@ jobs:
|
|
|
310
318
|
persist-credentials: false
|
|
311
319
|
|
|
312
320
|
- name: Install uv
|
|
313
|
-
uses: astral-sh/setup-uv@
|
|
321
|
+
uses: astral-sh/setup-uv@v10.0.1
|
|
314
322
|
with:
|
|
315
323
|
enable-cache: true
|
|
316
324
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -324,16 +332,15 @@ jobs:
|
|
|
324
332
|
- name: Require 100% Coverage
|
|
325
333
|
id: coverage
|
|
326
334
|
run: |
|
|
327
|
-
uv
|
|
335
|
+
uv run --extra=dev coverage combine
|
|
336
|
+
uv run --extra=dev coverage html --skip-covered --skip-empty
|
|
328
337
|
|
|
329
|
-
|
|
330
|
-
coverage
|
|
331
|
-
|
|
332
|
-
# Report and write to summary.
|
|
333
|
-
coverage report --format=markdown >> "$GITHUB_STEP_SUMMARY"
|
|
338
|
+
# Report and write to summary, without failing yet.
|
|
339
|
+
uv run --extra=dev coverage report --format=markdown \
|
|
340
|
+
>> "$GITHUB_STEP_SUMMARY" || true
|
|
334
341
|
|
|
335
342
|
# Report again and fail if under 100%.
|
|
336
|
-
coverage report
|
|
343
|
+
uv run --extra=dev coverage report
|
|
337
344
|
|
|
338
345
|
- name: Upload HTML report if check failed
|
|
339
346
|
uses: actions/upload-artifact@v7
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
StylesPath = styles
|
|
2
|
+
MinAlertLevel = error
|
|
3
|
+
|
|
4
|
+
Packages = https://github.com/tbhb/vale-ai-tells/releases/download/v1.29.0/ai-tells.zip
|
|
5
|
+
|
|
6
|
+
[*.{rst,md}]
|
|
7
|
+
BasedOnStyles = ai-tells
|
|
8
|
+
|
|
9
|
+
# These rules misclassify established technical, example, or release-note prose
|
|
10
|
+
# in this repository. All other ai-tells rules remain enforced.
|
|
11
|
+
ai-tells.CataphoricForecasting = NO
|
|
12
|
+
ai-tells.ContrastiveFormulas = NO
|
|
13
|
+
ai-tells.ContrastiveNegation = NO
|
|
14
|
+
ai-tells.EmptyPadding = NO
|
|
15
|
+
ai-tells.EmptyPaddingStacked = NO
|
|
16
|
+
ai-tells.FigurativeLands = NO
|
|
17
|
+
ai-tells.FillerPhrases = NO
|
|
18
|
+
ai-tells.FormalRegister = NO
|
|
19
|
+
ai-tells.FormalTransitions = NO
|
|
20
|
+
ai-tells.Metacommentary = NO
|
|
21
|
+
ai-tells.OverusedVocabularyVerbs = NO
|
|
22
|
+
ai-tells.StackedAnaphora = NO
|
|
23
|
+
ai-tells.VerbTricolon = NO
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
Changelog
|
|
2
|
+
=========
|
|
3
|
+
|
|
4
|
+
.. towncrier release notes start
|
|
5
|
+
|
|
6
|
+
2026.08.26
|
|
7
|
+
----------
|
|
8
|
+
|
|
9
|
+
- Guard the state which the Docker containers share between requests with a lock.
|
|
10
|
+
The containers serve requests on threads, so concurrent requests, such as those made by a test suite which runs in parallel, could previously race with each other: listing databases while a target was added could return a 500 response, and a target which was being updated or deleted could briefly be missing from a database.
|
|
11
|
+
|
|
12
|
+
- Give each call of a function decorated with a ``MockVWS`` instance its own databases and targets.
|
|
13
|
+
Previously, every use of an instance shared one set of databases and targets, so decorating two test functions with one instance made them affect each other.
|
|
14
|
+
A database can still be inspected during a call, and its targets are what they were before the call again once it returns.
|
|
15
|
+
Using an instance as a context manager is unchanged: a ``with`` block still shares its state with every other use of the same instance.
|
|
16
|
+
|
|
17
|
+
- - Add configurable Model Target ``TRAINING_ALLOWANCE_EXCEEDED`` responses to the in-process and Flask/Docker mocks.
|
|
18
|
+
|
|
19
|
+
2026.08.14
|
|
20
|
+
----------
|
|
21
|
+
|
|
22
|
+
- Give ``CloudDatabase`` a ``database_id``, and reject a reco counts report request whose path names a database which the request's server keys do not belong to, as real Vuforia does.
|
|
23
|
+
|
|
24
|
+
- 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``.
|
|
25
|
+
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.
|
|
26
|
+
|
|
27
|
+
- Return targets in a deterministic order from the Query API, ``GET /targets``
|
|
28
|
+
and ``GET /duplicates/{target_id}``. Targets are ordered by upload date and
|
|
29
|
+
then by target ID, so repeated runs agree with each other. This order is not
|
|
30
|
+
Vuforia's match score order.
|
|
31
|
+
|
|
32
|
+
- Document the Docker containers' configuration with the environment variable names and values which the applications actually read, starting with ``TARGET_MANAGER_BASE_URL``.
|
|
33
|
+
|
|
34
|
+
- 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.
|
|
35
|
+
|
|
36
|
+
- 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.
|
|
37
|
+
|
|
38
|
+
- Report the Docker containers as unhealthy without a traceback in the health check probe output while nothing is yet listening on the port.
|
|
39
|
+
|
|
40
|
+
- Support ``cadDataBlob`` and ``cadDataFormat`` in Model Target dataset creation requests, and require exactly one of ``cadDataUrl`` and ``cadDataBlob`` for each model.
|
|
41
|
+
|
|
42
|
+
- Reject Model Target Web API and OAuth2 token requests with a ``Content-Length`` header which is not an integer, matching the load balancer in front of real Vuforia.
|
|
43
|
+
|
|
44
|
+
- Reject Model Target dataset creation requests with wrongly typed ``name``, ``targetSdk`` or ``models`` entry values.
|
|
45
|
+
|
|
46
|
+
- Treat standard and advanced Model Target datasets as separate resources: status, download and delete requests made through the other dataset type's routes now return the unknown-dataset error rather than acting on the dataset.
|
|
47
|
+
|
|
48
|
+
- Reject Model Target dataset creation requests with values outside the documented enumerations for the ``automaticColoring``, ``motionHint``, ``optimizeTrackingFor``, ``realisticAppearance``, ``simplify`` and ``trackingMode`` model fields.
|
|
49
|
+
|
|
50
|
+
- Report the ``failed`` training status when downloading a Model Target dataset whose generation failed, rather than the ``not-started`` status which a still-processing dataset reports.
|
|
51
|
+
|
|
52
|
+
- Add configurable failed Model Target dataset status responses.
|
|
53
|
+
|
|
54
|
+
- Add configurable Model Target dataset generation warning responses.
|
|
55
|
+
|
|
56
|
+
- Reject Model Target dataset creation requests with ``guideViewPosition`` objects which are missing ``rotation`` or ``translation``, or which have ``rotation`` or ``translation`` values that are not JSON arrays.
|
|
57
|
+
|
|
58
|
+
- Reject Model Target dataset creation requests with ``guideViewPosition`` ``rotation`` or ``translation`` arrays which contain values that are not JSON numbers.
|
|
59
|
+
|
|
60
|
+
- Reject Model Target bearer tokens whose JWT payload is not a JSON object.
|
|
61
|
+
|
|
62
|
+
- Reject Model Target bearer tokens with empty or malformed JWT signatures.
|
|
63
|
+
|
|
64
|
+
- Reject Model Target dataset creation requests with models which are missing ``name``, or which have wrongly typed ``cadDataUrl``, ``name`` or ``views`` values.
|
|
65
|
+
|
|
66
|
+
- Reject Model Target dataset creation requests with a body which is valid JSON but not a JSON object, rather than raising an error in the mock.
|
|
67
|
+
|
|
68
|
+
- Accept State-Based Model Target configuration and validate per-view state selections against its declared states.
|
|
69
|
+
|
|
70
|
+
- 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.
|
|
71
|
+
|
|
72
|
+
- Model VWS request rate limits per endpoint with the new
|
|
73
|
+
``CloudDatabase.request_rate_limits`` setting, including the limits which
|
|
74
|
+
Vuforia documents as ``mock_vws.request_rate_limits.DOCUMENTED_REQUEST_RATE_LIMITS``.
|
|
75
|
+
No request rate limit is applied by default.
|
|
76
|
+
|
|
77
|
+
- Change the ``ProjectHasNoAPIAccess`` result code to ``ProjectHasNoApiAccess``, matching Vuforia's result codes table.
|
|
78
|
+
|
|
79
|
+
- Add the reco counts report endpoint, and a download URL for the generated CSV report.
|
|
80
|
+
|
|
81
|
+
- Preserve the recognition count fields, the reco rating and the reco threshold when dumping a ``CloudDatabase`` or an ``ImageTarget`` to a dictionary and loading it back.
|
|
82
|
+
|
|
83
|
+
- Rate an image of a single color as ``0`` rather than raising an uncaught ``ZeroDivisionError``.
|
|
84
|
+
|
|
85
|
+
- Return a 404 response from the Flask and Docker mock for a request to a path which it does not serve, and for a request to a served path with a method which that path does not serve, as real Vuforia does, rather than raising an error.
|
|
86
|
+
|
|
87
|
+
- Reject VuMark instance generation requests whose ``instance_id`` is not a string with a ``BadRequest`` result, as real Vuforia does, and move the ``instance_id`` checks into validators shared by both mock backends.
|
|
88
|
+
|
|
89
|
+
- Reject Model Target dataset creation requests with a body which cannot be decoded as UTF-8, rather than raising an error in the mock, and decode OAuth2 token request bodies leniently.
|
|
90
|
+
|
|
91
|
+
2026.08.04.2
|
|
92
|
+
------------
|
|
93
|
+
|
|
94
|
+
- Replace the PyTorch image-quality stack with OpenCV and a lightweight BRISQUE
|
|
95
|
+
implementation. This reduces dependency download and installation sizes and
|
|
96
|
+
removes the need to configure PyTorch's CPU-only package index.
|
|
97
|
+
|
|
98
|
+
- Allow VuMark generation requests to be configured to return ``QuotaExceeded``, ``LicenseCheckFailed``, or ``AuthorizationFailed`` responses.
|
|
99
|
+
|
|
100
|
+
- Cloud databases with ``request_quota=0`` now return a
|
|
101
|
+
``RequestQuotaReached`` response from VWS endpoints.
|
|
102
|
+
|
|
103
|
+
- 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.
|
|
104
|
+
|
|
105
|
+
- Improve Model Target Web API mock authentication failure responses, including
|
|
106
|
+
malformed and unsecured JSON Web Token headers.
|
|
107
|
+
|
|
108
|
+
- 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).
|
|
109
|
+
|
|
110
|
+
- Match real Vuforia Model Target unknown-dataset response shape (``NOT_FOUND`` code, ``Could not find a model-view database with uuid <uuid>`` message, ``userId:`` target).
|
|
111
|
+
Keep each Model Target dataset status response internally consistent when processing completes while the response is being generated.
|
|
112
|
+
|
|
113
|
+
- Make synthetic Model Target dataset zip downloads byte-for-byte reproducible.
|
|
114
|
+
|
|
115
|
+
- 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.
|
|
116
|
+
|
|
117
|
+
- Add configurable ``TargetQuotaReached``, ``ProjectSuspended``, and
|
|
118
|
+
``ProjectHasNoAPIAccess`` responses from VWS endpoints.
|
|
119
|
+
|
|
120
|
+
- Add configurable ``TooManyRequests`` responses from VWS endpoints using the
|
|
121
|
+
``CloudDatabase.requests_per_second_limit`` setting.
|
|
122
|
+
|
|
123
|
+
- 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.
|
|
124
|
+
|
|
125
|
+
2026.04.26
|
|
126
|
+
----------
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
2026.02.22.3
|
|
130
|
+
------------
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
- ``MockVWS`` now intercepts both ``requests`` (via ``responses``) and ``httpx`` (via ``respx``) simultaneously.
|
|
134
|
+
``MockVWSForHttpx`` has been removed: ``MockVWS`` handles both HTTP libraries.
|
|
135
|
+
|
|
136
|
+
2026.02.22.2
|
|
137
|
+
------------
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
2026.02.22.1
|
|
141
|
+
------------
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
2026.02.22
|
|
145
|
+
----------
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
2026.02.21
|
|
149
|
+
----------
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
- Add ``VuMarkTarget`` class for VuMark template targets, alongside the renamed ``ImageTarget`` class (previously ``Target``).
|
|
153
|
+
``ImageTarget`` is for image-based targets and ``VuMarkTarget`` is for VuMark template targets.
|
|
154
|
+
Both can be stored in a ``VuforiaDatabase``.
|
|
155
|
+
|
|
156
|
+
2026.02.18.2
|
|
157
|
+
------------
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
2026.02.18.1
|
|
161
|
+
------------
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
2026.02.18
|
|
165
|
+
----------
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
2026.02.15.5
|
|
169
|
+
------------
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
2026.02.15.4
|
|
173
|
+
------------
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
- Add ``sleep_fn`` parameter to ``MockVWS`` for injecting a custom delay strategy, enabling deterministic and fast tests without monkey-patching.
|
|
177
|
+
|
|
178
|
+
2026.02.15.3
|
|
179
|
+
------------
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
- Add ``response_delay_seconds`` parameter to ``MockVWS`` for simulating slow server responses and testing timeout handling.
|
|
183
|
+
- Add ``response_delay_seconds`` setting to the Flask mock (``VWSSettings`` and ``VWQSettings``) for simulating slow server responses.
|
|
184
|
+
|
|
185
|
+
2025.03.10.1
|
|
186
|
+
------------
|
|
187
|
+
|
|
188
|
+
2025.03.10
|
|
189
|
+
----------
|
|
190
|
+
|
|
191
|
+
2025.02.21
|
|
192
|
+
----------
|
|
193
|
+
|
|
194
|
+
2025.02.18
|
|
195
|
+
----------
|
|
196
|
+
|
|
197
|
+
2024.08.30
|
|
198
|
+
------------
|
|
199
|
+
|
|
200
|
+
2024.07.15
|
|
201
|
+
------------
|
|
202
|
+
|
|
203
|
+
- Support passing data as strings.
|
|
204
|
+
|
|
205
|
+
2024.07.02.1
|
|
206
|
+
------------
|
|
207
|
+
|
|
208
|
+
- Fix installation on Windows now that ``numpy`` 2.0.0 has been released.
|
|
209
|
+
|
|
210
|
+
2024.02.16
|
|
211
|
+
------------
|
|
212
|
+
|
|
213
|
+
- Add a structural similarity image matcher.
|
|
214
|
+
|
|
215
|
+
2018.12.01.0
|
|
216
|
+
------------
|
|
217
|
+
|
|
218
|
+
- Distribute type information.
|
|
219
|
+
|
|
220
|
+
2018.09.10.0
|
|
221
|
+
------------
|
|
222
|
+
|
|
223
|
+
- Initial release
|
{vws_python_mock-2026.8.4.2/src/vws_python_mock.egg-info → vws_python_mock-2026.8.26}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vws-python-mock
|
|
3
|
-
Version: 2026.8.
|
|
3
|
+
Version: 2026.8.26
|
|
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
|
|
@@ -35,33 +35,35 @@ Provides-Extra: dev
|
|
|
35
35
|
Requires-Dist: actionlint-py==1.7.12.24; extra == "dev"
|
|
36
36
|
Requires-Dist: check-manifest==0.51; extra == "dev"
|
|
37
37
|
Requires-Dist: check-wheel-contents==0.6.3; extra == "dev"
|
|
38
|
-
Requires-Dist: coverage==7.15.
|
|
38
|
+
Requires-Dist: coverage==7.15.4; extra == "dev"
|
|
39
39
|
Requires-Dist: deptry==0.25.1; extra == "dev"
|
|
40
40
|
Requires-Dist: dirty-equals==0.11; extra == "dev"
|
|
41
41
|
Requires-Dist: doc8==2.0.0; extra == "dev"
|
|
42
|
-
Requires-Dist: doccmd==2026.
|
|
42
|
+
Requires-Dist: doccmd==2026.8.16; extra == "dev"
|
|
43
43
|
Requires-Dist: docker==7.2.0; extra == "dev"
|
|
44
44
|
Requires-Dist: freezegun==1.5.5; extra == "dev"
|
|
45
45
|
Requires-Dist: furo==2025.12.19; extra == "dev"
|
|
46
46
|
Requires-Dist: interrogate==1.7.0; extra == "dev"
|
|
47
|
-
Requires-Dist: mypy[faster-cache]==2.3.
|
|
47
|
+
Requires-Dist: mypy[faster-cache]==2.3.1; extra == "dev"
|
|
48
48
|
Requires-Dist: mypy-strict-kwargs==2026.7.19.1; extra == "dev"
|
|
49
|
-
Requires-Dist:
|
|
49
|
+
Requires-Dist: no-defaults==2.1.0; extra == "dev"
|
|
50
|
+
Requires-Dist: prek==0.4.14; extra == "dev"
|
|
50
51
|
Requires-Dist: pydocstringformatter==1.0.0; extra == "dev"
|
|
51
52
|
Requires-Dist: pydocstyle==6.3; extra == "dev"
|
|
52
|
-
Requires-Dist: pylint[spelling]==4.0.
|
|
53
|
+
Requires-Dist: pylint[spelling]==4.0.7; extra == "dev"
|
|
53
54
|
Requires-Dist: pylint-per-file-ignores==3.2.1; extra == "dev"
|
|
54
|
-
Requires-Dist: pyproject-fmt==2.
|
|
55
|
-
Requires-Dist: pyrefly==1.
|
|
55
|
+
Requires-Dist: pyproject-fmt==2.28.0; extra == "dev"
|
|
56
|
+
Requires-Dist: pyrefly==1.2.0; extra == "dev"
|
|
56
57
|
Requires-Dist: pyright==1.1.411; extra == "dev"
|
|
57
58
|
Requires-Dist: pyroma==5.0.1; extra == "dev"
|
|
58
59
|
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
59
|
-
Requires-Dist: pytest-beartype-tests==2026.
|
|
60
|
+
Requires-Dist: pytest-beartype-tests==2026.8.16; extra == "dev"
|
|
61
|
+
Requires-Dist: pytest-partition-check==2026.8.10.1; extra == "dev"
|
|
60
62
|
Requires-Dist: pytest-retry==1.7.0; extra == "dev"
|
|
61
63
|
Requires-Dist: pytest-xdist==3.8.0; extra == "dev"
|
|
62
64
|
Requires-Dist: pyyaml==6.0.3; extra == "dev"
|
|
63
|
-
Requires-Dist: requests-mock-flask==2026.
|
|
64
|
-
Requires-Dist: ruff==0.16.
|
|
65
|
+
Requires-Dist: requests-mock-flask==2026.8.16; extra == "dev"
|
|
66
|
+
Requires-Dist: ruff==0.16.4; extra == "dev"
|
|
65
67
|
Requires-Dist: shellcheck-py==0.11.0.1; extra == "dev"
|
|
66
68
|
Requires-Dist: shfmt-py==4.0.0; extra == "dev"
|
|
67
69
|
Requires-Dist: sphinx==9.1.0; extra == "dev"
|
|
@@ -69,26 +71,27 @@ Requires-Dist: sphinx-copybutton==0.5.2; extra == "dev"
|
|
|
69
71
|
Requires-Dist: sphinx-lint==1.0.2; extra == "dev"
|
|
70
72
|
Requires-Dist: sphinx-paramlinks==0.6; extra == "dev"
|
|
71
73
|
Requires-Dist: sphinx-pyproject==0.3.0; extra == "dev"
|
|
72
|
-
Requires-Dist: sphinx-substitution-extensions==2026.
|
|
74
|
+
Requires-Dist: sphinx-substitution-extensions==2026.8.13.1; extra == "dev"
|
|
73
75
|
Requires-Dist: sphinx-toolbox==4.3.0; extra == "dev"
|
|
74
76
|
Requires-Dist: sphinxcontrib-httpdomain==2.0.0; extra == "dev"
|
|
75
77
|
Requires-Dist: sphinxcontrib-spelling==8.0.2; extra == "dev"
|
|
76
78
|
Requires-Dist: sphinxcontrib-towncrier==0.5.0a0; extra == "dev"
|
|
77
|
-
Requires-Dist: strict-kwargs==2026.
|
|
79
|
+
Requires-Dist: strict-kwargs==2026.8.16; extra == "dev"
|
|
78
80
|
Requires-Dist: sybil==10.1.0; extra == "dev"
|
|
79
81
|
Requires-Dist: tenacity==9.1.4; extra == "dev"
|
|
80
82
|
Requires-Dist: towncrier==25.8.0; extra == "dev"
|
|
81
|
-
Requires-Dist: ty==0.0.
|
|
82
|
-
Requires-Dist: types-docker==7.2.0.
|
|
83
|
-
Requires-Dist: types-pyyaml==6.0.12.
|
|
83
|
+
Requires-Dist: ty==0.0.73; extra == "dev"
|
|
84
|
+
Requires-Dist: types-docker==7.2.0.20260819; extra == "dev"
|
|
85
|
+
Requires-Dist: types-pyyaml==6.0.12.20260815; extra == "dev"
|
|
84
86
|
Requires-Dist: types-requests==2.33.0.20260712; extra == "dev"
|
|
85
87
|
Requires-Dist: urllib3==2.7.0; extra == "dev"
|
|
88
|
+
Requires-Dist: vale==3.17.1.0; extra == "dev"
|
|
86
89
|
Requires-Dist: vulture==2.16; extra == "dev"
|
|
87
|
-
Requires-Dist: vws-python==2026.
|
|
88
|
-
Requires-Dist: vws-test-fixtures==
|
|
89
|
-
Requires-Dist: vws-web-tools==2026.
|
|
90
|
+
Requires-Dist: vws-python==2026.8.14; extra == "dev"
|
|
91
|
+
Requires-Dist: vws-test-fixtures==2026.8.23; extra == "dev"
|
|
92
|
+
Requires-Dist: vws-web-tools==2026.8.7; extra == "dev"
|
|
90
93
|
Requires-Dist: yamlfix==1.19.1; extra == "dev"
|
|
91
|
-
Requires-Dist: zizmor==1.
|
|
94
|
+
Requires-Dist: zizmor==1.29.0; extra == "dev"
|
|
92
95
|
Provides-Extra: release
|
|
93
96
|
Requires-Dist: check-wheel-contents==0.6.3; extra == "release"
|
|
94
97
|
Requires-Dist: towncrier==25.8.0; extra == "release"
|
|
@@ -22,6 +22,13 @@ VUMARK_TEMPLATE_SVG_FILE_PATH = Path(__file__).with_name(
|
|
|
22
22
|
name="vumark_template.svg",
|
|
23
23
|
)
|
|
24
24
|
|
|
25
|
+
MODEL_TARGET_WEB_API_SCOPES = (
|
|
26
|
+
"modeltargets.standardmodeltarget.all",
|
|
27
|
+
"modeltargets.advancedmodeltarget.all",
|
|
28
|
+
"modeltargets.statebasedmodeltarget.all",
|
|
29
|
+
"modeltargets.advancedstatebasedmodeltarget.all",
|
|
30
|
+
)
|
|
31
|
+
|
|
25
32
|
|
|
26
33
|
def _create_and_get_cloud_database_details(
|
|
27
34
|
driver: WebDriver,
|
|
@@ -83,11 +90,14 @@ def _generate_secrets_file_content(
|
|
|
83
90
|
inactive_vumark_details: VuMarkDatabaseDict,
|
|
84
91
|
vumark_target_id: str,
|
|
85
92
|
model_target_web_api_details: ModelTargetWebAPIDict,
|
|
93
|
+
model_target_username: str,
|
|
94
|
+
model_target_password: str,
|
|
86
95
|
) -> str:
|
|
87
96
|
"""Generate the content of a secrets file."""
|
|
88
97
|
return textwrap.dedent(
|
|
89
98
|
text=f"""\
|
|
90
99
|
VUFORIA_TARGET_MANAGER_DATABASE_NAME={cloud_database_details["database_name"]}
|
|
100
|
+
VUFORIA_DATABASE_ID={cloud_database_details["database_id"]}
|
|
91
101
|
VUFORIA_SERVER_ACCESS_KEY={cloud_database_details["server_access_key"]}
|
|
92
102
|
VUFORIA_SERVER_SECRET_KEY={cloud_database_details["server_secret_key"]}
|
|
93
103
|
VUFORIA_CLIENT_ACCESS_KEY={cloud_database_details["client_access_key"]}
|
|
@@ -111,6 +121,8 @@ def _generate_secrets_file_content(
|
|
|
111
121
|
MODEL_TARGET_VUFORIA_CLIENT_ID={model_target_web_api_details["client_id"]}
|
|
112
122
|
MODEL_TARGET_VUFORIA_CLIENT_SECRET={model_target_web_api_details["client_secret"]}
|
|
113
123
|
MODEL_TARGET_VUFORIA_CAD_DATA_URL={model_target_web_api_details["cad_data_url"]}
|
|
124
|
+
MODEL_TARGET_VUFORIA_USERNAME={model_target_username}
|
|
125
|
+
MODEL_TARGET_VUFORIA_PASSWORD={model_target_password}
|
|
114
126
|
""",
|
|
115
127
|
)
|
|
116
128
|
|
|
@@ -215,7 +227,10 @@ def _get_model_target_web_api_details(
|
|
|
215
227
|
password=password,
|
|
216
228
|
)
|
|
217
229
|
vws_web_tools.wait_for_logged_in(driver=driver)
|
|
218
|
-
return vws_web_tools.get_model_target_web_api_details(
|
|
230
|
+
return vws_web_tools.get_model_target_web_api_details(
|
|
231
|
+
driver=driver,
|
|
232
|
+
scopes=MODEL_TARGET_WEB_API_SCOPES,
|
|
233
|
+
)
|
|
219
234
|
|
|
220
235
|
|
|
221
236
|
def _create_vuforia_resource_names() -> tuple[str, str, str, str]:
|
|
@@ -325,6 +340,8 @@ def main() -> None:
|
|
|
325
340
|
inactive_vumark_details=inactive_vumark_details,
|
|
326
341
|
vumark_target_id=vumark_target_id,
|
|
327
342
|
model_target_web_api_details=model_target_web_api_details,
|
|
343
|
+
model_target_username=email_address,
|
|
344
|
+
model_target_password=password,
|
|
328
345
|
)
|
|
329
346
|
file.write_text(data=file_contents)
|
|
330
347
|
sys.stdout.write(f"Created database {file.name}\n")
|