vgi-python 0.38.1__tar.gz → 0.40.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 (684) hide show
  1. {vgi_python-0.38.1 → vgi_python-0.40.0}/.github/dependabot.yml +8 -0
  2. {vgi_python-0.38.1 → vgi_python-0.40.0}/.github/workflows/ci.yml +26 -5
  3. {vgi_python-0.38.1 → vgi_python-0.40.0}/.github/workflows/docs.yml +1 -1
  4. {vgi_python-0.38.1 → vgi_python-0.40.0}/.github/workflows/integration.yml +1 -1
  5. {vgi_python-0.38.1 → vgi_python-0.40.0}/.github/workflows/release.yml +1 -1
  6. {vgi_python-0.38.1 → vgi_python-0.40.0}/CLAUDE.md +43 -4
  7. {vgi_python-0.38.1 → vgi_python-0.40.0}/PKG-INFO +5 -5
  8. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/auth.md +3 -2
  9. vgi_python-0.40.0/docs/api/worker.md +99 -0
  10. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/catalog-interface.md +75 -0
  11. {vgi_python-0.38.1 → vgi_python-0.40.0}/packages/vgi-fixtures/pyproject.toml +3 -1
  12. {vgi_python-0.38.1 → vgi_python-0.40.0}/pyproject.toml +11 -5
  13. vgi_python-0.40.0/scripts/hosted_protocols_conformance.sh +75 -0
  14. {vgi_python-0.38.1 → vgi_python-0.40.0}/scripts/regen_generated.py +28 -2
  15. vgi_python-0.40.0/tests/_hosted_protocols_worker.py +75 -0
  16. vgi_python-0.40.0/tests/catalog/test_catalog_contents.py +537 -0
  17. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_serialization.py +2 -1
  18. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_setting.py +4 -4
  19. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_directory_parity.py +0 -7
  20. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_protocol_inventory.py +1 -0
  21. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_protocol_version.py +3 -3
  22. vgi_python-0.40.0/tests/table_in_out/test_table_buffering_empty_input.py +53 -0
  23. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_filter_v2.py +71 -0
  24. vgi_python-0.40.0/tests/test_generated_csharp.py +111 -0
  25. vgi_python-0.40.0/tests/test_generated_go_types.py +134 -0
  26. vgi_python-0.40.0/tests/test_generated_java_types.py +148 -0
  27. vgi_python-0.40.0/tests/test_generated_rust_types.py +117 -0
  28. vgi_python-0.40.0/tests/test_generated_ts_types.py +103 -0
  29. vgi_python-0.40.0/tests/test_hosted_protocols.py +477 -0
  30. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_schema_scoped_functions.py +37 -0
  31. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_serve.py +6 -16
  32. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_worker.py +2 -2
  33. {vgi_python-0.38.1 → vgi_python-0.40.0}/uv.lock +325 -323
  34. vgi_python-0.40.0/vgi/_test_fixtures/catalog_contents.py +336 -0
  35. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/http_server.py +30 -8
  36. vgi_python-0.40.0/vgi/_test_fixtures/identity_fixture.py +75 -0
  37. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/geo.py +12 -12
  38. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/worker.py +21 -3
  39. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/__init__.py +4 -0
  40. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/catalog_interface.py +148 -0
  41. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/__init__.py +2 -1
  42. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/catalog_mixin.py +67 -0
  43. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/_common.py +6 -0
  44. vgi_python-0.40.0/vgi/codegen/csharp_schemas.py +203 -0
  45. vgi_python-0.40.0/vgi/codegen/csharp_types.py +694 -0
  46. vgi_python-0.40.0/vgi/codegen/go_types.py +345 -0
  47. vgi_python-0.40.0/vgi/codegen/java_types.py +348 -0
  48. vgi_python-0.40.0/vgi/codegen/rust_types.py +315 -0
  49. vgi_python-0.40.0/vgi/codegen/ts_types.py +361 -0
  50. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/copy_from_function.py +3 -5
  51. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/filter_v2.py +16 -5
  52. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/meta_worker.py +86 -6
  53. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/protocol.py +106 -3
  54. vgi_python-0.40.0/vgi/protocol_version.txt +1 -0
  55. vgi_python-0.40.0/vgi/rpc_server.py +287 -0
  56. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/serve.py +11 -119
  57. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/table_buffering_function.py +1 -0
  58. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/table_in_out_function.py +1 -0
  59. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/worker.py +255 -22
  60. vgi_python-0.38.1/docs/api/worker.md +0 -23
  61. vgi_python-0.38.1/vgi/protocol_version.txt +0 -1
  62. {vgi_python-0.38.1 → vgi_python-0.40.0}/.dockerignore +0 -0
  63. {vgi_python-0.38.1 → vgi_python-0.40.0}/.gitattributes +0 -0
  64. {vgi_python-0.38.1 → vgi_python-0.40.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  65. {vgi_python-0.38.1 → vgi_python-0.40.0}/.github/workflows/tailnet-integration.yml +0 -0
  66. {vgi_python-0.38.1 → vgi_python-0.40.0}/.gitignore +0 -0
  67. {vgi_python-0.38.1 → vgi_python-0.40.0}/.python-version +0 -0
  68. {vgi_python-0.38.1 → vgi_python-0.40.0}/.vale.ini +0 -0
  69. {vgi_python-0.38.1 → vgi_python-0.40.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  70. {vgi_python-0.38.1 → vgi_python-0.40.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  71. {vgi_python-0.38.1 → vgi_python-0.40.0}/DOCS_USABILITY_TEST.md +0 -0
  72. {vgi_python-0.38.1 → vgi_python-0.40.0}/LICENSE +0 -0
  73. {vgi_python-0.38.1 → vgi_python-0.40.0}/PROTOCOL.md +0 -0
  74. {vgi_python-0.38.1 → vgi_python-0.40.0}/README.md +0 -0
  75. {vgi_python-0.38.1 → vgi_python-0.40.0}/RELEASE-RUNBOOK.md +0 -0
  76. {vgi_python-0.38.1 → vgi_python-0.40.0}/SECURITY.md +0 -0
  77. {vgi_python-0.38.1 → vgi_python-0.40.0}/ci/README.md +0 -0
  78. {vgi_python-0.38.1 → vgi_python-0.40.0}/ci/preprocess-require.awk +0 -0
  79. {vgi_python-0.38.1 → vgi_python-0.40.0}/ci/run-integration.sh +0 -0
  80. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/README.md +0 -0
  81. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  82. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  83. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  84. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  85. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  86. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  87. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  88. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  89. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  90. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
  91. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  92. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  93. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  94. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  95. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
  96. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/generate_runtime.py +0 -0
  97. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/manifest.json +0 -0
  98. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/run_worker.py +0 -0
  99. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  100. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  101. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  102. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  103. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  104. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  105. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  106. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  107. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  108. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  109. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  110. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  111. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  112. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  113. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  114. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  115. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  116. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  117. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  118. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  119. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  120. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  121. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  122. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  123. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  124. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  125. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  126. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  127. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  128. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  129. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  130. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  131. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  132. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  133. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  134. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  135. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  136. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  137. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  138. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  139. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  140. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  141. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  142. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  143. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  144. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  145. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  146. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  147. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  148. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  149. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  150. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  151. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  152. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  153. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  154. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  155. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  156. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  157. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  158. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  159. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  160. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  161. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  162. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  163. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  164. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  165. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  166. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  167. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  168. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  169. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  170. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  171. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  172. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  173. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  174. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  175. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  176. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  177. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  178. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  179. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  180. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  181. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  182. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  183. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  184. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  185. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  186. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  187. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  188. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  189. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  190. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  191. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  192. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  193. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  194. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  195. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  196. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  197. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  198. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  199. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  200. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  201. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  202. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  203. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  204. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  205. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  206. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  207. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  208. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  209. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  210. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  211. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  212. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  213. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  214. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  215. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  216. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  217. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  218. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  219. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  220. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  221. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  222. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  223. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  224. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  225. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  226. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  227. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  228. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  229. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  230. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  231. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  232. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  233. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  234. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  235. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  236. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  237. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  238. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  239. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  240. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  241. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  242. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  243. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  244. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  245. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  246. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  247. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  248. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  249. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  250. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  251. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  252. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  253. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  254. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  255. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  256. {vgi_python-0.38.1 → vgi_python-0.40.0}/conformance/filter-v2/runtime-manifest.json +0 -0
  257. {vgi_python-0.38.1 → vgi_python-0.40.0}/dist-vgi/.gitignore +0 -0
  258. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/aggregate-functions.md +0 -0
  259. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/arguments.md +0 -0
  260. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/catalogs.md +0 -0
  261. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/client.md +0 -0
  262. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/exceptions.md +0 -0
  263. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/filters.md +0 -0
  264. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/functions.md +0 -0
  265. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/http.md +0 -0
  266. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/index.md +0 -0
  267. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/metadata.md +0 -0
  268. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/observability.md +0 -0
  269. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/storage.md +0 -0
  270. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/api/transactor.md +0 -0
  271. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/argument-serialization.md +0 -0
  272. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/apple-touch-icon.png +0 -0
  273. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/favicon-16x16.png +0 -0
  274. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/favicon-32x32.png +0 -0
  275. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/favicon.ico +0 -0
  276. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/kinds/aggregate.svg +0 -0
  277. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/kinds/buffering.svg +0 -0
  278. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/kinds/scalar.svg +0 -0
  279. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/kinds/table-in-out.svg +0 -0
  280. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/kinds/table.svg +0 -0
  281. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/logo.png +0 -0
  282. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/social-card.png +0 -0
  283. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/assets/video-thumbnail.jpg +0 -0
  284. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/authentication.md +0 -0
  285. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/cli.md +0 -0
  286. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/column-statistics.md +0 -0
  287. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/concepts/index.md +0 -0
  288. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/contributing-docs.md +0 -0
  289. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/filter-pushdown.md +0 -0
  290. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/generator-api.md +0 -0
  291. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/global-functions.md +0 -0
  292. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/catalogs.md +0 -0
  293. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/function-patterns.md +0 -0
  294. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/http-auth.md +0 -0
  295. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/index.md +0 -0
  296. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/iroh.md +0 -0
  297. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  298. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/state-storage.md +0 -0
  299. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/how-to/tailnet.md +0 -0
  300. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/index.md +0 -0
  301. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/lifecycle.md +0 -0
  302. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/metadata.md +0 -0
  303. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/overrides/main.html +0 -0
  304. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/protocol/index.md +0 -0
  305. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  306. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  307. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  308. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  309. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  310. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/robots.txt +0 -0
  311. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/shared-storage.md +0 -0
  312. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/stylesheets/extra.css +0 -0
  313. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/tutorial/index.md +0 -0
  314. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/tutorial/scalar.md +0 -0
  315. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/tutorial/table.md +0 -0
  316. {vgi_python-0.38.1 → vgi_python-0.40.0}/docs/vgi-logo.png +0 -0
  317. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/batch_index_worker.py +0 -0
  318. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/cache_worker.py +0 -0
  319. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/calc_scalar_worker.py +0 -0
  320. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/calc_worker.py +0 -0
  321. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/copy_format_worker.py +0 -0
  322. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/filter_worker.py +0 -0
  323. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/greeting_scalar_worker.py +0 -0
  324. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/row_count_worker.py +0 -0
  325. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/series_streaming_worker.py +0 -0
  326. {vgi_python-0.38.1 → vgi_python-0.40.0}/examples/sum_worker.py +0 -0
  327. {vgi_python-0.38.1 → vgi_python-0.40.0}/identity.png +0 -0
  328. {vgi_python-0.38.1 → vgi_python-0.40.0}/mkdocs.yml +0 -0
  329. {vgi_python-0.38.1 → vgi_python-0.40.0}/packages/vgi-fixtures/LICENSE +0 -0
  330. {vgi_python-0.38.1 → vgi_python-0.40.0}/packages/vgi-fixtures/README.md +0 -0
  331. {vgi_python-0.38.1 → vgi_python-0.40.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  332. {vgi_python-0.38.1 → vgi_python-0.40.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  333. {vgi_python-0.38.1 → vgi_python-0.40.0}/scripts/measure_startup.py +0 -0
  334. {vgi_python-0.38.1 → vgi_python-0.40.0}/scripts/run_all_tests.sh +0 -0
  335. {vgi_python-0.38.1 → vgi_python-0.40.0}/test-data/generate.sh +0 -0
  336. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/__init__.py +0 -0
  337. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/_http_fixtures.py +0 -0
  338. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/__init__.py +0 -0
  339. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_attach_option.py +0 -0
  340. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_catalog_interface.py +0 -0
  341. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_client_catalog.py +0 -0
  342. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_column_statistics.py +0 -0
  343. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_declarative.py +0 -0
  344. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  345. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_integration.py +0 -0
  346. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_required_filters.py +0 -0
  347. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_scan_branches.py +0 -0
  348. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_storage.py +0 -0
  349. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_time_travel.py +0 -0
  350. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/catalog/test_writable_table.py +0 -0
  351. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/__init__.py +0 -0
  352. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_aggregate_client.py +0 -0
  353. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_batch_metadata_callback.py +0 -0
  354. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_bind_and_join_keys.py +0 -0
  355. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_broken_pipe.py +0 -0
  356. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_cli.py +0 -0
  357. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_cli_catalog_functions.py +0 -0
  358. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_copy_client.py +0 -0
  359. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_http_response_budget.py +0 -0
  360. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_iroh_client.py +0 -0
  361. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_scan_branches_client.py +0 -0
  362. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_split_client.py +0 -0
  363. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_stop_force.py +0 -0
  364. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_table_column_statistics.py +0 -0
  365. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_time_travel_client.py +0 -0
  366. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/client/test_worker_debug.py +0 -0
  367. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/__init__.py +0 -0
  368. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/_stub.py +0 -0
  369. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/conftest.py +0 -0
  370. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_accumulate.py +0 -0
  371. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_aggregate.py +0 -0
  372. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_attach.py +0 -0
  373. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_bearer_auth.py +0 -0
  374. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  375. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_container.py +0 -0
  376. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_copy_from.py +0 -0
  377. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_copy_to.py +0 -0
  378. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_function_inventory.py +0 -0
  379. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_github.py +0 -0
  380. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_http_client.py +0 -0
  381. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_http_external_location.py +0 -0
  382. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_http_upload_url.py +0 -0
  383. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_macro.py +0 -0
  384. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_overload.py +0 -0
  385. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_resumable_scan.py +0 -0
  386. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_scalar.py +0 -0
  387. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  388. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_secret.py +0 -0
  389. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_settings.py +0 -0
  390. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_splits.py +0 -0
  391. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_table.py +0 -0
  392. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_table_in_out.py +0 -0
  393. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_view.py +0 -0
  394. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conformance/test_writable.py +0 -0
  395. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/conftest.py +0 -0
  396. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  397. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  398. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  399. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/bad_version.bin +0 -0
  400. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/generate.py +0 -0
  401. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/manifest.json +0 -0
  402. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  403. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
  404. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/truncated.bin +0 -0
  405. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
  406. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  407. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/__init__.py +0 -0
  408. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_bernoulli_function.py +0 -0
  409. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_binary_packet_function.py +0 -0
  410. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_client.py +0 -0
  411. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_conditional_message_function.py +0 -0
  412. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_hash_seed_function.py +0 -0
  413. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  414. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_multiply_function.py +0 -0
  415. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_random_bytes_function.py +0 -0
  416. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  417. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/__init__.py +0 -0
  418. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/__init__.py +0 -0
  419. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  420. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  421. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_exception_function.py +0 -0
  422. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  423. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_logging_function.py +0 -0
  424. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  425. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_partitioned_function.py +0 -0
  426. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_projected_data_function.py +0 -0
  427. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_sequence_function.py +0 -0
  428. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_settings_function.py +0 -0
  429. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  430. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  431. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table/test_wide_columns.py +0 -0
  432. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/__init__.py +0 -0
  433. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/__init__.py +0 -0
  434. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  435. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  436. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  437. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  438. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  439. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  440. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  441. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/test_blended_exchange.py +0 -0
  442. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/test_blended_metadata.py +0 -0
  443. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/table_in_out/test_client.py +0 -0
  444. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/tailnet/Dockerfile +0 -0
  445. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/tailnet/__init__.py +0 -0
  446. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/tailnet/compose.yaml +0 -0
  447. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/tailnet/probe.py +0 -0
  448. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/tailnet/run.sh +0 -0
  449. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/tailnet/test_worker.py +0 -0
  450. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/tailnet/worker.py +0 -0
  451. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_access_log_audit.py +0 -0
  452. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_aggregate_function.py +0 -0
  453. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_argument_spec.py +0 -0
  454. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_auth.py +0 -0
  455. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_bind_exceptions.py +0 -0
  456. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_bind_request_at_clause.py +0 -0
  457. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_bound_storage_conformance.py +0 -0
  458. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_cache_control.py +0 -0
  459. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_call_state_attach.py +0 -0
  460. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_catalog_auth_binding.py +0 -0
  461. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_client_oauth.py +0 -0
  462. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_codegen_request_inventory.py +0 -0
  463. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_copy_from_function.py +0 -0
  464. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_copy_to_function.py +0 -0
  465. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_docstrings.py +0 -0
  466. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_documentation_examples.py +0 -0
  467. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_dynamic_filter_http_turns.py +0 -0
  468. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_example_function_arg_types.py +0 -0
  469. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_examples_workers.py +0 -0
  470. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_exception_handling.py +0 -0
  471. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_exceptions.py +0 -0
  472. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_filter_pushdown.py +0 -0
  473. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_filter_pushdown_extension.py +0 -0
  474. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_filter_v2_builder.py +0 -0
  475. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
  476. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_filter_v2_spec_schema.py +0 -0
  477. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_fixture_catalog_parity.py +0 -0
  478. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_function_shape_mismatch.py +0 -0
  479. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_function_storage.py +0 -0
  480. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_function_storage_azure_sql.py +0 -0
  481. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_function_storage_cf_do.py +0 -0
  482. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  483. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_function_storage_conformance.py +0 -0
  484. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_cpp_constants.py +0 -0
  485. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_cpp_protocol_name.py +0 -0
  486. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  487. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_cpp_request_builders.py +0 -0
  488. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_cpp_schemas.py +0 -0
  489. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_cpp_secret.py +0 -0
  490. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_go_schemas.py +0 -0
  491. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_java_schemas.py +0 -0
  492. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_protocol_version.py +0 -0
  493. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_rust_request_builders.py +0 -0
  494. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_rust_schemas.py +0 -0
  495. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  496. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_ts_client.py +0 -0
  497. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_generated_ts_schemas.py +0 -0
  498. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_http_demo_storage.py +0 -0
  499. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_http_s3_offload_input.py +0 -0
  500. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_http_s3_offload_output.py +0 -0
  501. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_import_side_effects.py +0 -0
  502. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_landing_discovery.py +0 -0
  503. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_launch_transport.py +0 -0
  504. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_metadata.py +0 -0
  505. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_mypy_consolidated.py +0 -0
  506. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_nest_tensor.py +0 -0
  507. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_otel.py +0 -0
  508. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_projection_enforcement.py +0 -0
  509. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_projection_repro.py +0 -0
  510. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_protocol_classes.py +0 -0
  511. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_resolved_secrets.py +0 -0
  512. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_schema_paths_v2.py +0 -0
  513. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_schema_utils.py +0 -0
  514. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_setting_secret_annotations.py +0 -0
  515. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_signing_key.py +0 -0
  516. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_split_token.py +0 -0
  517. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_subprocess_transport.py +0 -0
  518. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_table_buffering_function.py +0 -0
  519. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  520. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_tcp_transport.py +0 -0
  521. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_type_bounds.py +0 -0
  522. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_union_argument.py +0 -0
  523. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_wire_record_schema_parity.py +0 -0
  524. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_worker_cli.py +0 -0
  525. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_worker_page.py +0 -0
  526. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/test_write_results.py +0 -0
  527. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/transactor/__init__.py +0 -0
  528. {vgi_python-0.38.1 → vgi_python-0.40.0}/tests/transactor/test_transactor.py +0 -0
  529. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/__init__.py +0 -0
  530. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_duckdb.py +0 -0
  531. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_storage_profile.py +0 -0
  532. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/__init__.py +0 -0
  533. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  534. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  535. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  536. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  537. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  538. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  539. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  540. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  541. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  542. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  543. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  544. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  545. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  546. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  547. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/attach_options.py +0 -0
  548. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  549. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  550. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/cancellable.py +0 -0
  551. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/catalog.py +0 -0
  552. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/companion.py +0 -0
  553. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/copy_from.py +0 -0
  554. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/copy_to.py +0 -0
  555. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/global_functions.py +0 -0
  556. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  557. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  558. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  559. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  560. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  561. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  562. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  563. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  564. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  565. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  566. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  567. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  568. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  569. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  570. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  571. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  572. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  573. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  574. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  575. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/secret_cache.py +0 -0
  576. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  577. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  578. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/_common.py +0 -0
  579. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  580. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  581. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/cache.py +0 -0
  582. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  583. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/filters.py +0 -0
  584. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  585. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  586. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/misc.py +0 -0
  587. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  588. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  589. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  590. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  591. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  592. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  593. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  594. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  595. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  596. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/settings.py +0 -0
  597. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/splits.py +0 -0
  598. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  599. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  600. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  601. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  602. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table/wide.py +0 -0
  603. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table_in_out.py +0 -0
  604. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  605. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  606. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/versioned.py +0 -0
  607. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  608. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  609. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  610. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/writable/table.py +0 -0
  611. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  612. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/aggregate_function.py +0 -0
  613. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/argument_spec.py +0 -0
  614. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/arguments.py +0 -0
  615. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/attach_header.py +0 -0
  616. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/auth.py +0 -0
  617. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/cache_control.py +0 -0
  618. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/_descriptor_spec.py +0 -0
  619. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/attach_option.py +0 -0
  620. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/descriptors.py +0 -0
  621. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/duckdb_statistics.py +0 -0
  622. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/secret_type.py +0 -0
  623. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/setting.py +0 -0
  624. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/catalog/storage.py +0 -0
  625. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/aggregate.py +0 -0
  626. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/cli.py +0 -0
  627. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/cli_catalog.py +0 -0
  628. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/cli_schema.py +0 -0
  629. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/cli_table.py +0 -0
  630. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/cli_transaction.py +0 -0
  631. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/cli_utils.py +0 -0
  632. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/cli_view.py +0 -0
  633. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/client.py +0 -0
  634. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/client/errors.py +0 -0
  635. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/__init__.py +0 -0
  636. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_constants.py +0 -0
  637. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_protocol_name.py +0 -0
  638. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  639. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_request_builders.py +0 -0
  640. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_schemas.py +0 -0
  641. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  642. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  643. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  644. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/go_schemas.py +0 -0
  645. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/java_schemas.py +0 -0
  646. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/protocol_version.py +0 -0
  647. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/rust_request_builders.py +0 -0
  648. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/rust_schemas.py +0 -0
  649. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/ts_client.py +0 -0
  650. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/codegen/ts_schemas.py +0 -0
  651. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/copy_to_function.py +0 -0
  652. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/exceptions.py +0 -0
  653. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/filter_v2_builder.py +0 -0
  654. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/function.py +0 -0
  655. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/function_storage.py +0 -0
  656. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/function_storage_azure_sql.py +0 -0
  657. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/function_storage_cf_do.py +0 -0
  658. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/http/__init__.py +0 -0
  659. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/http/demo_storage.py +0 -0
  660. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/http/landing.html +0 -0
  661. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/http/landing_page.py +0 -0
  662. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/http/vgi-client.js +0 -0
  663. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/http/worker_page.py +0 -0
  664. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/invocation.py +0 -0
  665. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/logging_config.py +0 -0
  666. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/metadata.py +0 -0
  667. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/otel.py +0 -0
  668. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/profiling.py +0 -0
  669. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/py.typed +0 -0
  670. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/scalar_function.py +0 -0
  671. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/schema_path.py +0 -0
  672. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/schema_utils.py +0 -0
  673. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/secret_protocol.py +0 -0
  674. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/secret_service.py +0 -0
  675. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/split_token.py +0 -0
  676. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/table_filter_pushdown.py +0 -0
  677. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/table_function.py +0 -0
  678. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/transactor/__init__.py +0 -0
  679. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/transactor/_duckdb_compat.py +0 -0
  680. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/transactor/client.py +0 -0
  681. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/transactor/protocol.py +0 -0
  682. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/transactor/server.py +0 -0
  683. {vgi_python-0.38.1 → vgi_python-0.40.0}/vgi/write_results.py +0 -0
  684. {vgi_python-0.38.1 → vgi_python-0.40.0}/wrangler.jsonc +0 -0
@@ -27,6 +27,14 @@ updates:
27
27
  # failing on an impossible update; the alerts stay visible in the
28
28
  # security tab. The real fix is lifting the cap upstream in vgi-rpc.
29
29
  - dependency-name: "aiohttp"
30
+ # The filter evaluator implements vgi.duckdb.standard.v1, pinned to
31
+ # DuckDB 1.5.5 / Haybarn 1.5.5-rc1 (vgi/filter_v2.py
32
+ # STANDARD_V1_ENGINE_VERSIONS); any other engine build refuses every
33
+ # pushed-down filter. Bumping them is a deliberate profile decision, not
34
+ # a routine update: locking duckdb 1.5.6 broke filter pushdown in the
35
+ # vgi integration suite.
36
+ - dependency-name: "duckdb"
37
+ - dependency-name: "haybarn"
30
38
 
31
39
  # GitHub Actions used by the workflows in .github/workflows/.
32
40
  - package-ecosystem: "github-actions"
@@ -30,7 +30,7 @@ jobs:
30
30
  - uses: actions/checkout@v7
31
31
 
32
32
  - name: Install uv
33
- uses: astral-sh/setup-uv@v9.0.0
33
+ uses: astral-sh/setup-uv@v10.2.0
34
34
 
35
35
  - name: Set up Python ${{ matrix.python-version }}
36
36
  run: uv python install ${{ matrix.python-version }}
@@ -53,7 +53,7 @@ jobs:
53
53
  - uses: actions/checkout@v7
54
54
 
55
55
  - name: Install uv
56
- uses: astral-sh/setup-uv@v9.0.0
56
+ uses: astral-sh/setup-uv@v10.2.0
57
57
 
58
58
  - name: Install dependencies
59
59
  run: uv sync --all-extras
@@ -89,7 +89,7 @@ jobs:
89
89
  - uses: actions/checkout@v7
90
90
 
91
91
  - name: Install uv
92
- uses: astral-sh/setup-uv@v9.0.0
92
+ uses: astral-sh/setup-uv@v10.2.0
93
93
 
94
94
  - name: Set up Python 3.14
95
95
  run: uv python install 3.14
@@ -112,7 +112,7 @@ jobs:
112
112
  # fail_on_error to true (and drop continue-on-error) once the vocab in
113
113
  # .github/styles/config/vocabularies/VGI/accept.txt is settled.
114
114
  - name: Prose lint (Vale)
115
- uses: errata-ai/vale-action@v2
115
+ uses: errata-ai/vale-action@v3
116
116
  continue-on-error: true
117
117
  with:
118
118
  files: docs
@@ -126,6 +126,27 @@ jobs:
126
126
  args: "--no-progress --offline --root-dir ${{ github.workspace }}/docs docs/**/*.md *.md"
127
127
  fail: true
128
128
 
129
+ hosted-protocols:
130
+ # vgi-rpc's cross-SDK hosted-protocols group: the fixture workers must host
131
+ # vgi.v2 then conformance.Secondary.v1 on stdio, unix and HTTP, and pass the
132
+ # Identity.v1 groups over HTTP (vgi-fixture-http --identity).
133
+ name: Hosted-protocols conformance
134
+ runs-on: ubuntu-latest
135
+ steps:
136
+ - uses: actions/checkout@v7
137
+
138
+ - name: Install uv
139
+ uses: astral-sh/setup-uv@v10.2.0
140
+
141
+ - name: Set up Python 3.14
142
+ run: uv python install 3.14
143
+
144
+ - name: Install dependencies
145
+ run: uv sync --all-extras --python 3.14
146
+
147
+ - name: Run hosted-protocols group (stdio, unix, http)
148
+ run: scripts/hosted_protocols_conformance.sh
149
+
129
150
  s3-offload-localstack:
130
151
  name: S3 Offload Tests (LocalStack)
131
152
  runs-on: ubuntu-latest
@@ -147,7 +168,7 @@ jobs:
147
168
  path: vgi-rpc
148
169
 
149
170
  - name: Install uv
150
- uses: astral-sh/setup-uv@v9.0.0
171
+ uses: astral-sh/setup-uv@v10.2.0
151
172
 
152
173
  - name: Set up Python 3.14
153
174
  run: uv python install 3.14
@@ -18,7 +18,7 @@ jobs:
18
18
  - uses: actions/checkout@v7
19
19
 
20
20
  - name: Install uv
21
- uses: astral-sh/setup-uv@v9.0.0
21
+ uses: astral-sh/setup-uv@v10.2.0
22
22
 
23
23
  - name: Set up Python
24
24
  run: uv python install 3.14
@@ -73,7 +73,7 @@ jobs:
73
73
  token: ${{ secrets.GITHUB_TOKEN }}
74
74
 
75
75
  - name: Install uv
76
- uses: astral-sh/setup-uv@v9.0.0
76
+ uses: astral-sh/setup-uv@v10.2.0
77
77
 
78
78
  - name: Set up Python 3.14
79
79
  run: uv python install 3.14
@@ -33,7 +33,7 @@ jobs:
33
33
  - uses: actions/checkout@v7
34
34
 
35
35
  - name: Install uv
36
- uses: astral-sh/setup-uv@v9.0.0
36
+ uses: astral-sh/setup-uv@v10.2.0
37
37
 
38
38
  - name: Build vgi (sdist + wheel)
39
39
  run: uv build --sdist --wheel --out-dir dist-vgi .
@@ -428,9 +428,10 @@ caller's identity before it can authorize anything.
428
428
 
429
429
  Through vgi-rpc 0.45.x this was an HTTP JSON route, `POST
430
430
  {prefix}/__introspect_token__`, which meant it existed on exactly one
431
- transport. As of **vgi-rpc 0.46.0** identity lives at the RPC layer, so it
432
- reaches every transport, and a client discovers it through ordinary reflection
433
- (`list_protocols`) rather than by calling and reading an error.
431
+ transport. As of **vgi-rpc 0.46.0** identity lives at the RPC layer, and a
432
+ client discovers it through ordinary reflection (`list_protocols`) rather than
433
+ by calling and reading an error. VGI hosts it on HTTP only — the transport that
434
+ authenticates callers (see `build_rpc_server` in `vgi/rpc_server.py`).
434
435
 
435
436
  ```python
436
437
  from vgi.auth import AuthUnavailableError, TokenIdentity
@@ -469,7 +470,10 @@ credentials. Throttle untrusted traffic at the proxy, per client.
469
470
 
470
471
  Return `None` for "the store answered and this credential is unknown"; raise
471
472
  `AuthUnavailableError` for "the answer is not knowable". A caller that
472
- negative-caches the first must not cache the second. Never return claims — a
473
+ negative-caches the first must not cache the second. Raising the same error
474
+ an authenticator raises is correct here: vgi-rpc translates an
475
+ `AuthUnavailableError` from either identity hook into `identity_unavailable`
476
+ (code `UNAVAILABLE`) and carries its `retry_after` as `RetryInfo`. Never return claims — a
473
477
  pass-through claims field would let a worker choose its caller's tenant routing
474
478
  and policy branch.
475
479
 
@@ -480,6 +484,26 @@ sidecar outage raised as one is read as "not my credential, try the next" and
480
484
  ends up a 401 from the end of the chain, restarting every session in the fleet
481
485
  over a thirty-second blip.
482
486
 
487
+ ### Hosting Additional Protocols (`hosted_protocols`)
488
+
489
+ Every transport (stdio, unix/named pipe, TCP, Iroh, HTTP) builds its `RpcServer`
490
+ through one helper, `build_rpc_server(worker, *, transport, ...)` in
491
+ `vgi/rpc_server.py`. Never call `RpcServer(...)` for a worker anywhere else.
492
+ `tests/test_hosted_protocols.py` enforces this structurally. Only
493
+ `vgi/secret_service.py` and `vgi/transactor/server.py` are exempt, because they
494
+ serve other protocols.
495
+
496
+ A worker hosts extra vgi-rpc protocols by overriding the classmethod
497
+ `Worker.hosted_protocols() -> Sequence[tuple[type, object]]` (empty by
498
+ default). It is called once per server build. Its pairs are hosted on every
499
+ transport, after `vgi.v2` and before `vgi_rpc.Reflection.v1`, which is now
500
+ hosted on every transport too. You cannot host part of a protocol: the
501
+ protocol is the unit of optionality. Duplicate names, `vgi.v2` itself, and the
502
+ reserved `vgi_rpc.` prefix all fail at startup with an error that names the
503
+ hook. `MetaWorker` hosts its children's lists concatenated. Identity is not
504
+ supplied through this hook. It stays opt-in via `resolve_token`/`mint_grant`
505
+ and is hosted on HTTP only. See `docs/api/worker.md`.
506
+
483
507
  ### Access Log Sampling and Async Emission
484
508
 
485
509
  `--access-log-sample 0.05` keeps 5% of *successful* calls. Errors are always
@@ -606,6 +630,21 @@ This allows workers to expose structured metadata (tables, views, functions) to
606
630
  The recommended pattern is to back tables with `TableFunctionGenerator` functions.
607
631
  The table schema is automatically derived from the function's `output_schema`:
608
632
 
633
+ ### catalog_contents (whole-catalog load, protocol 2.1.0)
634
+
635
+ `Worker.catalog_contents(attach_opaque_data, if_none_match=None)` returns
636
+ `CatalogContentsResponse{catalog_version, etag, not_modified, schemas: list<struct SchemaContents>}`
637
+ (`path` first, then the `SchemaInfo` item and eight `list<binary>` kinds, items
638
+ byte-identical to the per-schema RPCs). The catalog side is
639
+ `CatalogInterface.catalog_contents(*, attach_opaque_data, if_none_match) -> CatalogContentsResult`.
640
+ The worker validates paths, orders parents first and enforces the etag rules
641
+ (`not_modified` only with an etag equal to `if_none_match`). Opt-ins:
642
+ `catalog_contents_etag = "content-hash"` (framework SHA-256 etag) and
643
+ `catalog_contents_attach_independent` (with `catalog_version_frozen`, the worker
644
+ caches the serialized response per catalog version; `ReadOnlyCatalogInterface`
645
+ sets it). Fixture catalogs: `vgi/_test_fixtures/catalog_contents.py`
646
+ (`contents_probe/broken/legacy/memory/reval/hash`). See `docs/catalog-interface.md`.
647
+
609
648
  ## Additional Documentation
610
649
 
611
650
  - **Access log**: See `vgi-rpc` docs site
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.38.1
3
+ Version: 0.40.0
4
4
  Summary: Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow
5
5
  Project-URL: Homepage, https://query.farm
6
6
  Project-URL: Repository, https://github.com/Query-farm/vgi-python
@@ -162,13 +162,13 @@ Requires-Dist: httpx2>=2.12.0
162
162
  Requires-Dist: platformdirs
163
163
  Requires-Dist: pyarrow
164
164
  Requires-Dist: typer>=0.9
165
- Requires-Dist: vgi-rpc>=0.47.2
165
+ Requires-Dist: vgi-rpc>=0.48.0
166
166
  Provides-Extra: azure
167
167
  Requires-Dist: azure-identity>=1.16.0; extra == 'azure'
168
168
  Requires-Dist: pymssql>=2.3.0; extra == 'azure'
169
169
  Provides-Extra: dev
170
170
  Requires-Dist: azure-identity>=1.16.0; extra == 'dev'
171
- Requires-Dist: duckdb>=1.5.3; extra == 'dev'
171
+ Requires-Dist: duckdb==1.5.5; extra == 'dev'
172
172
  Requires-Dist: jsonschema; extra == 'dev'
173
173
  Requires-Dist: mypy; extra == 'dev'
174
174
  Requires-Dist: numpy>=2.4.1; extra == 'dev'
@@ -188,14 +188,14 @@ Requires-Dist: vgi-rpc[oauth]; extra == 'dev'
188
188
  Requires-Dist: vgi-rpc[otel]; extra == 'dev'
189
189
  Requires-Dist: vgi-rpc[sentry]; extra == 'dev'
190
190
  Provides-Extra: duckdb
191
- Requires-Dist: duckdb>=1.5.3; extra == 'duckdb'
191
+ Requires-Dist: duckdb==1.5.5; extra == 'duckdb'
192
192
  Provides-Extra: fixtures
193
193
  Requires-Dist: vgi-fixtures; extra == 'fixtures'
194
194
  Provides-Extra: granian
195
195
  Requires-Dist: granian>=2.7; extra == 'granian'
196
196
  Requires-Dist: vgi-rpc[http]; extra == 'granian'
197
197
  Provides-Extra: haybarn
198
- Requires-Dist: haybarn>=1.5.5rc1; extra == 'haybarn'
198
+ Requires-Dist: haybarn==1.5.5rc1; extra == 'haybarn'
199
199
  Provides-Extra: http
200
200
  Requires-Dist: vgi-rpc[http]; extra == 'http'
201
201
  Provides-Extra: iroh
@@ -19,8 +19,9 @@ require `pip install vgi-python[http]`; JWT authentication additionally requires
19
19
  re-exports it — a worker that implements `resolve_token` never has to name a private import path.
20
20
 
21
21
  As of vgi-rpc 0.46.0 introspection is the `vgi_rpc.Identity.v1` protocol hosted on the RPC server,
22
- not an HTTP JSON route, so it reaches every transport rather than only HTTP. `TokenIdentity` and
23
- `TokenResolver` are correspondingly no longer gated on the `[http]` extra.
22
+ not an HTTP JSON route, so clients discover it through reflection. VGI hosts it on HTTP only, the
23
+ transport that authenticates callers: its allowlist names principals, which stdin/stdout, AF_UNIX
24
+ and TCP do not have. `TokenIdentity` and `TokenResolver` are no longer gated on the `[http]` extra.
24
25
 
25
26
  ## Secret protocol
26
27
 
@@ -0,0 +1,99 @@
1
+ # Worker & Serving
2
+
3
+ A `Worker` hosts your functions (and optional catalog) in a separate process. It speaks the VGI
4
+ protocol over Arrow IPC — either stdin/stdout (subprocess transport) or HTTP. The `vgi-serve`
5
+ CLI (`vgi.serve`) is the zero-boilerplate entry point for running one.
6
+
7
+ ```python
8
+ from vgi import Worker, ScalarFunction
9
+
10
+ class MyWorker(Worker):
11
+ functions = [MyScalarFunction()]
12
+
13
+ # vgi-serve my_module:MyWorker # stdio
14
+ # vgi-serve my_module:MyWorker --http # HTTP
15
+ ```
16
+
17
+ ## Hosting additional protocols
18
+
19
+ A worker can serve other [vgi-rpc](https://vgi-rpc.query.farm) protocols from the same process and
20
+ the same listener as the VGI protocol. Override
21
+ [`Worker.hosted_protocols`][vgi.worker.Worker.hosted_protocols] to return
22
+ `(protocol, implementation)` pairs:
23
+
24
+ ```python
25
+ from collections.abc import Sequence
26
+ from typing import ClassVar, Protocol
27
+
28
+ from vgi import Worker
29
+
30
+
31
+ class Audit(Protocol):
32
+ protocol_name: ClassVar[str] = "acme.Audit.v1"
33
+
34
+ def record(self, event: str) -> int: ...
35
+
36
+
37
+ class AuditImpl:
38
+ def record(self, event: str) -> int:
39
+ return len(event)
40
+
41
+
42
+ class MyWorker(Worker):
43
+ functions = []
44
+
45
+ @classmethod
46
+ def hosted_protocols(cls) -> Sequence[tuple[type, object]]:
47
+ return [(Audit, AuditImpl())]
48
+ ```
49
+
50
+ The rules:
51
+
52
+ - **Every transport hosts the same list.** stdin/stdout, AF_UNIX (or a Windows named pipe), TCP,
53
+ the Iroh raw upstream and HTTP all build their server through one function,
54
+ [`build_rpc_server`][vgi.rpc_server.build_rpc_server].
55
+ - **Called once per server.** The hook may read configuration or the environment, but its answer
56
+ is fixed for the life of the process, so reflection output and protocol hashes stay stable.
57
+ - **The protocol is the unit of optionality.** There is no way to host part of a protocol. Make
58
+ an optional capability its own protocol, and include it or leave it out.
59
+ - **Names are routing keys.** Each protocol needs a distinct `protocol_name`. A repeated name, the
60
+ worker's own `vgi.v2`, or the reserved `vgi_rpc.` prefix stops the worker at startup, and the
61
+ error names `hosted_protocols()`.
62
+ - **`vgi.v2` is unaffected.** vgi-rpc routes each request on its `vgi_rpc.protocol` key and never
63
+ falls back to the primary protocol. A client that only speaks `vgi.v2`, such as the DuckDB
64
+ extension, sees exactly the behaviour it saw before.
65
+
66
+ A `MetaWorker` (`vgi.meta_worker`) hosts the concatenation of its children's lists, in
67
+ child order. Two children that list the same protocol name stop it at startup. Over HTTP it
68
+ hosts Identity for the one child that overrides `resolve_token` or `mint_grant`; two children
69
+ overriding the same hook stop it at startup.
70
+
71
+ ### What each transport hosts
72
+
73
+ Reflection (`list_protocols`) reports protocols in this order:
74
+
75
+ | Transport | `vgi.v2` | `hosted_protocols()` | `vgi_rpc.Reflection.v1` | `vgi_rpc.Identity.v1` |
76
+ | --- | --- | --- | --- | --- |
77
+ | stdin/stdout | yes | yes | yes | no |
78
+ | AF_UNIX / named pipe | yes | yes | yes | no |
79
+ | TCP | yes | yes | yes | no |
80
+ | Iroh raw upstream | yes | yes | yes | no |
81
+ | HTTP | yes | yes | unless `--no-describe` | when `resolve_token` or `mint_grant` is overridden |
82
+
83
+ Identity stays framework-owned. You enable it by overriding
84
+ [`resolve_token`][vgi.worker.Worker.resolve_token] or
85
+ [`mint_grant`][vgi.worker.Worker.mint_grant], never through `hosted_protocols()`. It is hosted
86
+ only on HTTP, which authenticates callers. Its introspection allowlist names principals, and the
87
+ other transports have no principals to check.
88
+
89
+ ## Worker
90
+
91
+ ::: vgi.worker
92
+
93
+ ## Server construction
94
+
95
+ ::: vgi.rpc_server
96
+
97
+ ## Serving
98
+
99
+ ::: vgi.serve
@@ -243,6 +243,80 @@ class MyCatalog(CatalogInterface):
243
243
  | | `view_rename()` | `NotImplementedError` |
244
244
  | | `view_comment_set()` | `NotImplementedError` |
245
245
  | **Observability** | `loggable_attach_options()` | Returns `{}` (no options logged — see below) |
246
+ | **Bulk load** | `catalog_contents()` | Composes `schemas()` + `schema_contents()` per kind; no etag (see below) |
247
+
248
+ ---
249
+
250
+ ## Loading the Whole Catalog: `catalog_contents`
251
+
252
+ A client normally learns a catalog lazily: `catalog_schemas`, then one
253
+ `catalog_schema_contents_*` call per schema and object kind. When the attach
254
+ result sets `supports_catalog_contents` (`ReadOnlyCatalogInterface` does), the
255
+ client may instead load everything with one `catalog_contents` RPC (protocol
256
+ 2.1.0):
257
+
258
+ ```text
259
+ catalog_contents(attach_opaque_data: binary, if_none_match: utf8 nullable)
260
+ -> CatalogContentsResponse {
261
+ catalog_version: int64
262
+ etag: utf8 nullable -- null: the worker does not revalidate
263
+ not_modified: bool -- true: schemas is empty, keep what you have
264
+ schemas: list<struct<path: list<utf8>, schema: binary,
265
+ tables, views, scalar_functions, aggregate_functions,
266
+ table_functions, scalar_macros, table_macros,
267
+ indexes: list<binary>>> -- parents before children
268
+ }
269
+ ```
270
+
271
+ Each struct row is one schema: `path` equals the `SchemaInfo.path` encoded in
272
+ `schema`, and every item is byte-identical to what the matching per-schema RPC
273
+ returns. There is no transaction parameter: it is the committed catalog at
274
+ `catalog_version`.
275
+
276
+ `CatalogInterface.catalog_contents(*, attach_opaque_data, if_none_match=None)`
277
+ returns a `CatalogContentsResult(schemas, etag=None, not_modified=False)`. The
278
+ default composes `schemas()` and `schema_contents()` for every kind (skipping
279
+ kinds whose `estimated_object_count` is exactly 0) and returns no etag.
280
+
281
+ **Revalidation.** Return an `etag` to let a client revalidate a non-frozen
282
+ catalog with `if_none_match` instead of re-downloading it. Check it *before*
283
+ building, so an unchanged catalog costs almost nothing:
284
+
285
+ ```python test="lint"
286
+ from vgi.catalog import CatalogContentsResult, CatalogInterface
287
+
288
+
289
+ class GenerationCatalog(CatalogInterface): # other methods omitted
290
+ generation = 1 # bumped by every DDL
291
+
292
+ def catalog_contents(self, *, attach_opaque_data, if_none_match=None):
293
+ etag = f"gen-{self.generation}"
294
+ if if_none_match == etag:
295
+ return CatalogContentsResult(etag=etag, not_modified=True) # nothing built
296
+ full = super().catalog_contents(attach_opaque_data=attach_opaque_data)
297
+ return CatalogContentsResult(schemas=full.schemas, etag=etag)
298
+ ```
299
+
300
+ The worker enforces the rules: `not_modified` requires an etag equal to
301
+ `if_none_match` and no schemas; a full answer whose etag equals
302
+ `if_none_match` is turned into `not_modified`; a catalog with no etag always
303
+ answers in full (it ignores `if_none_match`).
304
+
305
+ **Content-hash etag.** A catalog without a cheap validator can set
306
+ `catalog_contents_etag = "content-hash"`: when it returns no etag, the worker
307
+ uses the hex SHA-256 of the serialized snapshot. The worker still builds the
308
+ snapshot on every call, but an unchanged catalog skips the transfer and the
309
+ client's decode. It is off by default, because for a non-frozen catalog the
310
+ client would revalidate with a full build on every transaction instead of a
311
+ cheap `catalog_version` poll.
312
+
313
+ **Worker cache.** When the catalog's version is frozen
314
+ (`catalog_version_frozen`) and its contents do not depend on the attach or the
315
+ caller (`catalog_contents_attach_independent = True`, the
316
+ `ReadOnlyCatalogInterface` default), the worker builds the response once per
317
+ catalog version and serves the same pre-serialized bytes to every call. A
318
+ `ReadOnlyCatalogInterface` subclass whose contents vary per caller must set
319
+ `catalog_contents_attach_independent = False`.
246
320
 
247
321
  ---
248
322
 
@@ -649,6 +723,7 @@ client.catalog_detach(attach_opaque_data=attach_opaque_data)
649
723
  | `schema_create()` | Create a schema |
650
724
  | `schema_drop()` | Drop a schema |
651
725
  | `schema_contents()` | List schema contents (optional `type` filter) |
726
+ | `contents()` | Load every schema and its contents in one call (`if_none_match` revalidates) |
652
727
  | `table_get()` | Get table info |
653
728
  | `table_create()` | Create a table |
654
729
  | `table_drop()` | Drop a table |
@@ -34,7 +34,9 @@ classifiers = [
34
34
  # The fixture worker also builds statistics fixtures at import time, which
35
35
  # needs a DuckDB-compatible engine — vgi[duckdb] keeps the default dev env on
36
36
  # stock duckdb (the resolver prefers haybarn whenever it is installed too).
37
- dependencies = ["vgi-python[test-fixtures-writable]", "vgi-python[duckdb]"]
37
+ # vgi-rpc is named directly because the fixture worker imports its conformance
38
+ # fixtures (vgi_rpc.conformance.secondary, .identity_fixture), new in 0.48.0.
39
+ dependencies = ["vgi-python[test-fixtures-writable]", "vgi-python[duckdb]", "vgi-rpc>=0.48.0"]
38
40
 
39
41
  [project.scripts]
40
42
  vgi-fixture-worker = "vgi._test_fixtures.worker:main"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.38.1"
3
+ version = "0.40.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -40,7 +40,7 @@ dependencies = [
40
40
  "pyarrow",
41
41
  "typer>=0.9",
42
42
  "platformdirs",
43
- "vgi-rpc>=0.47.2",
43
+ "vgi-rpc>=0.48.0",
44
44
  "httpx2>=2.12.0",
45
45
  ]
46
46
 
@@ -49,8 +49,14 @@ dependencies = [
49
49
  # evaluation, the transactor, and the statistics fixtures. It is resolved
50
50
  # lazily in vgi/_duckdb.py: haybarn is preferred, stock duckdb is the
51
51
  # fallback. Neither is a hard dependency — install one via these extras.
52
- haybarn = ["haybarn>=1.5.5rc1"]
53
- duckdb = ["duckdb>=1.5.3"]
52
+ # Both are pinned EXACTLY: expression-filter evaluation implements
53
+ # vgi.duckdb.standard.v1, whose oracle is upstream DuckDB 1.5.5 (Haybarn
54
+ # 1.5.5-rc1), and vgi/filter_v2.py refuses any other engine build
55
+ # (STANDARD_V1_ENGINE_VERSIONS). A looser range lets a resolver pick e.g.
56
+ # duckdb 1.5.6, and every pushed-down filter then fails to bind. Change these
57
+ # only together with STANDARD_V1_ENGINE_VERSIONS (a test keeps them in step).
58
+ haybarn = ["haybarn==1.5.5rc1"]
59
+ duckdb = ["duckdb==1.5.5"]
54
60
  http = ["vgi-rpc[http]"]
55
61
  iroh = ["vgi-rpc[http,iroh]"]
56
62
  # transport="launch": vgi_rpc.launcher imports filelock unconditionally at
@@ -84,7 +90,7 @@ test-fixtures-writable = [
84
90
  "vgi-python[transactor]",
85
91
  ]
86
92
  dev = [
87
- "duckdb>=1.5.3",
93
+ "duckdb==1.5.5", # pinned with the `duckdb` extra above
88
94
  "mypy",
89
95
  "pyarrow-stubs",
90
96
  # pydoclint is intentionally NOT a project dependency: it pulls
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
3
+ #
4
+ # Run vgi-rpc's hosted-protocols conformance group (vgi-rpc-test-hosted)
5
+ # against this repo's fixture workers on all three transports it covers:
6
+ #
7
+ # stdio vgi-fixture-worker (MetaWorker.serve, pipe)
8
+ # unix vgi-fixture-worker --unix <sock> (the DuckDB launcher path)
9
+ # http vgi-fixture-http --identity (+ the Identity.v1 groups)
10
+ #
11
+ # Every worker must host, in order, vgi.v2 then conformance.Secondary.v1.
12
+ #
13
+ # Usage: scripts/hosted_protocols_conformance.sh [stdio|unix|http ...]
14
+ # Default: all three. Runs from the project env (`uv run --no-sync`), which
15
+ # must have vgi-rpc with the [http,conformance] extras (the dev group does).
16
+ set -euo pipefail
17
+
18
+ cd "$(dirname "$0")/.."
19
+
20
+ EXPECT="vgi.v2,conformance.Secondary.v1"
21
+ RUN=(uv run --no-sync)
22
+ BIN="$(dirname "$("${RUN[@]}" python -c 'import sys; print(sys.executable)')")"
23
+ TRANSPORTS=("$@")
24
+ [ ${#TRANSPORTS[@]} -eq 0 ] && TRANSPORTS=(stdio unix http)
25
+
26
+ # Short scratch dir: AF_UNIX paths are capped at ~104 bytes, and CI temp
27
+ # dirs can be long.
28
+ SCRATCH="$(mktemp -d /tmp/vgihp.XXXXXX)"
29
+ PIDS=()
30
+ cleanup() {
31
+ for pid in "${PIDS[@]}"; do kill "$pid" 2>/dev/null || true; done
32
+ rm -rf "$SCRATCH"
33
+ }
34
+ trap cleanup EXIT
35
+
36
+ wait_for() { # wait_for <description> <test command...>
37
+ local what="$1"; shift
38
+ for _ in $(seq 150); do "$@" && return 0; sleep 0.2; done
39
+ echo "timed out waiting for $what" >&2
40
+ return 1
41
+ }
42
+
43
+ run_stdio() {
44
+ echo "== hosted-protocols: stdio =="
45
+ "${RUN[@]}" vgi-rpc-test-hosted --cmd "$BIN/vgi-fixture-worker" --expect "$EXPECT" -- -rs
46
+ }
47
+
48
+ run_unix() {
49
+ echo "== hosted-protocols: unix =="
50
+ local sock="$SCRATCH/w.sock"
51
+ "$BIN/vgi-fixture-worker" --unix "$sock" --idle-timeout 300 >"$SCRATCH/unix.out" 2>"$SCRATCH/unix.err" &
52
+ PIDS+=($!)
53
+ wait_for "unix socket $sock" test -S "$sock" || { cat "$SCRATCH/unix.err" >&2; return 1; }
54
+ "${RUN[@]}" vgi-rpc-test-hosted --unix "$sock" --expect "$EXPECT" -- -rs
55
+ }
56
+
57
+ run_http() {
58
+ echo "== hosted-protocols: http (--identity) =="
59
+ local port
60
+ port="$("${RUN[@]}" python -c 'import socket; s = socket.socket(); s.bind(("127.0.0.1", 0)); print(s.getsockname()[1])')"
61
+ "$BIN/vgi-fixture-http" --identity --host 127.0.0.1 --port "$port" >"$SCRATCH/http.out" 2>"$SCRATCH/http.err" &
62
+ PIDS+=($!)
63
+ wait_for "HTTP worker on :$port" curl -sf -o /dev/null "http://127.0.0.1:$port/health" \
64
+ || { cat "$SCRATCH/http.err" >&2; return 1; }
65
+ "${RUN[@]}" vgi-rpc-test-hosted --url "http://127.0.0.1:$port" --expect "$EXPECT" --identity -- -rs
66
+ }
67
+
68
+ for t in "${TRANSPORTS[@]}"; do
69
+ case "$t" in
70
+ stdio) run_stdio ;;
71
+ unix) run_unix ;;
72
+ http) run_http ;;
73
+ *) echo "unknown transport: $t (expected stdio, unix or http)" >&2; exit 2 ;;
74
+ esac
75
+ done
@@ -51,10 +51,19 @@ _TARGETS: list[tuple[str, str, str]] = [
51
51
  "vgi",
52
52
  ),
53
53
  ("vgi.codegen.go_schemas", "vgi/generated/protocol_schemas.go", "vgi-go"),
54
+ ("vgi.codegen.go_types", "vgi/generated/protocol_types.go", "vgi-go"),
54
55
  ("vgi.codegen.rust_schemas", "vgi-protocol/src/generated/protocol_schemas.rs", "vgi-rust"),
55
56
  ("vgi.codegen.rust_request_builders", "vgi-protocol/src/generated/request_params.rs", "vgi-rust"),
57
+ ("vgi.codegen.rust_types", "vgi-protocol/src/generated/protocol_types.rs", "vgi-rust"),
56
58
  ("vgi.codegen.ts_schemas", "src/generated/vgi-protocol-schemas.ts", "vgi-typescript"),
57
59
  ("vgi.codegen.ts_client", "src/generated/vgi-client.ts", "vgi-typescript"),
60
+ ("vgi.codegen.ts_types", "src/generated/vgi-protocol-types.ts", "vgi-typescript"),
61
+ ("vgi.codegen.csharp_types", "src/QueryFarm.Vgi/Protocol/Generated/VgiProtocolTypes.g.cs", "vgi-csharp"),
62
+ (
63
+ "vgi.codegen.csharp_schemas",
64
+ "test/QueryFarm.Vgi.Tests/Generated/VgiProtocolSchemas.g.cs",
65
+ "vgi-csharp",
66
+ ),
58
67
  (
59
68
  "vgi.codegen.java_schemas",
60
69
  "vgi/src/test/java/farm/query/vgi/generated/VgiProtocolSchemas.java",
@@ -62,6 +71,15 @@ _TARGETS: list[tuple[str, str, str]] = [
62
71
  ),
63
72
  ]
64
73
 
74
+ # vgi-java's generated wire records: one file per record (Java allows one public
75
+ # top-level type per file), so one target each. ``module:record`` tells
76
+ # `_render` to call ``emit(out, record=...)``. Derived from the generator's own
77
+ # list so adding a record there is all it takes.
78
+ _TARGETS += [
79
+ (f"vgi.codegen.java_types:{record}", relative, "vgi-java")
80
+ for record, relative in importlib.import_module("vgi.codegen.java_types").targets()
81
+ ]
82
+
65
83
 
66
84
  def _repo_root(name: str) -> Path | None:
67
85
  """Locate a sibling checkout, or ``None`` when it is not present."""
@@ -73,10 +91,18 @@ def _repo_root(name: str) -> Path | None:
73
91
 
74
92
 
75
93
  def _render(module_name: str) -> str:
76
- """Render one artifact into memory. Raises if the generator fails."""
94
+ """Render one artifact into memory. Raises if the generator fails.
95
+
96
+ ``module:record`` renders one file of a generator that emits several
97
+ (``emit(out, record=record)``).
98
+ """
99
+ module_name, _, record = module_name.partition(":")
77
100
  module = importlib.import_module(module_name)
78
101
  buf = io.StringIO()
79
- module.emit(buf)
102
+ if record:
103
+ module.emit(buf, record=record)
104
+ else:
105
+ module.emit(buf)
80
106
  text = buf.getvalue()
81
107
  if not text.strip():
82
108
  raise RuntimeError(f"{module_name}.emit() produced no output")