vws-python 2026.8.26__tar.gz → 2026.10.9__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-2026.8.26 → vws_python-2026.10.9}/.github/workflows/autofix.yml +2 -2
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.github/workflows/ci.yml +3 -3
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.github/workflows/lint.yml +3 -3
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.github/workflows/publish-site.yml +1 -1
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.github/workflows/release.yml +8 -17
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.vale.ini +2 -2
- vws_python-2026.10.9/CHANGELOG.md +3 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/CODE_OF_CONDUCT.rst +10 -15
- vws_python-2026.10.9/PKG-INFO +100 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/README.rst +3 -5
- {vws_python-2026.8.26 → vws_python-2026.10.9}/conftest.py +8 -3
- {vws_python-2026.8.26 → vws_python-2026.10.9}/docs/source/api-reference.rst +4 -0
- vws_python-2026.10.9/docs/source/changelog/2019.11.23.0.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2020.03.21.0.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2020.06.19.0.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2020.08.21.0.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2020.09.07.0.md +5 -0
- vws_python-2026.10.9/docs/source/changelog/2021.03.28.0.md +5 -0
- vws_python-2026.10.9/docs/source/changelog/2021.03.28.1.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2021.03.28.2.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2023.03.05.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2023.03.25.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2023.05.21.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2023.12.26.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2023.12.27.md +4 -0
- vws_python-2026.10.9/docs/source/changelog/2024.02.04.1.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2024.02.04.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2024.02.06.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2024.02.19.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2024.09.02.md +5 -0
- vws_python-2026.10.9/docs/source/changelog/2024.09.03.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2024.09.04.1.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2024.09.04.md +4 -0
- vws_python-2026.10.9/docs/source/changelog/2024.09.21.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2025.03.10.1.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2025.03.10.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2026.02.15.md +5 -0
- vws_python-2026.10.9/docs/source/changelog/2026.02.21.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2026.02.22.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2026.02.23.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2026.02.24.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2026.02.25.1.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2026.02.25.md +1 -0
- vws_python-2026.10.9/docs/source/changelog/2026.08.14.md +13 -0
- vws_python-2026.10.9/docs/source/changelog/2026.08.26.md +3 -0
- vws_python-2026.10.9/docs/source/changelog/2026.09.07.md +5 -0
- vws_python-2026.10.9/docs/source/changelog/2026.10.09.md +10 -0
- vws_python-2026.10.9/docs/source/changelog.md +11 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/docs/source/conf.py +4 -3
- {vws_python-2026.8.26 → vws_python-2026.10.9}/docs/source/contributing.rst +9 -2
- {vws_python-2026.8.26 → vws_python-2026.10.9}/docs/source/index.rst +39 -1
- vws_python-2026.10.9/docs/source/unreleased.md +7 -0
- vws_python-2026.10.9/newsfragments/README.md +10 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/prek.toml +57 -42
- {vws_python-2026.8.26 → vws_python-2026.10.9}/pyproject.toml +73 -59
- {vws_python-2026.8.26 → vws_python-2026.10.9}/spelling_private_dict.txt +7 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/_async_vws_request.py +2 -2
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/_image_utils.py +2 -2
- vws_python-2026.10.9/src/vws/_json_utils.py +90 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/_model_targets.py +27 -16
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/_reco_counts.py +2 -2
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/_vws_request.py +2 -2
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/async_model_target_service.py +4 -3
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/async_query.py +40 -23
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/async_vumark_service.py +7 -8
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/async_vws.py +24 -18
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/exceptions/custom_exceptions.py +1 -1
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/exceptions/model_target_exceptions.py +21 -45
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/exceptions/vws_exceptions.py +13 -14
- vws_python-2026.10.9/src/vws/json_types.py +6 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/model_target_datasets.py +1 -1
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/model_target_service.py +5 -4
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/query.py +35 -15
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/reports.py +132 -57
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/transports.py +203 -9
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/vumark_service.py +7 -8
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/vws.py +27 -19
- vws_python-2026.10.9/src/vws_python.egg-info/PKG-INFO +100 -0
- vws_python-2026.10.9/src/vws_python.egg-info/SOURCES.txt +142 -0
- vws_python-2026.10.9/src/vws_python.egg-info/requires.txt +6 -0
- vws_python-2026.10.9/src/vws_python.egg-info/scm_file_list.json +138 -0
- vws_python-2026.10.9/src/vws_python.egg-info/scm_version.json +8 -0
- vws_python-2026.10.9/styles/snapper/LongProseLine.yml +11 -0
- vws_python-2026.10.9/styles/snapper/SemanticLineBreaks.yml +11 -0
- vws_python-2026.10.9/tests/async_model_targets/__init__.py +1 -0
- vws_python-2026.10.9/tests/async_model_targets/test_authentication.py +143 -0
- vws_python-2026.10.9/tests/async_model_targets/test_datasets.py +350 -0
- vws_python-2026.10.9/tests/async_vws/__init__.py +1 -0
- vws_python-2026.10.9/tests/async_vws/test_configuration.py +40 -0
- vws_python-2026.10.9/tests/async_vws/test_processing.py +77 -0
- vws_python-2026.10.9/tests/async_vws/test_reports.py +281 -0
- vws_python-2026.10.9/tests/async_vws/test_targets.py +297 -0
- vws_python-2026.10.9/tests/async_vws/test_vumark.py +46 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/tests/conftest.py +18 -9
- vws_python-2026.10.9/tests/model_target_credentials.py +6 -0
- vws_python-2026.10.9/tests/model_targets/__init__.py +1 -0
- vws_python-2026.10.9/tests/model_targets/responses.py +34 -0
- vws_python-2026.10.9/tests/model_targets/test_authentication.py +236 -0
- vws_python-2026.10.9/tests/model_targets/test_configuration.py +44 -0
- vws_python-2026.10.9/tests/model_targets/test_datasets.py +445 -0
- vws_python-2026.10.9/tests/model_targets/test_errors.py +84 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/tests/test_async_cloud_reco_exceptions.py +7 -2
- vws_python-2026.10.9/tests/test_async_query.py +257 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/tests/test_async_vws_exceptions.py +8 -3
- {vws_python-2026.8.26 → vws_python-2026.10.9}/tests/test_cloud_reco_exceptions.py +13 -8
- vws_python-2026.10.9/tests/test_query.py +493 -0
- vws_python-2026.10.9/tests/test_reports.py +40 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/tests/test_vws_exceptions.py +38 -18
- vws_python-2026.10.9/tests/transports/__init__.py +1 -0
- vws_python-2026.10.9/tests/transports/test_httpx.py +523 -0
- vws_python-2026.10.9/tests/transports/test_httpx2.py +728 -0
- vws_python-2026.10.9/tests/vws/__init__.py +1 -0
- vws_python-2026.10.9/tests/vws/test_configuration.py +175 -0
- vws_python-2026.10.9/tests/vws/test_processing.py +176 -0
- vws_python-2026.10.9/tests/vws/test_reports.py +354 -0
- vws_python-2026.10.9/tests/vws/test_targets.py +374 -0
- vws_python-2026.10.9/tests/vws/test_vumark.py +33 -0
- vws_python-2026.8.26/CHANGELOG.rst +0 -173
- vws_python-2026.8.26/PKG-INFO +0 -152
- vws_python-2026.8.26/docs/source/changelog.rst +0 -1
- vws_python-2026.8.26/docs/source/unreleased.rst +0 -8
- vws_python-2026.8.26/docs/towncrier_template.rst.jinja +0 -14
- vws_python-2026.8.26/src/vws_python.egg-info/PKG-INFO +0 -152
- vws_python-2026.8.26/src/vws_python.egg-info/SOURCES.txt +0 -82
- vws_python-2026.8.26/src/vws_python.egg-info/requires.txt +0 -58
- vws_python-2026.8.26/src/vws_python.egg-info/scm_file_list.json +0 -78
- vws_python-2026.8.26/src/vws_python.egg-info/scm_version.json +0 -8
- vws_python-2026.8.26/tests/test_async_model_targets.py +0 -505
- vws_python-2026.8.26/tests/test_async_query.py +0 -225
- vws_python-2026.8.26/tests/test_async_vws.py +0 -731
- vws_python-2026.8.26/tests/test_model_targets.py +0 -791
- vws_python-2026.8.26/tests/test_query.py +0 -437
- vws_python-2026.8.26/tests/test_transports.py +0 -407
- vws_python-2026.8.26/tests/test_vws.py +0 -1045
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.git_archival.txt +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.gitattributes +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.github/dependabot.yml +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.github/workflows/dependabot-merge.yml +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.gitignore +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.prettierrc +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.vscode/extensions.json +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/.vscode/settings.json +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/LICENSE +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/docs/source/__init__.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/docs/source/exceptions.rst +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/docs/source/release-process.rst +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/newsfragments/.gitkeep +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/setup.cfg +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/__init__.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/exceptions/__init__.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/exceptions/base_exceptions.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/exceptions/cloud_reco_exceptions.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/include_target_data.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/py.typed +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/response.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws/vumark_accept.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws_python.egg-info/dependency_links.txt +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws_python.egg-info/not-zip-safe +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/src/vws_python.egg-info/top_level.txt +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/tests/__init__.py +0 -0
- {vws_python-2026.8.26 → vws_python-2026.10.9}/zizmor.yml +0 -0
|
@@ -21,10 +21,10 @@ jobs:
|
|
|
21
21
|
persist-credentials: false
|
|
22
22
|
|
|
23
23
|
- name: Install uv
|
|
24
|
-
uses: astral-sh/setup-uv@v10.0
|
|
24
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
25
25
|
|
|
26
26
|
- name: Run fixers
|
|
27
|
-
uses: j178/prek-action@v3.0.
|
|
27
|
+
uses: j178/prek-action@v3.0.1
|
|
28
28
|
with:
|
|
29
29
|
prek-version: 0.4.11
|
|
30
30
|
extra-args: >-
|
|
@@ -28,7 +28,7 @@ jobs:
|
|
|
28
28
|
persist-credentials: false
|
|
29
29
|
|
|
30
30
|
- name: Install uv
|
|
31
|
-
uses: astral-sh/setup-uv@v10.0
|
|
31
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
32
32
|
with:
|
|
33
33
|
enable-cache: true
|
|
34
34
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -37,12 +37,12 @@ jobs:
|
|
|
37
37
|
run: |
|
|
38
38
|
# We run tests against "." and not the tests directory as we test the README
|
|
39
39
|
# and documentation.
|
|
40
|
-
uv run --
|
|
40
|
+
uv run --group=dev --python=${{ matrix.python-version }} pytest -s -vvv . --cov --cov-config=pyproject.toml
|
|
41
41
|
|
|
42
42
|
completion-ci:
|
|
43
43
|
needs: build
|
|
44
44
|
runs-on: ubuntu-latest
|
|
45
|
-
if:
|
|
45
|
+
if: ${{ !cancelled() }} # Run even if one matrix job fails
|
|
46
46
|
steps:
|
|
47
47
|
- name: Check matrix job status
|
|
48
48
|
run: |-
|
|
@@ -29,13 +29,13 @@ jobs:
|
|
|
29
29
|
persist-credentials: false
|
|
30
30
|
|
|
31
31
|
- name: Install uv
|
|
32
|
-
uses: astral-sh/setup-uv@v10.0
|
|
32
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
33
33
|
with:
|
|
34
34
|
enable-cache: true
|
|
35
35
|
cache-dependency-glob: '**/pyproject.toml'
|
|
36
36
|
|
|
37
37
|
- name: Lint
|
|
38
|
-
uses: j178/prek-action@v3.0.
|
|
38
|
+
uses: j178/prek-action@v3.0.1
|
|
39
39
|
with:
|
|
40
40
|
prek-version: 0.4.11
|
|
41
41
|
cache: false
|
|
@@ -48,7 +48,7 @@ jobs:
|
|
|
48
48
|
completion-lint:
|
|
49
49
|
needs: build
|
|
50
50
|
runs-on: ubuntu-latest
|
|
51
|
-
if:
|
|
51
|
+
if: ${{ !cancelled() }} # Run even if one matrix job fails
|
|
52
52
|
steps:
|
|
53
53
|
- name: Check matrix job status
|
|
54
54
|
run: |-
|
|
@@ -33,7 +33,7 @@ jobs:
|
|
|
33
33
|
fetch-depth: 0
|
|
34
34
|
|
|
35
35
|
- name: Install uv
|
|
36
|
-
uses: astral-sh/setup-uv@v10.0
|
|
36
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
37
37
|
with:
|
|
38
38
|
enable-cache: true
|
|
39
39
|
cache-dependency-glob: '**/pyproject.toml'
|
|
@@ -47,33 +47,24 @@ jobs:
|
|
|
47
47
|
env:
|
|
48
48
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
# chatter goes to stderr), so this is the curated release body for
|
|
52
|
-
# this version, not github-tag-action's commit-derived changelog.
|
|
53
|
-
- name: Generate the GitHub release notes
|
|
50
|
+
- name: Assemble native Markdown release notes
|
|
54
51
|
env:
|
|
55
52
|
RELEASE: ${{ steps.calver.outputs.release }}
|
|
56
|
-
run:
|
|
57
|
-
release
|
|
58
|
-
|
|
59
|
-
# Assemble the same fragments into CHANGELOG.rst under a new
|
|
60
|
-
# ``$RELEASE`` section and delete the consumed fragment files.
|
|
61
|
-
- name: Update the changelog
|
|
62
|
-
env:
|
|
63
|
-
RELEASE: ${{ steps.calver.outputs.release }}
|
|
64
|
-
run: uv run --extra=release towncrier build --yes --version "$RELEASE"
|
|
53
|
+
run: |
|
|
54
|
+
uv run --group=release towncrier build --yes --version "$RELEASE"
|
|
55
|
+
cp "docs/source/changelog/$RELEASE.md" release-notes.md
|
|
65
56
|
|
|
66
57
|
- uses: stefanzweifel/git-auto-commit-action@v7
|
|
67
58
|
id: commit
|
|
68
59
|
with:
|
|
69
60
|
commit_message: Bump CHANGELOG
|
|
70
|
-
file_pattern: CHANGELOG.
|
|
61
|
+
file_pattern: CHANGELOG.md docs/source/changelog newsfragments
|
|
71
62
|
# Error if there are no changes.
|
|
72
63
|
skip_dirty_check: true
|
|
73
64
|
|
|
74
65
|
- name: Bump version and push tag
|
|
75
66
|
id: tag_version
|
|
76
|
-
uses: mathieudutour/github-tag-action@
|
|
67
|
+
uses: mathieudutour/github-tag-action@v7
|
|
77
68
|
with:
|
|
78
69
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
79
70
|
custom_tag: ${{ steps.calver.outputs.release }}
|
|
@@ -95,7 +86,7 @@ jobs:
|
|
|
95
86
|
git fetch --tags
|
|
96
87
|
git checkout "$NEW_TAG"
|
|
97
88
|
uv build --sdist --wheel --out-dir dist/
|
|
98
|
-
uv run --
|
|
89
|
+
uv run --group=release check-wheel-contents dist/*.whl
|
|
99
90
|
|
|
100
91
|
- name: Publish distribution 📦 to PyPI
|
|
101
92
|
# We use PyPI trusted publishing rather than a PyPI API token.
|
|
@@ -4,12 +4,12 @@ MinAlertLevel = error
|
|
|
4
4
|
Packages = https://github.com/tbhb/vale-ai-tells/releases/download/v1.29.0/ai-tells.zip
|
|
5
5
|
|
|
6
6
|
[*.{rst,md}]
|
|
7
|
-
BasedOnStyles = ai-tells
|
|
7
|
+
BasedOnStyles = ai-tells, snapper
|
|
8
|
+
snapper.SemanticLineBreaks = error
|
|
8
9
|
|
|
9
10
|
# These rules misclassify established technical, example, or release-note prose
|
|
10
11
|
# in this repository. All other ai-tells rules remain enforced.
|
|
11
12
|
ai-tells.ColonUsage = NO
|
|
12
|
-
ai-tells.FigurativeLands = NO
|
|
13
13
|
ai-tells.FormalTransitions = NO
|
|
14
14
|
ai-tells.OverusedVocabularyVerbs = NO
|
|
15
15
|
ai-tells.VerbTricolon = NO
|
|
@@ -11,19 +11,9 @@ Our Standards
|
|
|
11
11
|
|
|
12
12
|
Examples of behavior that contributes to creating a positive environment include:
|
|
13
13
|
|
|
14
|
-
Using welcoming and inclusive language
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Focusing on what is best for the community
|
|
18
|
-
Showing empathy towards other community members
|
|
19
|
-
Examples of unacceptable behavior by participants include:
|
|
20
|
-
|
|
21
|
-
The use of sexualized language or imagery and unwelcome sexual attention or advances
|
|
22
|
-
Trolling, insulting/derogatory comments, and personal or political attacks
|
|
23
|
-
Public or private harassment
|
|
24
|
-
Publishing others' private information, such as a physical or electronic address, without explicit permission
|
|
25
|
-
Other conduct which could reasonably be considered inappropriate in a professional setting
|
|
26
|
-
Our Responsibilities
|
|
14
|
+
Using welcoming and inclusive language Being respectful of differing viewpoints and experiences Gracefully accepting constructive criticism Focusing on what is best for the community Showing empathy towards other community members Examples of unacceptable behavior by participants include:
|
|
15
|
+
|
|
16
|
+
The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Our Responsibilities
|
|
27
17
|
|
|
28
18
|
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
|
29
19
|
|
|
@@ -32,12 +22,17 @@ Project maintainers have the right and responsibility to remove, edit, or reject
|
|
|
32
22
|
Scope
|
|
33
23
|
-----
|
|
34
24
|
|
|
35
|
-
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
|
|
25
|
+
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
|
|
26
|
+
Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
|
27
|
+
Representation of a project may be further defined and clarified by project maintainers.
|
|
36
28
|
|
|
37
29
|
Enforcement
|
|
38
30
|
-----------
|
|
39
31
|
|
|
40
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at adamdangoor@gmail.com.
|
|
32
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at adamdangoor@gmail.com.
|
|
33
|
+
All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
|
|
34
|
+
The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
|
|
35
|
+
Further details of specific enforcement policies may be posted separately.
|
|
41
36
|
|
|
42
37
|
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
|
43
38
|
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vws-python
|
|
3
|
+
Version: 2026.10.9
|
|
4
|
+
Summary: Interact with the Vuforia Web Services (VWS) API.
|
|
5
|
+
Author-email: Adam Dangoor <adamdangoor@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Documentation, https://vws-python.github.io/vws-python/
|
|
8
|
+
Project-URL: Source, https://github.com/VWS-Python/vws-python
|
|
9
|
+
Keywords: client,vuforia,vws
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: Environment :: Web Environment
|
|
12
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
13
|
+
Classifier: Operating System :: POSIX
|
|
14
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Requires-Python: >=3.14
|
|
17
|
+
Description-Content-Type: text/x-rst
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: beartype>=0.22.9
|
|
20
|
+
Requires-Dist: httpx>=0.28.0
|
|
21
|
+
Requires-Dist: httpx2>=2.12
|
|
22
|
+
Requires-Dist: requests>=2.32.3
|
|
23
|
+
Requires-Dist: urllib3>=2.2.3
|
|
24
|
+
Requires-Dist: vws-auth-tools>=2024.7.12
|
|
25
|
+
Dynamic: license-file
|
|
26
|
+
|
|
27
|
+
|Build Status| |PyPI|
|
|
28
|
+
|
|
29
|
+
vws-python
|
|
30
|
+
==========
|
|
31
|
+
|
|
32
|
+
Python library for the Vuforia Web Services (VWS) API and the Vuforia Web Query API.
|
|
33
|
+
|
|
34
|
+
Installation
|
|
35
|
+
------------
|
|
36
|
+
|
|
37
|
+
.. code-block:: shell
|
|
38
|
+
|
|
39
|
+
pip install vws-python
|
|
40
|
+
|
|
41
|
+
This is tested on Python |minimum-python-version|\+.
|
|
42
|
+
Get in touch with ``adamdangoor@gmail.com`` if you would like to use this with another language.
|
|
43
|
+
|
|
44
|
+
Getting Started
|
|
45
|
+
---------------
|
|
46
|
+
|
|
47
|
+
.. code-block:: python
|
|
48
|
+
|
|
49
|
+
"""Add a target to VWS and then query it."""
|
|
50
|
+
|
|
51
|
+
import os
|
|
52
|
+
import pathlib
|
|
53
|
+
import uuid
|
|
54
|
+
|
|
55
|
+
from vws import VWS, CloudRecoService
|
|
56
|
+
|
|
57
|
+
server_access_key = os.environ["VWS_SERVER_ACCESS_KEY"]
|
|
58
|
+
server_secret_key = os.environ["VWS_SERVER_SECRET_KEY"]
|
|
59
|
+
client_access_key = os.environ["VWS_CLIENT_ACCESS_KEY"]
|
|
60
|
+
client_secret_key = os.environ["VWS_CLIENT_SECRET_KEY"]
|
|
61
|
+
|
|
62
|
+
vws_client = VWS(
|
|
63
|
+
server_access_key=server_access_key,
|
|
64
|
+
server_secret_key=server_secret_key,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
cloud_reco_client = CloudRecoService(
|
|
68
|
+
client_access_key=client_access_key,
|
|
69
|
+
client_secret_key=client_secret_key,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
name = "my_image_name_" + uuid.uuid4().hex
|
|
73
|
+
|
|
74
|
+
image = pathlib.Path("high_quality_image.jpg")
|
|
75
|
+
with image.open(mode="rb") as my_image_file:
|
|
76
|
+
target_id = vws_client.add_target(
|
|
77
|
+
name=name,
|
|
78
|
+
width=1,
|
|
79
|
+
image=my_image_file,
|
|
80
|
+
active_flag=True,
|
|
81
|
+
application_metadata=None,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
vws_client.wait_for_target_processed(target_id=target_id)
|
|
85
|
+
|
|
86
|
+
with image.open(mode="rb") as my_image_file:
|
|
87
|
+
matching_targets = cloud_reco_client.query(image=my_image_file)
|
|
88
|
+
|
|
89
|
+
assert matching_targets[0].target_id == target_id
|
|
90
|
+
|
|
91
|
+
Full Documentation
|
|
92
|
+
------------------
|
|
93
|
+
|
|
94
|
+
See the `full documentation <https://vws-python.github.io/vws-python/>`__.
|
|
95
|
+
|
|
96
|
+
.. |Build Status| image:: https://github.com/VWS-Python/vws-python/actions/workflows/ci.yml/badge.svg?branch=main
|
|
97
|
+
:target: https://github.com/VWS-Python/vws-python/actions
|
|
98
|
+
.. |PyPI| image:: https://badge.fury.io/py/VWS-Python.svg
|
|
99
|
+
:target: https://badge.fury.io/py/VWS-Python
|
|
100
|
+
.. |minimum-python-version| replace:: 3.14
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
vws-python
|
|
4
4
|
==========
|
|
5
5
|
|
|
6
|
-
Python library for the Vuforia Web Services (VWS) API and the Vuforia
|
|
7
|
-
Web Query API.
|
|
6
|
+
Python library for the Vuforia Web Services (VWS) API and the Vuforia Web Query API.
|
|
8
7
|
|
|
9
8
|
Installation
|
|
10
9
|
------------
|
|
@@ -13,9 +12,8 @@ Installation
|
|
|
13
12
|
|
|
14
13
|
pip install vws-python
|
|
15
14
|
|
|
16
|
-
This is tested on Python |minimum-python-version|\+.
|
|
17
|
-
``adamdangoor@gmail.com`` if you would like to use this with another
|
|
18
|
-
language.
|
|
15
|
+
This is tested on Python |minimum-python-version|\+.
|
|
16
|
+
Get in touch with ``adamdangoor@gmail.com`` if you would like to use this with another language.
|
|
19
17
|
|
|
20
18
|
Getting Started
|
|
21
19
|
---------------
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"""Setup for Sybil."""
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
4
5
|
import uuid
|
|
5
|
-
from collections.abc import Generator # noqa: TC003
|
|
6
6
|
from doctest import ELLIPSIS
|
|
7
7
|
from pathlib import Path
|
|
8
|
+
from typing import TYPE_CHECKING
|
|
8
9
|
|
|
9
10
|
import pytest
|
|
10
11
|
from mock_vws import MockVWS
|
|
@@ -16,6 +17,10 @@ from sybil.parsers.rest import (
|
|
|
16
17
|
PythonCodeBlockParser,
|
|
17
18
|
)
|
|
18
19
|
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
import io
|
|
22
|
+
from collections.abc import Generator
|
|
23
|
+
|
|
19
24
|
|
|
20
25
|
@pytest.fixture(name="make_image_file")
|
|
21
26
|
def fixture_make_image_file(
|
|
@@ -28,7 +33,7 @@ def fixture_make_image_file(
|
|
|
28
33
|
"""
|
|
29
34
|
new_image = Path("high_quality_image.jpg")
|
|
30
35
|
buffer = high_quality_image.getvalue()
|
|
31
|
-
new_image.write_bytes(data=buffer)
|
|
36
|
+
_ = new_image.write_bytes(data=buffer)
|
|
32
37
|
yield
|
|
33
38
|
new_image.unlink()
|
|
34
39
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2020.06.19.0
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# 2020.09.07.0
|
|
2
|
+
|
|
3
|
+
- Breaking change: Move exceptions and create base exceptions.
|
|
4
|
+
It is now possible to, for example, catch `vws.exceptions.base_exceptions.VWSException` to catch many of the exceptions raised by the `VWS` client.
|
|
5
|
+
Credit to `@laymonage` for this change.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# 2021.03.28.0
|
|
2
|
+
|
|
3
|
+
- Breaking change: The `vws.exceptions.cloud_reco_exceptions.MatchProcessing` is now `vws.exceptions.custom_exceptions.ActiveMatchingTargetsDeleteProcessing`.
|
|
4
|
+
- Added new exception `vws.exceptions.custom_exceptions.RequestEntityTooLarge`.
|
|
5
|
+
- Add better exception handling when querying a server which does not serve the Vuforia API.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2021.03.28.1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2021.03.28.2
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2023.03.05
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2023.12.26
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# 2023.12.27
|
|
2
|
+
|
|
3
|
+
- Breaking change: The `vws.exceptions.cloud_reco_exceptions.UnknownVWSErrorPossiblyBadName` is now `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName`.
|
|
4
|
+
- `vws.exceptions.custom_exceptions.OopsAnErrorOccurredPossiblyBadName` now has a `response` parameter and attribute.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2024.02.04.1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2024.09.04.1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2024.09.21
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2025.03.10.1
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# 2026.02.15
|
|
2
|
+
|
|
3
|
+
- Add `request_timeout_seconds` parameter to `VWS` and `CloudRecoService`, allowing customization of the request timeout.
|
|
4
|
+
This accepts a float or a `(connect, read)` tuple, matching the `requests` library's timeout interface.
|
|
5
|
+
The default remains 30 seconds.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2026.02.21
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2026.02.22
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2026.02.23
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2026.02.24
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2026.02.25.1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 2026.02.25
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# 2026.08.14
|
|
2
|
+
|
|
3
|
+
- Drop Python 3.13 support, update VWS Python Mock, and test quota and project-state error responses against the mock.
|
|
4
|
+
- Add `QuotaExceededError`, `LicenseCheckFailedError`, and `AuthorizationFailedError` for documented VuMark Generation API result codes.
|
|
5
|
+
- Fix `target_id` on target exceptions when `base_vws_url` includes a path prefix.
|
|
6
|
+
- Retain explicitly provided falsy custom transports instead of replacing them with defaults.
|
|
7
|
+
- Raise a response-carrying `CloudRecoError` when Cloud Query returns a documented empty or non-JSON 4xx response instead of leaking `JSONDecodeError`.
|
|
8
|
+
- Add support for the Model Target Web API.
|
|
9
|
+
`ModelTargetService` and `AsyncModelTargetService` create standard and advanced Model Target datasets, wait for them to be generated, download them and delete them.
|
|
10
|
+
- Map the `ProjectHasNoApiAccess` result code, as spelled in Vuforia's result codes table, to `ProjectHasNoAPIAccessError`.
|
|
11
|
+
The previously mapped `ProjectHasNoAPIAccess` casing, which Vuforia does not document, is no longer mapped.
|
|
12
|
+
- Add support for the Database Reco Counts report.
|
|
13
|
+
`VWS` and `AsyncVWS` take an optional `database_id`, and have new `request_database_reco_counts_report`, `download_reco_counts_report` and `wait_for_reco_counts_report` methods.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# 2026.09.07
|
|
2
|
+
|
|
3
|
+
- Add `HTTPX2Transport` and `AsyncHTTPX2Transport`, which make requests with `httpx2`, the continuation of `httpx` maintained by Pydantic.
|
|
4
|
+
The `requests` and `httpx` transports are unchanged.
|
|
5
|
+
`httpx` and `httpx2` objects are never mixed: the `httpx` transports raise `httpx` exceptions and the `httpx2` transports raise `httpx2` exceptions.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# 2026.10.09 (2026-10-09)
|
|
2
|
+
|
|
3
|
+
## Changes
|
|
4
|
+
|
|
5
|
+
- Cover server errors from synchronous and asynchronous cloud recognition queries. ([#3214](https://github.com/VWS-Python/vws-python/issues/3214))
|
|
6
|
+
- Model test credentials as pairs and name OAuth endpoint metadata precisely, avoiding secret false positives. ([#3215](https://github.com/VWS-Python/vws-python/issues/3215))
|
|
7
|
+
- Remove supported inline type-checking comments by teaching Ruff about runtime-evaluated `beartype` annotations and postponing test annotations. ([#3216](https://github.com/VWS-Python/vws-python/issues/3216))
|
|
8
|
+
- Validate query and Model Target report response values at construction time. ([#3218](https://github.com/VWS-Python/vws-python/issues/3218))
|
|
9
|
+
- Type decoded report response dictionaries as JSON values. ([#3223](https://github.com/VWS-Python/vws-python/issues/3223))
|
|
10
|
+
- Publish native Markdown release notes and use the same notes in documentation where available.
|
|
@@ -17,6 +17,7 @@ project = _pyproject_config.name
|
|
|
17
17
|
author = _pyproject_config.author
|
|
18
18
|
|
|
19
19
|
extensions = [
|
|
20
|
+
"myst_parser",
|
|
20
21
|
"sphinx_copybutton",
|
|
21
22
|
"sphinx.ext.autodoc",
|
|
22
23
|
"sphinx.ext.intersphinx",
|
|
@@ -27,15 +28,15 @@ extensions = [
|
|
|
27
28
|
]
|
|
28
29
|
|
|
29
30
|
# Render the unreleased ``newsfragments/`` entries into
|
|
30
|
-
# ``docs/source/unreleased.
|
|
31
|
+
# ``docs/source/unreleased.md`` so the Sphinx spelling, doc-build and
|
|
31
32
|
# link-checking gates cover the prose before it is assembled into
|
|
32
|
-
#
|
|
33
|
+
# the versioned Markdown notes at release time.
|
|
33
34
|
towncrier_draft_autoversion_mode = "draft"
|
|
34
35
|
towncrier_draft_include_empty = True
|
|
35
36
|
towncrier_draft_working_directory = f"{_pyproject_file.parent}"
|
|
36
37
|
|
|
37
38
|
templates_path = ["_templates"]
|
|
38
|
-
source_suffix = ".rst"
|
|
39
|
+
source_suffix = {".rst": "restructuredtext", ".md": "markdown"}
|
|
39
40
|
master_doc = "index"
|
|
40
41
|
|
|
41
42
|
project_copyright = f"%Y, {author}"
|
|
@@ -12,7 +12,7 @@ Install Python dependencies in a virtual environment.
|
|
|
12
12
|
|
|
13
13
|
.. code-block:: console
|
|
14
14
|
|
|
15
|
-
$ pip install --editable
|
|
15
|
+
$ pip install --editable . --group dev
|
|
16
16
|
|
|
17
17
|
Spell checking requires ``enchant``.
|
|
18
18
|
This can be installed on macOS, for example, with `Homebrew`_:
|
|
@@ -64,7 +64,7 @@ Run the following commands to build and view documentation locally:
|
|
|
64
64
|
|
|
65
65
|
.. code-block:: console
|
|
66
66
|
|
|
67
|
-
$ uv run --
|
|
67
|
+
$ uv run --group=dev sphinx-build -M html docs/source docs/build -W
|
|
68
68
|
$ python -c 'import os, webbrowser; webbrowser.open("file://" + os.path.abspath("docs/build/html/index.html"))'
|
|
69
69
|
|
|
70
70
|
Continuous integration
|
|
@@ -77,3 +77,10 @@ Performing a release
|
|
|
77
77
|
--------------------
|
|
78
78
|
|
|
79
79
|
See :doc:`release-process`.
|
|
80
|
+
|
|
81
|
+
Release notes
|
|
82
|
+
-------------
|
|
83
|
+
|
|
84
|
+
Write user-facing changes as Markdown in ``newsfragments/<issue>.change.md``.
|
|
85
|
+
Towncrier writes one Markdown file per version, used directly for GitHub release notes.
|
|
86
|
+
Invalid fragment names fail release assembly.
|