vgi-python 0.31.0__tar.gz → 0.31.2__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 (443) hide show
  1. {vgi_python-0.31.0 → vgi_python-0.31.2}/PKG-INFO +1 -1
  2. {vgi_python-0.31.0 → vgi_python-0.31.2}/pyproject.toml +1 -1
  3. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_metadata.py +68 -0
  4. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_setting_secret_annotations.py +62 -0
  5. {vgi_python-0.31.0 → vgi_python-0.31.2}/uv.lock +1 -1
  6. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/arithmetic.py +4 -0
  7. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/catalog_interface.py +6 -3
  8. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/client.py +16 -5
  9. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/metadata.py +16 -0
  10. {vgi_python-0.31.0 → vgi_python-0.31.2}/.gitattributes +0 -0
  11. {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/dependabot.yml +0 -0
  12. {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  13. {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/ci.yml +0 -0
  14. {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/docs.yml +0 -0
  15. {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/integration.yml +0 -0
  16. {vgi_python-0.31.0 → vgi_python-0.31.2}/.github/workflows/release.yml +0 -0
  17. {vgi_python-0.31.0 → vgi_python-0.31.2}/.gitignore +0 -0
  18. {vgi_python-0.31.0 → vgi_python-0.31.2}/.python-version +0 -0
  19. {vgi_python-0.31.0 → vgi_python-0.31.2}/.vale.ini +0 -0
  20. {vgi_python-0.31.0 → vgi_python-0.31.2}/CLAUDE.md +0 -0
  21. {vgi_python-0.31.0 → vgi_python-0.31.2}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  22. {vgi_python-0.31.0 → vgi_python-0.31.2}/DOCS_REVIEW_RUBRIC.md +0 -0
  23. {vgi_python-0.31.0 → vgi_python-0.31.2}/DOCS_USABILITY_TEST.md +0 -0
  24. {vgi_python-0.31.0 → vgi_python-0.31.2}/LICENSE +0 -0
  25. {vgi_python-0.31.0 → vgi_python-0.31.2}/README.md +0 -0
  26. {vgi_python-0.31.0 → vgi_python-0.31.2}/RELEASE-RUNBOOK.md +0 -0
  27. {vgi_python-0.31.0 → vgi_python-0.31.2}/SECURITY.md +0 -0
  28. {vgi_python-0.31.0 → vgi_python-0.31.2}/ci/README.md +0 -0
  29. {vgi_python-0.31.0 → vgi_python-0.31.2}/ci/preprocess-require.awk +0 -0
  30. {vgi_python-0.31.0 → vgi_python-0.31.2}/ci/run-integration.sh +0 -0
  31. {vgi_python-0.31.0 → vgi_python-0.31.2}/dist-vgi/.gitignore +0 -0
  32. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/aggregate-functions.md +0 -0
  33. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/arguments.md +0 -0
  34. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/auth.md +0 -0
  35. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/catalogs.md +0 -0
  36. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/client.md +0 -0
  37. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/exceptions.md +0 -0
  38. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/filters.md +0 -0
  39. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/functions.md +0 -0
  40. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/http.md +0 -0
  41. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/index.md +0 -0
  42. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/metadata.md +0 -0
  43. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/observability.md +0 -0
  44. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/storage.md +0 -0
  45. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/transactor.md +0 -0
  46. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/api/worker.md +0 -0
  47. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/argument-serialization.md +0 -0
  48. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/apple-touch-icon.png +0 -0
  49. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/favicon-16x16.png +0 -0
  50. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/favicon-32x32.png +0 -0
  51. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/favicon.ico +0 -0
  52. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/aggregate.svg +0 -0
  53. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/buffering.svg +0 -0
  54. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/scalar.svg +0 -0
  55. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/table-in-out.svg +0 -0
  56. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/kinds/table.svg +0 -0
  57. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/logo.png +0 -0
  58. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/assets/social-card.png +0 -0
  59. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/authentication.md +0 -0
  60. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/catalog-interface.md +0 -0
  61. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/cli.md +0 -0
  62. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/column-statistics.md +0 -0
  63. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/concepts/index.md +0 -0
  64. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/contributing-docs.md +0 -0
  65. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/filter-pushdown.md +0 -0
  66. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/generator-api.md +0 -0
  67. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/global-functions.md +0 -0
  68. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/catalogs.md +0 -0
  69. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/function-patterns.md +0 -0
  70. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/http-auth.md +0 -0
  71. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/index.md +0 -0
  72. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/pushdown-and-statistics.md +0 -0
  73. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/how-to/state-storage.md +0 -0
  74. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/index.md +0 -0
  75. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/lifecycle.md +0 -0
  76. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/metadata.md +0 -0
  77. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/overrides/main.html +0 -0
  78. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/robots.txt +0 -0
  79. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/shared-storage.md +0 -0
  80. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/stylesheets/extra.css +0 -0
  81. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/tutorial/index.md +0 -0
  82. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/tutorial/scalar.md +0 -0
  83. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/tutorial/table.md +0 -0
  84. {vgi_python-0.31.0 → vgi_python-0.31.2}/docs/vgi-logo.png +0 -0
  85. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/batch_index_worker.py +0 -0
  86. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/cache_worker.py +0 -0
  87. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/calc_scalar_worker.py +0 -0
  88. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/calc_worker.py +0 -0
  89. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/copy_format_worker.py +0 -0
  90. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/filter_worker.py +0 -0
  91. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/greeting_scalar_worker.py +0 -0
  92. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/row_count_worker.py +0 -0
  93. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/series_streaming_worker.py +0 -0
  94. {vgi_python-0.31.0 → vgi_python-0.31.2}/examples/sum_worker.py +0 -0
  95. {vgi_python-0.31.0 → vgi_python-0.31.2}/mkdocs.yml +0 -0
  96. {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/LICENSE +0 -0
  97. {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/README.md +0 -0
  98. {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  99. {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  100. {vgi_python-0.31.0 → vgi_python-0.31.2}/packages/vgi-fixtures/pyproject.toml +0 -0
  101. {vgi_python-0.31.0 → vgi_python-0.31.2}/scripts/measure_startup.py +0 -0
  102. {vgi_python-0.31.0 → vgi_python-0.31.2}/scripts/run_all_tests.sh +0 -0
  103. {vgi_python-0.31.0 → vgi_python-0.31.2}/test-data/generate.sh +0 -0
  104. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/__init__.py +0 -0
  105. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/_http_fixtures.py +0 -0
  106. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/__init__.py +0 -0
  107. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_attach_option.py +0 -0
  108. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_catalog_interface.py +0 -0
  109. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_client_catalog.py +0 -0
  110. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_column_statistics.py +0 -0
  111. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_declarative.py +0 -0
  112. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_example_worker_catalog.py +0 -0
  113. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_integration.py +0 -0
  114. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_required_filters.py +0 -0
  115. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_scan_branches.py +0 -0
  116. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_serialization.py +0 -0
  117. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_setting.py +0 -0
  118. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_storage.py +0 -0
  119. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_time_travel.py +0 -0
  120. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/catalog/test_writable_table.py +0 -0
  121. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/__init__.py +0 -0
  122. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_aggregate_client.py +0 -0
  123. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_batch_metadata_callback.py +0 -0
  124. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_broken_pipe.py +0 -0
  125. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_cli.py +0 -0
  126. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_cli_catalog_functions.py +0 -0
  127. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_copy_client.py +0 -0
  128. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_scan_branches_client.py +0 -0
  129. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_split_client.py +0 -0
  130. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_stop_force.py +0 -0
  131. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_table_column_statistics.py +0 -0
  132. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_time_travel_client.py +0 -0
  133. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/client/test_worker_debug.py +0 -0
  134. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/__init__.py +0 -0
  135. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/_stub.py +0 -0
  136. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/conftest.py +0 -0
  137. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_accumulate.py +0 -0
  138. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_aggregate.py +0 -0
  139. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_attach.py +0 -0
  140. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_bearer_auth.py +0 -0
  141. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_const_param_enforcement.py +0 -0
  142. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_container.py +0 -0
  143. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_copy_from.py +0 -0
  144. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_copy_to.py +0 -0
  145. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_directory_parity.py +0 -0
  146. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_function_inventory.py +0 -0
  147. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_github.py +0 -0
  148. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_http_client.py +0 -0
  149. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_http_external_location.py +0 -0
  150. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_http_upload_url.py +0 -0
  151. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_macro.py +0 -0
  152. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_overload.py +0 -0
  153. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_protocol_inventory.py +0 -0
  154. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_protocol_version.py +0 -0
  155. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_resumable_scan.py +0 -0
  156. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_scalar.py +0 -0
  157. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  158. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_secret.py +0 -0
  159. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_settings.py +0 -0
  160. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_splits.py +0 -0
  161. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_table.py +0 -0
  162. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_table_in_out.py +0 -0
  163. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_view.py +0 -0
  164. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conformance/test_writable.py +0 -0
  165. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/conftest.py +0 -0
  166. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  167. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  168. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  169. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/bad_version.bin +0 -0
  170. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/generate.py +0 -0
  171. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/manifest.json +0 -0
  172. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  173. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/stale_anchor.bin +0 -0
  174. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/truncated.bin +0 -0
  175. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/valid_sealed.bin +0 -0
  176. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  177. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/__init__.py +0 -0
  178. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_bernoulli_function.py +0 -0
  179. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_binary_packet_function.py +0 -0
  180. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_client.py +0 -0
  181. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_conditional_message_function.py +0 -0
  182. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_hash_seed_function.py +0 -0
  183. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  184. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_multiply_function.py +0 -0
  185. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_random_bytes_function.py +0 -0
  186. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/scalar/test_return_secret_value_function.py +0 -0
  187. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/__init__.py +0 -0
  188. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/__init__.py +0 -0
  189. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_constant_columns_function.py +0 -0
  190. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_double_sequence_function.py +0 -0
  191. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_exception_function.py +0 -0
  192. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_filter_echo_function.py +0 -0
  193. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_logging_function.py +0 -0
  194. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_nested_sequence_function.py +0 -0
  195. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_partitioned_function.py +0 -0
  196. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_projected_data_function.py +0 -0
  197. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_sequence_function.py +0 -0
  198. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_settings_function.py +0 -0
  199. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_struct_settings_function.py +0 -0
  200. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/generator/test_ten_thousand_function.py +0 -0
  201. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table/test_wide_columns.py +0 -0
  202. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/__init__.py +0 -0
  203. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/__init__.py +0 -0
  204. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  205. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_echo_function.py +0 -0
  206. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  207. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  208. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  209. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  210. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  211. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/test_blended_exchange.py +0 -0
  212. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/test_blended_metadata.py +0 -0
  213. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/table_in_out/test_client.py +0 -0
  214. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_access_log_audit.py +0 -0
  215. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_aggregate_function.py +0 -0
  216. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_argument_spec.py +0 -0
  217. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_auth.py +0 -0
  218. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_bind_exceptions.py +0 -0
  219. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_bind_request_at_clause.py +0 -0
  220. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_bound_storage_conformance.py +0 -0
  221. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_cache_control.py +0 -0
  222. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_call_state_attach.py +0 -0
  223. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_catalog_auth_binding.py +0 -0
  224. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_client_oauth.py +0 -0
  225. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_copy_from_function.py +0 -0
  226. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_copy_to_function.py +0 -0
  227. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_docstrings.py +0 -0
  228. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_documentation_examples.py +0 -0
  229. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_example_function_arg_types.py +0 -0
  230. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_examples_workers.py +0 -0
  231. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_exception_handling.py +0 -0
  232. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_exceptions.py +0 -0
  233. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_filter_pushdown.py +0 -0
  234. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_filter_pushdown_extension.py +0 -0
  235. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_fixture_catalog_parity.py +0 -0
  236. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage.py +0 -0
  237. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_azure_sql.py +0 -0
  238. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_cf_do.py +0 -0
  239. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_cf_do_integration.py +0 -0
  240. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_function_storage_conformance.py +0 -0
  241. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_constants.py +0 -0
  242. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_protocol_version.py +0 -0
  243. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_request_builders.py +0 -0
  244. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_schemas.py +0 -0
  245. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_cpp_secret.py +0 -0
  246. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_go_schemas.py +0 -0
  247. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_java_schemas.py +0 -0
  248. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_protocol_version.py +0 -0
  249. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_rust_request_builders.py +0 -0
  250. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_rust_schemas.py +0 -0
  251. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_schemas_cross_lang.py +0 -0
  252. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_ts_client.py +0 -0
  253. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_generated_ts_schemas.py +0 -0
  254. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_http_demo_storage.py +0 -0
  255. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_http_s3_offload_input.py +0 -0
  256. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_http_s3_offload_output.py +0 -0
  257. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_launch_transport.py +0 -0
  258. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_mypy_consolidated.py +0 -0
  259. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_nest_tensor.py +0 -0
  260. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_otel.py +0 -0
  261. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_projection_enforcement.py +0 -0
  262. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_projection_repro.py +0 -0
  263. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_protocol_classes.py +0 -0
  264. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_resolved_secrets.py +0 -0
  265. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_schema_scoped_functions.py +0 -0
  266. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_schema_utils.py +0 -0
  267. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_serve.py +0 -0
  268. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_signing_key.py +0 -0
  269. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_split_token.py +0 -0
  270. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_table_buffering_function.py +0 -0
  271. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_table_function_dynamic_to_string.py +0 -0
  272. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_tcp_transport.py +0 -0
  273. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_type_bounds.py +0 -0
  274. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_union_argument.py +0 -0
  275. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_wire_record_schema_parity.py +0 -0
  276. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_worker.py +0 -0
  277. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_worker_cli.py +0 -0
  278. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/test_worker_page.py +0 -0
  279. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/transactor/__init__.py +0 -0
  280. {vgi_python-0.31.0 → vgi_python-0.31.2}/tests/transactor/test_transactor.py +0 -0
  281. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/__init__.py +0 -0
  282. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_duckdb.py +0 -0
  283. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_storage_profile.py +0 -0
  284. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/__init__.py +0 -0
  285. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  286. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  287. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  288. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  289. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  290. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  291. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  292. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  293. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  294. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  295. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  296. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  297. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  298. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/aggregate/window.py +0 -0
  299. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/attach_options.py +0 -0
  300. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/bad_enum.py +0 -0
  301. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/bad_protocol.py +0 -0
  302. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/cancellable.py +0 -0
  303. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/catalog.py +0 -0
  304. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/companion.py +0 -0
  305. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/copy_from.py +0 -0
  306. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/copy_to.py +0 -0
  307. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/global_functions.py +0 -0
  308. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/http_server.py +0 -0
  309. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  310. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  311. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/nest_tensor.py +0 -0
  312. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  313. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  314. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  315. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  316. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/_common.py +0 -0
  317. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  318. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/binary.py +0 -0
  319. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  320. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/geo.py +0 -0
  321. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  322. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  323. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  324. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  325. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  326. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  327. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  328. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/simple_writable.py +0 -0
  329. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/__init__.py +0 -0
  330. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/_common.py +0 -0
  331. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/batch_index.py +0 -0
  332. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  333. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/cache.py +0 -0
  334. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  335. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/filters.py +0 -0
  336. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  337. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/make_series.py +0 -0
  338. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/misc.py +0 -0
  339. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/order_modes.py +0 -0
  340. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/pairs.py +0 -0
  341. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  342. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  343. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  344. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/required_filters.py +0 -0
  345. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  346. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  347. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/sequence.py +0 -0
  348. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/settings.py +0 -0
  349. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/splits.py +0 -0
  350. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  351. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  352. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  353. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/versioned.py +0 -0
  354. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table/wide.py +0 -0
  355. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table_in_out.py +0 -0
  356. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  357. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  358. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/versioned.py +0 -0
  359. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/versioned_tables.py +0 -0
  360. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/worker.py +0 -0
  361. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/__init__.py +0 -0
  362. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/generic.py +0 -0
  363. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/table.py +0 -0
  364. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/_test_fixtures/writable/worker.py +0 -0
  365. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/aggregate_function.py +0 -0
  366. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/argument_spec.py +0 -0
  367. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/arguments.py +0 -0
  368. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/attach_header.py +0 -0
  369. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/auth.py +0 -0
  370. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/cache_control.py +0 -0
  371. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/__init__.py +0 -0
  372. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/_descriptor_spec.py +0 -0
  373. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/attach_option.py +0 -0
  374. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/descriptors.py +0 -0
  375. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/duckdb_statistics.py +0 -0
  376. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/secret_type.py +0 -0
  377. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/setting.py +0 -0
  378. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/catalog/storage.py +0 -0
  379. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/__init__.py +0 -0
  380. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/aggregate.py +0 -0
  381. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/catalog_mixin.py +0 -0
  382. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli.py +0 -0
  383. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_catalog.py +0 -0
  384. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_schema.py +0 -0
  385. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_table.py +0 -0
  386. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_transaction.py +0 -0
  387. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_utils.py +0 -0
  388. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/cli_view.py +0 -0
  389. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/client/errors.py +0 -0
  390. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/__init__.py +0 -0
  391. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/_common.py +0 -0
  392. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_constants.py +0 -0
  393. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_protocol_version.py +0 -0
  394. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_request_builders.py +0 -0
  395. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_schemas.py +0 -0
  396. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  397. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  398. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/cpp_secret_schemas.py +0 -0
  399. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/go_schemas.py +0 -0
  400. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/java_schemas.py +0 -0
  401. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/protocol_version.py +0 -0
  402. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/rust_request_builders.py +0 -0
  403. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/rust_schemas.py +0 -0
  404. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/ts_client.py +0 -0
  405. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/codegen/ts_schemas.py +0 -0
  406. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/copy_from_function.py +0 -0
  407. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/copy_to_function.py +0 -0
  408. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/exceptions.py +0 -0
  409. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function.py +0 -0
  410. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function_storage.py +0 -0
  411. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function_storage_azure_sql.py +0 -0
  412. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/function_storage_cf_do.py +0 -0
  413. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/__init__.py +0 -0
  414. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/demo_storage.py +0 -0
  415. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/landing.html +0 -0
  416. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/landing_page.py +0 -0
  417. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/vgi-client.js +0 -0
  418. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/http/worker_page.py +0 -0
  419. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/invocation.py +0 -0
  420. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/logging_config.py +0 -0
  421. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/meta_worker.py +0 -0
  422. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/otel.py +0 -0
  423. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/profiling.py +0 -0
  424. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/protocol.py +0 -0
  425. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/protocol_version.txt +0 -0
  426. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/py.typed +0 -0
  427. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/scalar_function.py +0 -0
  428. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/schema_utils.py +0 -0
  429. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/secret_protocol.py +0 -0
  430. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/secret_service.py +0 -0
  431. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/serve.py +0 -0
  432. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/split_token.py +0 -0
  433. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_buffering_function.py +0 -0
  434. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_filter_pushdown.py +0 -0
  435. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_function.py +0 -0
  436. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/table_in_out_function.py +0 -0
  437. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/__init__.py +0 -0
  438. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/_duckdb_compat.py +0 -0
  439. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/client.py +0 -0
  440. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/protocol.py +0 -0
  441. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/transactor/server.py +0 -0
  442. {vgi_python-0.31.0 → vgi_python-0.31.2}/vgi/worker.py +0 -0
  443. {vgi_python-0.31.0 → vgi_python-0.31.2}/wrangler.jsonc +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.31.0
3
+ Version: 0.31.2
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.31.0"
3
+ version = "0.31.2"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -64,6 +64,32 @@ class TestResolveMetadata:
64
64
  assert meta.categories == ["transform", "utility"]
65
65
  assert meta.max_workers == 4
66
66
 
67
+ def test_comment_defaults_to_none(self) -> None:
68
+ """Meta.comment is unset by default -- unlike description, no docstring fallback."""
69
+
70
+ class UndocumentedCommentFunction(TableInOutFunction): # type: ignore[type-arg]
71
+ """A function with only a docstring, no Meta.comment."""
72
+
73
+ data: TableInput = Arg[TableInput](0, doc="Input table") # type: ignore[assignment]
74
+
75
+ meta = UndocumentedCommentFunction.get_metadata()
76
+ assert meta.comment is None
77
+
78
+ def test_function_with_comment(self) -> None:
79
+ """Meta.comment is a short operator-facing note, distinct from description."""
80
+
81
+ class DeprecatedFunction(TableInOutFunction): # type: ignore[type-arg]
82
+ class Meta:
83
+ name = "deprecated_func"
84
+ description = "Does the thing"
85
+ comment = "deprecated, use deprecated_func_v2 instead"
86
+
87
+ data: TableInput = Arg[TableInput](0, doc="Input table") # type: ignore[assignment]
88
+
89
+ meta = DeprecatedFunction.get_metadata()
90
+ assert meta.description == "Does the thing"
91
+ assert meta.comment == "deprecated, use deprecated_func_v2 instead"
92
+
67
93
  def test_name_auto_generation(self) -> None:
68
94
  """Function name is auto-generated from class name."""
69
95
 
@@ -727,3 +753,45 @@ class TestFunctionTags:
727
753
  }
728
754
  # Structured examples are carried separately from the tag-encoded ones.
729
755
  assert [ex.sql for ex in info.examples] == ["SELECT * FROM dynamic_table()"]
756
+
757
+ def test_comment_flows_into_function_info(self) -> None:
758
+ """Meta.comment reaches FunctionInfo.comment (the field every other catalog object already has)."""
759
+ from vgi.catalog.catalog_interface import (
760
+ FunctionInfo,
761
+ ReadOnlyCatalogInterface,
762
+ )
763
+ from vgi.table_function import ProcessParams, TableFunctionGenerator
764
+
765
+ class CommentedTable(TableFunctionGenerator): # type: ignore[type-arg]
766
+ class Meta:
767
+ name = "commented_table"
768
+ comment = "internal — do not call directly"
769
+
770
+ FIXED_SCHEMA = pa.schema([pa.field("id", pa.int64())])
771
+
772
+ @classmethod
773
+ def process(cls, params: ProcessParams[Any], state: None, out: OutputCollector) -> None:
774
+ out.emit(pa.record_batch({"id": [1]}))
775
+ out.finish()
776
+
777
+ class UncommentedTable(TableFunctionGenerator): # type: ignore[type-arg]
778
+ class Meta:
779
+ name = "uncommented_table"
780
+
781
+ FIXED_SCHEMA = pa.schema([pa.field("id", pa.int64())])
782
+
783
+ @classmethod
784
+ def process(cls, params: ProcessParams[Any], state: None, out: OutputCollector) -> None:
785
+ out.emit(pa.record_batch({"id": [1]}))
786
+ out.finish()
787
+
788
+ class Cat(ReadOnlyCatalogInterface):
789
+ catalog_name = "functions"
790
+ functions = [CommentedTable, UncommentedTable]
791
+
792
+ commented_info = Cat()._function_to_info(CommentedTable, "main")
793
+ assert isinstance(commented_info, FunctionInfo)
794
+ assert commented_info.comment == "internal — do not call directly"
795
+
796
+ uncommented_info = Cat()._function_to_info(UncommentedTable, "main")
797
+ assert uncommented_info.comment is None
@@ -237,6 +237,68 @@ class TestTableFunctionSettingAnnotations:
237
237
  assert "details" in table.schema.names # verbose mode adds details column
238
238
  assert table.column("greeting").to_pylist() == ["Hola", "Hola", "Hola"]
239
239
 
240
+ def test_secret_delivers_dict_of_scalars(self, fixture_worker: str) -> None:
241
+ """SecretDemoFunction (table function) receives a client-supplied secret.
242
+
243
+ Regression for `Client.table_function` hardcoding `secrets=None` on
244
+ the wire — the same `vgi_example` secret shape already proven to work
245
+ for `ReturnSecretValueFunction` (scalar) above, now exercised through
246
+ the table-function path instead.
247
+ """
248
+ from vgi.client import Client
249
+
250
+ # SecretDemoFunction resolves via `params.secrets.of_type("vgi_example")`
251
+ # (not the `Secret()`-annotation path `test_secret_delivers_dict_of_scalars`
252
+ # above uses), which filters on the secret payload's OWN `type` field —
253
+ # so, unlike that test's arbitrary `"type": "test"`, this one must be
254
+ # `"type": "vgi_example"` to match.
255
+ secret_value = {"type": "vgi_example", "provider": "config", "secret_string": "s3cr3t"}
256
+
257
+ with Client(fixture_worker) as client:
258
+ outputs = list(
259
+ client.table_function(
260
+ function_name="secret_demo",
261
+ schema_name="main",
262
+ secrets={"vgi_example": secret_value},
263
+ )
264
+ )
265
+
266
+ table = pa.Table.from_batches(outputs)
267
+ assert dict(zip(table.column("key").to_pylist(), table.column("value").to_pylist(), strict=True)) == {
268
+ "type": "vgi_example",
269
+ "provider": "config",
270
+ "secret_string": "s3cr3t",
271
+ }
272
+
273
+ def test_secret_delivers_to_table_in_out_function(self, fixture_worker: str) -> None:
274
+ """SecretInOutFunction receives a client-supplied secret.
275
+
276
+ Regression for `Client.table_in_out_function` hardcoding `secrets=None`
277
+ on the wire — the fixture (`secret_in_out`) already existed but had no
278
+ test exercising it end to end, which is exactly how the bug went
279
+ unnoticed.
280
+ """
281
+ from vgi.client import Client
282
+
283
+ # Same `of_type("vgi_example")` resolution as SecretDemoFunction above —
284
+ # the payload's own `type` field must equal the requested secret_type.
285
+ secret_value = {"type": "vgi_example", "provider": "config", "secret_string": "s3cr3t"}
286
+ batch = pa.RecordBatch.from_pydict({"n": [1, 2]})
287
+
288
+ with Client(fixture_worker) as client:
289
+ outputs = list(
290
+ client.table_in_out_function(
291
+ function_name="secret_in_out",
292
+ schema_name="main",
293
+ input=iter([batch]),
294
+ secrets={"vgi_example": secret_value},
295
+ )
296
+ )
297
+
298
+ table = pa.Table.from_batches(outputs)
299
+ assert table.column("n").to_pylist() == [1, 2]
300
+ assert table.column("secret_string").to_pylist() == ["s3cr3t", "s3cr3t"]
301
+
240
302
 
241
303
  # ---------------------------------------------------------------------------
242
304
  # Tests for auto-population of Meta.required_settings/required_secrets
@@ -2569,7 +2569,7 @@ requires-dist = [
2569
2569
 
2570
2570
  [[package]]
2571
2571
  name = "vgi-python"
2572
- version = "0.31.0"
2572
+ version = "0.31.2"
2573
2573
  source = { editable = "." }
2574
2574
  dependencies = [
2575
2575
  { name = "click" },
@@ -37,6 +37,10 @@ class MultiplyFunction(ScalarFunction):
37
37
 
38
38
  name = "multiply"
39
39
  description = "Multiplies a value by a constant factor"
40
+ # Meta.comment fixture: a short operator-facing note distinct from
41
+ # `description` — exercised by test_multiply_function_comment and
42
+ # the C++ integration test function_arguments.test.
43
+ comment = "fixture function for scalar bind-parameter tests"
40
44
  examples = [
41
45
  FunctionExample(
42
46
  sql="SELECT multiply(price, 2) FROM products",
@@ -649,8 +649,11 @@ class FunctionInfo(CatalogSchemaObject, ArrowSerializableDataclass):
649
649
  null_handling: Scalar function behavior field (None for non-scalar
650
650
  functions).
651
651
  description: Intrinsic documentation from function metadata
652
- (``Meta.description``). The user-settable ``comment`` (via COMMENT ON
653
- FUNCTION) is inherited from the base object.
652
+ (``Meta.description``). ``comment`` (inherited from the base
653
+ object) is a separate, shorter operator-facing note from
654
+ ``Meta.comment`` — e.g. "deprecated, use v2". Both are static:
655
+ there is no ``COMMENT ON FUNCTION`` RPC, unlike tables/views,
656
+ whose ``comment`` is dynamically settable.
654
657
  examples: Usage examples for the function.
655
658
  categories: Category labels for the function.
656
659
  projection_pushdown: Table-function capability (None for scalar
@@ -3389,7 +3392,7 @@ class ReadOnlyCatalogInterface(CatalogInterface):
3389
3392
  function_type=func_type,
3390
3393
  arguments=args_bytes,
3391
3394
  output_schema=output_bytes,
3392
- comment=None, # Functions don't use comment; use description instead
3395
+ comment=meta.comment, # Static, Meta-declared only see Meta.comment
3393
3396
  tags=meta.tags,
3394
3397
  # Scalar/aggregate function behavior fields
3395
3398
  stability=meta.stability if is_scalar else None,
@@ -2014,6 +2014,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2014
2014
  projection_ids: list[int] | None = None,
2015
2015
  pushdown_filters: bytes | None = None,
2016
2016
  settings: dict[str, Any] | None = None,
2017
+ secrets: dict[str, Any] | None = None,
2017
2018
  transaction_opaque_data: bytes | None = None,
2018
2019
  parent_row_callback: Callable[[list[int]], None] | None = None,
2019
2020
  has_finalize: bool = True,
@@ -2043,6 +2044,8 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2043
2044
  to push down to the function.
2044
2045
  settings: Optional dictionary of settings/pragmas to
2045
2046
  pass to the function.
2047
+ secrets: Optional dictionary of secret name to value pairs.
2048
+ Values can be simple scalars or dicts (for struct-typed secrets).
2046
2049
  transaction_opaque_data: Optional unique identifier for the DuckDB transaction.
2047
2050
  parent_row_callback: Optional callback invoked once per yielded
2048
2051
  output batch (before finalize), immediately before the yield,
@@ -2108,7 +2111,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2108
2111
  function_type=FunctionType.TABLE,
2109
2112
  input_schema=input_schema,
2110
2113
  settings=settings,
2111
- secrets=None,
2114
+ secrets=secrets,
2112
2115
  transaction_opaque_data=transaction_opaque_data,
2113
2116
  projection_ids=projection_ids,
2114
2117
  pushdown_filters_batch=pushdown_filters_batch,
@@ -2173,6 +2176,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2173
2176
  projection_ids: list[int] | None = None,
2174
2177
  pushdown_filters: bytes | None = None,
2175
2178
  settings: dict[str, Any] | None = None,
2179
+ secrets: dict[str, Any] | None = None,
2176
2180
  transaction_opaque_data: bytes | None = None,
2177
2181
  copy_to: CopyToContext | None = None,
2178
2182
  input_schema: pa.Schema | None = None,
@@ -2215,6 +2219,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2215
2219
  projection_ids: Optional column indices for projection.
2216
2220
  pushdown_filters: Optional serialized filter predicates.
2217
2221
  settings: Optional settings/pragmas to pass to the function.
2222
+ secrets: Optional dictionary of secret name to value pairs.
2218
2223
  transaction_opaque_data: Optional DuckDB transaction identifier.
2219
2224
  copy_to: Optional [`CopyToContext`][] marking this sink as a
2220
2225
  ``COPY ... TO`` write. A ``CopyToFunction`` returns no finalize
@@ -2261,7 +2266,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2261
2266
  function_type=FunctionType.TABLE_BUFFERING,
2262
2267
  input_schema=input_schema,
2263
2268
  settings=settings,
2264
- secrets=None,
2269
+ secrets=secrets,
2265
2270
  transaction_opaque_data=transaction_opaque_data,
2266
2271
  copy_to=copy_to,
2267
2272
  )
@@ -2422,6 +2427,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2422
2427
  projection_ids: list[int] | None = None,
2423
2428
  pushdown_filters: bytes | None = None,
2424
2429
  settings: dict[str, Any] | None = None,
2430
+ secrets: dict[str, Any] | None = None,
2425
2431
  transaction_opaque_data: bytes | None = None,
2426
2432
  target_split_bytes: int | None = None,
2427
2433
  min_splits: int | None = None,
@@ -2460,6 +2466,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2460
2466
  pushdown_filters: Optional byte string of filter predicates,
2461
2467
  same wire format as :meth:`table_function`'s.
2462
2468
  settings: Optional dictionary of settings/pragmas.
2469
+ secrets: Optional dictionary of secret name to value pairs.
2463
2470
  transaction_opaque_data: Optional transaction identifier.
2464
2471
  target_split_bytes: Requested split size — the primary sizing
2465
2472
  lever; the client can't see per-split cost and will treat
@@ -2499,7 +2506,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2499
2506
  arguments=arguments,
2500
2507
  function_type=FunctionType.TABLE,
2501
2508
  settings=settings,
2502
- secrets=None,
2509
+ secrets=secrets,
2503
2510
  transaction_opaque_data=transaction_opaque_data,
2504
2511
  )
2505
2512
  bind_response = self._do_bind(self._primary.proxy, bind_request, None)
@@ -2542,6 +2549,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2542
2549
  projection_ids: list[int] | None = None,
2543
2550
  pushdown_filters: bytes | None = None,
2544
2551
  settings: dict[str, Any] | None = None,
2552
+ secrets: dict[str, Any] | None = None,
2545
2553
  transaction_opaque_data: bytes | None = None,
2546
2554
  copy_from: CopyFromContext | None = None,
2547
2555
  split_tokens: list[bytes] | None = None,
@@ -2577,6 +2585,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2577
2585
  to push down to the function.
2578
2586
  settings: Optional dictionary of settings/pragmas to
2579
2587
  pass to the function.
2588
+ secrets: Optional dictionary of secret name to value pairs.
2580
2589
  transaction_opaque_data: Optional unique identifier for the DuckDB transaction.
2581
2590
  copy_from: Optional [`CopyFromContext`][] marking this scan as a
2582
2591
  ``COPY ... FROM`` read. Prefer :meth:`copy_from`, which builds
@@ -2640,7 +2649,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2640
2649
  function_type=FunctionType.TABLE,
2641
2650
  input_schema=None,
2642
2651
  settings=settings,
2643
- secrets=None,
2652
+ secrets=secrets,
2644
2653
  transaction_opaque_data=transaction_opaque_data,
2645
2654
  projection_ids=projection_ids,
2646
2655
  pushdown_filters_batch=pushdown_filters_batch,
@@ -2678,6 +2687,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2678
2687
  projection_ids: list[int] | None = None,
2679
2688
  pushdown_filters: bytes | None = None,
2680
2689
  settings: dict[str, Any] | None = None,
2690
+ secrets: dict[str, Any] | None = None,
2681
2691
  transaction_opaque_data: bytes | None = None,
2682
2692
  resume_token: bytes | None = None,
2683
2693
  ) -> ResumableTableScan:
@@ -2703,6 +2713,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2703
2713
  pushdown). ``None`` selects all columns.
2704
2714
  pushdown_filters: Optional serialized filter-pushdown payload.
2705
2715
  settings: Optional DuckDB settings to apply for the scan.
2716
+ secrets: Optional dictionary of secret name to value pairs.
2706
2717
  transaction_opaque_data: Optional catalog transaction handle.
2707
2718
  resume_token: Continuation token from a prior batch to resume from;
2708
2719
  must be paired with the same ``function_name``/projection/
@@ -2737,7 +2748,7 @@ class Client(CatalogClientMixin, AggregateClientMixin):
2737
2748
  function_type=FunctionType.TABLE,
2738
2749
  input_schema=None,
2739
2750
  settings=settings,
2740
- secrets=None,
2751
+ secrets=secrets,
2741
2752
  transaction_opaque_data=transaction_opaque_data,
2742
2753
  )
2743
2754
  bind_response = self._do_bind(self._primary.proxy, bind_request, None)
@@ -360,6 +360,12 @@ class ResolvedMetadata:
360
360
  function_type: The [`CatalogFunctionType`][] (scalar, table, aggregate,
361
361
  or table-buffering).
362
362
  description: Human-readable description of the function.
363
+ comment: Short operator-facing note (e.g. "deprecated, use v2" or
364
+ "internal — do not call directly"), distinct from `description`'s
365
+ intrinsic documentation. Mirrors the `comment` every other catalog
366
+ object (table/view/schema) already carries — functions only had
367
+ `description` until now. Static (Meta-declared) only; there is no
368
+ `COMMENT ON FUNCTION` RPC to change it at runtime.
363
369
  examples: SQL usage examples for the function.
364
370
  categories: Classification/category labels.
365
371
  tags: Free-form key/value metadata tags.
@@ -430,6 +436,7 @@ class ResolvedMetadata:
430
436
 
431
437
  # Documentation
432
438
  description: str = ""
439
+ comment: str | None = None
433
440
  examples: list[FunctionExample] = field(default_factory=list)
434
441
  categories: list[str] = field(default_factory=list)
435
442
  tags: dict[str, str] = field(default_factory=dict)
@@ -518,6 +525,7 @@ class ResolvedMetadata:
518
525
  "class_name": self.class_name,
519
526
  "function_type": self.function_type.name,
520
527
  "description": self.description,
528
+ "comment": self.comment,
521
529
  "examples": [ex.to_dict() for ex in self.examples],
522
530
  "categories": self.categories,
523
531
  "tags": self.tags,
@@ -558,6 +566,7 @@ class ResolvedMetadata:
558
566
  class_name=d["class_name"],
559
567
  function_type=CatalogFunctionType[d["function_type"]],
560
568
  description=d.get("description", ""),
569
+ comment=d.get("comment"),
561
570
  examples=[FunctionExample.from_dict(ex) for ex in d.get("examples", [])],
562
571
  categories=d.get("categories", []),
563
572
  tags=dict(d.get("tags", {})),
@@ -962,6 +971,7 @@ _VALID_META_ATTRIBUTES: frozenset[str] = frozenset(
962
971
  # Common
963
972
  "name",
964
973
  "description",
974
+ "comment",
965
975
  "examples",
966
976
  "categories",
967
977
  "tags",
@@ -1135,6 +1145,10 @@ def resolve_metadata(cls: type) -> ResolvedMetadata:
1135
1145
  if not description and cls.__doc__:
1136
1146
  description = cls.__doc__.strip().split("\n")[0]
1137
1147
 
1148
+ # comment has no docstring fallback (unlike description) — it's a
1149
+ # deliberate operator-facing opt-in, not something to infer.
1150
+ comment = attrs.get("comment")
1151
+
1138
1152
  # Normalize examples
1139
1153
  examples = _normalize_examples(attrs.get("examples", []))
1140
1154
 
@@ -1223,6 +1237,7 @@ def resolve_metadata(cls: type) -> ResolvedMetadata:
1223
1237
  class_name=class_name,
1224
1238
  function_type=function_type,
1225
1239
  description=description,
1240
+ comment=comment,
1226
1241
  examples=examples,
1227
1242
  categories=attrs.get("categories", []),
1228
1243
  tags=dict(attrs.get("tags", {})),
@@ -1399,6 +1414,7 @@ _METADATA_SCHEMA = pa.schema(
1399
1414
  pa.field("class_name", pa.string()),
1400
1415
  pa.field("function_type", pa.string()),
1401
1416
  pa.field("description", pa.string()),
1417
+ pa.field("comment", pa.string(), nullable=True),
1402
1418
  pa.field("examples", pa.list_(_EXAMPLE_STRUCT)),
1403
1419
  pa.field("categories", pa.list_(pa.string())),
1404
1420
  pa.field("tags", pa.map_(pa.string(), pa.string())),
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes