vgi-python 0.40.0__tar.gz → 0.42.0__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.
- {vgi_python-0.40.0 → vgi_python-0.42.0}/CLAUDE.md +27 -1
- {vgi_python-0.40.0 → vgi_python-0.42.0}/PKG-INFO +2 -2
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/index.md +1 -1
- vgi_python-0.42.0/docs/api/transactor.md +32 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/authentication.md +43 -1
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/catalog-interface.md +38 -4
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/cli.md +1 -1
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/function-patterns.md +9 -6
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/state-storage.md +5 -3
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/shared-storage.md +2 -2
- {vgi_python-0.40.0 → vgi_python-0.42.0}/pyproject.toml +2 -2
- vgi_python-0.42.0/tests/catalog/test_client_load_catalog.py +388 -0
- vgi_python-0.42.0/tests/test_grant_auth.py +290 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/uv.lock +5 -5
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_duckdb.py +3 -3
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/catalog_contents.py +3 -1
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/http_server.py +2 -1
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/identity_fixture.py +7 -1
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/__init__.py +2 -1
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/catalog_mixin.py +165 -6
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/cli_catalog.py +47 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/cli_utils.py +1 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/client.py +1 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/rpc_server.py +56 -3
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/serve.py +73 -2
- vgi_python-0.40.0/docs/api/transactor.md +0 -12
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.dockerignore +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.gitattributes +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.github/workflows/tailnet-integration.yml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.gitignore +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.python-version +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/.vale.ini +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/LICENSE +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/PROTOCOL.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/README.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/RELEASE-RUNBOOK.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/SECURITY.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/ci/README.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/README.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/generate_runtime.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/manifest.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/run_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/conformance/filter-v2/runtime-manifest.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/auth.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/client.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/filters.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/functions.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/http.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/observability.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/storage.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/api/worker.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/assets/video-thumbnail.jpg +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/generator-api.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/global-functions.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/iroh.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/how-to/tailnet.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/index.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/metadata.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/protocol/index.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/robots.txt +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/batch_index_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/cache_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/copy_format_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/identity.png +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/mkdocs.yml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/scripts/hosted_protocols_conformance.sh +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/scripts/regen_generated.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/test-data/generate.sh +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/_hosted_protocols_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_attach_option.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_catalog_contents.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_aggregate_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_batch_metadata_callback.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_bind_and_join_keys.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_copy_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_http_response_budget.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_iroh_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_scan_branches_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_split_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_stop_force.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_table_column_statistics.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_time_travel_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_splits.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/conftest.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/bad_version.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/generate.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/manifest.json +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/truncated.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table/test_wide_columns.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/test_blended_exchange.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/table_in_out/test_table_buffering_empty_input.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/tailnet/Dockerfile +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/tailnet/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/tailnet/compose.yaml +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/tailnet/probe.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/tailnet/run.sh +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/tailnet/test_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/tailnet/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_auth.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_call_state_attach.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_client_oauth.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_codegen_request_inventory.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_dynamic_filter_http_turns.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_filter_v2.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_filter_v2_builder.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_filter_v2_spec_schema.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_fixture_catalog_parity.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_function_shape_mismatch.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_cpp_protocol_name.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_csharp.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_go_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_java_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_java_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_rust_request_builders.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_rust_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_rust_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_generated_ts_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_hosted_protocols.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_import_side_effects.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_landing_discovery.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_launch_transport.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_otel.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_schema_paths_v2.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_schema_scoped_functions.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_serve.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_signing_key.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_split_token.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_subprocess_transport.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_wire_record_schema_parity.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/test_write_results.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/global_functions.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/secret_cache.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/splits.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table/wide.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/arguments.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/attach_header.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/auth.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/cache_control.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/aggregate.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/client/errors.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_protocol_name.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/csharp_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/csharp_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/go_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/java_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/java_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/rust_request_builders.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/rust_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/rust_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/codegen/ts_types.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/filter_v2.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/filter_v2_builder.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/http/vgi-client.js +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/invocation.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/metadata.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/otel.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/profiling.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/protocol.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/py.typed +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/schema_path.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/split_token.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/table_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/worker.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/vgi/write_results.py +0 -0
- {vgi_python-0.40.0 → vgi_python-0.42.0}/wrangler.jsonc +0 -0
|
@@ -297,6 +297,7 @@ vgi-client --input data.parquet --function sum_all_columns --worker vgi-fixture-
|
|
|
297
297
|
| `VGI_OAUTH_DEVICE_CODE_CLIENT_ID` | Client ID for device-code flow (optional, URL-safe chars only) |
|
|
298
298
|
| `VGI_OAUTH_DEVICE_CODE_CLIENT_SECRET` | Client secret for device-code flow (optional, URL-safe chars only) |
|
|
299
299
|
| `VGI_OAUTH_USE_ID_TOKEN` | When `1`/`true`/`yes`, clients use OIDC `id_token` as Bearer instead of `access_token` |
|
|
300
|
+
| `VGI_RPC_GRANT_KEYS` | Comma-separated base64 32-byte sealed-grant keys (first mints, all verify); enables grants as HTTP bearers. Also `VGI_RPC_GRANT_AUDIENCE`, `VGI_RPC_GRANT_MAX_TTL_SECONDS` |
|
|
300
301
|
| `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `vgi_rpc.Identity.v1`'s `introspect_token`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
|
|
301
302
|
| `VGI_WORKER_ACCESS_LOG_SAMPLE` | Fraction of *successful* calls to keep in the access log, `0.0`–`1.0`. Errors are always kept; the decision is per call, so every record of one stream shares a fate |
|
|
302
303
|
| `VGI_WORKER_ACCESS_LOG_ASYNC` | When `1`/`true`/`yes`, emit access-log records from a listener thread. Bounded queue; full means drop, and a crash loses whatever is queued |
|
|
@@ -484,6 +485,24 @@ sidecar outage raised as one is read as "not my credential, try the next" and
|
|
|
484
485
|
ends up a 401 from the end of the chain, restarting every session in the fleet
|
|
485
486
|
over a thirty-second blip.
|
|
486
487
|
|
|
488
|
+
### Grants and `resolve_token` as HTTP Bearers
|
|
489
|
+
|
|
490
|
+
With `VGI_RPC_GRANT_KEYS` (or `vgi-serve --grant-key`) set, the HTTP worker
|
|
491
|
+
hosts Identity even without hooks. It mints sealed `vgig1.` grants through
|
|
492
|
+
`issue_grant`, unless the worker overrides `mint_grant`, and accepts them back
|
|
493
|
+
as `Authorization: Bearer` credentials, authenticated as the grant's owner. A
|
|
494
|
+
worker that overrides `resolve_token` also has it consulted for bearers. The
|
|
495
|
+
order is the deployment's authenticator, then grants, then `resolve_token`. A
|
|
496
|
+
bad `vgig1.` token is a 401 and never reaches `resolve_token`. vgi-rpc composes
|
|
497
|
+
this in `make_wsgi_app`. vgi-python resolves the keys in
|
|
498
|
+
`vgi.rpc_server.resolve_grant_keys` and passes them explicitly to `RpcServer`
|
|
499
|
+
(`None` off HTTP, never vgi-rpc's `"env"` default), so grants stay HTTP-only. It
|
|
500
|
+
also puts the bearers *inside* VGI's proxy-proof gate
|
|
501
|
+
(`serve._compose_identity_bearer`), because vgi-rpc refuses to OR them beside
|
|
502
|
+
one. Allowlist rules are unchanged. See `docs/authentication.md` and
|
|
503
|
+
`tests/test_grant_auth.py`, which also runs the shared
|
|
504
|
+
`grant_token_vectors.json` through `create_app`.
|
|
505
|
+
|
|
487
506
|
### Hosting Additional Protocols (`hosted_protocols`)
|
|
488
507
|
|
|
489
508
|
Every transport (stdio, unix/named pipe, TCP, Iroh, HTTP) builds its `RpcServer`
|
|
@@ -643,7 +662,14 @@ The worker validates paths, orders parents first and enforces the etag rules
|
|
|
643
662
|
`catalog_contents_attach_independent` (with `catalog_version_frozen`, the worker
|
|
644
663
|
caches the serialized response per catalog version; `ReadOnlyCatalogInterface`
|
|
645
664
|
sets it). Fixture catalogs: `vgi/_test_fixtures/catalog_contents.py`
|
|
646
|
-
(`contents_probe/broken/legacy/memory/reval/hash`).
|
|
665
|
+
(`contents_probe/broken/legacy/memory/reval/hash`). Every SDK's fixture worker
|
|
666
|
+
serves the same six catalogs: the extension's five `catalog_contents*.test` files
|
|
667
|
+
run against all of them (no `VGI_CATALOG_CONTENTS_WORKER` gate any more), so these
|
|
668
|
+
semantics are the cross-SDK contract. Client side, `Client.load_catalog(attach=,
|
|
669
|
+
previous=)` is the whole-catalog enumeration: `catalog_contents` only when
|
|
670
|
+
advertised, per-schema fallback on failure / in a transaction, `if_none_match`
|
|
671
|
+
revalidation via `previous` (`tests/catalog/test_client_load_catalog.py`). See
|
|
672
|
+
`docs/catalog-interface.md`.
|
|
647
673
|
|
|
648
674
|
## Additional Documentation
|
|
649
675
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.42.0
|
|
4
4
|
Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
|
|
5
5
|
Project-URL: Homepage, https://query.farm
|
|
6
6
|
Project-URL: Repository, https://github.com/Query-farm/vgi-python
|
|
@@ -162,7 +162,7 @@ Requires-Dist: httpx2>=2.12.0
|
|
|
162
162
|
Requires-Dist: platformdirs
|
|
163
163
|
Requires-Dist: pyarrow
|
|
164
164
|
Requires-Dist: typer>=0.9
|
|
165
|
-
Requires-Dist: vgi-rpc>=0.
|
|
165
|
+
Requires-Dist: vgi-rpc>=0.49.0
|
|
166
166
|
Provides-Extra: azure
|
|
167
167
|
Requires-Dist: azure-identity>=1.16.0; extra == 'azure'
|
|
168
168
|
Requires-Dist: pymssql>=2.3.0; extra == 'azure'
|
|
@@ -32,7 +32,7 @@ added incrementally.
|
|
|
32
32
|
| [Auth & Secrets](auth.md) | `AuthContext`, `CallContext`, bearer/JWT authenticators, secret protocol | HTTP: `[http]`; JWT: `[oauth]` |
|
|
33
33
|
| [Observability](observability.md) | OpenTelemetry tracing, worker logging configuration | `[otel]` for tracing |
|
|
34
34
|
| [HTTP](http.md) | Worker page, blob storage, request-size middleware | `pip install vgi-python[http]` |
|
|
35
|
-
| [Transactor](transactor.md) | `TransactorClient`, `TransactorProtocol` | `
|
|
35
|
+
| [Transactor](transactor.md) | `TransactorClient`, `TransactorProtocol` | `[transactor]` extra and a [compatible engine build](transactor.md#runtime-requirements) |
|
|
36
36
|
| [Exceptions](exceptions.md) | VGI exception types | — |
|
|
37
37
|
|
|
38
38
|
## Import Convention
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Transactor
|
|
2
|
+
|
|
3
|
+
!!! note "Advanced — reference only"
|
|
4
|
+
The transactor is an advanced feature without a dedicated how-to guide yet. This page is the
|
|
5
|
+
API reference; start from the [tutorial](../tutorial/index.md) and
|
|
6
|
+
[function patterns](../how-to/function-patterns.md) if you're new to VGI.
|
|
7
|
+
|
|
8
|
+
The transactor is a long-lived subprocess that gives worker functions transactional access to a
|
|
9
|
+
database, mediated by `TransactorClient` over the `TransactorProtocol`.
|
|
10
|
+
|
|
11
|
+
## Runtime requirements
|
|
12
|
+
|
|
13
|
+
The bundled transactor requires both:
|
|
14
|
+
|
|
15
|
+
- `pip install 'vgi-python[transactor]'` for its Python dependencies.
|
|
16
|
+
- A VGI fork build of `duckdb-python` providing `DuckDBPyConnection.subcursor()`,
|
|
17
|
+
which lets reads share an open write transaction. This extension has not yet
|
|
18
|
+
been merged into Haybarn or upstream DuckDB; installing the extra alone is
|
|
19
|
+
insufficient.
|
|
20
|
+
|
|
21
|
+
Engine resolution prefers `haybarn` when installed, then falls back to `duckdb`.
|
|
22
|
+
Use an environment where the selected engine provides `subcursor()`; installing
|
|
23
|
+
a compatible `duckdb` build alongside an incompatible `haybarn` installation
|
|
24
|
+
does not override that preference.
|
|
25
|
+
|
|
26
|
+
These requirements apply to the bundled transactor. Workers can implement
|
|
27
|
+
[table writes](../catalog-interface.md#table-writes-and-indexes) against their own
|
|
28
|
+
backing data sources without using it.
|
|
29
|
+
|
|
30
|
+
## API
|
|
31
|
+
|
|
32
|
+
::: vgi.transactor
|
|
@@ -24,7 +24,7 @@ the principal in the `AuthContext` available to functions.
|
|
|
24
24
|
| Variable | Description |
|
|
25
25
|
|----------|-------------|
|
|
26
26
|
| `VGI_BEARER_TOKENS` | Comma-separated `token=principal` pairs for static bearer auth |
|
|
27
|
-
| `VGI_JWT_ISSUER` | JWT issuer URL (requires `vgi[oauth]` extra) |
|
|
27
|
+
| `VGI_JWT_ISSUER` | JWT issuer URL (requires `vgi-python[oauth]` extra) |
|
|
28
28
|
| `VGI_JWT_AUDIENCE` | JWT audience string, comma-separated for multiple audiences (required when `VGI_JWT_ISSUER` is set) |
|
|
29
29
|
| `VGI_JWT_JWKS_URI` | JWKS endpoint URL (auto-discovered from issuer if omitted) |
|
|
30
30
|
| `VGI_OAUTH_RESOURCE` | OAuth resource URL for RFC 9728 metadata |
|
|
@@ -39,6 +39,48 @@ When both `VGI_BEARER_TOKENS` and `VGI_JWT_ISSUER` are set, they are
|
|
|
39
39
|
chained — JWT validation is attempted first, falling back to bearer token
|
|
40
40
|
lookup.
|
|
41
41
|
|
|
42
|
+
## Grants and resolved tokens as bearer credentials
|
|
43
|
+
|
|
44
|
+
`vgi_rpc.Identity.v1`'s `issue_grant` mints a standing credential that
|
|
45
|
+
unattended automation later presents as an ordinary bearer. Over HTTP the
|
|
46
|
+
worker accepts two kinds of identity credential after the deployment's own
|
|
47
|
+
authenticator:
|
|
48
|
+
|
|
49
|
+
1. **Sealed grants** (opt-in). Set `VGI_RPC_GRANT_KEYS` (or
|
|
50
|
+
`vgi-serve --http --grant-key KEY`, repeatable). `issue_grant` then mints a
|
|
51
|
+
`vgig1.` grant sealed with the first key, unless the worker overrides
|
|
52
|
+
`mint_grant`. Every key verifies, so to rotate you add the new key first and
|
|
53
|
+
drop the old one once its grants have expired. A request carrying
|
|
54
|
+
`Authorization: Bearer vgig1.…` is authenticated as the grant's owner, with
|
|
55
|
+
`domain="grant"` and claims `grant_id`, `scopes` and `purpose`. The claims
|
|
56
|
+
carry no `auth_time`, so a grant cannot mint another grant.
|
|
57
|
+
2. **`resolve_token`**. A worker that overrides
|
|
58
|
+
[`Worker.resolve_token`][vgi.worker.Worker.resolve_token] has it consulted
|
|
59
|
+
for any other bearer, with `domain="token"`. `None` means the credential is
|
|
60
|
+
unknown, which is a 401 unless something else accepts it.
|
|
61
|
+
`AuthUnavailableError` is a 503 with the hook's `Retry-After`.
|
|
62
|
+
|
|
63
|
+
The order is the deployment's authenticator (JWT, static bearer), then sealed
|
|
64
|
+
grants, then `resolve_token`. A `vgig1.` token that does not verify is a 401
|
|
65
|
+
that stops the chain: it never reaches `resolve_token`. A JWS-shaped token or
|
|
66
|
+
one over 4096 bytes never reaches the hook either. Your own `authenticate`
|
|
67
|
+
callback must raise `ValueError` for a credential it does not recognise, so the
|
|
68
|
+
chain moves on. One that answers anonymous for every request ends the chain
|
|
69
|
+
before grants are checked. With no authenticator configured, a request with no
|
|
70
|
+
`Authorization` header stays anonymous as before.
|
|
71
|
+
|
|
72
|
+
| Variable | Description |
|
|
73
|
+
|----------|-------------|
|
|
74
|
+
| `VGI_RPC_GRANT_KEYS` | Comma-separated standard-base64 keys, 32 bytes each. The first mints and all verify. Unset means grants are off. A malformed key stops startup |
|
|
75
|
+
| `VGI_RPC_GRANT_AUDIENCE` | Bound into every grant, so two deployments that share a key still reject each other's grants |
|
|
76
|
+
| `VGI_RPC_GRANT_MAX_TTL_SECONDS` | Ceiling on a grant's lifetime (default 7 days) |
|
|
77
|
+
|
|
78
|
+
The startup rules are unchanged. Overriding `resolve_token` still requires
|
|
79
|
+
`VGI_INTROSPECT_PRINCIPALS`. Grant keys alone need no allowlist, because
|
|
80
|
+
minting answers only for the caller. Grants and `resolve_token` bearers are
|
|
81
|
+
HTTP-only, like the rest of Identity. When `VGI_PROXY_PROOF_MODE` is on, both
|
|
82
|
+
are accepted only *inside* the proxy-proof gate, never as an alternative to it.
|
|
83
|
+
|
|
42
84
|
## Programmatic API
|
|
43
85
|
|
|
44
86
|
```python test="skip"
|
|
@@ -697,6 +697,14 @@ for obj in client.schema_contents(attach_opaque_data=attach_opaque_data, path=["
|
|
|
697
697
|
elif isinstance(obj, FunctionInfo):
|
|
698
698
|
print(f"Function: {obj.name}")
|
|
699
699
|
|
|
700
|
+
# Or load the whole catalog at once. Uses one catalog_contents RPC when the
|
|
701
|
+
# attach result advertises supports_catalog_contents, else the per-schema RPCs.
|
|
702
|
+
snapshot = client.load_catalog(attach=result)
|
|
703
|
+
for entry in snapshot.schemas:
|
|
704
|
+
print(entry.schema.path, [t.name for t in entry.tables])
|
|
705
|
+
# Later: revalidate. A not_modified answer returns the same content cheaply.
|
|
706
|
+
snapshot = client.load_catalog(attach=result, previous=snapshot)
|
|
707
|
+
|
|
700
708
|
# Get only scalar functions using type filter
|
|
701
709
|
from vgi.catalog import SchemaObjectType
|
|
702
710
|
for obj in client.schema_contents(
|
|
@@ -723,7 +731,8 @@ client.catalog_detach(attach_opaque_data=attach_opaque_data)
|
|
|
723
731
|
| `schema_create()` | Create a schema |
|
|
724
732
|
| `schema_drop()` | Drop a schema |
|
|
725
733
|
| `schema_contents()` | List schema contents (optional `type` filter) |
|
|
726
|
-
| `
|
|
734
|
+
| `load_catalog()` | Load the whole catalog: one `catalog_contents` call when the attach advertises it, else (or on failure, or inside a transaction) `catalog_schemas` + the per-schema RPCs; pass `previous=` to revalidate with `if_none_match` |
|
|
735
|
+
| `contents()` | The raw `catalog_contents` RPC (only valid when advertised; `if_none_match` revalidates) |
|
|
727
736
|
| `table_get()` | Get table info |
|
|
728
737
|
| `table_create()` | Create a table |
|
|
729
738
|
| `table_drop()` | Drop a table |
|
|
@@ -935,7 +944,7 @@ if __name__ == "__main__":
|
|
|
935
944
|
|
|
936
945
|
---
|
|
937
946
|
|
|
938
|
-
##
|
|
947
|
+
## Catalog capabilities and limitations { #api-limitations }
|
|
939
948
|
|
|
940
949
|
The current CatalogInterface has the following limitations:
|
|
941
950
|
|
|
@@ -943,8 +952,33 @@ The current CatalogInterface has the following limitations:
|
|
|
943
952
|
- **Tags**: Cannot be updated after object creation
|
|
944
953
|
- **Schema metadata**: Comments and tags cannot be updated on schemas
|
|
945
954
|
- **Constraints**: Only NOT NULL can be added/dropped (no ALTER for UNIQUE/CHECK)
|
|
946
|
-
|
|
947
|
-
|
|
955
|
+
|
|
956
|
+
### Table writes and indexes
|
|
957
|
+
|
|
958
|
+
`INSERT`, `UPDATE`, and `DELETE` are supported when the catalog supplies a write
|
|
959
|
+
function for the operation. For declarative catalogs, configure the
|
|
960
|
+
[`Table`][vgi.catalog.descriptors.Table] descriptor:
|
|
961
|
+
|
|
962
|
+
| Operation | Descriptor field | Requirement |
|
|
963
|
+
|-----------|------------------|-------------|
|
|
964
|
+
| `INSERT` | `insert_function` | A `TableInOutGenerator` that accepts rows to insert |
|
|
965
|
+
| `UPDATE` | `update_function` | A write function and a scan `function` that provides row IDs |
|
|
966
|
+
| `DELETE` | `delete_function` | A write function and a scan `function` that provides row IDs |
|
|
967
|
+
|
|
968
|
+
Each field defaults to `None`, which leaves that operation unsupported. Custom
|
|
969
|
+
catalogs implement `table_insert_function_get()`, `table_update_function_get()`,
|
|
970
|
+
or `table_delete_function_get()` to return the corresponding `ScanFunctionResult`.
|
|
971
|
+
The worker's write functions implement the changes to the backing data source;
|
|
972
|
+
declaring a table alone does not make it writable.
|
|
973
|
+
|
|
974
|
+
`ReadOnlyCatalogInterface` rejects catalog DDL, but can expose these write functions
|
|
975
|
+
on declarative tables. Table writes do not require the bundled
|
|
976
|
+
[transactor](api/transactor.md); that is an optional database-access service with
|
|
977
|
+
additional engine requirements.
|
|
978
|
+
|
|
979
|
+
Index metadata can be declared with [`Index`][vgi.catalog.descriptors.Index]. Custom
|
|
980
|
+
catalogs can implement `index_get()`, `index_create()`, and `index_drop()`; support
|
|
981
|
+
depends on the catalog implementation and backing data source.
|
|
948
982
|
|
|
949
983
|
---
|
|
950
984
|
|
|
@@ -545,7 +545,7 @@ vgi-fixture-worker --log-format json
|
|
|
545
545
|
| `VGI_QUIET=1` | Suppress the interactive-terminal startup warning (same as `--quiet`) |
|
|
546
546
|
| `VGI_FILTER_DEBUG=1` | Enable filter pushdown debug logging |
|
|
547
547
|
| `VGI_BEARER_TOKENS` | Comma-separated `token=principal` pairs for static bearer auth (HTTP only) |
|
|
548
|
-
| `VGI_JWT_ISSUER` | JWT issuer URL for JWT/JWKS auth (requires `vgi[oauth]` extra) |
|
|
548
|
+
| `VGI_JWT_ISSUER` | JWT issuer URL for JWT/JWKS auth (requires `vgi-python[oauth]` extra) |
|
|
549
549
|
| `VGI_JWT_AUDIENCE` | JWT audience string, comma-separated for multiple audiences (required when `VGI_JWT_ISSUER` is set) |
|
|
550
550
|
| `VGI_JWT_JWKS_URI` | JWKS endpoint URL (auto-discovered if omitted) |
|
|
551
551
|
| `VGI_OAUTH_RESOURCE` | OAuth resource URL for RFC 9728 metadata |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "How to write each of the
|
|
2
|
+
description: "How to write each of the five VGI function patterns: scalar, table, table-in-out, aggregate, and buffering — with a complete runnable worker for each."
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# Function patterns
|
|
@@ -178,11 +178,14 @@ ATTACH 'aggregates' (TYPE vgi, LOCATION 'uv run sum_worker.py');
|
|
|
178
178
|
SELECT category, aggregates.vgi_sum(value) FROM t GROUP BY category;
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
??? info "State must be
|
|
182
|
-
Table generators and aggregates keep state between calls.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
181
|
+
??? info "State must be serializable"
|
|
182
|
+
Table generators and aggregates keep state between calls. A state type must provide
|
|
183
|
+
`serialize_to_bytes()` and `deserialize_from_bytes()` so the framework can carry it across
|
|
184
|
+
HTTP round-trips or persist it between aggregate calls. `ArrowSerializableDataclass`
|
|
185
|
+
implements these methods for you and is the usual starting point. Custom state types can
|
|
186
|
+
implement the same [`StreamStateCodec`][vgi.function.StreamStateCodec] contract without
|
|
187
|
+
inheriting from `ArrowSerializableDataclass`. See
|
|
188
|
+
[State Class](../aggregate-functions.md#state-class) for both approaches.
|
|
186
189
|
|
|
187
190
|
## Buffering
|
|
188
191
|
|
|
@@ -22,9 +22,11 @@ function that coordinates partial results across workers.
|
|
|
22
22
|
|
|
23
23
|
## Two kinds of "state" — don't confuse them
|
|
24
24
|
|
|
25
|
-
- **Generator cursor state** — the small
|
|
26
|
-
*within one scan* (see [streaming with state](function-patterns.md#streaming-with-state)).
|
|
27
|
-
|
|
25
|
+
- **Generator cursor state** — the small serializable object a table generator keeps
|
|
26
|
+
*within one scan* (see [streaming with state](function-patterns.md#streaming-with-state)).
|
|
27
|
+
Over HTTP, the framework serializes it between requests. `ArrowSerializableDataclass`
|
|
28
|
+
supplies the serialization methods; custom types can implement
|
|
29
|
+
[`StreamStateCodec`][vgi.function.StreamStateCodec] instead.
|
|
28
30
|
- **Shared storage** (this page) — state that must outlive a single call or be shared across
|
|
29
31
|
**separate worker processes**, e.g. combining partial aggregate results. This is backed by a
|
|
30
32
|
pluggable store.
|
|
@@ -10,7 +10,7 @@ variable.
|
|
|
10
10
|
| Backend | Value | Use Case | Dependencies |
|
|
11
11
|
|---------|-------|----------|-------------|
|
|
12
12
|
| SQLite | `sqlite` (default) | Local / subprocess transport | None (stdlib) |
|
|
13
|
-
| Azure SQL | `azure-sql` | Azure cloud deployments | `vgi[azure]` |
|
|
13
|
+
| Azure SQL | `azure-sql` | Azure cloud deployments | `vgi-python[azure]` |
|
|
14
14
|
| Cloudflare DO | `cloudflare-do` | Edge / multi-cloud deployments | None (stdlib) |
|
|
15
15
|
|
|
16
16
|
## SQLite (Default)
|
|
@@ -36,7 +36,7 @@ workers run on separate hosts.
|
|
|
36
36
|
1. Install the Azure extra:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
pip install vgi[azure]
|
|
39
|
+
pip install 'vgi-python[azure]'
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
2. Create an Azure SQL Database (Serverless recommended for cost):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vgi-python"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.42.0"
|
|
4
4
|
description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
keywords = [
|
|
@@ -40,7 +40,7 @@ dependencies = [
|
|
|
40
40
|
"pyarrow",
|
|
41
41
|
"typer>=0.9",
|
|
42
42
|
"platformdirs",
|
|
43
|
-
"vgi-rpc>=0.
|
|
43
|
+
"vgi-rpc>=0.49.0",
|
|
44
44
|
"httpx2>=2.12.0",
|
|
45
45
|
]
|
|
46
46
|
|