vgi-python 0.24.0__tar.gz → 0.26.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 (407) hide show
  1. {vgi_python-0.24.0 → vgi_python-0.26.0}/.github/workflows/ci.yml +18 -15
  2. {vgi_python-0.24.0 → vgi_python-0.26.0}/.github/workflows/docs.yml +2 -2
  3. {vgi_python-0.24.0 → vgi_python-0.26.0}/.github/workflows/integration.yml +4 -4
  4. {vgi_python-0.24.0 → vgi_python-0.26.0}/.github/workflows/release.yml +4 -4
  5. {vgi_python-0.24.0 → vgi_python-0.26.0}/CLAUDE.md +95 -0
  6. {vgi_python-0.24.0 → vgi_python-0.26.0}/PKG-INFO +3 -3
  7. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/auth.md +6 -0
  8. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/how-to/state-storage.md +1 -1
  9. {vgi_python-0.24.0 → vgi_python-0.26.0}/pyproject.toml +15 -4
  10. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_declarative.py +6 -3
  11. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_required_filters.py +15 -16
  12. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_scan_branches.py +4 -4
  13. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_accumulate.py +81 -31
  14. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_const_param_enforcement.py +2 -1
  15. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_resumable_scan.py +16 -6
  16. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_scalar_attach_opaque_data.py +3 -4
  17. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/landing/_checker.py +5 -3
  18. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/test_wide_columns.py +2 -1
  19. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/test_blended_metadata.py +2 -2
  20. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_aggregate_function.py +5 -3
  21. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_argument_spec.py +4 -3
  22. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_auth.py +6 -6
  23. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_bind_request_at_clause.py +5 -4
  24. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_bound_storage_conformance.py +10 -1
  25. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_cache_control.py +6 -1
  26. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_call_state_attach.py +1 -3
  27. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_copy_from_function.py +31 -11
  28. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_copy_to_function.py +30 -13
  29. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_examples_workers.py +11 -5
  30. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_filter_pushdown_extension.py +4 -2
  31. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_function_storage.py +8 -4
  32. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_function_storage_cf_do.py +17 -16
  33. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_function_storage_cf_do_integration.py +8 -7
  34. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_function_storage_conformance.py +2 -2
  35. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_cpp_schemas.py +2 -2
  36. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_cpp_secret.py +4 -3
  37. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_http_demo_storage.py +3 -3
  38. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_http_s3_offload_input.py +2 -2
  39. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_metadata.py +9 -10
  40. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_nest_tensor.py +2 -2
  41. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_projection_repro.py +1 -1
  42. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_protocol_classes.py +25 -16
  43. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_resolved_secrets.py +14 -5
  44. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_schema_scoped_functions.py +2 -1
  45. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_serve.py +200 -0
  46. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_table_buffering_function.py +57 -27
  47. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_union_argument.py +8 -4
  48. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_worker.py +15 -5
  49. vgi_python-0.26.0/tests/test_worker_cli.py +200 -0
  50. {vgi_python-0.24.0 → vgi_python-0.26.0}/uv.lock +696 -712
  51. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/http_server.py +9 -0
  52. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/auth.py +13 -1
  53. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/catalog_mixin.py +2 -2
  54. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/client.py +8 -8
  55. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/function_storage_cf_do.py +7 -7
  56. vgi_python-0.26.0/vgi/logging_config.py +319 -0
  57. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/serve.py +197 -1
  58. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/worker.py +75 -0
  59. vgi_python-0.24.0/tests/test_worker_cli.py +0 -112
  60. vgi_python-0.24.0/vgi/logging_config.py +0 -161
  61. {vgi_python-0.24.0 → vgi_python-0.26.0}/.gitattributes +0 -0
  62. {vgi_python-0.24.0 → vgi_python-0.26.0}/.github/dependabot.yml +0 -0
  63. {vgi_python-0.24.0 → vgi_python-0.26.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  64. {vgi_python-0.24.0 → vgi_python-0.26.0}/.gitignore +0 -0
  65. {vgi_python-0.24.0 → vgi_python-0.26.0}/.python-version +0 -0
  66. {vgi_python-0.24.0 → vgi_python-0.26.0}/.vale.ini +0 -0
  67. {vgi_python-0.24.0 → vgi_python-0.26.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  68. {vgi_python-0.24.0 → vgi_python-0.26.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  69. {vgi_python-0.24.0 → vgi_python-0.26.0}/DOCS_USABILITY_TEST.md +0 -0
  70. {vgi_python-0.24.0 → vgi_python-0.26.0}/LICENSE +0 -0
  71. {vgi_python-0.24.0 → vgi_python-0.26.0}/README.md +0 -0
  72. {vgi_python-0.24.0 → vgi_python-0.26.0}/SECURITY.md +0 -0
  73. {vgi_python-0.24.0 → vgi_python-0.26.0}/ci/README.md +0 -0
  74. {vgi_python-0.24.0 → vgi_python-0.26.0}/ci/preprocess-require.awk +0 -0
  75. {vgi_python-0.24.0 → vgi_python-0.26.0}/ci/run-integration.sh +0 -0
  76. {vgi_python-0.24.0 → vgi_python-0.26.0}/dist-vgi/.gitignore +0 -0
  77. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/aggregate-functions.md +0 -0
  78. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/arguments.md +0 -0
  79. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/catalogs.md +0 -0
  80. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/client.md +0 -0
  81. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/exceptions.md +0 -0
  82. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/filters.md +0 -0
  83. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/functions.md +0 -0
  84. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/http.md +0 -0
  85. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/index.md +0 -0
  86. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/metadata.md +0 -0
  87. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/observability.md +0 -0
  88. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/storage.md +0 -0
  89. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/transactor.md +0 -0
  90. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/api/worker.md +0 -0
  91. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/argument-serialization.md +0 -0
  92. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/apple-touch-icon.png +0 -0
  93. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/favicon-16x16.png +0 -0
  94. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/favicon-32x32.png +0 -0
  95. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/favicon.ico +0 -0
  96. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/kinds/aggregate.svg +0 -0
  97. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/kinds/buffering.svg +0 -0
  98. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/kinds/scalar.svg +0 -0
  99. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/kinds/table-in-out.svg +0 -0
  100. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/kinds/table.svg +0 -0
  101. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/logo.png +0 -0
  102. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/assets/social-card.png +0 -0
  103. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/authentication.md +0 -0
  104. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/catalog-interface.md +0 -0
  105. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/cli.md +0 -0
  106. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/column-statistics.md +0 -0
  107. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/concepts/index.md +0 -0
  108. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/contributing-docs.md +0 -0
  109. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/filter-pushdown.md +0 -0
  110. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/generator-api.md +0 -0
  111. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/global-functions.md +0 -0
  112. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/how-to/catalogs.md +0 -0
  113. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/how-to/function-patterns.md +0 -0
  114. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/how-to/http-auth.md +0 -0
  115. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/how-to/index.md +0 -0
  116. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  117. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/index.md +0 -0
  118. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/lifecycle.md +0 -0
  119. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/metadata.md +0 -0
  120. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/overrides/main.html +0 -0
  121. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/robots.txt +0 -0
  122. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/shared-storage.md +0 -0
  123. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/stylesheets/extra.css +0 -0
  124. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/tutorial/index.md +0 -0
  125. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/tutorial/scalar.md +0 -0
  126. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/tutorial/table.md +0 -0
  127. {vgi_python-0.24.0 → vgi_python-0.26.0}/docs/vgi-logo.png +0 -0
  128. {vgi_python-0.24.0 → vgi_python-0.26.0}/examples/calc_scalar_worker.py +0 -0
  129. {vgi_python-0.24.0 → vgi_python-0.26.0}/examples/calc_worker.py +0 -0
  130. {vgi_python-0.24.0 → vgi_python-0.26.0}/examples/filter_worker.py +0 -0
  131. {vgi_python-0.24.0 → vgi_python-0.26.0}/examples/greeting_scalar_worker.py +0 -0
  132. {vgi_python-0.24.0 → vgi_python-0.26.0}/examples/row_count_worker.py +0 -0
  133. {vgi_python-0.24.0 → vgi_python-0.26.0}/examples/series_streaming_worker.py +0 -0
  134. {vgi_python-0.24.0 → vgi_python-0.26.0}/examples/sum_worker.py +0 -0
  135. {vgi_python-0.24.0 → vgi_python-0.26.0}/mkdocs.yml +0 -0
  136. {vgi_python-0.24.0 → vgi_python-0.26.0}/packages/vgi-fixtures/LICENSE +0 -0
  137. {vgi_python-0.24.0 → vgi_python-0.26.0}/packages/vgi-fixtures/README.md +0 -0
  138. {vgi_python-0.24.0 → vgi_python-0.26.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  139. {vgi_python-0.24.0 → vgi_python-0.26.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  140. {vgi_python-0.24.0 → vgi_python-0.26.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  141. {vgi_python-0.24.0 → vgi_python-0.26.0}/scripts/measure_startup.py +0 -0
  142. {vgi_python-0.24.0 → vgi_python-0.26.0}/scripts/run_all_tests.sh +0 -0
  143. {vgi_python-0.24.0 → vgi_python-0.26.0}/test-data/generate.sh +0 -0
  144. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/__init__.py +0 -0
  145. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/_http_fixtures.py +0 -0
  146. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/__init__.py +0 -0
  147. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_catalog_interface.py +0 -0
  148. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_client_catalog.py +0 -0
  149. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_column_statistics.py +0 -0
  150. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  151. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_integration.py +0 -0
  152. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_serialization.py +0 -0
  153. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_setting.py +0 -0
  154. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_storage.py +0 -0
  155. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_time_travel.py +0 -0
  156. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/catalog/test_writable_table.py +0 -0
  157. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/client/__init__.py +0 -0
  158. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/client/test_broken_pipe.py +0 -0
  159. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/client/test_cli.py +0 -0
  160. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/client/test_cli_catalog_functions.py +0 -0
  161. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/client/test_worker_debug.py +0 -0
  162. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/__init__.py +0 -0
  163. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/_stub.py +0 -0
  164. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/conftest.py +0 -0
  165. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_aggregate.py +0 -0
  166. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_attach.py +0 -0
  167. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_bearer_auth.py +0 -0
  168. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_container.py +0 -0
  169. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_copy_from.py +0 -0
  170. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_copy_to.py +0 -0
  171. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_directory_parity.py +0 -0
  172. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_function_inventory.py +0 -0
  173. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_github.py +0 -0
  174. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_http_client.py +0 -0
  175. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_http_external_location.py +0 -0
  176. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_http_upload_url.py +0 -0
  177. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_macro.py +0 -0
  178. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_overload.py +0 -0
  179. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_protocol_inventory.py +0 -0
  180. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_protocol_version.py +0 -0
  181. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_scalar.py +0 -0
  182. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_secret.py +0 -0
  183. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_settings.py +0 -0
  184. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_table.py +0 -0
  185. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_table_in_out.py +0 -0
  186. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_view.py +0 -0
  187. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conformance/test_writable.py +0 -0
  188. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/conftest.py +0 -0
  189. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/landing/describe.expected.json +0 -0
  190. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/landing/describe.schema.json +0 -0
  191. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/__init__.py +0 -0
  192. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_bernoulli_function.py +0 -0
  193. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_binary_packet_function.py +0 -0
  194. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_client.py +0 -0
  195. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_conditional_message_function.py +0 -0
  196. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_hash_seed_function.py +0 -0
  197. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  198. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_multiply_function.py +0 -0
  199. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_random_bytes_function.py +0 -0
  200. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  201. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/__init__.py +0 -0
  202. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/__init__.py +0 -0
  203. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  204. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  205. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_exception_function.py +0 -0
  206. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  207. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_logging_function.py +0 -0
  208. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  209. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_partitioned_function.py +0 -0
  210. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_projected_data_function.py +0 -0
  211. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_sequence_function.py +0 -0
  212. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_settings_function.py +0 -0
  213. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  214. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  215. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/__init__.py +0 -0
  216. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/__init__.py +0 -0
  217. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  218. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  219. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  220. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  221. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  222. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  223. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  224. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/table_in_out/test_client.py +0 -0
  225. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_access_log_audit.py +0 -0
  226. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_bind_exceptions.py +0 -0
  227. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_catalog_auth_binding.py +0 -0
  228. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_docstrings.py +0 -0
  229. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_documentation_examples.py +0 -0
  230. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_example_function_arg_types.py +0 -0
  231. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_exception_handling.py +0 -0
  232. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_exceptions.py +0 -0
  233. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_filter_pushdown.py +0 -0
  234. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_function_storage_azure_sql.py +0 -0
  235. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_cpp_constants.py +0 -0
  236. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  237. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_cpp_request_builders.py +0 -0
  238. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_go_schemas.py +0 -0
  239. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_protocol_version.py +0 -0
  240. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  241. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_ts_client.py +0 -0
  242. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_generated_ts_schemas.py +0 -0
  243. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_http_s3_offload_output.py +0 -0
  244. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_landing_conformance.py +0 -0
  245. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_mypy_consolidated.py +0 -0
  246. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_otel.py +0 -0
  247. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_projection_enforcement.py +0 -0
  248. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_schema_utils.py +0 -0
  249. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_setting_secret_annotations.py +0 -0
  250. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_signing_key.py +0 -0
  251. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  252. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_tcp_transport.py +0 -0
  253. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_type_bounds.py +0 -0
  254. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/test_worker_page.py +0 -0
  255. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/transactor/__init__.py +0 -0
  256. {vgi_python-0.24.0 → vgi_python-0.26.0}/tests/transactor/test_transactor.py +0 -0
  257. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/__init__.py +0 -0
  258. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_duckdb.py +0 -0
  259. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_storage_profile.py +0 -0
  260. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/__init__.py +0 -0
  261. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  262. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  263. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  264. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  265. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  266. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  267. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  268. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  269. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  270. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  271. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  272. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  273. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  274. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  275. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/attach_options.py +0 -0
  276. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  277. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  278. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/cancellable.py +0 -0
  279. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/catalog.py +0 -0
  280. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/companion.py +0 -0
  281. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/copy_from.py +0 -0
  282. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/copy_to.py +0 -0
  283. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/global_functions.py +0 -0
  284. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  285. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  286. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  287. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  288. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  289. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  290. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  291. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  292. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  293. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  294. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  295. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  296. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  297. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  298. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  299. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  300. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  301. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  302. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  303. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  304. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  305. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  306. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/_common.py +0 -0
  307. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  308. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  309. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/cache.py +0 -0
  310. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  311. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/filters.py +0 -0
  312. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  313. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  314. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/misc.py +0 -0
  315. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  316. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  317. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  318. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  319. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  320. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  321. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  322. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  323. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/settings.py +0 -0
  324. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  325. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  326. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  327. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  328. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table/wide.py +0 -0
  329. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table_in_out.py +0 -0
  330. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  331. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  332. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/versioned.py +0 -0
  333. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  334. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/worker.py +0 -0
  335. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  336. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  337. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/writable/table.py +0 -0
  338. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  339. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/aggregate_function.py +0 -0
  340. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/argument_spec.py +0 -0
  341. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/arguments.py +0 -0
  342. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/attach_header.py +0 -0
  343. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/cache_control.py +0 -0
  344. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/__init__.py +0 -0
  345. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/_descriptor_spec.py +0 -0
  346. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/attach_option.py +0 -0
  347. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/catalog_interface.py +0 -0
  348. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/descriptors.py +0 -0
  349. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/duckdb_statistics.py +0 -0
  350. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/secret_type.py +0 -0
  351. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/setting.py +0 -0
  352. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/catalog/storage.py +0 -0
  353. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/__init__.py +0 -0
  354. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/cli.py +0 -0
  355. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/cli_catalog.py +0 -0
  356. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/cli_schema.py +0 -0
  357. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/cli_table.py +0 -0
  358. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/cli_transaction.py +0 -0
  359. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/cli_utils.py +0 -0
  360. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/client/cli_view.py +0 -0
  361. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/__init__.py +0 -0
  362. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/_common.py +0 -0
  363. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/cpp_constants.py +0 -0
  364. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  365. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/cpp_request_builders.py +0 -0
  366. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/cpp_schemas.py +0 -0
  367. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  368. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  369. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  370. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/go_schemas.py +0 -0
  371. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/protocol_version.py +0 -0
  372. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/ts_client.py +0 -0
  373. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/codegen/ts_schemas.py +0 -0
  374. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/copy_from_function.py +0 -0
  375. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/copy_to_function.py +0 -0
  376. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/exceptions.py +0 -0
  377. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/function.py +0 -0
  378. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/function_storage.py +0 -0
  379. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/function_storage_azure_sql.py +0 -0
  380. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/http/__init__.py +0 -0
  381. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/http/demo_storage.py +0 -0
  382. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/http/describe_json.py +0 -0
  383. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/http/landing.html +0 -0
  384. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/http/landing_page.py +0 -0
  385. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/http/worker_page.py +0 -0
  386. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/invocation.py +0 -0
  387. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/meta_worker.py +0 -0
  388. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/metadata.py +0 -0
  389. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/otel.py +0 -0
  390. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/profiling.py +0 -0
  391. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/protocol.py +0 -0
  392. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/protocol_version.txt +0 -0
  393. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/py.typed +0 -0
  394. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/scalar_function.py +0 -0
  395. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/schema_utils.py +0 -0
  396. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/secret_protocol.py +0 -0
  397. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/secret_service.py +0 -0
  398. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/table_buffering_function.py +0 -0
  399. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/table_filter_pushdown.py +0 -0
  400. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/table_function.py +0 -0
  401. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/table_in_out_function.py +0 -0
  402. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/transactor/__init__.py +0 -0
  403. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/transactor/_duckdb_compat.py +0 -0
  404. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/transactor/client.py +0 -0
  405. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/transactor/protocol.py +0 -0
  406. {vgi_python-0.24.0 → vgi_python-0.26.0}/vgi/transactor/server.py +0 -0
  407. {vgi_python-0.24.0 → vgi_python-0.26.0}/wrangler.jsonc +0 -0
@@ -30,7 +30,7 @@ jobs:
30
30
  - uses: actions/checkout@v7
31
31
 
32
32
  - name: Install uv
33
- uses: astral-sh/setup-uv@v8.2.0
33
+ uses: astral-sh/setup-uv@v9.0.0
34
34
 
35
35
  - name: Set up Python ${{ matrix.python-version }}
36
36
  run: uv python install ${{ matrix.python-version }}
@@ -48,7 +48,7 @@ jobs:
48
48
  - uses: actions/checkout@v7
49
49
 
50
50
  - name: Install uv
51
- uses: astral-sh/setup-uv@v8.2.0
51
+ uses: astral-sh/setup-uv@v9.0.0
52
52
 
53
53
  - name: Install dependencies
54
54
  run: uv sync --all-extras
@@ -62,15 +62,18 @@ jobs:
62
62
  # Docstring consistency (pydoclint) runs inside the pytest suite via
63
63
  # tests/test_docstrings.py, so it's not a separate CI lint step.
64
64
 
65
+ # ty was removed here in 0.25.2. It was already non-blocking, and at
66
+ # 0.0.66 it stopped terminating on this tree at all -- `ty check vgi/`
67
+ # ran past ten minutes and had to be killed. A signal nothing gates on,
68
+ # that also burns a CI job's wall clock, is worse than no signal.
65
69
  - name: Type check (mypy)
66
70
  run: uv run mypy vgi/
67
71
 
68
- # ty is pre-1.0 and its inference drifts release-to-release; keep it
69
- # visible as a signal but don't gate CI on it (mypy is the blocking
70
- # type gate).
71
- - name: Type check (ty, non-blocking)
72
- run: uv run ty check vgi/
73
- continue-on-error: true
72
+ # tests/ became clean in 0.26.0 and is gated from here on. It was
73
+ # unchecked for long enough to accumulate 174 errors; the point of the
74
+ # gate is that it never gets to accumulate a second batch.
75
+ - name: Type check tests (mypy)
76
+ run: uv run mypy tests/
74
77
 
75
78
  docs:
76
79
  name: Docs (build + examples + prose)
@@ -81,10 +84,10 @@ jobs:
81
84
  - uses: actions/checkout@v7
82
85
 
83
86
  - name: Install uv
84
- uses: astral-sh/setup-uv@v8.2.0
87
+ uses: astral-sh/setup-uv@v9.0.0
85
88
 
86
- - name: Set up Python 3.13
87
- run: uv python install 3.13
89
+ - name: Set up Python 3.14
90
+ run: uv python install 3.14
88
91
 
89
92
  - name: Install dependencies
90
93
  run: uv sync --all-extras --group docs
@@ -139,10 +142,10 @@ jobs:
139
142
  path: vgi-rpc
140
143
 
141
144
  - name: Install uv
142
- uses: astral-sh/setup-uv@v8.2.0
145
+ uses: astral-sh/setup-uv@v9.0.0
143
146
 
144
- - name: Set up Python 3.13
145
- run: uv python install 3.13
147
+ - name: Set up Python 3.14
148
+ run: uv python install 3.14
146
149
 
147
150
  - name: Install test dependencies
148
151
  run: |
@@ -150,7 +153,7 @@ jobs:
150
153
  # local vgi-rpc checkout with the s3/external extras plus boto3.
151
154
  # Subsequent uv run calls must pass --no-sync or uv re-syncs the
152
155
  # env to the lockfile and drops the overlay.
153
- uv sync --all-extras --python 3.13
156
+ uv sync --all-extras --python 3.14
154
157
  uv pip install './vgi-rpc[http,s3,external]' boto3
155
158
 
156
159
  - name: Create test bucket in LocalStack
@@ -18,10 +18,10 @@ jobs:
18
18
  - uses: actions/checkout@v7
19
19
 
20
20
  - name: Install uv
21
- uses: astral-sh/setup-uv@v8.2.0
21
+ uses: astral-sh/setup-uv@v9.0.0
22
22
 
23
23
  - name: Set up Python
24
- run: uv python install 3.13
24
+ run: uv python install 3.14
25
25
 
26
26
  - name: Install dependencies
27
27
  run: uv sync --group docs
@@ -76,13 +76,13 @@ jobs:
76
76
  token: ${{ secrets.GITHUB_TOKEN }}
77
77
 
78
78
  - name: Install uv
79
- uses: astral-sh/setup-uv@v8.2.0
79
+ uses: astral-sh/setup-uv@v9.0.0
80
80
 
81
- - name: Set up Python 3.13
82
- run: uv python install 3.13
81
+ - name: Set up Python 3.14
82
+ run: uv python install 3.14
83
83
 
84
84
  - name: Install dependencies (vgi + fixtures + all extras)
85
- run: uv sync --all-extras --python 3.13
85
+ run: uv sync --all-extras --python 3.14
86
86
 
87
87
  - name: Download haybarn-unittest
88
88
  run: |
@@ -33,7 +33,7 @@ jobs:
33
33
  - uses: actions/checkout@v7
34
34
 
35
35
  - name: Install uv
36
- uses: astral-sh/setup-uv@v8.2.0
36
+ uses: astral-sh/setup-uv@v9.0.0
37
37
 
38
38
  - name: Build vgi (sdist + wheel)
39
39
  run: uv build --sdist --wheel --out-dir dist-vgi .
@@ -108,17 +108,17 @@ jobs:
108
108
  fi
109
109
  echo "tags=$tags" >> "$GITHUB_OUTPUT"
110
110
 
111
- - uses: docker/setup-buildx-action@v3
111
+ - uses: docker/setup-buildx-action@v4
112
112
 
113
113
  - name: Log in to GHCR
114
- uses: docker/login-action@v3
114
+ uses: docker/login-action@v4
115
115
  with:
116
116
  registry: ghcr.io
117
117
  username: ${{ github.actor }}
118
118
  password: ${{ secrets.GITHUB_TOKEN }}
119
119
 
120
120
  - name: Build & push
121
- uses: docker/build-push-action@v6
121
+ uses: docker/build-push-action@v7
122
122
  with:
123
123
  context: .
124
124
  file: packages/vgi-fixtures/docker/Dockerfile
@@ -297,6 +297,11 @@ vgi-client --input data.parquet --function sum_all_columns --worker vgi-fixture-
297
297
  | `VGI_OAUTH_DEVICE_CODE_CLIENT_ID` | Client ID for device-code flow (optional, URL-safe chars only) |
298
298
  | `VGI_OAUTH_DEVICE_CODE_CLIENT_SECRET` | Client secret for device-code flow (optional, URL-safe chars only) |
299
299
  | `VGI_OAUTH_USE_ID_TOKEN` | When `1`/`true`/`yes`, clients use OIDC `id_token` as Bearer instead of `access_token` |
300
+ | `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `__introspect_token__`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
301
+ | `VGI_INTROSPECT_RATE_LIMIT` | Introspection requests allowed per caller per second (default 20) |
302
+ | `VGI_WORKER_ACCESS_LOG_SAMPLE` | Fraction of *successful* calls to keep in the access log, `0.0`–`1.0`. Errors are always kept; the decision is per call, so every record of one stream shares a fate |
303
+ | `VGI_WORKER_ACCESS_LOG_ASYNC` | When `1`/`true`/`yes`, emit access-log records from a listener thread. Bounded queue; full means drop, and a crash loses whatever is queued |
304
+ | `VGI_WORKER_ACCESS_LOG_QUEUE_SIZE` | Bound on the async access-log queue (default 10000) |
300
305
  | `VGI_OTEL_ENABLED` | Enable OpenTelemetry instrumentation (`1`/`true`/`yes`) |
301
306
  | `VGI_OTEL_CUSTOM_ATTRIBUTES` | Comma-separated `key=value` pairs for custom span/metric attributes |
302
307
  | `VGI_OTEL_CLAIM_ATTRIBUTES` | Comma-separated `claim_key=span_attr_name` pairs for claim extraction |
@@ -392,6 +397,96 @@ Set `SENTRY_DSN` (and install `vgi[sentry]`) to forward unhandled exceptions to
392
397
 
393
398
  The same enrichment applies to OTel spans when `VGI_OTEL_ENABLED=1` — both backends read from the same `VgiTracer.set_current_span_attributes()` call sites in `vgi/otel.py`. Either, neither, or both can be active in a process.
394
399
 
400
+ ### Serving Behind a Load Balancer
401
+
402
+ `--max-externalized-response-bytes` caps a single *externalized* response — the
403
+ payload uploaded to blob storage and replaced on the wire by a pointer. Set it
404
+ to whatever the load balancer, API gateway, or object-store policy in front of
405
+ the worker will actually carry.
406
+
407
+ ```bash
408
+ vgi-serve my.worker:MyWorker --http --max-externalized-response-bytes 67108864
409
+ ```
410
+
411
+ Unlike `--max-stream-response-bytes`, which governs the wire and is *soft* for
412
+ producer streams (a continuation token carries the overshoot to the next turn),
413
+ this cap is **hard on every method type with no continuation escape** — bytes
414
+ already uploaded cannot be un-uploaded. Default is no cap. When set, the value
415
+ is advertised as `VGI-Max-Externalized-Response-Bytes` so clients can size their
416
+ own expectations.
417
+
418
+ Also available on `Worker.main --http` and the fixture server. Under
419
+ `--server granian` it travels to worker processes through `export_serve_config`.
420
+
421
+ ### Token Introspection (`resolve_token`)
422
+
423
+ A worker may optionally expose `POST {prefix}/__introspect_token__`, which
424
+ resolves an opaque bearer credential to a principal — for a reverse proxy that
425
+ terminates the only public listener and must know the caller's identity before
426
+ it can authorize anything.
427
+
428
+ ```python
429
+ from vgi.auth import AuthUnavailableError, TokenIdentity
430
+ from vgi.worker import Worker
431
+
432
+ class MyWorker(Worker):
433
+ functions = [...]
434
+
435
+ @classmethod
436
+ def resolve_token(cls, token: str) -> TokenIdentity | None:
437
+ try:
438
+ row = api_keys.lookup(token) # your own store
439
+ except ConnectionError as exc:
440
+ # "I could not find out" -- 503 + Retry-After, not 401.
441
+ raise AuthUnavailableError(str(exc)) from exc
442
+ if row is None:
443
+ return None # "the credential is unknown"
444
+ return TokenIdentity(principal=row.principal, token_name=row.label)
445
+ ```
446
+
447
+ **The route does not exist until `resolve_token` is overridden** — absent, not
448
+ routed-and-refusing. That is what keeps a dependency upgrade from growing a
449
+ credential-to-identity oracle on every existing worker.
450
+
451
+ Enabling it also requires an allowlist of principals permitted to ask, via
452
+ `--introspect-principals` or `VGI_INTROSPECT_PRINCIPALS`. There is no permissive
453
+ default and a worker that overrides the hook without one **refuses to start**:
454
+ authenticating and introspecting are different capabilities, and "any
455
+ authenticated caller" lets any user resolve any other user's credential to its
456
+ owner. `--introspect-rate-limit` (default 20/caller/second) bounds, rather than
457
+ closes, the oracle an allowlisted-but-compromised caller still has.
458
+
459
+ Return `None` for "the store answered and this credential is unknown"; raise
460
+ `AuthUnavailableError` for "the answer is not knowable". A caller that
461
+ negative-caches the first must not cache the second. Never return claims — a
462
+ pass-through claims field would let a worker choose its caller's tenant routing
463
+ and policy branch.
464
+
465
+ `AuthUnavailableError` is worth reaching for in any custom `authenticate`
466
+ callback too, not just here: it is deliberately **not** a `ValueError`, because
467
+ `chain_authenticate` advances to the next authenticator on `ValueError` — so a
468
+ sidecar outage raised as one is read as "not my credential, try the next" and
469
+ ends up a 401 from the end of the chain, restarting every session in the fleet
470
+ over a thirty-second blip.
471
+
472
+ ### Access Log Sampling and Async Emission
473
+
474
+ `--access-log-sample 0.05` keeps 5% of *successful* calls. Errors are always
475
+ kept, and the decision is made per call so every record belonging to one stream
476
+ shares a fate. `--access-log-async` moves formatting and writing to a listener
477
+ thread so disk latency stays off the request path; the queue is bounded
478
+ (`--access-log-queue-size`, default 10000), full means drop, and the next record
479
+ through carries `dropped_records` so a gap is never silent. A crash loses
480
+ whatever is still queued — that is the trade.
481
+
482
+ Both apply only to `vgi_rpc.access`, which gets its own handler for the purpose.
483
+ They are deliberately not applied to the diagnostic loggers: dropping half of a
484
+ traceback is not a saving.
485
+
486
+ **Trace correlation needs no configuration.** vgi-rpc reads whatever span is
487
+ current when it emits a record, so `trace_id` / `span_id` appear on every access
488
+ record as soon as `VGI_OTEL_ENABLED=1`.
489
+
395
490
  ### Key Constraints for Scalar Functions:
396
491
  - **1:1 row mapping**: Output must have exactly the same number of rows as input
397
492
  - **Single column output**: Output schema has exactly one column named "result"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vgi-python
3
- Version: 0.24.0
3
+ Version: 0.26.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
@@ -158,11 +158,11 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
158
158
  Classifier: Typing :: Typed
159
159
  Requires-Python: >=3.13
160
160
  Requires-Dist: click
161
- Requires-Dist: httpx>=0.24
161
+ Requires-Dist: httpx2>=2.9.1
162
162
  Requires-Dist: platformdirs
163
163
  Requires-Dist: pyarrow
164
164
  Requires-Dist: typer>=0.9
165
- Requires-Dist: vgi-rpc>=0.33.0
165
+ Requires-Dist: vgi-rpc>=0.40.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'
@@ -12,6 +12,12 @@ require `pip install vgi-python[http]`; JWT authentication additionally requires
12
12
 
13
13
  ::: vgi.auth
14
14
 
15
+ ## Token introspection
16
+
17
+ `TokenIdentity` is what [`Worker.resolve_token`][vgi.worker.Worker.resolve_token] returns: a
18
+ `principal` plus an optional `token_name`. It lives in a private `vgi-rpc` module, so `vgi.auth`
19
+ re-exports it — a worker that implements `resolve_token` never has to name a private import path.
20
+
15
21
  ## Secret protocol
16
22
 
17
23
  ::: vgi.secret_protocol
@@ -57,7 +57,7 @@ VGI_WORKER_SHARED_STORAGE=cloudflare-do vgi-serve my_worker.py --http
57
57
  |---|---|---|---|
58
58
  | SQLite | `sqlite` (default) | local / subprocess | none (stdlib) |
59
59
  | Azure SQL | `azure-sql` | Azure deployments | `vgi-python[azure]` |
60
- | Cloudflare DO | `cloudflare-do` | edge / multi-cloud | none extra — uses `httpx`, which ships with `vgi-python`; needs a Worker endpoint + token |
60
+ | Cloudflare DO | `cloudflare-do` | edge / multi-cloud | none extra — uses `httpx2`, which ships with `vgi-python`; needs a Worker endpoint + token |
61
61
 
62
62
  The per-backend setup (connection strings, credentials, table provisioning) is documented in the
63
63
  [Shared Storage reference](../shared-storage.md).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.24.0"
3
+ version = "0.26.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -40,8 +40,8 @@ dependencies = [
40
40
  "pyarrow",
41
41
  "typer>=0.9",
42
42
  "platformdirs",
43
- "vgi-rpc>=0.33.0",
44
- "httpx>=0.24",
43
+ "vgi-rpc>=0.40.0",
44
+ "httpx2>=2.9.1",
45
45
  ]
46
46
 
47
47
  [project.optional-dependencies]
@@ -186,6 +186,10 @@ python_version = "3.13"
186
186
  strict = true
187
187
  warn_return_any = true
188
188
  warn_unused_ignores = true
189
+ # tests/test_examples_workers.py puts examples/ on sys.path and imports the
190
+ # doc example workers by bare module name; mirror that for mypy so the imports
191
+ # resolve (and the examples themselves get checked).
192
+ mypy_path = "examples"
189
193
 
190
194
  [[tool.mypy.overrides]]
191
195
  module = "typer.*"
@@ -197,6 +201,13 @@ ignore_missing_imports = true
197
201
  module = "granian.*"
198
202
  ignore_missing_imports = true
199
203
 
204
+ [[tool.mypy.overrides]]
205
+ # jsonschema ships no py.typed marker and its stubs live in the separate
206
+ # types-jsonschema distribution, which we don't depend on. Used only by the
207
+ # landing-page conformance checker in tests/.
208
+ module = "jsonschema.*"
209
+ ignore_missing_imports = true
210
+
200
211
  [[tool.mypy.overrides]]
201
212
  # These files have type: ignore comments for ty that mypy doesn't need
202
213
  module = ["vgi._test_fixtures.scalar.null_handling", "vgi.table_function"]
@@ -250,7 +261,7 @@ members = ["packages/vgi-fixtures"]
250
261
  vgi-fixtures = { workspace = true }
251
262
 
252
263
  [dependency-groups]
253
- dev = ["lxml>=6.0.2", "pytest-timeout>=2.4.0", "ty>=0.0.8", "vgi-fixtures"]
264
+ dev = ["lxml>=6.0.2", "pytest-timeout>=2.4.0", "vgi-fixtures"]
254
265
  docs = [
255
266
  "mkdocs>=1.6",
256
267
  "mkdocs-material>=9.5",
@@ -1279,9 +1279,11 @@ class TestSchemaDescriptor:
1279
1279
  """
1280
1280
  schema = Schema(name="main", functions=[UsersFunction]) # only table fn
1281
1281
  info = schema.to_schema_info(AttachOpaqueData(b"x"))
1282
- assert info.estimated_object_count["scalar_function"] == 0
1283
- assert info.estimated_object_count["aggregate_function"] == 0
1284
- assert info.estimated_object_count["table_function"] == 1
1282
+ counts = info.estimated_object_count
1283
+ assert counts is not None
1284
+ assert counts["scalar_function"] == 0
1285
+ assert counts["aggregate_function"] == 0
1286
+ assert counts["table_function"] == 1
1285
1287
 
1286
1288
 
1287
1289
  class TestLegacyFunctionsListSchemaInfo:
@@ -1320,6 +1322,7 @@ class TestLegacyFunctionsListSchemaInfo:
1320
1322
  schemas = ci.schemas(attach_opaque_data=AttachOpaqueData(b"x"), transaction_opaque_data=None)
1321
1323
  assert len(schemas) == 1
1322
1324
  counts = schemas[0].estimated_object_count
1325
+ assert counts is not None
1323
1326
  assert counts["scalar_function"] == 1
1324
1327
  assert counts["table_function"] == 1
1325
1328
 
@@ -23,23 +23,22 @@ class TestRequiredFiltersField:
23
23
 
24
24
  def _bbox_columns(self) -> pa.Schema:
25
25
  """Return a small schema with a ``bbox`` STRUCT plus flat id/ticker."""
26
- return pa.schema(
27
- [
28
- ("id", pa.int64()),
29
- ("ticker", pa.string()),
30
- (
31
- "bbox",
32
- pa.struct(
33
- [
34
- ("xmin", pa.float64()),
35
- ("ymin", pa.float64()),
36
- ("xmax", pa.float64()),
37
- ("ymax", pa.float64()),
38
- ]
39
- ),
26
+ fields: list[tuple[str, pa.DataType]] = [
27
+ ("id", pa.int64()),
28
+ ("ticker", pa.string()),
29
+ (
30
+ "bbox",
31
+ pa.struct(
32
+ [
33
+ ("xmin", pa.float64()),
34
+ ("ymin", pa.float64()),
35
+ ("xmax", pa.float64()),
36
+ ("ymax", pa.float64()),
37
+ ]
40
38
  ),
41
- ]
42
- )
39
+ ),
40
+ ]
41
+ return pa.schema(fields)
43
42
 
44
43
  def test_default_is_empty_tuple(self) -> None:
45
44
  """Default is an empty tuple; TableInfo wire field is an empty list."""
@@ -63,7 +63,7 @@ class _LegacyOnlyCatalog(_StubCatalogBase):
63
63
 
64
64
  # Only the legacy method is overridden; table_scan_branches_get falls back
65
65
  # to the CatalogInterface default-impl shim.
66
- def table_scan_function_get( # type: ignore[override]
66
+ def table_scan_function_get(
67
67
  self,
68
68
  *,
69
69
  attach_opaque_data: AttachOpaqueData,
@@ -89,7 +89,7 @@ class _MultiBranchCatalog(_StubCatalogBase):
89
89
  keep them non-overlapping at scan time.
90
90
  """
91
91
 
92
- def table_scan_function_get( # type: ignore[override]
92
+ def table_scan_function_get(
93
93
  self,
94
94
  *,
95
95
  attach_opaque_data: AttachOpaqueData,
@@ -108,7 +108,7 @@ class _MultiBranchCatalog(_StubCatalogBase):
108
108
  required_extensions=[],
109
109
  )
110
110
 
111
- def table_scan_branches_get( # type: ignore[override]
111
+ def table_scan_branches_get(
112
112
  self,
113
113
  *,
114
114
  attach_opaque_data: AttachOpaqueData,
@@ -184,7 +184,7 @@ class TestDefaultImplShim:
184
184
  super().__init__()
185
185
  self.last_at: tuple[str | None, str | None] | None = None
186
186
 
187
- def table_scan_function_get( # type: ignore[override]
187
+ def table_scan_function_get(
188
188
  self,
189
189
  *,
190
190
  attach_opaque_data: AttachOpaqueData,