vgi-python 0.39.0__tar.gz → 0.41.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.39.0 → vgi_python-0.41.0}/.github/dependabot.yml +8 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.github/workflows/ci.yml +26 -5
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.github/workflows/docs.yml +1 -1
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.github/workflows/integration.yml +1 -1
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.github/workflows/release.yml +1 -1
- {vgi_python-0.39.0 → vgi_python-0.41.0}/CLAUDE.md +50 -4
- {vgi_python-0.39.0 → vgi_python-0.41.0}/PKG-INFO +5 -5
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/auth.md +3 -2
- vgi_python-0.41.0/docs/api/worker.md +99 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/catalog-interface.md +84 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/packages/vgi-fixtures/pyproject.toml +3 -1
- {vgi_python-0.39.0 → vgi_python-0.41.0}/pyproject.toml +11 -5
- vgi_python-0.41.0/scripts/hosted_protocols_conformance.sh +75 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/scripts/regen_generated.py +22 -2
- vgi_python-0.41.0/tests/_hosted_protocols_worker.py +75 -0
- vgi_python-0.41.0/tests/catalog/test_catalog_contents.py +537 -0
- vgi_python-0.41.0/tests/catalog/test_client_load_catalog.py +388 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_serialization.py +2 -1
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_setting.py +4 -4
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_protocol_inventory.py +1 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_protocol_version.py +3 -3
- vgi_python-0.41.0/tests/table_in_out/test_table_buffering_empty_input.py +53 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_filter_v2.py +71 -0
- vgi_python-0.41.0/tests/test_generated_go_types.py +134 -0
- vgi_python-0.41.0/tests/test_generated_java_types.py +148 -0
- vgi_python-0.41.0/tests/test_generated_rust_types.py +117 -0
- vgi_python-0.41.0/tests/test_generated_ts_types.py +103 -0
- vgi_python-0.41.0/tests/test_hosted_protocols.py +477 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_schema_scoped_functions.py +37 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_serve.py +6 -16
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_worker.py +2 -2
- {vgi_python-0.39.0 → vgi_python-0.41.0}/uv.lock +325 -323
- vgi_python-0.41.0/vgi/_test_fixtures/catalog_contents.py +338 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/http_server.py +30 -8
- vgi_python-0.41.0/vgi/_test_fixtures/identity_fixture.py +75 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/geo.py +12 -12
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/worker.py +21 -3
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/__init__.py +4 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/catalog_interface.py +148 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/__init__.py +3 -1
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/catalog_mixin.py +226 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/cli_catalog.py +47 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/cli_utils.py +1 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/client.py +1 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/_common.py +6 -0
- vgi_python-0.41.0/vgi/codegen/go_types.py +345 -0
- vgi_python-0.41.0/vgi/codegen/java_types.py +348 -0
- vgi_python-0.41.0/vgi/codegen/rust_types.py +315 -0
- vgi_python-0.41.0/vgi/codegen/ts_types.py +361 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/copy_from_function.py +3 -5
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/filter_v2.py +16 -5
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/meta_worker.py +86 -6
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/protocol.py +106 -3
- vgi_python-0.41.0/vgi/protocol_version.txt +1 -0
- vgi_python-0.41.0/vgi/rpc_server.py +287 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/serve.py +11 -119
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/table_buffering_function.py +1 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/table_in_out_function.py +1 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/worker.py +255 -22
- vgi_python-0.39.0/docs/api/worker.md +0 -23
- vgi_python-0.39.0/vgi/protocol_version.txt +0 -1
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.dockerignore +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.gitattributes +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.github/workflows/tailnet-integration.yml +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.gitignore +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.python-version +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/.vale.ini +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/LICENSE +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/PROTOCOL.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/README.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/RELEASE-RUNBOOK.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/SECURITY.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/ci/README.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/README.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/generate_runtime.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/manifest.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/run_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/conformance/filter-v2/runtime-manifest.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/client.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/filters.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/functions.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/http.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/index.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/observability.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/storage.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/assets/video-thumbnail.jpg +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/authentication.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/cli.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/generator-api.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/global-functions.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/iroh.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/how-to/tailnet.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/index.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/metadata.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/protocol/index.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/robots.txt +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/batch_index_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/cache_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/copy_format_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/identity.png +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/mkdocs.yml +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/test-data/generate.sh +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_attach_option.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_aggregate_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_batch_metadata_callback.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_bind_and_join_keys.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_copy_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_http_response_budget.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_iroh_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_scan_branches_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_split_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_stop_force.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_table_column_statistics.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_time_travel_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_splits.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/conftest.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/bad_version.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/generate.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/manifest.json +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/truncated.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table/test_wide_columns.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/test_blended_exchange.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/tailnet/Dockerfile +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/tailnet/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/tailnet/compose.yaml +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/tailnet/probe.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/tailnet/run.sh +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/tailnet/test_worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/tailnet/worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_auth.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_call_state_attach.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_client_oauth.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_codegen_request_inventory.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_dynamic_filter_http_turns.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_filter_v2_builder.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_filter_v2_spec_schema.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_fixture_catalog_parity.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_function_shape_mismatch.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_cpp_protocol_name.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_csharp.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_java_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_rust_request_builders.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_rust_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_import_side_effects.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_landing_discovery.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_launch_transport.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_otel.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_schema_paths_v2.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_signing_key.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_split_token.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_subprocess_transport.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_wire_record_schema_parity.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/test_write_results.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/global_functions.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/secret_cache.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/splits.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table/wide.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/arguments.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/attach_header.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/auth.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/cache_control.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/aggregate.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/client/errors.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_protocol_name.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/csharp_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/csharp_types.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/java_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/rust_request_builders.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/rust_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/filter_v2_builder.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/http/vgi-client.js +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/invocation.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/metadata.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/otel.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/profiling.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/py.typed +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/schema_path.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/split_token.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/table_function.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/vgi/write_results.py +0 -0
- {vgi_python-0.39.0 → vgi_python-0.41.0}/wrangler.jsonc +0 -0
|
@@ -27,6 +27,14 @@ updates:
|
|
|
27
27
|
# failing on an impossible update; the alerts stay visible in the
|
|
28
28
|
# security tab. The real fix is lifting the cap upstream in vgi-rpc.
|
|
29
29
|
- dependency-name: "aiohttp"
|
|
30
|
+
# The filter evaluator implements vgi.duckdb.standard.v1, pinned to
|
|
31
|
+
# DuckDB 1.5.5 / Haybarn 1.5.5-rc1 (vgi/filter_v2.py
|
|
32
|
+
# STANDARD_V1_ENGINE_VERSIONS); any other engine build refuses every
|
|
33
|
+
# pushed-down filter. Bumping them is a deliberate profile decision, not
|
|
34
|
+
# a routine update: locking duckdb 1.5.6 broke filter pushdown in the
|
|
35
|
+
# vgi integration suite.
|
|
36
|
+
- dependency-name: "duckdb"
|
|
37
|
+
- dependency-name: "haybarn"
|
|
30
38
|
|
|
31
39
|
# GitHub Actions used by the workflows in .github/workflows/.
|
|
32
40
|
- package-ecosystem: "github-actions"
|
|
@@ -30,7 +30,7 @@ jobs:
|
|
|
30
30
|
- uses: actions/checkout@v7
|
|
31
31
|
|
|
32
32
|
- name: Install uv
|
|
33
|
-
uses: astral-sh/setup-uv@
|
|
33
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
34
34
|
|
|
35
35
|
- name: Set up Python ${{ matrix.python-version }}
|
|
36
36
|
run: uv python install ${{ matrix.python-version }}
|
|
@@ -53,7 +53,7 @@ jobs:
|
|
|
53
53
|
- uses: actions/checkout@v7
|
|
54
54
|
|
|
55
55
|
- name: Install uv
|
|
56
|
-
uses: astral-sh/setup-uv@
|
|
56
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
57
57
|
|
|
58
58
|
- name: Install dependencies
|
|
59
59
|
run: uv sync --all-extras
|
|
@@ -89,7 +89,7 @@ jobs:
|
|
|
89
89
|
- uses: actions/checkout@v7
|
|
90
90
|
|
|
91
91
|
- name: Install uv
|
|
92
|
-
uses: astral-sh/setup-uv@
|
|
92
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
93
93
|
|
|
94
94
|
- name: Set up Python 3.14
|
|
95
95
|
run: uv python install 3.14
|
|
@@ -112,7 +112,7 @@ jobs:
|
|
|
112
112
|
# fail_on_error to true (and drop continue-on-error) once the vocab in
|
|
113
113
|
# .github/styles/config/vocabularies/VGI/accept.txt is settled.
|
|
114
114
|
- name: Prose lint (Vale)
|
|
115
|
-
uses: errata-ai/vale-action@
|
|
115
|
+
uses: errata-ai/vale-action@v3
|
|
116
116
|
continue-on-error: true
|
|
117
117
|
with:
|
|
118
118
|
files: docs
|
|
@@ -126,6 +126,27 @@ jobs:
|
|
|
126
126
|
args: "--no-progress --offline --root-dir ${{ github.workspace }}/docs docs/**/*.md *.md"
|
|
127
127
|
fail: true
|
|
128
128
|
|
|
129
|
+
hosted-protocols:
|
|
130
|
+
# vgi-rpc's cross-SDK hosted-protocols group: the fixture workers must host
|
|
131
|
+
# vgi.v2 then conformance.Secondary.v1 on stdio, unix and HTTP, and pass the
|
|
132
|
+
# Identity.v1 groups over HTTP (vgi-fixture-http --identity).
|
|
133
|
+
name: Hosted-protocols conformance
|
|
134
|
+
runs-on: ubuntu-latest
|
|
135
|
+
steps:
|
|
136
|
+
- uses: actions/checkout@v7
|
|
137
|
+
|
|
138
|
+
- name: Install uv
|
|
139
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
140
|
+
|
|
141
|
+
- name: Set up Python 3.14
|
|
142
|
+
run: uv python install 3.14
|
|
143
|
+
|
|
144
|
+
- name: Install dependencies
|
|
145
|
+
run: uv sync --all-extras --python 3.14
|
|
146
|
+
|
|
147
|
+
- name: Run hosted-protocols group (stdio, unix, http)
|
|
148
|
+
run: scripts/hosted_protocols_conformance.sh
|
|
149
|
+
|
|
129
150
|
s3-offload-localstack:
|
|
130
151
|
name: S3 Offload Tests (LocalStack)
|
|
131
152
|
runs-on: ubuntu-latest
|
|
@@ -147,7 +168,7 @@ jobs:
|
|
|
147
168
|
path: vgi-rpc
|
|
148
169
|
|
|
149
170
|
- name: Install uv
|
|
150
|
-
uses: astral-sh/setup-uv@
|
|
171
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
151
172
|
|
|
152
173
|
- name: Set up Python 3.14
|
|
153
174
|
run: uv python install 3.14
|
|
@@ -428,9 +428,10 @@ caller's identity before it can authorize anything.
|
|
|
428
428
|
|
|
429
429
|
Through vgi-rpc 0.45.x this was an HTTP JSON route, `POST
|
|
430
430
|
{prefix}/__introspect_token__`, which meant it existed on exactly one
|
|
431
|
-
transport. As of **vgi-rpc 0.46.0** identity lives at the RPC layer,
|
|
432
|
-
|
|
433
|
-
|
|
431
|
+
transport. As of **vgi-rpc 0.46.0** identity lives at the RPC layer, and a
|
|
432
|
+
client discovers it through ordinary reflection (`list_protocols`) rather than
|
|
433
|
+
by calling and reading an error. VGI hosts it on HTTP only — the transport that
|
|
434
|
+
authenticates callers (see `build_rpc_server` in `vgi/rpc_server.py`).
|
|
434
435
|
|
|
435
436
|
```python
|
|
436
437
|
from vgi.auth import AuthUnavailableError, TokenIdentity
|
|
@@ -469,7 +470,10 @@ credentials. Throttle untrusted traffic at the proxy, per client.
|
|
|
469
470
|
|
|
470
471
|
Return `None` for "the store answered and this credential is unknown"; raise
|
|
471
472
|
`AuthUnavailableError` for "the answer is not knowable". A caller that
|
|
472
|
-
negative-caches the first must not cache the second.
|
|
473
|
+
negative-caches the first must not cache the second. Raising the same error
|
|
474
|
+
an authenticator raises is correct here: vgi-rpc translates an
|
|
475
|
+
`AuthUnavailableError` from either identity hook into `identity_unavailable`
|
|
476
|
+
(code `UNAVAILABLE`) and carries its `retry_after` as `RetryInfo`. Never return claims — a
|
|
473
477
|
pass-through claims field would let a worker choose its caller's tenant routing
|
|
474
478
|
and policy branch.
|
|
475
479
|
|
|
@@ -480,6 +484,26 @@ sidecar outage raised as one is read as "not my credential, try the next" and
|
|
|
480
484
|
ends up a 401 from the end of the chain, restarting every session in the fleet
|
|
481
485
|
over a thirty-second blip.
|
|
482
486
|
|
|
487
|
+
### Hosting Additional Protocols (`hosted_protocols`)
|
|
488
|
+
|
|
489
|
+
Every transport (stdio, unix/named pipe, TCP, Iroh, HTTP) builds its `RpcServer`
|
|
490
|
+
through one helper, `build_rpc_server(worker, *, transport, ...)` in
|
|
491
|
+
`vgi/rpc_server.py`. Never call `RpcServer(...)` for a worker anywhere else.
|
|
492
|
+
`tests/test_hosted_protocols.py` enforces this structurally. Only
|
|
493
|
+
`vgi/secret_service.py` and `vgi/transactor/server.py` are exempt, because they
|
|
494
|
+
serve other protocols.
|
|
495
|
+
|
|
496
|
+
A worker hosts extra vgi-rpc protocols by overriding the classmethod
|
|
497
|
+
`Worker.hosted_protocols() -> Sequence[tuple[type, object]]` (empty by
|
|
498
|
+
default). It is called once per server build. Its pairs are hosted on every
|
|
499
|
+
transport, after `vgi.v2` and before `vgi_rpc.Reflection.v1`, which is now
|
|
500
|
+
hosted on every transport too. You cannot host part of a protocol: the
|
|
501
|
+
protocol is the unit of optionality. Duplicate names, `vgi.v2` itself, and the
|
|
502
|
+
reserved `vgi_rpc.` prefix all fail at startup with an error that names the
|
|
503
|
+
hook. `MetaWorker` hosts its children's lists concatenated. Identity is not
|
|
504
|
+
supplied through this hook. It stays opt-in via `resolve_token`/`mint_grant`
|
|
505
|
+
and is hosted on HTTP only. See `docs/api/worker.md`.
|
|
506
|
+
|
|
483
507
|
### Access Log Sampling and Async Emission
|
|
484
508
|
|
|
485
509
|
`--access-log-sample 0.05` keeps 5% of *successful* calls. Errors are always
|
|
@@ -606,6 +630,28 @@ This allows workers to expose structured metadata (tables, views, functions) to
|
|
|
606
630
|
The recommended pattern is to back tables with `TableFunctionGenerator` functions.
|
|
607
631
|
The table schema is automatically derived from the function's `output_schema`:
|
|
608
632
|
|
|
633
|
+
### catalog_contents (whole-catalog load, protocol 2.1.0)
|
|
634
|
+
|
|
635
|
+
`Worker.catalog_contents(attach_opaque_data, if_none_match=None)` returns
|
|
636
|
+
`CatalogContentsResponse{catalog_version, etag, not_modified, schemas: list<struct SchemaContents>}`
|
|
637
|
+
(`path` first, then the `SchemaInfo` item and eight `list<binary>` kinds, items
|
|
638
|
+
byte-identical to the per-schema RPCs). The catalog side is
|
|
639
|
+
`CatalogInterface.catalog_contents(*, attach_opaque_data, if_none_match) -> CatalogContentsResult`.
|
|
640
|
+
The worker validates paths, orders parents first and enforces the etag rules
|
|
641
|
+
(`not_modified` only with an etag equal to `if_none_match`). Opt-ins:
|
|
642
|
+
`catalog_contents_etag = "content-hash"` (framework SHA-256 etag) and
|
|
643
|
+
`catalog_contents_attach_independent` (with `catalog_version_frozen`, the worker
|
|
644
|
+
caches the serialized response per catalog version; `ReadOnlyCatalogInterface`
|
|
645
|
+
sets it). Fixture catalogs: `vgi/_test_fixtures/catalog_contents.py`
|
|
646
|
+
(`contents_probe/broken/legacy/memory/reval/hash`). Every SDK's fixture worker
|
|
647
|
+
serves the same six catalogs: the extension's five `catalog_contents*.test` files
|
|
648
|
+
run against all of them (no `VGI_CATALOG_CONTENTS_WORKER` gate any more), so these
|
|
649
|
+
semantics are the cross-SDK contract. Client side, `Client.load_catalog(attach=,
|
|
650
|
+
previous=)` is the whole-catalog enumeration: `catalog_contents` only when
|
|
651
|
+
advertised, per-schema fallback on failure / in a transaction, `if_none_match`
|
|
652
|
+
revalidation via `previous` (`tests/catalog/test_client_load_catalog.py`). See
|
|
653
|
+
`docs/catalog-interface.md`.
|
|
654
|
+
|
|
609
655
|
## Additional Documentation
|
|
610
656
|
|
|
611
657
|
- **Access log**: See `vgi-rpc` docs site
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.41.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,13 +162,13 @@ 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.48.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'
|
|
169
169
|
Provides-Extra: dev
|
|
170
170
|
Requires-Dist: azure-identity>=1.16.0; extra == 'dev'
|
|
171
|
-
Requires-Dist: duckdb
|
|
171
|
+
Requires-Dist: duckdb==1.5.5; extra == 'dev'
|
|
172
172
|
Requires-Dist: jsonschema; extra == 'dev'
|
|
173
173
|
Requires-Dist: mypy; extra == 'dev'
|
|
174
174
|
Requires-Dist: numpy>=2.4.1; extra == 'dev'
|
|
@@ -188,14 +188,14 @@ Requires-Dist: vgi-rpc[oauth]; extra == 'dev'
|
|
|
188
188
|
Requires-Dist: vgi-rpc[otel]; extra == 'dev'
|
|
189
189
|
Requires-Dist: vgi-rpc[sentry]; extra == 'dev'
|
|
190
190
|
Provides-Extra: duckdb
|
|
191
|
-
Requires-Dist: duckdb
|
|
191
|
+
Requires-Dist: duckdb==1.5.5; extra == 'duckdb'
|
|
192
192
|
Provides-Extra: fixtures
|
|
193
193
|
Requires-Dist: vgi-fixtures; extra == 'fixtures'
|
|
194
194
|
Provides-Extra: granian
|
|
195
195
|
Requires-Dist: granian>=2.7; extra == 'granian'
|
|
196
196
|
Requires-Dist: vgi-rpc[http]; extra == 'granian'
|
|
197
197
|
Provides-Extra: haybarn
|
|
198
|
-
Requires-Dist: haybarn
|
|
198
|
+
Requires-Dist: haybarn==1.5.5rc1; extra == 'haybarn'
|
|
199
199
|
Provides-Extra: http
|
|
200
200
|
Requires-Dist: vgi-rpc[http]; extra == 'http'
|
|
201
201
|
Provides-Extra: iroh
|
|
@@ -19,8 +19,9 @@ require `pip install vgi-python[http]`; JWT authentication additionally requires
|
|
|
19
19
|
re-exports it — a worker that implements `resolve_token` never has to name a private import path.
|
|
20
20
|
|
|
21
21
|
As of vgi-rpc 0.46.0 introspection is the `vgi_rpc.Identity.v1` protocol hosted on the RPC server,
|
|
22
|
-
not an HTTP JSON route, so it
|
|
23
|
-
|
|
22
|
+
not an HTTP JSON route, so clients discover it through reflection. VGI hosts it on HTTP only, the
|
|
23
|
+
transport that authenticates callers: its allowlist names principals, which stdin/stdout, AF_UNIX
|
|
24
|
+
and TCP do not have. `TokenIdentity` and `TokenResolver` are no longer gated on the `[http]` extra.
|
|
24
25
|
|
|
25
26
|
## Secret protocol
|
|
26
27
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Worker & Serving
|
|
2
|
+
|
|
3
|
+
A `Worker` hosts your functions (and optional catalog) in a separate process. It speaks the VGI
|
|
4
|
+
protocol over Arrow IPC — either stdin/stdout (subprocess transport) or HTTP. The `vgi-serve`
|
|
5
|
+
CLI (`vgi.serve`) is the zero-boilerplate entry point for running one.
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
from vgi import Worker, ScalarFunction
|
|
9
|
+
|
|
10
|
+
class MyWorker(Worker):
|
|
11
|
+
functions = [MyScalarFunction()]
|
|
12
|
+
|
|
13
|
+
# vgi-serve my_module:MyWorker # stdio
|
|
14
|
+
# vgi-serve my_module:MyWorker --http # HTTP
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Hosting additional protocols
|
|
18
|
+
|
|
19
|
+
A worker can serve other [vgi-rpc](https://vgi-rpc.query.farm) protocols from the same process and
|
|
20
|
+
the same listener as the VGI protocol. Override
|
|
21
|
+
[`Worker.hosted_protocols`][vgi.worker.Worker.hosted_protocols] to return
|
|
22
|
+
`(protocol, implementation)` pairs:
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from collections.abc import Sequence
|
|
26
|
+
from typing import ClassVar, Protocol
|
|
27
|
+
|
|
28
|
+
from vgi import Worker
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Audit(Protocol):
|
|
32
|
+
protocol_name: ClassVar[str] = "acme.Audit.v1"
|
|
33
|
+
|
|
34
|
+
def record(self, event: str) -> int: ...
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class AuditImpl:
|
|
38
|
+
def record(self, event: str) -> int:
|
|
39
|
+
return len(event)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class MyWorker(Worker):
|
|
43
|
+
functions = []
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def hosted_protocols(cls) -> Sequence[tuple[type, object]]:
|
|
47
|
+
return [(Audit, AuditImpl())]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The rules:
|
|
51
|
+
|
|
52
|
+
- **Every transport hosts the same list.** stdin/stdout, AF_UNIX (or a Windows named pipe), TCP,
|
|
53
|
+
the Iroh raw upstream and HTTP all build their server through one function,
|
|
54
|
+
[`build_rpc_server`][vgi.rpc_server.build_rpc_server].
|
|
55
|
+
- **Called once per server.** The hook may read configuration or the environment, but its answer
|
|
56
|
+
is fixed for the life of the process, so reflection output and protocol hashes stay stable.
|
|
57
|
+
- **The protocol is the unit of optionality.** There is no way to host part of a protocol. Make
|
|
58
|
+
an optional capability its own protocol, and include it or leave it out.
|
|
59
|
+
- **Names are routing keys.** Each protocol needs a distinct `protocol_name`. A repeated name, the
|
|
60
|
+
worker's own `vgi.v2`, or the reserved `vgi_rpc.` prefix stops the worker at startup, and the
|
|
61
|
+
error names `hosted_protocols()`.
|
|
62
|
+
- **`vgi.v2` is unaffected.** vgi-rpc routes each request on its `vgi_rpc.protocol` key and never
|
|
63
|
+
falls back to the primary protocol. A client that only speaks `vgi.v2`, such as the DuckDB
|
|
64
|
+
extension, sees exactly the behaviour it saw before.
|
|
65
|
+
|
|
66
|
+
A `MetaWorker` (`vgi.meta_worker`) hosts the concatenation of its children's lists, in
|
|
67
|
+
child order. Two children that list the same protocol name stop it at startup. Over HTTP it
|
|
68
|
+
hosts Identity for the one child that overrides `resolve_token` or `mint_grant`; two children
|
|
69
|
+
overriding the same hook stop it at startup.
|
|
70
|
+
|
|
71
|
+
### What each transport hosts
|
|
72
|
+
|
|
73
|
+
Reflection (`list_protocols`) reports protocols in this order:
|
|
74
|
+
|
|
75
|
+
| Transport | `vgi.v2` | `hosted_protocols()` | `vgi_rpc.Reflection.v1` | `vgi_rpc.Identity.v1` |
|
|
76
|
+
| --- | --- | --- | --- | --- |
|
|
77
|
+
| stdin/stdout | yes | yes | yes | no |
|
|
78
|
+
| AF_UNIX / named pipe | yes | yes | yes | no |
|
|
79
|
+
| TCP | yes | yes | yes | no |
|
|
80
|
+
| Iroh raw upstream | yes | yes | yes | no |
|
|
81
|
+
| HTTP | yes | yes | unless `--no-describe` | when `resolve_token` or `mint_grant` is overridden |
|
|
82
|
+
|
|
83
|
+
Identity stays framework-owned. You enable it by overriding
|
|
84
|
+
[`resolve_token`][vgi.worker.Worker.resolve_token] or
|
|
85
|
+
[`mint_grant`][vgi.worker.Worker.mint_grant], never through `hosted_protocols()`. It is hosted
|
|
86
|
+
only on HTTP, which authenticates callers. Its introspection allowlist names principals, and the
|
|
87
|
+
other transports have no principals to check.
|
|
88
|
+
|
|
89
|
+
## Worker
|
|
90
|
+
|
|
91
|
+
::: vgi.worker
|
|
92
|
+
|
|
93
|
+
## Server construction
|
|
94
|
+
|
|
95
|
+
::: vgi.rpc_server
|
|
96
|
+
|
|
97
|
+
## Serving
|
|
98
|
+
|
|
99
|
+
::: vgi.serve
|
|
@@ -243,6 +243,80 @@ class MyCatalog(CatalogInterface):
|
|
|
243
243
|
| | `view_rename()` | `NotImplementedError` |
|
|
244
244
|
| | `view_comment_set()` | `NotImplementedError` |
|
|
245
245
|
| **Observability** | `loggable_attach_options()` | Returns `{}` (no options logged — see below) |
|
|
246
|
+
| **Bulk load** | `catalog_contents()` | Composes `schemas()` + `schema_contents()` per kind; no etag (see below) |
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Loading the Whole Catalog: `catalog_contents`
|
|
251
|
+
|
|
252
|
+
A client normally learns a catalog lazily: `catalog_schemas`, then one
|
|
253
|
+
`catalog_schema_contents_*` call per schema and object kind. When the attach
|
|
254
|
+
result sets `supports_catalog_contents` (`ReadOnlyCatalogInterface` does), the
|
|
255
|
+
client may instead load everything with one `catalog_contents` RPC (protocol
|
|
256
|
+
2.1.0):
|
|
257
|
+
|
|
258
|
+
```text
|
|
259
|
+
catalog_contents(attach_opaque_data: binary, if_none_match: utf8 nullable)
|
|
260
|
+
-> CatalogContentsResponse {
|
|
261
|
+
catalog_version: int64
|
|
262
|
+
etag: utf8 nullable -- null: the worker does not revalidate
|
|
263
|
+
not_modified: bool -- true: schemas is empty, keep what you have
|
|
264
|
+
schemas: list<struct<path: list<utf8>, schema: binary,
|
|
265
|
+
tables, views, scalar_functions, aggregate_functions,
|
|
266
|
+
table_functions, scalar_macros, table_macros,
|
|
267
|
+
indexes: list<binary>>> -- parents before children
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Each struct row is one schema: `path` equals the `SchemaInfo.path` encoded in
|
|
272
|
+
`schema`, and every item is byte-identical to what the matching per-schema RPC
|
|
273
|
+
returns. There is no transaction parameter: it is the committed catalog at
|
|
274
|
+
`catalog_version`.
|
|
275
|
+
|
|
276
|
+
`CatalogInterface.catalog_contents(*, attach_opaque_data, if_none_match=None)`
|
|
277
|
+
returns a `CatalogContentsResult(schemas, etag=None, not_modified=False)`. The
|
|
278
|
+
default composes `schemas()` and `schema_contents()` for every kind (skipping
|
|
279
|
+
kinds whose `estimated_object_count` is exactly 0) and returns no etag.
|
|
280
|
+
|
|
281
|
+
**Revalidation.** Return an `etag` to let a client revalidate a non-frozen
|
|
282
|
+
catalog with `if_none_match` instead of re-downloading it. Check it *before*
|
|
283
|
+
building, so an unchanged catalog costs almost nothing:
|
|
284
|
+
|
|
285
|
+
```python test="lint"
|
|
286
|
+
from vgi.catalog import CatalogContentsResult, CatalogInterface
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
class GenerationCatalog(CatalogInterface): # other methods omitted
|
|
290
|
+
generation = 1 # bumped by every DDL
|
|
291
|
+
|
|
292
|
+
def catalog_contents(self, *, attach_opaque_data, if_none_match=None):
|
|
293
|
+
etag = f"gen-{self.generation}"
|
|
294
|
+
if if_none_match == etag:
|
|
295
|
+
return CatalogContentsResult(etag=etag, not_modified=True) # nothing built
|
|
296
|
+
full = super().catalog_contents(attach_opaque_data=attach_opaque_data)
|
|
297
|
+
return CatalogContentsResult(schemas=full.schemas, etag=etag)
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
The worker enforces the rules: `not_modified` requires an etag equal to
|
|
301
|
+
`if_none_match` and no schemas; a full answer whose etag equals
|
|
302
|
+
`if_none_match` is turned into `not_modified`; a catalog with no etag always
|
|
303
|
+
answers in full (it ignores `if_none_match`).
|
|
304
|
+
|
|
305
|
+
**Content-hash etag.** A catalog without a cheap validator can set
|
|
306
|
+
`catalog_contents_etag = "content-hash"`: when it returns no etag, the worker
|
|
307
|
+
uses the hex SHA-256 of the serialized snapshot. The worker still builds the
|
|
308
|
+
snapshot on every call, but an unchanged catalog skips the transfer and the
|
|
309
|
+
client's decode. It is off by default, because for a non-frozen catalog the
|
|
310
|
+
client would revalidate with a full build on every transaction instead of a
|
|
311
|
+
cheap `catalog_version` poll.
|
|
312
|
+
|
|
313
|
+
**Worker cache.** When the catalog's version is frozen
|
|
314
|
+
(`catalog_version_frozen`) and its contents do not depend on the attach or the
|
|
315
|
+
caller (`catalog_contents_attach_independent = True`, the
|
|
316
|
+
`ReadOnlyCatalogInterface` default), the worker builds the response once per
|
|
317
|
+
catalog version and serves the same pre-serialized bytes to every call. A
|
|
318
|
+
`ReadOnlyCatalogInterface` subclass whose contents vary per caller must set
|
|
319
|
+
`catalog_contents_attach_independent = False`.
|
|
246
320
|
|
|
247
321
|
---
|
|
248
322
|
|
|
@@ -623,6 +697,14 @@ for obj in client.schema_contents(attach_opaque_data=attach_opaque_data, path=["
|
|
|
623
697
|
elif isinstance(obj, FunctionInfo):
|
|
624
698
|
print(f"Function: {obj.name}")
|
|
625
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
|
+
|
|
626
708
|
# Get only scalar functions using type filter
|
|
627
709
|
from vgi.catalog import SchemaObjectType
|
|
628
710
|
for obj in client.schema_contents(
|
|
@@ -649,6 +731,8 @@ client.catalog_detach(attach_opaque_data=attach_opaque_data)
|
|
|
649
731
|
| `schema_create()` | Create a schema |
|
|
650
732
|
| `schema_drop()` | Drop a schema |
|
|
651
733
|
| `schema_contents()` | List schema contents (optional `type` filter) |
|
|
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) |
|
|
652
736
|
| `table_get()` | Get table info |
|
|
653
737
|
| `table_create()` | Create a table |
|
|
654
738
|
| `table_drop()` | Drop a table |
|
|
@@ -34,7 +34,9 @@ classifiers = [
|
|
|
34
34
|
# The fixture worker also builds statistics fixtures at import time, which
|
|
35
35
|
# needs a DuckDB-compatible engine — vgi[duckdb] keeps the default dev env on
|
|
36
36
|
# stock duckdb (the resolver prefers haybarn whenever it is installed too).
|
|
37
|
-
|
|
37
|
+
# vgi-rpc is named directly because the fixture worker imports its conformance
|
|
38
|
+
# fixtures (vgi_rpc.conformance.secondary, .identity_fixture), new in 0.48.0.
|
|
39
|
+
dependencies = ["vgi-python[test-fixtures-writable]", "vgi-python[duckdb]", "vgi-rpc>=0.48.0"]
|
|
38
40
|
|
|
39
41
|
[project.scripts]
|
|
40
42
|
vgi-fixture-worker = "vgi._test_fixtures.worker:main"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vgi-python"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.41.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.48.0",
|
|
44
44
|
"httpx2>=2.12.0",
|
|
45
45
|
]
|
|
46
46
|
|
|
@@ -49,8 +49,14 @@ dependencies = [
|
|
|
49
49
|
# evaluation, the transactor, and the statistics fixtures. It is resolved
|
|
50
50
|
# lazily in vgi/_duckdb.py: haybarn is preferred, stock duckdb is the
|
|
51
51
|
# fallback. Neither is a hard dependency — install one via these extras.
|
|
52
|
-
|
|
53
|
-
duckdb
|
|
52
|
+
# Both are pinned EXACTLY: expression-filter evaluation implements
|
|
53
|
+
# vgi.duckdb.standard.v1, whose oracle is upstream DuckDB 1.5.5 (Haybarn
|
|
54
|
+
# 1.5.5-rc1), and vgi/filter_v2.py refuses any other engine build
|
|
55
|
+
# (STANDARD_V1_ENGINE_VERSIONS). A looser range lets a resolver pick e.g.
|
|
56
|
+
# duckdb 1.5.6, and every pushed-down filter then fails to bind. Change these
|
|
57
|
+
# only together with STANDARD_V1_ENGINE_VERSIONS (a test keeps them in step).
|
|
58
|
+
haybarn = ["haybarn==1.5.5rc1"]
|
|
59
|
+
duckdb = ["duckdb==1.5.5"]
|
|
54
60
|
http = ["vgi-rpc[http]"]
|
|
55
61
|
iroh = ["vgi-rpc[http,iroh]"]
|
|
56
62
|
# transport="launch": vgi_rpc.launcher imports filelock unconditionally at
|
|
@@ -84,7 +90,7 @@ test-fixtures-writable = [
|
|
|
84
90
|
"vgi-python[transactor]",
|
|
85
91
|
]
|
|
86
92
|
dev = [
|
|
87
|
-
"duckdb
|
|
93
|
+
"duckdb==1.5.5", # pinned with the `duckdb` extra above
|
|
88
94
|
"mypy",
|
|
89
95
|
"pyarrow-stubs",
|
|
90
96
|
# pydoclint is intentionally NOT a project dependency: it pulls
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
3
|
+
#
|
|
4
|
+
# Run vgi-rpc's hosted-protocols conformance group (vgi-rpc-test-hosted)
|
|
5
|
+
# against this repo's fixture workers on all three transports it covers:
|
|
6
|
+
#
|
|
7
|
+
# stdio vgi-fixture-worker (MetaWorker.serve, pipe)
|
|
8
|
+
# unix vgi-fixture-worker --unix <sock> (the DuckDB launcher path)
|
|
9
|
+
# http vgi-fixture-http --identity (+ the Identity.v1 groups)
|
|
10
|
+
#
|
|
11
|
+
# Every worker must host, in order, vgi.v2 then conformance.Secondary.v1.
|
|
12
|
+
#
|
|
13
|
+
# Usage: scripts/hosted_protocols_conformance.sh [stdio|unix|http ...]
|
|
14
|
+
# Default: all three. Runs from the project env (`uv run --no-sync`), which
|
|
15
|
+
# must have vgi-rpc with the [http,conformance] extras (the dev group does).
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
cd "$(dirname "$0")/.."
|
|
19
|
+
|
|
20
|
+
EXPECT="vgi.v2,conformance.Secondary.v1"
|
|
21
|
+
RUN=(uv run --no-sync)
|
|
22
|
+
BIN="$(dirname "$("${RUN[@]}" python -c 'import sys; print(sys.executable)')")"
|
|
23
|
+
TRANSPORTS=("$@")
|
|
24
|
+
[ ${#TRANSPORTS[@]} -eq 0 ] && TRANSPORTS=(stdio unix http)
|
|
25
|
+
|
|
26
|
+
# Short scratch dir: AF_UNIX paths are capped at ~104 bytes, and CI temp
|
|
27
|
+
# dirs can be long.
|
|
28
|
+
SCRATCH="$(mktemp -d /tmp/vgihp.XXXXXX)"
|
|
29
|
+
PIDS=()
|
|
30
|
+
cleanup() {
|
|
31
|
+
for pid in "${PIDS[@]}"; do kill "$pid" 2>/dev/null || true; done
|
|
32
|
+
rm -rf "$SCRATCH"
|
|
33
|
+
}
|
|
34
|
+
trap cleanup EXIT
|
|
35
|
+
|
|
36
|
+
wait_for() { # wait_for <description> <test command...>
|
|
37
|
+
local what="$1"; shift
|
|
38
|
+
for _ in $(seq 150); do "$@" && return 0; sleep 0.2; done
|
|
39
|
+
echo "timed out waiting for $what" >&2
|
|
40
|
+
return 1
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
run_stdio() {
|
|
44
|
+
echo "== hosted-protocols: stdio =="
|
|
45
|
+
"${RUN[@]}" vgi-rpc-test-hosted --cmd "$BIN/vgi-fixture-worker" --expect "$EXPECT" -- -rs
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
run_unix() {
|
|
49
|
+
echo "== hosted-protocols: unix =="
|
|
50
|
+
local sock="$SCRATCH/w.sock"
|
|
51
|
+
"$BIN/vgi-fixture-worker" --unix "$sock" --idle-timeout 300 >"$SCRATCH/unix.out" 2>"$SCRATCH/unix.err" &
|
|
52
|
+
PIDS+=($!)
|
|
53
|
+
wait_for "unix socket $sock" test -S "$sock" || { cat "$SCRATCH/unix.err" >&2; return 1; }
|
|
54
|
+
"${RUN[@]}" vgi-rpc-test-hosted --unix "$sock" --expect "$EXPECT" -- -rs
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
run_http() {
|
|
58
|
+
echo "== hosted-protocols: http (--identity) =="
|
|
59
|
+
local port
|
|
60
|
+
port="$("${RUN[@]}" python -c 'import socket; s = socket.socket(); s.bind(("127.0.0.1", 0)); print(s.getsockname()[1])')"
|
|
61
|
+
"$BIN/vgi-fixture-http" --identity --host 127.0.0.1 --port "$port" >"$SCRATCH/http.out" 2>"$SCRATCH/http.err" &
|
|
62
|
+
PIDS+=($!)
|
|
63
|
+
wait_for "HTTP worker on :$port" curl -sf -o /dev/null "http://127.0.0.1:$port/health" \
|
|
64
|
+
|| { cat "$SCRATCH/http.err" >&2; return 1; }
|
|
65
|
+
"${RUN[@]}" vgi-rpc-test-hosted --url "http://127.0.0.1:$port" --expect "$EXPECT" --identity -- -rs
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
for t in "${TRANSPORTS[@]}"; do
|
|
69
|
+
case "$t" in
|
|
70
|
+
stdio) run_stdio ;;
|
|
71
|
+
unix) run_unix ;;
|
|
72
|
+
http) run_http ;;
|
|
73
|
+
*) echo "unknown transport: $t (expected stdio, unix or http)" >&2; exit 2 ;;
|
|
74
|
+
esac
|
|
75
|
+
done
|
|
@@ -51,10 +51,13 @@ _TARGETS: list[tuple[str, str, str]] = [
|
|
|
51
51
|
"vgi",
|
|
52
52
|
),
|
|
53
53
|
("vgi.codegen.go_schemas", "vgi/generated/protocol_schemas.go", "vgi-go"),
|
|
54
|
+
("vgi.codegen.go_types", "vgi/generated/protocol_types.go", "vgi-go"),
|
|
54
55
|
("vgi.codegen.rust_schemas", "vgi-protocol/src/generated/protocol_schemas.rs", "vgi-rust"),
|
|
55
56
|
("vgi.codegen.rust_request_builders", "vgi-protocol/src/generated/request_params.rs", "vgi-rust"),
|
|
57
|
+
("vgi.codegen.rust_types", "vgi-protocol/src/generated/protocol_types.rs", "vgi-rust"),
|
|
56
58
|
("vgi.codegen.ts_schemas", "src/generated/vgi-protocol-schemas.ts", "vgi-typescript"),
|
|
57
59
|
("vgi.codegen.ts_client", "src/generated/vgi-client.ts", "vgi-typescript"),
|
|
60
|
+
("vgi.codegen.ts_types", "src/generated/vgi-protocol-types.ts", "vgi-typescript"),
|
|
58
61
|
("vgi.codegen.csharp_types", "src/QueryFarm.Vgi/Protocol/Generated/VgiProtocolTypes.g.cs", "vgi-csharp"),
|
|
59
62
|
(
|
|
60
63
|
"vgi.codegen.csharp_schemas",
|
|
@@ -68,6 +71,15 @@ _TARGETS: list[tuple[str, str, str]] = [
|
|
|
68
71
|
),
|
|
69
72
|
]
|
|
70
73
|
|
|
74
|
+
# vgi-java's generated wire records: one file per record (Java allows one public
|
|
75
|
+
# top-level type per file), so one target each. ``module:record`` tells
|
|
76
|
+
# `_render` to call ``emit(out, record=...)``. Derived from the generator's own
|
|
77
|
+
# list so adding a record there is all it takes.
|
|
78
|
+
_TARGETS += [
|
|
79
|
+
(f"vgi.codegen.java_types:{record}", relative, "vgi-java")
|
|
80
|
+
for record, relative in importlib.import_module("vgi.codegen.java_types").targets()
|
|
81
|
+
]
|
|
82
|
+
|
|
71
83
|
|
|
72
84
|
def _repo_root(name: str) -> Path | None:
|
|
73
85
|
"""Locate a sibling checkout, or ``None`` when it is not present."""
|
|
@@ -79,10 +91,18 @@ def _repo_root(name: str) -> Path | None:
|
|
|
79
91
|
|
|
80
92
|
|
|
81
93
|
def _render(module_name: str) -> str:
|
|
82
|
-
"""Render one artifact into memory. Raises if the generator fails.
|
|
94
|
+
"""Render one artifact into memory. Raises if the generator fails.
|
|
95
|
+
|
|
96
|
+
``module:record`` renders one file of a generator that emits several
|
|
97
|
+
(``emit(out, record=record)``).
|
|
98
|
+
"""
|
|
99
|
+
module_name, _, record = module_name.partition(":")
|
|
83
100
|
module = importlib.import_module(module_name)
|
|
84
101
|
buf = io.StringIO()
|
|
85
|
-
|
|
102
|
+
if record:
|
|
103
|
+
module.emit(buf, record=record)
|
|
104
|
+
else:
|
|
105
|
+
module.emit(buf)
|
|
86
106
|
text = buf.getvalue()
|
|
87
107
|
if not text.strip():
|
|
88
108
|
raise RuntimeError(f"{module_name}.emit() produced no output")
|