vgi-python 0.15.0__tar.gz → 0.16.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. {vgi_python-0.15.0 → vgi_python-0.16.0}/PKG-INFO +1 -1
  2. {vgi_python-0.15.0 → vgi_python-0.16.0}/pyproject.toml +1 -1
  3. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/landing/describe.expected.json +92 -2
  4. vgi_python-0.16.0/tests/table_in_out/generator/test_substream_partial_sum_function.py +70 -0
  5. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +5 -5
  6. vgi_python-0.16.0/tests/table_in_out/test_blended_metadata.py +150 -0
  7. {vgi_python-0.15.0 → vgi_python-0.16.0}/uv.lock +1 -1
  8. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table_in_out.py +747 -61
  9. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/worker.py +26 -0
  10. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/catalog_interface.py +8 -0
  11. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/metadata.py +69 -1
  12. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/protocol.py +83 -2
  13. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_function.py +40 -3
  14. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_in_out_function.py +49 -0
  15. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/worker.py +69 -9
  16. {vgi_python-0.15.0 → vgi_python-0.16.0}/.gitattributes +0 -0
  17. {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/dependabot.yml +0 -0
  18. {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  19. {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/ci.yml +0 -0
  20. {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/docs.yml +0 -0
  21. {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/integration.yml +0 -0
  22. {vgi_python-0.15.0 → vgi_python-0.16.0}/.github/workflows/release.yml +0 -0
  23. {vgi_python-0.15.0 → vgi_python-0.16.0}/.gitignore +0 -0
  24. {vgi_python-0.15.0 → vgi_python-0.16.0}/.python-version +0 -0
  25. {vgi_python-0.15.0 → vgi_python-0.16.0}/.vale.ini +0 -0
  26. {vgi_python-0.15.0 → vgi_python-0.16.0}/CLAUDE.md +0 -0
  27. {vgi_python-0.15.0 → vgi_python-0.16.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  28. {vgi_python-0.15.0 → vgi_python-0.16.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  29. {vgi_python-0.15.0 → vgi_python-0.16.0}/DOCS_USABILITY_TEST.md +0 -0
  30. {vgi_python-0.15.0 → vgi_python-0.16.0}/LICENSE +0 -0
  31. {vgi_python-0.15.0 → vgi_python-0.16.0}/README.md +0 -0
  32. {vgi_python-0.15.0 → vgi_python-0.16.0}/SECURITY.md +0 -0
  33. {vgi_python-0.15.0 → vgi_python-0.16.0}/ci/README.md +0 -0
  34. {vgi_python-0.15.0 → vgi_python-0.16.0}/ci/preprocess-require.awk +0 -0
  35. {vgi_python-0.15.0 → vgi_python-0.16.0}/ci/run-integration.sh +0 -0
  36. {vgi_python-0.15.0 → vgi_python-0.16.0}/dist-vgi/.gitignore +0 -0
  37. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/aggregate-functions.md +0 -0
  38. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/arguments.md +0 -0
  39. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/auth.md +0 -0
  40. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/catalogs.md +0 -0
  41. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/client.md +0 -0
  42. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/exceptions.md +0 -0
  43. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/filters.md +0 -0
  44. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/functions.md +0 -0
  45. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/http.md +0 -0
  46. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/index.md +0 -0
  47. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/metadata.md +0 -0
  48. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/observability.md +0 -0
  49. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/storage.md +0 -0
  50. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/transactor.md +0 -0
  51. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/api/worker.md +0 -0
  52. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/argument-serialization.md +0 -0
  53. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/apple-touch-icon.png +0 -0
  54. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/favicon-16x16.png +0 -0
  55. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/favicon-32x32.png +0 -0
  56. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/favicon.ico +0 -0
  57. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/aggregate.svg +0 -0
  58. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/buffering.svg +0 -0
  59. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/scalar.svg +0 -0
  60. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/table-in-out.svg +0 -0
  61. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/kinds/table.svg +0 -0
  62. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/logo.png +0 -0
  63. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/assets/social-card.png +0 -0
  64. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/authentication.md +0 -0
  65. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/catalog-interface.md +0 -0
  66. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/cli.md +0 -0
  67. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/column-statistics.md +0 -0
  68. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/concepts/index.md +0 -0
  69. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/contributing-docs.md +0 -0
  70. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/filter-pushdown.md +0 -0
  71. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/generator-api.md +0 -0
  72. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/catalogs.md +0 -0
  73. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/function-patterns.md +0 -0
  74. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/http-auth.md +0 -0
  75. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/index.md +0 -0
  76. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  77. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/how-to/state-storage.md +0 -0
  78. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/index.md +0 -0
  79. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/lifecycle.md +0 -0
  80. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/metadata.md +0 -0
  81. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/overrides/main.html +0 -0
  82. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/robots.txt +0 -0
  83. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/shared-storage.md +0 -0
  84. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/stylesheets/extra.css +0 -0
  85. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/tutorial/index.md +0 -0
  86. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/tutorial/scalar.md +0 -0
  87. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/tutorial/table.md +0 -0
  88. {vgi_python-0.15.0 → vgi_python-0.16.0}/docs/vgi-logo.png +0 -0
  89. {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/calc_scalar_worker.py +0 -0
  90. {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/calc_worker.py +0 -0
  91. {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/filter_worker.py +0 -0
  92. {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/greeting_scalar_worker.py +0 -0
  93. {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/row_count_worker.py +0 -0
  94. {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/series_streaming_worker.py +0 -0
  95. {vgi_python-0.15.0 → vgi_python-0.16.0}/examples/sum_worker.py +0 -0
  96. {vgi_python-0.15.0 → vgi_python-0.16.0}/mkdocs.yml +0 -0
  97. {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/LICENSE +0 -0
  98. {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/README.md +0 -0
  99. {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  100. {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  101. {vgi_python-0.15.0 → vgi_python-0.16.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  102. {vgi_python-0.15.0 → vgi_python-0.16.0}/scripts/measure_startup.py +0 -0
  103. {vgi_python-0.15.0 → vgi_python-0.16.0}/scripts/run_all_tests.sh +0 -0
  104. {vgi_python-0.15.0 → vgi_python-0.16.0}/test-data/generate.sh +0 -0
  105. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/__init__.py +0 -0
  106. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/_http_fixtures.py +0 -0
  107. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/__init__.py +0 -0
  108. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_catalog_interface.py +0 -0
  109. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_client_catalog.py +0 -0
  110. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_column_statistics.py +0 -0
  111. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_declarative.py +0 -0
  112. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  113. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_integration.py +0 -0
  114. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_required_filters.py +0 -0
  115. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_scan_branches.py +0 -0
  116. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_serialization.py +0 -0
  117. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_setting.py +0 -0
  118. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_storage.py +0 -0
  119. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_time_travel.py +0 -0
  120. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/catalog/test_writable_table.py +0 -0
  121. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/__init__.py +0 -0
  122. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_broken_pipe.py +0 -0
  123. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_cli.py +0 -0
  124. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_cli_catalog_functions.py +0 -0
  125. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/client/test_worker_debug.py +0 -0
  126. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/__init__.py +0 -0
  127. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/_stub.py +0 -0
  128. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/conftest.py +0 -0
  129. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_accumulate.py +0 -0
  130. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_aggregate.py +0 -0
  131. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_attach.py +0 -0
  132. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_bearer_auth.py +0 -0
  133. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  134. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_container.py +0 -0
  135. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_copy_from.py +0 -0
  136. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_copy_to.py +0 -0
  137. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_directory_parity.py +0 -0
  138. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_function_inventory.py +0 -0
  139. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_github.py +0 -0
  140. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_http_client.py +0 -0
  141. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_http_external_location.py +0 -0
  142. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_http_upload_url.py +0 -0
  143. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_macro.py +0 -0
  144. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_overload.py +0 -0
  145. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_protocol_inventory.py +0 -0
  146. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_protocol_version.py +0 -0
  147. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_resumable_scan.py +0 -0
  148. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_scalar.py +0 -0
  149. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  150. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_secret.py +0 -0
  151. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_settings.py +0 -0
  152. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_table.py +0 -0
  153. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_table_in_out.py +0 -0
  154. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_view.py +0 -0
  155. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conformance/test_writable.py +0 -0
  156. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/conftest.py +0 -0
  157. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/landing/_checker.py +0 -0
  158. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/landing/describe.schema.json +0 -0
  159. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/__init__.py +0 -0
  160. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_bernoulli_function.py +0 -0
  161. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_binary_packet_function.py +0 -0
  162. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_client.py +0 -0
  163. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_conditional_message_function.py +0 -0
  164. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_hash_seed_function.py +0 -0
  165. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  166. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_multiply_function.py +0 -0
  167. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_random_bytes_function.py +0 -0
  168. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  169. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/__init__.py +0 -0
  170. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/__init__.py +0 -0
  171. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  172. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  173. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_exception_function.py +0 -0
  174. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  175. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_logging_function.py +0 -0
  176. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  177. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_partitioned_function.py +0 -0
  178. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_projected_data_function.py +0 -0
  179. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_sequence_function.py +0 -0
  180. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_settings_function.py +0 -0
  181. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  182. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  183. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/__init__.py +0 -0
  184. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/__init__.py +0 -0
  185. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  186. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  187. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  188. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  189. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  190. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/table_in_out/test_client.py +0 -0
  191. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_access_log_audit.py +0 -0
  192. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_aggregate_function.py +0 -0
  193. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_argument_spec.py +0 -0
  194. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_auth.py +0 -0
  195. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_bind_exceptions.py +0 -0
  196. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_bind_request_at_clause.py +0 -0
  197. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_bound_storage_conformance.py +0 -0
  198. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_cache_control.py +0 -0
  199. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_catalog_auth_binding.py +0 -0
  200. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_copy_from_function.py +0 -0
  201. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_copy_to_function.py +0 -0
  202. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_docstrings.py +0 -0
  203. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_documentation_examples.py +0 -0
  204. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_example_function_arg_types.py +0 -0
  205. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_examples_workers.py +0 -0
  206. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_exception_handling.py +0 -0
  207. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_exceptions.py +0 -0
  208. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_filter_pushdown.py +0 -0
  209. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_filter_pushdown_extension.py +0 -0
  210. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage.py +0 -0
  211. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_azure_sql.py +0 -0
  212. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_cf_do.py +0 -0
  213. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  214. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_function_storage_conformance.py +0 -0
  215. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_constants.py +0 -0
  216. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  217. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_request_builders.py +0 -0
  218. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_schemas.py +0 -0
  219. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_cpp_secret.py +0 -0
  220. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_go_schemas.py +0 -0
  221. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_protocol_version.py +0 -0
  222. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  223. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_ts_client.py +0 -0
  224. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_generated_ts_schemas.py +0 -0
  225. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_http_demo_storage.py +0 -0
  226. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_http_s3_offload_input.py +0 -0
  227. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_http_s3_offload_output.py +0 -0
  228. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_landing_conformance.py +0 -0
  229. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_metadata.py +0 -0
  230. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_mypy_consolidated.py +0 -0
  231. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_nest_tensor.py +0 -0
  232. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_otel.py +0 -0
  233. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_projection_enforcement.py +0 -0
  234. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_projection_repro.py +0 -0
  235. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_protocol_classes.py +0 -0
  236. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_resolved_secrets.py +0 -0
  237. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_schema_utils.py +0 -0
  238. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_serve.py +0 -0
  239. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_setting_secret_annotations.py +0 -0
  240. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_table_buffering_function.py +0 -0
  241. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  242. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_tcp_transport.py +0 -0
  243. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_type_bounds.py +0 -0
  244. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_union_argument.py +0 -0
  245. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_worker.py +0 -0
  246. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_worker_cli.py +0 -0
  247. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/test_worker_page.py +0 -0
  248. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/transactor/__init__.py +0 -0
  249. {vgi_python-0.15.0 → vgi_python-0.16.0}/tests/transactor/test_transactor.py +0 -0
  250. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/__init__.py +0 -0
  251. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_duckdb.py +0 -0
  252. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_storage_profile.py +0 -0
  253. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/__init__.py +0 -0
  254. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  255. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  256. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  257. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  258. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  259. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  260. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  261. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  262. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  263. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  264. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  265. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  266. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  267. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/attach_options.py +0 -0
  268. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  269. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  270. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/cancellable.py +0 -0
  271. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/catalog.py +0 -0
  272. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/companion.py +0 -0
  273. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/copy_from.py +0 -0
  274. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/copy_to.py +0 -0
  275. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/http_server.py +0 -0
  276. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  277. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  278. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  279. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  280. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  281. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  282. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  283. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  284. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  285. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  286. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  287. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  288. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  289. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  290. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  291. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  292. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  293. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  294. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  295. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  296. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/_common.py +0 -0
  297. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  298. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  299. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/cache.py +0 -0
  300. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  301. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/filters.py +0 -0
  302. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  303. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  304. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/misc.py +0 -0
  305. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  306. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  307. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  308. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  309. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  310. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  311. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  312. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/settings.py +0 -0
  313. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  314. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  315. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  316. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  317. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/versioned.py +0 -0
  318. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  319. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  320. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  321. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/table.py +0 -0
  322. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  323. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/aggregate_function.py +0 -0
  324. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/argument_spec.py +0 -0
  325. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/arguments.py +0 -0
  326. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/auth.py +0 -0
  327. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/cache_control.py +0 -0
  328. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/__init__.py +0 -0
  329. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/_descriptor_spec.py +0 -0
  330. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/attach_option.py +0 -0
  331. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/descriptors.py +0 -0
  332. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/duckdb_statistics.py +0 -0
  333. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/secret_type.py +0 -0
  334. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/setting.py +0 -0
  335. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/catalog/storage.py +0 -0
  336. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/__init__.py +0 -0
  337. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/catalog_mixin.py +0 -0
  338. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli.py +0 -0
  339. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_catalog.py +0 -0
  340. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_schema.py +0 -0
  341. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_table.py +0 -0
  342. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_transaction.py +0 -0
  343. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_utils.py +0 -0
  344. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/cli_view.py +0 -0
  345. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/client/client.py +0 -0
  346. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/__init__.py +0 -0
  347. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/_common.py +0 -0
  348. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_constants.py +0 -0
  349. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  350. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_request_builders.py +0 -0
  351. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_schemas.py +0 -0
  352. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  353. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  354. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  355. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/go_schemas.py +0 -0
  356. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/protocol_version.py +0 -0
  357. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/ts_client.py +0 -0
  358. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/codegen/ts_schemas.py +0 -0
  359. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/copy_from_function.py +0 -0
  360. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/copy_to_function.py +0 -0
  361. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/exceptions.py +0 -0
  362. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function.py +0 -0
  363. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function_storage.py +0 -0
  364. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function_storage_azure_sql.py +0 -0
  365. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/function_storage_cf_do.py +0 -0
  366. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/__init__.py +0 -0
  367. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/demo_storage.py +0 -0
  368. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/describe_json.py +0 -0
  369. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/landing.html +0 -0
  370. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/landing_page.py +0 -0
  371. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/http/worker_page.py +0 -0
  372. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/invocation.py +0 -0
  373. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/logging_config.py +0 -0
  374. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/meta_worker.py +0 -0
  375. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/otel.py +0 -0
  376. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/protocol_version.txt +0 -0
  377. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/py.typed +0 -0
  378. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/scalar_function.py +0 -0
  379. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/schema_utils.py +0 -0
  380. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/secret_protocol.py +0 -0
  381. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/secret_service.py +0 -0
  382. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/serve.py +0 -0
  383. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_buffering_function.py +0 -0
  384. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/table_filter_pushdown.py +0 -0
  385. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/__init__.py +0 -0
  386. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/_duckdb_compat.py +0 -0
  387. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/client.py +0 -0
  388. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/protocol.py +0 -0
  389. {vgi_python-0.15.0 → vgi_python-0.16.0}/vgi/transactor/server.py +0 -0
  390. {vgi_python-0.15.0 → vgi_python-0.16.0}/wrangler.jsonc +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vgi-python
3
- Version: 0.15.0
3
+ Version: 0.16.0
4
4
  Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
5
5
  Project-URL: Homepage, https://query.farm
6
6
  Project-URL: Repository, https://github.com/Query-farm/vgi-python
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.15.0"
3
+ version = "0.16.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "attach_options": [],
5
5
  "counts": {
6
- "functions": 183,
6
+ "functions": 188,
7
7
  "schemas": 2,
8
8
  "tables": 59,
9
9
  "views": 3
@@ -1247,6 +1247,18 @@
1247
1247
  "returns": "string",
1248
1248
  "type": "scalar"
1249
1249
  },
1250
+ {
1251
+ "args": [
1252
+ {
1253
+ "desc": "Input column (ignored)",
1254
+ "name": "x",
1255
+ "type": "double"
1256
+ }
1257
+ ],
1258
+ "doc": "Blended 1->0 map emitting a single 0-row batch (literal scan-mode)",
1259
+ "name": "blended_drop",
1260
+ "type": "table"
1261
+ },
1250
1262
  {
1251
1263
  "args": [
1252
1264
  {
@@ -1820,6 +1832,59 @@
1820
1832
  "name": "generator_exception",
1821
1833
  "type": "table"
1822
1834
  },
1835
+ {
1836
+ "args": [
1837
+ {
1838
+ "desc": "Latitude input column",
1839
+ "name": "latitude",
1840
+ "type": "double"
1841
+ },
1842
+ {
1843
+ "desc": "Longitude input column",
1844
+ "name": "longitude",
1845
+ "type": "double"
1846
+ },
1847
+ {
1848
+ "default": "4",
1849
+ "desc": "Rounding precision",
1850
+ "name": "precision",
1851
+ "named": true,
1852
+ "type": "int64"
1853
+ }
1854
+ ],
1855
+ "doc": "Blended per-row geo encoder (lat, lon -> geohash)",
1856
+ "name": "geo_encode",
1857
+ "type": "table"
1858
+ },
1859
+ {
1860
+ "args": [
1861
+ {
1862
+ "desc": "Latitude input column",
1863
+ "name": "latitude",
1864
+ "type": "double"
1865
+ },
1866
+ {
1867
+ "desc": "Longitude input column",
1868
+ "name": "longitude",
1869
+ "type": "double"
1870
+ },
1871
+ {
1872
+ "desc": "Altitude input column",
1873
+ "name": "altitude",
1874
+ "type": "double"
1875
+ },
1876
+ {
1877
+ "default": "4",
1878
+ "desc": "Rounding precision",
1879
+ "name": "precision",
1880
+ "named": true,
1881
+ "type": "int64"
1882
+ }
1883
+ ],
1884
+ "doc": "Blended per-row geo encoder (lat, lon, alt -> geohash)",
1885
+ "name": "geo_encode",
1886
+ "type": "table"
1887
+ },
1823
1888
  {
1824
1889
  "args": [
1825
1890
  {
@@ -2349,6 +2414,25 @@
2349
2414
  "name": "rff_struct_scan",
2350
2415
  "type": "table"
2351
2416
  },
2417
+ {
2418
+ "args": [
2419
+ {
2420
+ "desc": "Numeric input columns",
2421
+ "name": "values",
2422
+ "type": "double"
2423
+ },
2424
+ {
2425
+ "default": "false",
2426
+ "desc": "Sum absolute values",
2427
+ "name": "absolute",
2428
+ "named": true,
2429
+ "type": "bool"
2430
+ }
2431
+ ],
2432
+ "doc": "Blended per-row varargs sum",
2433
+ "name": "row_sum",
2434
+ "type": "table"
2435
+ },
2352
2436
  {
2353
2437
  "args": [
2354
2438
  {
@@ -2943,6 +3027,12 @@
2943
3027
  "name": "slow_cancellable_buffering",
2944
3028
  "type": "table_in_out"
2945
3029
  },
3030
+ {
3031
+ "args": [],
3032
+ "doc": "Per-substream partial sum emitted at finalize (parallel streaming finalize)",
3033
+ "name": "substream_partial_sum",
3034
+ "type": "table_in_out"
3035
+ },
2946
3036
  {
2947
3037
  "args": [
2948
3038
  {
@@ -2959,7 +3049,7 @@
2959
3049
  },
2960
3050
  {
2961
3051
  "args": [],
2962
- "doc": "Distributed sum using simple callback API",
3052
+ "doc": "Distributed sum using the buffered (Sink+Combine+Source) model",
2963
3053
  "name": "sum_all_columns_simple_distributed",
2964
3054
  "type": "table_in_out"
2965
3055
  }
@@ -0,0 +1,70 @@
1
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
2
+
3
+ """Tests for SubstreamPartialSumFunction (parallel streaming finalize, A4).
4
+
5
+ At the single-worker client level there is exactly one substream, so ``finish()``
6
+ sees all input and emits one partial row equal to the whole sum. The per-substream
7
+ fan-out (many partials re-aggregated by an outer ``SELECT sum()``) is exercised by
8
+ the C++ integration test ``table_in_out/parallel_finalize.test`` over both
9
+ transports; here we assert the worker-side transform/finish contract in isolation.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import pyarrow as pa
15
+
16
+ from tests.conftest import filter_non_empty, make_schema
17
+ from vgi.client import Client
18
+
19
+
20
+ class TestSubstreamPartialSumFunction:
21
+ """Worker-side contract for substream_partial_sum."""
22
+
23
+ def test_partial_sum_single_batch(self, fixture_worker: str) -> None:
24
+ """One substream (single client worker) → one partial = the whole sum."""
25
+ schema = make_schema([pa.field("n", pa.int64())])
26
+ batch = pa.RecordBatch.from_pydict({"n": [1, 2, 3, 4, 5]}, schema=schema)
27
+ with Client(fixture_worker) as client:
28
+ output = list(
29
+ client.table_in_out_function(
30
+ function_name="substream_partial_sum",
31
+ input=iter([batch]),
32
+ )
33
+ )
34
+ non_empty = filter_non_empty(output)
35
+ assert len(non_empty) == 1
36
+ assert non_empty[0].to_pydict() == {"n": [15]}
37
+
38
+ def test_partial_sum_many_batches(self, fixture_worker: str) -> None:
39
+ """Accumulates across many input batches, emits one partial at finalize."""
40
+ schema = make_schema([pa.field("n", pa.int64())])
41
+ batches = [
42
+ pa.RecordBatch.from_pydict({"n": list(range(i * 100, (i + 1) * 100))}, schema=schema) for i in range(20)
43
+ ]
44
+ expected = sum(range(0, 2000))
45
+ with Client(fixture_worker) as client:
46
+ output = list(
47
+ client.table_in_out_function(
48
+ function_name="substream_partial_sum",
49
+ input=iter(batches),
50
+ )
51
+ )
52
+ non_empty = filter_non_empty(output)
53
+ assert len(non_empty) == 1
54
+ assert non_empty[0].to_pydict() == {"n": [expected]}
55
+
56
+ def test_partial_sum_empty_input(self, fixture_worker: str) -> None:
57
+ """No input rows → the single substream's partial is 0."""
58
+ schema = make_schema([pa.field("n", pa.int64())])
59
+ empty = pa.RecordBatch.from_pydict({"n": []}, schema=schema)
60
+ with Client(fixture_worker) as client:
61
+ output = list(
62
+ client.table_in_out_function(
63
+ function_name="substream_partial_sum",
64
+ input=iter([empty]),
65
+ )
66
+ )
67
+ non_empty = filter_non_empty(output)
68
+ # A single substream with zero rows still finalizes → one 0 partial.
69
+ assert len(non_empty) == 1
70
+ assert non_empty[0].to_pydict() == {"n": [0]}
@@ -197,13 +197,13 @@ class TestSumAllColumnsFunctionDistributed:
197
197
 
198
198
 
199
199
  class TestSumAllColumnsSimpleDistributed:
200
- """Tests for sum_all_columns_simple_distributed (TableInOutFunction)."""
200
+ """Tests for sum_all_columns_simple_distributed (buffered global reduction)."""
201
201
 
202
202
  def test_sum_simple_distributed_basic(self, fixture_worker: str, numeric_batches: list[pa.RecordBatch]) -> None:
203
203
  """Should sum all numeric columns across all batches."""
204
204
  with Client(fixture_worker) as client:
205
205
  output_batches = list(
206
- client.table_in_out_function(
206
+ client.table_buffering_function(
207
207
  function_name="sum_all_columns_simple_distributed",
208
208
  input=iter(numeric_batches),
209
209
  )
@@ -238,7 +238,7 @@ class TestSumAllColumnsSimpleDistributed:
238
238
 
239
239
  with Client(fixture_worker) as client:
240
240
  output_batches = list(
241
- client.table_in_out_function(
241
+ client.table_buffering_function(
242
242
  function_name="sum_all_columns_simple_distributed",
243
243
  input=iter(batches),
244
244
  )
@@ -256,7 +256,7 @@ class TestSumAllColumnsSimpleDistributed:
256
256
  """Should exclude non-numeric columns from output."""
257
257
  with Client(fixture_worker) as client:
258
258
  output_batches = list(
259
- client.table_in_out_function(
259
+ client.table_buffering_function(
260
260
  function_name="sum_all_columns_simple_distributed",
261
261
  input=iter(simple_batches),
262
262
  )
@@ -276,7 +276,7 @@ class TestSumAllColumnsSimpleDistributed:
276
276
 
277
277
  with Client(fixture_worker) as client:
278
278
  output_batches = list(
279
- client.table_in_out_function(
279
+ client.table_buffering_function(
280
280
  function_name="sum_all_columns_simple_distributed",
281
281
  input=iter([empty_batch]),
282
282
  )
@@ -0,0 +1,150 @@
1
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
2
+
3
+ """Metadata resolution + foot-gun guards for blended RowTransformFunction (Phase B)."""
4
+
5
+ from __future__ import annotations
6
+
7
+ from dataclasses import dataclass
8
+ from typing import Annotated
9
+
10
+ import pyarrow as pa
11
+ import pytest
12
+
13
+ from vgi.arguments import Arg, TableInput
14
+ from vgi.invocation import BindResponse
15
+ from vgi.metadata import (
16
+ CatalogFunctionType,
17
+ ResolvedMetadata,
18
+ arrow_to_metadata,
19
+ metadata_to_arrow,
20
+ resolve_metadata,
21
+ )
22
+ from vgi.schema_utils import schema
23
+ from vgi.table_function import BindParams
24
+ from vgi.table_in_out_function import RowTransformFunction
25
+
26
+
27
+ @dataclass(slots=True, frozen=True, kw_only=True)
28
+ class _XYArgs:
29
+ """Two positional input columns + one named option."""
30
+
31
+ x: Annotated[float, Arg(0)]
32
+ y: Annotated[float, Arg(1)]
33
+ opt: Annotated[int, Arg("opt", default=1)] = 1
34
+
35
+
36
+ class _GoodBlended(RowTransformFunction[_XYArgs]):
37
+ """A valid blended function."""
38
+
39
+ class Meta:
40
+ """Metadata."""
41
+
42
+ name = "good_blended"
43
+
44
+ @classmethod
45
+ def on_bind(cls, params: BindParams[_XYArgs]) -> BindResponse:
46
+ """Fixed output schema."""
47
+ return BindResponse(output_schema=schema({"z": pa.float64()}))
48
+
49
+
50
+ class TestBlendedResolution:
51
+ """Happy-path resolution of a blended function."""
52
+
53
+ def test_resolves_as_blended_table(self) -> None:
54
+ """input_from_args=True, function_type=TABLE, no finalize."""
55
+ m = resolve_metadata(_GoodBlended)
56
+ assert m.function_type is CatalogFunctionType.TABLE
57
+ assert m.input_from_args is True
58
+ assert m.has_finalize is False
59
+ positions = {p.position for p in m.parameters}
60
+ assert 0 in positions and 1 in positions and "opt" in positions
61
+
62
+ def test_arrow_roundtrip_preserves_input_from_args(self) -> None:
63
+ """input_from_args survives the Arrow + dict round-trips."""
64
+ m = resolve_metadata(_GoodBlended)
65
+ assert arrow_to_metadata(metadata_to_arrow(m)).input_from_args is True
66
+ assert ResolvedMetadata.from_dict(m.to_dict()).input_from_args is True
67
+
68
+
69
+ class TestBlendedFootguns:
70
+ """resolve_metadata rejects the invalid blended shapes."""
71
+
72
+ def test_reject_finalize_override(self) -> None:
73
+ """A blended fn that overrides finish()/finalize() is rejected."""
74
+
75
+ class _WithFinalize(RowTransformFunction[_XYArgs]):
76
+ """Illegal: blended with a finalize."""
77
+
78
+ class Meta:
79
+ """Metadata."""
80
+
81
+ name = "blended_finalize"
82
+
83
+ @classmethod
84
+ def finish(cls, params, states): # noqa: ANN001, ANN206, D102
85
+ return []
86
+
87
+ with pytest.raises(TypeError, match="cannot override finalize"):
88
+ resolve_metadata(_WithFinalize)
89
+
90
+ def test_reject_table_input(self) -> None:
91
+ """A blended fn that declares a TableInput arg is rejected."""
92
+
93
+ @dataclass(slots=True, frozen=True, kw_only=True)
94
+ class _TblArgs:
95
+ """Illegal: a TableInput on a blended fn."""
96
+
97
+ x: Annotated[float, Arg(0)]
98
+ data: Annotated[TableInput, Arg(1)]
99
+
100
+ class _WithTable(RowTransformFunction[_TblArgs]):
101
+ """Illegal: blended with TableInput."""
102
+
103
+ class Meta:
104
+ """Metadata."""
105
+
106
+ name = "blended_table"
107
+
108
+ with pytest.raises(TypeError, match="must not declare a TableInput"):
109
+ resolve_metadata(_WithTable)
110
+
111
+ def test_reject_positional_const(self) -> None:
112
+ """A blended fn with a positional const arg is rejected."""
113
+
114
+ @dataclass(slots=True, frozen=True, kw_only=True)
115
+ class _ConstArgs:
116
+ """Illegal: a positional const on a blended fn."""
117
+
118
+ k: Annotated[int, Arg(0, const=True)]
119
+ x: Annotated[float, Arg(1)]
120
+
121
+ class _WithConst(RowTransformFunction[_ConstArgs]):
122
+ """Illegal: blended with a positional const."""
123
+
124
+ class Meta:
125
+ """Metadata."""
126
+
127
+ name = "blended_const"
128
+
129
+ with pytest.raises(TypeError, match="cannot take a positional const"):
130
+ resolve_metadata(_WithConst)
131
+
132
+ def test_reject_zero_positional(self) -> None:
133
+ """A blended fn with no positional args is rejected."""
134
+
135
+ @dataclass(slots=True, frozen=True, kw_only=True)
136
+ class _NamedOnlyArgs:
137
+ """Illegal: no positional input columns."""
138
+
139
+ opt: Annotated[int, Arg("opt", default=1)] = 1
140
+
141
+ class _NamedOnly(RowTransformFunction[_NamedOnlyArgs]):
142
+ """Illegal: blended with no positional args."""
143
+
144
+ class Meta:
145
+ """Metadata."""
146
+
147
+ name = "blended_named_only"
148
+
149
+ with pytest.raises(TypeError, match="at least one positional Arg"):
150
+ resolve_metadata(_NamedOnly)
@@ -2228,7 +2228,7 @@ requires-dist = [
2228
2228
 
2229
2229
  [[package]]
2230
2230
  name = "vgi-python"
2231
- version = "0.14.0"
2231
+ version = "0.16.0"
2232
2232
  source = { editable = "." }
2233
2233
  dependencies = [
2234
2234
  { name = "click" },