vgi-python 0.9.0__tar.gz → 0.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vgi_python-0.9.0 → vgi_python-0.11.0}/PKG-INFO +3 -2
- {vgi_python-0.9.0 → vgi_python-0.11.0}/packages/vgi-fixtures/pyproject.toml +1 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/pyproject.toml +3 -2
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_declarative.py +39 -1
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_serialization.py +2 -1
- vgi_python-0.11.0/tests/conformance/test_const_param_enforcement.py +69 -0
- vgi_python-0.11.0/tests/conformance/test_container.py +17 -0
- vgi_python-0.11.0/tests/conformance/test_copy_from.py +16 -0
- vgi_python-0.11.0/tests/conformance/test_copy_to.py +21 -0
- vgi_python-0.11.0/tests/conformance/test_github.py +15 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_secret.py +3 -0
- vgi_python-0.11.0/tests/landing/_checker.py +145 -0
- vgi_python-0.11.0/tests/landing/describe.expected.json +2638 -0
- vgi_python-0.11.0/tests/landing/describe.schema.json +166 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_aggregate_function.py +51 -1
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_argument_spec.py +101 -0
- vgi_python-0.11.0/tests/test_landing_conformance.py +93 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_serve.py +9 -2
- {vgi_python-0.9.0 → vgi_python-0.11.0}/uv.lock +7 -5
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/__init__.py +2 -0
- vgi_python-0.11.0/vgi/_test_fixtures/aggregate/secret_typed.py +115 -0
- vgi_python-0.11.0/vgi/_test_fixtures/companion.py +169 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/http_server.py +19 -2
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/formatting.py +2 -2
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table_in_out.py +46 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/worker.py +48 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/argument_spec.py +146 -1
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/arguments.py +71 -1
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/__init__.py +2 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/catalog_interface.py +96 -2
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/descriptors.py +15 -1
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/_common.py +2 -0
- vgi_python-0.11.0/vgi/http/describe_json.py +382 -0
- vgi_python-0.11.0/vgi/http/landing.html +633 -0
- vgi_python-0.11.0/vgi/http/landing_page.py +95 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/scalar_function.py +33 -1
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/serve.py +18 -14
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/worker.py +16 -1
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.gitattributes +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.github/dependabot.yml +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.github/workflows/ci.yml +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.github/workflows/docs.yml +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.github/workflows/integration.yml +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.github/workflows/release.yml +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.gitignore +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.python-version +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/.vale.ini +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/CLAUDE.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/DOCS_REVIEW_RUBRIC.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/DOCS_USABILITY_TEST.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/LICENSE +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/README.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/SECURITY.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/ci/README.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/ci/preprocess-require.awk +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/ci/run-integration.sh +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/arguments.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/auth.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/catalogs.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/client.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/exceptions.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/filters.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/functions.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/http.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/index.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/metadata.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/observability.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/storage.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/transactor.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/api/worker.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/argument-serialization.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/apple-touch-icon.png +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/favicon-16x16.png +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/favicon-32x32.png +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/favicon.ico +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/kinds/aggregate.svg +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/kinds/buffering.svg +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/kinds/scalar.svg +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/kinds/table-in-out.svg +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/kinds/table.svg +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/logo.png +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/assets/social-card.png +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/authentication.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/catalog-interface.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/cli.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/column-statistics.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/concepts/index.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/contributing-docs.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/generator-api.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/how-to/catalogs.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/how-to/function-patterns.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/how-to/http-auth.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/how-to/index.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/how-to/pushdown-and-statistics.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/how-to/state-storage.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/index.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/lifecycle.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/metadata.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/overrides/main.html +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/robots.txt +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/shared-storage.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/stylesheets/extra.css +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/tutorial/index.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/tutorial/scalar.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/tutorial/table.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/docs/vgi-logo.png +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/examples/calc_scalar_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/examples/calc_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/examples/filter_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/examples/greeting_scalar_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/examples/row_count_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/examples/series_streaming_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/examples/sum_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/mkdocs.yml +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/scripts/measure_startup.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/test-data/generate.sh +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_required_field_filter_paths.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_setting.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/client/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/client/test_cli.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/conftest.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_auth.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_copy_from_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_copy_to_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_docstrings.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_documentation_examples.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_examples_workers.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_exceptions.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_function_storage.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_metadata.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_otel.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_protocol_classes.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_resolved_secrets.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_tcp_transport.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_union_argument.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/test_worker_page.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_duckdb.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/bad_enum.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/copy_from.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/copy_to.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/filters.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/make_series.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/misc.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/pairs.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/sequence.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/settings.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/aggregate_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/auth.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/_descriptor_spec.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/attach_option.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/secret_type.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/setting.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/catalog/storage.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/catalog_mixin.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/cli.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/cli_catalog.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/cli_schema.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/cli_table.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/cli_utils.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/cli_view.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/client/client.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/cpp_constants.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/ts_client.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/copy_from_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/copy_to_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/exceptions.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/function_storage.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/function_storage_azure_sql.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/function_storage_cf_do.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/http/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/http/worker_page.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/invocation.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/logging_config.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/meta_worker.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/metadata.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/otel.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/protocol.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/py.typed +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/schema_utils.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/secret_protocol.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/secret_service.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/table_buffering_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/table_filter_pushdown.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/table_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/table_in_out_function.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/transactor/client.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/transactor/protocol.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/vgi/transactor/server.py +0 -0
- {vgi_python-0.9.0 → vgi_python-0.11.0}/wrangler.jsonc +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vgi-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.0
|
|
4
4
|
Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
|
|
5
5
|
Project-URL: Homepage, https://query.farm
|
|
6
6
|
Project-URL: Repository, https://github.com/Query-farm/vgi-python
|
|
@@ -162,13 +162,14 @@ Requires-Dist: httpx>=0.24
|
|
|
162
162
|
Requires-Dist: platformdirs
|
|
163
163
|
Requires-Dist: pyarrow
|
|
164
164
|
Requires-Dist: typer>=0.9
|
|
165
|
-
Requires-Dist: vgi-rpc>=0.
|
|
165
|
+
Requires-Dist: vgi-rpc>=0.23.0
|
|
166
166
|
Provides-Extra: azure
|
|
167
167
|
Requires-Dist: azure-identity>=1.16.0; extra == 'azure'
|
|
168
168
|
Requires-Dist: pymssql>=2.3.0; extra == 'azure'
|
|
169
169
|
Provides-Extra: dev
|
|
170
170
|
Requires-Dist: azure-identity>=1.16.0; extra == 'dev'
|
|
171
171
|
Requires-Dist: duckdb>=1.5.3; extra == 'dev'
|
|
172
|
+
Requires-Dist: jsonschema; extra == 'dev'
|
|
172
173
|
Requires-Dist: mypy; extra == 'dev'
|
|
173
174
|
Requires-Dist: numpy>=2.4.1; extra == 'dev'
|
|
174
175
|
Requires-Dist: pyarrow-stubs; extra == 'dev'
|
|
@@ -38,6 +38,7 @@ dependencies = ["vgi-python[test-fixtures-writable]", "vgi-python[duckdb]"]
|
|
|
38
38
|
|
|
39
39
|
[project.scripts]
|
|
40
40
|
vgi-fixture-worker = "vgi._test_fixtures.worker:main"
|
|
41
|
+
vgi-fixture-companion-worker = "vgi._test_fixtures.companion:main"
|
|
41
42
|
vgi-fixture-http = "vgi._test_fixtures.http_server:main"
|
|
42
43
|
vgi-fixture-versioned-worker = "vgi._test_fixtures.versioned:main"
|
|
43
44
|
vgi-fixture-versioned-tables-worker = "vgi._test_fixtures.versioned_tables:main"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "vgi-python"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.11.0"
|
|
4
4
|
description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
keywords = [
|
|
@@ -40,7 +40,7 @@ dependencies = [
|
|
|
40
40
|
"pyarrow",
|
|
41
41
|
"typer>=0.9",
|
|
42
42
|
"platformdirs",
|
|
43
|
-
"vgi-rpc>=0.
|
|
43
|
+
"vgi-rpc>=0.23.0",
|
|
44
44
|
"httpx>=0.24",
|
|
45
45
|
]
|
|
46
46
|
|
|
@@ -82,6 +82,7 @@ dev = [
|
|
|
82
82
|
# (a vgi-rpc dependency) in the shared `docstring_parser` namespace,
|
|
83
83
|
# non-deterministically breaking imports. tests/test_docstrings.py runs it
|
|
84
84
|
# in an isolated env via `uvx pydoclint` instead.
|
|
85
|
+
"jsonschema",
|
|
85
86
|
"pytest",
|
|
86
87
|
"pytest-cov",
|
|
87
88
|
"pytest-examples",
|
|
@@ -41,8 +41,10 @@ from vgi.catalog import (
|
|
|
41
41
|
View,
|
|
42
42
|
ViewInfo,
|
|
43
43
|
)
|
|
44
|
+
from vgi.invocation import BindResponse
|
|
44
45
|
from vgi.schema_utils import schema
|
|
45
46
|
from vgi.table_function import (
|
|
47
|
+
BindParams,
|
|
46
48
|
ProcessParams,
|
|
47
49
|
TableFunctionGenerator,
|
|
48
50
|
bind_fixed_schema,
|
|
@@ -81,6 +83,31 @@ class UsersFunction(TableFunctionGenerator[EmptyArgs]):
|
|
|
81
83
|
out.finish()
|
|
82
84
|
|
|
83
85
|
|
|
86
|
+
@init_single_worker
|
|
87
|
+
class SecretLookupFunction(TableFunctionGenerator[EmptyArgs]):
|
|
88
|
+
"""Backing function whose ``on_bind`` performs a two-phase secret lookup.
|
|
89
|
+
|
|
90
|
+
This exercises the bug where ``Table(function=...)`` schema derivation took
|
|
91
|
+
the empty secret-scope-request schema instead of retrying the bind.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
class Meta: # noqa: D106
|
|
95
|
+
name = "secret_scan"
|
|
96
|
+
description = "Backing function that looks up a secret at bind time"
|
|
97
|
+
|
|
98
|
+
FIXED_SCHEMA: ClassVar[pa.Schema] = schema({"id": pa.int64(), "name": pa.string()})
|
|
99
|
+
|
|
100
|
+
@classmethod
|
|
101
|
+
def on_bind(cls, params: BindParams[EmptyArgs]) -> BindResponse: # noqa: D102
|
|
102
|
+
params.secrets.get("some_secret") # unresolved -> registers a two-phase lookup
|
|
103
|
+
return BindResponse(output_schema=cls.FIXED_SCHEMA)
|
|
104
|
+
|
|
105
|
+
@classmethod
|
|
106
|
+
def process(cls, params: ProcessParams[EmptyArgs], state: None, out: OutputCollector) -> None: # noqa: D102
|
|
107
|
+
out.emit(pa.RecordBatch.from_pydict({"id": [1], "name": ["x"]}, schema=params.output_schema))
|
|
108
|
+
out.finish()
|
|
109
|
+
|
|
110
|
+
|
|
84
111
|
@init_single_worker
|
|
85
112
|
@bind_fixed_schema
|
|
86
113
|
class EventsFunction(TableFunctionGenerator[EmptyArgs]):
|
|
@@ -186,6 +213,18 @@ class TestTableWithFunction:
|
|
|
186
213
|
assert resolved.field(0).name == "id"
|
|
187
214
|
assert resolved.field(1).name == "name"
|
|
188
215
|
|
|
216
|
+
def test_function_backed_table_derives_schema_despite_secret_lookup(self) -> None:
|
|
217
|
+
"""A backing function that calls secrets.get() in on_bind still yields its schema.
|
|
218
|
+
|
|
219
|
+
Regression: on_bind's two-phase secret lookup makes the first bind return an
|
|
220
|
+
empty secret-scope-request schema; schema derivation must retry with resolved
|
|
221
|
+
secrets rather than adopt the empty schema (which produced 0-column tables).
|
|
222
|
+
"""
|
|
223
|
+
table = Table(name="things", function=SecretLookupFunction)
|
|
224
|
+
resolved = table.resolved_columns
|
|
225
|
+
assert [f.name for f in resolved] == ["id", "name"]
|
|
226
|
+
assert len(resolved) == 2
|
|
227
|
+
|
|
189
228
|
def test_table_function_backed_with_constraints(self) -> None:
|
|
190
229
|
"""Function-backed table can have constraints validated."""
|
|
191
230
|
table = Table(
|
|
@@ -336,7 +375,6 @@ class TestTableWithFunction:
|
|
|
336
375
|
from typing import Any as _Any
|
|
337
376
|
|
|
338
377
|
from vgi.invocation import BindResponse
|
|
339
|
-
from vgi.table_function import BindParams
|
|
340
378
|
|
|
341
379
|
@init_single_worker
|
|
342
380
|
class _ManualBindFn(TableFunctionGenerator[EmptyArgs]):
|
|
@@ -1110,7 +1110,7 @@ class TestArrowSchemaCorrectness:
|
|
|
1110
1110
|
def test_catalog_attach_result_schema(self) -> None:
|
|
1111
1111
|
"""Verify CatalogAttachResult Arrow schema."""
|
|
1112
1112
|
schema = CatalogAttachResult.ARROW_SCHEMA
|
|
1113
|
-
assert len(schema) ==
|
|
1113
|
+
assert len(schema) == 15
|
|
1114
1114
|
assert schema.field("attach_opaque_data").type == pa.binary()
|
|
1115
1115
|
assert schema.field("supports_transactions").type == pa.bool_()
|
|
1116
1116
|
assert schema.field("supports_time_travel").type == pa.bool_()
|
|
@@ -1120,6 +1120,7 @@ class TestArrowSchemaCorrectness:
|
|
|
1120
1120
|
assert schema.field("default_schema").type == pa.string()
|
|
1121
1121
|
assert schema.field("settings").type == pa.list_(pa.binary())
|
|
1122
1122
|
assert schema.field("secret_types").type == pa.list_(pa.binary())
|
|
1123
|
+
assert schema.field("attach_catalogs").type == pa.list_(pa.binary())
|
|
1123
1124
|
assert schema.field("resolved_data_version").type == pa.string()
|
|
1124
1125
|
assert schema.field("resolved_implementation_version").type == pa.string()
|
|
1125
1126
|
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Conformance test: ConstParam value constraints are enforced at bind.
|
|
4
|
+
|
|
5
|
+
A ``ConstParam`` may declare ``choices``/``ge``/``le``/``gt``/``lt``/``pattern``.
|
|
6
|
+
Those are surfaced for agent discovery (via ``vgi_function_arguments()``) AND
|
|
7
|
+
must be enforced: a const value that violates a declared constraint fails at
|
|
8
|
+
bind with ``ArgumentValidationError``, rather than silently reaching
|
|
9
|
+
``compute()``. This mirrors the legacy ``Arg`` descriptor path.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from typing import Annotated
|
|
15
|
+
|
|
16
|
+
import pyarrow as pa
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from vgi.arguments import Arguments, ArgumentValidationError, ConstParam, Param, Returns
|
|
20
|
+
from vgi.protocol import BindRequest, FunctionType
|
|
21
|
+
from vgi.scalar_function import BindResult, ScalarFunction
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class _Measure(ScalarFunction):
|
|
25
|
+
class Meta:
|
|
26
|
+
name = "measure"
|
|
27
|
+
|
|
28
|
+
@classmethod
|
|
29
|
+
def on_bind(cls, params: object) -> BindResult:
|
|
30
|
+
return BindResult(pa.string())
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def compute(
|
|
34
|
+
cls,
|
|
35
|
+
unit: Annotated[str, ConstParam("Output unit", choices=["mm", "cm", "m"])],
|
|
36
|
+
precision: Annotated[int, ConstParam("Decimals", ge=0, le=10)],
|
|
37
|
+
value: Annotated[pa.DoubleArray, Param(doc="Value")],
|
|
38
|
+
) -> Annotated[pa.StringArray, Returns()]:
|
|
39
|
+
return pa.array([str(value)], type=pa.string())
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _bind(unit: str, precision: int) -> None:
|
|
43
|
+
_Measure.bind(
|
|
44
|
+
BindRequest(
|
|
45
|
+
function_name="measure",
|
|
46
|
+
arguments=Arguments(positional=(pa.scalar(unit), pa.scalar(precision))),
|
|
47
|
+
function_type=FunctionType.SCALAR,
|
|
48
|
+
input_schema=pa.schema([("value", pa.float64())]),
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_valid_const_values_bind() -> None:
|
|
54
|
+
"""A const value inside every declared constraint binds cleanly."""
|
|
55
|
+
_bind("cm", 2)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_choice_violation_raises_at_bind() -> None:
|
|
59
|
+
"""A const value outside the choice set fails at bind."""
|
|
60
|
+
with pytest.raises(ArgumentValidationError) as exc:
|
|
61
|
+
_bind("xx", 2)
|
|
62
|
+
assert "unit" in str(exc.value)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_range_violation_raises_at_bind() -> None:
|
|
66
|
+
"""A const value outside the numeric range fails at bind."""
|
|
67
|
+
with pytest.raises(ArgumentValidationError) as exc:
|
|
68
|
+
_bind("cm", 99)
|
|
69
|
+
assert "precision" in str(exc.value)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Conformance stub for ``vgi/test/sql/integration/container/``."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from tests.conformance._stub import skip_area
|
|
8
|
+
|
|
9
|
+
skip_area(
|
|
10
|
+
"container",
|
|
11
|
+
[
|
|
12
|
+
"errors.test",
|
|
13
|
+
"shared_http.test",
|
|
14
|
+
"shared_tcp.test",
|
|
15
|
+
"sklearn_smoke.test",
|
|
16
|
+
],
|
|
17
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Conformance stub for ``vgi/test/sql/integration/copy_from/``."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from tests.conformance._stub import skip_area
|
|
8
|
+
|
|
9
|
+
skip_area(
|
|
10
|
+
"copy_from",
|
|
11
|
+
[
|
|
12
|
+
"basic.test",
|
|
13
|
+
"options.test",
|
|
14
|
+
"secrets.test",
|
|
15
|
+
],
|
|
16
|
+
)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Conformance stub for ``vgi/test/sql/integration/copy_to/``."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from tests.conformance._stub import skip_area
|
|
8
|
+
|
|
9
|
+
skip_area(
|
|
10
|
+
"copy_to",
|
|
11
|
+
[
|
|
12
|
+
"basic.test",
|
|
13
|
+
"failure.test",
|
|
14
|
+
"options.test",
|
|
15
|
+
"ordered.test",
|
|
16
|
+
"parallel.test",
|
|
17
|
+
"secrets.test",
|
|
18
|
+
"tmp_file.test",
|
|
19
|
+
"types.test",
|
|
20
|
+
],
|
|
21
|
+
)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Copyright 2025, 2026 Query Farm LLC - https://query.farm
|
|
2
|
+
|
|
3
|
+
"""Conformance stub for ``vgi/test/sql/integration/github/``."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from tests.conformance._stub import skip_area
|
|
8
|
+
|
|
9
|
+
skip_area(
|
|
10
|
+
"github",
|
|
11
|
+
[
|
|
12
|
+
"download.test",
|
|
13
|
+
"errors.test",
|
|
14
|
+
],
|
|
15
|
+
)
|
|
@@ -9,10 +9,13 @@ from tests.conformance._stub import skip_area
|
|
|
9
9
|
skip_area(
|
|
10
10
|
"secret",
|
|
11
11
|
[
|
|
12
|
+
"secret_aggregate.test",
|
|
13
|
+
"secret_function_backed_table.test",
|
|
12
14
|
"secret_no_secret.test",
|
|
13
15
|
"secret_registration.test",
|
|
14
16
|
"secret_scalar.test",
|
|
15
17
|
"secret_scoped.test",
|
|
16
18
|
"secret_table_function.test",
|
|
19
|
+
"secret_table_in_out.test",
|
|
17
20
|
],
|
|
18
21
|
)
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Landing-page conformance checker for VGI workers (all languages).
|
|
3
|
+
|
|
4
|
+
Drives a running worker's HTTP landing surface and asserts it conforms to the
|
|
5
|
+
contract in ``docs/http-landing-contract.md``:
|
|
6
|
+
|
|
7
|
+
* ``GET {prefix}/describe.json`` validates against ``describe.schema.json`` and
|
|
8
|
+
(optionally) equals a **normalized golden** — the cross-language equality guard.
|
|
9
|
+
* ``GET {prefix}/`` serves the pinned shared ``landing.html`` (asset marker), and
|
|
10
|
+
``?format=json`` returns a JSON status.
|
|
11
|
+
* ``GET {prefix}/describe/{catalog}/{schema}/{table}.json`` returns valid columns.
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
run_landing_conformance.py --url http://localhost:8790 [--golden fixtures/describe.expected.json]
|
|
15
|
+
run_landing_conformance.py --url http://localhost:8790 --golden fixtures/describe.expected.json --update
|
|
16
|
+
|
|
17
|
+
Exit code is non-zero on any failure. ``--update`` (re)writes the golden from the
|
|
18
|
+
live worker (reviewers inspect the diff).
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import argparse
|
|
24
|
+
import json
|
|
25
|
+
import pathlib
|
|
26
|
+
import sys
|
|
27
|
+
import urllib.request
|
|
28
|
+
|
|
29
|
+
import jsonschema
|
|
30
|
+
|
|
31
|
+
_HERE = pathlib.Path(__file__).resolve().parent
|
|
32
|
+
DEFAULT_SCHEMA = _HERE / "describe.schema.json"
|
|
33
|
+
ASSET_MARKER = "vgi-landing-asset v"
|
|
34
|
+
|
|
35
|
+
# Fields dropped before comparing to a golden (volatile or language-specific).
|
|
36
|
+
_VOLATILE_TOP = ("server_id", "worker", "oauth")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _get(url: str, accept: str = "application/json") -> tuple[int, bytes, str]:
|
|
40
|
+
req = urllib.request.Request(url, headers={"Accept": accept})
|
|
41
|
+
try:
|
|
42
|
+
with urllib.request.urlopen(req) as resp: # noqa: S310 — trusted local URL
|
|
43
|
+
return resp.status, resp.read(), resp.headers.get("Content-Type", "")
|
|
44
|
+
except urllib.error.HTTPError as exc: # type: ignore[attr-defined]
|
|
45
|
+
return exc.code, exc.read(), exc.headers.get("Content-Type", "")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def normalize(doc: dict) -> dict:
|
|
49
|
+
"""Strip volatile/language-specific fields so goldens compare across languages."""
|
|
50
|
+
return {k: v for k, v in doc.items() if k not in _VOLATILE_TOP}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _canonical(doc: dict) -> str:
|
|
54
|
+
return json.dumps(doc, indent=2, sort_keys=True, ensure_ascii=False)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def check(
|
|
58
|
+
base_url: str,
|
|
59
|
+
*,
|
|
60
|
+
schema_path: pathlib.Path = DEFAULT_SCHEMA,
|
|
61
|
+
golden_path: pathlib.Path | None = None,
|
|
62
|
+
) -> list[str]:
|
|
63
|
+
"""Return a list of failure strings (empty == conformant)."""
|
|
64
|
+
base = base_url.rstrip("/")
|
|
65
|
+
fails: list[str] = []
|
|
66
|
+
schema = json.loads(schema_path.read_text())
|
|
67
|
+
columns_schema = {**schema, **schema["$defs"]["columns"]}
|
|
68
|
+
|
|
69
|
+
# 1) describe.json — schema-valid.
|
|
70
|
+
status, body, _ = _get(f"{base}/describe.json")
|
|
71
|
+
if status != 200:
|
|
72
|
+
return [f"GET /describe.json returned HTTP {status}"]
|
|
73
|
+
doc = json.loads(body)
|
|
74
|
+
try:
|
|
75
|
+
jsonschema.validate(doc, schema)
|
|
76
|
+
except jsonschema.ValidationError as exc:
|
|
77
|
+
fails.append(f"describe.json schema violation: {exc.message} at {list(exc.absolute_path)}")
|
|
78
|
+
|
|
79
|
+
# 2) GET / serves the pinned shared page; ?format=json is a JSON status.
|
|
80
|
+
status, html, ctype = _get(f"{base}/", accept="text/html")
|
|
81
|
+
if status != 200 or "text/html" not in ctype:
|
|
82
|
+
fails.append(f"GET / (Accept: text/html) returned HTTP {status} {ctype!r}")
|
|
83
|
+
elif ASSET_MARKER not in html.decode("utf-8", "replace"):
|
|
84
|
+
fails.append(f"GET / did not serve the pinned landing.html (missing {ASSET_MARKER!r} marker)")
|
|
85
|
+
status, jbody, _ = _get(f"{base}/?format=json")
|
|
86
|
+
try:
|
|
87
|
+
assert json.loads(jbody).get("status") == "ok"
|
|
88
|
+
except Exception: # noqa: BLE001
|
|
89
|
+
fails.append("GET /?format=json did not return a JSON status object")
|
|
90
|
+
|
|
91
|
+
# 3) Lazy column endpoints — validate one table + one view per schema.
|
|
92
|
+
for cat in doc.get("catalogs", []):
|
|
93
|
+
for sch in cat.get("schemas", []):
|
|
94
|
+
samples = (sch.get("tables") or [])[:1] + (sch.get("views") or [])[:1]
|
|
95
|
+
for obj in samples:
|
|
96
|
+
cstatus, cbody, _ = _get(f"{base}/describe/{cat['name']}/{sch['name']}/{obj['name']}.json")
|
|
97
|
+
if cstatus != 200:
|
|
98
|
+
fails.append(f"columns {cat['name']}/{sch['name']}/{obj['name']} -> HTTP {cstatus}")
|
|
99
|
+
continue
|
|
100
|
+
try:
|
|
101
|
+
jsonschema.validate(json.loads(cbody), columns_schema)
|
|
102
|
+
except jsonschema.ValidationError as exc:
|
|
103
|
+
fails.append(f"columns {sch['name']}.{obj['name']} schema violation: {exc.message}")
|
|
104
|
+
|
|
105
|
+
# 4) Golden diff (cross-language equality).
|
|
106
|
+
if golden_path is not None:
|
|
107
|
+
got = _canonical(normalize(doc))
|
|
108
|
+
want = golden_path.read_text() if golden_path.exists() else None
|
|
109
|
+
if want is None:
|
|
110
|
+
fails.append(f"golden {golden_path} does not exist (run with --update)")
|
|
111
|
+
elif got.strip() != want.strip():
|
|
112
|
+
fails.append(f"describe.json does not match golden {golden_path.name} (normalized diff)")
|
|
113
|
+
|
|
114
|
+
return fails
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def main() -> int:
|
|
118
|
+
ap = argparse.ArgumentParser(description=__doc__)
|
|
119
|
+
ap.add_argument("--url", required=True, help="Worker base URL, e.g. http://localhost:8790")
|
|
120
|
+
ap.add_argument("--schema", type=pathlib.Path, default=DEFAULT_SCHEMA)
|
|
121
|
+
ap.add_argument("--golden", type=pathlib.Path, default=None)
|
|
122
|
+
ap.add_argument("--update", action="store_true", help="Write the normalized golden from the live worker")
|
|
123
|
+
args = ap.parse_args()
|
|
124
|
+
|
|
125
|
+
if args.update:
|
|
126
|
+
if args.golden is None:
|
|
127
|
+
ap.error("--update requires --golden")
|
|
128
|
+
_, body, _ = _get(f"{args.url.rstrip('/')}/describe.json")
|
|
129
|
+
args.golden.parent.mkdir(parents=True, exist_ok=True)
|
|
130
|
+
args.golden.write_text(_canonical(normalize(json.loads(body))) + "\n")
|
|
131
|
+
print(f"wrote golden {args.golden}")
|
|
132
|
+
return 0
|
|
133
|
+
|
|
134
|
+
fails = check(args.url, schema_path=args.schema, golden_path=args.golden)
|
|
135
|
+
if fails:
|
|
136
|
+
print(f"FAIL ({len(fails)}):")
|
|
137
|
+
for f in fails:
|
|
138
|
+
print(f" - {f}")
|
|
139
|
+
return 1
|
|
140
|
+
print("PASS: landing conformance OK")
|
|
141
|
+
return 0
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
if __name__ == "__main__":
|
|
145
|
+
sys.exit(main())
|