vgi-python 0.20.0__tar.gz → 0.21.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.20.0 → vgi_python-0.21.0}/PKG-INFO +1 -1
- {vgi_python-0.20.0 → vgi_python-0.21.0}/pyproject.toml +1 -1
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_serialization.py +12 -6
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_protocol_classes.py +58 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/uv.lock +1 -1
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/http_server.py +14 -4
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/catalog_interface.py +4 -3
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/protocol.py +4 -4
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.gitattributes +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.gitignore +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.python-version +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/.vale.ini +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/CLAUDE.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/LICENSE +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/README.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/SECURITY.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/ci/README.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/auth.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/client.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/filters.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/functions.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/http.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/index.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/observability.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/storage.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/api/worker.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/authentication.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/catalog-interface.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/cli.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/generator-api.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/index.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/metadata.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/robots.txt +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/mkdocs.yml +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/test-data/generate.sh +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/conftest.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/landing/_checker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/landing/describe.expected.json +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/landing/describe.schema.json +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_auth.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_cache_control.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_landing_conformance.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_otel.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_schema_scoped_functions.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_serve.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/argument_spec.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/arguments.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/attach_header.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/auth.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/cache_control.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/client/client.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/http/describe_json.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/http/landing.html +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/invocation.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/metadata.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/otel.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/py.typed +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/scalar_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/serve.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/table_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/vgi/worker.py +0 -0
- {vgi_python-0.20.0 → vgi_python-0.21.0}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.21.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
|
|
@@ -1275,16 +1275,22 @@ class TestScanBranchSerialization:
|
|
|
1275
1275
|
assert restored.branches[1].function_name == "iceberg_scan"
|
|
1276
1276
|
assert restored.required_extensions == ["iceberg", "httpfs"]
|
|
1277
1277
|
|
|
1278
|
-
def
|
|
1279
|
-
"""Empty branches list
|
|
1280
|
-
|
|
1281
|
-
|
|
1278
|
+
def test_scan_branches_result_empty_branches_tolerated(self) -> None:
|
|
1279
|
+
"""Empty branches list round-trips cleanly.
|
|
1280
|
+
|
|
1281
|
+
Lenient producers (the Rust/Go/Java SDKs, tolerated by the DuckDB C++
|
|
1282
|
+
client) omit the IPC stream for an empty nested list, so a strict
|
|
1283
|
+
consumer must accept a zero-branch result rather than raising — otherwise
|
|
1284
|
+
the Cedar proxy (the only strict Python consumer in the path) fails
|
|
1285
|
+
closed on a legitimate response.
|
|
1286
|
+
"""
|
|
1282
1287
|
from vgi.catalog import ScanBranchesResult
|
|
1283
1288
|
|
|
1284
1289
|
empty = ScanBranchesResult(branches=[], required_extensions=[])
|
|
1285
1290
|
batch, _ = deserialize_record_batch(empty.serialize())
|
|
1286
|
-
|
|
1287
|
-
|
|
1291
|
+
restored = ScanBranchesResult.deserialize(batch)
|
|
1292
|
+
assert restored.branches == []
|
|
1293
|
+
assert restored.required_extensions == []
|
|
1288
1294
|
|
|
1289
1295
|
|
|
1290
1296
|
class TestSecretTypeSpecSerialization:
|
|
@@ -1149,3 +1149,61 @@ class TestAnyArrow:
|
|
|
1149
1149
|
assert obj.data.value == {"key": "value"}
|
|
1150
1150
|
assert obj.data.position == "data"
|
|
1151
1151
|
assert obj.data.name == "data"
|
|
1152
|
+
|
|
1153
|
+
|
|
1154
|
+
class TestBindCallWireFormat:
|
|
1155
|
+
"""The embedded ``bind_call`` must serialize as an opaque binary IPC blob.
|
|
1156
|
+
|
|
1157
|
+
Every non-Python VGI implementation (the DuckDB C++ client, the Rust/Go/Java
|
|
1158
|
+
SDKs) encodes ``bind_call`` as ``Bytes`` — an IPC-serialized ``BindRequest``
|
|
1159
|
+
(Rust: ``ipc::read_batch(&dto.bind_call.0)``). If Python serializes it as an
|
|
1160
|
+
inline Arrow *struct* instead, those workers reject the request with
|
|
1161
|
+
"expected Binary array". This regression-anchors the ``bind_call`` field
|
|
1162
|
+
being ``Annotated[BindRequest, ArrowType(pa.binary())]`` on every request
|
|
1163
|
+
that carries one, so the Cedar proxy's re-serialized bind stays wire-
|
|
1164
|
+
compatible with a non-Python backend.
|
|
1165
|
+
"""
|
|
1166
|
+
|
|
1167
|
+
@staticmethod
|
|
1168
|
+
def _bind_call_arrow_type(obj: object) -> str:
|
|
1169
|
+
batch = pa.ipc.open_stream(obj.serialize_to_bytes()).read_next_batch() # type: ignore[attr-defined]
|
|
1170
|
+
return str(dict((f.name, f.type) for f in batch.schema)["bind_call"])
|
|
1171
|
+
|
|
1172
|
+
def _make_bind(self) -> object:
|
|
1173
|
+
"""Build a minimal ``BindRequest`` to embed as ``bind_call``."""
|
|
1174
|
+
from vgi.protocol import BindRequest, FunctionType
|
|
1175
|
+
|
|
1176
|
+
return BindRequest(
|
|
1177
|
+
function_name="f",
|
|
1178
|
+
arguments=Arguments(positional=[], named=None),
|
|
1179
|
+
function_type=FunctionType.TABLE,
|
|
1180
|
+
)
|
|
1181
|
+
|
|
1182
|
+
def test_init_request_bind_call_is_binary(self) -> None:
|
|
1183
|
+
"""``InitRequest.bind_call`` serializes as binary and round-trips."""
|
|
1184
|
+
from vgi.protocol import InitRequest
|
|
1185
|
+
|
|
1186
|
+
ir = InitRequest(bind_call=self._make_bind(), output_schema=pa.schema([pa.field("x", pa.int64())]))
|
|
1187
|
+
assert self._bind_call_arrow_type(ir) == "binary"
|
|
1188
|
+
# round-trips back into a BindRequest
|
|
1189
|
+
restored = InitRequest.deserialize_from_bytes(ir.serialize_to_bytes())
|
|
1190
|
+
assert restored.bind_call.function_name == "f"
|
|
1191
|
+
|
|
1192
|
+
def test_table_function_requests_bind_call_is_binary(self) -> None:
|
|
1193
|
+
"""The ``table_function_*`` requests also serialize ``bind_call`` as binary."""
|
|
1194
|
+
from vgi.protocol import (
|
|
1195
|
+
TableFunctionCardinalityRequest,
|
|
1196
|
+
TableFunctionDynamicToStringRequest,
|
|
1197
|
+
TableFunctionStatisticsRequest,
|
|
1198
|
+
)
|
|
1199
|
+
|
|
1200
|
+
cases = [
|
|
1201
|
+
(TableFunctionCardinalityRequest, {}),
|
|
1202
|
+
(TableFunctionStatisticsRequest, {}),
|
|
1203
|
+
(TableFunctionDynamicToStringRequest, {"global_execution_id": b"exec"}),
|
|
1204
|
+
]
|
|
1205
|
+
for cls, extra in cases:
|
|
1206
|
+
obj = cls(bind_call=self._make_bind(), **extra)
|
|
1207
|
+
assert self._bind_call_arrow_type(obj) == "binary", cls.__name__
|
|
1208
|
+
restored = cls.deserialize_from_bytes(obj.serialize_to_bytes())
|
|
1209
|
+
assert restored.bind_call.function_name == "f", cls.__name__
|
|
@@ -330,13 +330,23 @@ def main() -> None:
|
|
|
330
330
|
|
|
331
331
|
authenticate = _optional_bearer
|
|
332
332
|
|
|
333
|
-
from vgi.worker import _get_vgi_version
|
|
334
|
-
|
|
335
333
|
# Match vgi-fixture-worker (subprocess transport): always serve the
|
|
336
334
|
# base ExampleWorker plus the projection_repro, schema_reconcile,
|
|
337
335
|
# and accumulate fixture catalogs. Add the writable catalog when its
|
|
338
|
-
# extra is installed.
|
|
339
|
-
|
|
336
|
+
# extra is installed. The twin_a/twin_b catalogs (same worker, one
|
|
337
|
+
# function name colliding across two catalogs) back
|
|
338
|
+
# scalar/same_name_catalogs.test — catalog-qualified dispatch.
|
|
339
|
+
from vgi._test_fixtures.twin_catalogs import TwinAWorker, TwinBWorker
|
|
340
|
+
from vgi.worker import _get_vgi_version
|
|
341
|
+
|
|
342
|
+
worker_classes: list[type] = [
|
|
343
|
+
ExampleWorker,
|
|
344
|
+
ProjReproWorker,
|
|
345
|
+
SchemaReconcileWorker,
|
|
346
|
+
AccumulateWorker,
|
|
347
|
+
TwinAWorker,
|
|
348
|
+
TwinBWorker,
|
|
349
|
+
]
|
|
340
350
|
try:
|
|
341
351
|
from vgi._test_fixtures.writable.worker import WritableWorker
|
|
342
352
|
except ImportError:
|
|
@@ -1188,9 +1188,10 @@ class ScanBranchesResult:
|
|
|
1188
1188
|
)
|
|
1189
1189
|
|
|
1190
1190
|
branch_blobs = cast("list[bytes]", row["branches"])
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1191
|
+
# An empty branch list is valid: a multi-branch scan can prune to zero
|
|
1192
|
+
# branches (see catalog/multi_branch_empty_branches) — it scans nothing.
|
|
1193
|
+
# Lenient producers (the Rust/Go/Java SDKs, tolerated by the DuckDB C++
|
|
1194
|
+
# client) send it; don't reject.
|
|
1194
1195
|
branches: list[ScanBranch] = []
|
|
1195
1196
|
for blob in branch_blobs:
|
|
1196
1197
|
branch_batch, _ = deserialize_record_batch(blob)
|
|
@@ -288,7 +288,7 @@ class InitRequest(ArrowSerializableDataclass):
|
|
|
288
288
|
"""
|
|
289
289
|
|
|
290
290
|
# Core (always present)
|
|
291
|
-
bind_call: BindRequest
|
|
291
|
+
bind_call: Annotated[BindRequest, ArrowType(pa.binary())]
|
|
292
292
|
output_schema: Annotated[pa.Schema, ArrowType(pa.binary())]
|
|
293
293
|
bind_opaque_data: Annotated[bytes | None, ArrowType(pa.binary())] = None
|
|
294
294
|
|
|
@@ -348,7 +348,7 @@ class TableFunctionCardinalityRequest(ArrowSerializableDataclass):
|
|
|
348
348
|
``InitRequest.bind_opaque_data``).
|
|
349
349
|
"""
|
|
350
350
|
|
|
351
|
-
bind_call: BindRequest
|
|
351
|
+
bind_call: Annotated[BindRequest, ArrowType(pa.binary())]
|
|
352
352
|
bind_opaque_data: Annotated[bytes | None, ArrowType(pa.binary())] = None
|
|
353
353
|
|
|
354
354
|
|
|
@@ -368,7 +368,7 @@ class TableFunctionStatisticsRequest(ArrowSerializableDataclass):
|
|
|
368
368
|
``InitRequest.bind_opaque_data``).
|
|
369
369
|
"""
|
|
370
370
|
|
|
371
|
-
bind_call: BindRequest
|
|
371
|
+
bind_call: Annotated[BindRequest, ArrowType(pa.binary())]
|
|
372
372
|
bind_opaque_data: Annotated[bytes | None, ArrowType(pa.binary())] = None
|
|
373
373
|
|
|
374
374
|
|
|
@@ -392,7 +392,7 @@ class TableFunctionDynamicToStringRequest(ArrowSerializableDataclass):
|
|
|
392
392
|
persisted the diagnostics this RPC retrieves.
|
|
393
393
|
"""
|
|
394
394
|
|
|
395
|
-
bind_call: BindRequest
|
|
395
|
+
bind_call: Annotated[BindRequest, ArrowType(pa.binary())]
|
|
396
396
|
bind_opaque_data: Annotated[bytes | None, ArrowType(pa.binary())] = None
|
|
397
397
|
global_execution_id: bytes
|
|
398
398
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|