vws-python-mock 2026.2.22.2__tar.gz → 2026.4.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.
Files changed (148) hide show
  1. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.github/workflows/dependabot-merge.yml +1 -6
  2. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.github/workflows/docker-build.yml +4 -4
  3. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.github/workflows/lint.yml +1 -1
  4. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.github/workflows/publish-site.yml +1 -1
  5. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.github/workflows/release.yml +18 -10
  6. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.github/workflows/test.yml +20 -14
  7. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.gitignore +2 -0
  8. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.pre-commit-config.yaml +66 -32
  9. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/CHANGELOG.rst +11 -0
  10. {vws_python_mock-2026.2.22.2/src/vws_python_mock.egg-info → vws_python_mock-2026.4.26}/PKG-INFO +38 -45
  11. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/README.rst +9 -15
  12. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/admin/create_secrets_files.py +133 -72
  13. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/ci/test_custom_linters.py +49 -31
  14. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/conftest.py +0 -9
  15. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docker-bake.hcl +6 -6
  16. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/basic-example.rst +2 -1
  17. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/conf.py +4 -1
  18. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/contributing.rst +1 -4
  19. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/docker.rst +6 -6
  20. vws_python_mock-2026.4.26/docs/source/getting-started.rst +9 -0
  21. vws_python_mock-2026.4.26/docs/source/httpx-example.rst +18 -0
  22. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/index.rst +2 -5
  23. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/mock-api-reference.rst +2 -6
  24. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/pyproject.toml +73 -62
  25. vws_python_mock-2026.4.26/secrets.tar.gpg +0 -0
  26. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/spelling_private_dict.txt +3 -0
  27. vws_python_mock-2026.4.26/src/mock_vws/__init__.py +9 -0
  28. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_flask_server/Dockerfile +1 -1
  29. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_flask_server/healthcheck.py +1 -1
  30. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_flask_server/target_manager.py +5 -0
  31. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_mock_common.py +25 -2
  32. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/exceptions.py +3 -5
  33. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/image_validators.py +10 -10
  34. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_requests_mock_server/decorators.py +38 -38
  35. vws_python_mock-2026.4.26/src/mock_vws/_respx_mock_server/decorators.py +183 -0
  36. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/image_validators.py +14 -16
  37. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/key_validators.py +1 -1
  38. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/project_state_validators.py +8 -4
  39. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/database.py +6 -2
  40. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/image_matchers.py +21 -9
  41. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/target.py +5 -6
  42. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/target_raters.py +14 -9
  43. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26/src/vws_python_mock.egg-info}/PKG-INFO +38 -45
  44. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/vws_python_mock.egg-info/requires.txt +26 -27
  45. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/conftest.py +19 -11
  46. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/fixtures/credentials.py +41 -2
  47. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/fixtures/prepared_requests.py +10 -2
  48. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/fixtures/vuforia_backends.py +61 -25
  49. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_flask_app_usage.py +1 -1
  50. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_query.py +8 -12
  51. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_requests_mock_usage.py +48 -0
  52. vws_python_mock-2026.4.26/tests/mock_vws/test_respx_mock_usage.py +161 -0
  53. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_vumark_generation_api.py +82 -72
  54. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/utils/__init__.py +1 -1
  55. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/vuforia_secrets.env.example +5 -0
  56. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/zizmor.yml +1 -3
  57. vws_python_mock-2026.2.22.2/docs/source/getting-started.rst +0 -12
  58. vws_python_mock-2026.2.22.2/docs/source/httpx-example.rst +0 -22
  59. vws_python_mock-2026.2.22.2/secrets.tar.gpg +0 -0
  60. vws_python_mock-2026.2.22.2/src/mock_vws/__init__.py +0 -13
  61. vws_python_mock-2026.2.22.2/src/mock_vws/_respx_mock_server/decorators.py +0 -287
  62. vws_python_mock-2026.2.22.2/tests/mock_vws/test_respx_mock_usage.py +0 -467
  63. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.git_archival.txt +0 -0
  64. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.gitattributes +0 -0
  65. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.github/dependabot.yml +0 -0
  66. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.prettierrc +0 -0
  67. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.vscode/extensions.json +0 -0
  68. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/.vscode/settings.json +0 -0
  69. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/CODE_OF_CONDUCT.rst +0 -0
  70. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/LICENSE +0 -0
  71. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/MANIFEST.in +0 -0
  72. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/admin/__init__.py +0 -0
  73. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/admin/vumark_template.svg +0 -0
  74. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/ci/__init__.py +0 -0
  75. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/ci/decrypt_secret.sh +0 -0
  76. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/__init__.py +0 -0
  77. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/changelog.rst +0 -0
  78. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/ci-setup.rst +0 -0
  79. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/differences-to-vws.rst +0 -0
  80. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/installation.rst +0 -0
  81. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/release-process.rst +0 -0
  82. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/docs/source/versioning-and-api-stability.rst +0 -0
  83. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/setup.cfg +0 -0
  84. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_base64_decoding.py +0 -0
  85. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_constants.py +0 -0
  86. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_database_matchers.py +0 -0
  87. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_flask_server/__init__.py +0 -0
  88. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_flask_server/vwq.py +0 -0
  89. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_flask_server/vws.py +0 -0
  90. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_tools.py +0 -0
  91. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/__init__.py +0 -0
  92. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/accept_header_validators.py +0 -0
  93. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/auth_validators.py +0 -0
  94. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/content_length_validators.py +0 -0
  95. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/content_type_validators.py +0 -0
  96. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/date_validators.py +0 -0
  97. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/fields_validators.py +0 -0
  98. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/include_target_data_validators.py +0 -0
  99. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/num_results_validators.py +0 -0
  100. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_query_validators/project_state_validators.py +0 -0
  101. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_requests_mock_server/__init__.py +0 -0
  102. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_requests_mock_server/mock_web_query_api.py +0 -0
  103. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_requests_mock_server/mock_web_services_api.py +0 -0
  104. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_respx_mock_server/__init__.py +0 -0
  105. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/__init__.py +0 -0
  106. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/active_flag_validators.py +0 -0
  107. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/auth_validators.py +0 -0
  108. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/content_length_validators.py +0 -0
  109. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/content_type_validators.py +0 -0
  110. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/date_validators.py +0 -0
  111. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/exceptions.py +0 -0
  112. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/json_validators.py +0 -0
  113. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/metadata_validators.py +0 -0
  114. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/name_validators.py +0 -0
  115. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/target_validators.py +0 -0
  116. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/_services_validators/width_validators.py +0 -0
  117. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/database_type.py +0 -0
  118. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/py.typed +0 -0
  119. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/states.py +0 -0
  120. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/mock_vws/target_manager.py +0 -0
  121. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/vws_python_mock.egg-info/SOURCES.txt +0 -0
  122. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/vws_python_mock.egg-info/dependency_links.txt +0 -0
  123. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/vws_python_mock.egg-info/not-zip-safe +0 -0
  124. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/src/vws_python_mock.egg-info/top_level.txt +0 -0
  125. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/__init__.py +0 -0
  126. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/__init__.py +0 -0
  127. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/fixtures/__init__.py +0 -0
  128. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_add_target.py +0 -0
  129. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_authorization_header.py +0 -0
  130. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_content_length.py +0 -0
  131. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_database_summary.py +0 -0
  132. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_date_header.py +0 -0
  133. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_delete_target.py +0 -0
  134. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_docker.py +0 -0
  135. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_get_duplicates.py +0 -0
  136. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_get_target.py +0 -0
  137. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_invalid_given_id.py +0 -0
  138. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_invalid_json.py +0 -0
  139. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_target_list.py +0 -0
  140. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_target_raters.py +0 -0
  141. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_target_summary.py +0 -0
  142. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_target_validators.py +0 -0
  143. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_unexpected_json.py +0 -0
  144. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/test_update_target.py +0 -0
  145. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/utils/assertions.py +0 -0
  146. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/utils/retries.py +0 -0
  147. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/utils/too_many_requests.py +0 -0
  148. {vws_python_mock-2026.2.22.2 → vws_python_mock-2026.4.26}/tests/mock_vws/utils/usage_test_helpers.py +0 -0
@@ -10,13 +10,8 @@ permissions:
10
10
  jobs:
11
11
  dependabot:
12
12
  runs-on: ubuntu-latest
13
- if: github.actor == 'dependabot[bot]'
13
+ if: github.event.pull_request.user.login == 'dependabot[bot]'
14
14
  steps:
15
- - name: Dependabot metadata
16
- id: metadata
17
- uses: dependabot/fetch-metadata@v2
18
- with:
19
- github-token: ${{ secrets.GITHUB_TOKEN }}
20
15
  - name: Enable auto-merge for Dependabot PRs
21
16
  run: gh pr merge --auto --merge "$PR_URL"
22
17
  env:
@@ -29,17 +29,17 @@ jobs:
29
29
  persist-credentials: false
30
30
 
31
31
  - name: Set up QEMU
32
- uses: docker/setup-qemu-action@v3
32
+ uses: docker/setup-qemu-action@v4
33
33
 
34
34
  - name: Set up Docker Buildx
35
- uses: docker/setup-buildx-action@v3
35
+ uses: docker/setup-buildx-action@v4
36
36
 
37
37
  - name: Check Docker bake definition
38
- uses: docker/bake-action@v6.10.0
38
+ uses: docker/bake-action@v7.1.0
39
39
  with:
40
40
  call: check
41
41
 
42
42
  - name: Build Docker images
43
- uses: docker/bake-action@v6.10.0
43
+ uses: docker/bake-action@v7.1.0
44
44
  with:
45
45
  push: false
@@ -18,7 +18,7 @@ jobs:
18
18
  build:
19
19
  strategy:
20
20
  matrix:
21
- python-version: ['3.13']
21
+ python-version: ['3.14']
22
22
  platform: [ubuntu-latest, windows-latest]
23
23
  hook-stage: [pre-commit, pre-push, manual]
24
24
 
@@ -22,6 +22,6 @@ jobs:
22
22
  with:
23
23
  documentation_path: docs/source
24
24
  pyproject_extras: dev
25
- python_version: '3.13'
25
+ python_version: '3.14'
26
26
  sphinx_build_options: -W
27
27
  publish: ${{ github.ref_name == 'main' }}
@@ -7,6 +7,7 @@ jobs:
7
7
  release:
8
8
  name: Create release
9
9
  runs-on: ubuntu-latest
10
+ environment: release
10
11
 
11
12
  permissions:
12
13
  # This is needed for https://github.com/stefanzweifel/git-auto-commit-action.
@@ -44,8 +45,10 @@ jobs:
44
45
 
45
46
  - name: Get the changelog underline
46
47
  id: changelog_underline
48
+ env:
49
+ RELEASE: ${{ steps.calver.outputs.release }}
47
50
  run: |
48
- underline="$(echo "${{ steps.calver.outputs.release }}" | tr -c '\n' '-')"
51
+ underline="$(echo "$RELEASE" | tr -c '\n' '-')"
49
52
  echo "underline=${underline}" >> "$GITHUB_OUTPUT"
50
53
 
51
54
  - name: Update changelog
@@ -63,8 +66,10 @@ jobs:
63
66
  regex: false
64
67
 
65
68
  - name: Check Update changelog was modified
69
+ env:
70
+ MODIFIED_FILES: ${{ steps.update_changelog.outputs.modifiedFiles }}
66
71
  run: |
67
- if [ "${{ steps.update_changelog.outputs.modifiedFiles }}" = "0" ]; then
72
+ if [ "$MODIFIED_FILES" = "0" ]; then
68
73
  echo "Error: No files were modified when updating changelog"
69
74
  exit 1
70
75
  fi
@@ -138,8 +143,10 @@ jobs:
138
143
  name: Publish Docker images
139
144
  needs: release
140
145
  runs-on: ubuntu-latest
146
+ environment: dockerhub
141
147
 
142
- permissions: {}
148
+ permissions:
149
+ packages: write
143
150
 
144
151
  steps:
145
152
  - uses: actions/checkout@v6
@@ -147,20 +154,21 @@ jobs:
147
154
  ref: ${{ needs.release.outputs.tag }}
148
155
  persist-credentials: false
149
156
 
150
- - name: Login to DockerHub
151
- uses: docker/login-action@v3
157
+ - name: Login to GHCR
158
+ uses: docker/login-action@v4
152
159
  with:
153
- username: ${{ secrets.DOCKERHUB_USERNAME }}
154
- password: ${{ secrets.DOCKERHUB_TOKEN }}
160
+ registry: ghcr.io
161
+ username: ${{ github.actor }}
162
+ password: ${{ secrets.GITHUB_TOKEN }}
155
163
 
156
164
  - name: Set up Docker Buildx
157
- uses: docker/setup-buildx-action@v3
165
+ uses: docker/setup-buildx-action@v4
158
166
 
159
167
  - name: Set up QEMU
160
- uses: docker/setup-qemu-action@v3
168
+ uses: docker/setup-qemu-action@v4
161
169
 
162
170
  - name: Build and push Docker images
163
- uses: docker/bake-action@v6.10.0
171
+ uses: docker/bake-action@v7.1.0
164
172
  with:
165
173
  push: true
166
174
  env:
@@ -22,10 +22,11 @@ jobs:
22
22
  # CI tests with matrix
23
23
  ci-tests:
24
24
  runs-on: ubuntu-latest
25
+ environment: vuforia
25
26
  strategy:
26
27
  fail-fast: false
27
28
  matrix:
28
- python-version: ['3.13']
29
+ python-version: ['3.14']
29
30
  ci_pattern:
30
31
  - tests/mock_vws/test_query.py::TestContentType
31
32
  - tests/mock_vws/test_query.py::TestSuccess
@@ -112,11 +113,14 @@ jobs:
112
113
  - tests/mock_vws/test_update_target.py::TestWidth
113
114
  - tests/mock_vws/test_update_target.py::TestInactiveProject
114
115
  - tests/mock_vws/test_requests_mock_usage.py
116
+ - tests/mock_vws/test_respx_mock_usage.py
115
117
  - tests/mock_vws/test_flask_app_usage.py
116
118
  - tests/mock_vws/test_vumark_generation_api.py
119
+ - tests/mock_vws/test_target_validators.py
117
120
  - tests/mock_vws/test_docker.py
121
+ - ci/test_custom_linters.py
118
122
  - README.rst
119
- - docs/source/basic-example.rst
123
+ - docs/
120
124
 
121
125
  steps:
122
126
  - uses: actions/checkout@v6
@@ -130,15 +134,16 @@ jobs:
130
134
  cache-dependency-glob: '**/pyproject.toml'
131
135
 
132
136
  - name: Set secrets file
133
- run: |
134
- # See the "CI Setup" document for details of how this was set up.
135
- ci/decrypt_secret.sh
136
- tar xvf "${HOME}"/secrets/secrets.tar
137
- cp ./ci_secrets/vuforia_secrets_${{ strategy.job-index }}.env ./vuforia_secrets.env
138
137
  env:
139
138
  CI_PATTERN: ${{ matrix.ci_pattern }}
140
139
  ENCRYPTED_FILE: secrets.tar.gpg
141
140
  LARGE_SECRET_PASSPHRASE: ${{ secrets.PASSPHRASE_FOR_VUFORIA_SECRETS }}
141
+ JOB_INDEX: ${{ strategy.job-index }}
142
+ run: |
143
+ # See the "CI Setup" document for details of how this was set up.
144
+ ci/decrypt_secret.sh
145
+ tar xvf "${HOME}"/secrets/secrets.tar
146
+ cp "./ci_secrets/vuforia_secrets_${JOB_INDEX}.env" ./vuforia_secrets.env
142
147
 
143
148
  # We have seen issues with running out of disk space on test_docker
144
149
  - name: Free Disk Space (Ubuntu)
@@ -174,7 +179,7 @@ jobs:
174
179
  echo "name=coverage-data-ci-${{ matrix.python-version }}-${SANITIZED_PATTERN}" >> "$GITHUB_OUTPUT"
175
180
 
176
181
  - name: Upload coverage data
177
- uses: actions/upload-artifact@v6
182
+ uses: actions/upload-artifact@v7
178
183
  with:
179
184
  name: ${{ steps.sanitize.outputs.name }}
180
185
  path: .coverage.*
@@ -186,7 +191,7 @@ jobs:
186
191
  runs-on: ubuntu-latest
187
192
  strategy:
188
193
  matrix:
189
- python-version: ['3.13']
194
+ python-version: ['3.14']
190
195
  platform: [ubuntu-latest]
191
196
 
192
197
  steps:
@@ -220,7 +225,7 @@ jobs:
220
225
  UV_PYTHON: ${{ matrix.python-version }}
221
226
 
222
227
  - name: Upload coverage data
223
- uses: actions/upload-artifact@v6
228
+ uses: actions/upload-artifact@v7
224
229
  with:
225
230
  name: coverage-data-skip-tests-${{ matrix.python-version }}
226
231
  path: .coverage.*
@@ -232,7 +237,7 @@ jobs:
232
237
  runs-on: windows-latest
233
238
  strategy:
234
239
  matrix:
235
- python-version: ['3.13']
240
+ python-version: ['3.14']
236
241
 
237
242
  steps:
238
243
  - uses: actions/checkout@v6
@@ -286,8 +291,9 @@ jobs:
286
291
  with:
287
292
  enable-cache: true
288
293
  cache-dependency-glob: '**/pyproject.toml'
294
+ python-version: '3.14'
289
295
 
290
- - uses: actions/download-artifact@v7
296
+ - uses: actions/download-artifact@v8
291
297
  with:
292
298
  pattern: coverage-data-*
293
299
  merge-multiple: true
@@ -307,14 +313,14 @@ jobs:
307
313
  coverage report
308
314
 
309
315
  - name: Upload HTML report if check failed
310
- uses: actions/upload-artifact@v6
316
+ uses: actions/upload-artifact@v7
311
317
  with:
312
318
  name: html-report
313
319
  path: htmlcov
314
320
  if: ${{ failure() }}
315
321
 
316
322
  # Final completion check
317
- completion:
323
+ completion-ci:
318
324
  needs: [ci-tests, skip-tests, windows-tests, coverage]
319
325
  runs-on: ubuntu-latest
320
326
  if: always()
@@ -112,3 +112,5 @@ secrets.tar
112
112
  src/*/_setuptools_scm_version.txt
113
113
 
114
114
  uv.lock
115
+
116
+ .claude/scheduled_tasks.lock
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  fail_fast: true
3
3
 
4
+ .uv_version: &uv_version uv==0.11.7
5
+
4
6
  # We use system Python, with required dependencies specified in pyproject.toml.
5
7
  # We therefore cannot use those dependencies in pre-commit CI.
6
8
  ci:
@@ -108,7 +110,8 @@ repos:
108
110
  language: python
109
111
  types_or: [yaml, python]
110
112
  pass_filenames: false
111
- additional_dependencies: [uv==0.9.5]
113
+ additional_dependencies:
114
+ - *uv_version
112
115
 
113
116
  - id: actionlint
114
117
  name: actionlint
@@ -116,7 +119,8 @@ repos:
116
119
  language: python
117
120
  pass_filenames: false
118
121
  types_or: [yaml]
119
- additional_dependencies: [uv==0.9.5]
122
+ additional_dependencies:
123
+ - *uv_version
120
124
  stages: [pre-commit]
121
125
 
122
126
  - id: pydocstringformatter
@@ -124,7 +128,8 @@ repos:
124
128
  entry: uv run --extra=dev pydocstringformatter
125
129
  language: python
126
130
  types_or: [python]
127
- additional_dependencies: [uv==0.9.5]
131
+ additional_dependencies:
132
+ - *uv_version
128
133
  stages: [pre-commit]
129
134
 
130
135
  - id: shellcheck
@@ -132,7 +137,8 @@ repos:
132
137
  entry: uv run --extra=dev shellcheck --shell=bash
133
138
  language: python
134
139
  types_or: [shell]
135
- additional_dependencies: [uv==0.9.5]
140
+ additional_dependencies:
141
+ - *uv_version
136
142
  stages: [pre-commit]
137
143
 
138
144
  - id: shellcheck-docs
@@ -142,7 +148,8 @@ repos:
142
148
  --command="shellcheck --shell=bash --exclude=SC2215"
143
149
  language: python
144
150
  types_or: [markdown, rst]
145
- additional_dependencies: [uv==0.9.5]
151
+ additional_dependencies:
152
+ - *uv_version
146
153
  stages: [pre-commit]
147
154
 
148
155
  - id: shfmt
@@ -150,7 +157,8 @@ repos:
150
157
  entry: shfmt --write --space-redirects --indent=4
151
158
  language: python
152
159
  types_or: [shell]
153
- additional_dependencies: [uv==0.9.5]
160
+ additional_dependencies:
161
+ - *uv_version
154
162
  stages: [pre-commit]
155
163
 
156
164
  - id: shfmt-docs
@@ -159,7 +167,8 @@ repos:
159
167
  --no-pad-file --command="shfmt --write --space-redirects --indent=4"
160
168
  language: python
161
169
  types_or: [markdown, rst]
162
- additional_dependencies: [uv==0.9.5]
170
+ additional_dependencies:
171
+ - *uv_version
163
172
  stages: [pre-commit]
164
173
 
165
174
  - id: mypy
@@ -169,7 +178,8 @@ repos:
169
178
  language: python
170
179
  types_or: [python, toml]
171
180
  pass_filenames: false
172
- additional_dependencies: [uv==0.9.5]
181
+ additional_dependencies:
182
+ - *uv_version
173
183
 
174
184
  # We do not use --example-workers 0 due to https://github.com/python/mypy/issues/18283
175
185
  - id: mypy-docs
@@ -185,7 +195,8 @@ repos:
185
195
  entry: uv run --extra=dev -m check_manifest
186
196
  language: python
187
197
  pass_filenames: false
188
- additional_dependencies: [uv==0.9.5]
198
+ additional_dependencies:
199
+ - *uv_version
189
200
 
190
201
  - id: pyright
191
202
  name: pyright
@@ -194,7 +205,8 @@ repos:
194
205
  language: python
195
206
  types_or: [python, toml]
196
207
  pass_filenames: false
197
- additional_dependencies: [uv==0.9.5]
208
+ additional_dependencies:
209
+ - *uv_version
198
210
 
199
211
  - id: pyright-docs
200
212
  name: pyright-docs
@@ -210,7 +222,8 @@ repos:
210
222
  language: python
211
223
  pass_filenames: false
212
224
  types_or: [python]
213
- additional_dependencies: [uv==0.9.5]
225
+ additional_dependencies:
226
+ - *uv_version
214
227
 
215
228
  - id: ty
216
229
  name: ty
@@ -219,7 +232,8 @@ repos:
219
232
  language: python
220
233
  types_or: [python, toml]
221
234
  pass_filenames: false
222
- additional_dependencies: [uv==0.9.5]
235
+ additional_dependencies:
236
+ - *uv_version
223
237
 
224
238
  - id: ty-docs
225
239
  name: ty-docs
@@ -228,7 +242,8 @@ repos:
228
242
  check"
229
243
  language: python
230
244
  types_or: [markdown, rst]
231
- additional_dependencies: [uv==0.9.5]
245
+ additional_dependencies:
246
+ - *uv_version
232
247
 
233
248
  - id: vulture
234
249
  name: vulture
@@ -236,7 +251,8 @@ repos:
236
251
  language: python
237
252
  types_or: [python]
238
253
  pass_filenames: false
239
- additional_dependencies: [uv==0.9.5]
254
+ additional_dependencies:
255
+ - *uv_version
240
256
  stages: [pre-commit]
241
257
 
242
258
  - id: vulture-docs
@@ -245,7 +261,8 @@ repos:
245
261
  language: python
246
262
  types_or: [python]
247
263
  pass_filenames: false
248
- additional_dependencies: [uv==0.9.5]
264
+ additional_dependencies:
265
+ - *uv_version
249
266
  stages: [pre-commit]
250
267
 
251
268
  - id: pyroma
@@ -254,7 +271,8 @@ repos:
254
271
  language: python
255
272
  pass_filenames: false
256
273
  types_or: [toml]
257
- additional_dependencies: [uv==0.9.5]
274
+ additional_dependencies:
275
+ - *uv_version
258
276
  stages: [pre-commit]
259
277
 
260
278
  - id: deptry
@@ -262,7 +280,8 @@ repos:
262
280
  entry: uv run --extra=dev -m deptry src/
263
281
  language: python
264
282
  pass_filenames: false
265
- additional_dependencies: [uv==0.9.5]
283
+ additional_dependencies:
284
+ - *uv_version
266
285
  stages: [pre-commit]
267
286
 
268
287
  - id: pylint
@@ -271,7 +290,8 @@ repos:
271
290
  language: python
272
291
  stages: [manual]
273
292
  pass_filenames: false
274
- additional_dependencies: [uv==0.9.5]
293
+ additional_dependencies:
294
+ - *uv_version
275
295
 
276
296
  - id: pylint-docs
277
297
  name: pylint-docs
@@ -285,7 +305,8 @@ repos:
285
305
  entry: uv run --extra=dev -m ruff check --fix
286
306
  language: python
287
307
  types_or: [python]
288
- additional_dependencies: [uv==0.9.5]
308
+ additional_dependencies:
309
+ - *uv_version
289
310
  stages: [pre-commit]
290
311
 
291
312
  - id: ruff-check-fix-docs
@@ -293,7 +314,8 @@ repos:
293
314
  entry: uv run --extra=dev doccmd --language=python --command="ruff check --fix"
294
315
  language: python
295
316
  types_or: [markdown, rst]
296
- additional_dependencies: [uv==0.9.5]
317
+ additional_dependencies:
318
+ - *uv_version
297
319
  stages: [pre-commit]
298
320
 
299
321
  - id: ruff-format-fix
@@ -301,7 +323,8 @@ repos:
301
323
  entry: uv run --extra=dev -m ruff format
302
324
  language: python
303
325
  types_or: [python]
304
- additional_dependencies: [uv==0.9.5]
326
+ additional_dependencies:
327
+ - *uv_version
305
328
  stages: [pre-commit]
306
329
 
307
330
  - id: ruff-format-fix-docs
@@ -310,7 +333,8 @@ repos:
310
333
  format"
311
334
  language: python
312
335
  types_or: [markdown, rst]
313
- additional_dependencies: [uv==0.9.5]
336
+ additional_dependencies:
337
+ - *uv_version
314
338
  stages: [pre-commit]
315
339
 
316
340
  - id: doc8
@@ -318,7 +342,8 @@ repos:
318
342
  entry: uv run --extra=dev -m doc8
319
343
  language: python
320
344
  types_or: [rst]
321
- additional_dependencies: [uv==0.9.5]
345
+ additional_dependencies:
346
+ - *uv_version
322
347
  stages: [pre-commit]
323
348
 
324
349
  - id: interrogate
@@ -334,7 +359,8 @@ repos:
334
359
  entry: uv run --extra=dev doccmd --no-write-to-file --language=python --command="interrogate"
335
360
  language: python
336
361
  types_or: [markdown, rst]
337
- additional_dependencies: [uv==0.9.5]
362
+ additional_dependencies:
363
+ - *uv_version
338
364
  stages: [pre-commit]
339
365
 
340
366
  - id: pyproject-fmt-fix
@@ -353,7 +379,8 @@ repos:
353
379
  types_or: [rst]
354
380
  stages: [manual]
355
381
  pass_filenames: false
356
- additional_dependencies: [uv==0.9.5]
382
+ additional_dependencies:
383
+ - *uv_version
357
384
 
358
385
  - id: spelling
359
386
  name: spelling
@@ -363,7 +390,8 @@ repos:
363
390
  types_or: [rst]
364
391
  stages: [manual]
365
392
  pass_filenames: false
366
- additional_dependencies: [uv==0.9.5]
393
+ additional_dependencies:
394
+ - *uv_version
367
395
 
368
396
  - id: docs
369
397
  name: Build Documentation
@@ -371,14 +399,16 @@ repos:
371
399
  language: python
372
400
  stages: [manual]
373
401
  pass_filenames: false
374
- additional_dependencies: [uv==0.9.5]
402
+ additional_dependencies:
403
+ - *uv_version
375
404
 
376
405
  - id: yamlfix
377
406
  name: pyproject-fmt
378
407
  entry: uv run --extra=dev yamlfix
379
408
  language: python
380
409
  types_or: [yaml]
381
- additional_dependencies: [uv==0.9.5]
410
+ additional_dependencies:
411
+ - *uv_version
382
412
  stages: [pre-commit]
383
413
 
384
414
  - id: zizmor
@@ -387,7 +417,8 @@ repos:
387
417
  language: python
388
418
  pass_filenames: false
389
419
  types_or: [yaml]
390
- additional_dependencies: [uv==0.9.5]
420
+ additional_dependencies:
421
+ - *uv_version
391
422
  stages: [pre-commit]
392
423
 
393
424
  - id: sphinx-lint
@@ -395,7 +426,8 @@ repos:
395
426
  entry: uv run --extra=dev sphinx-lint --enable=all --disable=line-too-long
396
427
  language: python
397
428
  types_or: [rst]
398
- additional_dependencies: [uv==0.9.5]
429
+ additional_dependencies:
430
+ - *uv_version
399
431
  stages: [pre-commit]
400
432
 
401
433
  - id: pyrefly
@@ -405,7 +437,8 @@ repos:
405
437
  language: python
406
438
  types_or: [python, toml]
407
439
  pass_filenames: false
408
- additional_dependencies: [uv==0.9.5]
440
+ additional_dependencies:
441
+ - *uv_version
409
442
 
410
443
  - id: pyrefly-docs
411
444
  name: pyrefly-docs
@@ -414,7 +447,8 @@ repos:
414
447
  check"
415
448
  language: python
416
449
  types_or: [markdown, rst]
417
- additional_dependencies: [uv==0.9.5]
450
+ additional_dependencies:
451
+ - *uv_version
418
452
 
419
453
  - id: hclfmt
420
454
  name: hclfmt
@@ -4,6 +4,17 @@ Changelog
4
4
  Next
5
5
  ----
6
6
 
7
+ 2026.04.26
8
+ ----------
9
+
10
+
11
+ 2026.02.22.3
12
+ ------------
13
+
14
+
15
+ - ``MockVWS`` now intercepts both ``requests`` (via ``responses``) and ``httpx`` (via ``respx``) simultaneously.
16
+ ``MockVWSForHttpx`` has been removed — ``MockVWS`` handles both HTTP libraries.
17
+
7
18
  2026.02.22.2
8
19
  ------------
9
20