vgi-python 0.16.1__tar.gz → 0.18.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 (395) hide show
  1. {vgi_python-0.16.1 → vgi_python-0.18.0}/PKG-INFO +2 -2
  2. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/catalog-interface.md +53 -1
  3. {vgi_python-0.16.1 → vgi_python-0.18.0}/pyproject.toml +2 -2
  4. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_broken_pipe.py +2 -0
  5. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_worker_debug.py +4 -0
  6. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_function_inventory.py +2 -0
  7. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_http_client.py +2 -0
  8. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_http_external_location.py +2 -0
  9. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_http_upload_url.py +2 -0
  10. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_protocol_version.py +4 -3
  11. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_resumable_scan.py +8 -6
  12. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_scalar.py +3 -0
  13. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/landing/describe.expected.json +99 -22
  14. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_bernoulli_function.py +2 -0
  15. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_binary_packet_function.py +2 -0
  16. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_client.py +35 -0
  17. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_conditional_message_function.py +2 -0
  18. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_hash_seed_function.py +7 -0
  19. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_multiply_by_setting_function.py +2 -0
  20. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_multiply_function.py +3 -0
  21. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_random_bytes_function.py +6 -0
  22. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/test_return_secret_value_function.py +1 -0
  23. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_constant_columns_function.py +2 -0
  24. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_double_sequence_function.py +2 -0
  25. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_exception_function.py +3 -0
  26. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_filter_echo_function.py +3 -0
  27. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_logging_function.py +3 -0
  28. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_nested_sequence_function.py +2 -0
  29. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_partitioned_function.py +6 -0
  30. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_projected_data_function.py +2 -0
  31. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_sequence_function.py +1 -0
  32. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_settings_function.py +4 -0
  33. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_struct_settings_function.py +2 -0
  34. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/test_ten_thousand_function.py +1 -0
  35. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_buffer_input_function.py +2 -0
  36. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_echo_function.py +2 -0
  37. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_exception_functions.py +5 -0
  38. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +3 -0
  39. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +4 -0
  40. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +3 -0
  41. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +13 -0
  42. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/test_client.py +11 -0
  43. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_bind_exceptions.py +5 -0
  44. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_examples_workers.py +9 -5
  45. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_exception_handling.py +11 -0
  46. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_projection_enforcement.py +4 -0
  47. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_projection_repro.py +7 -0
  48. vgi_python-0.18.0/tests/test_schema_scoped_functions.py +193 -0
  49. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_setting_secret_annotations.py +4 -0
  50. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_tcp_transport.py +1 -0
  51. {vgi_python-0.16.1 → vgi_python-0.18.0}/uv.lock +5 -5
  52. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/__init__.py +16 -0
  53. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/arithmetic.py +7 -4
  54. vgi_python-0.18.0/vgi/_test_fixtures/scalar/bench_ladder.py +134 -0
  55. vgi_python-0.18.0/vgi/_test_fixtures/scalar/same_name.py +82 -0
  56. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/__init__.py +0 -2
  57. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/cache.py +0 -107
  58. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table_in_out.py +60 -2
  59. vgi_python-0.18.0/vgi/_test_fixtures/twin_catalogs.py +146 -0
  60. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/worker.py +30 -6
  61. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/cache_control.py +15 -0
  62. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli.py +12 -0
  63. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/client.py +29 -0
  64. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/meta_worker.py +53 -22
  65. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/protocol.py +10 -1
  66. vgi_python-0.18.0/vgi/protocol_version.txt +1 -0
  67. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/worker.py +124 -34
  68. vgi_python-0.16.1/vgi/protocol_version.txt +0 -1
  69. {vgi_python-0.16.1 → vgi_python-0.18.0}/.gitattributes +0 -0
  70. {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/dependabot.yml +0 -0
  71. {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  72. {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/ci.yml +0 -0
  73. {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/docs.yml +0 -0
  74. {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/integration.yml +0 -0
  75. {vgi_python-0.16.1 → vgi_python-0.18.0}/.github/workflows/release.yml +0 -0
  76. {vgi_python-0.16.1 → vgi_python-0.18.0}/.gitignore +0 -0
  77. {vgi_python-0.16.1 → vgi_python-0.18.0}/.python-version +0 -0
  78. {vgi_python-0.16.1 → vgi_python-0.18.0}/.vale.ini +0 -0
  79. {vgi_python-0.16.1 → vgi_python-0.18.0}/CLAUDE.md +0 -0
  80. {vgi_python-0.16.1 → vgi_python-0.18.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  81. {vgi_python-0.16.1 → vgi_python-0.18.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  82. {vgi_python-0.16.1 → vgi_python-0.18.0}/DOCS_USABILITY_TEST.md +0 -0
  83. {vgi_python-0.16.1 → vgi_python-0.18.0}/LICENSE +0 -0
  84. {vgi_python-0.16.1 → vgi_python-0.18.0}/README.md +0 -0
  85. {vgi_python-0.16.1 → vgi_python-0.18.0}/SECURITY.md +0 -0
  86. {vgi_python-0.16.1 → vgi_python-0.18.0}/ci/README.md +0 -0
  87. {vgi_python-0.16.1 → vgi_python-0.18.0}/ci/preprocess-require.awk +0 -0
  88. {vgi_python-0.16.1 → vgi_python-0.18.0}/ci/run-integration.sh +0 -0
  89. {vgi_python-0.16.1 → vgi_python-0.18.0}/dist-vgi/.gitignore +0 -0
  90. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/aggregate-functions.md +0 -0
  91. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/arguments.md +0 -0
  92. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/auth.md +0 -0
  93. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/catalogs.md +0 -0
  94. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/client.md +0 -0
  95. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/exceptions.md +0 -0
  96. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/filters.md +0 -0
  97. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/functions.md +0 -0
  98. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/http.md +0 -0
  99. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/index.md +0 -0
  100. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/metadata.md +0 -0
  101. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/observability.md +0 -0
  102. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/storage.md +0 -0
  103. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/transactor.md +0 -0
  104. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/api/worker.md +0 -0
  105. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/argument-serialization.md +0 -0
  106. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/apple-touch-icon.png +0 -0
  107. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/favicon-16x16.png +0 -0
  108. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/favicon-32x32.png +0 -0
  109. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/favicon.ico +0 -0
  110. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/aggregate.svg +0 -0
  111. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/buffering.svg +0 -0
  112. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/scalar.svg +0 -0
  113. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/table-in-out.svg +0 -0
  114. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/kinds/table.svg +0 -0
  115. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/logo.png +0 -0
  116. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/assets/social-card.png +0 -0
  117. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/authentication.md +0 -0
  118. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/cli.md +0 -0
  119. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/column-statistics.md +0 -0
  120. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/concepts/index.md +0 -0
  121. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/contributing-docs.md +0 -0
  122. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/filter-pushdown.md +0 -0
  123. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/generator-api.md +0 -0
  124. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/catalogs.md +0 -0
  125. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/function-patterns.md +0 -0
  126. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/http-auth.md +0 -0
  127. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/index.md +0 -0
  128. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  129. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/how-to/state-storage.md +0 -0
  130. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/index.md +0 -0
  131. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/lifecycle.md +0 -0
  132. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/metadata.md +0 -0
  133. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/overrides/main.html +0 -0
  134. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/robots.txt +0 -0
  135. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/shared-storage.md +0 -0
  136. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/stylesheets/extra.css +0 -0
  137. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/tutorial/index.md +0 -0
  138. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/tutorial/scalar.md +0 -0
  139. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/tutorial/table.md +0 -0
  140. {vgi_python-0.16.1 → vgi_python-0.18.0}/docs/vgi-logo.png +0 -0
  141. {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/calc_scalar_worker.py +0 -0
  142. {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/calc_worker.py +0 -0
  143. {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/filter_worker.py +0 -0
  144. {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/greeting_scalar_worker.py +0 -0
  145. {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/row_count_worker.py +0 -0
  146. {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/series_streaming_worker.py +0 -0
  147. {vgi_python-0.16.1 → vgi_python-0.18.0}/examples/sum_worker.py +0 -0
  148. {vgi_python-0.16.1 → vgi_python-0.18.0}/mkdocs.yml +0 -0
  149. {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/LICENSE +0 -0
  150. {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/README.md +0 -0
  151. {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  152. {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  153. {vgi_python-0.16.1 → vgi_python-0.18.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  154. {vgi_python-0.16.1 → vgi_python-0.18.0}/scripts/measure_startup.py +0 -0
  155. {vgi_python-0.16.1 → vgi_python-0.18.0}/scripts/run_all_tests.sh +0 -0
  156. {vgi_python-0.16.1 → vgi_python-0.18.0}/test-data/generate.sh +0 -0
  157. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/__init__.py +0 -0
  158. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/_http_fixtures.py +0 -0
  159. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/__init__.py +0 -0
  160. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_catalog_interface.py +0 -0
  161. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_client_catalog.py +0 -0
  162. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_column_statistics.py +0 -0
  163. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_declarative.py +0 -0
  164. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  165. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_integration.py +0 -0
  166. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_required_filters.py +0 -0
  167. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_scan_branches.py +0 -0
  168. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_serialization.py +0 -0
  169. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_setting.py +0 -0
  170. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_storage.py +0 -0
  171. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_time_travel.py +0 -0
  172. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/catalog/test_writable_table.py +0 -0
  173. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/__init__.py +0 -0
  174. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_cli.py +0 -0
  175. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/client/test_cli_catalog_functions.py +0 -0
  176. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/__init__.py +0 -0
  177. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/_stub.py +0 -0
  178. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/conftest.py +0 -0
  179. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_accumulate.py +0 -0
  180. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_aggregate.py +0 -0
  181. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_attach.py +0 -0
  182. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_bearer_auth.py +0 -0
  183. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  184. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_container.py +0 -0
  185. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_copy_from.py +0 -0
  186. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_copy_to.py +0 -0
  187. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_directory_parity.py +0 -0
  188. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_github.py +0 -0
  189. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_macro.py +0 -0
  190. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_overload.py +0 -0
  191. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_protocol_inventory.py +0 -0
  192. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  193. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_secret.py +0 -0
  194. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_settings.py +0 -0
  195. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_table.py +0 -0
  196. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_table_in_out.py +0 -0
  197. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_view.py +0 -0
  198. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conformance/test_writable.py +0 -0
  199. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/conftest.py +0 -0
  200. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/landing/_checker.py +0 -0
  201. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/landing/describe.schema.json +0 -0
  202. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/scalar/__init__.py +0 -0
  203. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/__init__.py +0 -0
  204. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table/generator/__init__.py +0 -0
  205. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/__init__.py +0 -0
  206. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/generator/__init__.py +0 -0
  207. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/table_in_out/test_blended_metadata.py +0 -0
  208. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_access_log_audit.py +0 -0
  209. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_aggregate_function.py +0 -0
  210. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_argument_spec.py +0 -0
  211. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_auth.py +0 -0
  212. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_bind_request_at_clause.py +0 -0
  213. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_bound_storage_conformance.py +0 -0
  214. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_cache_control.py +0 -0
  215. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_catalog_auth_binding.py +0 -0
  216. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_copy_from_function.py +0 -0
  217. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_copy_to_function.py +0 -0
  218. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_docstrings.py +0 -0
  219. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_documentation_examples.py +0 -0
  220. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_example_function_arg_types.py +0 -0
  221. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_exceptions.py +0 -0
  222. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_filter_pushdown.py +0 -0
  223. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_filter_pushdown_extension.py +0 -0
  224. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage.py +0 -0
  225. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_azure_sql.py +0 -0
  226. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_cf_do.py +0 -0
  227. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  228. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_function_storage_conformance.py +0 -0
  229. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_constants.py +0 -0
  230. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  231. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_request_builders.py +0 -0
  232. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_schemas.py +0 -0
  233. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_cpp_secret.py +0 -0
  234. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_go_schemas.py +0 -0
  235. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_protocol_version.py +0 -0
  236. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  237. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_ts_client.py +0 -0
  238. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_generated_ts_schemas.py +0 -0
  239. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_http_demo_storage.py +0 -0
  240. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_http_s3_offload_input.py +0 -0
  241. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_http_s3_offload_output.py +0 -0
  242. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_landing_conformance.py +0 -0
  243. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_metadata.py +0 -0
  244. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_mypy_consolidated.py +0 -0
  245. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_nest_tensor.py +0 -0
  246. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_otel.py +0 -0
  247. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_protocol_classes.py +0 -0
  248. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_resolved_secrets.py +0 -0
  249. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_schema_utils.py +0 -0
  250. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_serve.py +0 -0
  251. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_table_buffering_function.py +0 -0
  252. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  253. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_type_bounds.py +0 -0
  254. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_union_argument.py +0 -0
  255. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_worker.py +0 -0
  256. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_worker_cli.py +0 -0
  257. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/test_worker_page.py +0 -0
  258. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/transactor/__init__.py +0 -0
  259. {vgi_python-0.16.1 → vgi_python-0.18.0}/tests/transactor/test_transactor.py +0 -0
  260. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/__init__.py +0 -0
  261. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_duckdb.py +0 -0
  262. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_storage_profile.py +0 -0
  263. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/__init__.py +0 -0
  264. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  265. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  266. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  267. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  268. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  269. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  270. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  271. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  272. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  273. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  274. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  275. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  276. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  277. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/attach_options.py +0 -0
  278. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  279. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  280. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/cancellable.py +0 -0
  281. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/catalog.py +0 -0
  282. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/companion.py +0 -0
  283. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/copy_from.py +0 -0
  284. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/copy_to.py +0 -0
  285. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/http_server.py +0 -0
  286. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  287. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  288. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  289. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  290. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  291. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  292. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  293. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  294. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  295. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  296. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  297. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  298. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  299. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  300. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  301. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  302. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  303. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/_common.py +0 -0
  304. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  305. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  306. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  307. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/filters.py +0 -0
  308. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  309. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  310. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/misc.py +0 -0
  311. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  312. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  313. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  314. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  315. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  316. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  317. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  318. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/settings.py +0 -0
  319. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  320. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  321. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  322. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  323. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/versioned.py +0 -0
  324. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  325. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  326. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  327. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/table.py +0 -0
  328. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  329. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/aggregate_function.py +0 -0
  330. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/argument_spec.py +0 -0
  331. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/arguments.py +0 -0
  332. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/auth.py +0 -0
  333. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/__init__.py +0 -0
  334. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/_descriptor_spec.py +0 -0
  335. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/attach_option.py +0 -0
  336. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/catalog_interface.py +0 -0
  337. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/descriptors.py +0 -0
  338. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/duckdb_statistics.py +0 -0
  339. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/secret_type.py +0 -0
  340. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/setting.py +0 -0
  341. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/catalog/storage.py +0 -0
  342. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/__init__.py +0 -0
  343. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/catalog_mixin.py +0 -0
  344. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_catalog.py +0 -0
  345. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_schema.py +0 -0
  346. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_table.py +0 -0
  347. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_transaction.py +0 -0
  348. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_utils.py +0 -0
  349. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/client/cli_view.py +0 -0
  350. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/__init__.py +0 -0
  351. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/_common.py +0 -0
  352. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_constants.py +0 -0
  353. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  354. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_request_builders.py +0 -0
  355. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_schemas.py +0 -0
  356. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  357. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  358. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  359. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/go_schemas.py +0 -0
  360. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/protocol_version.py +0 -0
  361. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/ts_client.py +0 -0
  362. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/codegen/ts_schemas.py +0 -0
  363. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/copy_from_function.py +0 -0
  364. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/copy_to_function.py +0 -0
  365. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/exceptions.py +0 -0
  366. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function.py +0 -0
  367. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function_storage.py +0 -0
  368. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function_storage_azure_sql.py +0 -0
  369. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/function_storage_cf_do.py +0 -0
  370. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/__init__.py +0 -0
  371. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/demo_storage.py +0 -0
  372. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/describe_json.py +0 -0
  373. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/landing.html +0 -0
  374. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/landing_page.py +0 -0
  375. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/http/worker_page.py +0 -0
  376. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/invocation.py +0 -0
  377. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/logging_config.py +0 -0
  378. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/metadata.py +0 -0
  379. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/otel.py +0 -0
  380. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/py.typed +0 -0
  381. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/scalar_function.py +0 -0
  382. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/schema_utils.py +0 -0
  383. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/secret_protocol.py +0 -0
  384. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/secret_service.py +0 -0
  385. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/serve.py +0 -0
  386. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_buffering_function.py +0 -0
  387. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_filter_pushdown.py +0 -0
  388. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_function.py +0 -0
  389. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/table_in_out_function.py +0 -0
  390. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/__init__.py +0 -0
  391. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/_duckdb_compat.py +0 -0
  392. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/client.py +0 -0
  393. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/protocol.py +0 -0
  394. {vgi_python-0.16.1 → vgi_python-0.18.0}/vgi/transactor/server.py +0 -0
  395. {vgi_python-0.16.1 → vgi_python-0.18.0}/wrangler.jsonc +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vgi-python
3
- Version: 0.16.1
3
+ Version: 0.18.0
4
4
  Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
5
5
  Project-URL: Homepage, https://query.farm
6
6
  Project-URL: Repository, https://github.com/Query-farm/vgi-python
@@ -162,7 +162,7 @@ Requires-Dist: httpx>=0.24
162
162
  Requires-Dist: platformdirs
163
163
  Requires-Dist: pyarrow
164
164
  Requires-Dist: typer>=0.9
165
- Requires-Dist: vgi-rpc>=0.24.0
165
+ Requires-Dist: vgi-rpc>=0.26.0
166
166
  Provides-Extra: azure
167
167
  Requires-Dist: azure-identity>=1.16.0; extra == 'azure'
168
168
  Requires-Dist: pymssql>=2.3.0; extra == 'azure'
@@ -307,6 +307,52 @@ class MyReadOnlyCatalog(ReadOnlyCatalogInterface):
307
307
 
308
308
  ---
309
309
 
310
+ ## Function Name Scoping
311
+
312
+ A function name is **not** a global key. The worker resolves a call by the pair
313
+ `(schema, function name)`, so the same name may be declared in more than one
314
+ schema of a catalog, and a schema-qualified call reaches the implementation in
315
+ that schema:
316
+
317
+ ```python test="lint"
318
+ Catalog(
319
+ name="example",
320
+ default_schema="main",
321
+ schemas=[
322
+ Schema(name="main", functions=[ProdLookup]), # Meta.name = "lookup"
323
+ Schema(name="staging", functions=[StagingLookup]), # Meta.name = "lookup"
324
+ ],
325
+ )
326
+ ```
327
+
328
+ ```sql
329
+ SELECT example.main.lookup(1); -- ProdLookup
330
+ SELECT example.staging.lookup(1); -- StagingLookup
331
+ ```
332
+
333
+ The DuckDB extension carries the owning schema on every bind request
334
+ (`BindRequest.schema_name`), taken from the schema entry the function was
335
+ registered into. Two consequences worth knowing:
336
+
337
+ - **Overloads still work.** Several classes sharing a name *within one schema*
338
+ are overloads, disambiguated by argument signature as before. Only the
339
+ cross-schema case is resolved by schema.
340
+ - **Callers without a schema must be unambiguous.** The pure-Python `Client`
341
+ and the CLI send no schema. If the name is unique across the worker they
342
+ resolve normally; if two schemas declare it, the worker raises an ambiguity
343
+ error naming the schemas involved.
344
+
345
+ Functions declared via the legacy `Worker.functions` list have no schema of
346
+ their own, so they are registered into the catalog's `default_schema` — the
347
+ same schema DuckDB registers them into.
348
+
349
+ Across **catalogs**, the key is the attachment rather than the name: two
350
+ catalogs served by one worker process (see `vgi.meta_worker.MetaWorker`) may
351
+ each declare `main.lookup`, and each attachment's `attach_opaque_data` routes
352
+ its calls to the right catalog.
353
+
354
+ ---
355
+
310
356
  ## Declarative Catalogs
311
357
 
312
358
  For most use cases, the declarative catalog API provides a simpler way to define catalogs using Python dataclasses instead of implementing `CatalogInterface` directly.
@@ -483,13 +529,19 @@ class MyWorker(Worker):
483
529
 
484
530
  To disable the catalog interface entirely:
485
531
 
486
- ```python
532
+ ```python test="lint"
487
533
  class MyWorker(Worker):
488
534
  catalog_interface = None
489
535
  catalog_name = None # Required to fully disable
490
536
  functions = [...]
491
537
  ```
492
538
 
539
+ A catalog-less worker is reachable only from the pure-Python [`Client`][], which
540
+ binds by `(schema, function name)` and needs no attachment — its functions
541
+ register into the default `main` schema. It is **not** reachable from DuckDB:
542
+ `ATTACH ... (TYPE vgi)` requires a catalog, and there is no standalone
543
+ call form. If the worker should be usable from SQL, give it a catalog.
544
+
493
545
  ---
494
546
 
495
547
  ## Client Usage
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.16.1"
3
+ version = "0.18.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -40,7 +40,7 @@ dependencies = [
40
40
  "pyarrow",
41
41
  "typer>=0.9",
42
42
  "platformdirs",
43
- "vgi-rpc>=0.24.0",
43
+ "vgi-rpc>=0.26.0",
44
44
  "httpx>=0.24",
45
45
  ]
46
46
 
@@ -40,6 +40,7 @@ class TestClientWorkerExitHandling:
40
40
  list(
41
41
  client.table_in_out_function(
42
42
  function_name="test",
43
+ schema_name="main",
43
44
  arguments=Arguments(),
44
45
  input=iter([_make_test_batch()]),
45
46
  )
@@ -56,6 +57,7 @@ class TestClientWorkerExitHandling:
56
57
  list(
57
58
  client.table_in_out_function(
58
59
  function_name="test",
60
+ schema_name="main",
59
61
  arguments=Arguments(),
60
62
  input=iter([_make_test_batch()]),
61
63
  )
@@ -68,6 +68,7 @@ class TestStderrInErrorMessages:
68
68
  list(
69
69
  client.table_function(
70
70
  function_name="nonexistent",
71
+ schema_name="main",
71
72
  arguments=Arguments(),
72
73
  )
73
74
  )
@@ -87,6 +88,7 @@ class TestStderrInErrorMessages:
87
88
  list(
88
89
  client.table_function(
89
90
  function_name="nonexistent",
91
+ schema_name="main",
90
92
  arguments=Arguments(),
91
93
  )
92
94
  )
@@ -108,6 +110,7 @@ class TestStderrInErrorMessages:
108
110
  list(
109
111
  client.table_in_out_function(
110
112
  function_name="nonexistent",
113
+ schema_name="main",
111
114
  input=iter([batch]),
112
115
  )
113
116
  )
@@ -126,6 +129,7 @@ class TestStderrInErrorMessages:
126
129
  list(
127
130
  client.scalar_function(
128
131
  function_name="nonexistent",
132
+ schema_name="main",
129
133
  input=iter([batch]),
130
134
  )
131
135
  )
@@ -178,6 +178,7 @@ def test_scalar_function_end_to_end(attached_example: tuple[str, bytes]) -> None
178
178
  out_batches = list(
179
179
  client.scalar_function(
180
180
  function_name="double",
181
+ schema_name="main",
181
182
  arguments=Arguments(positional=(pa.scalar("x"),)),
182
183
  input=iter([input_batch]),
183
184
  )
@@ -199,6 +200,7 @@ def test_table_function_end_to_end(attached_example: tuple[str, bytes]) -> None:
199
200
  out_batches = list(
200
201
  client.table_function(
201
202
  function_name="sequence",
203
+ schema_name="main",
202
204
  arguments=Arguments(positional=(pa.scalar(5),)),
203
205
  )
204
206
  )
@@ -102,6 +102,7 @@ def test_scalar_function_over_http(http_example_base_url: str) -> None:
102
102
  out = list(
103
103
  client.scalar_function(
104
104
  function_name="double",
105
+ schema_name="main",
105
106
  arguments=Arguments(positional=(pa.scalar("x"),)),
106
107
  input=iter([batch]),
107
108
  )
@@ -119,6 +120,7 @@ def test_table_function_over_http(http_example_base_url: str) -> None:
119
120
  out = list(
120
121
  client.table_function(
121
122
  function_name="sequence",
123
+ schema_name="main",
122
124
  arguments=Arguments(positional=(pa.scalar(5),)),
123
125
  )
124
126
  )
@@ -83,6 +83,7 @@ def test_pointer_batch_auto_resolved(demo_storage_base_url: str) -> None:
83
83
  out = list(
84
84
  client.scalar_function(
85
85
  function_name="random_bytes",
86
+ schema_name="main",
86
87
  arguments=Arguments(positional=(pa.scalar(seed), pa.scalar(payload_bytes))),
87
88
  input=iter([input_batch]),
88
89
  )
@@ -116,6 +117,7 @@ def test_http_client_uses_default_external_config(demo_storage_base_url: str) ->
116
117
  list(
117
118
  client.scalar_function(
118
119
  function_name="random_bytes",
120
+ schema_name="main",
119
121
  arguments=Arguments(positional=(pa.scalar(0), pa.scalar(payload_bytes))),
120
122
  input=iter([input_batch]),
121
123
  )
@@ -85,6 +85,7 @@ def test_oversize_input_auto_externalized(small_request_limit_base_url: str) ->
85
85
  out = list(
86
86
  client.scalar_function(
87
87
  function_name="double",
88
+ schema_name="main",
88
89
  arguments=Arguments(positional=(pa.scalar("x"),)),
89
90
  input=iter([input_batch]),
90
91
  )
@@ -115,6 +116,7 @@ def test_small_input_not_externalized(small_request_limit_base_url: str) -> None
115
116
  out = list(
116
117
  client.scalar_function(
117
118
  function_name="double",
119
+ schema_name="main",
118
120
  arguments=Arguments(positional=(pa.scalar("x"),)),
119
121
  input=iter([input_batch]),
120
122
  )
@@ -32,18 +32,19 @@ CLIENT_PROTOCOL_VERSION = VgiProtocol.protocol_version
32
32
 
33
33
  def test_client_protocol_version_is_canonical() -> None:
34
34
  """Sanity-check the constants this test reasons about haven't drifted apart."""
35
- assert CLIENT_PROTOCOL_VERSION == "1.0.0"
35
+ assert CLIENT_PROTOCOL_VERSION == "1.1.0"
36
36
  # The fixture must be a genuine mismatch in the major/minor that the
37
37
  # framework compares; a patch-only difference would (correctly) pass.
38
38
  assert BAD_PROTOCOL_VERSION.split(".")[:2] != CLIENT_PROTOCOL_VERSION.split(".")[:2]
39
39
 
40
40
 
41
41
  def test_mismatched_worker_protocol_version_raises() -> None:
42
- """A worker enforcing 99.0.0 must reject the 1.0.0 client at dispatch."""
42
+ """A worker enforcing 99.0.0 must reject the 1.1.0 client at dispatch."""
43
43
  with Client("vgi-fixture-bad-protocol-worker") as client, pytest.raises(ClientError) as exc_info:
44
44
  list(
45
45
  client.table_function(
46
46
  function_name="sequence",
47
+ schema_name="main",
47
48
  arguments=Arguments(positional=(pa.scalar(5),)),
48
49
  )
49
50
  )
@@ -53,5 +54,5 @@ def test_mismatched_worker_protocol_version_raises() -> None:
53
54
  assert "protocol_version mismatch" in message
54
55
  assert CLIENT_PROTOCOL_VERSION in message
55
56
  assert BAD_PROTOCOL_VERSION in message
56
- # Directional hint: the client (1.0.0) is older than the worker (99.0.0).
57
+ # Directional hint: the client (1.1.0) is older than the worker (99.0.0).
57
58
  assert "upgrade the VGI extension/client" in message
@@ -50,7 +50,7 @@ def _reference_rows(base_url: str) -> list[int]:
50
50
  with Client.from_http(base_url) as client:
51
51
  return [
52
52
  v
53
- for b in client.table_function(function_name="sequence", arguments=_ARGS)
53
+ for b in client.table_function(function_name="sequence", schema_name="main", arguments=_ARGS)
54
54
  for v in b.column("n").to_pylist()
55
55
  ]
56
56
 
@@ -62,7 +62,7 @@ def test_resumable_scan_matches_table_function(http_base_url: str) -> None:
62
62
 
63
63
  rows: list[int] = []
64
64
  with Client.from_http(http_base_url) as client:
65
- cur = client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
65
+ cur = client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
66
66
  while True:
67
67
  batch, _token = cur.next()
68
68
  if batch is None:
@@ -81,7 +81,7 @@ def test_resume_on_fresh_client_after_node_hop(http_base_url: str) -> None:
81
81
  token: bytes | None = None
82
82
  # Read the first few batches, then abandon the connection (as if the LB node died).
83
83
  with Client.from_http(http_base_url) as client:
84
- cur = client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
84
+ cur = client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
85
85
  for _ in range(3):
86
86
  batch, token = cur.next()
87
87
  assert batch is not None
@@ -91,7 +91,9 @@ def test_resume_on_fresh_client_after_node_hop(http_base_url: str) -> None:
91
91
 
92
92
  # A brand-new client resumes from the serialized token alone.
93
93
  with Client.from_http(http_base_url) as client2:
94
- cur2 = client2.table_scan_resumable(function_name="sequence", arguments=_ARGS, resume_token=token)
94
+ cur2 = client2.table_scan_resumable(
95
+ function_name="sequence", schema_name="main", arguments=_ARGS, resume_token=token
96
+ )
95
97
  while True:
96
98
  batch, token = cur2.next()
97
99
  if batch is None:
@@ -116,7 +118,7 @@ def test_continue_on_fresh_client_skips_rebind(http_base_url: str) -> None:
116
118
  rows: list[int] = []
117
119
  token: bytes | None = None
118
120
  with Client.from_http(http_base_url) as client:
119
- cur = client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
121
+ cur = client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
120
122
  for _ in range(3):
121
123
  batch, token = cur.next()
122
124
  assert batch is not None
@@ -153,4 +155,4 @@ def test_resumable_scan_rejected_on_subprocess() -> None:
153
155
  client = Client("/nonexistent/worker") # subprocess transport, never started
154
156
  assert client.supports_resumable_scan is False
155
157
  with pytest.raises(ResumeUnsupported):
156
- client.table_scan_resumable(function_name="sequence", arguments=_ARGS)
158
+ client.table_scan_resumable(function_name="sequence", schema_name="main", arguments=_ARGS)
@@ -23,6 +23,9 @@ skip_area(
23
23
  "hash_seed.test",
24
24
  "null_handling.test",
25
25
  "random_int.test",
26
+ # Covered on the Python side by tests/test_schema_scoped_functions.py.
27
+ "same_name_catalogs.test",
28
+ "same_name_schemas.test",
26
29
  "sum_values.test",
27
30
  "unnest_tensor.test",
28
31
  "upper_case.test",
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "attach_options": [],
5
5
  "counts": {
6
- "functions": 203,
6
+ "functions": 209,
7
7
  "schemas": 2,
8
8
  "tables": 59,
9
9
  "views": 3
@@ -15,7 +15,21 @@
15
15
  "schemas": [
16
16
  {
17
17
  "doc": "Example tables backed by functions",
18
- "functions": [],
18
+ "functions": [
19
+ {
20
+ "args": [
21
+ {
22
+ "desc": "Integer value to tag",
23
+ "name": "value",
24
+ "type": "int64"
25
+ }
26
+ ],
27
+ "doc": "Schema-disambiguation probe; the data-schema implementation",
28
+ "name": "test_same_name_bind",
29
+ "returns": "string",
30
+ "type": "scalar"
31
+ }
32
+ ],
19
33
  "name": "data",
20
34
  "tables": [
21
35
  {
@@ -699,6 +713,19 @@
699
713
  "returns": "string",
700
714
  "type": "scalar"
701
715
  },
716
+ {
717
+ "args": [
718
+ {
719
+ "desc": "Positive integer",
720
+ "name": "value",
721
+ "type": "int64"
722
+ }
723
+ ],
724
+ "doc": "Number of Collatz (3n+1) steps for each integer to reach 1",
725
+ "name": "collatz_steps",
726
+ "returns": "int64",
727
+ "type": "scalar"
728
+ },
702
729
  {
703
730
  "args": [
704
731
  {
@@ -908,6 +935,24 @@
908
935
  "returns": "double",
909
936
  "type": "scalar"
910
937
  },
938
+ {
939
+ "args": [
940
+ {
941
+ "desc": "String to stretch",
942
+ "name": "value",
943
+ "type": "string"
944
+ },
945
+ {
946
+ "desc": "Number of SHA-256 rounds",
947
+ "name": "rounds",
948
+ "type": "int64"
949
+ }
950
+ ],
951
+ "doc": "Apply SHA-256 `rounds` times (key-stretching); rounds is a const compute knob",
952
+ "name": "hash_rounds",
953
+ "returns": "string",
954
+ "type": "scalar"
955
+ },
911
956
  {
912
957
  "args": [
913
958
  {
@@ -1019,6 +1064,19 @@
1019
1064
  "returns": "string",
1020
1065
  "type": "scalar"
1021
1066
  },
1067
+ {
1068
+ "args": [
1069
+ {
1070
+ "desc": "String value",
1071
+ "name": "value",
1072
+ "type": "string"
1073
+ }
1074
+ ],
1075
+ "doc": "Returns the input string unchanged (zero-compute wire probe)",
1076
+ "name": "passthru",
1077
+ "returns": "string",
1078
+ "type": "scalar"
1079
+ },
1022
1080
  {
1023
1081
  "args": [
1024
1082
  {
@@ -1095,6 +1153,19 @@
1095
1153
  "returns": "string",
1096
1154
  "type": "scalar"
1097
1155
  },
1156
+ {
1157
+ "args": [
1158
+ {
1159
+ "desc": "String to hash",
1160
+ "name": "value",
1161
+ "type": "string"
1162
+ }
1163
+ ],
1164
+ "doc": "Lowercase hex SHA-256 digest of the UTF-8 string",
1165
+ "name": "sha256_hex",
1166
+ "returns": "string",
1167
+ "type": "scalar"
1168
+ },
1098
1169
  {
1099
1170
  "args": [
1100
1171
  {
@@ -1144,6 +1215,19 @@
1144
1215
  "returns": "null",
1145
1216
  "type": "scalar"
1146
1217
  },
1218
+ {
1219
+ "args": [
1220
+ {
1221
+ "desc": "Integer value to tag",
1222
+ "name": "value",
1223
+ "type": "int64"
1224
+ }
1225
+ ],
1226
+ "doc": "Schema-disambiguation probe; the main-schema implementation",
1227
+ "name": "test_same_name_bind",
1228
+ "returns": "string",
1229
+ "type": "scalar"
1230
+ },
1147
1231
  {
1148
1232
  "args": [
1149
1233
  {
@@ -1445,25 +1529,6 @@
1445
1529
  "name": "cache_filtered",
1446
1530
  "type": "table"
1447
1531
  },
1448
- {
1449
- "args": [
1450
- {
1451
- "desc": "Total number of rows to generate",
1452
- "name": "rows",
1453
- "type": "int64"
1454
- },
1455
- {
1456
- "default": "20000",
1457
- "desc": "Rows per partition",
1458
- "name": "chunk_size",
1459
- "named": true,
1460
- "type": "int64"
1461
- }
1462
- ],
1463
- "doc": "Parallel batch_index-tagged cacheable sequence; cache serve reassembles order",
1464
- "name": "cache_interleaved",
1465
- "type": "table"
1466
- },
1467
1532
  {
1468
1533
  "args": [
1469
1534
  {
@@ -1675,7 +1740,7 @@
1675
1740
  "type": "int64"
1676
1741
  }
1677
1742
  ],
1678
- "doc": "Cacheable blended map x -> x*2 (advertises vgi.cache.ttl)",
1743
+ "doc": "Cacheable blended map x -> x*2 (advertises vgi.cache.ttl + per_value)",
1679
1744
  "name": "cached_double",
1680
1745
  "type": "table"
1681
1746
  },
@@ -1685,6 +1750,18 @@
1685
1750
  "name": "cached_echo",
1686
1751
  "type": "table"
1687
1752
  },
1753
+ {
1754
+ "args": [
1755
+ {
1756
+ "desc": "Fan-out count: emit rows 0..n-1 for this input row",
1757
+ "name": "n",
1758
+ "type": "int64"
1759
+ }
1760
+ ],
1761
+ "doc": "Cacheable blended 1->N fan-out (per_value) — 1:0 / 1:1 / 1:N by input",
1762
+ "name": "cached_explode",
1763
+ "type": "table"
1764
+ },
1688
1765
  {
1689
1766
  "args": [
1690
1767
  {
@@ -22,6 +22,7 @@ class TestBernoulliFunction:
22
22
  outputs = list(
23
23
  client.scalar_function(
24
24
  function_name="bernoulli",
25
+ schema_name="main",
25
26
  input=iter([batch]),
26
27
  )
27
28
  )
@@ -38,6 +39,7 @@ class TestBernoulliFunction:
38
39
  outputs = list(
39
40
  client.scalar_function(
40
41
  function_name="bernoulli",
42
+ schema_name="main",
41
43
  input=iter([batch]),
42
44
  )
43
45
  )
@@ -30,6 +30,7 @@ class TestBinaryPacketFunction:
30
30
  outputs = list(
31
31
  client.scalar_function(
32
32
  function_name="binary_packet",
33
+ schema_name="main",
33
34
  input=iter([batch]),
34
35
  arguments=Arguments(positional=(header, config)),
35
36
  )
@@ -56,6 +57,7 @@ class TestBinaryPacketFunction:
56
57
  outputs = list(
57
58
  client.scalar_function(
58
59
  function_name="binary_packet",
60
+ schema_name="main",
59
61
  input=iter([batch]),
60
62
  arguments=Arguments(positional=(header, config)),
61
63
  )