vgi-python 0.31.0__tar.gz → 0.31.2__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.31.0 → vgi_python-0.31.2}/PKG-INFO +1 -1
- {vgi_python-0.31.0 → vgi_python-0.31.2}/pyproject.toml +1 -1
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_metadata.py +68 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_setting_secret_annotations.py +62 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/uv.lock +1 -1
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/arithmetic.py +4 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/catalog_interface.py +6 -3
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/client.py +16 -5
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/metadata.py +16 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.gitattributes +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/dependabot.yml +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/release.yml +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.gitignore +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.python-version +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/.vale.ini +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/CLAUDE.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/LICENSE +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/README.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/RELEASE-RUNBOOK.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/SECURITY.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/ci/README.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/ci/run-integration.sh +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/arguments.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/auth.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/catalogs.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/client.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/exceptions.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/filters.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/functions.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/http.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/index.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/metadata.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/observability.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/storage.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/transactor.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/worker.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/argument-serialization.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/logo.png +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/social-card.png +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/authentication.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/catalog-interface.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/cli.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/column-statistics.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/concepts/index.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/contributing-docs.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/generator-api.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/global-functions.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/index.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/index.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/lifecycle.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/metadata.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/overrides/main.html +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/robots.txt +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/shared-storage.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/tutorial/index.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/tutorial/table.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/vgi-logo.png +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/batch_index_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/cache_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/calc_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/copy_format_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/filter_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/row_count_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/sum_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/mkdocs.yml +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/scripts/measure_startup.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/test-data/generate.sh +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_attach_option.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_aggregate_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_batch_metadata_callback.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_cli.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_copy_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_scan_branches_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_split_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_stop_force.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_table_column_statistics.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_time_travel_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_splits.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conftest.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/bad_version.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/generate.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/manifest.json +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/stale_anchor.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/truncated.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/valid_sealed.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/valid_unsealed.bin +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/test_wide_columns.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/test_blended_exchange.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/test_blended_metadata.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_auth.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_cache_control.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_call_state_attach.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_client_oauth.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_docstrings.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_exceptions.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_fixture_catalog_parity.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_java_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_rust_request_builders.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_rust_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_launch_transport.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_otel.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_schema_scoped_functions.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_serve.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_signing_key.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_split_token.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_union_argument.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_wire_record_schema_parity.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_worker_page.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_duckdb.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/global_functions.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/same_name.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/cache.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/splits.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/wide.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table_in_out.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/twin_catalogs.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/argument_spec.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/arguments.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/attach_header.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/auth.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/cache_control.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/aggregate.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/errors.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/java_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/rust_request_builders.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/rust_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/exceptions.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function_storage.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/landing.html +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/vgi-client.js +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/invocation.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/logging_config.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/meta_worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/otel.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/profiling.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/protocol.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/py.typed +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/scalar_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/schema_utils.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/secret_service.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/serve.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/split_token.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/client.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/server.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/worker.py +0 -0
- {vgi_python-0.31.0 → vgi_python-0.31.2}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.31.
|
|
3
|
+
Version: 0.31.2
|
|
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
|
|
@@ -64,6 +64,32 @@ class TestResolveMetadata:
|
|
|
64
64
|
assert meta.categories == ["transform", "utility"]
|
|
65
65
|
assert meta.max_workers == 4
|
|
66
66
|
|
|
67
|
+
def test_comment_defaults_to_none(self) -> None:
|
|
68
|
+
"""Meta.comment is unset by default -- unlike description, no docstring fallback."""
|
|
69
|
+
|
|
70
|
+
class UndocumentedCommentFunction(TableInOutFunction): # type: ignore[type-arg]
|
|
71
|
+
"""A function with only a docstring, no Meta.comment."""
|
|
72
|
+
|
|
73
|
+
data: TableInput = Arg[TableInput](0, doc="Input table") # type: ignore[assignment]
|
|
74
|
+
|
|
75
|
+
meta = UndocumentedCommentFunction.get_metadata()
|
|
76
|
+
assert meta.comment is None
|
|
77
|
+
|
|
78
|
+
def test_function_with_comment(self) -> None:
|
|
79
|
+
"""Meta.comment is a short operator-facing note, distinct from description."""
|
|
80
|
+
|
|
81
|
+
class DeprecatedFunction(TableInOutFunction): # type: ignore[type-arg]
|
|
82
|
+
class Meta:
|
|
83
|
+
name = "deprecated_func"
|
|
84
|
+
description = "Does the thing"
|
|
85
|
+
comment = "deprecated, use deprecated_func_v2 instead"
|
|
86
|
+
|
|
87
|
+
data: TableInput = Arg[TableInput](0, doc="Input table") # type: ignore[assignment]
|
|
88
|
+
|
|
89
|
+
meta = DeprecatedFunction.get_metadata()
|
|
90
|
+
assert meta.description == "Does the thing"
|
|
91
|
+
assert meta.comment == "deprecated, use deprecated_func_v2 instead"
|
|
92
|
+
|
|
67
93
|
def test_name_auto_generation(self) -> None:
|
|
68
94
|
"""Function name is auto-generated from class name."""
|
|
69
95
|
|
|
@@ -727,3 +753,45 @@ class TestFunctionTags:
|
|
|
727
753
|
}
|
|
728
754
|
# Structured examples are carried separately from the tag-encoded ones.
|
|
729
755
|
assert [ex.sql for ex in info.examples] == ["SELECT * FROM dynamic_table()"]
|
|
756
|
+
|
|
757
|
+
def test_comment_flows_into_function_info(self) -> None:
|
|
758
|
+
"""Meta.comment reaches FunctionInfo.comment (the field every other catalog object already has)."""
|
|
759
|
+
from vgi.catalog.catalog_interface import (
|
|
760
|
+
FunctionInfo,
|
|
761
|
+
ReadOnlyCatalogInterface,
|
|
762
|
+
)
|
|
763
|
+
from vgi.table_function import ProcessParams, TableFunctionGenerator
|
|
764
|
+
|
|
765
|
+
class CommentedTable(TableFunctionGenerator): # type: ignore[type-arg]
|
|
766
|
+
class Meta:
|
|
767
|
+
name = "commented_table"
|
|
768
|
+
comment = "internal — do not call directly"
|
|
769
|
+
|
|
770
|
+
FIXED_SCHEMA = pa.schema([pa.field("id", pa.int64())])
|
|
771
|
+
|
|
772
|
+
@classmethod
|
|
773
|
+
def process(cls, params: ProcessParams[Any], state: None, out: OutputCollector) -> None:
|
|
774
|
+
out.emit(pa.record_batch({"id": [1]}))
|
|
775
|
+
out.finish()
|
|
776
|
+
|
|
777
|
+
class UncommentedTable(TableFunctionGenerator): # type: ignore[type-arg]
|
|
778
|
+
class Meta:
|
|
779
|
+
name = "uncommented_table"
|
|
780
|
+
|
|
781
|
+
FIXED_SCHEMA = pa.schema([pa.field("id", pa.int64())])
|
|
782
|
+
|
|
783
|
+
@classmethod
|
|
784
|
+
def process(cls, params: ProcessParams[Any], state: None, out: OutputCollector) -> None:
|
|
785
|
+
out.emit(pa.record_batch({"id": [1]}))
|
|
786
|
+
out.finish()
|
|
787
|
+
|
|
788
|
+
class Cat(ReadOnlyCatalogInterface):
|
|
789
|
+
catalog_name = "functions"
|
|
790
|
+
functions = [CommentedTable, UncommentedTable]
|
|
791
|
+
|
|
792
|
+
commented_info = Cat()._function_to_info(CommentedTable, "main")
|
|
793
|
+
assert isinstance(commented_info, FunctionInfo)
|
|
794
|
+
assert commented_info.comment == "internal — do not call directly"
|
|
795
|
+
|
|
796
|
+
uncommented_info = Cat()._function_to_info(UncommentedTable, "main")
|
|
797
|
+
assert uncommented_info.comment is None
|
|
@@ -237,6 +237,68 @@ class TestTableFunctionSettingAnnotations:
|
|
|
237
237
|
assert "details" in table.schema.names # verbose mode adds details column
|
|
238
238
|
assert table.column("greeting").to_pylist() == ["Hola", "Hola", "Hola"]
|
|
239
239
|
|
|
240
|
+
def test_secret_delivers_dict_of_scalars(self, fixture_worker: str) -> None:
|
|
241
|
+
"""SecretDemoFunction (table function) receives a client-supplied secret.
|
|
242
|
+
|
|
243
|
+
Regression for `Client.table_function` hardcoding `secrets=None` on
|
|
244
|
+
the wire — the same `vgi_example` secret shape already proven to work
|
|
245
|
+
for `ReturnSecretValueFunction` (scalar) above, now exercised through
|
|
246
|
+
the table-function path instead.
|
|
247
|
+
"""
|
|
248
|
+
from vgi.client import Client
|
|
249
|
+
|
|
250
|
+
# SecretDemoFunction resolves via `params.secrets.of_type("vgi_example")`
|
|
251
|
+
# (not the `Secret()`-annotation path `test_secret_delivers_dict_of_scalars`
|
|
252
|
+
# above uses), which filters on the secret payload's OWN `type` field —
|
|
253
|
+
# so, unlike that test's arbitrary `"type": "test"`, this one must be
|
|
254
|
+
# `"type": "vgi_example"` to match.
|
|
255
|
+
secret_value = {"type": "vgi_example", "provider": "config", "secret_string": "s3cr3t"}
|
|
256
|
+
|
|
257
|
+
with Client(fixture_worker) as client:
|
|
258
|
+
outputs = list(
|
|
259
|
+
client.table_function(
|
|
260
|
+
function_name="secret_demo",
|
|
261
|
+
schema_name="main",
|
|
262
|
+
secrets={"vgi_example": secret_value},
|
|
263
|
+
)
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
table = pa.Table.from_batches(outputs)
|
|
267
|
+
assert dict(zip(table.column("key").to_pylist(), table.column("value").to_pylist(), strict=True)) == {
|
|
268
|
+
"type": "vgi_example",
|
|
269
|
+
"provider": "config",
|
|
270
|
+
"secret_string": "s3cr3t",
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
def test_secret_delivers_to_table_in_out_function(self, fixture_worker: str) -> None:
|
|
274
|
+
"""SecretInOutFunction receives a client-supplied secret.
|
|
275
|
+
|
|
276
|
+
Regression for `Client.table_in_out_function` hardcoding `secrets=None`
|
|
277
|
+
on the wire — the fixture (`secret_in_out`) already existed but had no
|
|
278
|
+
test exercising it end to end, which is exactly how the bug went
|
|
279
|
+
unnoticed.
|
|
280
|
+
"""
|
|
281
|
+
from vgi.client import Client
|
|
282
|
+
|
|
283
|
+
# Same `of_type("vgi_example")` resolution as SecretDemoFunction above —
|
|
284
|
+
# the payload's own `type` field must equal the requested secret_type.
|
|
285
|
+
secret_value = {"type": "vgi_example", "provider": "config", "secret_string": "s3cr3t"}
|
|
286
|
+
batch = pa.RecordBatch.from_pydict({"n": [1, 2]})
|
|
287
|
+
|
|
288
|
+
with Client(fixture_worker) as client:
|
|
289
|
+
outputs = list(
|
|
290
|
+
client.table_in_out_function(
|
|
291
|
+
function_name="secret_in_out",
|
|
292
|
+
schema_name="main",
|
|
293
|
+
input=iter([batch]),
|
|
294
|
+
secrets={"vgi_example": secret_value},
|
|
295
|
+
)
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
table = pa.Table.from_batches(outputs)
|
|
299
|
+
assert table.column("n").to_pylist() == [1, 2]
|
|
300
|
+
assert table.column("secret_string").to_pylist() == ["s3cr3t", "s3cr3t"]
|
|
301
|
+
|
|
240
302
|
|
|
241
303
|
# ---------------------------------------------------------------------------
|
|
242
304
|
# Tests for auto-population of Meta.required_settings/required_secrets
|
|
@@ -37,6 +37,10 @@ class MultiplyFunction(ScalarFunction):
|
|
|
37
37
|
|
|
38
38
|
name = "multiply"
|
|
39
39
|
description = "Multiplies a value by a constant factor"
|
|
40
|
+
# Meta.comment fixture: a short operator-facing note distinct from
|
|
41
|
+
# `description` — exercised by test_multiply_function_comment and
|
|
42
|
+
# the C++ integration test function_arguments.test.
|
|
43
|
+
comment = "fixture function for scalar bind-parameter tests"
|
|
40
44
|
examples = [
|
|
41
45
|
FunctionExample(
|
|
42
46
|
sql="SELECT multiply(price, 2) FROM products",
|
|
@@ -649,8 +649,11 @@ class FunctionInfo(CatalogSchemaObject, ArrowSerializableDataclass):
|
|
|
649
649
|
null_handling: Scalar function behavior field (None for non-scalar
|
|
650
650
|
functions).
|
|
651
651
|
description: Intrinsic documentation from function metadata
|
|
652
|
-
(``Meta.description``).
|
|
653
|
-
|
|
652
|
+
(``Meta.description``). ``comment`` (inherited from the base
|
|
653
|
+
object) is a separate, shorter operator-facing note from
|
|
654
|
+
``Meta.comment`` — e.g. "deprecated, use v2". Both are static:
|
|
655
|
+
there is no ``COMMENT ON FUNCTION`` RPC, unlike tables/views,
|
|
656
|
+
whose ``comment`` is dynamically settable.
|
|
654
657
|
examples: Usage examples for the function.
|
|
655
658
|
categories: Category labels for the function.
|
|
656
659
|
projection_pushdown: Table-function capability (None for scalar
|
|
@@ -3389,7 +3392,7 @@ class ReadOnlyCatalogInterface(CatalogInterface):
|
|
|
3389
3392
|
function_type=func_type,
|
|
3390
3393
|
arguments=args_bytes,
|
|
3391
3394
|
output_schema=output_bytes,
|
|
3392
|
-
comment=
|
|
3395
|
+
comment=meta.comment, # Static, Meta-declared only — see Meta.comment
|
|
3393
3396
|
tags=meta.tags,
|
|
3394
3397
|
# Scalar/aggregate function behavior fields
|
|
3395
3398
|
stability=meta.stability if is_scalar else None,
|
|
@@ -2014,6 +2014,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2014
2014
|
projection_ids: list[int] | None = None,
|
|
2015
2015
|
pushdown_filters: bytes | None = None,
|
|
2016
2016
|
settings: dict[str, Any] | None = None,
|
|
2017
|
+
secrets: dict[str, Any] | None = None,
|
|
2017
2018
|
transaction_opaque_data: bytes | None = None,
|
|
2018
2019
|
parent_row_callback: Callable[[list[int]], None] | None = None,
|
|
2019
2020
|
has_finalize: bool = True,
|
|
@@ -2043,6 +2044,8 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2043
2044
|
to push down to the function.
|
|
2044
2045
|
settings: Optional dictionary of settings/pragmas to
|
|
2045
2046
|
pass to the function.
|
|
2047
|
+
secrets: Optional dictionary of secret name to value pairs.
|
|
2048
|
+
Values can be simple scalars or dicts (for struct-typed secrets).
|
|
2046
2049
|
transaction_opaque_data: Optional unique identifier for the DuckDB transaction.
|
|
2047
2050
|
parent_row_callback: Optional callback invoked once per yielded
|
|
2048
2051
|
output batch (before finalize), immediately before the yield,
|
|
@@ -2108,7 +2111,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2108
2111
|
function_type=FunctionType.TABLE,
|
|
2109
2112
|
input_schema=input_schema,
|
|
2110
2113
|
settings=settings,
|
|
2111
|
-
secrets=
|
|
2114
|
+
secrets=secrets,
|
|
2112
2115
|
transaction_opaque_data=transaction_opaque_data,
|
|
2113
2116
|
projection_ids=projection_ids,
|
|
2114
2117
|
pushdown_filters_batch=pushdown_filters_batch,
|
|
@@ -2173,6 +2176,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2173
2176
|
projection_ids: list[int] | None = None,
|
|
2174
2177
|
pushdown_filters: bytes | None = None,
|
|
2175
2178
|
settings: dict[str, Any] | None = None,
|
|
2179
|
+
secrets: dict[str, Any] | None = None,
|
|
2176
2180
|
transaction_opaque_data: bytes | None = None,
|
|
2177
2181
|
copy_to: CopyToContext | None = None,
|
|
2178
2182
|
input_schema: pa.Schema | None = None,
|
|
@@ -2215,6 +2219,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2215
2219
|
projection_ids: Optional column indices for projection.
|
|
2216
2220
|
pushdown_filters: Optional serialized filter predicates.
|
|
2217
2221
|
settings: Optional settings/pragmas to pass to the function.
|
|
2222
|
+
secrets: Optional dictionary of secret name to value pairs.
|
|
2218
2223
|
transaction_opaque_data: Optional DuckDB transaction identifier.
|
|
2219
2224
|
copy_to: Optional [`CopyToContext`][] marking this sink as a
|
|
2220
2225
|
``COPY ... TO`` write. A ``CopyToFunction`` returns no finalize
|
|
@@ -2261,7 +2266,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2261
2266
|
function_type=FunctionType.TABLE_BUFFERING,
|
|
2262
2267
|
input_schema=input_schema,
|
|
2263
2268
|
settings=settings,
|
|
2264
|
-
secrets=
|
|
2269
|
+
secrets=secrets,
|
|
2265
2270
|
transaction_opaque_data=transaction_opaque_data,
|
|
2266
2271
|
copy_to=copy_to,
|
|
2267
2272
|
)
|
|
@@ -2422,6 +2427,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2422
2427
|
projection_ids: list[int] | None = None,
|
|
2423
2428
|
pushdown_filters: bytes | None = None,
|
|
2424
2429
|
settings: dict[str, Any] | None = None,
|
|
2430
|
+
secrets: dict[str, Any] | None = None,
|
|
2425
2431
|
transaction_opaque_data: bytes | None = None,
|
|
2426
2432
|
target_split_bytes: int | None = None,
|
|
2427
2433
|
min_splits: int | None = None,
|
|
@@ -2460,6 +2466,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2460
2466
|
pushdown_filters: Optional byte string of filter predicates,
|
|
2461
2467
|
same wire format as :meth:`table_function`'s.
|
|
2462
2468
|
settings: Optional dictionary of settings/pragmas.
|
|
2469
|
+
secrets: Optional dictionary of secret name to value pairs.
|
|
2463
2470
|
transaction_opaque_data: Optional transaction identifier.
|
|
2464
2471
|
target_split_bytes: Requested split size — the primary sizing
|
|
2465
2472
|
lever; the client can't see per-split cost and will treat
|
|
@@ -2499,7 +2506,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2499
2506
|
arguments=arguments,
|
|
2500
2507
|
function_type=FunctionType.TABLE,
|
|
2501
2508
|
settings=settings,
|
|
2502
|
-
secrets=
|
|
2509
|
+
secrets=secrets,
|
|
2503
2510
|
transaction_opaque_data=transaction_opaque_data,
|
|
2504
2511
|
)
|
|
2505
2512
|
bind_response = self._do_bind(self._primary.proxy, bind_request, None)
|
|
@@ -2542,6 +2549,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2542
2549
|
projection_ids: list[int] | None = None,
|
|
2543
2550
|
pushdown_filters: bytes | None = None,
|
|
2544
2551
|
settings: dict[str, Any] | None = None,
|
|
2552
|
+
secrets: dict[str, Any] | None = None,
|
|
2545
2553
|
transaction_opaque_data: bytes | None = None,
|
|
2546
2554
|
copy_from: CopyFromContext | None = None,
|
|
2547
2555
|
split_tokens: list[bytes] | None = None,
|
|
@@ -2577,6 +2585,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2577
2585
|
to push down to the function.
|
|
2578
2586
|
settings: Optional dictionary of settings/pragmas to
|
|
2579
2587
|
pass to the function.
|
|
2588
|
+
secrets: Optional dictionary of secret name to value pairs.
|
|
2580
2589
|
transaction_opaque_data: Optional unique identifier for the DuckDB transaction.
|
|
2581
2590
|
copy_from: Optional [`CopyFromContext`][] marking this scan as a
|
|
2582
2591
|
``COPY ... FROM`` read. Prefer :meth:`copy_from`, which builds
|
|
@@ -2640,7 +2649,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2640
2649
|
function_type=FunctionType.TABLE,
|
|
2641
2650
|
input_schema=None,
|
|
2642
2651
|
settings=settings,
|
|
2643
|
-
secrets=
|
|
2652
|
+
secrets=secrets,
|
|
2644
2653
|
transaction_opaque_data=transaction_opaque_data,
|
|
2645
2654
|
projection_ids=projection_ids,
|
|
2646
2655
|
pushdown_filters_batch=pushdown_filters_batch,
|
|
@@ -2678,6 +2687,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2678
2687
|
projection_ids: list[int] | None = None,
|
|
2679
2688
|
pushdown_filters: bytes | None = None,
|
|
2680
2689
|
settings: dict[str, Any] | None = None,
|
|
2690
|
+
secrets: dict[str, Any] | None = None,
|
|
2681
2691
|
transaction_opaque_data: bytes | None = None,
|
|
2682
2692
|
resume_token: bytes | None = None,
|
|
2683
2693
|
) -> ResumableTableScan:
|
|
@@ -2703,6 +2713,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2703
2713
|
pushdown). ``None`` selects all columns.
|
|
2704
2714
|
pushdown_filters: Optional serialized filter-pushdown payload.
|
|
2705
2715
|
settings: Optional DuckDB settings to apply for the scan.
|
|
2716
|
+
secrets: Optional dictionary of secret name to value pairs.
|
|
2706
2717
|
transaction_opaque_data: Optional catalog transaction handle.
|
|
2707
2718
|
resume_token: Continuation token from a prior batch to resume from;
|
|
2708
2719
|
must be paired with the same ``function_name``/projection/
|
|
@@ -2737,7 +2748,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
|
|
|
2737
2748
|
function_type=FunctionType.TABLE,
|
|
2738
2749
|
input_schema=None,
|
|
2739
2750
|
settings=settings,
|
|
2740
|
-
secrets=
|
|
2751
|
+
secrets=secrets,
|
|
2741
2752
|
transaction_opaque_data=transaction_opaque_data,
|
|
2742
2753
|
)
|
|
2743
2754
|
bind_response = self._do_bind(self._primary.proxy, bind_request, None)
|
|
@@ -360,6 +360,12 @@ class ResolvedMetadata:
|
|
|
360
360
|
function_type: The [`CatalogFunctionType`][] (scalar, table, aggregate,
|
|
361
361
|
or table-buffering).
|
|
362
362
|
description: Human-readable description of the function.
|
|
363
|
+
comment: Short operator-facing note (e.g. "deprecated, use v2" or
|
|
364
|
+
"internal — do not call directly"), distinct from `description`'s
|
|
365
|
+
intrinsic documentation. Mirrors the `comment` every other catalog
|
|
366
|
+
object (table/view/schema) already carries — functions only had
|
|
367
|
+
`description` until now. Static (Meta-declared) only; there is no
|
|
368
|
+
`COMMENT ON FUNCTION` RPC to change it at runtime.
|
|
363
369
|
examples: SQL usage examples for the function.
|
|
364
370
|
categories: Classification/category labels.
|
|
365
371
|
tags: Free-form key/value metadata tags.
|
|
@@ -430,6 +436,7 @@ class ResolvedMetadata:
|
|
|
430
436
|
|
|
431
437
|
# Documentation
|
|
432
438
|
description: str = ""
|
|
439
|
+
comment: str | None = None
|
|
433
440
|
examples: list[FunctionExample] = field(default_factory=list)
|
|
434
441
|
categories: list[str] = field(default_factory=list)
|
|
435
442
|
tags: dict[str, str] = field(default_factory=dict)
|
|
@@ -518,6 +525,7 @@ class ResolvedMetadata:
|
|
|
518
525
|
"class_name": self.class_name,
|
|
519
526
|
"function_type": self.function_type.name,
|
|
520
527
|
"description": self.description,
|
|
528
|
+
"comment": self.comment,
|
|
521
529
|
"examples": [ex.to_dict() for ex in self.examples],
|
|
522
530
|
"categories": self.categories,
|
|
523
531
|
"tags": self.tags,
|
|
@@ -558,6 +566,7 @@ class ResolvedMetadata:
|
|
|
558
566
|
class_name=d["class_name"],
|
|
559
567
|
function_type=CatalogFunctionType[d["function_type"]],
|
|
560
568
|
description=d.get("description", ""),
|
|
569
|
+
comment=d.get("comment"),
|
|
561
570
|
examples=[FunctionExample.from_dict(ex) for ex in d.get("examples", [])],
|
|
562
571
|
categories=d.get("categories", []),
|
|
563
572
|
tags=dict(d.get("tags", {})),
|
|
@@ -962,6 +971,7 @@ _VALID_META_ATTRIBUTES: frozenset[str] = frozenset(
|
|
|
962
971
|
# Common
|
|
963
972
|
"name",
|
|
964
973
|
"description",
|
|
974
|
+
"comment",
|
|
965
975
|
"examples",
|
|
966
976
|
"categories",
|
|
967
977
|
"tags",
|
|
@@ -1135,6 +1145,10 @@ def resolve_metadata(cls: type) -> ResolvedMetadata:
|
|
|
1135
1145
|
if not description and cls.__doc__:
|
|
1136
1146
|
description = cls.__doc__.strip().split("\n")[0]
|
|
1137
1147
|
|
|
1148
|
+
# comment has no docstring fallback (unlike description) — it's a
|
|
1149
|
+
# deliberate operator-facing opt-in, not something to infer.
|
|
1150
|
+
comment = attrs.get("comment")
|
|
1151
|
+
|
|
1138
1152
|
# Normalize examples
|
|
1139
1153
|
examples = _normalize_examples(attrs.get("examples", []))
|
|
1140
1154
|
|
|
@@ -1223,6 +1237,7 @@ def resolve_metadata(cls: type) -> ResolvedMetadata:
|
|
|
1223
1237
|
class_name=class_name,
|
|
1224
1238
|
function_type=function_type,
|
|
1225
1239
|
description=description,
|
|
1240
|
+
comment=comment,
|
|
1226
1241
|
examples=examples,
|
|
1227
1242
|
categories=attrs.get("categories", []),
|
|
1228
1243
|
tags=dict(attrs.get("tags", {})),
|
|
@@ -1399,6 +1414,7 @@ _METADATA_SCHEMA = pa.schema(
|
|
|
1399
1414
|
pa.field("class_name", pa.string()),
|
|
1400
1415
|
pa.field("function_type", pa.string()),
|
|
1401
1416
|
pa.field("description", pa.string()),
|
|
1417
|
+
pa.field("comment", pa.string(), nullable=True),
|
|
1402
1418
|
pa.field("examples", pa.list_(_EXAMPLE_STRUCT)),
|
|
1403
1419
|
pa.field("categories", pa.list_(pa.string())),
|
|
1404
1420
|
pa.field("tags", pa.map_(pa.string(), pa.string())),
|
|
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
|