vgi-python 0.34.1__tar.gz → 0.35.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 (658) hide show
  1. {vgi_python-0.34.1 → vgi_python-0.35.0}/CLAUDE.md +4 -3
  2. {vgi_python-0.34.1 → vgi_python-0.35.0}/PKG-INFO +2 -2
  3. {vgi_python-0.34.1 → vgi_python-0.35.0}/pyproject.toml +2 -2
  4. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_client_catalog.py +1 -5
  5. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_example_worker_catalog.py +2 -1
  6. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_function_inventory.py +4 -3
  7. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conftest.py +88 -7
  8. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_exception_function.py +4 -3
  9. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_filter_echo_function.py +4 -3
  10. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_logging_function.py +4 -3
  11. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_partitioned_function.py +7 -6
  12. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_projected_data_function.py +3 -2
  13. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_sequence_function.py +2 -1
  14. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_settings_function.py +5 -4
  15. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_struct_settings_function.py +3 -2
  16. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +43 -11
  17. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/test_client.py +5 -3
  18. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_bind_exceptions.py +6 -5
  19. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_exception_handling.py +12 -11
  20. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_function_storage.py +119 -0
  21. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_launch_transport.py +45 -0
  22. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_projection_enforcement.py +4 -3
  23. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_projection_repro.py +8 -7
  24. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_serve.py +16 -12
  25. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_setting_secret_annotations.py +3 -2
  26. vgi_python-0.35.0/tests/test_subprocess_transport.py +41 -0
  27. {vgi_python-0.34.1 → vgi_python-0.35.0}/uv.lock +5 -5
  28. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table_in_out.py +6 -5
  29. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/client.py +46 -0
  30. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/function.py +18 -4
  31. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/function_storage.py +41 -29
  32. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/serve.py +1 -58
  33. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/table_in_out_function.py +12 -5
  34. {vgi_python-0.34.1 → vgi_python-0.35.0}/.dockerignore +0 -0
  35. {vgi_python-0.34.1 → vgi_python-0.35.0}/.gitattributes +0 -0
  36. {vgi_python-0.34.1 → vgi_python-0.35.0}/.github/dependabot.yml +0 -0
  37. {vgi_python-0.34.1 → vgi_python-0.35.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  38. {vgi_python-0.34.1 → vgi_python-0.35.0}/.github/workflows/ci.yml +0 -0
  39. {vgi_python-0.34.1 → vgi_python-0.35.0}/.github/workflows/docs.yml +0 -0
  40. {vgi_python-0.34.1 → vgi_python-0.35.0}/.github/workflows/integration.yml +0 -0
  41. {vgi_python-0.34.1 → vgi_python-0.35.0}/.github/workflows/release.yml +0 -0
  42. {vgi_python-0.34.1 → vgi_python-0.35.0}/.github/workflows/tailnet-integration.yml +0 -0
  43. {vgi_python-0.34.1 → vgi_python-0.35.0}/.gitignore +0 -0
  44. {vgi_python-0.34.1 → vgi_python-0.35.0}/.python-version +0 -0
  45. {vgi_python-0.34.1 → vgi_python-0.35.0}/.vale.ini +0 -0
  46. {vgi_python-0.34.1 → vgi_python-0.35.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  47. {vgi_python-0.34.1 → vgi_python-0.35.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  48. {vgi_python-0.34.1 → vgi_python-0.35.0}/DOCS_USABILITY_TEST.md +0 -0
  49. {vgi_python-0.34.1 → vgi_python-0.35.0}/LICENSE +0 -0
  50. {vgi_python-0.34.1 → vgi_python-0.35.0}/PROTOCOL.md +0 -0
  51. {vgi_python-0.34.1 → vgi_python-0.35.0}/README.md +0 -0
  52. {vgi_python-0.34.1 → vgi_python-0.35.0}/RELEASE-RUNBOOK.md +0 -0
  53. {vgi_python-0.34.1 → vgi_python-0.35.0}/SECURITY.md +0 -0
  54. {vgi_python-0.34.1 → vgi_python-0.35.0}/ci/README.md +0 -0
  55. {vgi_python-0.34.1 → vgi_python-0.35.0}/ci/preprocess-require.awk +0 -0
  56. {vgi_python-0.34.1 → vgi_python-0.35.0}/ci/run-integration.sh +0 -0
  57. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/README.md +0 -0
  58. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  59. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  60. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  61. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  62. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  63. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  64. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  65. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  66. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  67. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  68. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  69. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  70. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  71. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
  72. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/generate_runtime.py +0 -0
  73. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/manifest.json +0 -0
  74. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/run_worker.py +0 -0
  75. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  76. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  77. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  78. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  79. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  80. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  81. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  82. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  83. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  84. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  85. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  86. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  87. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  88. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  89. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  90. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  91. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  92. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  93. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  94. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  95. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  96. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  97. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  98. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  99. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  100. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  101. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  102. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  103. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  104. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  105. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  106. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  107. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  108. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  109. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  110. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  111. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  112. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  113. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  114. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  115. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  116. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  117. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  118. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  119. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  120. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  121. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  122. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  123. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  124. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  125. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  126. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  127. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  128. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  129. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  130. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  131. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  132. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  133. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  134. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  135. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  136. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  137. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  138. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  139. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  140. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  141. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  142. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  143. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  144. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  145. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  146. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  147. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  148. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  149. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  150. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  151. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  152. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  153. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  154. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  155. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  156. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  157. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  158. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  159. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  160. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  161. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  162. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  163. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  164. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  165. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  166. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  167. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  168. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  169. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  170. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  171. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  172. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  173. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  174. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  175. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  176. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  177. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  178. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  179. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  180. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  181. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  182. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  183. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  184. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  185. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  186. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  187. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  188. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  189. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  190. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  191. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  192. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  193. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  194. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  195. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  196. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  197. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  198. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  199. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  200. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  201. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  202. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  203. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  204. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  205. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  206. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  207. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  208. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  209. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  210. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  211. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  212. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  213. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  214. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  215. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  216. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  217. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  218. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  219. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  220. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  221. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  222. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  223. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  224. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  225. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  226. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  227. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  228. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  229. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  230. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  231. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  232. {vgi_python-0.34.1 → vgi_python-0.35.0}/conformance/filter-v2/runtime-manifest.json +0 -0
  233. {vgi_python-0.34.1 → vgi_python-0.35.0}/dist-vgi/.gitignore +0 -0
  234. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/aggregate-functions.md +0 -0
  235. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/arguments.md +0 -0
  236. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/auth.md +0 -0
  237. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/catalogs.md +0 -0
  238. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/client.md +0 -0
  239. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/exceptions.md +0 -0
  240. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/filters.md +0 -0
  241. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/functions.md +0 -0
  242. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/http.md +0 -0
  243. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/index.md +0 -0
  244. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/metadata.md +0 -0
  245. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/observability.md +0 -0
  246. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/storage.md +0 -0
  247. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/transactor.md +0 -0
  248. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/api/worker.md +0 -0
  249. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/argument-serialization.md +0 -0
  250. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/apple-touch-icon.png +0 -0
  251. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/favicon-16x16.png +0 -0
  252. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/favicon-32x32.png +0 -0
  253. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/favicon.ico +0 -0
  254. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/kinds/aggregate.svg +0 -0
  255. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/kinds/buffering.svg +0 -0
  256. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/kinds/scalar.svg +0 -0
  257. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/kinds/table-in-out.svg +0 -0
  258. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/kinds/table.svg +0 -0
  259. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/logo.png +0 -0
  260. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/assets/social-card.png +0 -0
  261. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/authentication.md +0 -0
  262. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/catalog-interface.md +0 -0
  263. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/cli.md +0 -0
  264. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/column-statistics.md +0 -0
  265. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/concepts/index.md +0 -0
  266. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/contributing-docs.md +0 -0
  267. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/filter-pushdown.md +0 -0
  268. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/generator-api.md +0 -0
  269. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/global-functions.md +0 -0
  270. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/catalogs.md +0 -0
  271. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/function-patterns.md +0 -0
  272. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/http-auth.md +0 -0
  273. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/index.md +0 -0
  274. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/iroh.md +0 -0
  275. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  276. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/state-storage.md +0 -0
  277. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/how-to/tailnet.md +0 -0
  278. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/index.md +0 -0
  279. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/lifecycle.md +0 -0
  280. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/metadata.md +0 -0
  281. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/overrides/main.html +0 -0
  282. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/protocol/index.md +0 -0
  283. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  284. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  285. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  286. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  287. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  288. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/robots.txt +0 -0
  289. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/shared-storage.md +0 -0
  290. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/stylesheets/extra.css +0 -0
  291. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/tutorial/index.md +0 -0
  292. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/tutorial/scalar.md +0 -0
  293. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/tutorial/table.md +0 -0
  294. {vgi_python-0.34.1 → vgi_python-0.35.0}/docs/vgi-logo.png +0 -0
  295. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/batch_index_worker.py +0 -0
  296. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/cache_worker.py +0 -0
  297. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/calc_scalar_worker.py +0 -0
  298. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/calc_worker.py +0 -0
  299. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/copy_format_worker.py +0 -0
  300. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/filter_worker.py +0 -0
  301. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/greeting_scalar_worker.py +0 -0
  302. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/row_count_worker.py +0 -0
  303. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/series_streaming_worker.py +0 -0
  304. {vgi_python-0.34.1 → vgi_python-0.35.0}/examples/sum_worker.py +0 -0
  305. {vgi_python-0.34.1 → vgi_python-0.35.0}/identity.png +0 -0
  306. {vgi_python-0.34.1 → vgi_python-0.35.0}/mkdocs.yml +0 -0
  307. {vgi_python-0.34.1 → vgi_python-0.35.0}/packages/vgi-fixtures/LICENSE +0 -0
  308. {vgi_python-0.34.1 → vgi_python-0.35.0}/packages/vgi-fixtures/README.md +0 -0
  309. {vgi_python-0.34.1 → vgi_python-0.35.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  310. {vgi_python-0.34.1 → vgi_python-0.35.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  311. {vgi_python-0.34.1 → vgi_python-0.35.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  312. {vgi_python-0.34.1 → vgi_python-0.35.0}/scripts/measure_startup.py +0 -0
  313. {vgi_python-0.34.1 → vgi_python-0.35.0}/scripts/regen_generated.py +0 -0
  314. {vgi_python-0.34.1 → vgi_python-0.35.0}/scripts/run_all_tests.sh +0 -0
  315. {vgi_python-0.34.1 → vgi_python-0.35.0}/test-data/generate.sh +0 -0
  316. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/__init__.py +0 -0
  317. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/_http_fixtures.py +0 -0
  318. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/__init__.py +0 -0
  319. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_attach_option.py +0 -0
  320. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_catalog_interface.py +0 -0
  321. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_column_statistics.py +0 -0
  322. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_declarative.py +0 -0
  323. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_integration.py +0 -0
  324. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_required_filters.py +0 -0
  325. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_scan_branches.py +0 -0
  326. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_serialization.py +0 -0
  327. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_setting.py +0 -0
  328. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_storage.py +0 -0
  329. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_time_travel.py +0 -0
  330. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/catalog/test_writable_table.py +0 -0
  331. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/__init__.py +0 -0
  332. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_aggregate_client.py +0 -0
  333. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_batch_metadata_callback.py +0 -0
  334. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_bind_and_join_keys.py +0 -0
  335. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_broken_pipe.py +0 -0
  336. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_cli.py +0 -0
  337. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_cli_catalog_functions.py +0 -0
  338. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_copy_client.py +0 -0
  339. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_http_response_budget.py +0 -0
  340. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_iroh_client.py +0 -0
  341. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_scan_branches_client.py +0 -0
  342. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_split_client.py +0 -0
  343. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_stop_force.py +0 -0
  344. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_table_column_statistics.py +0 -0
  345. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_time_travel_client.py +0 -0
  346. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/client/test_worker_debug.py +0 -0
  347. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/__init__.py +0 -0
  348. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/_stub.py +0 -0
  349. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/conftest.py +0 -0
  350. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_accumulate.py +0 -0
  351. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_aggregate.py +0 -0
  352. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_attach.py +0 -0
  353. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_bearer_auth.py +0 -0
  354. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  355. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_container.py +0 -0
  356. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_copy_from.py +0 -0
  357. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_copy_to.py +0 -0
  358. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_directory_parity.py +0 -0
  359. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_github.py +0 -0
  360. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_http_client.py +0 -0
  361. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_http_external_location.py +0 -0
  362. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_http_upload_url.py +0 -0
  363. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_macro.py +0 -0
  364. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_overload.py +0 -0
  365. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_protocol_inventory.py +0 -0
  366. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_protocol_version.py +0 -0
  367. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_resumable_scan.py +0 -0
  368. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_scalar.py +0 -0
  369. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  370. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_secret.py +0 -0
  371. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_settings.py +0 -0
  372. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_splits.py +0 -0
  373. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_table.py +0 -0
  374. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_table_in_out.py +0 -0
  375. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_view.py +0 -0
  376. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/conformance/test_writable.py +0 -0
  377. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  378. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  379. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  380. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/bad_version.bin +0 -0
  381. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/generate.py +0 -0
  382. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/manifest.json +0 -0
  383. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  384. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
  385. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/truncated.bin +0 -0
  386. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
  387. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  388. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/__init__.py +0 -0
  389. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_bernoulli_function.py +0 -0
  390. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_binary_packet_function.py +0 -0
  391. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_client.py +0 -0
  392. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_conditional_message_function.py +0 -0
  393. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_hash_seed_function.py +0 -0
  394. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  395. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_multiply_function.py +0 -0
  396. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_random_bytes_function.py +0 -0
  397. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  398. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/__init__.py +0 -0
  399. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/__init__.py +0 -0
  400. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  401. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  402. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  403. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  404. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table/test_wide_columns.py +0 -0
  405. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/__init__.py +0 -0
  406. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/__init__.py +0 -0
  407. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  408. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  409. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  410. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  411. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  412. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  413. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/test_blended_exchange.py +0 -0
  414. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/table_in_out/test_blended_metadata.py +0 -0
  415. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/tailnet/Dockerfile +0 -0
  416. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/tailnet/__init__.py +0 -0
  417. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/tailnet/compose.yaml +0 -0
  418. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/tailnet/probe.py +0 -0
  419. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/tailnet/run.sh +0 -0
  420. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/tailnet/test_worker.py +0 -0
  421. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/tailnet/worker.py +0 -0
  422. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_access_log_audit.py +0 -0
  423. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_aggregate_function.py +0 -0
  424. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_argument_spec.py +0 -0
  425. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_auth.py +0 -0
  426. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_bind_request_at_clause.py +0 -0
  427. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_bound_storage_conformance.py +0 -0
  428. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_cache_control.py +0 -0
  429. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_call_state_attach.py +0 -0
  430. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_catalog_auth_binding.py +0 -0
  431. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_client_oauth.py +0 -0
  432. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_codegen_request_inventory.py +0 -0
  433. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_copy_from_function.py +0 -0
  434. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_copy_to_function.py +0 -0
  435. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_docstrings.py +0 -0
  436. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_documentation_examples.py +0 -0
  437. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_example_function_arg_types.py +0 -0
  438. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_examples_workers.py +0 -0
  439. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_exceptions.py +0 -0
  440. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_filter_pushdown.py +0 -0
  441. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_filter_pushdown_extension.py +0 -0
  442. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_filter_v2.py +0 -0
  443. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_filter_v2_builder.py +0 -0
  444. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
  445. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_filter_v2_spec_schema.py +0 -0
  446. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_fixture_catalog_parity.py +0 -0
  447. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_function_shape_mismatch.py +0 -0
  448. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_function_storage_azure_sql.py +0 -0
  449. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_function_storage_cf_do.py +0 -0
  450. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  451. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_function_storage_conformance.py +0 -0
  452. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_cpp_constants.py +0 -0
  453. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_cpp_protocol_name.py +0 -0
  454. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  455. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_cpp_request_builders.py +0 -0
  456. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_cpp_schemas.py +0 -0
  457. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_cpp_secret.py +0 -0
  458. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_go_schemas.py +0 -0
  459. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_java_schemas.py +0 -0
  460. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_protocol_version.py +0 -0
  461. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_rust_request_builders.py +0 -0
  462. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_rust_schemas.py +0 -0
  463. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  464. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_ts_client.py +0 -0
  465. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_generated_ts_schemas.py +0 -0
  466. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_http_demo_storage.py +0 -0
  467. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_http_s3_offload_input.py +0 -0
  468. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_http_s3_offload_output.py +0 -0
  469. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_import_side_effects.py +0 -0
  470. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_metadata.py +0 -0
  471. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_mypy_consolidated.py +0 -0
  472. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_nest_tensor.py +0 -0
  473. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_otel.py +0 -0
  474. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_protocol_classes.py +0 -0
  475. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_resolved_secrets.py +0 -0
  476. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_schema_paths_v2.py +0 -0
  477. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_schema_scoped_functions.py +0 -0
  478. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_schema_utils.py +0 -0
  479. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_signing_key.py +0 -0
  480. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_split_token.py +0 -0
  481. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_table_buffering_function.py +0 -0
  482. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  483. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_tcp_transport.py +0 -0
  484. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_type_bounds.py +0 -0
  485. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_union_argument.py +0 -0
  486. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_wire_record_schema_parity.py +0 -0
  487. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_worker.py +0 -0
  488. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_worker_cli.py +0 -0
  489. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_worker_page.py +0 -0
  490. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/test_write_results.py +0 -0
  491. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/transactor/__init__.py +0 -0
  492. {vgi_python-0.34.1 → vgi_python-0.35.0}/tests/transactor/test_transactor.py +0 -0
  493. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/__init__.py +0 -0
  494. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_duckdb.py +0 -0
  495. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_storage_profile.py +0 -0
  496. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/__init__.py +0 -0
  497. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  498. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  499. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  500. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  501. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  502. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  503. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  504. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  505. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  506. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  507. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  508. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  509. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  510. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  511. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/attach_options.py +0 -0
  512. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  513. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  514. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/cancellable.py +0 -0
  515. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/catalog.py +0 -0
  516. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/companion.py +0 -0
  517. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/copy_from.py +0 -0
  518. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/copy_to.py +0 -0
  519. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/global_functions.py +0 -0
  520. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/http_server.py +0 -0
  521. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  522. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  523. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  524. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  525. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  526. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  527. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  528. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  529. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  530. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  531. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  532. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  533. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  534. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  535. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  536. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  537. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  538. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  539. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  540. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  541. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  542. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  543. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/_common.py +0 -0
  544. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  545. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  546. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/cache.py +0 -0
  547. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  548. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/filters.py +0 -0
  549. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  550. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  551. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/misc.py +0 -0
  552. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  553. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  554. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  555. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  556. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  557. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  558. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  559. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  560. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  561. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/settings.py +0 -0
  562. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/splits.py +0 -0
  563. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  564. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  565. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  566. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  567. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table/wide.py +0 -0
  568. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  569. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  570. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/versioned.py +0 -0
  571. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  572. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/worker.py +0 -0
  573. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  574. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  575. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/writable/table.py +0 -0
  576. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  577. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/aggregate_function.py +0 -0
  578. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/argument_spec.py +0 -0
  579. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/arguments.py +0 -0
  580. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/attach_header.py +0 -0
  581. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/auth.py +0 -0
  582. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/cache_control.py +0 -0
  583. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/__init__.py +0 -0
  584. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/_descriptor_spec.py +0 -0
  585. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/attach_option.py +0 -0
  586. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/catalog_interface.py +0 -0
  587. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/descriptors.py +0 -0
  588. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/duckdb_statistics.py +0 -0
  589. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/secret_type.py +0 -0
  590. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/setting.py +0 -0
  591. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/catalog/storage.py +0 -0
  592. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/__init__.py +0 -0
  593. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/aggregate.py +0 -0
  594. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/catalog_mixin.py +0 -0
  595. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/cli.py +0 -0
  596. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/cli_catalog.py +0 -0
  597. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/cli_schema.py +0 -0
  598. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/cli_table.py +0 -0
  599. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/cli_transaction.py +0 -0
  600. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/cli_utils.py +0 -0
  601. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/cli_view.py +0 -0
  602. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/client/errors.py +0 -0
  603. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/__init__.py +0 -0
  604. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/_common.py +0 -0
  605. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_constants.py +0 -0
  606. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_protocol_name.py +0 -0
  607. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  608. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_request_builders.py +0 -0
  609. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_schemas.py +0 -0
  610. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  611. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  612. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  613. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/go_schemas.py +0 -0
  614. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/java_schemas.py +0 -0
  615. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/protocol_version.py +0 -0
  616. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/rust_request_builders.py +0 -0
  617. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/rust_schemas.py +0 -0
  618. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/ts_client.py +0 -0
  619. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/codegen/ts_schemas.py +0 -0
  620. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/copy_from_function.py +0 -0
  621. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/copy_to_function.py +0 -0
  622. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/exceptions.py +0 -0
  623. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/filter_v2.py +0 -0
  624. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/filter_v2_builder.py +0 -0
  625. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/function_storage_azure_sql.py +0 -0
  626. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/function_storage_cf_do.py +0 -0
  627. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/http/__init__.py +0 -0
  628. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/http/demo_storage.py +0 -0
  629. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/http/landing.html +0 -0
  630. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/http/landing_page.py +0 -0
  631. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/http/vgi-client.js +0 -0
  632. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/http/worker_page.py +0 -0
  633. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/invocation.py +0 -0
  634. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/logging_config.py +0 -0
  635. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/meta_worker.py +0 -0
  636. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/metadata.py +0 -0
  637. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/otel.py +0 -0
  638. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/profiling.py +0 -0
  639. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/protocol.py +0 -0
  640. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/protocol_version.txt +0 -0
  641. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/py.typed +0 -0
  642. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/scalar_function.py +0 -0
  643. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/schema_path.py +0 -0
  644. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/schema_utils.py +0 -0
  645. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/secret_protocol.py +0 -0
  646. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/secret_service.py +0 -0
  647. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/split_token.py +0 -0
  648. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/table_buffering_function.py +0 -0
  649. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/table_filter_pushdown.py +0 -0
  650. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/table_function.py +0 -0
  651. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/transactor/__init__.py +0 -0
  652. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/transactor/_duckdb_compat.py +0 -0
  653. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/transactor/client.py +0 -0
  654. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/transactor/protocol.py +0 -0
  655. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/transactor/server.py +0 -0
  656. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/worker.py +0 -0
  657. {vgi_python-0.34.1 → vgi_python-0.35.0}/vgi/write_results.py +0 -0
  658. {vgi_python-0.34.1 → vgi_python-0.35.0}/wrangler.jsonc +0 -0
@@ -298,7 +298,6 @@ vgi-client --input data.parquet --function sum_all_columns --worker vgi-fixture-
298
298
  | `VGI_OAUTH_DEVICE_CODE_CLIENT_SECRET` | Client secret for device-code flow (optional, URL-safe chars only) |
299
299
  | `VGI_OAUTH_USE_ID_TOKEN` | When `1`/`true`/`yes`, clients use OIDC `id_token` as Bearer instead of `access_token` |
300
300
  | `VGI_INTROSPECT_PRINCIPALS` | Comma-separated principals permitted to call `vgi_rpc.Identity.v1`'s `introspect_token`. Required — no permissive default — whenever the worker implements `resolve_token()` (see below) |
301
- | `VGI_INTROSPECT_RATE_LIMIT` | Introspection requests allowed per caller per second (default 20) |
302
301
  | `VGI_WORKER_ACCESS_LOG_SAMPLE` | Fraction of *successful* calls to keep in the access log, `0.0`–`1.0`. Errors are always kept; the decision is per call, so every record of one stream shares a fate |
303
302
  | `VGI_WORKER_ACCESS_LOG_ASYNC` | When `1`/`true`/`yes`, emit access-log records from a listener thread. Bounded queue; full means drop, and a crash loses whatever is queued |
304
303
  | `VGI_WORKER_ACCESS_LOG_QUEUE_SIZE` | Bound on the async access-log queue (default 10000) |
@@ -461,8 +460,10 @@ Enabling it also requires an allowlist of principals permitted to ask, via
461
460
  default and a worker that overrides the hook without one **refuses to start**:
462
461
  authenticating and introspecting are different capabilities, and "any
463
462
  authenticated caller" lets any user resolve any other user's credential to its
464
- owner. `--introspect-rate-limit` (default 20/caller/second) bounds, rather than
465
- closes, the oracle an allowlisted-but-compromised caller still has.
463
+ owner. Introspection is deliberately not rate limited (vgi-rpc removed the
464
+ limiter): the allowlisted caller is a proxy asking on behalf of every client, so a
465
+ per-caller limit was one budget for every user's login, drainable by junk
466
+ credentials. Throttle untrusted traffic at the proxy, per client.
466
467
 
467
468
  Return `None` for "the store answered and this credential is unknown"; raise
468
469
  `AuthUnavailableError` for "the answer is not knowable". A caller that
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.34.1
3
+ Version: 0.35.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,7 +162,7 @@ Requires-Dist: httpx2>=2.9.1
162
162
  Requires-Dist: platformdirs
163
163
  Requires-Dist: pyarrow
164
164
  Requires-Dist: typer>=0.9
165
- Requires-Dist: vgi-rpc>=0.46.0
165
+ Requires-Dist: vgi-rpc>=0.47.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'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.34.1"
3
+ version = "0.35.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.46.0",
43
+ "vgi-rpc>=0.47.0",
44
44
  "httpx2>=2.9.1",
45
45
  ]
46
46
 
@@ -10,13 +10,9 @@ For full catalog CRUD workflows (create/get/drop tables, views, schemas),
10
10
  see tests/catalog/test_integration.py which exercises all catalog operations.
11
11
  """
12
12
 
13
- import sys
14
-
13
+ from tests.conftest import CATALOG_WORKER
15
14
  from vgi.client import Client
16
15
 
17
- # Worker command for catalog tests
18
- CATALOG_WORKER = f"{sys.executable} -m vgi._test_fixtures.catalog"
19
-
20
16
 
21
17
  class TestClientCatalogStatelessOperations:
22
18
  """Test catalog operations that work independently."""
@@ -8,6 +8,7 @@ interface, allowing clients to discover available functions.
8
8
 
9
9
  import pyarrow as pa
10
10
 
11
+ from tests.conftest import FIXTURE_WORKER
11
12
  from vgi._test_fixtures.worker import ExampleWorker
12
13
  from vgi.catalog import (
13
14
  AttachOpaqueData,
@@ -23,7 +24,7 @@ from vgi.catalog import (
23
24
  from vgi.client import Client
24
25
 
25
26
  # Worker command for catalog tests
26
- EXAMPLE_WORKER = "vgi-fixture-worker"
27
+ EXAMPLE_WORKER = FIXTURE_WORKER
27
28
 
28
29
 
29
30
  def _get_expected_function_names() -> set[str]:
@@ -19,6 +19,7 @@ from dataclasses import dataclass
19
19
 
20
20
  import pytest
21
21
 
22
+ from tests.conftest import FIXTURE_WORKER
22
23
  from vgi.catalog.catalog_interface import AttachOpaqueData, SchemaObjectType
23
24
  from vgi.client.client import Client
24
25
 
@@ -79,7 +80,7 @@ _COVERAGE_MAP: dict[SchemaObjectType, TypeCoverage] = {
79
80
  @pytest.fixture(scope="module")
80
81
  def attached_example() -> tuple[str, AttachOpaqueData]:
81
82
  """Attach to the ``example`` catalog once per module and yield ``(worker, attach_opaque_data)``."""
82
- worker = "vgi-fixture-worker"
83
+ worker = FIXTURE_WORKER
83
84
  client = Client(worker)
84
85
  result = client.catalog_attach(
85
86
  name=EXAMPLE_CATALOG_NAME,
@@ -92,7 +93,7 @@ def attached_example() -> tuple[str, AttachOpaqueData]:
92
93
 
93
94
  def test_example_catalog_is_attachable() -> None:
94
95
  """Sanity: the example worker advertises a catalog named ``example``."""
95
- client = Client("vgi-fixture-worker")
96
+ client = Client(FIXTURE_WORKER)
96
97
  names = [c.name for c in client.catalogs()]
97
98
  assert EXAMPLE_CATALOG_NAME in names, (
98
99
  f"Example worker should advertise the {EXAMPLE_CATALOG_NAME!r} catalog; got {names!r}"
@@ -149,7 +150,7 @@ def test_fixture_worker_registers_at_least_one_per_category(
149
150
  broken — both are drift we want to catch.
150
151
  """
151
152
  _worker, attach_opaque_data = attached_example
152
- client = Client("vgi-fixture-worker")
153
+ client = Client(FIXTURE_WORKER)
153
154
  infos = client.schema_contents(
154
155
  attach_opaque_data=attach_opaque_data,
155
156
  path=[EXAMPLE_SCHEMA_NAME],
@@ -3,6 +3,12 @@
3
3
  """Shared fixtures for VGI tests."""
4
4
 
5
5
  import logging
6
+ import os
7
+ import shlex
8
+ import shutil
9
+ import subprocess
10
+ import sys
11
+ import uuid
6
12
  from typing import Any
7
13
 
8
14
  import pyarrow as pa
@@ -10,6 +16,73 @@ import pytest
10
16
 
11
17
  from vgi import schema
12
18
 
19
+ # =============================================================================
20
+ # Fixture-worker transport
21
+ # =============================================================================
22
+
23
+ # How tests reach the fixture workers. ``launch`` (the default wherever AF_UNIX
24
+ # exists) routes every fixture-worker ``Client`` through ``vgi_rpc.launcher``:
25
+ # one warm worker per command, shared by every test process, so ``pytest -n 48``
26
+ # talks to one worker instead of each xdist process growing its own pool (and
27
+ # the matrix's ``subprocess-direct`` leg spawning a fresh worker per test) —
28
+ # which put hundreds of ``vgi-fixture-worker`` processes on a 48-core box.
29
+ # ``VGI_TEST_CLIENT_TRANSPORT=subprocess`` restores the per-process pools.
30
+ TEST_TRANSPORT = os.environ.get("VGI_TEST_CLIENT_TRANSPORT") or ("subprocess" if sys.platform == "win32" else "launch")
31
+ if TEST_TRANSPORT not in ("launch", "subprocess"):
32
+ raise pytest.UsageError(f"VGI_TEST_CLIENT_TRANSPORT must be 'launch' or 'subprocess', got {TEST_TRANSPORT!r}")
33
+
34
+ # Part of the launcher's hash domain (it hashes every ``VGI_RPC_*`` variable), so
35
+ # each session gets its own workers: never a warm one left by an earlier run of
36
+ # older code, and never one another checkout on the machine is using. Set here,
37
+ # before xdist spawns its workers, so every process of one session agrees on it.
38
+ _SESSION_ENV = "VGI_RPC_TEST_SESSION"
39
+ os.environ.setdefault(_SESSION_ENV, uuid.uuid4().hex)
40
+
41
+ _LAUNCHED: list[list[str]] = []
42
+
43
+
44
+ def _fixture_command(*argv: str) -> str:
45
+ """Return the ``Client`` worker string for a fixture command under ``TEST_TRANSPORT``."""
46
+ if TEST_TRANSPORT == "subprocess":
47
+ # Unquoted, as these commands always were: Windows splits server_path
48
+ # non-POSIX, so shlex quoting around a backslashed python.exe path
49
+ # stayed on the argv and the executable was not found.
50
+ return " ".join(argv)
51
+ # Every test process shares the one worker, so its connection cap must sit
52
+ # above anything the suite opens: at the default 64 a scan holding its
53
+ # connections while its next one waits in the backlog can wait on the others
54
+ # doing the same, forever. Finite because ``Worker.main`` refuses 0.
55
+ launch_argv = [shutil.which(argv[0]) or argv[0], *argv[1:], "--max-connections", "4096"]
56
+ _LAUNCHED.append(launch_argv)
57
+ return "launch:" + shlex.join(launch_argv)
58
+
59
+
60
+ #: The protocol fixture worker, and the catalog fixture worker.
61
+ FIXTURE_WORKER = _fixture_command("vgi-fixture-worker")
62
+ CATALOG_WORKER = _fixture_command(sys.executable, "-m", "vgi._test_fixtures.catalog")
63
+
64
+ #: The protocol fixture worker as a plain subprocess, for tests of the
65
+ #: subprocess transport itself (stderr capture, pooling).
66
+ SUBPROCESS_FIXTURE_WORKER = "vgi-fixture-worker"
67
+
68
+
69
+ def pytest_unconfigure(config: pytest.Config) -> None:
70
+ """Stop this session's launched workers rather than leaving them to idle out.
71
+
72
+ Only the controlling process does it — an xdist worker finishing early must
73
+ not pull the shared worker out from under the others.
74
+ """
75
+ if hasattr(config, "workerinput") or not _LAUNCHED or sys.platform == "win32":
76
+ return
77
+ from vgi_rpc.launcher import compute_hash, default_state_dir, gc_state_dir
78
+
79
+ for argv in _LAUNCHED:
80
+ # The worker's argv carries ``--unix <state dir>/<hash>.sock``, and the
81
+ # session variable makes that hash this session's alone.
82
+ subprocess.run(["pkill", "-TERM", "-f", f"{compute_hash(argv)}.sock"], check=False)
83
+ gc_state_dir(default_state_dir())
84
+
85
+
13
86
  # =============================================================================
14
87
  # Utility Functions (not fixtures, can be imported directly)
15
88
  # =============================================================================
@@ -72,8 +145,8 @@ def test_logger() -> logging.Logger:
72
145
 
73
146
  @pytest.fixture
74
147
  def fixture_worker() -> str:
75
- """Return the path to the example worker."""
76
- return "vgi-fixture-worker"
148
+ """Return the example worker, as a ``Client`` worker string for ``TEST_TRANSPORT``."""
149
+ return FIXTURE_WORKER
77
150
 
78
151
 
79
152
  @pytest.fixture(scope="session")
@@ -118,8 +191,11 @@ def http_worker() -> Any:
118
191
  # Keys used to identify transport modes in conformance tests. Keeping the
119
192
  # literal values here (rather than inside the fixture) makes it easy for
120
193
  # individual tests to opt out with ``@pytest.mark.parametrize("client_transport",
121
- # ["subprocess-pooled"], indirect=True)``.
122
- _CLIENT_TRANSPORT_MODES = ["subprocess-pooled", "subprocess-direct", "http"]
194
+ # ["subprocess-pooled"], indirect=True)``. The subprocess legs join the default
195
+ # matrix only under ``VGI_TEST_CLIENT_TRANSPORT=subprocess``.
196
+ _CLIENT_TRANSPORT_MODES = (
197
+ ["launch", "http"] if TEST_TRANSPORT == "launch" else ["subprocess-pooled", "subprocess-direct", "http"]
198
+ )
123
199
 
124
200
 
125
201
  @pytest.fixture(scope="session")
@@ -160,7 +236,8 @@ def client_transport(
160
236
  returned client as a context manager.
161
237
 
162
238
  Modes:
163
- subprocess-pooled: Pool-backed subprocess (the default path).
239
+ launch: The launcher-shared worker (``launch:`` worker string).
240
+ subprocess-pooled: Pool-backed subprocess.
164
241
  subprocess-direct: ``pool=None`` — direct Popen management.
165
242
  http: ``Client.from_http(base_url)`` backed by a per-test
166
243
  ``vgi-fixture-http`` subprocess. Skips if the HTTP transport
@@ -171,10 +248,14 @@ def client_transport(
171
248
  mode = request.param
172
249
 
173
250
  def _make() -> Client:
251
+ if mode == "launch":
252
+ if TEST_TRANSPORT != "launch":
253
+ pytest.skip("VGI_TEST_CLIENT_TRANSPORT=subprocess")
254
+ return Client(fixture_worker)
174
255
  if mode == "subprocess-pooled":
175
- return Client(fixture_worker, pool=_default_pool)
256
+ return Client(SUBPROCESS_FIXTURE_WORKER, pool=_default_pool)
176
257
  if mode == "subprocess-direct":
177
- return Client(fixture_worker, pool=None)
258
+ return Client(SUBPROCESS_FIXTURE_WORKER, pool=None)
178
259
  if mode == "http":
179
260
  if not _HTTP_TRANSPORT_READY:
180
261
  pytest.skip("Client HTTP transport arrives in Phase 2 of whimsical-mccarthy plan")
@@ -5,6 +5,7 @@
5
5
  import pyarrow as pa
6
6
  import pytest
7
7
 
8
+ from tests.conftest import FIXTURE_WORKER
8
9
  from vgi.arguments import Arguments
9
10
  from vgi.client import Client, ClientError
10
11
 
@@ -15,7 +16,7 @@ class TestGeneratorExceptionFunctionViaClient:
15
16
  def test_raises_exception_after_batches(self) -> None:
16
17
  """Function should raise exception after specified batches via Client."""
17
18
  with (
18
- Client("vgi-fixture-worker") as client,
19
+ Client(FIXTURE_WORKER) as client,
19
20
  pytest.raises(ClientError) as exc_info,
20
21
  ):
21
22
  list(
@@ -31,7 +32,7 @@ class TestGeneratorExceptionFunctionViaClient:
31
32
  def test_raises_exception_immediately(self) -> None:
32
33
  """Function with fail_after=0 should raise immediately via Client."""
33
34
  with (
34
- Client("vgi-fixture-worker") as client,
35
+ Client(FIXTURE_WORKER) as client,
35
36
  pytest.raises(ClientError) as exc_info,
36
37
  ):
37
38
  list(
@@ -46,7 +47,7 @@ class TestGeneratorExceptionFunctionViaClient:
46
47
 
47
48
  def test_outputs_batches_before_failure(self) -> None:
48
49
  """Function should output batches before failing via Client."""
49
- with Client("vgi-fixture-worker") as client:
50
+ with Client(FIXTURE_WORKER) as client:
50
51
  outputs: list[pa.RecordBatch] = []
51
52
  try:
52
53
  for batch in client.table_function(
@@ -4,6 +4,7 @@
4
4
 
5
5
  import pyarrow as pa
6
6
 
7
+ from tests.conftest import FIXTURE_WORKER
7
8
  from vgi.arguments import Arguments
8
9
  from vgi.client import Client
9
10
 
@@ -13,7 +14,7 @@ class TestFilterEchoFunction:
13
14
 
14
15
  def test_no_filter_output(self) -> None:
15
16
  """Without filters, pushed_filters should be '(none)' for all rows."""
16
- with Client("vgi-fixture-worker") as client:
17
+ with Client(FIXTURE_WORKER) as client:
17
18
  batches = list(
18
19
  client.table_function(
19
20
  function_name="filter_echo",
@@ -36,7 +37,7 @@ class TestFilterEchoFunction:
36
37
 
37
38
  def test_count_argument(self) -> None:
38
39
  """Verify row count matches the count argument."""
39
- with Client("vgi-fixture-worker") as client:
40
+ with Client(FIXTURE_WORKER) as client:
40
41
  batches = list(
41
42
  client.table_function(
42
43
  function_name="filter_echo",
@@ -50,7 +51,7 @@ class TestFilterEchoFunction:
50
51
 
51
52
  def test_s_column_values(self) -> None:
52
53
  """The s column should match 'row_{n}' pattern."""
53
- with Client("vgi-fixture-worker") as client:
54
+ with Client(FIXTURE_WORKER) as client:
54
55
  batches = list(
55
56
  client.table_function(
56
57
  function_name="filter_echo",
@@ -4,6 +4,7 @@
4
4
 
5
5
  import pyarrow as pa
6
6
 
7
+ from tests.conftest import FIXTURE_WORKER
7
8
  from vgi.arguments import Arguments
8
9
  from vgi.client import Client
9
10
 
@@ -13,7 +14,7 @@ class TestLoggingGeneratorFunctionViaClient:
13
14
 
14
15
  def test_generates_correct_output(self) -> None:
15
16
  """Function should generate correct output via Client."""
16
- with Client("vgi-fixture-worker") as client:
17
+ with Client(FIXTURE_WORKER) as client:
17
18
  outputs = list(
18
19
  client.table_function(
19
20
  function_name="logging_generator",
@@ -31,7 +32,7 @@ class TestLoggingGeneratorFunctionViaClient:
31
32
 
32
33
  def test_zero_count_produces_no_output(self) -> None:
33
34
  """Function with count=0 should produce no output via Client."""
34
- with Client("vgi-fixture-worker") as client:
35
+ with Client(FIXTURE_WORKER) as client:
35
36
  outputs = list(
36
37
  client.table_function(
37
38
  function_name="logging_generator",
@@ -44,7 +45,7 @@ class TestLoggingGeneratorFunctionViaClient:
44
45
 
45
46
  def test_large_output(self) -> None:
46
47
  """Function should handle larger outputs via Client."""
47
- with Client("vgi-fixture-worker") as client:
48
+ with Client(FIXTURE_WORKER) as client:
48
49
  outputs = list(
49
50
  client.table_function(
50
51
  function_name="logging_generator",
@@ -8,6 +8,7 @@ from typing import Any
8
8
 
9
9
  import pyarrow as pa
10
10
 
11
+ from tests.conftest import FIXTURE_WORKER
11
12
  from vgi.arguments import Arguments
12
13
  from vgi.client import Client
13
14
 
@@ -22,7 +23,7 @@ class TestPartitionedSequenceFunctionMultiWorker:
22
23
 
23
24
  def test_two_workers_produce_complete_sequence(self) -> None:
24
25
  """Two workers should together produce the complete sequence."""
25
- with Client("vgi-fixture-worker", worker_limit=2) as client:
26
+ with Client(FIXTURE_WORKER, worker_limit=2) as client:
26
27
  outputs = list(
27
28
  client.table_function(
28
29
  function_name="partitioned_sequence",
@@ -39,7 +40,7 @@ class TestPartitionedSequenceFunctionMultiWorker:
39
40
 
40
41
  def test_three_workers_produce_complete_sequence(self) -> None:
41
42
  """Three workers should together produce the complete sequence."""
42
- with Client("vgi-fixture-worker", worker_limit=3) as client:
43
+ with Client(FIXTURE_WORKER, worker_limit=3) as client:
43
44
  outputs = list(
44
45
  client.table_function(
45
46
  function_name="partitioned_sequence",
@@ -56,7 +57,7 @@ class TestPartitionedSequenceFunctionMultiWorker:
56
57
 
57
58
  def test_workers_produce_large_sequence(self) -> None:
58
59
  """Multiple workers should handle large sequences."""
59
- with Client("vgi-fixture-worker", worker_limit=4) as client:
60
+ with Client(FIXTURE_WORKER, worker_limit=4) as client:
60
61
  outputs = list(
61
62
  client.table_function(
62
63
  function_name="partitioned_sequence",
@@ -73,7 +74,7 @@ class TestPartitionedSequenceFunctionMultiWorker:
73
74
 
74
75
  def test_uneven_distribution(self) -> None:
75
76
  """Workers should handle sequences that don't divide evenly."""
76
- with Client("vgi-fixture-worker", worker_limit=3) as client:
77
+ with Client(FIXTURE_WORKER, worker_limit=3) as client:
77
78
  outputs = list(
78
79
  client.table_function(
79
80
  function_name="partitioned_sequence",
@@ -90,7 +91,7 @@ class TestPartitionedSequenceFunctionMultiWorker:
90
91
 
91
92
  def test_single_worker_fallback(self) -> None:
92
93
  """worker_limit=1 should work like single worker mode."""
93
- with Client("vgi-fixture-worker", worker_limit=1) as client:
94
+ with Client(FIXTURE_WORKER, worker_limit=1) as client:
94
95
  outputs = list(
95
96
  client.table_function(
96
97
  function_name="partitioned_sequence",
@@ -107,7 +108,7 @@ class TestPartitionedSequenceFunctionMultiWorker:
107
108
 
108
109
  def test_increment_with_multi_workers(self) -> None:
109
110
  """Multiple workers should handle increment parameter."""
110
- with Client("vgi-fixture-worker", worker_limit=2) as client:
111
+ with Client(FIXTURE_WORKER, worker_limit=2) as client:
111
112
  outputs = list(
112
113
  client.table_function(
113
114
  function_name="partitioned_sequence",
@@ -4,6 +4,7 @@
4
4
 
5
5
  import pyarrow as pa
6
6
 
7
+ from tests.conftest import FIXTURE_WORKER
7
8
  from vgi.arguments import Arguments
8
9
 
9
10
 
@@ -14,7 +15,7 @@ class TestProjectedDataFunctionViaClient:
14
15
  """Projection should work correctly via Client subprocess."""
15
16
  from vgi.client import Client
16
17
 
17
- with Client("vgi-fixture-worker", worker_limit=1) as client:
18
+ with Client(FIXTURE_WORKER, worker_limit=1) as client:
18
19
  outputs = list(
19
20
  client.table_function(
20
21
  function_name="projected_data",
@@ -36,7 +37,7 @@ class TestProjectedDataFunctionViaClient:
36
37
  """All columns should be returned when no projection specified."""
37
38
  from vgi.client import Client
38
39
 
39
- with Client("vgi-fixture-worker", worker_limit=1) as client:
40
+ with Client(FIXTURE_WORKER, worker_limit=1) as client:
40
41
  outputs = list(
41
42
  client.table_function(
42
43
  function_name="projected_data",
@@ -4,6 +4,7 @@
4
4
 
5
5
  import pyarrow as pa
6
6
 
7
+ from tests.conftest import FIXTURE_WORKER
7
8
  from vgi.arguments import Arguments
8
9
  from vgi.client import Client
9
10
  from vgi.invocation import BindResponse
@@ -19,7 +20,7 @@ class TestSequenceFunctionClient:
19
20
  def capture_bind_result(result: BindResponse) -> None:
20
21
  bind_results.append(result)
21
22
 
22
- with Client("vgi-fixture-worker") as client:
23
+ with Client(FIXTURE_WORKER) as client:
23
24
  list(
24
25
  client.table_function(
25
26
  function_name="sequence",
@@ -5,6 +5,7 @@
5
5
  import pyarrow as pa
6
6
  import pytest
7
7
 
8
+ from tests.conftest import FIXTURE_WORKER
8
9
  from vgi._test_fixtures.table import SettingsAwareFunction
9
10
  from vgi.arguments import Arguments
10
11
  from vgi.client.client import Client, ClientError
@@ -15,7 +16,7 @@ class TestSettingsViaClient:
15
16
 
16
17
  def test_settings_passed_to_function_verbose_false(self) -> None:
17
18
  """Settings should be passed through Client to function (typed values)."""
18
- with Client("vgi-fixture-worker") as client:
19
+ with Client(FIXTURE_WORKER) as client:
19
20
  outputs = list(
20
21
  client.table_function(
21
22
  function_name="settings_aware",
@@ -39,7 +40,7 @@ class TestSettingsViaClient:
39
40
 
40
41
  def test_settings_passed_to_function_verbose_true(self) -> None:
41
42
  """Verbose mode should add details column (typed bool)."""
42
- with Client("vgi-fixture-worker") as client:
43
+ with Client(FIXTURE_WORKER) as client:
43
44
  outputs = list(
44
45
  client.table_function(
45
46
  function_name="settings_aware",
@@ -63,7 +64,7 @@ class TestSettingsViaClient:
63
64
 
64
65
  def test_settings_as_strings_backward_compat(self) -> None:
65
66
  """String settings should still work for backward compatibility."""
66
- with Client("vgi-fixture-worker") as client:
67
+ with Client(FIXTURE_WORKER) as client:
67
68
  outputs = list(
68
69
  client.table_function(
69
70
  function_name="settings_aware",
@@ -87,7 +88,7 @@ class TestSettingsViaClient:
87
88
 
88
89
  def test_missing_required_setting_fails(self) -> None:
89
90
  """Missing required setting should raise error."""
90
- with Client("vgi-fixture-worker") as client:
91
+ with Client(FIXTURE_WORKER) as client:
91
92
  with pytest.raises(ClientError) as exc_info:
92
93
  # Call without required settings - worker should send bind error
93
94
  list(
@@ -4,6 +4,7 @@
4
4
 
5
5
  import pyarrow as pa
6
6
 
7
+ from tests.conftest import FIXTURE_WORKER
7
8
  from vgi.arguments import Arguments
8
9
  from vgi.client import Client
9
10
 
@@ -13,7 +14,7 @@ class TestStructSettingsFunction:
13
14
 
14
15
  def test_struct_setting_basic(self) -> None:
15
16
  """Struct setting should configure sequence generation."""
16
- with Client("vgi-fixture-worker") as client:
17
+ with Client(FIXTURE_WORKER) as client:
17
18
  outputs = list(
18
19
  client.table_function(
19
20
  function_name="struct_settings",
@@ -32,7 +33,7 @@ class TestStructSettingsFunction:
32
33
 
33
34
  def test_struct_setting_different_values(self) -> None:
34
35
  """Different struct values should produce different output."""
35
- with Client("vgi-fixture-worker") as client:
36
+ with Client(FIXTURE_WORKER) as client:
36
37
  outputs = list(
37
38
  client.table_function(
38
39
  function_name="struct_settings",
@@ -2,29 +2,37 @@
2
2
 
3
3
  """Tests for SubstreamPartialSumFunction (parallel streaming finalize, A4).
4
4
 
5
- At the single-worker client level there is exactly one substream, so ``finish()``
6
- sees all input and emits one partial row equal to the whole sum. The per-substream
7
- fan-out (many partials re-aggregated by an outer ``SELECT sum()``) is exercised by
8
- the C++ integration test ``table_in_out/parallel_finalize.test`` over both
9
- transports; here we assert the worker-side transform/finish contract in isolation.
5
+ The Python client fans the input across its connections, each its own substream
6
+ of one execution, and finalizes once: ``finish()`` receives every substream's
7
+ state and emits one partial row equal to the whole sum. The DuckDB-side fan-out
8
+ (many partials re-aggregated by an outer ``SELECT sum()``) is exercised by the
9
+ C++ integration test ``table_in_out/parallel_finalize.test`` over both transports.
10
+
11
+ Run over every client transport because the state is keyed per substream: over
12
+ HTTP one process serves every connection of the fan-out, which is where a
13
+ per-process key let the connections overwrite each other's state.
10
14
  """
11
15
 
12
16
  from __future__ import annotations
13
17
 
18
+ from typing import Any
19
+
14
20
  import pyarrow as pa
21
+ import pytest
15
22
 
16
23
  from tests.conftest import filter_non_empty, make_schema
17
24
  from vgi.client import Client
25
+ from vgi.client import client as client_module
18
26
 
19
27
 
20
28
  class TestSubstreamPartialSumFunction:
21
29
  """Worker-side contract for substream_partial_sum."""
22
30
 
23
- def test_partial_sum_single_batch(self, fixture_worker: str) -> None:
31
+ def test_partial_sum_single_batch(self, client_transport: Any) -> None:
24
32
  """One substream (single client worker) → one partial = the whole sum."""
25
33
  schema = make_schema([pa.field("n", pa.int64())])
26
34
  batch = pa.RecordBatch.from_pydict({"n": [1, 2, 3, 4, 5]}, schema=schema)
27
- with Client(fixture_worker) as client:
35
+ with client_transport() as client:
28
36
  output = list(
29
37
  client.table_in_out_function(
30
38
  function_name="substream_partial_sum",
@@ -36,14 +44,14 @@ class TestSubstreamPartialSumFunction:
36
44
  assert len(non_empty) == 1
37
45
  assert non_empty[0].to_pydict() == {"n": [15]}
38
46
 
39
- def test_partial_sum_many_batches(self, fixture_worker: str) -> None:
47
+ def test_partial_sum_many_batches(self, client_transport: Any) -> None:
40
48
  """Accumulates across many input batches, emits one partial at finalize."""
41
49
  schema = make_schema([pa.field("n", pa.int64())])
42
50
  batches = [
43
51
  pa.RecordBatch.from_pydict({"n": list(range(i * 100, (i + 1) * 100))}, schema=schema) for i in range(20)
44
52
  ]
45
53
  expected = sum(range(0, 2000))
46
- with Client(fixture_worker) as client:
54
+ with client_transport() as client:
47
55
  output = list(
48
56
  client.table_in_out_function(
49
57
  function_name="substream_partial_sum",
@@ -55,11 +63,11 @@ class TestSubstreamPartialSumFunction:
55
63
  assert len(non_empty) == 1
56
64
  assert non_empty[0].to_pydict() == {"n": [expected]}
57
65
 
58
- def test_partial_sum_empty_input(self, fixture_worker: str) -> None:
66
+ def test_partial_sum_empty_input(self, client_transport: Any) -> None:
59
67
  """No input rows → the single substream's partial is 0."""
60
68
  schema = make_schema([pa.field("n", pa.int64())])
61
69
  empty = pa.RecordBatch.from_pydict({"n": []}, schema=schema)
62
- with Client(fixture_worker) as client:
70
+ with client_transport() as client:
63
71
  output = list(
64
72
  client.table_in_out_function(
65
73
  function_name="substream_partial_sum",
@@ -71,3 +79,27 @@ class TestSubstreamPartialSumFunction:
71
79
  # A single substream with zero rows still finalizes → one 0 partial.
72
80
  assert len(non_empty) == 1
73
81
  assert non_empty[0].to_pydict() == {"n": [0]}
82
+
83
+ def test_a_client_sending_no_substream_id_still_sums_over_subprocess(self, monkeypatch: pytest.MonkeyPatch) -> None:
84
+ """An older client sends no ``substream_id``; the worker keys it by process, as before.
85
+
86
+ Over subprocess every connection is its own process, so that key still
87
+ separates them — the behavior such a client had before the key moved.
88
+ """
89
+ monkeypatch.setattr(client_module, "_substream_id_for", lambda phase: None)
90
+ schema = make_schema([pa.field("n", pa.int64())])
91
+ batches = [
92
+ pa.RecordBatch.from_pydict({"n": list(range(i * 100, (i + 1) * 100))}, schema=schema) for i in range(20)
93
+ ]
94
+ # A plain subprocess worker whatever transport the suite runs on; four
95
+ # connections are enough to share an execution, where a worker per core
96
+ # would be dozens of processes.
97
+ with Client("vgi-fixture-worker", worker_limit=4) as client:
98
+ output = list(
99
+ client.table_in_out_function(
100
+ function_name="substream_partial_sum",
101
+ schema_path=["main"],
102
+ input=iter(batches),
103
+ )
104
+ )
105
+ assert filter_non_empty(output)[0].to_pydict() == {"n": [sum(range(0, 2000))]}