vgi-python 0.15.0__tar.gz → 0.16.1__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.15.0 → vgi_python-0.16.1}/.github/workflows/integration.yml +1 -1
- {vgi_python-0.15.0 → vgi_python-0.16.1}/PKG-INFO +1 -1
- {vgi_python-0.15.0 → vgi_python-0.16.1}/pyproject.toml +1 -1
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/landing/describe.expected.json +277 -2
- vgi_python-0.16.1/tests/table_in_out/generator/test_substream_partial_sum_function.py +70 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +5 -5
- vgi_python-0.16.1/tests/table_in_out/test_blended_metadata.py +150 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_filter_pushdown.py +85 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/uv.lock +1 -1
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/__init__.py +6 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/arithmetic.py +77 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/__init__.py +8 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/cache.py +337 -2
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table_in_out.py +743 -61
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/worker.py +64 -42
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/cache_control.py +10 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/catalog_interface.py +15 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/duckdb_statistics.py +129 -102
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/metadata.py +73 -1
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/protocol.py +102 -4
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/scalar_function.py +10 -1
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_filter_pushdown.py +75 -44
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_function.py +43 -3
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_in_out_function.py +49 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/worker.py +104 -17
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.gitattributes +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/dependabot.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.github/workflows/release.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.gitignore +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.python-version +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/.vale.ini +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/CLAUDE.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/LICENSE +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/README.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/SECURITY.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/ci/README.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/ci/run-integration.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/arguments.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/auth.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/catalogs.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/client.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/exceptions.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/filters.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/functions.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/http.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/metadata.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/observability.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/storage.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/transactor.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/api/worker.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/argument-serialization.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/logo.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/assets/social-card.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/authentication.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/catalog-interface.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/cli.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/column-statistics.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/concepts/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/contributing-docs.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/generator-api.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/lifecycle.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/metadata.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/overrides/main.html +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/robots.txt +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/shared-storage.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/tutorial/index.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/tutorial/table.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/docs/vgi-logo.png +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/calc_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/filter_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/row_count_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/examples/sum_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/mkdocs.yml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/packages/vgi-fixtures/pyproject.toml +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/scripts/measure_startup.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/test-data/generate.sh +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_declarative.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_required_filters.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_cli.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_const_param_enforcement.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_container.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_copy_from.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_copy_to.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_github.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/conftest.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/landing/_checker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/landing/describe.schema.json +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_auth.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_cache_control.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_docstrings.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_exceptions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_landing_conformance.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_metadata.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_otel.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_serve.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_union_argument.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/test_worker_page.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_duckdb.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/companion.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/argument_spec.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/arguments.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/auth.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/descriptors.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/client/client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/_common.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/exceptions.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/describe_json.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/landing.html +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/landing_page.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/invocation.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/logging_config.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/meta_worker.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/otel.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/py.typed +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/schema_utils.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/secret_service.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/serve.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/client.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/vgi/transactor/server.py +0 -0
- {vgi_python-0.15.0 → vgi_python-0.16.1}/wrangler.jsonc +0 -0
|
@@ -32,7 +32,7 @@ env:
|
|
|
32
32
|
VGI_REF: main
|
|
33
33
|
# The Haybarn release providing the prebuilt haybarn-unittest binary. Must be
|
|
34
34
|
# ABI-compatible with the community-published vgi extension.
|
|
35
|
-
HAYBARN_RELEASE: haybarn-v1.5.4-
|
|
35
|
+
HAYBARN_RELEASE: haybarn-v1.5.4-rc3
|
|
36
36
|
|
|
37
37
|
jobs:
|
|
38
38
|
integration:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.16.1
|
|
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
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
{
|
|
4
4
|
"attach_options": [],
|
|
5
5
|
"counts": {
|
|
6
|
-
"functions":
|
|
6
|
+
"functions": 203,
|
|
7
7
|
"schemas": 2,
|
|
8
8
|
"tables": 59,
|
|
9
9
|
"views": 3
|
|
@@ -655,6 +655,50 @@
|
|
|
655
655
|
"returns": "binary",
|
|
656
656
|
"type": "scalar"
|
|
657
657
|
},
|
|
658
|
+
{
|
|
659
|
+
"args": [
|
|
660
|
+
{
|
|
661
|
+
"desc": "Value",
|
|
662
|
+
"name": "value",
|
|
663
|
+
"type": "int64"
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
"desc": "Constant addend",
|
|
667
|
+
"name": "addend",
|
|
668
|
+
"type": "int64"
|
|
669
|
+
}
|
|
670
|
+
],
|
|
671
|
+
"doc": "value + const addend (advertises vgi.cache.ttl)",
|
|
672
|
+
"name": "cached_add_const",
|
|
673
|
+
"returns": "int64",
|
|
674
|
+
"type": "scalar"
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
"args": [
|
|
678
|
+
{
|
|
679
|
+
"desc": "Value to double",
|
|
680
|
+
"name": "value",
|
|
681
|
+
"type": "int64"
|
|
682
|
+
}
|
|
683
|
+
],
|
|
684
|
+
"doc": "Doubles a BIGINT value (advertises vgi.cache.ttl for per-value memo)",
|
|
685
|
+
"name": "cached_double_scalar",
|
|
686
|
+
"returns": "int64",
|
|
687
|
+
"type": "scalar"
|
|
688
|
+
},
|
|
689
|
+
{
|
|
690
|
+
"args": [
|
|
691
|
+
{
|
|
692
|
+
"desc": "Value",
|
|
693
|
+
"name": "value",
|
|
694
|
+
"type": "int64"
|
|
695
|
+
}
|
|
696
|
+
],
|
|
697
|
+
"doc": "value -> 'lbl-<value>' or NULL for negatives (advertises vgi.cache.ttl)",
|
|
698
|
+
"name": "cached_label",
|
|
699
|
+
"returns": "string",
|
|
700
|
+
"type": "scalar"
|
|
701
|
+
},
|
|
658
702
|
{
|
|
659
703
|
"args": [
|
|
660
704
|
{
|
|
@@ -1247,6 +1291,30 @@
|
|
|
1247
1291
|
"returns": "string",
|
|
1248
1292
|
"type": "scalar"
|
|
1249
1293
|
},
|
|
1294
|
+
{
|
|
1295
|
+
"args": [
|
|
1296
|
+
{
|
|
1297
|
+
"desc": "Input column (ignored)",
|
|
1298
|
+
"name": "x",
|
|
1299
|
+
"type": "double"
|
|
1300
|
+
}
|
|
1301
|
+
],
|
|
1302
|
+
"doc": "Blended 1->0 map emitting a single 0-row batch (literal scan-mode)",
|
|
1303
|
+
"name": "blended_drop",
|
|
1304
|
+
"type": "table"
|
|
1305
|
+
},
|
|
1306
|
+
{
|
|
1307
|
+
"args": [
|
|
1308
|
+
{
|
|
1309
|
+
"desc": "Fan-out count: emit rows 0..n-1 for this input row",
|
|
1310
|
+
"name": "n",
|
|
1311
|
+
"type": "int64"
|
|
1312
|
+
}
|
|
1313
|
+
],
|
|
1314
|
+
"doc": "Blended 1->N fan-out (emit 0..n-1 per input row) with row provenance",
|
|
1315
|
+
"name": "blended_explode",
|
|
1316
|
+
"type": "table"
|
|
1317
|
+
},
|
|
1250
1318
|
{
|
|
1251
1319
|
"args": [
|
|
1252
1320
|
{
|
|
@@ -1456,6 +1524,54 @@
|
|
|
1456
1524
|
"name": "cache_parallel",
|
|
1457
1525
|
"type": "table"
|
|
1458
1526
|
},
|
|
1527
|
+
{
|
|
1528
|
+
"args": [
|
|
1529
|
+
{
|
|
1530
|
+
"desc": "Rows per (region, year) partition",
|
|
1531
|
+
"name": "rows_per_partition",
|
|
1532
|
+
"type": "int64"
|
|
1533
|
+
}
|
|
1534
|
+
],
|
|
1535
|
+
"doc": "Per-partition cacheable over (region, year) SINGLE_VALUE partition columns",
|
|
1536
|
+
"name": "cache_partition_multicol",
|
|
1537
|
+
"type": "table"
|
|
1538
|
+
},
|
|
1539
|
+
{
|
|
1540
|
+
"args": [
|
|
1541
|
+
{
|
|
1542
|
+
"desc": "Rows per country partition",
|
|
1543
|
+
"name": "rows_per_country",
|
|
1544
|
+
"type": "int64"
|
|
1545
|
+
}
|
|
1546
|
+
],
|
|
1547
|
+
"doc": "Per-partition cacheable; work-queue fan-out (parallel capture); one NULL partition",
|
|
1548
|
+
"name": "cache_partition_parallel",
|
|
1549
|
+
"type": "table"
|
|
1550
|
+
},
|
|
1551
|
+
{
|
|
1552
|
+
"args": [
|
|
1553
|
+
{
|
|
1554
|
+
"desc": "Rows per country partition",
|
|
1555
|
+
"name": "rows_per_country",
|
|
1556
|
+
"type": "int64"
|
|
1557
|
+
}
|
|
1558
|
+
],
|
|
1559
|
+
"doc": "Per-partition cacheable with projection pushdown + explicit partition_values",
|
|
1560
|
+
"name": "cache_partition_proj",
|
|
1561
|
+
"type": "table"
|
|
1562
|
+
},
|
|
1563
|
+
{
|
|
1564
|
+
"args": [
|
|
1565
|
+
{
|
|
1566
|
+
"desc": "Rows per country partition",
|
|
1567
|
+
"name": "rows_per_country",
|
|
1568
|
+
"type": "int64"
|
|
1569
|
+
}
|
|
1570
|
+
],
|
|
1571
|
+
"doc": "Per-partition cacheable single-value-partitioned result (vgi.cache.partition_scope)",
|
|
1572
|
+
"name": "cache_partition_scope",
|
|
1573
|
+
"type": "table"
|
|
1574
|
+
},
|
|
1459
1575
|
{
|
|
1460
1576
|
"args": [
|
|
1461
1577
|
{
|
|
@@ -1551,6 +1667,42 @@
|
|
|
1551
1667
|
"name": "cacheable_numbers",
|
|
1552
1668
|
"type": "table"
|
|
1553
1669
|
},
|
|
1670
|
+
{
|
|
1671
|
+
"args": [
|
|
1672
|
+
{
|
|
1673
|
+
"desc": "Input column",
|
|
1674
|
+
"name": "x",
|
|
1675
|
+
"type": "int64"
|
|
1676
|
+
}
|
|
1677
|
+
],
|
|
1678
|
+
"doc": "Cacheable blended map x -> x*2 (advertises vgi.cache.ttl)",
|
|
1679
|
+
"name": "cached_double",
|
|
1680
|
+
"type": "table"
|
|
1681
|
+
},
|
|
1682
|
+
{
|
|
1683
|
+
"args": [],
|
|
1684
|
+
"doc": "Cacheable classic (TABLE-input) passthrough (advertises vgi.cache.ttl)",
|
|
1685
|
+
"name": "cached_echo",
|
|
1686
|
+
"type": "table"
|
|
1687
|
+
},
|
|
1688
|
+
{
|
|
1689
|
+
"args": [
|
|
1690
|
+
{
|
|
1691
|
+
"desc": "Input column",
|
|
1692
|
+
"name": "x",
|
|
1693
|
+
"type": "int64"
|
|
1694
|
+
}
|
|
1695
|
+
],
|
|
1696
|
+
"doc": "Blended map x->x*2 with always-revalidate (304 not_modified) contract",
|
|
1697
|
+
"name": "cached_reval_double",
|
|
1698
|
+
"type": "table"
|
|
1699
|
+
},
|
|
1700
|
+
{
|
|
1701
|
+
"args": [],
|
|
1702
|
+
"doc": "Classic passthrough with always-revalidate (304 not_modified) contract",
|
|
1703
|
+
"name": "cached_reval_echo",
|
|
1704
|
+
"type": "table"
|
|
1705
|
+
},
|
|
1554
1706
|
{
|
|
1555
1707
|
"args": [],
|
|
1556
1708
|
"doc": "Scan colors table (ENUM column)",
|
|
@@ -1820,6 +1972,78 @@
|
|
|
1820
1972
|
"name": "generator_exception",
|
|
1821
1973
|
"type": "table"
|
|
1822
1974
|
},
|
|
1975
|
+
{
|
|
1976
|
+
"args": [
|
|
1977
|
+
{
|
|
1978
|
+
"desc": "Latitude input column",
|
|
1979
|
+
"name": "latitude",
|
|
1980
|
+
"type": "double"
|
|
1981
|
+
},
|
|
1982
|
+
{
|
|
1983
|
+
"desc": "Longitude input column",
|
|
1984
|
+
"name": "longitude",
|
|
1985
|
+
"type": "double"
|
|
1986
|
+
},
|
|
1987
|
+
{
|
|
1988
|
+
"default": "4",
|
|
1989
|
+
"desc": "Rounding precision",
|
|
1990
|
+
"name": "precision",
|
|
1991
|
+
"named": true,
|
|
1992
|
+
"type": "int64"
|
|
1993
|
+
}
|
|
1994
|
+
],
|
|
1995
|
+
"doc": "Blended per-row geo encoder (lat, lon -> geohash)",
|
|
1996
|
+
"name": "geo_encode",
|
|
1997
|
+
"type": "table"
|
|
1998
|
+
},
|
|
1999
|
+
{
|
|
2000
|
+
"args": [
|
|
2001
|
+
{
|
|
2002
|
+
"desc": "Latitude input column",
|
|
2003
|
+
"name": "latitude",
|
|
2004
|
+
"type": "double"
|
|
2005
|
+
},
|
|
2006
|
+
{
|
|
2007
|
+
"desc": "Longitude input column",
|
|
2008
|
+
"name": "longitude",
|
|
2009
|
+
"type": "double"
|
|
2010
|
+
},
|
|
2011
|
+
{
|
|
2012
|
+
"desc": "Altitude input column",
|
|
2013
|
+
"name": "altitude",
|
|
2014
|
+
"type": "double"
|
|
2015
|
+
},
|
|
2016
|
+
{
|
|
2017
|
+
"default": "4",
|
|
2018
|
+
"desc": "Rounding precision",
|
|
2019
|
+
"name": "precision",
|
|
2020
|
+
"named": true,
|
|
2021
|
+
"type": "int64"
|
|
2022
|
+
}
|
|
2023
|
+
],
|
|
2024
|
+
"doc": "Blended per-row geo encoder (lat, lon, alt -> geohash)",
|
|
2025
|
+
"name": "geo_encode",
|
|
2026
|
+
"type": "table"
|
|
2027
|
+
},
|
|
2028
|
+
{
|
|
2029
|
+
"args": [
|
|
2030
|
+
{
|
|
2031
|
+
"desc": "Input column (echoed as output)",
|
|
2032
|
+
"name": "x",
|
|
2033
|
+
"type": "int64"
|
|
2034
|
+
},
|
|
2035
|
+
{
|
|
2036
|
+
"default": "\"range\"",
|
|
2037
|
+
"desc": "range | length | base64",
|
|
2038
|
+
"name": "mode",
|
|
2039
|
+
"named": true,
|
|
2040
|
+
"type": "string"
|
|
2041
|
+
}
|
|
2042
|
+
],
|
|
2043
|
+
"doc": "Adversarial blended fixture emitting malformed vgi_rpc.parent_row",
|
|
2044
|
+
"name": "hostile_provenance",
|
|
2045
|
+
"type": "table"
|
|
2046
|
+
},
|
|
1823
2047
|
{
|
|
1824
2048
|
"args": [
|
|
1825
2049
|
{
|
|
@@ -2237,6 +2461,18 @@
|
|
|
2237
2461
|
"name": "profiling_demo",
|
|
2238
2462
|
"type": "table"
|
|
2239
2463
|
},
|
|
2464
|
+
{
|
|
2465
|
+
"args": [
|
|
2466
|
+
{
|
|
2467
|
+
"desc": "Input column",
|
|
2468
|
+
"name": "x",
|
|
2469
|
+
"type": "int64"
|
|
2470
|
+
}
|
|
2471
|
+
],
|
|
2472
|
+
"doc": "Blended 1->1 map with projection_pushdown + two output columns",
|
|
2473
|
+
"name": "projectable_blended",
|
|
2474
|
+
"type": "table"
|
|
2475
|
+
},
|
|
2240
2476
|
{
|
|
2241
2477
|
"args": [
|
|
2242
2478
|
{
|
|
@@ -2349,6 +2585,25 @@
|
|
|
2349
2585
|
"name": "rff_struct_scan",
|
|
2350
2586
|
"type": "table"
|
|
2351
2587
|
},
|
|
2588
|
+
{
|
|
2589
|
+
"args": [
|
|
2590
|
+
{
|
|
2591
|
+
"desc": "Numeric input columns",
|
|
2592
|
+
"name": "values",
|
|
2593
|
+
"type": "double"
|
|
2594
|
+
},
|
|
2595
|
+
{
|
|
2596
|
+
"default": "false",
|
|
2597
|
+
"desc": "Sum absolute values",
|
|
2598
|
+
"name": "absolute",
|
|
2599
|
+
"named": true,
|
|
2600
|
+
"type": "bool"
|
|
2601
|
+
}
|
|
2602
|
+
],
|
|
2603
|
+
"doc": "Blended per-row varargs sum",
|
|
2604
|
+
"name": "row_sum",
|
|
2605
|
+
"type": "table"
|
|
2606
|
+
},
|
|
2352
2607
|
{
|
|
2353
2608
|
"args": [
|
|
2354
2609
|
{
|
|
@@ -2731,6 +2986,20 @@
|
|
|
2731
2986
|
"name": "buffer_input",
|
|
2732
2987
|
"type": "table_in_out"
|
|
2733
2988
|
},
|
|
2989
|
+
{
|
|
2990
|
+
"args": [
|
|
2991
|
+
{
|
|
2992
|
+
"default": "false",
|
|
2993
|
+
"desc": "Whether to log during processing",
|
|
2994
|
+
"name": "logging",
|
|
2995
|
+
"named": true,
|
|
2996
|
+
"type": "bool"
|
|
2997
|
+
}
|
|
2998
|
+
],
|
|
2999
|
+
"doc": "Cacheable column-wise sum across all input (advertises vgi.cache.ttl)",
|
|
3000
|
+
"name": "cached_sum_all",
|
|
3001
|
+
"type": "table_in_out"
|
|
3002
|
+
},
|
|
2734
3003
|
{
|
|
2735
3004
|
"args": [],
|
|
2736
3005
|
"doc": "Worker raises during combine (test)",
|
|
@@ -2943,6 +3212,12 @@
|
|
|
2943
3212
|
"name": "slow_cancellable_buffering",
|
|
2944
3213
|
"type": "table_in_out"
|
|
2945
3214
|
},
|
|
3215
|
+
{
|
|
3216
|
+
"args": [],
|
|
3217
|
+
"doc": "Per-substream partial sum emitted at finalize (parallel streaming finalize)",
|
|
3218
|
+
"name": "substream_partial_sum",
|
|
3219
|
+
"type": "table_in_out"
|
|
3220
|
+
},
|
|
2946
3221
|
{
|
|
2947
3222
|
"args": [
|
|
2948
3223
|
{
|
|
@@ -2959,7 +3234,7 @@
|
|
|
2959
3234
|
},
|
|
2960
3235
|
{
|
|
2961
3236
|
"args": [],
|
|
2962
|
-
"doc": "Distributed sum using
|
|
3237
|
+
"doc": "Distributed sum using the buffered (Sink+Combine+Source) model",
|
|
2963
3238
|
"name": "sum_all_columns_simple_distributed",
|
|
2964
3239
|
"type": "table_in_out"
|
|
2965
3240
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Tests for SubstreamPartialSumFunction (parallel streaming finalize, A4).
|
|
4
|
+
|
|
5
|
+
At the single-worker client level there is exactly one substream, so ``finish()``
|
|
6
|
+
sees all input and emits one partial row equal to the whole sum. The per-substream
|
|
7
|
+
fan-out (many partials re-aggregated by an outer ``SELECT sum()``) is exercised by
|
|
8
|
+
the C++ integration test ``table_in_out/parallel_finalize.test`` over both
|
|
9
|
+
transports; here we assert the worker-side transform/finish contract in isolation.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import pyarrow as pa
|
|
15
|
+
|
|
16
|
+
from tests.conftest import filter_non_empty, make_schema
|
|
17
|
+
from vgi.client import Client
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TestSubstreamPartialSumFunction:
|
|
21
|
+
"""Worker-side contract for substream_partial_sum."""
|
|
22
|
+
|
|
23
|
+
def test_partial_sum_single_batch(self, fixture_worker: str) -> None:
|
|
24
|
+
"""One substream (single client worker) → one partial = the whole sum."""
|
|
25
|
+
schema = make_schema([pa.field("n", pa.int64())])
|
|
26
|
+
batch = pa.RecordBatch.from_pydict({"n": [1, 2, 3, 4, 5]}, schema=schema)
|
|
27
|
+
with Client(fixture_worker) as client:
|
|
28
|
+
output = list(
|
|
29
|
+
client.table_in_out_function(
|
|
30
|
+
function_name="substream_partial_sum",
|
|
31
|
+
input=iter([batch]),
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
non_empty = filter_non_empty(output)
|
|
35
|
+
assert len(non_empty) == 1
|
|
36
|
+
assert non_empty[0].to_pydict() == {"n": [15]}
|
|
37
|
+
|
|
38
|
+
def test_partial_sum_many_batches(self, fixture_worker: str) -> None:
|
|
39
|
+
"""Accumulates across many input batches, emits one partial at finalize."""
|
|
40
|
+
schema = make_schema([pa.field("n", pa.int64())])
|
|
41
|
+
batches = [
|
|
42
|
+
pa.RecordBatch.from_pydict({"n": list(range(i * 100, (i + 1) * 100))}, schema=schema) for i in range(20)
|
|
43
|
+
]
|
|
44
|
+
expected = sum(range(0, 2000))
|
|
45
|
+
with Client(fixture_worker) as client:
|
|
46
|
+
output = list(
|
|
47
|
+
client.table_in_out_function(
|
|
48
|
+
function_name="substream_partial_sum",
|
|
49
|
+
input=iter(batches),
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
non_empty = filter_non_empty(output)
|
|
53
|
+
assert len(non_empty) == 1
|
|
54
|
+
assert non_empty[0].to_pydict() == {"n": [expected]}
|
|
55
|
+
|
|
56
|
+
def test_partial_sum_empty_input(self, fixture_worker: str) -> None:
|
|
57
|
+
"""No input rows → the single substream's partial is 0."""
|
|
58
|
+
schema = make_schema([pa.field("n", pa.int64())])
|
|
59
|
+
empty = pa.RecordBatch.from_pydict({"n": []}, schema=schema)
|
|
60
|
+
with Client(fixture_worker) as client:
|
|
61
|
+
output = list(
|
|
62
|
+
client.table_in_out_function(
|
|
63
|
+
function_name="substream_partial_sum",
|
|
64
|
+
input=iter([empty]),
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
non_empty = filter_non_empty(output)
|
|
68
|
+
# A single substream with zero rows still finalizes → one 0 partial.
|
|
69
|
+
assert len(non_empty) == 1
|
|
70
|
+
assert non_empty[0].to_pydict() == {"n": [0]}
|
|
@@ -197,13 +197,13 @@ class TestSumAllColumnsFunctionDistributed:
|
|
|
197
197
|
|
|
198
198
|
|
|
199
199
|
class TestSumAllColumnsSimpleDistributed:
|
|
200
|
-
"""Tests for sum_all_columns_simple_distributed (
|
|
200
|
+
"""Tests for sum_all_columns_simple_distributed (buffered global reduction)."""
|
|
201
201
|
|
|
202
202
|
def test_sum_simple_distributed_basic(self, fixture_worker: str, numeric_batches: list[pa.RecordBatch]) -> None:
|
|
203
203
|
"""Should sum all numeric columns across all batches."""
|
|
204
204
|
with Client(fixture_worker) as client:
|
|
205
205
|
output_batches = list(
|
|
206
|
-
client.
|
|
206
|
+
client.table_buffering_function(
|
|
207
207
|
function_name="sum_all_columns_simple_distributed",
|
|
208
208
|
input=iter(numeric_batches),
|
|
209
209
|
)
|
|
@@ -238,7 +238,7 @@ class TestSumAllColumnsSimpleDistributed:
|
|
|
238
238
|
|
|
239
239
|
with Client(fixture_worker) as client:
|
|
240
240
|
output_batches = list(
|
|
241
|
-
client.
|
|
241
|
+
client.table_buffering_function(
|
|
242
242
|
function_name="sum_all_columns_simple_distributed",
|
|
243
243
|
input=iter(batches),
|
|
244
244
|
)
|
|
@@ -256,7 +256,7 @@ class TestSumAllColumnsSimpleDistributed:
|
|
|
256
256
|
"""Should exclude non-numeric columns from output."""
|
|
257
257
|
with Client(fixture_worker) as client:
|
|
258
258
|
output_batches = list(
|
|
259
|
-
client.
|
|
259
|
+
client.table_buffering_function(
|
|
260
260
|
function_name="sum_all_columns_simple_distributed",
|
|
261
261
|
input=iter(simple_batches),
|
|
262
262
|
)
|
|
@@ -276,7 +276,7 @@ class TestSumAllColumnsSimpleDistributed:
|
|
|
276
276
|
|
|
277
277
|
with Client(fixture_worker) as client:
|
|
278
278
|
output_batches = list(
|
|
279
|
-
client.
|
|
279
|
+
client.table_buffering_function(
|
|
280
280
|
function_name="sum_all_columns_simple_distributed",
|
|
281
281
|
input=iter([empty_batch]),
|
|
282
282
|
)
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Metadata resolution + foot-gun guards for blended RowTransformFunction (Phase B)."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Annotated
|
|
9
|
+
|
|
10
|
+
import pyarrow as pa
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from vgi.arguments import Arg, TableInput
|
|
14
|
+
from vgi.invocation import BindResponse
|
|
15
|
+
from vgi.metadata import (
|
|
16
|
+
CatalogFunctionType,
|
|
17
|
+
ResolvedMetadata,
|
|
18
|
+
arrow_to_metadata,
|
|
19
|
+
metadata_to_arrow,
|
|
20
|
+
resolve_metadata,
|
|
21
|
+
)
|
|
22
|
+
from vgi.schema_utils import schema
|
|
23
|
+
from vgi.table_function import BindParams
|
|
24
|
+
from vgi.table_in_out_function import RowTransformFunction
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
28
|
+
class _XYArgs:
|
|
29
|
+
"""Two positional input columns + one named option."""
|
|
30
|
+
|
|
31
|
+
x: Annotated[float, Arg(0)]
|
|
32
|
+
y: Annotated[float, Arg(1)]
|
|
33
|
+
opt: Annotated[int, Arg("opt", default=1)] = 1
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class _GoodBlended(RowTransformFunction[_XYArgs]):
|
|
37
|
+
"""A valid blended function."""
|
|
38
|
+
|
|
39
|
+
class Meta:
|
|
40
|
+
"""Metadata."""
|
|
41
|
+
|
|
42
|
+
name = "good_blended"
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def on_bind(cls, params: BindParams[_XYArgs]) -> BindResponse:
|
|
46
|
+
"""Fixed output schema."""
|
|
47
|
+
return BindResponse(output_schema=schema({"z": pa.float64()}))
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class TestBlendedResolution:
|
|
51
|
+
"""Happy-path resolution of a blended function."""
|
|
52
|
+
|
|
53
|
+
def test_resolves_as_blended_table(self) -> None:
|
|
54
|
+
"""input_from_args=True, function_type=TABLE, no finalize."""
|
|
55
|
+
m = resolve_metadata(_GoodBlended)
|
|
56
|
+
assert m.function_type is CatalogFunctionType.TABLE
|
|
57
|
+
assert m.input_from_args is True
|
|
58
|
+
assert m.has_finalize is False
|
|
59
|
+
positions = {p.position for p in m.parameters}
|
|
60
|
+
assert 0 in positions and 1 in positions and "opt" in positions
|
|
61
|
+
|
|
62
|
+
def test_arrow_roundtrip_preserves_input_from_args(self) -> None:
|
|
63
|
+
"""input_from_args survives the Arrow + dict round-trips."""
|
|
64
|
+
m = resolve_metadata(_GoodBlended)
|
|
65
|
+
assert arrow_to_metadata(metadata_to_arrow(m)).input_from_args is True
|
|
66
|
+
assert ResolvedMetadata.from_dict(m.to_dict()).input_from_args is True
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class TestBlendedFootguns:
|
|
70
|
+
"""resolve_metadata rejects the invalid blended shapes."""
|
|
71
|
+
|
|
72
|
+
def test_reject_finalize_override(self) -> None:
|
|
73
|
+
"""A blended fn that overrides finish()/finalize() is rejected."""
|
|
74
|
+
|
|
75
|
+
class _WithFinalize(RowTransformFunction[_XYArgs]):
|
|
76
|
+
"""Illegal: blended with a finalize."""
|
|
77
|
+
|
|
78
|
+
class Meta:
|
|
79
|
+
"""Metadata."""
|
|
80
|
+
|
|
81
|
+
name = "blended_finalize"
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def finish(cls, params, states): # noqa: ANN001, ANN206, D102
|
|
85
|
+
return []
|
|
86
|
+
|
|
87
|
+
with pytest.raises(TypeError, match="cannot override finalize"):
|
|
88
|
+
resolve_metadata(_WithFinalize)
|
|
89
|
+
|
|
90
|
+
def test_reject_table_input(self) -> None:
|
|
91
|
+
"""A blended fn that declares a TableInput arg is rejected."""
|
|
92
|
+
|
|
93
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
94
|
+
class _TblArgs:
|
|
95
|
+
"""Illegal: a TableInput on a blended fn."""
|
|
96
|
+
|
|
97
|
+
x: Annotated[float, Arg(0)]
|
|
98
|
+
data: Annotated[TableInput, Arg(1)]
|
|
99
|
+
|
|
100
|
+
class _WithTable(RowTransformFunction[_TblArgs]):
|
|
101
|
+
"""Illegal: blended with TableInput."""
|
|
102
|
+
|
|
103
|
+
class Meta:
|
|
104
|
+
"""Metadata."""
|
|
105
|
+
|
|
106
|
+
name = "blended_table"
|
|
107
|
+
|
|
108
|
+
with pytest.raises(TypeError, match="must not declare a TableInput"):
|
|
109
|
+
resolve_metadata(_WithTable)
|
|
110
|
+
|
|
111
|
+
def test_reject_positional_const(self) -> None:
|
|
112
|
+
"""A blended fn with a positional const arg is rejected."""
|
|
113
|
+
|
|
114
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
115
|
+
class _ConstArgs:
|
|
116
|
+
"""Illegal: a positional const on a blended fn."""
|
|
117
|
+
|
|
118
|
+
k: Annotated[int, Arg(0, const=True)]
|
|
119
|
+
x: Annotated[float, Arg(1)]
|
|
120
|
+
|
|
121
|
+
class _WithConst(RowTransformFunction[_ConstArgs]):
|
|
122
|
+
"""Illegal: blended with a positional const."""
|
|
123
|
+
|
|
124
|
+
class Meta:
|
|
125
|
+
"""Metadata."""
|
|
126
|
+
|
|
127
|
+
name = "blended_const"
|
|
128
|
+
|
|
129
|
+
with pytest.raises(TypeError, match="cannot take a positional const"):
|
|
130
|
+
resolve_metadata(_WithConst)
|
|
131
|
+
|
|
132
|
+
def test_reject_zero_positional(self) -> None:
|
|
133
|
+
"""A blended fn with no positional args is rejected."""
|
|
134
|
+
|
|
135
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
136
|
+
class _NamedOnlyArgs:
|
|
137
|
+
"""Illegal: no positional input columns."""
|
|
138
|
+
|
|
139
|
+
opt: Annotated[int, Arg("opt", default=1)] = 1
|
|
140
|
+
|
|
141
|
+
class _NamedOnly(RowTransformFunction[_NamedOnlyArgs]):
|
|
142
|
+
"""Illegal: blended with no positional args."""
|
|
143
|
+
|
|
144
|
+
class Meta:
|
|
145
|
+
"""Metadata."""
|
|
146
|
+
|
|
147
|
+
name = "blended_named_only"
|
|
148
|
+
|
|
149
|
+
with pytest.raises(TypeError, match="at least one positional Arg"):
|
|
150
|
+
resolve_metadata(_NamedOnly)
|