vgi-python 0.11.0__tar.gz → 0.12.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 (385) hide show
  1. {vgi_python-0.11.0 → vgi_python-0.12.0}/PKG-INFO +1 -1
  2. {vgi_python-0.11.0 → vgi_python-0.12.0}/pyproject.toml +1 -1
  3. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/landing/_checker.py +10 -4
  4. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/landing/describe.expected.json +309 -254
  5. {vgi_python-0.11.0 → vgi_python-0.12.0}/uv.lock +1 -1
  6. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/http/describe_json.py +85 -9
  7. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/http/landing.html +70 -10
  8. {vgi_python-0.11.0 → vgi_python-0.12.0}/.gitattributes +0 -0
  9. {vgi_python-0.11.0 → vgi_python-0.12.0}/.github/dependabot.yml +0 -0
  10. {vgi_python-0.11.0 → vgi_python-0.12.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  11. {vgi_python-0.11.0 → vgi_python-0.12.0}/.github/workflows/ci.yml +0 -0
  12. {vgi_python-0.11.0 → vgi_python-0.12.0}/.github/workflows/docs.yml +0 -0
  13. {vgi_python-0.11.0 → vgi_python-0.12.0}/.github/workflows/integration.yml +0 -0
  14. {vgi_python-0.11.0 → vgi_python-0.12.0}/.github/workflows/release.yml +0 -0
  15. {vgi_python-0.11.0 → vgi_python-0.12.0}/.gitignore +0 -0
  16. {vgi_python-0.11.0 → vgi_python-0.12.0}/.python-version +0 -0
  17. {vgi_python-0.11.0 → vgi_python-0.12.0}/.vale.ini +0 -0
  18. {vgi_python-0.11.0 → vgi_python-0.12.0}/CLAUDE.md +0 -0
  19. {vgi_python-0.11.0 → vgi_python-0.12.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  20. {vgi_python-0.11.0 → vgi_python-0.12.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  21. {vgi_python-0.11.0 → vgi_python-0.12.0}/DOCS_USABILITY_TEST.md +0 -0
  22. {vgi_python-0.11.0 → vgi_python-0.12.0}/LICENSE +0 -0
  23. {vgi_python-0.11.0 → vgi_python-0.12.0}/README.md +0 -0
  24. {vgi_python-0.11.0 → vgi_python-0.12.0}/SECURITY.md +0 -0
  25. {vgi_python-0.11.0 → vgi_python-0.12.0}/ci/README.md +0 -0
  26. {vgi_python-0.11.0 → vgi_python-0.12.0}/ci/preprocess-require.awk +0 -0
  27. {vgi_python-0.11.0 → vgi_python-0.12.0}/ci/run-integration.sh +0 -0
  28. {vgi_python-0.11.0 → vgi_python-0.12.0}/dist-vgi/.gitignore +0 -0
  29. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/aggregate-functions.md +0 -0
  30. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/arguments.md +0 -0
  31. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/auth.md +0 -0
  32. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/catalogs.md +0 -0
  33. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/client.md +0 -0
  34. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/exceptions.md +0 -0
  35. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/filters.md +0 -0
  36. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/functions.md +0 -0
  37. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/http.md +0 -0
  38. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/index.md +0 -0
  39. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/metadata.md +0 -0
  40. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/observability.md +0 -0
  41. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/storage.md +0 -0
  42. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/transactor.md +0 -0
  43. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/api/worker.md +0 -0
  44. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/argument-serialization.md +0 -0
  45. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/apple-touch-icon.png +0 -0
  46. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/favicon-16x16.png +0 -0
  47. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/favicon-32x32.png +0 -0
  48. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/favicon.ico +0 -0
  49. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/kinds/aggregate.svg +0 -0
  50. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/kinds/buffering.svg +0 -0
  51. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/kinds/scalar.svg +0 -0
  52. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/kinds/table-in-out.svg +0 -0
  53. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/kinds/table.svg +0 -0
  54. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/logo.png +0 -0
  55. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/assets/social-card.png +0 -0
  56. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/authentication.md +0 -0
  57. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/catalog-interface.md +0 -0
  58. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/cli.md +0 -0
  59. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/column-statistics.md +0 -0
  60. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/concepts/index.md +0 -0
  61. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/contributing-docs.md +0 -0
  62. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/filter-pushdown.md +0 -0
  63. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/generator-api.md +0 -0
  64. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/how-to/catalogs.md +0 -0
  65. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/how-to/function-patterns.md +0 -0
  66. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/how-to/http-auth.md +0 -0
  67. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/how-to/index.md +0 -0
  68. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  69. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/how-to/state-storage.md +0 -0
  70. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/index.md +0 -0
  71. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/lifecycle.md +0 -0
  72. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/metadata.md +0 -0
  73. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/overrides/main.html +0 -0
  74. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/robots.txt +0 -0
  75. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/shared-storage.md +0 -0
  76. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/stylesheets/extra.css +0 -0
  77. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/tutorial/index.md +0 -0
  78. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/tutorial/scalar.md +0 -0
  79. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/tutorial/table.md +0 -0
  80. {vgi_python-0.11.0 → vgi_python-0.12.0}/docs/vgi-logo.png +0 -0
  81. {vgi_python-0.11.0 → vgi_python-0.12.0}/examples/calc_scalar_worker.py +0 -0
  82. {vgi_python-0.11.0 → vgi_python-0.12.0}/examples/calc_worker.py +0 -0
  83. {vgi_python-0.11.0 → vgi_python-0.12.0}/examples/filter_worker.py +0 -0
  84. {vgi_python-0.11.0 → vgi_python-0.12.0}/examples/greeting_scalar_worker.py +0 -0
  85. {vgi_python-0.11.0 → vgi_python-0.12.0}/examples/row_count_worker.py +0 -0
  86. {vgi_python-0.11.0 → vgi_python-0.12.0}/examples/series_streaming_worker.py +0 -0
  87. {vgi_python-0.11.0 → vgi_python-0.12.0}/examples/sum_worker.py +0 -0
  88. {vgi_python-0.11.0 → vgi_python-0.12.0}/mkdocs.yml +0 -0
  89. {vgi_python-0.11.0 → vgi_python-0.12.0}/packages/vgi-fixtures/LICENSE +0 -0
  90. {vgi_python-0.11.0 → vgi_python-0.12.0}/packages/vgi-fixtures/README.md +0 -0
  91. {vgi_python-0.11.0 → vgi_python-0.12.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  92. {vgi_python-0.11.0 → vgi_python-0.12.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  93. {vgi_python-0.11.0 → vgi_python-0.12.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  94. {vgi_python-0.11.0 → vgi_python-0.12.0}/scripts/measure_startup.py +0 -0
  95. {vgi_python-0.11.0 → vgi_python-0.12.0}/scripts/run_all_tests.sh +0 -0
  96. {vgi_python-0.11.0 → vgi_python-0.12.0}/test-data/generate.sh +0 -0
  97. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/__init__.py +0 -0
  98. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/_http_fixtures.py +0 -0
  99. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/__init__.py +0 -0
  100. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_catalog_interface.py +0 -0
  101. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_client_catalog.py +0 -0
  102. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_column_statistics.py +0 -0
  103. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_declarative.py +0 -0
  104. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  105. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_integration.py +0 -0
  106. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_required_field_filter_paths.py +0 -0
  107. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_scan_branches.py +0 -0
  108. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_serialization.py +0 -0
  109. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_setting.py +0 -0
  110. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_storage.py +0 -0
  111. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_time_travel.py +0 -0
  112. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/catalog/test_writable_table.py +0 -0
  113. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/client/__init__.py +0 -0
  114. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/client/test_broken_pipe.py +0 -0
  115. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/client/test_cli.py +0 -0
  116. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/client/test_cli_catalog_functions.py +0 -0
  117. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/client/test_worker_debug.py +0 -0
  118. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/__init__.py +0 -0
  119. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/_stub.py +0 -0
  120. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/conftest.py +0 -0
  121. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_accumulate.py +0 -0
  122. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_aggregate.py +0 -0
  123. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_attach.py +0 -0
  124. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_bearer_auth.py +0 -0
  125. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  126. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_container.py +0 -0
  127. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_copy_from.py +0 -0
  128. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_copy_to.py +0 -0
  129. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_directory_parity.py +0 -0
  130. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_function_inventory.py +0 -0
  131. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_github.py +0 -0
  132. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_http_client.py +0 -0
  133. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_http_external_location.py +0 -0
  134. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_http_upload_url.py +0 -0
  135. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_macro.py +0 -0
  136. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_overload.py +0 -0
  137. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_protocol_inventory.py +0 -0
  138. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_protocol_version.py +0 -0
  139. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_resumable_scan.py +0 -0
  140. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_scalar.py +0 -0
  141. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  142. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_secret.py +0 -0
  143. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_settings.py +0 -0
  144. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_table.py +0 -0
  145. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_table_in_out.py +0 -0
  146. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_view.py +0 -0
  147. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conformance/test_writable.py +0 -0
  148. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/conftest.py +0 -0
  149. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/landing/describe.schema.json +0 -0
  150. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/__init__.py +0 -0
  151. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_bernoulli_function.py +0 -0
  152. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_binary_packet_function.py +0 -0
  153. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_client.py +0 -0
  154. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_conditional_message_function.py +0 -0
  155. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_hash_seed_function.py +0 -0
  156. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  157. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_multiply_function.py +0 -0
  158. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_random_bytes_function.py +0 -0
  159. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  160. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/__init__.py +0 -0
  161. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/__init__.py +0 -0
  162. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  163. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  164. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_exception_function.py +0 -0
  165. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  166. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_logging_function.py +0 -0
  167. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  168. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_partitioned_function.py +0 -0
  169. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_projected_data_function.py +0 -0
  170. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_sequence_function.py +0 -0
  171. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_settings_function.py +0 -0
  172. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  173. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  174. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/__init__.py +0 -0
  175. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/generator/__init__.py +0 -0
  176. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  177. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  178. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  179. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  180. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  181. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  182. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/table_in_out/test_client.py +0 -0
  183. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_access_log_audit.py +0 -0
  184. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_aggregate_function.py +0 -0
  185. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_argument_spec.py +0 -0
  186. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_auth.py +0 -0
  187. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_bind_exceptions.py +0 -0
  188. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_bind_request_at_clause.py +0 -0
  189. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_bound_storage_conformance.py +0 -0
  190. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_catalog_auth_binding.py +0 -0
  191. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_copy_from_function.py +0 -0
  192. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_copy_to_function.py +0 -0
  193. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_docstrings.py +0 -0
  194. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_documentation_examples.py +0 -0
  195. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_example_function_arg_types.py +0 -0
  196. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_examples_workers.py +0 -0
  197. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_exception_handling.py +0 -0
  198. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_exceptions.py +0 -0
  199. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_filter_pushdown.py +0 -0
  200. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_filter_pushdown_extension.py +0 -0
  201. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_function_storage.py +0 -0
  202. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_function_storage_azure_sql.py +0 -0
  203. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_function_storage_cf_do.py +0 -0
  204. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  205. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_function_storage_conformance.py +0 -0
  206. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_cpp_constants.py +0 -0
  207. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  208. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_cpp_request_builders.py +0 -0
  209. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_cpp_schemas.py +0 -0
  210. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_cpp_secret.py +0 -0
  211. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_go_schemas.py +0 -0
  212. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_protocol_version.py +0 -0
  213. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  214. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_ts_client.py +0 -0
  215. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_generated_ts_schemas.py +0 -0
  216. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_http_demo_storage.py +0 -0
  217. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_http_s3_offload_input.py +0 -0
  218. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_http_s3_offload_output.py +0 -0
  219. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_landing_conformance.py +0 -0
  220. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_metadata.py +0 -0
  221. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_mypy_consolidated.py +0 -0
  222. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_nest_tensor.py +0 -0
  223. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_otel.py +0 -0
  224. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_projection_enforcement.py +0 -0
  225. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_projection_repro.py +0 -0
  226. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_protocol_classes.py +0 -0
  227. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_resolved_secrets.py +0 -0
  228. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_schema_utils.py +0 -0
  229. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_serve.py +0 -0
  230. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_setting_secret_annotations.py +0 -0
  231. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_table_buffering_function.py +0 -0
  232. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  233. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_tcp_transport.py +0 -0
  234. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_type_bounds.py +0 -0
  235. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_union_argument.py +0 -0
  236. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_worker.py +0 -0
  237. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_worker_cli.py +0 -0
  238. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/test_worker_page.py +0 -0
  239. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/transactor/__init__.py +0 -0
  240. {vgi_python-0.11.0 → vgi_python-0.12.0}/tests/transactor/test_transactor.py +0 -0
  241. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/__init__.py +0 -0
  242. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_duckdb.py +0 -0
  243. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_storage_profile.py +0 -0
  244. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/__init__.py +0 -0
  245. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  246. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  247. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  248. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  249. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  250. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  251. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  252. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  253. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  254. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  255. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  256. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  257. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  258. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/attach_options.py +0 -0
  259. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  260. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  261. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/cancellable.py +0 -0
  262. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/catalog.py +0 -0
  263. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/companion.py +0 -0
  264. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/copy_from.py +0 -0
  265. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/copy_to.py +0 -0
  266. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/http_server.py +0 -0
  267. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  268. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  269. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  270. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  271. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  272. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  273. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  274. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  275. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  276. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  277. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  278. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  279. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  280. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  281. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  282. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  283. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  284. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  285. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  286. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  287. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/_common.py +0 -0
  288. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  289. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  290. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  291. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/filters.py +0 -0
  292. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  293. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  294. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/misc.py +0 -0
  295. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  296. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  297. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  298. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  299. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  300. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  301. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  302. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/settings.py +0 -0
  303. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  304. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  305. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  306. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  307. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/table_in_out.py +0 -0
  308. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/versioned.py +0 -0
  309. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  310. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/worker.py +0 -0
  311. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  312. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  313. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/table.py +0 -0
  314. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  315. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/aggregate_function.py +0 -0
  316. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/argument_spec.py +0 -0
  317. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/arguments.py +0 -0
  318. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/auth.py +0 -0
  319. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/__init__.py +0 -0
  320. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/_descriptor_spec.py +0 -0
  321. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/attach_option.py +0 -0
  322. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/catalog_interface.py +0 -0
  323. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/descriptors.py +0 -0
  324. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/duckdb_statistics.py +0 -0
  325. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/secret_type.py +0 -0
  326. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/setting.py +0 -0
  327. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/catalog/storage.py +0 -0
  328. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/__init__.py +0 -0
  329. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/catalog_mixin.py +0 -0
  330. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/cli.py +0 -0
  331. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/cli_catalog.py +0 -0
  332. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/cli_schema.py +0 -0
  333. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/cli_table.py +0 -0
  334. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/cli_transaction.py +0 -0
  335. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/cli_utils.py +0 -0
  336. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/cli_view.py +0 -0
  337. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/client/client.py +0 -0
  338. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/__init__.py +0 -0
  339. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/_common.py +0 -0
  340. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/cpp_constants.py +0 -0
  341. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  342. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/cpp_request_builders.py +0 -0
  343. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/cpp_schemas.py +0 -0
  344. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  345. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  346. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  347. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/go_schemas.py +0 -0
  348. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/protocol_version.py +0 -0
  349. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/ts_client.py +0 -0
  350. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/codegen/ts_schemas.py +0 -0
  351. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/copy_from_function.py +0 -0
  352. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/copy_to_function.py +0 -0
  353. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/exceptions.py +0 -0
  354. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/function.py +0 -0
  355. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/function_storage.py +0 -0
  356. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/function_storage_azure_sql.py +0 -0
  357. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/function_storage_cf_do.py +0 -0
  358. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/http/__init__.py +0 -0
  359. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/http/demo_storage.py +0 -0
  360. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/http/landing_page.py +0 -0
  361. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/http/worker_page.py +0 -0
  362. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/invocation.py +0 -0
  363. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/logging_config.py +0 -0
  364. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/meta_worker.py +0 -0
  365. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/metadata.py +0 -0
  366. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/otel.py +0 -0
  367. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/protocol.py +0 -0
  368. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/protocol_version.txt +0 -0
  369. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/py.typed +0 -0
  370. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/scalar_function.py +0 -0
  371. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/schema_utils.py +0 -0
  372. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/secret_protocol.py +0 -0
  373. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/secret_service.py +0 -0
  374. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/serve.py +0 -0
  375. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/table_buffering_function.py +0 -0
  376. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/table_filter_pushdown.py +0 -0
  377. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/table_function.py +0 -0
  378. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/table_in_out_function.py +0 -0
  379. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/transactor/__init__.py +0 -0
  380. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/transactor/_duckdb_compat.py +0 -0
  381. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/transactor/client.py +0 -0
  382. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/transactor/protocol.py +0 -0
  383. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/transactor/server.py +0 -0
  384. {vgi_python-0.11.0 → vgi_python-0.12.0}/vgi/worker.py +0 -0
  385. {vgi_python-0.11.0 → vgi_python-0.12.0}/wrangler.jsonc +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vgi-python
3
- Version: 0.11.0
3
+ Version: 0.12.0
4
4
  Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
5
5
  Project-URL: Homepage, https://query.farm
6
6
  Project-URL: Repository, https://github.com/Query-farm/vgi-python
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.11.0"
3
+ version = "0.12.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -63,7 +63,7 @@ def check(
63
63
  """Return a list of failure strings (empty == conformant)."""
64
64
  base = base_url.rstrip("/")
65
65
  fails: list[str] = []
66
- schema = json.loads(schema_path.read_text())
66
+ schema = json.loads(schema_path.read_text(encoding="utf-8"))
67
67
  columns_schema = {**schema, **schema["$defs"]["columns"]}
68
68
 
69
69
  # 1) describe.json — schema-valid.
@@ -105,11 +105,17 @@ def check(
105
105
  # 4) Golden diff (cross-language equality).
106
106
  if golden_path is not None:
107
107
  got = _canonical(normalize(doc))
108
- want = golden_path.read_text() if golden_path.exists() else None
108
+ want = golden_path.read_text(encoding="utf-8") if golden_path.exists() else None
109
109
  if want is None:
110
110
  fails.append(f"golden {golden_path} does not exist (run with --update)")
111
111
  elif got.strip() != want.strip():
112
- fails.append(f"describe.json does not match golden {golden_path.name} (normalized diff)")
112
+ import difflib
113
+
114
+ diff = list(
115
+ difflib.unified_diff(want.strip().splitlines(), got.strip().splitlines(), "golden", "live", lineterm="")
116
+ )
117
+ snippet = "\n".join(diff[:40])
118
+ fails.append(f"describe.json does not match golden {golden_path.name}:\n{snippet}")
113
119
 
114
120
  return fails
115
121
 
@@ -127,7 +133,7 @@ def main() -> int:
127
133
  ap.error("--update requires --golden")
128
134
  _, body, _ = _get(f"{args.url.rstrip('/')}/describe.json")
129
135
  args.golden.parent.mkdir(parents=True, exist_ok=True)
130
- args.golden.write_text(_canonical(normalize(json.loads(body))) + "\n")
136
+ args.golden.write_text(_canonical(normalize(json.loads(body))) + "\n", encoding="utf-8")
131
137
  print(f"wrote golden {args.golden}")
132
138
  return 0
133
139
 
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "attach_options": [],
5
5
  "counts": {
6
- "functions": 162,
6
+ "functions": 165,
7
7
  "schemas": 2,
8
8
  "tables": 44,
9
9
  "views": 3
@@ -13,6 +13,240 @@
13
13
  "implementation_version": null,
14
14
  "name": "example",
15
15
  "schemas": [
16
+ {
17
+ "functions": [],
18
+ "name": "data",
19
+ "tables": [
20
+ {
21
+ "cols": 1,
22
+ "comment": "Function-backed table with inlined cardinality (10000 rows)",
23
+ "name": "cardinality_inlined_table"
24
+ },
25
+ {
26
+ "cols": 3,
27
+ "comment": "Colors table with ENUM-derived statistics",
28
+ "name": "colors"
29
+ },
30
+ {
31
+ "cols": 3,
32
+ "comment": "Department reference table",
33
+ "name": "departments"
34
+ },
35
+ {
36
+ "cols": 4,
37
+ "comment": "Employee table with FK to departments",
38
+ "name": "employees"
39
+ },
40
+ {
41
+ "cols": 3,
42
+ "comment": "Catalog table echoing pushed-down filters (filter-pushdown-through-view tests).",
43
+ "name": "filter_echo_table"
44
+ },
45
+ {
46
+ "cols": 1,
47
+ "comment": "123456 integers; stats served by the sequence function, not the table",
48
+ "name": "funny_numbers"
49
+ },
50
+ {
51
+ "cols": 3,
52
+ "comment": "Table with generated columns backed by sequence(10)",
53
+ "name": "generated_sequence"
54
+ },
55
+ {
56
+ "cols": 2,
57
+ "comment": "5x5 grid of points with spatial statistics",
58
+ "name": "geo_points"
59
+ },
60
+ {
61
+ "cols": 1,
62
+ "comment": "A large sequence of integers from 0 to 1,000,000",
63
+ "name": "large_sequence"
64
+ },
65
+ {
66
+ "cols": 4,
67
+ "comment": "Late-materialization table (1000 rows, unique rowid)",
68
+ "name": "late_mat"
69
+ },
70
+ {
71
+ "cols": 4,
72
+ "comment": "Late-materialization table with deliberately non-unique rowid (contract violation)",
73
+ "name": "late_mat_dup"
74
+ },
75
+ {
76
+ "cols": 4,
77
+ "comment": "Late-materialization table with NULLs in the ord column",
78
+ "name": "late_mat_nulls"
79
+ },
80
+ {
81
+ "cols": 1,
82
+ "comment": "Multi-branch: empty branches list — used by multi_branch_empty_branches.test",
83
+ "name": "multi_branch_empty"
84
+ },
85
+ {
86
+ "cols": 1,
87
+ "comment": "Multi-branch with complementary branch_filters — exercises pruning",
88
+ "name": "multi_branch_filtered_numbers"
89
+ },
90
+ {
91
+ "cols": 1,
92
+ "comment": "Multi-branch: sequence(50) + read_parquet — used by multi_branch_heterogeneous.test",
93
+ "name": "multi_branch_hetero"
94
+ },
95
+ {
96
+ "cols": 1,
97
+ "comment": "Multi-branch: sequence(50) + iceberg_scan — used by multi_branch_iceberg.test",
98
+ "name": "multi_branch_iceberg"
99
+ },
100
+ {
101
+ "cols": 1,
102
+ "comment": "Multi-branch: VGI + read_csv — used by multi_branch_pushdown_incapable.test",
103
+ "name": "multi_branch_nopushdown"
104
+ },
105
+ {
106
+ "cols": 1,
107
+ "comment": "Multi-branch: UNION of sequence(50) + sequence(50) — used by multi_branch_scan.test",
108
+ "name": "multi_branch_numbers"
109
+ },
110
+ {
111
+ "cols": 2,
112
+ "comment": "Multi-branch: column reconciliation — used by multi_branch_reconciliation.test",
113
+ "name": "multi_branch_recon"
114
+ },
115
+ {
116
+ "cols": 1,
117
+ "comment": "Multi-branch with two writable=True arms — used by multi_branch_two_writable.test",
118
+ "name": "multi_branch_two_writable"
119
+ },
120
+ {
121
+ "cols": 1,
122
+ "comment": "First 100 integers (demonstrates explicit columns)",
123
+ "name": "numbers"
124
+ },
125
+ {
126
+ "cols": 4,
127
+ "comment": "Product table with column defaults",
128
+ "name": "products"
129
+ },
130
+ {
131
+ "cols": 3,
132
+ "comment": "Projects with composite PK and FK to departments",
133
+ "name": "projects"
134
+ },
135
+ {
136
+ "cols": 6,
137
+ "comment": "rff_hive — native read_parquet over Hive glob with bbox.* required filters.",
138
+ "name": "rff_hive"
139
+ },
140
+ {
141
+ "cols": 6,
142
+ "comment": "rff_hive_mixed — native read_parquet, top-level 'id' + bbox.* required filters.",
143
+ "name": "rff_hive_mixed"
144
+ },
145
+ {
146
+ "cols": 2,
147
+ "comment": "rff_multi — mixed top-level + struct subfield requirements.",
148
+ "name": "rff_multi"
149
+ },
150
+ {
151
+ "cols": 1,
152
+ "comment": "rff_nested — requires a filter on the 3-deep nested path wrapper.mid.leaf.",
153
+ "name": "rff_nested"
154
+ },
155
+ {
156
+ "cols": 2,
157
+ "comment": "rff_none — control table with no required_field_filter_paths (opt-out fast path).",
158
+ "name": "rff_none"
159
+ },
160
+ {
161
+ "cols": 2,
162
+ "comment": "rff_parquet — native read_parquet delegation with bbox.* required filters.",
163
+ "name": "rff_parquet"
164
+ },
165
+ {
166
+ "cols": 3,
167
+ "comment": "rff_rowid — row_id virtual column + required bbox.* filters.",
168
+ "name": "rff_rowid"
169
+ },
170
+ {
171
+ "cols": 2,
172
+ "comment": "rff_simple — requires a filter referencing column 'a'.",
173
+ "name": "rff_simple"
174
+ },
175
+ {
176
+ "cols": 2,
177
+ "comment": "rff_struct — requires filters on both struct subfields s.a and s.b.",
178
+ "name": "rff_struct"
179
+ },
180
+ {
181
+ "cols": 3,
182
+ "comment": "Table with row_id at column index 0",
183
+ "name": "rowid_first"
184
+ },
185
+ {
186
+ "cols": 3,
187
+ "comment": "Table with row_id at column index 2",
188
+ "name": "rowid_last"
189
+ },
190
+ {
191
+ "cols": 3,
192
+ "comment": "Table with row_id at column index 1",
193
+ "name": "rowid_middle"
194
+ },
195
+ {
196
+ "cols": 2,
197
+ "comment": "Table with string row_id",
198
+ "name": "rowid_string"
199
+ },
200
+ {
201
+ "cols": 2,
202
+ "comment": "Table with struct row_id",
203
+ "name": "rowid_struct"
204
+ },
205
+ {
206
+ "cols": 3,
207
+ "comment": "Function-backed table over the secret-using secret_demo function",
208
+ "name": "secret_demo_table"
209
+ },
210
+ {
211
+ "cols": 1,
212
+ "comment": "Function-backed table over the no-arg ten_thousand function",
213
+ "name": "ten_thousand_table"
214
+ },
215
+ {
216
+ "cols": 4,
217
+ "comment": "Columns-based: prunes by filter AND time-travels (AT → version arg).",
218
+ "name": "tt_pushdown_cols"
219
+ },
220
+ {
221
+ "cols": 4,
222
+ "comment": "Function-backed: prunes by filter AND time-travels (AT read at init).",
223
+ "name": "tt_pushdown_fn"
224
+ },
225
+ {
226
+ "cols": 4,
227
+ "comment": "Table with constraints that evolve across versions",
228
+ "name": "versioned_constraints"
229
+ },
230
+ {
231
+ "cols": 2,
232
+ "comment": "Versioned data table demonstrating time travel with schema evolution",
233
+ "name": "versioned_data"
234
+ },
235
+ {
236
+ "cols": 1,
237
+ "comment": "Numbers with volatile stats (TTL=0, always re-fetched)",
238
+ "name": "volatile_numbers"
239
+ }
240
+ ],
241
+ "views": [
242
+ {
243
+ "cols": 1,
244
+ "comment": "Numbers less than 10",
245
+ "def": "SELECT * FROM numbers WHERE value < 10",
246
+ "name": "small_numbers"
247
+ }
248
+ ]
249
+ },
16
250
  {
17
251
  "functions": [
18
252
  {
@@ -883,26 +1117,69 @@
883
1117
  {
884
1118
  "args": [
885
1119
  {
886
- "desc": "dummy input",
887
- "name": "x",
1120
+ "desc": "Value to clamp",
1121
+ "name": "val",
1122
+ "type": "ANY"
1123
+ },
1124
+ {
1125
+ "default": "0",
1126
+ "desc": "Lower bound (inclusive)",
1127
+ "name": "lo",
1128
+ "named": true,
1129
+ "type": "int64"
1130
+ },
1131
+ {
1132
+ "default": "100",
1133
+ "desc": "Upper bound (inclusive)",
1134
+ "name": "hi",
1135
+ "named": true,
888
1136
  "type": "int64"
889
1137
  }
890
1138
  ],
891
- "doc": "Return the authenticated principal name.",
892
- "name": "whoami",
893
- "returns": "string",
1139
+ "doc": "Clamp a value between lo and hi (defaults: 0..100)",
1140
+ "name": "vgi_clamp",
894
1141
  "type": "scalar"
895
1142
  },
896
1143
  {
897
1144
  "args": [
898
1145
  {
899
- "desc": "Total rows to attempt to generate",
900
- "name": "count",
901
- "type": "int64"
1146
+ "desc": "First factor",
1147
+ "name": "x",
1148
+ "type": "ANY"
1149
+ },
1150
+ {
1151
+ "desc": "Second factor",
1152
+ "name": "y",
1153
+ "type": "ANY"
902
1154
  }
903
1155
  ],
904
- "doc": "DELIBERATELY BROKEN: emits a batch tagged with a partition_id well above DuckDB's BATCH_INCREMENT=10^13 per-pipeline cap. C++ extension rejects at parse time.",
905
- "name": "broken_batch_index_overflow",
1156
+ "doc": "Multiply two values",
1157
+ "name": "vgi_multiply",
1158
+ "type": "scalar"
1159
+ },
1160
+ {
1161
+ "args": [
1162
+ {
1163
+ "desc": "dummy input",
1164
+ "name": "x",
1165
+ "type": "int64"
1166
+ }
1167
+ ],
1168
+ "doc": "Return the authenticated principal name.",
1169
+ "name": "whoami",
1170
+ "returns": "string",
1171
+ "type": "scalar"
1172
+ },
1173
+ {
1174
+ "args": [
1175
+ {
1176
+ "desc": "Total rows to attempt to generate",
1177
+ "name": "count",
1178
+ "type": "int64"
1179
+ }
1180
+ ],
1181
+ "doc": "DELIBERATELY BROKEN: emits a batch tagged with a partition_id well above DuckDB's BATCH_INCREMENT=10^13 per-pipeline cap. C++ extension rejects at parse time.",
1182
+ "name": "broken_batch_index_overflow",
906
1183
  "type": "table"
907
1184
  },
908
1185
  {
@@ -1972,12 +2249,6 @@
1972
2249
  "name": "struct_settings",
1973
2250
  "type": "table"
1974
2251
  },
1975
- {
1976
- "args": [],
1977
- "doc": "Distributed sum using simple callback API",
1978
- "name": "sum_all_columns_simple_distributed",
1979
- "type": "table_in_out"
1980
- },
1981
2252
  {
1982
2253
  "args": [],
1983
2254
  "doc": "Generates 10000 integers from 0 to 9999",
@@ -2127,6 +2398,18 @@
2127
2398
  "name": "versioned_data_scan",
2128
2399
  "type": "table"
2129
2400
  },
2401
+ {
2402
+ "args": [
2403
+ {
2404
+ "desc": "Number of rows to generate",
2405
+ "name": "n",
2406
+ "type": "ANY"
2407
+ }
2408
+ ],
2409
+ "doc": "Table macro returning range of values",
2410
+ "name": "vgi_range_table",
2411
+ "type": "table"
2412
+ },
2130
2413
  {
2131
2414
  "args": [],
2132
2415
  "doc": "buffer_input variant using batch_index to reconstruct order",
@@ -2376,256 +2659,28 @@
2376
2659
  "doc": "Computes column-wise sums across all batches",
2377
2660
  "name": "sum_all_columns",
2378
2661
  "type": "table_in_out"
2662
+ },
2663
+ {
2664
+ "args": [],
2665
+ "doc": "Distributed sum using simple callback API",
2666
+ "name": "sum_all_columns_simple_distributed",
2667
+ "type": "table_in_out"
2379
2668
  }
2380
2669
  ],
2381
2670
  "name": "main",
2382
2671
  "tables": [],
2383
2672
  "views": [
2384
- {
2385
- "cols": 1,
2386
- "comment": "First 10 integers",
2387
- "def": "SELECT * FROM sequence(10)",
2388
- "name": "first_ten"
2389
- },
2390
2673
  {
2391
2674
  "cols": 0,
2392
2675
  "comment": "Even numbers from 0 to 98",
2393
2676
  "def": "SELECT * FROM sequence(100) WHERE n % 2 = 0",
2394
2677
  "name": "even_numbers"
2395
- }
2396
- ]
2397
- },
2398
- {
2399
- "functions": [],
2400
- "name": "data",
2401
- "tables": [
2402
- {
2403
- "cols": 1,
2404
- "comment": "A large sequence of integers from 0 to 1,000,000",
2405
- "name": "large_sequence"
2406
- },
2407
- {
2408
- "cols": 1,
2409
- "comment": "Function-backed table over the no-arg ten_thousand function",
2410
- "name": "ten_thousand_table"
2411
- },
2412
- {
2413
- "cols": 3,
2414
- "comment": "Function-backed table over the secret-using secret_demo function",
2415
- "name": "secret_demo_table"
2416
- },
2417
- {
2418
- "cols": 1,
2419
- "comment": "Function-backed table with inlined cardinality (10000 rows)",
2420
- "name": "cardinality_inlined_table"
2421
- },
2422
- {
2423
- "cols": 2,
2424
- "comment": "Versioned data table demonstrating time travel with schema evolution",
2425
- "name": "versioned_data"
2426
- },
2427
- {
2428
- "cols": 4,
2429
- "comment": "Function-backed: prunes by filter AND time-travels (AT read at init).",
2430
- "name": "tt_pushdown_fn"
2431
- },
2432
- {
2433
- "cols": 4,
2434
- "comment": "Columns-based: prunes by filter AND time-travels (AT → version arg).",
2435
- "name": "tt_pushdown_cols"
2436
- },
2437
- {
2438
- "cols": 1,
2439
- "comment": "First 100 integers (demonstrates explicit columns)",
2440
- "name": "numbers"
2441
- },
2442
- {
2443
- "cols": 2,
2444
- "comment": "5x5 grid of points with spatial statistics",
2445
- "name": "geo_points"
2446
- },
2447
- {
2448
- "cols": 1,
2449
- "comment": "Numbers with volatile stats (TTL=0, always re-fetched)",
2450
- "name": "volatile_numbers"
2451
- },
2452
- {
2453
- "cols": 1,
2454
- "comment": "123456 integers; stats served by the sequence function, not the table",
2455
- "name": "funny_numbers"
2456
- },
2457
- {
2458
- "cols": 1,
2459
- "comment": "Multi-branch: UNION of sequence(50) + sequence(50) — used by multi_branch_scan.test",
2460
- "name": "multi_branch_numbers"
2461
- },
2462
- {
2463
- "cols": 1,
2464
- "comment": "Multi-branch with complementary branch_filters — exercises pruning",
2465
- "name": "multi_branch_filtered_numbers"
2466
- },
2467
- {
2468
- "cols": 1,
2469
- "comment": "Multi-branch: sequence(50) + read_parquet — used by multi_branch_heterogeneous.test",
2470
- "name": "multi_branch_hetero"
2471
- },
2472
- {
2473
- "cols": 1,
2474
- "comment": "Multi-branch: sequence(50) + iceberg_scan — used by multi_branch_iceberg.test",
2475
- "name": "multi_branch_iceberg"
2476
- },
2477
- {
2478
- "cols": 2,
2479
- "comment": "Multi-branch: column reconciliation — used by multi_branch_reconciliation.test",
2480
- "name": "multi_branch_recon"
2481
- },
2482
- {
2483
- "cols": 1,
2484
- "comment": "Multi-branch: VGI + read_csv — used by multi_branch_pushdown_incapable.test",
2485
- "name": "multi_branch_nopushdown"
2486
2678
  },
2487
2679
  {
2488
2680
  "cols": 1,
2489
- "comment": "Multi-branch: empty branches list — used by multi_branch_empty_branches.test",
2490
- "name": "multi_branch_empty"
2491
- },
2492
- {
2493
- "cols": 1,
2494
- "comment": "Multi-branch with two writable=True arms — used by multi_branch_two_writable.test",
2495
- "name": "multi_branch_two_writable"
2496
- },
2497
- {
2498
- "cols": 3,
2499
- "comment": "Colors table with ENUM-derived statistics",
2500
- "name": "colors"
2501
- },
2502
- {
2503
- "cols": 3,
2504
- "comment": "Table with row_id at column index 0",
2505
- "name": "rowid_first"
2506
- },
2507
- {
2508
- "cols": 3,
2509
- "comment": "Table with row_id at column index 1",
2510
- "name": "rowid_middle"
2511
- },
2512
- {
2513
- "cols": 3,
2514
- "comment": "Table with row_id at column index 2",
2515
- "name": "rowid_last"
2516
- },
2517
- {
2518
- "cols": 2,
2519
- "comment": "Table with string row_id",
2520
- "name": "rowid_string"
2521
- },
2522
- {
2523
- "cols": 2,
2524
- "comment": "Table with struct row_id",
2525
- "name": "rowid_struct"
2526
- },
2527
- {
2528
- "cols": 4,
2529
- "comment": "Late-materialization table (1000 rows, unique rowid)",
2530
- "name": "late_mat"
2531
- },
2532
- {
2533
- "cols": 4,
2534
- "comment": "Late-materialization table with deliberately non-unique rowid (contract violation)",
2535
- "name": "late_mat_dup"
2536
- },
2537
- {
2538
- "cols": 4,
2539
- "comment": "Late-materialization table with NULLs in the ord column",
2540
- "name": "late_mat_nulls"
2541
- },
2542
- {
2543
- "cols": 3,
2544
- "comment": "Table with generated columns backed by sequence(10)",
2545
- "name": "generated_sequence"
2546
- },
2547
- {
2548
- "cols": 3,
2549
- "comment": "Department reference table",
2550
- "name": "departments"
2551
- },
2552
- {
2553
- "cols": 4,
2554
- "comment": "Product table with column defaults",
2555
- "name": "products"
2556
- },
2557
- {
2558
- "cols": 4,
2559
- "comment": "Employee table with FK to departments",
2560
- "name": "employees"
2561
- },
2562
- {
2563
- "cols": 3,
2564
- "comment": "Projects with composite PK and FK to departments",
2565
- "name": "projects"
2566
- },
2567
- {
2568
- "cols": 3,
2569
- "comment": "Catalog table echoing pushed-down filters (filter-pushdown-through-view tests).",
2570
- "name": "filter_echo_table"
2571
- },
2572
- {
2573
- "cols": 2,
2574
- "comment": "rff_simple — requires a filter referencing column 'a'.",
2575
- "name": "rff_simple"
2576
- },
2577
- {
2578
- "cols": 2,
2579
- "comment": "rff_struct — requires filters on both struct subfields s.a and s.b.",
2580
- "name": "rff_struct"
2581
- },
2582
- {
2583
- "cols": 1,
2584
- "comment": "rff_nested — requires a filter on the 3-deep nested path wrapper.mid.leaf.",
2585
- "name": "rff_nested"
2586
- },
2587
- {
2588
- "cols": 2,
2589
- "comment": "rff_multi — mixed top-level + struct subfield requirements.",
2590
- "name": "rff_multi"
2591
- },
2592
- {
2593
- "cols": 2,
2594
- "comment": "rff_none — control table with no required_field_filter_paths (opt-out fast path).",
2595
- "name": "rff_none"
2596
- },
2597
- {
2598
- "cols": 3,
2599
- "comment": "rff_rowid — row_id virtual column + required bbox.* filters.",
2600
- "name": "rff_rowid"
2601
- },
2602
- {
2603
- "cols": 2,
2604
- "comment": "rff_parquet — native read_parquet delegation with bbox.* required filters.",
2605
- "name": "rff_parquet"
2606
- },
2607
- {
2608
- "cols": 6,
2609
- "comment": "rff_hive — native read_parquet over Hive glob with bbox.* required filters.",
2610
- "name": "rff_hive"
2611
- },
2612
- {
2613
- "cols": 6,
2614
- "comment": "rff_hive_mixed — native read_parquet, top-level 'id' + bbox.* required filters.",
2615
- "name": "rff_hive_mixed"
2616
- },
2617
- {
2618
- "cols": 4,
2619
- "comment": "Table with constraints that evolve across versions",
2620
- "name": "versioned_constraints"
2621
- }
2622
- ],
2623
- "views": [
2624
- {
2625
- "cols": 1,
2626
- "comment": "Numbers less than 10",
2627
- "def": "SELECT * FROM numbers WHERE value < 10",
2628
- "name": "small_numbers"
2681
+ "comment": "First 10 integers",
2682
+ "def": "SELECT * FROM sequence(10)",
2683
+ "name": "first_ten"
2629
2684
  }
2630
2685
  ]
2631
2686
  }