vgi-python 0.33.0__tar.gz → 0.34.1__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 (657) hide show
  1. {vgi_python-0.33.0 → vgi_python-0.34.1}/PKG-INFO +1 -1
  2. {vgi_python-0.33.0 → vgi_python-0.34.1}/pyproject.toml +1 -1
  3. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/test_blended_exchange.py +70 -0
  4. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/test_blended_metadata.py +40 -0
  5. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_argument_spec.py +59 -2
  6. vgi_python-0.34.1/tests/test_import_side_effects.py +205 -0
  7. {vgi_python-0.33.0 → vgi_python-0.34.1}/uv.lock +1 -1
  8. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table_in_out.py +84 -1
  9. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/worker.py +4 -0
  10. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/argument_spec.py +42 -8
  11. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/table_function.py +14 -2
  12. {vgi_python-0.33.0 → vgi_python-0.34.1}/.dockerignore +0 -0
  13. {vgi_python-0.33.0 → vgi_python-0.34.1}/.gitattributes +0 -0
  14. {vgi_python-0.33.0 → vgi_python-0.34.1}/.github/dependabot.yml +0 -0
  15. {vgi_python-0.33.0 → vgi_python-0.34.1}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  16. {vgi_python-0.33.0 → vgi_python-0.34.1}/.github/workflows/ci.yml +0 -0
  17. {vgi_python-0.33.0 → vgi_python-0.34.1}/.github/workflows/docs.yml +0 -0
  18. {vgi_python-0.33.0 → vgi_python-0.34.1}/.github/workflows/integration.yml +0 -0
  19. {vgi_python-0.33.0 → vgi_python-0.34.1}/.github/workflows/release.yml +0 -0
  20. {vgi_python-0.33.0 → vgi_python-0.34.1}/.github/workflows/tailnet-integration.yml +0 -0
  21. {vgi_python-0.33.0 → vgi_python-0.34.1}/.gitignore +0 -0
  22. {vgi_python-0.33.0 → vgi_python-0.34.1}/.python-version +0 -0
  23. {vgi_python-0.33.0 → vgi_python-0.34.1}/.vale.ini +0 -0
  24. {vgi_python-0.33.0 → vgi_python-0.34.1}/CLAUDE.md +0 -0
  25. {vgi_python-0.33.0 → vgi_python-0.34.1}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  26. {vgi_python-0.33.0 → vgi_python-0.34.1}/DOCS_REVIEW_RUBRIC.md +0 -0
  27. {vgi_python-0.33.0 → vgi_python-0.34.1}/DOCS_USABILITY_TEST.md +0 -0
  28. {vgi_python-0.33.0 → vgi_python-0.34.1}/LICENSE +0 -0
  29. {vgi_python-0.33.0 → vgi_python-0.34.1}/PROTOCOL.md +0 -0
  30. {vgi_python-0.33.0 → vgi_python-0.34.1}/README.md +0 -0
  31. {vgi_python-0.33.0 → vgi_python-0.34.1}/RELEASE-RUNBOOK.md +0 -0
  32. {vgi_python-0.33.0 → vgi_python-0.34.1}/SECURITY.md +0 -0
  33. {vgi_python-0.33.0 → vgi_python-0.34.1}/ci/README.md +0 -0
  34. {vgi_python-0.33.0 → vgi_python-0.34.1}/ci/preprocess-require.awk +0 -0
  35. {vgi_python-0.33.0 → vgi_python-0.34.1}/ci/run-integration.sh +0 -0
  36. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/README.md +0 -0
  37. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  38. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  39. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  40. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  41. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  42. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  43. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  44. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  45. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  46. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  47. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  48. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  49. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  50. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/filter-v2.schema.json +0 -0
  51. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/generate_runtime.py +0 -0
  52. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/manifest.json +0 -0
  53. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/run_worker.py +0 -0
  54. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  55. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  56. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  57. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  58. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  59. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  60. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  61. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  62. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  63. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  64. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  65. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  66. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  67. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  68. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  69. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  70. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  71. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  72. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  73. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  74. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  75. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  76. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  77. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  78. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  79. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  80. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  81. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  82. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  83. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  84. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  85. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  86. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  87. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  88. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  89. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  90. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  91. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  92. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  93. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  94. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  95. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  96. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  97. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  98. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  99. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  100. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  101. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  102. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  103. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  104. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  105. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  106. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  107. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  108. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  109. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  110. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  111. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  112. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  113. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  114. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  115. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  116. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  117. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  118. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  119. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  120. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  121. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  122. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  123. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  124. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  125. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  126. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  127. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  128. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  129. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  130. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  131. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  132. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  133. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  134. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  135. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  136. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  137. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  138. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  139. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  140. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  141. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  142. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  143. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  144. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  145. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  146. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  147. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  148. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  149. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  150. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  151. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  152. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  153. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  154. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  155. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  156. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  157. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  158. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  159. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  160. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  161. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  162. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  163. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  164. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  165. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  166. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  167. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  168. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  169. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  170. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  171. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  172. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  173. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  174. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  175. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  176. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  177. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  178. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  179. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  180. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  181. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  182. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  183. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  184. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  185. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  186. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  187. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  188. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  189. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  190. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  191. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  192. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  193. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  194. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  195. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  196. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  197. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  198. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  199. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  200. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  201. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  202. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  203. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  204. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  205. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  206. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  207. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  208. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  209. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  210. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  211. {vgi_python-0.33.0 → vgi_python-0.34.1}/conformance/filter-v2/runtime-manifest.json +0 -0
  212. {vgi_python-0.33.0 → vgi_python-0.34.1}/dist-vgi/.gitignore +0 -0
  213. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/aggregate-functions.md +0 -0
  214. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/arguments.md +0 -0
  215. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/auth.md +0 -0
  216. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/catalogs.md +0 -0
  217. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/client.md +0 -0
  218. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/exceptions.md +0 -0
  219. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/filters.md +0 -0
  220. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/functions.md +0 -0
  221. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/http.md +0 -0
  222. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/index.md +0 -0
  223. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/metadata.md +0 -0
  224. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/observability.md +0 -0
  225. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/storage.md +0 -0
  226. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/transactor.md +0 -0
  227. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/api/worker.md +0 -0
  228. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/argument-serialization.md +0 -0
  229. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/apple-touch-icon.png +0 -0
  230. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/favicon-16x16.png +0 -0
  231. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/favicon-32x32.png +0 -0
  232. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/favicon.ico +0 -0
  233. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/kinds/aggregate.svg +0 -0
  234. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/kinds/buffering.svg +0 -0
  235. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/kinds/scalar.svg +0 -0
  236. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/kinds/table-in-out.svg +0 -0
  237. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/kinds/table.svg +0 -0
  238. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/logo.png +0 -0
  239. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/assets/social-card.png +0 -0
  240. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/authentication.md +0 -0
  241. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/catalog-interface.md +0 -0
  242. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/cli.md +0 -0
  243. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/column-statistics.md +0 -0
  244. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/concepts/index.md +0 -0
  245. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/contributing-docs.md +0 -0
  246. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/filter-pushdown.md +0 -0
  247. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/generator-api.md +0 -0
  248. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/global-functions.md +0 -0
  249. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/catalogs.md +0 -0
  250. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/function-patterns.md +0 -0
  251. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/http-auth.md +0 -0
  252. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/index.md +0 -0
  253. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/iroh.md +0 -0
  254. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/pushdown-and-statistics.md +0 -0
  255. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/state-storage.md +0 -0
  256. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/how-to/tailnet.md +0 -0
  257. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/index.md +0 -0
  258. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/lifecycle.md +0 -0
  259. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/metadata.md +0 -0
  260. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/overrides/main.html +0 -0
  261. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/protocol/index.md +0 -0
  262. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  263. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  264. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  265. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  266. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  267. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/robots.txt +0 -0
  268. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/shared-storage.md +0 -0
  269. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/stylesheets/extra.css +0 -0
  270. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/tutorial/index.md +0 -0
  271. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/tutorial/scalar.md +0 -0
  272. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/tutorial/table.md +0 -0
  273. {vgi_python-0.33.0 → vgi_python-0.34.1}/docs/vgi-logo.png +0 -0
  274. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/batch_index_worker.py +0 -0
  275. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/cache_worker.py +0 -0
  276. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/calc_scalar_worker.py +0 -0
  277. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/calc_worker.py +0 -0
  278. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/copy_format_worker.py +0 -0
  279. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/filter_worker.py +0 -0
  280. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/greeting_scalar_worker.py +0 -0
  281. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/row_count_worker.py +0 -0
  282. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/series_streaming_worker.py +0 -0
  283. {vgi_python-0.33.0 → vgi_python-0.34.1}/examples/sum_worker.py +0 -0
  284. {vgi_python-0.33.0 → vgi_python-0.34.1}/identity.png +0 -0
  285. {vgi_python-0.33.0 → vgi_python-0.34.1}/mkdocs.yml +0 -0
  286. {vgi_python-0.33.0 → vgi_python-0.34.1}/packages/vgi-fixtures/LICENSE +0 -0
  287. {vgi_python-0.33.0 → vgi_python-0.34.1}/packages/vgi-fixtures/README.md +0 -0
  288. {vgi_python-0.33.0 → vgi_python-0.34.1}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  289. {vgi_python-0.33.0 → vgi_python-0.34.1}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  290. {vgi_python-0.33.0 → vgi_python-0.34.1}/packages/vgi-fixtures/pyproject.toml +0 -0
  291. {vgi_python-0.33.0 → vgi_python-0.34.1}/scripts/measure_startup.py +0 -0
  292. {vgi_python-0.33.0 → vgi_python-0.34.1}/scripts/regen_generated.py +0 -0
  293. {vgi_python-0.33.0 → vgi_python-0.34.1}/scripts/run_all_tests.sh +0 -0
  294. {vgi_python-0.33.0 → vgi_python-0.34.1}/test-data/generate.sh +0 -0
  295. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/__init__.py +0 -0
  296. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/_http_fixtures.py +0 -0
  297. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/__init__.py +0 -0
  298. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_attach_option.py +0 -0
  299. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_catalog_interface.py +0 -0
  300. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_client_catalog.py +0 -0
  301. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_column_statistics.py +0 -0
  302. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_declarative.py +0 -0
  303. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_example_worker_catalog.py +0 -0
  304. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_integration.py +0 -0
  305. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_required_filters.py +0 -0
  306. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_scan_branches.py +0 -0
  307. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_serialization.py +0 -0
  308. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_setting.py +0 -0
  309. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_storage.py +0 -0
  310. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_time_travel.py +0 -0
  311. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/catalog/test_writable_table.py +0 -0
  312. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/__init__.py +0 -0
  313. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_aggregate_client.py +0 -0
  314. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_batch_metadata_callback.py +0 -0
  315. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_bind_and_join_keys.py +0 -0
  316. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_broken_pipe.py +0 -0
  317. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_cli.py +0 -0
  318. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_cli_catalog_functions.py +0 -0
  319. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_copy_client.py +0 -0
  320. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_http_response_budget.py +0 -0
  321. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_iroh_client.py +0 -0
  322. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_scan_branches_client.py +0 -0
  323. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_split_client.py +0 -0
  324. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_stop_force.py +0 -0
  325. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_table_column_statistics.py +0 -0
  326. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_time_travel_client.py +0 -0
  327. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/client/test_worker_debug.py +0 -0
  328. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/__init__.py +0 -0
  329. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/_stub.py +0 -0
  330. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/conftest.py +0 -0
  331. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_accumulate.py +0 -0
  332. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_aggregate.py +0 -0
  333. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_attach.py +0 -0
  334. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_bearer_auth.py +0 -0
  335. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_const_param_enforcement.py +0 -0
  336. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_container.py +0 -0
  337. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_copy_from.py +0 -0
  338. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_copy_to.py +0 -0
  339. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_directory_parity.py +0 -0
  340. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_function_inventory.py +0 -0
  341. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_github.py +0 -0
  342. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_http_client.py +0 -0
  343. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_http_external_location.py +0 -0
  344. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_http_upload_url.py +0 -0
  345. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_macro.py +0 -0
  346. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_overload.py +0 -0
  347. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_protocol_inventory.py +0 -0
  348. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_protocol_version.py +0 -0
  349. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_resumable_scan.py +0 -0
  350. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_scalar.py +0 -0
  351. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  352. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_secret.py +0 -0
  353. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_settings.py +0 -0
  354. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_splits.py +0 -0
  355. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_table.py +0 -0
  356. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_table_in_out.py +0 -0
  357. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_view.py +0 -0
  358. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conformance/test_writable.py +0 -0
  359. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/conftest.py +0 -0
  360. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  361. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  362. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  363. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/bad_version.bin +0 -0
  364. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/generate.py +0 -0
  365. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/manifest.json +0 -0
  366. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  367. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/stale_anchor.bin +0 -0
  368. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/truncated.bin +0 -0
  369. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/valid_sealed.bin +0 -0
  370. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  371. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/__init__.py +0 -0
  372. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_bernoulli_function.py +0 -0
  373. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_binary_packet_function.py +0 -0
  374. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_client.py +0 -0
  375. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_conditional_message_function.py +0 -0
  376. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_hash_seed_function.py +0 -0
  377. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  378. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_multiply_function.py +0 -0
  379. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_random_bytes_function.py +0 -0
  380. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/scalar/test_return_secret_value_function.py +0 -0
  381. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/__init__.py +0 -0
  382. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/__init__.py +0 -0
  383. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_constant_columns_function.py +0 -0
  384. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_double_sequence_function.py +0 -0
  385. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_exception_function.py +0 -0
  386. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_filter_echo_function.py +0 -0
  387. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_logging_function.py +0 -0
  388. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_nested_sequence_function.py +0 -0
  389. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_partitioned_function.py +0 -0
  390. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_projected_data_function.py +0 -0
  391. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_sequence_function.py +0 -0
  392. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_settings_function.py +0 -0
  393. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_struct_settings_function.py +0 -0
  394. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/generator/test_ten_thousand_function.py +0 -0
  395. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table/test_wide_columns.py +0 -0
  396. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/__init__.py +0 -0
  397. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/__init__.py +0 -0
  398. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  399. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/test_echo_function.py +0 -0
  400. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  401. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  402. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  403. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  404. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  405. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/table_in_out/test_client.py +0 -0
  406. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/tailnet/Dockerfile +0 -0
  407. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/tailnet/__init__.py +0 -0
  408. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/tailnet/compose.yaml +0 -0
  409. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/tailnet/probe.py +0 -0
  410. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/tailnet/run.sh +0 -0
  411. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/tailnet/test_worker.py +0 -0
  412. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/tailnet/worker.py +0 -0
  413. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_access_log_audit.py +0 -0
  414. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_aggregate_function.py +0 -0
  415. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_auth.py +0 -0
  416. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_bind_exceptions.py +0 -0
  417. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_bind_request_at_clause.py +0 -0
  418. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_bound_storage_conformance.py +0 -0
  419. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_cache_control.py +0 -0
  420. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_call_state_attach.py +0 -0
  421. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_catalog_auth_binding.py +0 -0
  422. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_client_oauth.py +0 -0
  423. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_codegen_request_inventory.py +0 -0
  424. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_copy_from_function.py +0 -0
  425. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_copy_to_function.py +0 -0
  426. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_docstrings.py +0 -0
  427. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_documentation_examples.py +0 -0
  428. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_example_function_arg_types.py +0 -0
  429. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_examples_workers.py +0 -0
  430. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_exception_handling.py +0 -0
  431. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_exceptions.py +0 -0
  432. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_filter_pushdown.py +0 -0
  433. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_filter_pushdown_extension.py +0 -0
  434. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_filter_v2.py +0 -0
  435. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_filter_v2_builder.py +0 -0
  436. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_filter_v2_runtime_corpus.py +0 -0
  437. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_filter_v2_spec_schema.py +0 -0
  438. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_fixture_catalog_parity.py +0 -0
  439. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_function_shape_mismatch.py +0 -0
  440. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_function_storage.py +0 -0
  441. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_function_storage_azure_sql.py +0 -0
  442. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_function_storage_cf_do.py +0 -0
  443. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_function_storage_cf_do_integration.py +0 -0
  444. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_function_storage_conformance.py +0 -0
  445. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_cpp_constants.py +0 -0
  446. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_cpp_protocol_name.py +0 -0
  447. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_cpp_protocol_version.py +0 -0
  448. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_cpp_request_builders.py +0 -0
  449. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_cpp_schemas.py +0 -0
  450. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_cpp_secret.py +0 -0
  451. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_go_schemas.py +0 -0
  452. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_java_schemas.py +0 -0
  453. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_protocol_version.py +0 -0
  454. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_rust_request_builders.py +0 -0
  455. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_rust_schemas.py +0 -0
  456. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_schemas_cross_lang.py +0 -0
  457. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_ts_client.py +0 -0
  458. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_generated_ts_schemas.py +0 -0
  459. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_http_demo_storage.py +0 -0
  460. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_http_s3_offload_input.py +0 -0
  461. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_http_s3_offload_output.py +0 -0
  462. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_launch_transport.py +0 -0
  463. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_metadata.py +0 -0
  464. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_mypy_consolidated.py +0 -0
  465. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_nest_tensor.py +0 -0
  466. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_otel.py +0 -0
  467. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_projection_enforcement.py +0 -0
  468. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_projection_repro.py +0 -0
  469. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_protocol_classes.py +0 -0
  470. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_resolved_secrets.py +0 -0
  471. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_schema_paths_v2.py +0 -0
  472. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_schema_scoped_functions.py +0 -0
  473. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_schema_utils.py +0 -0
  474. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_serve.py +0 -0
  475. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_setting_secret_annotations.py +0 -0
  476. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_signing_key.py +0 -0
  477. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_split_token.py +0 -0
  478. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_table_buffering_function.py +0 -0
  479. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_table_function_dynamic_to_string.py +0 -0
  480. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_tcp_transport.py +0 -0
  481. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_type_bounds.py +0 -0
  482. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_union_argument.py +0 -0
  483. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_wire_record_schema_parity.py +0 -0
  484. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_worker.py +0 -0
  485. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_worker_cli.py +0 -0
  486. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_worker_page.py +0 -0
  487. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/test_write_results.py +0 -0
  488. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/transactor/__init__.py +0 -0
  489. {vgi_python-0.33.0 → vgi_python-0.34.1}/tests/transactor/test_transactor.py +0 -0
  490. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/__init__.py +0 -0
  491. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_duckdb.py +0 -0
  492. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_storage_profile.py +0 -0
  493. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/__init__.py +0 -0
  494. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  495. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  496. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  497. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  498. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  499. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  500. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  501. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  502. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  503. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  504. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  505. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  506. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  507. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/aggregate/window.py +0 -0
  508. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/attach_options.py +0 -0
  509. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/bad_enum.py +0 -0
  510. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/bad_protocol.py +0 -0
  511. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/cancellable.py +0 -0
  512. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/catalog.py +0 -0
  513. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/companion.py +0 -0
  514. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/copy_from.py +0 -0
  515. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/copy_to.py +0 -0
  516. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/global_functions.py +0 -0
  517. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/http_server.py +0 -0
  518. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  519. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  520. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/nest_tensor.py +0 -0
  521. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  522. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  523. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  524. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  525. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/_common.py +0 -0
  526. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  527. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  528. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/binary.py +0 -0
  529. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  530. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/geo.py +0 -0
  531. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  532. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  533. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  534. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  535. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  536. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  537. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  538. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/simple_writable.py +0 -0
  539. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/__init__.py +0 -0
  540. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/_common.py +0 -0
  541. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/batch_index.py +0 -0
  542. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  543. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/cache.py +0 -0
  544. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  545. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/filters.py +0 -0
  546. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  547. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/make_series.py +0 -0
  548. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/misc.py +0 -0
  549. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/order_modes.py +0 -0
  550. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/pairs.py +0 -0
  551. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  552. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  553. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  554. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/required_filters.py +0 -0
  555. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  556. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  557. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/sequence.py +0 -0
  558. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/settings.py +0 -0
  559. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/splits.py +0 -0
  560. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  561. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  562. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  563. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/versioned.py +0 -0
  564. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table/wide.py +0 -0
  565. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  566. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  567. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/versioned.py +0 -0
  568. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/versioned_tables.py +0 -0
  569. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/writable/__init__.py +0 -0
  570. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/writable/generic.py +0 -0
  571. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/writable/table.py +0 -0
  572. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/_test_fixtures/writable/worker.py +0 -0
  573. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/aggregate_function.py +0 -0
  574. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/arguments.py +0 -0
  575. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/attach_header.py +0 -0
  576. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/auth.py +0 -0
  577. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/cache_control.py +0 -0
  578. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/__init__.py +0 -0
  579. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/_descriptor_spec.py +0 -0
  580. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/attach_option.py +0 -0
  581. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/catalog_interface.py +0 -0
  582. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/descriptors.py +0 -0
  583. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/duckdb_statistics.py +0 -0
  584. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/secret_type.py +0 -0
  585. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/setting.py +0 -0
  586. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/catalog/storage.py +0 -0
  587. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/__init__.py +0 -0
  588. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/aggregate.py +0 -0
  589. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/catalog_mixin.py +0 -0
  590. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/cli.py +0 -0
  591. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/cli_catalog.py +0 -0
  592. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/cli_schema.py +0 -0
  593. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/cli_table.py +0 -0
  594. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/cli_transaction.py +0 -0
  595. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/cli_utils.py +0 -0
  596. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/cli_view.py +0 -0
  597. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/client.py +0 -0
  598. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/client/errors.py +0 -0
  599. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/__init__.py +0 -0
  600. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/_common.py +0 -0
  601. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_constants.py +0 -0
  602. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_protocol_name.py +0 -0
  603. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_protocol_version.py +0 -0
  604. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_request_builders.py +0 -0
  605. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_schemas.py +0 -0
  606. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  607. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  608. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/cpp_secret_schemas.py +0 -0
  609. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/go_schemas.py +0 -0
  610. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/java_schemas.py +0 -0
  611. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/protocol_version.py +0 -0
  612. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/rust_request_builders.py +0 -0
  613. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/rust_schemas.py +0 -0
  614. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/ts_client.py +0 -0
  615. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/codegen/ts_schemas.py +0 -0
  616. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/copy_from_function.py +0 -0
  617. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/copy_to_function.py +0 -0
  618. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/exceptions.py +0 -0
  619. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/filter_v2.py +0 -0
  620. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/filter_v2_builder.py +0 -0
  621. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/function.py +0 -0
  622. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/function_storage.py +0 -0
  623. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/function_storage_azure_sql.py +0 -0
  624. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/function_storage_cf_do.py +0 -0
  625. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/http/__init__.py +0 -0
  626. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/http/demo_storage.py +0 -0
  627. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/http/landing.html +0 -0
  628. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/http/landing_page.py +0 -0
  629. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/http/vgi-client.js +0 -0
  630. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/http/worker_page.py +0 -0
  631. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/invocation.py +0 -0
  632. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/logging_config.py +0 -0
  633. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/meta_worker.py +0 -0
  634. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/metadata.py +0 -0
  635. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/otel.py +0 -0
  636. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/profiling.py +0 -0
  637. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/protocol.py +0 -0
  638. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/protocol_version.txt +0 -0
  639. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/py.typed +0 -0
  640. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/scalar_function.py +0 -0
  641. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/schema_path.py +0 -0
  642. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/schema_utils.py +0 -0
  643. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/secret_protocol.py +0 -0
  644. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/secret_service.py +0 -0
  645. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/serve.py +0 -0
  646. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/split_token.py +0 -0
  647. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/table_buffering_function.py +0 -0
  648. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/table_filter_pushdown.py +0 -0
  649. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/table_in_out_function.py +0 -0
  650. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/transactor/__init__.py +0 -0
  651. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/transactor/_duckdb_compat.py +0 -0
  652. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/transactor/client.py +0 -0
  653. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/transactor/protocol.py +0 -0
  654. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/transactor/server.py +0 -0
  655. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/worker.py +0 -0
  656. {vgi_python-0.33.0 → vgi_python-0.34.1}/vgi/write_results.py +0 -0
  657. {vgi_python-0.33.0 → vgi_python-0.34.1}/wrangler.jsonc +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.33.0
3
+ Version: 0.34.1
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.33.0"
3
+ version = "0.34.1"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -280,3 +280,73 @@ class TestHasFinalizeSkip:
280
280
  assert len(with_finalize) == 1
281
281
  assert len(without_finalize) == 1
282
282
  assert with_finalize[0].column("i").to_pylist() == without_finalize[0].column("i").to_pylist()
283
+
284
+
285
+ class TestBlendedAny:
286
+ """`blended_any` / `blended_any_varargs`: positional input columns declared ANY.
287
+
288
+ An ANY arg names no concrete Arrow type, so the output type can only come from
289
+ the input schema the client supplies at bind. These drive that over the wire:
290
+ the same registration must bind to whatever type each call resolves to, and
291
+ echo the column back untouched (nested types and nulls included).
292
+ """
293
+
294
+ @pytest.mark.parametrize(
295
+ "array",
296
+ [
297
+ pa.array(["a", None, "c"], type=pa.string()),
298
+ pa.array([1, 2, None], type=pa.int32()),
299
+ pa.array(
300
+ [{"message": "lost pkg", "tier": "gold"}, None, {"message": None, "tier": "free"}],
301
+ type=pa.struct([("message", pa.string()), ("tier", pa.string())]),
302
+ ),
303
+ pa.array([[1, 2], [], None], type=pa.list_(pa.int64())),
304
+ ],
305
+ ids=["string", "int32", "struct", "list"],
306
+ )
307
+ def test_output_is_typed_from_the_input_and_echoed(self, fixture_worker: str, array: pa.Array[Any]) -> None:
308
+ """One registration, bound per call to the resolved input type."""
309
+ batch = pa.record_batch({"value": array})
310
+ bound: list[pa.Schema] = []
311
+
312
+ with Client(fixture_worker) as client:
313
+ results = list(
314
+ client.table_in_out_function(
315
+ function_name="blended_any",
316
+ schema_path=["main"],
317
+ input=iter([batch]),
318
+ bind_result_callback=lambda r: bound.append(r.output_schema),
319
+ has_finalize=False,
320
+ )
321
+ )
322
+
323
+ assert [s.names for s in bound] == [["value"]]
324
+ assert bound[0].field("value").type == array.type
325
+ (out,) = results
326
+ assert out.column("value").type == array.type
327
+ # A null struct and a struct with a null field must stay distinct.
328
+ assert out.column("value").to_pylist() == array.to_pylist()
329
+
330
+ def test_varargs_columns_each_keep_their_own_type(self, fixture_worker: str) -> None:
331
+ """The vararg element type is ANY, so every runtime column types itself."""
332
+ batch = pa.record_batch(
333
+ {
334
+ "col0": pa.array(["a", "b"], type=pa.string()),
335
+ "col1": pa.array([[1], [2, 3]], type=pa.list_(pa.int32())),
336
+ "col2": pa.array([{"k": 1.5}, None], type=pa.struct([("k", pa.float64())])),
337
+ }
338
+ )
339
+
340
+ with Client(fixture_worker) as client:
341
+ (out,) = list(
342
+ client.table_in_out_function(
343
+ function_name="blended_any_varargs",
344
+ schema_path=["main"],
345
+ input=iter([batch]),
346
+ has_finalize=False,
347
+ )
348
+ )
349
+
350
+ assert out.schema.names == ["col0", "col1", "col2"]
351
+ assert out.schema.types == batch.schema.types
352
+ assert out.to_pylist() == batch.to_pylist()
@@ -148,3 +148,43 @@ class TestBlendedFootguns:
148
148
 
149
149
  with pytest.raises(TypeError, match="at least one positional Arg"):
150
150
  resolve_metadata(_NamedOnly)
151
+
152
+
153
+ class TestBlendedAnyResolution:
154
+ """A blended function may declare its positional input column(s) ANY.
155
+
156
+ The ANY marker lives on the argument *spec* — the ``vgi_type=any`` field
157
+ metadata the client reads to learn it must take the column's type from the
158
+ call rather than from the declaration.
159
+ """
160
+
161
+ def test_any_positional_is_a_blended_input_column(self) -> None:
162
+ """The ANY arg resolves as a positional input column, not a bind constant."""
163
+ from vgi._test_fixtures.table_in_out import BlendedAnyFunction
164
+ from vgi.argument_spec import extract_argument_specs
165
+
166
+ m = resolve_metadata(BlendedAnyFunction)
167
+ assert m.input_from_args is True
168
+ assert m.has_finalize is False
169
+ (spec,) = extract_argument_specs(BlendedAnyFunction)
170
+ assert (spec.name, spec.position, spec.is_any_type, spec.is_varargs) == ("value", 0, True, False)
171
+
172
+ def test_any_varargs_is_a_blended_input_column(self) -> None:
173
+ """The varargs form keeps both markers: ANY element type and varargs."""
174
+ from vgi._test_fixtures.table_in_out import BlendedAnyVarargsFunction
175
+ from vgi.argument_spec import extract_argument_specs
176
+
177
+ assert resolve_metadata(BlendedAnyVarargsFunction).input_from_args is True
178
+ (spec,) = extract_argument_specs(BlendedAnyVarargsFunction)
179
+ assert (spec.name, spec.position, spec.is_any_type, spec.is_varargs) == ("values", 0, True, True)
180
+
181
+ def test_any_marker_survives_the_wire_schema(self) -> None:
182
+ """The client learns the arg is ANY from the serialized arguments schema."""
183
+ from vgi._test_fixtures.table_in_out import BlendedAnyFunction, BlendedAnyVarargsFunction
184
+ from vgi.argument_spec import argument_specs_to_schema, extract_argument_specs, schema_to_argument_specs
185
+
186
+ for function in (BlendedAnyFunction, BlendedAnyVarargsFunction):
187
+ specs = extract_argument_specs(function)
188
+ wire = schema_to_argument_specs(argument_specs_to_schema(specs))
189
+ assert [s.is_any_type for s in wire] == [True]
190
+ assert [s.is_varargs for s in wire] == [s.is_varargs for s in specs]
@@ -4,6 +4,7 @@
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
+ import dataclasses
7
8
  from typing import Annotated, Any
8
9
 
9
10
  import pyarrow as pa
@@ -856,7 +857,7 @@ class TestArgumentConstraints:
856
857
  assert defaults.column("label")[0].as_py() is None
857
858
 
858
859
  def test_typed_default_requires_concrete_parameter_type(self) -> None:
859
- """An ANY parameter cannot carry an untyped protocol default."""
860
+ """An ANY parameter cannot carry an untyped protocol default VALUE."""
860
861
  spec = ArgumentSpec(
861
862
  name="value",
862
863
  position=0,
@@ -865,9 +866,65 @@ class TestArgumentConstraints:
865
866
  default_value=1,
866
867
  )
867
868
 
868
- with pytest.raises(ValueError, match="typed defaults require an explicit parameter type"):
869
+ with pytest.raises(ValueError, match="a typed default requires an explicit parameter type"):
869
870
  parameter_default_values_from_specs([spec], require_trailing=True)
870
871
 
872
+ def test_an_any_parameter_may_default_to_none(self) -> None:
873
+ """`None` IS representable on an ANY parameter — a null array holds nulls.
874
+
875
+ It is column presence, not the value, that marks a parameter as having a
876
+ default, so this costs the protocol nothing. It buys a function the
877
+ ability to declare a *required* ANY argument with ``default=None`` so
878
+ that omitting it reaches ``on_bind()``, where the function can name the
879
+ argument and show its shape, instead of raising a bare ``KeyError``
880
+ during argument parsing before any user code runs.
881
+ """
882
+ spec = ArgumentSpec(
883
+ name="questions",
884
+ position="questions",
885
+ arrow_type=pa.null(),
886
+ is_any_type=True,
887
+ default_value=None,
888
+ )
889
+
890
+ defaults = parameter_default_values_from_specs([spec], require_trailing=True)
891
+
892
+ assert defaults is not None
893
+ assert defaults.schema.names == ["questions"]
894
+ assert defaults.column("questions").type == pa.null()
895
+ assert defaults.column("questions")[0].as_py() is None
896
+
897
+ def test_an_optional_any_argument_is_still_an_any_argument(self) -> None:
898
+ """``AnyArrow | None`` must stay ANY-typed, not collapse to a NULL column.
899
+
900
+ A marker type is recognised by identity, so an Optional wrapper used to
901
+ hide it: the parameter silently became NULL-typed and DuckDB could then
902
+ cast nothing into it (`Unimplemented type for cast (STRUCT(...) -> NULL)`).
903
+ Declaring a REQUIRED ANY argument nullable, with ``default=None``, is how
904
+ a function gets to reject the missing case in its own ``on_bind()`` with
905
+ a message naming the argument.
906
+ """
907
+
908
+ @dataclasses.dataclass(slots=True, frozen=True, kw_only=True)
909
+ class _Args:
910
+ """Args with a required-but-nullable ANY parameter."""
911
+
912
+ payload: Annotated[AnyArrow | None, Arg("payload", default=None)] = None
913
+
914
+ class _Fn(TableInOutFunction[_Args]):
915
+ """A function declaring one optional ANY argument."""
916
+
917
+ FunctionArguments = _Args
918
+
919
+ class Meta:
920
+ """Metadata."""
921
+
922
+ name = "optional_any"
923
+
924
+ (spec,) = [sp for sp in extract_argument_specs(_Fn) if sp.name == "payload"]
925
+ assert spec.is_any_type, "an optional ANY argument lost its ANY marker"
926
+ assert pa.types.is_null(spec.arrow_type)
927
+
871
928
  def test_typed_defaults_reject_case_insensitive_duplicate_names(self) -> None:
872
929
  """Default-batch field names must identify one signature slot."""
873
930
  specs = [
@@ -0,0 +1,205 @@
1
+ # Copyright 2026 Query Farm LLC - https://query.farm
2
+
3
+ """Importing vgi, and defining functions, must not touch the filesystem.
4
+
5
+ ``Function.storage`` resolves the default SQLite store lazily, on first access.
6
+ ``TableFunctionBase.__init_subclass__`` used to defeat that: it detected
7
+ abstract classes with a plain ``getattr`` over ``dir(cls)``, which invoked the
8
+ storage descriptor, which created ``vgi_storage.db`` under the user's state
9
+ directory. Because vgi defines subclasses of its own, a bare ``import vgi`` did
10
+ it — and failed outright wherever that directory was not writable, such as a
11
+ container running as a non-root user whose home belongs to root.
12
+
13
+ The import checks run in a subprocess with ``HOME`` and the XDG directories
14
+ pointed at an empty temporary directory, because the storage descriptor caches
15
+ its backend per process and the test process has usually resolved it already.
16
+ """
17
+
18
+ import os
19
+ import subprocess
20
+ import sys
21
+ from abc import abstractmethod
22
+ from pathlib import Path
23
+
24
+ import pytest
25
+
26
+ from vgi.table_function import TableFunctionGenerator
27
+
28
+ #: Imports every function base class and defines a concrete table function, so
29
+ #: both vgi's own class definitions and a worker's go through __init_subclass__.
30
+ _IMPORT_AND_DEFINE = """
31
+ import pyarrow as pa
32
+ import vgi
33
+ import vgi.aggregate_function
34
+ import vgi.scalar_function
35
+ import vgi.table_in_out_function
36
+ from vgi.invocation import BindResponse
37
+ from vgi.table_function import TableFunctionGenerator
38
+
39
+
40
+ class Concrete(TableFunctionGenerator[None, None]):
41
+ @classmethod
42
+ def on_bind(cls, params):
43
+ return BindResponse(output_schema=pa.schema([("n", pa.int64())]))
44
+
45
+ @classmethod
46
+ def process(cls, params, state, out):
47
+ out.finish()
48
+
49
+
50
+ # The direct check, independent of where a platform keeps its state directory:
51
+ # reading through __dict__ does not invoke the descriptor.
52
+ from vgi.function import Function
53
+
54
+ assert Function.__dict__["storage"]._resolved is None, "storage was resolved during import"
55
+ """
56
+
57
+
58
+ def _isolated_env(home: Path) -> dict[str, str]:
59
+ """Environment whose every per-user directory lives under ``home``.
60
+
61
+ ``VGI_*`` variables are dropped so the default file-backed SQLite store is
62
+ the one in play; a test run configured with ``VGI_WORKER_SHARED_STORAGE``
63
+ set to ``memory`` would otherwise pass without the fix.
64
+ """
65
+ env = {k: v for k, v in os.environ.items() if not k.startswith(("VGI_", "XDG_"))}
66
+ env["HOME"] = str(home)
67
+ for name in ("XDG_STATE_HOME", "XDG_DATA_HOME", "XDG_CACHE_HOME", "XDG_CONFIG_HOME"):
68
+ env[name] = str(home / name.lower())
69
+ # platformdirs asks Windows for its folders directly and ignores HOME and
70
+ # XDG there, but honors these overrides.
71
+ for name in ("LOCAL_APPDATA", "APPDATA"):
72
+ env[f"WIN_PD_OVERRIDE_{name}"] = str(home / name.lower())
73
+ return env
74
+
75
+
76
+ def _run(code: str, home: Path) -> subprocess.CompletedProcess[str]:
77
+ """Run ``code`` in a fresh interpreter with per-user directories under ``home``."""
78
+ return subprocess.run(
79
+ [sys.executable, "-c", code],
80
+ env=_isolated_env(home),
81
+ capture_output=True,
82
+ text=True,
83
+ timeout=120,
84
+ check=False,
85
+ )
86
+
87
+
88
+ def _files_under(root: Path) -> list[str]:
89
+ """Every file below ``root``, relative to it."""
90
+ return sorted(str(p.relative_to(root)) for p in root.rglob("*") if p.is_file())
91
+
92
+
93
+ class TestImportWritesNothing:
94
+ """The storage store is created when it is used, not when vgi is imported."""
95
+
96
+ def test_import_and_define_create_no_files(self, tmp_path: Path) -> None:
97
+ """Importing vgi and defining a function leaves the home directory empty."""
98
+ result = _run(_IMPORT_AND_DEFINE, tmp_path)
99
+ assert result.returncode == 0, result.stderr
100
+ assert _files_under(tmp_path) == []
101
+
102
+ @pytest.mark.skipif(
103
+ sys.platform == "win32" or os.geteuid() == 0,
104
+ reason="a read-only directory does not stop root, and POSIX modes do not apply on Windows",
105
+ )
106
+ def test_import_succeeds_when_home_is_not_writable(self, tmp_path: Path) -> None:
107
+ """A read-only home — a container's non-root user, say — does not stop the import."""
108
+ home = tmp_path / "home"
109
+ home.mkdir()
110
+ home.chmod(0o555)
111
+ try:
112
+ result = _run(_IMPORT_AND_DEFINE, home)
113
+ finally:
114
+ home.chmod(0o755)
115
+ assert result.returncode == 0, result.stderr
116
+
117
+ def test_storage_is_still_created_on_first_use(self, tmp_path: Path) -> None:
118
+ """Laziness, not removal: touching Function.storage still creates the store."""
119
+ result = _run("from vgi.function import Function\nFunction.storage", tmp_path)
120
+ assert result.returncode == 0, result.stderr
121
+ assert any(name.endswith("vgi_storage.db") for name in _files_under(tmp_path))
122
+
123
+
124
+ class _NotADataclass:
125
+ """An argument type a concrete function would be rejected for."""
126
+
127
+
128
+ class TestAbstractDetection:
129
+ """Reading attributes statically must still recognize every kind of abstract member.
130
+
131
+ An abstract class skips validation of its argument type; a concrete one is
132
+ rejected at class creation when that type is not a dataclass. So a class
133
+ with an invalid argument type is defined successfully only if it is seen as
134
+ abstract.
135
+ """
136
+
137
+ def test_a_concrete_class_is_validated(self) -> None:
138
+ """Control: without an abstract member, the invalid argument type is rejected."""
139
+ with pytest.raises(TypeError, match="must be a dataclass"):
140
+
141
+ class Concrete(TableFunctionGenerator[_NotADataclass, None]):
142
+ @classmethod
143
+ def on_bind(cls, params): # type: ignore[no-untyped-def]
144
+ raise NotImplementedError
145
+
146
+ @classmethod
147
+ def process(cls, params, state, out): # type: ignore[no-untyped-def]
148
+ raise NotImplementedError
149
+
150
+ def test_an_abstract_classmethod_marks_the_class_abstract(self) -> None:
151
+ """An inherited-concrete class that adds an abstract classmethod skips validation."""
152
+
153
+ class WithAbstractClassmethod(TableFunctionGenerator[_NotADataclass, None]):
154
+ @classmethod
155
+ def on_bind(cls, params): # type: ignore[no-untyped-def]
156
+ raise NotImplementedError
157
+
158
+ @classmethod
159
+ def process(cls, params, state, out): # type: ignore[no-untyped-def]
160
+ raise NotImplementedError
161
+
162
+ @classmethod
163
+ @abstractmethod
164
+ def extra(cls) -> None:
165
+ """Left for a subclass to implement."""
166
+
167
+ assert WithAbstractClassmethod._setting_params == {}
168
+
169
+ def test_an_abstract_staticmethod_marks_the_class_abstract(self) -> None:
170
+ """An abstract staticmethod is recognized through its raw attribute too."""
171
+
172
+ class WithAbstractStaticmethod(TableFunctionGenerator[_NotADataclass, None]):
173
+ @classmethod
174
+ def on_bind(cls, params): # type: ignore[no-untyped-def]
175
+ raise NotImplementedError
176
+
177
+ @classmethod
178
+ def process(cls, params, state, out): # type: ignore[no-untyped-def]
179
+ raise NotImplementedError
180
+
181
+ @staticmethod
182
+ @abstractmethod
183
+ def extra() -> None:
184
+ """Left for a subclass to implement."""
185
+
186
+ assert WithAbstractStaticmethod._setting_params == {}
187
+
188
+ def test_an_abstract_property_marks_the_class_abstract(self) -> None:
189
+ """An abstract property is recognized through its raw attribute too."""
190
+
191
+ class WithAbstractProperty(TableFunctionGenerator[_NotADataclass, None]):
192
+ @classmethod
193
+ def on_bind(cls, params): # type: ignore[no-untyped-def]
194
+ raise NotImplementedError
195
+
196
+ @classmethod
197
+ def process(cls, params, state, out): # type: ignore[no-untyped-def]
198
+ raise NotImplementedError
199
+
200
+ @property
201
+ @abstractmethod
202
+ def extra(self) -> int:
203
+ """Left for a subclass to implement."""
204
+
205
+ assert WithAbstractProperty._setting_params == {}
@@ -2580,7 +2580,7 @@ requires-dist = [
2580
2580
 
2581
2581
  [[package]]
2582
2582
  name = "vgi-python"
2583
- version = "0.33.0"
2583
+ version = "0.34.1"
2584
2584
  source = { editable = "." }
2585
2585
  dependencies = [
2586
2586
  { name = "click" },
@@ -51,7 +51,7 @@ from vgi_rpc import ArrowSerializableDataclass, ArrowType
51
51
  from vgi_rpc.log import Level
52
52
  from vgi_rpc.rpc import OutputCollector
53
53
 
54
- from vgi.arguments import Arg, Setting, TableInput
54
+ from vgi.arguments import AnyArrow, Arg, Setting, TableInput
55
55
  from vgi.cache_control import CacheControl
56
56
  from vgi.invocation import BindResponse
57
57
  from vgi.metadata import FunctionExample
@@ -94,6 +94,8 @@ __all__ = [
94
94
  "GeoEncode3Function",
95
95
  "RowSumFunction",
96
96
  "BlendedDropFunction",
97
+ "BlendedAnyFunction",
98
+ "BlendedAnyVarargsFunction",
97
99
  "SubstreamPartialSumFunction",
98
100
  "MultiBatchFinishFunction",
99
101
  "SumAllColumnsFunction",
@@ -1880,6 +1882,87 @@ class BlendedExplodeFunction(RowTransformFunction[_ExplodeArgs]):
1880
1882
  cast("VgiOutputCollector", out).emit(out_batch, parent_rows=parent_rows)
1881
1883
 
1882
1884
 
1885
+ @dataclass(slots=True, frozen=True, kw_only=True)
1886
+ class _AnyArgs:
1887
+ """One positional ANY-typed input column."""
1888
+
1889
+ value: Annotated[AnyArrow, Arg(0, doc="Input column of any type (echoed back unchanged)")]
1890
+
1891
+
1892
+ class BlendedAnyFunction(RowTransformFunction[_AnyArgs]):
1893
+ """Blended 1->1 echo of a single ANY-typed input column.
1894
+
1895
+ Proves a blended positional arg may be declared ANY: the declared type names
1896
+ no concrete Arrow type, so the client must build the worker's input schema
1897
+ from the type DuckDB actually resolved for the call (a STRUCT built per row,
1898
+ a whole-row struct, a LIST, a plain VARCHAR ...) rather than from the
1899
+ declaration. The output column ``value`` is bound to that resolved input
1900
+ type at bind time and the column is passed through untouched, so a test
1901
+ asserts on DuckDB's own ``typeof(value)`` and on the round-tripped values —
1902
+ nothing here depends on how an SDK happens to render a type name.
1903
+ """
1904
+
1905
+ class Meta:
1906
+ name = "blended_any"
1907
+ description = "Blended 1->1 echo of one ANY-typed input column (output typed from the input)"
1908
+ categories = ["blended", "test"]
1909
+
1910
+ @classmethod
1911
+ def on_bind(cls, params: BindParams[_AnyArgs]) -> BindResponse:
1912
+ input_schema = params.bind_call.input_schema
1913
+ assert input_schema is not None
1914
+ return BindResponse(output_schema=pa.schema([pa.field("value", input_schema.field(0).type)]))
1915
+
1916
+ @classmethod
1917
+ def process(
1918
+ cls,
1919
+ params: ProcessParams[_AnyArgs],
1920
+ state: None,
1921
+ batch: pa.RecordBatch,
1922
+ out: OutputCollector,
1923
+ ) -> None:
1924
+ out.emit(pa.record_batch([batch.column(0)], schema=params.output_schema))
1925
+
1926
+
1927
+ @dataclass(slots=True, frozen=True, kw_only=True)
1928
+ class _AnyVarargsArgs:
1929
+ """N positional ANY-typed input columns, each free to be a different type."""
1930
+
1931
+ values: Annotated[list[AnyArrow], Arg(0, varargs=True, doc="Input columns of any types (echoed back)")]
1932
+
1933
+
1934
+ class BlendedAnyVarargsFunction(RowTransformFunction[_AnyVarargsArgs]):
1935
+ """Blended 1->1 echo of N ANY-typed VARARGS input columns.
1936
+
1937
+ The varargs counterpart of ``blended_any``: every runtime column may resolve
1938
+ to a different concrete type, so the client must take each column's type
1939
+ from the call rather than from the (ANY) vararg element type. Output columns
1940
+ are ``col0..colN-1`` — the names the client generates for varargs blended
1941
+ input — each bound to its own resolved input type.
1942
+ """
1943
+
1944
+ class Meta:
1945
+ name = "blended_any_varargs"
1946
+ description = "Blended 1->1 echo of N ANY-typed varargs input columns (col0..colN-1)"
1947
+ categories = ["blended", "test"]
1948
+
1949
+ @classmethod
1950
+ def on_bind(cls, params: BindParams[_AnyVarargsArgs]) -> BindResponse:
1951
+ input_schema = params.bind_call.input_schema
1952
+ assert input_schema is not None
1953
+ return BindResponse(output_schema=pa.schema([pa.field(f"col{i}", f.type) for i, f in enumerate(input_schema)]))
1954
+
1955
+ @classmethod
1956
+ def process(
1957
+ cls,
1958
+ params: ProcessParams[_AnyVarargsArgs],
1959
+ state: None,
1960
+ batch: pa.RecordBatch,
1961
+ out: OutputCollector,
1962
+ ) -> None:
1963
+ out.emit(pa.record_batch(cls.input_columns(batch), schema=params.output_schema))
1964
+
1965
+
1883
1966
  class CachedExplodeFunction(RowTransformFunction[_ExplodeArgs]):
1884
1967
  """Cacheable blended 1->N fan-out advertising vgi.cache.per_value.
1885
1968
 
@@ -267,6 +267,8 @@ from vgi._test_fixtures.table.tt_pushdown import (
267
267
  )
268
268
  from vgi._test_fixtures.table_in_out import (
269
269
  BatchIndexBufferInputFunction,
270
+ BlendedAnyFunction,
271
+ BlendedAnyVarargsFunction,
270
272
  BlendedDropFunction,
271
273
  BlendedExplodeFunction,
272
274
  BufferEmitWideFunction,
@@ -432,6 +434,8 @@ _EXAMPLE_CATALOG = Catalog(
432
434
  GeoEncode3Function,
433
435
  RowSumFunction,
434
436
  BlendedDropFunction,
437
+ BlendedAnyFunction,
438
+ BlendedAnyVarargsFunction,
435
439
  BlendedExplodeFunction,
436
440
  CachedExplodeFunction,
437
441
  ProjectableBlendedFunction,
@@ -19,7 +19,8 @@ import warnings
19
19
  from collections.abc import Sequence
20
20
  from dataclasses import dataclass
21
21
  from functools import cache
22
- from typing import Annotated, Any, get_args, get_origin, get_type_hints
22
+ from types import UnionType
23
+ from typing import Annotated, Any, Union, get_args, get_origin, get_type_hints
23
24
 
24
25
  import pyarrow as pa
25
26
 
@@ -395,14 +396,22 @@ def parameter_default_values_from_specs(
395
396
  arrays: list[pa.Array[Any]] = []
396
397
  names: list[str] = []
397
398
  for spec in default_specs:
398
- if pa.types.is_null(spec.arrow_type):
399
- raise ValueError(
400
- f"Parameter {spec.name!r} has a default but no concrete Arrow type; "
401
- "typed defaults require an explicit parameter type"
402
- )
403
399
  value = spec.default_value
404
400
  if isinstance(value, pa.Scalar):
405
401
  value = value.as_py()
402
+ # An ANY-typed parameter (AnyArrow) has no concrete Arrow type, so a
403
+ # VALUE default cannot be represented. `None` still can: a null-typed
404
+ # array holds nulls, and it is column PRESENCE, not the value, that
405
+ # marks a parameter as having a default. Allowing it lets a required
406
+ # ANY parameter be declared `default=None` so that omitting it reaches
407
+ # the function's own on_bind() validation — which can name the argument
408
+ # and show its shape — instead of raising a bare KeyError during
409
+ # argument parsing, before any user code runs.
410
+ if pa.types.is_null(spec.arrow_type) and value is not None:
411
+ raise ValueError(
412
+ f"Parameter {spec.name!r} has a non-null default but no concrete Arrow type; "
413
+ "a typed default requires an explicit parameter type (None is allowed)"
414
+ )
406
415
  try:
407
416
  arrays.append(pa.array([value], type=spec.arrow_type))
408
417
  except (pa.ArrowException, TypeError, ValueError) as exc:
@@ -538,6 +547,30 @@ def _format_range(
538
547
  return f"{low}, {high}"
539
548
 
540
549
 
550
+ def _unwrap_optional(annotation: Any) -> Any:
551
+ """``T | None`` -> ``T``; anything else unchanged.
552
+
553
+ A special marker type (``AnyArrow``, ``TableInput``) is recognised by
554
+ identity, so an Optional wrapper would hide it — an ``AnyArrow | None``
555
+ parameter would silently become a NULL-typed one, and DuckDB then cannot
556
+ cast anything into it. Unwrapping first lets a marker be declared nullable,
557
+ which is how a REQUIRED ANY argument opts into reaching its function's own
558
+ ``on_bind()`` validation (with ``default=None``) instead of being rejected
559
+ during parsing. Mirrors what ``_accepts_none`` already looks for.
560
+
561
+ Args:
562
+ annotation: The declared type of an ``Annotated[T, Arg(...)]`` field.
563
+
564
+ Returns:
565
+ The single non-``None`` member of an optional union, else ``annotation``.
566
+ """
567
+ origin = get_origin(annotation)
568
+ if origin is not Union and origin is not UnionType:
569
+ return annotation
570
+ members = [a for a in get_args(annotation) if a is not type(None)]
571
+ return members[0] if len(members) == 1 else annotation
572
+
573
+
541
574
  def _constraint_kwargs(arg: Arg[Any]) -> dict[str, Any]:
542
575
  """Extract discovery-facing constraint metadata from an [`Arg`][] descriptor.
543
576
 
@@ -744,6 +777,7 @@ def _extract_argument_specs(
744
777
  if type_args:
745
778
  infer_type = type_args[0]
746
779
 
780
+ infer_type = _unwrap_optional(infer_type)
747
781
  is_table_input = infer_type is TableInput
748
782
  is_any_type = infer_type is AnyArrow or infer_type is AnyArrowValue
749
783
 
@@ -790,8 +824,8 @@ def _extract_argument_specs(
790
824
  # Check for special types (AnyArrow, TableInput)
791
825
  # Priority: Arg subscript type (Arg[AnyArrow]) > class type hint
792
826
  # Also check _returns_any_arrow_value for Annotated[AnyArrowValue, ...]
793
- hint = hints.get(attr_name)
794
- type_param = getattr(arg_legacy, "_type_param", None)
827
+ hint = _unwrap_optional(hints.get(attr_name))
828
+ type_param = _unwrap_optional(getattr(arg_legacy, "_type_param", None))
795
829
  is_table_input = type_param is TableInput or hint is TableInput
796
830
  is_any_type = (
797
831
  type_param is AnyArrow
@@ -8,6 +8,7 @@ to `process()` either emits a batch via `out.emit()` or signals completion via `
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import inspect
11
12
  import uuid
12
13
  from abc import abstractmethod
13
14
  from collections.abc import Mapping
@@ -854,8 +855,19 @@ class TableFunctionBase[TArgs](vgi.function.Function):
854
855
  cls.FunctionArguments = type_args[0]
855
856
  break
856
857
 
857
- # Skip validation for abstract base classes
858
- is_abstract = any(getattr(getattr(cls, name, None), "__isabstractmethod__", False) for name in dir(cls))
858
+ # Skip validation for abstract base classes. Each attribute is read with
859
+ # getattr_static, which returns the raw class attribute without invoking
860
+ # descriptors: a plain getattr() here resolved the inherited
861
+ # `Function.storage` descriptor, whose first access builds the default
862
+ # SQLite store on disk. Because vgi defines subclasses of its own, that
863
+ # made `import vgi` alone create a database under the user's state
864
+ # directory, and fail outright where that directory is not writable (a
865
+ # container's non-root user, say). The raw attribute answers the same
866
+ # question: classmethod, staticmethod and property objects all expose
867
+ # the `__isabstractmethod__` of what they wrap.
868
+ is_abstract = any(
869
+ getattr(inspect.getattr_static(cls, name, None), "__isabstractmethod__", False) for name in dir(cls)
870
+ )
859
871
  if is_abstract:
860
872
  cls._setting_params = {}
861
873
  cls._secret_params = {}