vgi-python 0.8.0__tar.gz → 0.8.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vgi_python-0.8.2/.github/dependabot.yml +43 -0
- vgi_python-0.8.2/.github/styles/config/vocabularies/VGI/accept.txt +41 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/.github/workflows/ci.yml +57 -4
- vgi_python-0.8.2/.github/workflows/docs.yml +33 -0
- vgi_python-0.8.2/.github/workflows/integration.yml +94 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/.github/workflows/release.yml +5 -5
- {vgi_python-0.8.0 → vgi_python-0.8.2}/.gitignore +5 -0
- vgi_python-0.8.2/.vale.ini +19 -0
- vgi_python-0.8.2/DOCS_ACCEPTANCE_CRITERIA.md +122 -0
- vgi_python-0.8.2/DOCS_REVIEW_RUBRIC.md +67 -0
- vgi_python-0.8.2/DOCS_USABILITY_TEST.md +71 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/PKG-INFO +89 -176
- {vgi_python-0.8.0 → vgi_python-0.8.2}/README.md +84 -173
- vgi_python-0.8.2/SECURITY.md +9 -0
- vgi_python-0.8.2/ci/README.md +138 -0
- vgi_python-0.8.2/ci/preprocess-require.awk +40 -0
- vgi_python-0.8.2/ci/run-integration.sh +252 -0
- vgi_python-0.8.2/docs/api/arguments.md +17 -0
- vgi_python-0.8.2/docs/api/auth.md +21 -0
- vgi_python-0.8.2/docs/api/catalogs.md +7 -0
- vgi_python-0.8.2/docs/api/client.md +6 -0
- vgi_python-0.8.2/docs/api/exceptions.md +8 -0
- vgi_python-0.8.2/docs/api/filters.md +8 -0
- vgi_python-0.8.2/docs/api/functions.md +32 -0
- vgi_python-0.8.2/docs/api/http.md +6 -0
- vgi_python-0.8.2/docs/api/index.md +47 -0
- vgi_python-0.8.2/docs/api/metadata.md +18 -0
- vgi_python-0.8.2/docs/api/observability.md +19 -0
- vgi_python-0.8.2/docs/api/storage.md +20 -0
- vgi_python-0.8.2/docs/api/transactor.md +12 -0
- vgi_python-0.8.2/docs/api/worker.md +23 -0
- vgi_python-0.8.2/docs/assets/apple-touch-icon.png +0 -0
- vgi_python-0.8.2/docs/assets/favicon-16x16.png +0 -0
- vgi_python-0.8.2/docs/assets/favicon-32x32.png +0 -0
- vgi_python-0.8.2/docs/assets/favicon.ico +0 -0
- vgi_python-0.8.2/docs/assets/kinds/aggregate.svg +7 -0
- vgi_python-0.8.2/docs/assets/kinds/buffering.svg +13 -0
- vgi_python-0.8.2/docs/assets/kinds/scalar.svg +7 -0
- vgi_python-0.8.2/docs/assets/kinds/table-in-out.svg +11 -0
- vgi_python-0.8.2/docs/assets/kinds/table.svg +8 -0
- vgi_python-0.8.2/docs/assets/logo.png +0 -0
- vgi_python-0.8.2/docs/assets/social-card.png +0 -0
- vgi_python-0.8.2/docs/concepts/index.md +66 -0
- vgi_python-0.8.2/docs/contributing-docs.md +121 -0
- vgi_python-0.8.2/docs/how-to/catalogs.md +65 -0
- vgi_python-0.8.2/docs/how-to/function-patterns.md +227 -0
- vgi_python-0.8.2/docs/how-to/http-auth.md +70 -0
- vgi_python-0.8.2/docs/how-to/index.md +35 -0
- vgi_python-0.8.2/docs/how-to/pushdown-and-statistics.md +72 -0
- vgi_python-0.8.2/docs/how-to/state-storage.md +69 -0
- vgi_python-0.8.2/docs/index.md +114 -0
- vgi_python-0.8.2/docs/overrides/main.html +45 -0
- vgi_python-0.8.2/docs/robots.txt +4 -0
- vgi_python-0.8.2/docs/stylesheets/extra.css +389 -0
- vgi_python-0.8.2/docs/tutorial/index.md +33 -0
- vgi_python-0.8.2/docs/tutorial/scalar.md +98 -0
- vgi_python-0.8.2/docs/tutorial/table.md +84 -0
- vgi_python-0.8.2/docs/vgi-logo.png +0 -0
- vgi_python-0.8.2/examples/calc_scalar_worker.py +45 -0
- vgi_python-0.8.2/examples/calc_worker.py +88 -0
- vgi_python-0.8.2/examples/filter_worker.py +67 -0
- vgi_python-0.8.2/examples/greeting_scalar_worker.py +45 -0
- vgi_python-0.8.2/examples/row_count_worker.py +111 -0
- vgi_python-0.8.2/examples/series_streaming_worker.py +86 -0
- vgi_python-0.8.2/examples/sum_worker.py +101 -0
- vgi_python-0.8.2/mkdocs.yml +157 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/packages/vgi-fixtures/pyproject.toml +2 -1
- {vgi_python-0.8.0 → vgi_python-0.8.2}/pyproject.toml +57 -7
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_declarative.py +53 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_setting.py +5 -2
- vgi_python-0.8.2/tests/test_docstrings.py +60 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_documentation_examples.py +19 -2
- vgi_python-0.8.2/tests/test_examples_workers.py +133 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_protocol_classes.py +2 -4
- vgi_python-0.8.2/uv.lock +2565 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_duckdb.py +3 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/dynamic.py +7 -1
- vgi_python-0.8.2/vgi/_test_fixtures/bad_enum.py +72 -0
- vgi_python-0.8.2/vgi/_test_fixtures/narrow_bind/__init__.py +15 -0
- vgi_python-0.8.2/vgi/_test_fixtures/narrow_bind/worker.py +237 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/__init__.py +6 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/random_demo.py +44 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/settings_secrets.py +73 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/__init__.py +6 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/filters.py +128 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/late_materialization.py +3 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/make_series.py +15 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/misc.py +4 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/pairs.py +12 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/partition_columns.py +101 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/sequence.py +28 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/settings.py +6 -0
- vgi_python-0.8.2/vgi/_test_fixtures/table/typed_probe.py +154 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table_in_out.py +8 -26
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/worker.py +21 -1
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/aggregate_function.py +45 -11
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/argument_spec.py +20 -20
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/arguments.py +114 -153
- vgi_python-0.8.0/vgi/catalog/setting.py → vgi_python-0.8.2/vgi/catalog/_descriptor_spec.py +84 -91
- vgi_python-0.8.2/vgi/catalog/attach_option.py +49 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/catalog/catalog_interface.py +390 -264
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/catalog/descriptors.py +59 -26
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/catalog/secret_type.py +1 -0
- vgi_python-0.8.2/vgi/catalog/setting.py +58 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/catalog/storage.py +8 -4
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/catalog_mixin.py +37 -33
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/cli_catalog.py +4 -16
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/cli_schema.py +12 -73
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/cli_table.py +30 -199
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/cli_utils.py +74 -19
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/cli_view.py +12 -74
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/client.py +104 -79
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/_common.py +7 -1
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/cpp_constants.py +11 -4
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/ts_client.py +11 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/exceptions.py +4 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/function.py +9 -33
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/function_storage.py +11 -46
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/function_storage_azure_sql.py +6 -6
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/function_storage_cf_do.py +23 -3
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/http/worker_page.py +18 -8
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/invocation.py +10 -10
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/meta_worker.py +7 -7
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/metadata.py +111 -46
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/otel.py +3 -3
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/protocol.py +504 -94
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/scalar_function.py +93 -72
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/schema_utils.py +2 -2
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/secret_protocol.py +22 -3
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/secret_service.py +9 -6
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/serve.py +11 -11
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/table_buffering_function.py +28 -22
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/table_filter_pushdown.py +435 -61
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/table_function.py +279 -82
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/table_in_out_function.py +88 -28
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/transactor/client.py +1 -1
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/transactor/protocol.py +1 -1
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/transactor/server.py +26 -64
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/worker.py +125 -272
- vgi_python-0.8.0/docs/vgi-logo.png +0 -0
- vgi_python-0.8.0/uv.lock +0 -1982
- vgi_python-0.8.0/vgi/catalog/attach_option.py +0 -206
- {vgi_python-0.8.0 → vgi_python-0.8.2}/.gitattributes +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/.python-version +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/CLAUDE.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/LICENSE +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/dist-vgi/.gitignore +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/aggregate-functions.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/argument-serialization.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/authentication.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/catalog-interface.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/cli.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/column-statistics.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/filter-pushdown.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/generator-api.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/lifecycle.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/metadata.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/docs/shared-storage.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/packages/vgi-fixtures/LICENSE +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/packages/vgi-fixtures/README.md +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/scripts/measure_startup.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/scripts/run_all_tests.sh +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/test-data/generate.sh +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/_http_fixtures.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_catalog_interface.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_client_catalog.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_column_statistics.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_example_worker_catalog.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_integration.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_required_field_filter_paths.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_scan_branches.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_serialization.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_storage.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_time_travel.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/catalog/test_writable_table.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/client/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/client/test_broken_pipe.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/client/test_cli.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/client/test_cli_catalog_functions.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/client/test_worker_debug.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/_stub.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/conftest.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_accumulate.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_aggregate.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_attach.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_bearer_auth.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_directory_parity.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_function_inventory.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_http_client.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_http_external_location.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_http_upload_url.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_macro.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_overload.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_protocol_inventory.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_protocol_version.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_resumable_scan.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_scalar.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_secret.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_settings.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_table.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_table_in_out.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_view.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conformance/test_writable.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/conftest.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_bernoulli_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_binary_packet_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_client.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_conditional_message_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_hash_seed_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_multiply_by_setting_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_multiply_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_random_bytes_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/scalar/test_return_secret_value_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_constant_columns_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_double_sequence_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_exception_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_filter_echo_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_logging_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_nested_sequence_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_partitioned_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_projected_data_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_sequence_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_settings_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_struct_settings_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table/generator/test_ten_thousand_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/generator/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/generator/test_echo_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/generator/test_exception_functions.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/table_in_out/test_client.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_access_log_audit.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_aggregate_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_argument_spec.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_auth.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_bind_exceptions.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_bind_request_at_clause.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_bound_storage_conformance.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_catalog_auth_binding.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_example_function_arg_types.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_exception_handling.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_exceptions.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_filter_pushdown.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_filter_pushdown_extension.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_function_storage.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_function_storage_azure_sql.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_function_storage_cf_do.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_function_storage_cf_do_integration.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_function_storage_conformance.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_cpp_constants.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_cpp_protocol_version.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_cpp_request_builders.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_cpp_schemas.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_cpp_secret.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_go_schemas.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_protocol_version.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_schemas_cross_lang.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_ts_client.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_generated_ts_schemas.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_http_demo_storage.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_http_s3_offload_input.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_http_s3_offload_output.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_metadata.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_mypy_consolidated.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_nest_tensor.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_otel.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_projection_enforcement.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_projection_repro.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_schema_utils.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_serve.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_setting_secret_annotations.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_table_buffering_function.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_table_function_dynamic_to_string.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_type_bounds.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_worker.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_worker_cli.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/test_worker_page.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/transactor/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/tests/transactor/test_transactor.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_storage_profile.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/accumulate/worker.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/_common.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/basic.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/generic.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/aggregate/window.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/attach_options.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/bad_protocol.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/cancellable.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/catalog.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/http_server.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/nest_tensor.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/orchard_catalog.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/_common.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/binary.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/formatting.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/geo.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/scalar/type_info.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/simple_writable.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/_common.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/batch_index.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/order_modes.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/profiling_example.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/required_filters.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/table/versioned.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/versioned.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/versioned_tables.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/writable/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/writable/generic.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/writable/table.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/_test_fixtures/writable/worker.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/auth.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/catalog/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/catalog/duckdb_statistics.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/cli.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/client/cli_transaction.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/cpp_protocol_version.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/cpp_request_builders.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/cpp_schemas.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/cpp_secret_request_builders.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/cpp_secret_schemas.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/go_schemas.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/protocol_version.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/codegen/ts_schemas.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/http/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/http/demo_storage.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/logging_config.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/protocol_version.txt +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/py.typed +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/transactor/__init__.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/vgi/transactor/_duckdb_compat.py +0 -0
- {vgi_python-0.8.0 → vgi_python-0.8.2}/wrangler.jsonc +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Dependabot version updates. Security updates (PRs for flagged CVEs) are
|
|
2
|
+
# enabled separately via the repo's "automated security fixes" setting; this
|
|
3
|
+
# file governs the scheduled keep-current PRs.
|
|
4
|
+
version: 2
|
|
5
|
+
updates:
|
|
6
|
+
# Python dependencies (pyproject.toml + uv.lock).
|
|
7
|
+
- package-ecosystem: "uv"
|
|
8
|
+
directory: "/"
|
|
9
|
+
schedule:
|
|
10
|
+
interval: "weekly"
|
|
11
|
+
day: "monday"
|
|
12
|
+
open-pull-requests-limit: 5
|
|
13
|
+
commit-message:
|
|
14
|
+
prefix: "deps"
|
|
15
|
+
# Roll all non-breaking bumps into a single weekly PR to keep noise down;
|
|
16
|
+
# major bumps still open as individual PRs so they get reviewed on their own.
|
|
17
|
+
groups:
|
|
18
|
+
python-minor-and-patch:
|
|
19
|
+
update-types:
|
|
20
|
+
- "minor"
|
|
21
|
+
- "patch"
|
|
22
|
+
ignore:
|
|
23
|
+
# aiohttp is transitive via vgi-rpc[external], which caps it at <3.14.
|
|
24
|
+
# The aiohttp CVE fixes only exist in >=3.14, so no bump is resolvable
|
|
25
|
+
# from this repo — the security updater errors out every run with
|
|
26
|
+
# "requirements are unsatisfiable". Ignore it here so Dependabot stops
|
|
27
|
+
# failing on an impossible update; the alerts stay visible in the
|
|
28
|
+
# security tab. The real fix is lifting the cap upstream in vgi-rpc.
|
|
29
|
+
- dependency-name: "aiohttp"
|
|
30
|
+
|
|
31
|
+
# GitHub Actions used by the workflows in .github/workflows/.
|
|
32
|
+
- package-ecosystem: "github-actions"
|
|
33
|
+
directory: "/"
|
|
34
|
+
schedule:
|
|
35
|
+
interval: "weekly"
|
|
36
|
+
day: "monday"
|
|
37
|
+
open-pull-requests-limit: 5
|
|
38
|
+
commit-message:
|
|
39
|
+
prefix: "ci"
|
|
40
|
+
groups:
|
|
41
|
+
github-actions:
|
|
42
|
+
patterns:
|
|
43
|
+
- "*"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
VGI
|
|
2
|
+
vgi
|
|
3
|
+
[Vv]gi-python
|
|
4
|
+
[Vv]gi-rpc
|
|
5
|
+
DuckDB
|
|
6
|
+
Arrow
|
|
7
|
+
[Aa]pache Arrow
|
|
8
|
+
Haybarn
|
|
9
|
+
pyarrow
|
|
10
|
+
PyArrow
|
|
11
|
+
RecordBatch
|
|
12
|
+
RecordBatches
|
|
13
|
+
mkdocstrings
|
|
14
|
+
MkDocs
|
|
15
|
+
uv
|
|
16
|
+
uvx
|
|
17
|
+
subprocess
|
|
18
|
+
scalar
|
|
19
|
+
[Aa]ggregations?
|
|
20
|
+
[Dd]eserialize
|
|
21
|
+
[Ss]erializable
|
|
22
|
+
Diátaxis
|
|
23
|
+
ATTACH
|
|
24
|
+
classmethod
|
|
25
|
+
dataclass
|
|
26
|
+
runnable
|
|
27
|
+
bool
|
|
28
|
+
config
|
|
29
|
+
[Mm]etadata
|
|
30
|
+
namespace
|
|
31
|
+
namespaces
|
|
32
|
+
struct
|
|
33
|
+
async
|
|
34
|
+
stdin
|
|
35
|
+
stdout
|
|
36
|
+
optimizer
|
|
37
|
+
[Pp]ushdown
|
|
38
|
+
JWT
|
|
39
|
+
HTTP
|
|
40
|
+
OAuth
|
|
41
|
+
TTL
|
|
@@ -3,8 +3,12 @@ name: CI
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
branches: [main]
|
|
6
|
+
# README-only changes don't affect code, tests, or the mkdocs site
|
|
7
|
+
# (which is built from docs/, not README.md), so skip the full CI for them.
|
|
8
|
+
paths-ignore: ['README.md']
|
|
6
9
|
pull_request:
|
|
7
10
|
branches: [main]
|
|
11
|
+
paths-ignore: ['README.md']
|
|
8
12
|
workflow_dispatch:
|
|
9
13
|
|
|
10
14
|
# Least-privilege default for all jobs — none need write access. (The release
|
|
@@ -23,7 +27,7 @@ jobs:
|
|
|
23
27
|
python-version: ["3.13", "3.14"]
|
|
24
28
|
|
|
25
29
|
steps:
|
|
26
|
-
- uses: actions/checkout@
|
|
30
|
+
- uses: actions/checkout@v7
|
|
27
31
|
|
|
28
32
|
- name: Install uv
|
|
29
33
|
uses: astral-sh/setup-uv@v8.2.0
|
|
@@ -41,7 +45,7 @@ jobs:
|
|
|
41
45
|
name: Lint
|
|
42
46
|
runs-on: ubuntu-latest
|
|
43
47
|
steps:
|
|
44
|
-
- uses: actions/checkout@
|
|
48
|
+
- uses: actions/checkout@v7
|
|
45
49
|
|
|
46
50
|
- name: Install uv
|
|
47
51
|
uses: astral-sh/setup-uv@v8.2.0
|
|
@@ -55,6 +59,9 @@ jobs:
|
|
|
55
59
|
- name: Check linting
|
|
56
60
|
run: uv run ruff check .
|
|
57
61
|
|
|
62
|
+
# Docstring consistency (pydoclint) runs inside the pytest suite via
|
|
63
|
+
# tests/test_docstrings.py, so it's not a separate CI lint step.
|
|
64
|
+
|
|
58
65
|
- name: Type check (mypy)
|
|
59
66
|
run: uv run mypy vgi/
|
|
60
67
|
|
|
@@ -65,6 +72,52 @@ jobs:
|
|
|
65
72
|
run: uv run ty check vgi/
|
|
66
73
|
continue-on-error: true
|
|
67
74
|
|
|
75
|
+
docs:
|
|
76
|
+
name: Docs (build + examples + prose)
|
|
77
|
+
runs-on: ubuntu-latest
|
|
78
|
+
env:
|
|
79
|
+
DISABLE_MKDOCS_2_WARNING: "true"
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/checkout@v7
|
|
82
|
+
|
|
83
|
+
- name: Install uv
|
|
84
|
+
uses: astral-sh/setup-uv@v8.2.0
|
|
85
|
+
|
|
86
|
+
- name: Set up Python 3.13
|
|
87
|
+
run: uv python install 3.13
|
|
88
|
+
|
|
89
|
+
- name: Install dependencies
|
|
90
|
+
run: uv sync --all-extras --group docs
|
|
91
|
+
|
|
92
|
+
- name: Install d2
|
|
93
|
+
run: curl -fsSL https://d2lang.com/install.sh | sh -s --
|
|
94
|
+
|
|
95
|
+
- name: Build docs (strict)
|
|
96
|
+
run: uv run mkdocs build --strict
|
|
97
|
+
|
|
98
|
+
- name: Test documentation examples
|
|
99
|
+
run: uv run pytest tests/test_documentation_examples.py tests/test_examples_workers.py -q
|
|
100
|
+
|
|
101
|
+
# Prose lint. Runs on every PR as a signal. Kept non-blocking for now:
|
|
102
|
+
# the Google package + spelling check needs a vocabulary-tuning pass
|
|
103
|
+
# against a real run before it can gate without false positives. Flip
|
|
104
|
+
# fail_on_error to true (and drop continue-on-error) once the vocab in
|
|
105
|
+
# .github/styles/config/vocabularies/VGI/accept.txt is settled.
|
|
106
|
+
- name: Prose lint (Vale)
|
|
107
|
+
uses: errata-ai/vale-action@v2
|
|
108
|
+
continue-on-error: true
|
|
109
|
+
with:
|
|
110
|
+
files: docs
|
|
111
|
+
fail_on_error: true
|
|
112
|
+
|
|
113
|
+
- name: Link check (lychee)
|
|
114
|
+
uses: lycheeverse/lychee-action@v2
|
|
115
|
+
with:
|
|
116
|
+
# --root-dir resolves root-relative links (e.g. <img src="/assets/...">,
|
|
117
|
+
# which mkdocs serves from the site root = docs/) for offline checking.
|
|
118
|
+
args: "--no-progress --offline --root-dir ${{ github.workspace }}/docs docs/**/*.md *.md"
|
|
119
|
+
fail: true
|
|
120
|
+
|
|
68
121
|
s3-offload-localstack:
|
|
69
122
|
name: S3 Offload Tests (LocalStack)
|
|
70
123
|
runs-on: ubuntu-latest
|
|
@@ -77,10 +130,10 @@ jobs:
|
|
|
77
130
|
SERVICES: s3
|
|
78
131
|
AWS_DEFAULT_REGION: us-east-1
|
|
79
132
|
steps:
|
|
80
|
-
- uses: actions/checkout@
|
|
133
|
+
- uses: actions/checkout@v7
|
|
81
134
|
|
|
82
135
|
- name: Checkout vgi-rpc
|
|
83
|
-
uses: actions/checkout@
|
|
136
|
+
uses: actions/checkout@v7
|
|
84
137
|
with:
|
|
85
138
|
repository: Query-farm/vgi-rpc-python
|
|
86
139
|
path: vgi-rpc
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
# Cloudflare Pages deploy is disabled for now — docs hosting is moving to a
|
|
4
|
+
# different approach. This workflow is manual-only (workflow_dispatch) and just
|
|
5
|
+
# builds the site as a check; the CI workflow already validates the docs build
|
|
6
|
+
# (strict), examples, prose, and links on every push. Re-add a deploy step here
|
|
7
|
+
# (or a new workflow) once the new hosting path is decided.
|
|
8
|
+
on:
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v7
|
|
19
|
+
|
|
20
|
+
- name: Install uv
|
|
21
|
+
uses: astral-sh/setup-uv@v8.2.0
|
|
22
|
+
|
|
23
|
+
- name: Set up Python
|
|
24
|
+
run: uv python install 3.13
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: uv sync --group docs
|
|
28
|
+
|
|
29
|
+
- name: Install d2
|
|
30
|
+
run: curl -fsSL https://d2lang.com/install.sh | sh -s --
|
|
31
|
+
|
|
32
|
+
- name: Build docs
|
|
33
|
+
run: uv run mkdocs build --strict
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Runs the canonical Query-farm/vgi integration sqllogictest suite against the
|
|
2
|
+
# Python example worker on every push / PR. Rather than building the C++ extension
|
|
3
|
+
# from source, it drives a prebuilt standalone `haybarn-unittest` and installs the
|
|
4
|
+
# SIGNED vgi extension from the Haybarn community channel + its deps from core.
|
|
5
|
+
# The .test files come from a pinned Query-farm/vgi checkout; ci/run-integration.sh
|
|
6
|
+
# + ci/preprocess-require.awk adapt them for the standalone runner. See ci/README.md.
|
|
7
|
+
#
|
|
8
|
+
# (The separate ci.yml covers lint / type-check / unit + conformance tests / docs.
|
|
9
|
+
# Those drive the pure-Python in-process Client; this workflow is the only place
|
|
10
|
+
# the worker is exercised through the real published DuckDB extension over the wire.)
|
|
11
|
+
name: Integration suite
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
push:
|
|
15
|
+
branches: [main]
|
|
16
|
+
pull_request:
|
|
17
|
+
branches: [main]
|
|
18
|
+
workflow_dispatch:
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
|
|
23
|
+
concurrency:
|
|
24
|
+
group: integration-${{ github.ref }}
|
|
25
|
+
cancel-in-progress: true
|
|
26
|
+
|
|
27
|
+
env:
|
|
28
|
+
# The Query-farm/vgi ref whose test/sql/integration suite we run. For now this
|
|
29
|
+
# tracks the latest `main` (resolved at checkout time) so the Python port is
|
|
30
|
+
# always validated against the newest C++ test suite. Pin to a specific commit
|
|
31
|
+
# SHA here if/when reproducible, deliberate bumps are wanted (see ci/README.md).
|
|
32
|
+
VGI_REF: main
|
|
33
|
+
# The Haybarn release providing the prebuilt haybarn-unittest binary. Must be
|
|
34
|
+
# ABI-compatible with the community-published vgi extension.
|
|
35
|
+
HAYBARN_RELEASE: haybarn-v1.5.4-rc1
|
|
36
|
+
|
|
37
|
+
jobs:
|
|
38
|
+
integration:
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
timeout-minutes: 45
|
|
41
|
+
strategy:
|
|
42
|
+
fail-fast: false
|
|
43
|
+
matrix:
|
|
44
|
+
include:
|
|
45
|
+
# stdio: the subprocess transport (whole suite — the primary lane).
|
|
46
|
+
# shm: stdio + the POSIX shared-memory side channel.
|
|
47
|
+
# launch: the AF_UNIX launcher-only tests.
|
|
48
|
+
# http: the whole suite over the stateless HTTP transport.
|
|
49
|
+
- { lane: stdio }
|
|
50
|
+
- { lane: shm, shm_bytes: '67108864' }
|
|
51
|
+
- { lane: launch }
|
|
52
|
+
- { lane: http }
|
|
53
|
+
name: integration (${{ matrix.lane }})
|
|
54
|
+
steps:
|
|
55
|
+
- name: Checkout vgi-python
|
|
56
|
+
uses: actions/checkout@v7
|
|
57
|
+
|
|
58
|
+
- name: Checkout pinned vgi test suite
|
|
59
|
+
uses: actions/checkout@v7
|
|
60
|
+
with:
|
|
61
|
+
repository: Query-farm/vgi
|
|
62
|
+
ref: ${{ env.VGI_REF }}
|
|
63
|
+
path: vgi-upstream
|
|
64
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
65
|
+
|
|
66
|
+
- name: Install uv
|
|
67
|
+
uses: astral-sh/setup-uv@v8.2.0
|
|
68
|
+
|
|
69
|
+
- name: Set up Python 3.13
|
|
70
|
+
run: uv python install 3.13
|
|
71
|
+
|
|
72
|
+
- name: Install dependencies (vgi + fixtures + all extras)
|
|
73
|
+
run: uv sync --all-extras --python 3.13
|
|
74
|
+
|
|
75
|
+
- name: Download haybarn-unittest
|
|
76
|
+
run: |
|
|
77
|
+
gh release download "$HAYBARN_RELEASE" \
|
|
78
|
+
--repo Query-farm-haybarn/haybarn \
|
|
79
|
+
--pattern 'haybarn_unittest-linux-amd64.zip' \
|
|
80
|
+
--output /tmp/haybarn-unittest.zip --clobber
|
|
81
|
+
unzip -o -q /tmp/haybarn-unittest.zip -d /tmp/haybarn-unittest
|
|
82
|
+
UNITTEST=$(find /tmp/haybarn-unittest -name 'haybarn-unittest' -type f | head -1)
|
|
83
|
+
chmod +x "$UNITTEST"
|
|
84
|
+
echo "HAYBARN_UNITTEST=$UNITTEST" >> "$GITHUB_ENV"
|
|
85
|
+
env:
|
|
86
|
+
GH_TOKEN: ${{ github.token }}
|
|
87
|
+
|
|
88
|
+
- name: Run integration suite (${{ matrix.lane }})
|
|
89
|
+
run: ci/run-integration.sh
|
|
90
|
+
env:
|
|
91
|
+
VGI_SRC: ${{ github.workspace }}/vgi-upstream
|
|
92
|
+
TRANSPORT: ${{ matrix.lane }}
|
|
93
|
+
# Empty on every lane except shm; run-integration.sh drops an empty value.
|
|
94
|
+
VGI_RPC_SHM_SIZE_BYTES: ${{ matrix.shm_bytes || '' }}
|
|
@@ -30,7 +30,7 @@ jobs:
|
|
|
30
30
|
name: Build distributions
|
|
31
31
|
runs-on: ubuntu-latest
|
|
32
32
|
steps:
|
|
33
|
-
- uses: actions/checkout@
|
|
33
|
+
- uses: actions/checkout@v7
|
|
34
34
|
|
|
35
35
|
- name: Install uv
|
|
36
36
|
uses: astral-sh/setup-uv@v8.2.0
|
|
@@ -45,13 +45,13 @@ jobs:
|
|
|
45
45
|
run: uvx twine check dist-vgi/* dist-fixtures/*
|
|
46
46
|
|
|
47
47
|
- name: Upload vgi artifacts
|
|
48
|
-
uses: actions/upload-artifact@
|
|
48
|
+
uses: actions/upload-artifact@v7
|
|
49
49
|
with:
|
|
50
50
|
name: dist-vgi
|
|
51
51
|
path: dist-vgi/
|
|
52
52
|
|
|
53
53
|
- name: Upload vgi-fixtures artifacts
|
|
54
|
-
uses: actions/upload-artifact@
|
|
54
|
+
uses: actions/upload-artifact@v7
|
|
55
55
|
with:
|
|
56
56
|
name: dist-fixtures
|
|
57
57
|
path: dist-fixtures/
|
|
@@ -65,7 +65,7 @@ jobs:
|
|
|
65
65
|
id-token: write # required for Trusted Publishing
|
|
66
66
|
steps:
|
|
67
67
|
- name: Download vgi artifacts
|
|
68
|
-
uses: actions/download-artifact@
|
|
68
|
+
uses: actions/download-artifact@v8
|
|
69
69
|
with:
|
|
70
70
|
name: dist-vgi
|
|
71
71
|
path: dist/
|
|
@@ -88,7 +88,7 @@ jobs:
|
|
|
88
88
|
id-token: write # required for Trusted Publishing
|
|
89
89
|
steps:
|
|
90
90
|
- name: Download vgi-fixtures artifacts
|
|
91
|
-
uses: actions/download-artifact@
|
|
91
|
+
uses: actions/download-artifact@v8
|
|
92
92
|
with:
|
|
93
93
|
name: dist-fixtures
|
|
94
94
|
path: dist/
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Vale prose-lint config for vgi-python docs.
|
|
2
|
+
# Run locally with: vale docs/ (after `vale sync` to fetch the Google package)
|
|
3
|
+
StylesPath = .github/styles
|
|
4
|
+
|
|
5
|
+
# Only fail on errors. The Google package emits many style suggestions/warnings;
|
|
6
|
+
# gating on those would be noisy, so the CI gate enforces error-level issues
|
|
7
|
+
# (Vale core checks + spelling against the VGI vocabulary) only.
|
|
8
|
+
MinAlertLevel = error
|
|
9
|
+
|
|
10
|
+
Packages = Google
|
|
11
|
+
|
|
12
|
+
Vocab = VGI
|
|
13
|
+
|
|
14
|
+
[*.md]
|
|
15
|
+
BasedOnStyles = Vale, Google
|
|
16
|
+
|
|
17
|
+
# Snippet directives and our auto-generated API pages aren't prose to lint.
|
|
18
|
+
[docs/api/*]
|
|
19
|
+
BasedOnStyles =
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# VGI-Python Documentation — Acceptance Criteria (review-ready v1)
|
|
2
|
+
|
|
3
|
+
> Status: DRAFT for senior DX-engineer review. Derived from a requirements interview.
|
|
4
|
+
> This document defines what "done and good" means for the documentation rework
|
|
5
|
+
> before the site goes live at `vgi-python.query.farm`.
|
|
6
|
+
|
|
7
|
+
## North Star
|
|
8
|
+
|
|
9
|
+
**A developer who has never used VGI can build and run a real worker fast.**
|
|
10
|
+
Everything on the site is optimized around that job-to-be-done; depth is available
|
|
11
|
+
but never blocks the fast path.
|
|
12
|
+
|
|
13
|
+
## Target audience (mixed — serve all via progressive disclosure)
|
|
14
|
+
|
|
15
|
+
The reader could be a Python developer new to DuckDB/Arrow, a DuckDB/SQL user newer
|
|
16
|
+
to Python, or someone fluent in both. Therefore:
|
|
17
|
+
|
|
18
|
+
- The happy path is skimmable by experts (dense, copy-paste-ready).
|
|
19
|
+
- Newcomers are served by **progressive disclosure**: inline "New to Arrow? →" /
|
|
20
|
+
"New to DuckDB extensions? →" callouts and links, not walls of prerequisite text.
|
|
21
|
+
- We never assume knowledge silently; we either explain briefly or link out.
|
|
22
|
+
|
|
23
|
+
## Information architecture — Diátaxis
|
|
24
|
+
|
|
25
|
+
Top-level navigation is reorganized into the four Diátaxis modes (this directly
|
|
26
|
+
addresses the current "hard to orient" problem):
|
|
27
|
+
|
|
28
|
+
1. **Tutorial** — one guided, end-to-end "build your first worker" path.
|
|
29
|
+
2. **How-to guides** — task-oriented recipes ("Add a table function", "Run over
|
|
30
|
+
HTTP with auth", "Persist aggregate state").
|
|
31
|
+
3. **Concepts** — explanations: worker lifecycle (bind/init/process/finalize),
|
|
32
|
+
transports, the Arrow data model, catalogs & ATTACH, parallel workers.
|
|
33
|
+
4. **API Reference** — the existing auto-generated mkdocstrings pages.
|
|
34
|
+
|
|
35
|
+
The current 11 hand-written guides are **re-homed** into How-to vs Concepts (not
|
|
36
|
+
left in a flat "Guides" bucket).
|
|
37
|
+
|
|
38
|
+
## Scope
|
|
39
|
+
|
|
40
|
+
### In scope for v1 (must be fully documented: tutorial coverage + how-to + runnable example)
|
|
41
|
+
|
|
42
|
+
- **All four function patterns**: scalar, table, table-in-out, aggregate.
|
|
43
|
+
- **Catalogs / ATTACH model** — how functions are surfaced to DuckDB.
|
|
44
|
+
- **State storage** — `FunctionStorage` backends for stateful/aggregate functions.
|
|
45
|
+
- **Auth + HTTP transport** — running a worker over HTTP with bearer/JWT auth.
|
|
46
|
+
- **Filter pushdown & column statistics** — optimizer integration for table functions.
|
|
47
|
+
|
|
48
|
+
### Out of scope for v1 (reference-only / deferred — must NOT block launch)
|
|
49
|
+
|
|
50
|
+
- Transactor (transactional DB access)
|
|
51
|
+
- External storage / large-payload offload (S3/GCS)
|
|
52
|
+
- Observability (OpenTelemetry / Sentry)
|
|
53
|
+
- Sharding / meta-worker, cross-language client codegen, standalone secret service
|
|
54
|
+
|
|
55
|
+
These remain available in the auto-generated API reference but get no tutorial/how-to
|
|
56
|
+
investment in v1.
|
|
57
|
+
|
|
58
|
+
## Headline acceptance test (Time-To-First-Success)
|
|
59
|
+
|
|
60
|
+
> **An unfamiliar developer, working unaided from the docs, has both a custom
|
|
61
|
+
> scalar function AND a custom table function callable from DuckDB within
|
|
62
|
+
> ≤20 minutes.**
|
|
63
|
+
|
|
64
|
+
- "Callable from DuckDB" = `SELECT my_cat.my_scalar(col) FROM t` returns rows, and
|
|
65
|
+
`SELECT * FROM my_cat.my_table(args)` returns rows.
|
|
66
|
+
- Engine for the timed path: **Haybarn** (`uvx haybarn-cli`) as the primary happy
|
|
67
|
+
path; a stock-DuckDB variant (`INSTALL vgi FROM community; LOAD vgi;`) shown in a
|
|
68
|
+
callout/tab for portability.
|
|
69
|
+
- Every place a test participant gets stuck is logged and fixed before sign-off.
|
|
70
|
+
|
|
71
|
+
## Per-page orientation standard (applies to every tutorial / how-to / concept page)
|
|
72
|
+
|
|
73
|
+
Each page must contain:
|
|
74
|
+
|
|
75
|
+
1. **Lead "what + who" line** — one sentence at the top: what this page is and who
|
|
76
|
+
it's for (reader self-orients in <10 s).
|
|
77
|
+
2. **Prerequisites stated** — explicit assumed knowledge, prior steps, and required
|
|
78
|
+
extras (`vgi-python[http]`, etc.), with links.
|
|
79
|
+
3. **At least one complete, runnable example** — no elisions; covered by the CI
|
|
80
|
+
example tests (see Quality Gates).
|
|
81
|
+
4. **"Next steps" links** — a closing section pointing to the logical next page(s);
|
|
82
|
+
no dead ends.
|
|
83
|
+
|
|
84
|
+
## Example correctness bar
|
|
85
|
+
|
|
86
|
+
- **100% of Python code blocks are copy-paste runnable and CI-tested** (e.g. via
|
|
87
|
+
`pytest-examples`, already a dev dependency).
|
|
88
|
+
- The tutorial worker is **built and queried end-to-end in an automated test**.
|
|
89
|
+
- A broken example fails the build.
|
|
90
|
+
|
|
91
|
+
## Quality gates (all three required to sign off v1)
|
|
92
|
+
|
|
93
|
+
1. **Fresh-dev usability test** — ≥1 developer unfamiliar with VGI completes the
|
|
94
|
+
headline acceptance test (scalar + table from DuckDB, ≤20 min, unaided). All
|
|
95
|
+
stumbling points resolved.
|
|
96
|
+
2. **Senior DX reviewer rubric** — named senior DX engineer(s) score the site
|
|
97
|
+
against a written checklist: orientation, scannability, completeness vs the
|
|
98
|
+
in-scope list, correctness, navigation, and the per-page standard above. All
|
|
99
|
+
must-fix items resolved before merge.
|
|
100
|
+
3. **Automated quality gates in CI**:
|
|
101
|
+
- `mkdocs build --strict` passes with zero warnings (no broken links / refs).
|
|
102
|
+
- All documentation examples execute successfully.
|
|
103
|
+
- Link check + prose/style lint pass.
|
|
104
|
+
|
|
105
|
+
## Definition of Done (v1)
|
|
106
|
+
|
|
107
|
+
- [ ] Diátaxis nav live (Tutorial / How-to / Concepts / API Reference); existing
|
|
108
|
+
guides re-homed.
|
|
109
|
+
- [ ] Guided tutorial takes a reader from zero → scalar + table function queried
|
|
110
|
+
from Haybarn, with the stock-DuckDB variant noted.
|
|
111
|
+
- [ ] How-to + runnable example exists for each in-scope topic (4 patterns +
|
|
112
|
+
catalogs + state storage + auth/HTTP + pushdown/stats).
|
|
113
|
+
- [ ] Concept pages cover lifecycle, transports, Arrow model, catalogs, parallelism.
|
|
114
|
+
- [ ] Every page meets the 4-point orientation standard.
|
|
115
|
+
- [ ] All examples runnable and CI-tested; tutorial validated end-to-end in CI.
|
|
116
|
+
- [ ] Out-of-scope topics confined to reference; not advertised as v1 guides.
|
|
117
|
+
- [ ] All three quality gates passed and signed off.
|
|
118
|
+
|
|
119
|
+
## Open items to confirm with reviewers
|
|
120
|
+
|
|
121
|
+
- Named senior DX reviewer(s) and the recruited fresh-dev test participant.
|
|
122
|
+
- Final wording/threshold of the prose-style lint (e.g. Vale ruleset), if adopted.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# vgi-python docs — senior DX review rubric
|
|
2
|
+
|
|
3
|
+
> Status: review checklist for the review-ready v1 of the documentation
|
|
4
|
+
> (see `DOCS_ACCEPTANCE_CRITERIA.md`). A reviewer scores each item Pass / Fix /
|
|
5
|
+
> N/A. Every **Fix** must be resolved (or explicitly waived) before the site
|
|
6
|
+
> goes live at `vgi-python.query.farm`.
|
|
7
|
+
|
|
8
|
+
Reviewer: ________________ Date: ________________ Commit: ________________
|
|
9
|
+
|
|
10
|
+
## 1. Orientation (the problem this rework targets)
|
|
11
|
+
|
|
12
|
+
- [ ] The home page makes it obvious in <10 s what vgi-python is and where to start.
|
|
13
|
+
- [ ] Top-level nav clearly separates **Tutorial / How-to / Concepts / API Reference**
|
|
14
|
+
(Diátaxis); a newcomer can tell which to open for their need.
|
|
15
|
+
- [ ] Every tutorial/how-to/concept page opens with a **"what + who"** line.
|
|
16
|
+
- [ ] No page is a dead end — each ends with **"Next steps"** links.
|
|
17
|
+
|
|
18
|
+
## 2. The fast path (job-to-be-done: ship a worker fast)
|
|
19
|
+
|
|
20
|
+
- [ ] The tutorial gets a reader from zero → a **scalar + table** function callable from
|
|
21
|
+
DuckDB, and is realistically completable in **≤20 minutes**.
|
|
22
|
+
- [ ] The first step yields a working query quickly (scalar before table).
|
|
23
|
+
- [ ] Haybarn is the primary path; the stock-DuckDB variant is present and correct.
|
|
24
|
+
- [ ] Copy-paste works: the worker shown is complete and runnable as-is.
|
|
25
|
+
|
|
26
|
+
## 3. Completeness vs. the in-scope list
|
|
27
|
+
|
|
28
|
+
- [ ] All four function patterns are documented with a runnable example: scalar, table,
|
|
29
|
+
table-in-out, aggregate.
|
|
30
|
+
- [ ] Catalogs / ATTACH, state storage, auth + HTTP, and filter pushdown & stats each have a
|
|
31
|
+
how-to.
|
|
32
|
+
- [ ] Out-of-scope topics (transactor, external storage, observability, sharding/codegen/secret
|
|
33
|
+
service) are reference-only and not advertised as v1 guides.
|
|
34
|
+
|
|
35
|
+
## 4. Correctness
|
|
36
|
+
|
|
37
|
+
- [ ] Every code example is accurate and runs (CI: `test_documentation_examples.py` +
|
|
38
|
+
`test_examples_workers.py` green).
|
|
39
|
+
- [ ] SQL snippets use correct catalog/function names and match the worker shown.
|
|
40
|
+
- [ ] Conceptual claims (lifecycle phases, transports, Arrow semantics) are accurate.
|
|
41
|
+
- [ ] API reference renders for every in-scope module (CI: `mkdocs build --strict` green).
|
|
42
|
+
|
|
43
|
+
## 5. Scannability & progressive disclosure
|
|
44
|
+
|
|
45
|
+
- [ ] Pages use headings, tables, and short paragraphs; an expert can skim.
|
|
46
|
+
- [ ] Newcomer background is in collapsible callouts, not blocking the main flow.
|
|
47
|
+
- [ ] Prerequisites and required extras (`[http]`, `[oauth]`, …) are stated where needed.
|
|
48
|
+
|
|
49
|
+
## 6. Navigation & polish
|
|
50
|
+
|
|
51
|
+
- [ ] No broken links (CI: lychee + strict build green).
|
|
52
|
+
- [ ] Search returns sensible results for common terms (worker, scalar, aggregate, ATTACH).
|
|
53
|
+
- [ ] Light/dark themes, logo, and code-copy all work.
|
|
54
|
+
|
|
55
|
+
## Automated gates (must be green at review time)
|
|
56
|
+
|
|
57
|
+
- [ ] `mkdocs build --strict` — zero warnings
|
|
58
|
+
- [ ] `pytest tests/test_documentation_examples.py tests/test_examples_workers.py`
|
|
59
|
+
- [ ] lychee link-check
|
|
60
|
+
- [ ] Vale prose lint (advisory until vocab is tuned; note residual warnings)
|
|
61
|
+
|
|
62
|
+
## Sign-off
|
|
63
|
+
|
|
64
|
+
- [ ] All **Fix** items resolved or waived (waivers noted below).
|
|
65
|
+
- [ ] Fresh-dev usability test passed (see `DOCS_USABILITY_TEST.md`).
|
|
66
|
+
|
|
67
|
+
Waivers / notes:
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# vgi-python docs — fresh-dev usability test
|
|
2
|
+
|
|
3
|
+
> The headline acceptance gate: an unfamiliar developer, working **only** from the
|
|
4
|
+
> docs, builds and runs a worker. This protocol scripts that test and captures
|
|
5
|
+
> what to fix. See `DOCS_ACCEPTANCE_CRITERIA.md` for the full criteria.
|
|
6
|
+
|
|
7
|
+
## Goal (pass condition)
|
|
8
|
+
|
|
9
|
+
> A developer **new to VGI**, working **unaided** from the published docs, reaches a custom
|
|
10
|
+
> **scalar AND table** function callable from DuckDB in **≤20 minutes**.
|
|
11
|
+
|
|
12
|
+
"Callable from DuckDB" means both:
|
|
13
|
+
|
|
14
|
+
- `SELECT greetings.greeting('Alice')` returns `Hello, Alice!`, and
|
|
15
|
+
- `SELECT * FROM greetings.greeting_series(3)` returns 3 rows.
|
|
16
|
+
|
|
17
|
+
## Participant criteria
|
|
18
|
+
|
|
19
|
+
- Comfortable writing Python; **has not** used VGI before.
|
|
20
|
+
- A mix is ideal across runs: at least one participant new to DuckDB extensions, and at least
|
|
21
|
+
one new to Apache Arrow (this is the "serve all" audience we're validating).
|
|
22
|
+
- Has Python 3.13+ and `uv` installed (or we install them first, off the clock).
|
|
23
|
+
|
|
24
|
+
## Facilitator rules
|
|
25
|
+
|
|
26
|
+
- **Do not help.** Point the participant at the docs home page and the timer; then observe in
|
|
27
|
+
silence. Answer only "I can't help with that — what would you try?"
|
|
28
|
+
- Record the clock at each milestone and **every** point of confusion verbatim.
|
|
29
|
+
- Capture the participant's words ("I don't know what a catalog is here") — those become doc fixes.
|
|
30
|
+
|
|
31
|
+
## Script
|
|
32
|
+
|
|
33
|
+
1. Start screen recording (or take notes) and the timer.
|
|
34
|
+
2. Give the participant only this: *"Using the vgi-python docs, build a worker that adds two
|
|
35
|
+
functions to DuckDB — one that greets a name, and one that generates a series of greetings —
|
|
36
|
+
and run both from SQL. Start at the docs home page."*
|
|
37
|
+
3. Observe until success or 30 minutes elapsed (let them run past 20 so we learn where the tail is).
|
|
38
|
+
4. Debrief: what was confusing, what was missing, what they expected to find and didn't.
|
|
39
|
+
|
|
40
|
+
## Milestones (record the time reached)
|
|
41
|
+
|
|
42
|
+
| Milestone | Time | Notes |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| Found the tutorial / starting point | | |
|
|
45
|
+
| Worker file written | | |
|
|
46
|
+
| SQL engine launched (Haybarn or DuckDB) | | |
|
|
47
|
+
| Worker attached (`ATTACH …`) | | |
|
|
48
|
+
| **Scalar query returned a result** | | |
|
|
49
|
+
| **Table query returned rows** | | |
|
|
50
|
+
| Total time to success (or DNF) | | |
|
|
51
|
+
|
|
52
|
+
## Stumble log
|
|
53
|
+
|
|
54
|
+
| # | Where (page / step) | What happened | Severity (block/slow/nit) | Fix |
|
|
55
|
+
|---|---|---|---|---|
|
|
56
|
+
| 1 | | | | |
|
|
57
|
+
| 2 | | | | |
|
|
58
|
+
| 3 | | | | |
|
|
59
|
+
|
|
60
|
+
## Outcome
|
|
61
|
+
|
|
62
|
+
- [ ] Passed (≤20 min, unaided, both functions) — participant: ____________ time: ______
|
|
63
|
+
- [ ] Did not pass — root cause: ____________________________________________
|
|
64
|
+
|
|
65
|
+
**Every block/slow stumble must produce a doc fix (or an explicit waiver) before sign-off.**
|
|
66
|
+
|
|
67
|
+
## Runs
|
|
68
|
+
|
|
69
|
+
| Date | Participant background | Result | Time | Fixes filed |
|
|
70
|
+
|---|---|---|---|---|
|
|
71
|
+
| | | | | |
|