vgi-python 0.8.0__tar.gz → 0.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. vgi_python-0.8.1/.github/dependabot.yml +43 -0
  2. vgi_python-0.8.1/.github/styles/config/vocabularies/VGI/accept.txt +41 -0
  3. {vgi_python-0.8.0 → vgi_python-0.8.1}/.github/workflows/ci.yml +57 -4
  4. vgi_python-0.8.1/.github/workflows/docs.yml +33 -0
  5. vgi_python-0.8.1/.github/workflows/integration.yml +94 -0
  6. {vgi_python-0.8.0 → vgi_python-0.8.1}/.github/workflows/release.yml +5 -5
  7. {vgi_python-0.8.0 → vgi_python-0.8.1}/.gitignore +5 -0
  8. vgi_python-0.8.1/.vale.ini +19 -0
  9. vgi_python-0.8.1/DOCS_ACCEPTANCE_CRITERIA.md +122 -0
  10. vgi_python-0.8.1/DOCS_REVIEW_RUBRIC.md +67 -0
  11. vgi_python-0.8.1/DOCS_USABILITY_TEST.md +71 -0
  12. {vgi_python-0.8.0 → vgi_python-0.8.1}/PKG-INFO +89 -176
  13. {vgi_python-0.8.0 → vgi_python-0.8.1}/README.md +84 -173
  14. vgi_python-0.8.1/SECURITY.md +9 -0
  15. vgi_python-0.8.1/ci/README.md +138 -0
  16. vgi_python-0.8.1/ci/preprocess-require.awk +40 -0
  17. vgi_python-0.8.1/ci/run-integration.sh +252 -0
  18. vgi_python-0.8.1/docs/api/arguments.md +17 -0
  19. vgi_python-0.8.1/docs/api/auth.md +21 -0
  20. vgi_python-0.8.1/docs/api/catalogs.md +7 -0
  21. vgi_python-0.8.1/docs/api/client.md +6 -0
  22. vgi_python-0.8.1/docs/api/exceptions.md +8 -0
  23. vgi_python-0.8.1/docs/api/filters.md +8 -0
  24. vgi_python-0.8.1/docs/api/functions.md +32 -0
  25. vgi_python-0.8.1/docs/api/http.md +6 -0
  26. vgi_python-0.8.1/docs/api/index.md +47 -0
  27. vgi_python-0.8.1/docs/api/metadata.md +18 -0
  28. vgi_python-0.8.1/docs/api/observability.md +19 -0
  29. vgi_python-0.8.1/docs/api/storage.md +20 -0
  30. vgi_python-0.8.1/docs/api/transactor.md +12 -0
  31. vgi_python-0.8.1/docs/api/worker.md +23 -0
  32. vgi_python-0.8.1/docs/assets/apple-touch-icon.png +0 -0
  33. vgi_python-0.8.1/docs/assets/favicon-16x16.png +0 -0
  34. vgi_python-0.8.1/docs/assets/favicon-32x32.png +0 -0
  35. vgi_python-0.8.1/docs/assets/favicon.ico +0 -0
  36. vgi_python-0.8.1/docs/assets/kinds/aggregate.svg +7 -0
  37. vgi_python-0.8.1/docs/assets/kinds/buffering.svg +13 -0
  38. vgi_python-0.8.1/docs/assets/kinds/scalar.svg +7 -0
  39. vgi_python-0.8.1/docs/assets/kinds/table-in-out.svg +11 -0
  40. vgi_python-0.8.1/docs/assets/kinds/table.svg +8 -0
  41. vgi_python-0.8.1/docs/assets/logo.png +0 -0
  42. vgi_python-0.8.1/docs/assets/social-card.png +0 -0
  43. vgi_python-0.8.1/docs/concepts/index.md +66 -0
  44. vgi_python-0.8.1/docs/contributing-docs.md +121 -0
  45. vgi_python-0.8.1/docs/how-to/catalogs.md +65 -0
  46. vgi_python-0.8.1/docs/how-to/function-patterns.md +227 -0
  47. vgi_python-0.8.1/docs/how-to/http-auth.md +70 -0
  48. vgi_python-0.8.1/docs/how-to/index.md +35 -0
  49. vgi_python-0.8.1/docs/how-to/pushdown-and-statistics.md +72 -0
  50. vgi_python-0.8.1/docs/how-to/state-storage.md +69 -0
  51. vgi_python-0.8.1/docs/index.md +114 -0
  52. vgi_python-0.8.1/docs/overrides/main.html +45 -0
  53. vgi_python-0.8.1/docs/robots.txt +4 -0
  54. vgi_python-0.8.1/docs/stylesheets/extra.css +389 -0
  55. vgi_python-0.8.1/docs/tutorial/index.md +33 -0
  56. vgi_python-0.8.1/docs/tutorial/scalar.md +98 -0
  57. vgi_python-0.8.1/docs/tutorial/table.md +84 -0
  58. vgi_python-0.8.1/docs/vgi-logo.png +0 -0
  59. vgi_python-0.8.1/examples/calc_scalar_worker.py +45 -0
  60. vgi_python-0.8.1/examples/calc_worker.py +88 -0
  61. vgi_python-0.8.1/examples/filter_worker.py +67 -0
  62. vgi_python-0.8.1/examples/greeting_scalar_worker.py +45 -0
  63. vgi_python-0.8.1/examples/row_count_worker.py +111 -0
  64. vgi_python-0.8.1/examples/series_streaming_worker.py +86 -0
  65. vgi_python-0.8.1/examples/sum_worker.py +101 -0
  66. vgi_python-0.8.1/mkdocs.yml +157 -0
  67. {vgi_python-0.8.0 → vgi_python-0.8.1}/packages/vgi-fixtures/pyproject.toml +1 -1
  68. {vgi_python-0.8.0 → vgi_python-0.8.1}/pyproject.toml +57 -7
  69. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_declarative.py +53 -0
  70. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_setting.py +5 -2
  71. vgi_python-0.8.1/tests/test_docstrings.py +60 -0
  72. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_documentation_examples.py +19 -2
  73. vgi_python-0.8.1/tests/test_examples_workers.py +133 -0
  74. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_protocol_classes.py +2 -4
  75. vgi_python-0.8.1/uv.lock +2577 -0
  76. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_duckdb.py +3 -0
  77. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/dynamic.py +7 -1
  78. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/__init__.py +4 -0
  79. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/settings_secrets.py +73 -0
  80. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/__init__.py +4 -0
  81. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/filters.py +128 -0
  82. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/late_materialization.py +3 -0
  83. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/make_series.py +15 -0
  84. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/misc.py +4 -0
  85. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/pairs.py +12 -0
  86. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/sequence.py +28 -0
  87. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/settings.py +6 -0
  88. vgi_python-0.8.1/vgi/_test_fixtures/table/typed_probe.py +154 -0
  89. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table_in_out.py +8 -26
  90. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/worker.py +9 -0
  91. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/aggregate_function.py +29 -11
  92. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/argument_spec.py +20 -20
  93. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/arguments.py +114 -153
  94. vgi_python-0.8.0/vgi/catalog/setting.py → vgi_python-0.8.1/vgi/catalog/_descriptor_spec.py +84 -91
  95. vgi_python-0.8.1/vgi/catalog/attach_option.py +49 -0
  96. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/catalog/catalog_interface.py +390 -264
  97. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/catalog/descriptors.py +59 -26
  98. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/catalog/secret_type.py +1 -0
  99. vgi_python-0.8.1/vgi/catalog/setting.py +58 -0
  100. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/catalog/storage.py +8 -4
  101. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/catalog_mixin.py +37 -33
  102. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/cli_catalog.py +4 -16
  103. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/cli_schema.py +12 -73
  104. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/cli_table.py +30 -199
  105. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/cli_utils.py +74 -19
  106. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/cli_view.py +12 -74
  107. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/client.py +104 -79
  108. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/_common.py +7 -1
  109. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/cpp_constants.py +11 -4
  110. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/ts_client.py +11 -0
  111. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/exceptions.py +4 -0
  112. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/function.py +9 -33
  113. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/function_storage.py +11 -46
  114. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/function_storage_azure_sql.py +6 -6
  115. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/function_storage_cf_do.py +23 -3
  116. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/http/worker_page.py +18 -8
  117. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/invocation.py +10 -10
  118. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/meta_worker.py +7 -7
  119. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/metadata.py +111 -46
  120. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/otel.py +3 -3
  121. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/protocol.py +504 -94
  122. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/scalar_function.py +93 -72
  123. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/schema_utils.py +2 -2
  124. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/secret_protocol.py +22 -3
  125. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/secret_service.py +9 -6
  126. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/serve.py +11 -11
  127. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/table_buffering_function.py +28 -22
  128. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/table_filter_pushdown.py +435 -61
  129. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/table_function.py +279 -82
  130. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/table_in_out_function.py +88 -28
  131. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/transactor/client.py +1 -1
  132. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/transactor/protocol.py +1 -1
  133. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/transactor/server.py +26 -64
  134. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/worker.py +125 -272
  135. vgi_python-0.8.0/docs/vgi-logo.png +0 -0
  136. vgi_python-0.8.0/uv.lock +0 -1982
  137. vgi_python-0.8.0/vgi/catalog/attach_option.py +0 -206
  138. {vgi_python-0.8.0 → vgi_python-0.8.1}/.gitattributes +0 -0
  139. {vgi_python-0.8.0 → vgi_python-0.8.1}/.python-version +0 -0
  140. {vgi_python-0.8.0 → vgi_python-0.8.1}/CLAUDE.md +0 -0
  141. {vgi_python-0.8.0 → vgi_python-0.8.1}/LICENSE +0 -0
  142. {vgi_python-0.8.0 → vgi_python-0.8.1}/dist-vgi/.gitignore +0 -0
  143. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/aggregate-functions.md +0 -0
  144. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/argument-serialization.md +0 -0
  145. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/authentication.md +0 -0
  146. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/catalog-interface.md +0 -0
  147. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/cli.md +0 -0
  148. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/column-statistics.md +0 -0
  149. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/filter-pushdown.md +0 -0
  150. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/generator-api.md +0 -0
  151. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/lifecycle.md +0 -0
  152. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/metadata.md +0 -0
  153. {vgi_python-0.8.0 → vgi_python-0.8.1}/docs/shared-storage.md +0 -0
  154. {vgi_python-0.8.0 → vgi_python-0.8.1}/packages/vgi-fixtures/LICENSE +0 -0
  155. {vgi_python-0.8.0 → vgi_python-0.8.1}/packages/vgi-fixtures/README.md +0 -0
  156. {vgi_python-0.8.0 → vgi_python-0.8.1}/scripts/measure_startup.py +0 -0
  157. {vgi_python-0.8.0 → vgi_python-0.8.1}/scripts/run_all_tests.sh +0 -0
  158. {vgi_python-0.8.0 → vgi_python-0.8.1}/test-data/generate.sh +0 -0
  159. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/__init__.py +0 -0
  160. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/_http_fixtures.py +0 -0
  161. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/__init__.py +0 -0
  162. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_catalog_interface.py +0 -0
  163. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_client_catalog.py +0 -0
  164. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_column_statistics.py +0 -0
  165. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_example_worker_catalog.py +0 -0
  166. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_integration.py +0 -0
  167. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_required_field_filter_paths.py +0 -0
  168. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_scan_branches.py +0 -0
  169. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_serialization.py +0 -0
  170. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_storage.py +0 -0
  171. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_time_travel.py +0 -0
  172. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/catalog/test_writable_table.py +0 -0
  173. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/client/__init__.py +0 -0
  174. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/client/test_broken_pipe.py +0 -0
  175. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/client/test_cli.py +0 -0
  176. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/client/test_cli_catalog_functions.py +0 -0
  177. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/client/test_worker_debug.py +0 -0
  178. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/__init__.py +0 -0
  179. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/_stub.py +0 -0
  180. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/conftest.py +0 -0
  181. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_accumulate.py +0 -0
  182. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_aggregate.py +0 -0
  183. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_attach.py +0 -0
  184. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_bearer_auth.py +0 -0
  185. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_directory_parity.py +0 -0
  186. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_function_inventory.py +0 -0
  187. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_http_client.py +0 -0
  188. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_http_external_location.py +0 -0
  189. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_http_upload_url.py +0 -0
  190. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_macro.py +0 -0
  191. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_overload.py +0 -0
  192. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_protocol_inventory.py +0 -0
  193. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_protocol_version.py +0 -0
  194. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_resumable_scan.py +0 -0
  195. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_scalar.py +0 -0
  196. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  197. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_secret.py +0 -0
  198. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_settings.py +0 -0
  199. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_table.py +0 -0
  200. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_table_in_out.py +0 -0
  201. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_view.py +0 -0
  202. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conformance/test_writable.py +0 -0
  203. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/conftest.py +0 -0
  204. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/__init__.py +0 -0
  205. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_bernoulli_function.py +0 -0
  206. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_binary_packet_function.py +0 -0
  207. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_client.py +0 -0
  208. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_conditional_message_function.py +0 -0
  209. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_hash_seed_function.py +0 -0
  210. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  211. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_multiply_function.py +0 -0
  212. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_random_bytes_function.py +0 -0
  213. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/scalar/test_return_secret_value_function.py +0 -0
  214. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/__init__.py +0 -0
  215. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/__init__.py +0 -0
  216. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_constant_columns_function.py +0 -0
  217. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_double_sequence_function.py +0 -0
  218. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_exception_function.py +0 -0
  219. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_filter_echo_function.py +0 -0
  220. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_logging_function.py +0 -0
  221. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
  222. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_partitioned_function.py +0 -0
  223. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_projected_data_function.py +0 -0
  224. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_sequence_function.py +0 -0
  225. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_settings_function.py +0 -0
  226. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_struct_settings_function.py +0 -0
  227. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
  228. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/__init__.py +0 -0
  229. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/generator/__init__.py +0 -0
  230. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  231. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
  232. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  233. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  234. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  235. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  236. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/table_in_out/test_client.py +0 -0
  237. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_access_log_audit.py +0 -0
  238. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_aggregate_function.py +0 -0
  239. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_argument_spec.py +0 -0
  240. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_auth.py +0 -0
  241. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_bind_exceptions.py +0 -0
  242. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_bind_request_at_clause.py +0 -0
  243. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_bound_storage_conformance.py +0 -0
  244. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_catalog_auth_binding.py +0 -0
  245. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_example_function_arg_types.py +0 -0
  246. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_exception_handling.py +0 -0
  247. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_exceptions.py +0 -0
  248. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_filter_pushdown.py +0 -0
  249. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_filter_pushdown_extension.py +0 -0
  250. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_function_storage.py +0 -0
  251. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_function_storage_azure_sql.py +0 -0
  252. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_function_storage_cf_do.py +0 -0
  253. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_function_storage_cf_do_integration.py +0 -0
  254. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_function_storage_conformance.py +0 -0
  255. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_cpp_constants.py +0 -0
  256. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_cpp_protocol_version.py +0 -0
  257. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_cpp_request_builders.py +0 -0
  258. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_cpp_schemas.py +0 -0
  259. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_cpp_secret.py +0 -0
  260. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_go_schemas.py +0 -0
  261. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_protocol_version.py +0 -0
  262. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_schemas_cross_lang.py +0 -0
  263. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_ts_client.py +0 -0
  264. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_generated_ts_schemas.py +0 -0
  265. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_http_demo_storage.py +0 -0
  266. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_http_s3_offload_input.py +0 -0
  267. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_http_s3_offload_output.py +0 -0
  268. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_metadata.py +0 -0
  269. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_mypy_consolidated.py +0 -0
  270. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_nest_tensor.py +0 -0
  271. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_otel.py +0 -0
  272. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_projection_enforcement.py +0 -0
  273. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_projection_repro.py +0 -0
  274. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_schema_utils.py +0 -0
  275. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_serve.py +0 -0
  276. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_setting_secret_annotations.py +0 -0
  277. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_table_buffering_function.py +0 -0
  278. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_table_function_dynamic_to_string.py +0 -0
  279. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_type_bounds.py +0 -0
  280. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_worker.py +0 -0
  281. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_worker_cli.py +0 -0
  282. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/test_worker_page.py +0 -0
  283. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/transactor/__init__.py +0 -0
  284. {vgi_python-0.8.0 → vgi_python-0.8.1}/tests/transactor/test_transactor.py +0 -0
  285. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/__init__.py +0 -0
  286. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_storage_profile.py +0 -0
  287. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/__init__.py +0 -0
  288. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  289. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  290. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  291. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  292. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  293. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  294. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  295. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  296. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  297. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  298. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
  299. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/attach_options.py +0 -0
  300. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
  301. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/cancellable.py +0 -0
  302. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/catalog.py +0 -0
  303. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/http_server.py +0 -0
  304. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
  305. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  306. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  307. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  308. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
  309. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  310. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
  311. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  312. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
  313. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  314. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  315. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  316. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  317. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  318. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/simple_writable.py +0 -0
  319. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/_common.py +0 -0
  320. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
  321. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  322. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  323. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
  324. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  325. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  326. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  327. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
  328. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  329. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  330. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/table/versioned.py +0 -0
  331. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/versioned.py +0 -0
  332. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
  333. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
  334. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/writable/generic.py +0 -0
  335. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/writable/table.py +0 -0
  336. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/_test_fixtures/writable/worker.py +0 -0
  337. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/auth.py +0 -0
  338. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/catalog/__init__.py +0 -0
  339. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/catalog/duckdb_statistics.py +0 -0
  340. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/__init__.py +0 -0
  341. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/cli.py +0 -0
  342. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/client/cli_transaction.py +0 -0
  343. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/__init__.py +0 -0
  344. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/cpp_protocol_version.py +0 -0
  345. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/cpp_request_builders.py +0 -0
  346. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/cpp_schemas.py +0 -0
  347. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  348. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  349. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
  350. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/go_schemas.py +0 -0
  351. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/protocol_version.py +0 -0
  352. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/codegen/ts_schemas.py +0 -0
  353. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/http/__init__.py +0 -0
  354. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/http/demo_storage.py +0 -0
  355. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/logging_config.py +0 -0
  356. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/protocol_version.txt +0 -0
  357. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/py.typed +0 -0
  358. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/transactor/__init__.py +0 -0
  359. {vgi_python-0.8.0 → vgi_python-0.8.1}/vgi/transactor/_duckdb_compat.py +0 -0
  360. {vgi_python-0.8.0 → vgi_python-0.8.1}/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@v5
30
+ - uses: actions/checkout@v6
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@v5
48
+ - uses: actions/checkout@v6
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@v6
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@v5
133
+ - uses: actions/checkout@v6
81
134
 
82
135
  - name: Checkout vgi-rpc
83
- uses: actions/checkout@v5
136
+ uses: actions/checkout@v6
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@v6
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@v6
57
+
58
+ - name: Checkout pinned vgi test suite
59
+ uses: actions/checkout@v6
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@v5
33
+ - uses: actions/checkout@v6
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@v4
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@v4
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@v4
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@v4
91
+ uses: actions/download-artifact@v8
92
92
  with:
93
93
  name: dist-fixtures
94
94
  path: dist/
@@ -6,6 +6,11 @@ dist/
6
6
  wheels/
7
7
  *.egg-info
8
8
 
9
+ # MkDocs build output
10
+ /site/
11
+ # MkDocs plugin caches (d2 diagram render cache)
12
+ /.cache/
13
+
9
14
  # Virtual environments
10
15
  .venv
11
16
 
@@ -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
+ | | | | | |