vgi-python 0.36.2__tar.gz → 0.37.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.36.2 → vgi_python-0.37.0}/PKG-INFO +1 -1
- {vgi_python-0.36.2 → vgi_python-0.37.0}/pyproject.toml +1 -1
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_serve.py +157 -1
- {vgi_python-0.36.2 → vgi_python-0.37.0}/uv.lock +1 -1
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/auth.py +12 -3
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/serve.py +15 -7
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/worker.py +75 -1
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.dockerignore +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.gitattributes +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.github/workflows/tailnet-integration.yml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.gitignore +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.python-version +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/.vale.ini +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/CLAUDE.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/LICENSE +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/PROTOCOL.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/README.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/RELEASE-RUNBOOK.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/SECURITY.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/ci/README.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/README.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/generate_runtime.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/manifest.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/run_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime-manifest.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/auth.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/client.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/filters.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/functions.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/http.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/index.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/observability.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/storage.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/api/worker.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/authentication.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/catalog-interface.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/cli.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/generator-api.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/global-functions.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/iroh.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/how-to/tailnet.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/index.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/metadata.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/protocol/index.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/robots.txt +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/batch_index_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/cache_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/copy_format_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/identity.png +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/mkdocs.yml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/scripts/regen_generated.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/test-data/generate.sh +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_attach_option.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_aggregate_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_batch_metadata_callback.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_bind_and_join_keys.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_copy_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_http_response_budget.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_iroh_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_scan_branches_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_split_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_stop_force.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_table_column_statistics.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_time_travel_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_splits.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/conftest.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/bad_version.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/generate.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/manifest.json +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/truncated.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table/test_wide_columns.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/test_blended_exchange.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/tailnet/Dockerfile +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/tailnet/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/tailnet/compose.yaml +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/tailnet/probe.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/tailnet/run.sh +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/tailnet/test_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/tailnet/worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_auth.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_call_state_attach.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_client_oauth.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_codegen_request_inventory.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_dynamic_filter_http_turns.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_filter_v2.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_filter_v2_builder.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_filter_v2_spec_schema.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_fixture_catalog_parity.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_function_shape_mismatch.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_cpp_protocol_name.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_java_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_rust_request_builders.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_rust_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_import_side_effects.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_launch_transport.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_otel.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_schema_paths_v2.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_schema_scoped_functions.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_signing_key.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_split_token.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_subprocess_transport.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_wire_record_schema_parity.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/test_write_results.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/global_functions.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/splits.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table/wide.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/arguments.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/attach_header.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/cache_control.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/catalog_interface.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/aggregate.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/client/errors.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_protocol_name.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/java_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/rust_request_builders.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/rust_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/filter_v2.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/filter_v2_builder.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/http/vgi-client.js +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/invocation.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/metadata.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/otel.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/profiling.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/protocol.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/py.typed +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/schema_path.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/split_token.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/table_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/vgi/write_results.py +0 -0
- {vgi_python-0.36.2 → vgi_python-0.37.0}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.37.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
|
|
@@ -24,7 +24,7 @@ from vgi_rpc import (
|
|
|
24
24
|
from vgi_rpc.rpc import AuthContext, PeerResolutionContext, peer_identity_primary
|
|
25
25
|
|
|
26
26
|
from vgi.arguments import Arguments, Auth, Param, Returns
|
|
27
|
-
from vgi.auth import TokenIdentity
|
|
27
|
+
from vgi.auth import IssuedGrant, TokenIdentity
|
|
28
28
|
from vgi.client import Client
|
|
29
29
|
from vgi.scalar_function import ScalarFunction
|
|
30
30
|
from vgi.serve import (
|
|
@@ -486,6 +486,32 @@ class _IntrospectingWorker(Worker):
|
|
|
486
486
|
return None
|
|
487
487
|
|
|
488
488
|
|
|
489
|
+
class _MintingWorker(Worker):
|
|
490
|
+
"""Worker that implements only the optional grant-minting hook."""
|
|
491
|
+
|
|
492
|
+
functions = [_DoubleFunc]
|
|
493
|
+
|
|
494
|
+
@classmethod
|
|
495
|
+
def mint_grant(cls, principal: str, purpose: str, scopes: list[str], ttl_seconds: int) -> IssuedGrant:
|
|
496
|
+
# A sealed self-contained credential: the worker owns the format and
|
|
497
|
+
# the framework never parses it. Capped TTL, to pin that a worker may
|
|
498
|
+
# issue SHORTER than asked.
|
|
499
|
+
ttl = min(ttl_seconds, 3600)
|
|
500
|
+
return IssuedGrant(
|
|
501
|
+
token=f"sealed:{principal}:{':'.join(scopes)}:{purpose}",
|
|
502
|
+
expires_at=1_000_000.0 + ttl,
|
|
503
|
+
grant_id="grant-1",
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
class _BothWorker(_IntrospectingWorker):
|
|
508
|
+
"""Worker that both resolves credentials and mints grants."""
|
|
509
|
+
|
|
510
|
+
@classmethod
|
|
511
|
+
def mint_grant(cls, principal: str, purpose: str, scopes: list[str], ttl_seconds: int) -> IssuedGrant:
|
|
512
|
+
return IssuedGrant(token=f"sealed:{principal}", expires_at=1_000_000.0, grant_id="g")
|
|
513
|
+
|
|
514
|
+
|
|
489
515
|
class TestIntrospectResolverDetection:
|
|
490
516
|
"""``resolve_token`` presence is detected by override, not by a flag."""
|
|
491
517
|
|
|
@@ -516,6 +542,31 @@ def _introspector_ctx(principal: str) -> object:
|
|
|
516
542
|
)
|
|
517
543
|
|
|
518
544
|
|
|
545
|
+
def _minting_ctx(principal: str, *, auth_age_s: float = 0.0) -> object:
|
|
546
|
+
"""Build a ``CallContext`` for a caller who authenticated *auth_age_s* ago.
|
|
547
|
+
|
|
548
|
+
Minting reads ``auth_time`` off the credential's claims, and a credential
|
|
549
|
+
without one cannot mint at all. That single rule is what stops a grant
|
|
550
|
+
minting another grant — a grant is not IdP-issued, so it carries no
|
|
551
|
+
``auth_time`` — and what makes a static bearer token, which proves a
|
|
552
|
+
machine holds a secret rather than that a human just authenticated,
|
|
553
|
+
fail closed here.
|
|
554
|
+
"""
|
|
555
|
+
import time
|
|
556
|
+
|
|
557
|
+
from vgi_rpc.rpc import AuthContext, CallContext
|
|
558
|
+
|
|
559
|
+
return CallContext(
|
|
560
|
+
auth=AuthContext(
|
|
561
|
+
domain="test",
|
|
562
|
+
authenticated=True,
|
|
563
|
+
principal=principal,
|
|
564
|
+
claims={"auth_time": time.time() - auth_age_s},
|
|
565
|
+
),
|
|
566
|
+
emit_client_log=lambda *a, **k: None,
|
|
567
|
+
)
|
|
568
|
+
|
|
569
|
+
|
|
519
570
|
def _hosted_protocols(worker_cls: type[Worker]) -> frozenset[str]:
|
|
520
571
|
"""Return the protocol names the server built for *worker_cls* hosts.
|
|
521
572
|
|
|
@@ -655,6 +706,111 @@ class TestTokenIntrospection:
|
|
|
655
706
|
create_app(_IntrospectingWorker, prefix="/vgi", describe=False)
|
|
656
707
|
|
|
657
708
|
|
|
709
|
+
class TestGrantMinting:
|
|
710
|
+
"""``issue_grant`` — the other half of ``vgi_rpc.Identity.v1``.
|
|
711
|
+
|
|
712
|
+
Guarded very differently from ``introspect_token``, and deliberately so.
|
|
713
|
+
Introspection answers a question about *somebody else's* credential, so it
|
|
714
|
+
needs an allowlist. Minting produces a credential for the *caller* — there
|
|
715
|
+
is no subject on the wire, so cross-subject minting is closed by
|
|
716
|
+
construction and no allowlist applies. What this repo owns is the wiring:
|
|
717
|
+
a ``mint_grant`` override becomes an ``IdentityImpl`` that offers the
|
|
718
|
+
method, and a worker that never wrote one does not host it.
|
|
719
|
+
"""
|
|
720
|
+
|
|
721
|
+
@staticmethod
|
|
722
|
+
def _identity(worker_cls: type[Worker], **env: str) -> object:
|
|
723
|
+
from vgi.serve import _build_identity
|
|
724
|
+
|
|
725
|
+
with pytest.MonkeyPatch.context() as mp:
|
|
726
|
+
mp.delenv("VGI_INTROSPECT_PRINCIPALS", raising=False)
|
|
727
|
+
for key, value in env.items():
|
|
728
|
+
mp.setenv(key, value)
|
|
729
|
+
return _build_identity(worker_cls, None)
|
|
730
|
+
|
|
731
|
+
def test_base_worker_has_no_minter(self) -> None:
|
|
732
|
+
"""A worker that never wrote the minting gets no issuer."""
|
|
733
|
+
assert _SingleWorker._grant_minter() is None
|
|
734
|
+
|
|
735
|
+
def test_override_is_detected(self) -> None:
|
|
736
|
+
"""Implementing the hook is what enables it."""
|
|
737
|
+
minter = _MintingWorker._grant_minter()
|
|
738
|
+
assert minter is not None
|
|
739
|
+
|
|
740
|
+
def test_minting_alone_hosts_the_protocol(self) -> None:
|
|
741
|
+
"""A worker may mint without resolving — the two are independent."""
|
|
742
|
+
assert "vgi_rpc.Identity.v1" in _hosted_protocols(_MintingWorker)
|
|
743
|
+
|
|
744
|
+
def test_minting_alone_offers_only_issue_grant(self) -> None:
|
|
745
|
+
"""The protocol describes what the worker does, not what it could do."""
|
|
746
|
+
identity = self._identity(_MintingWorker)
|
|
747
|
+
assert identity is not None
|
|
748
|
+
assert identity.offered_methods() == frozenset({"issue_grant"}) # type: ignore[attr-defined]
|
|
749
|
+
|
|
750
|
+
def test_minting_alone_needs_no_introspect_allowlist(self) -> None:
|
|
751
|
+
"""No allowlist is required to mint: a grant is not an oracle.
|
|
752
|
+
|
|
753
|
+
Requiring one would be a startup error for a worker that never exposes
|
|
754
|
+
anybody else's identity — the exact opposite of the guard's purpose.
|
|
755
|
+
"""
|
|
756
|
+
with pytest.MonkeyPatch.context() as mp:
|
|
757
|
+
mp.delenv("VGI_INTROSPECT_PRINCIPALS", raising=False)
|
|
758
|
+
create_app(_MintingWorker, prefix="/vgi", describe=False)
|
|
759
|
+
|
|
760
|
+
def test_both_hooks_offer_both_methods(self) -> None:
|
|
761
|
+
"""Resolving and minting compose."""
|
|
762
|
+
identity = self._identity(_BothWorker, VGI_INTROSPECT_PRINCIPALS="proxy-a")
|
|
763
|
+
assert identity is not None
|
|
764
|
+
assert identity.offered_methods() == frozenset({"introspect_token", "issue_grant"}) # type: ignore[attr-defined]
|
|
765
|
+
|
|
766
|
+
def test_the_caller_is_the_subject(self) -> None:
|
|
767
|
+
"""The framework supplies the principal; the wire method has no subject field.
|
|
768
|
+
|
|
769
|
+
This is the property that makes an allowlist unnecessary, so pin it
|
|
770
|
+
here rather than trusting the signature to stay that way.
|
|
771
|
+
"""
|
|
772
|
+
identity = self._identity(_MintingWorker)
|
|
773
|
+
assert identity is not None
|
|
774
|
+
grant = identity.issue_grant( # type: ignore[attr-defined]
|
|
775
|
+
"nightly-etl", ["read"], 600, _minting_ctx("alice")
|
|
776
|
+
)
|
|
777
|
+
assert grant.token.startswith("sealed:alice:")
|
|
778
|
+
assert grant.grant_id == "grant-1"
|
|
779
|
+
|
|
780
|
+
def test_a_worker_may_issue_a_shorter_ttl_than_asked(self) -> None:
|
|
781
|
+
"""A worker may narrow the request; it must never widen it."""
|
|
782
|
+
identity = self._identity(_MintingWorker)
|
|
783
|
+
assert identity is not None
|
|
784
|
+
grant = identity.issue_grant( # type: ignore[attr-defined]
|
|
785
|
+
"long", [], 86_400, _minting_ctx("alice")
|
|
786
|
+
)
|
|
787
|
+
assert grant.expires_at == 1_000_000.0 + 3600
|
|
788
|
+
|
|
789
|
+
def test_stale_authentication_cannot_mint(self) -> None:
|
|
790
|
+
"""Minting while the user is present is enforced, not just documented."""
|
|
791
|
+
from vgi_rpc.rpc._token_identity import StaleAuthError
|
|
792
|
+
|
|
793
|
+
identity = self._identity(_MintingWorker)
|
|
794
|
+
assert identity is not None
|
|
795
|
+
with pytest.raises(StaleAuthError):
|
|
796
|
+
identity.issue_grant("x", [], 60, _minting_ctx("alice", auth_age_s=86_400)) # type: ignore[attr-defined]
|
|
797
|
+
|
|
798
|
+
def test_a_credential_with_no_auth_time_cannot_mint(self) -> None:
|
|
799
|
+
"""A grant cannot mint another grant, and a static bearer cannot mint at all.
|
|
800
|
+
|
|
801
|
+
Neither carries ``auth_time`` — only an IdP-issued credential does — so
|
|
802
|
+
the lineage cannot escape the identity provider. This is the rule that
|
|
803
|
+
makes delegation accountable to a human login rather than to whoever
|
|
804
|
+
currently holds a machine secret.
|
|
805
|
+
"""
|
|
806
|
+
from vgi_rpc.rpc._token_identity import StaleAuthError
|
|
807
|
+
|
|
808
|
+
identity = self._identity(_MintingWorker)
|
|
809
|
+
assert identity is not None
|
|
810
|
+
with pytest.raises(StaleAuthError):
|
|
811
|
+
identity.issue_grant("x", [], 60, _introspector_ctx("etl-service")) # type: ignore[attr-defined]
|
|
812
|
+
|
|
813
|
+
|
|
658
814
|
class TestAuthUnavailableReExport:
|
|
659
815
|
"""``AuthUnavailableError`` is reachable without naming a vgi_rpc module."""
|
|
660
816
|
|
|
@@ -9,8 +9,8 @@ HTTP auth factories (require ``vgi[http]``):
|
|
|
9
9
|
bearer_authenticate, bearer_authenticate_static, chain_authenticate,
|
|
10
10
|
OAuthResourceMetadata, AuthUnavailableError
|
|
11
11
|
|
|
12
|
-
Token introspection (always available):
|
|
13
|
-
TokenIdentity, TokenResolver
|
|
12
|
+
Token introspection and delegation (always available):
|
|
13
|
+
TokenIdentity, TokenResolver, IssuedGrant, GrantMinter
|
|
14
14
|
|
|
15
15
|
JWT auth (requires ``vgi[oauth]``):
|
|
16
16
|
jwt_authenticate
|
|
@@ -30,16 +30,25 @@ from vgi_rpc.rpc import AuthContext, CallContext
|
|
|
30
30
|
# on the ``http`` extra. Still not re-exported by ``vgi_rpc.rpc`` itself, so
|
|
31
31
|
# the private module remains the only import path; re-exported here so a worker
|
|
32
32
|
# that implements ``resolve_token`` never has to name one.
|
|
33
|
-
from vgi_rpc.rpc._token_identity import TokenIdentity
|
|
33
|
+
from vgi_rpc.rpc._token_identity import IssuedGrant, TokenIdentity
|
|
34
34
|
|
|
35
35
|
#: What :meth:`vgi.worker.Worker.resolve_token` is. Upstream dropped its own
|
|
36
36
|
#: alias when identity moved to the RPC layer; it is spelled out here so the
|
|
37
37
|
#: name ``vgi.auth.TokenResolver`` keeps working.
|
|
38
38
|
TokenResolver = Callable[[str], "TokenIdentity | None"]
|
|
39
39
|
|
|
40
|
+
#: What :meth:`vgi.worker.Worker.mint_grant` is: ``(principal, purpose, scopes,
|
|
41
|
+
#: ttl_seconds) -> IssuedGrant``. The subject is a *parameter of the call the
|
|
42
|
+
#: framework makes*, never of the wire method — ``issue_grant`` has no subject
|
|
43
|
+
#: field, so a worker is handed the caller's own principal and cannot be asked
|
|
44
|
+
#: to mint for anybody else.
|
|
45
|
+
GrantMinter = Callable[[str, str, list[str], int], "IssuedGrant"]
|
|
46
|
+
|
|
40
47
|
__all__ = [
|
|
41
48
|
"AuthContext",
|
|
42
49
|
"CallContext",
|
|
50
|
+
"GrantMinter",
|
|
51
|
+
"IssuedGrant",
|
|
43
52
|
"TokenIdentity",
|
|
44
53
|
"TokenResolver",
|
|
45
54
|
]
|
|
@@ -791,9 +791,12 @@ def _build_identity(
|
|
|
791
791
|
) -> IdentityImpl | None:
|
|
792
792
|
"""Build the ``vgi_rpc.Identity.v1`` implementation, or ``None``.
|
|
793
793
|
|
|
794
|
-
``None`` unless the worker class
|
|
795
|
-
is the point: ``RpcServer`` then does not host the
|
|
796
|
-
than hosting it and refusing every call.
|
|
794
|
+
``None`` unless the worker class implements at least one of the two
|
|
795
|
+
methods, and that is the point: ``RpcServer`` then does not host the
|
|
796
|
+
protocol at all, rather than hosting it and refusing every call. The two
|
|
797
|
+
are independent — a worker may resolve credentials without minting them,
|
|
798
|
+
mint without resolving, or do both, and ``offered_methods()`` reports
|
|
799
|
+
exactly what it wrote. Absent beats routed-and-refusing —
|
|
797
800
|
it is what keeps a dependency upgrade from growing a
|
|
798
801
|
credential-to-identity oracle on every existing worker.
|
|
799
802
|
|
|
@@ -804,8 +807,8 @@ def _build_identity(
|
|
|
804
807
|
calling and reading an error.
|
|
805
808
|
|
|
806
809
|
Args:
|
|
807
|
-
worker_cls: The worker class, consulted for
|
|
808
|
-
|
|
810
|
+
worker_cls: The worker class, consulted for ``resolve_token`` and
|
|
811
|
+
``mint_grant`` overrides.
|
|
809
812
|
introspect_principals: Principals permitted to introspect, or ``None``
|
|
810
813
|
to read the environment.
|
|
811
814
|
|
|
@@ -815,7 +818,8 @@ def _build_identity(
|
|
|
815
818
|
|
|
816
819
|
"""
|
|
817
820
|
resolver = worker_cls._introspect_resolver()
|
|
818
|
-
|
|
821
|
+
minter = worker_cls._grant_minter()
|
|
822
|
+
if resolver is None and minter is None:
|
|
819
823
|
return None
|
|
820
824
|
|
|
821
825
|
# Not re-exported by ``vgi_rpc.rpc``, so the private module is the only
|
|
@@ -824,7 +828,11 @@ def _build_identity(
|
|
|
824
828
|
|
|
825
829
|
return IdentityImpl(
|
|
826
830
|
resolve_token=resolver,
|
|
827
|
-
|
|
831
|
+
mint_grant=minter,
|
|
832
|
+
# Only meaningful for ``introspect_token``, and ``IdentityImpl``
|
|
833
|
+
# validates it only when a resolver is supplied — a worker that mints
|
|
834
|
+
# grants but resolves nothing is not an oracle and needs no allowlist.
|
|
835
|
+
introspect_principals=(_resolve_introspect_principals(introspect_principals) if resolver is not None else None),
|
|
828
836
|
)
|
|
829
837
|
|
|
830
838
|
|
|
@@ -173,7 +173,7 @@ if TYPE_CHECKING:
|
|
|
173
173
|
from ssl import SSLContext
|
|
174
174
|
|
|
175
175
|
from vgi_rpc.rpc import PeerAuthenticationPolicy, PeerIdentityProvider
|
|
176
|
-
from vgi_rpc.rpc._token_identity import TokenIdentity
|
|
176
|
+
from vgi_rpc.rpc._token_identity import IssuedGrant, TokenIdentity
|
|
177
177
|
|
|
178
178
|
from vgi.catalog.descriptors import Catalog
|
|
179
179
|
from vgi.protocol import (
|
|
@@ -1478,6 +1478,80 @@ class Worker:
|
|
|
1478
1478
|
return None
|
|
1479
1479
|
return cls.resolve_token
|
|
1480
1480
|
|
|
1481
|
+
@classmethod
|
|
1482
|
+
def mint_grant(cls, principal: str, purpose: str, scopes: list[str], ttl_seconds: int) -> IssuedGrant:
|
|
1483
|
+
"""Mint a standing delegation credential for *principal*.
|
|
1484
|
+
|
|
1485
|
+
Override to host ``vgi_rpc.Identity.v1``'s ``issue_grant``. Like
|
|
1486
|
+
``resolve_token``, the method is absent until it is overridden rather
|
|
1487
|
+
than hosted-and-refusing, so no worker grows a credential *issuer* by
|
|
1488
|
+
upgrading a dependency.
|
|
1489
|
+
|
|
1490
|
+
OAuth cannot express durable delegation: it fuses the grant, the
|
|
1491
|
+
credential and the session into one refresh token, so an IdP shortening
|
|
1492
|
+
session lifetime shortens the grant. This mints the durable record —
|
|
1493
|
+
created while the user is present, presented later by unattended
|
|
1494
|
+
automation as an ordinary bearer.
|
|
1495
|
+
|
|
1496
|
+
**There is no subject on the wire.** ``issue_grant`` takes no subject
|
|
1497
|
+
field; the framework passes the *caller's own* authenticated principal,
|
|
1498
|
+
so cross-subject minting is closed by construction rather than by a
|
|
1499
|
+
check that could be forgotten. That is also why this needs no allowlist
|
|
1500
|
+
while ``introspect_token`` has one — it is not an oracle about anybody
|
|
1501
|
+
else. The framework additionally refuses a caller whose authentication
|
|
1502
|
+
is stale (``max_auth_age``, 15 minutes by default), because "minted
|
|
1503
|
+
while the user is present" is the property that makes a grant
|
|
1504
|
+
accountable to them.
|
|
1505
|
+
|
|
1506
|
+
``IssuedGrant.token`` is **opaque to the framework** — a sealed
|
|
1507
|
+
envelope, a database row, or a credential brokered from the IdP are all
|
|
1508
|
+
equally valid and equally invisible here. It is never parsed and never
|
|
1509
|
+
logged. Note that a self-contained sealed token cannot be revoked
|
|
1510
|
+
individually: with no server-side record there is nothing to delete,
|
|
1511
|
+
and rotating the sealing key invalidates every grant at once. If
|
|
1512
|
+
per-grant revocation matters, the token has to name something the
|
|
1513
|
+
worker can look up and remove.
|
|
1514
|
+
|
|
1515
|
+
Args:
|
|
1516
|
+
principal: The caller's authenticated principal, in the form this
|
|
1517
|
+
worker derives itself. Supplied by the framework, never by the
|
|
1518
|
+
caller.
|
|
1519
|
+
purpose: Free-text reason recorded with the grant, for the audit
|
|
1520
|
+
trail.
|
|
1521
|
+
scopes: Scopes the grant is limited to. A worker that ignores this
|
|
1522
|
+
is issuing a credential broader than the caller asked for.
|
|
1523
|
+
ttl_seconds: Lifetime the caller requested. A worker may issue a
|
|
1524
|
+
shorter one — and should say so in ``expires_at`` — but must
|
|
1525
|
+
never issue a longer one.
|
|
1526
|
+
|
|
1527
|
+
Returns:
|
|
1528
|
+
The minted ``IssuedGrant``. ``expires_at`` is a declaration rather
|
|
1529
|
+
than an enforcement: the real lifetime lives inside the opaque
|
|
1530
|
+
token, so a worker that states one has thought about one.
|
|
1531
|
+
|
|
1532
|
+
Raises:
|
|
1533
|
+
GrantRefusedError: When this caller may not mint this grant —
|
|
1534
|
+
an unsupported scope, a ttl beyond policy, a principal the
|
|
1535
|
+
worker declines to delegate for.
|
|
1536
|
+
|
|
1537
|
+
"""
|
|
1538
|
+
from vgi_rpc.rpc._token_identity import GrantRefusedError
|
|
1539
|
+
|
|
1540
|
+
raise GrantRefusedError("this worker does not mint grants")
|
|
1541
|
+
|
|
1542
|
+
@classmethod
|
|
1543
|
+
def _grant_minter(cls) -> Callable[[str, str, list[str], int], IssuedGrant] | None:
|
|
1544
|
+
"""Return this worker's grant minter, or ``None`` when it has none.
|
|
1545
|
+
|
|
1546
|
+
Identity comparison against the base implementation, for the same
|
|
1547
|
+
reason ``_introspect_resolver`` uses one: the method must be absent
|
|
1548
|
+
unless a worker actually wrote the minting, and a "supports grants"
|
|
1549
|
+
flag can be set without one.
|
|
1550
|
+
"""
|
|
1551
|
+
if cls.mint_grant.__func__ is Worker.mint_grant.__func__: # type: ignore[attr-defined]
|
|
1552
|
+
return None
|
|
1553
|
+
return cls.mint_grant
|
|
1554
|
+
|
|
1481
1555
|
@final
|
|
1482
1556
|
@classmethod
|
|
1483
1557
|
def main(cls) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/negative/unknown-node.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/empty-snapshot.json
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/cases/positive/remove-delta.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-le/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow
RENAMED
|
File without changes
|
{vgi_python-0.36.2 → vgi_python-0.37.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|