vgi-python 0.38.0__tar.gz → 0.39.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 (666) hide show
  1. {vgi_python-0.38.0 → vgi_python-0.39.0}/CLAUDE.md +1 -1
  2. {vgi_python-0.38.0 → vgi_python-0.39.0}/PKG-INFO +1 -1
  3. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/catalog-interface.md +2 -3
  4. {vgi_python-0.38.0 → vgi_python-0.39.0}/pyproject.toml +1 -1
  5. {vgi_python-0.38.0 → vgi_python-0.39.0}/scripts/regen_generated.py +6 -0
  6. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_directory_parity.py +6 -0
  7. vgi_python-0.39.0/tests/test_generated_csharp.py +111 -0
  8. {vgi_python-0.38.0 → vgi_python-0.39.0}/uv.lock +1 -1
  9. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/attach_option.py +13 -13
  10. vgi_python-0.39.0/vgi/codegen/csharp_schemas.py +203 -0
  11. vgi_python-0.39.0/vgi/codegen/csharp_types.py +694 -0
  12. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/http/landing.html +1 -1
  13. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/http/worker_page.py +2 -2
  14. {vgi_python-0.38.0 → vgi_python-0.39.0}/.dockerignore +0 -0
  15. {vgi_python-0.38.0 → vgi_python-0.39.0}/.gitattributes +0 -0
  16. {vgi_python-0.38.0 → vgi_python-0.39.0}/.github/dependabot.yml +0 -0
  17. {vgi_python-0.38.0 → vgi_python-0.39.0}/.github/styles/config/vocabularies/VGI/accept.txt +0 -0
  18. {vgi_python-0.38.0 → vgi_python-0.39.0}/.github/workflows/ci.yml +0 -0
  19. {vgi_python-0.38.0 → vgi_python-0.39.0}/.github/workflows/docs.yml +0 -0
  20. {vgi_python-0.38.0 → vgi_python-0.39.0}/.github/workflows/integration.yml +0 -0
  21. {vgi_python-0.38.0 → vgi_python-0.39.0}/.github/workflows/release.yml +0 -0
  22. {vgi_python-0.38.0 → vgi_python-0.39.0}/.github/workflows/tailnet-integration.yml +0 -0
  23. {vgi_python-0.38.0 → vgi_python-0.39.0}/.gitignore +0 -0
  24. {vgi_python-0.38.0 → vgi_python-0.39.0}/.python-version +0 -0
  25. {vgi_python-0.38.0 → vgi_python-0.39.0}/.vale.ini +0 -0
  26. {vgi_python-0.38.0 → vgi_python-0.39.0}/DOCS_ACCEPTANCE_CRITERIA.md +0 -0
  27. {vgi_python-0.38.0 → vgi_python-0.39.0}/DOCS_REVIEW_RUBRIC.md +0 -0
  28. {vgi_python-0.38.0 → vgi_python-0.39.0}/DOCS_USABILITY_TEST.md +0 -0
  29. {vgi_python-0.38.0 → vgi_python-0.39.0}/LICENSE +0 -0
  30. {vgi_python-0.38.0 → vgi_python-0.39.0}/PROTOCOL.md +0 -0
  31. {vgi_python-0.38.0 → vgi_python-0.39.0}/README.md +0 -0
  32. {vgi_python-0.38.0 → vgi_python-0.39.0}/RELEASE-RUNBOOK.md +0 -0
  33. {vgi_python-0.38.0 → vgi_python-0.39.0}/SECURITY.md +0 -0
  34. {vgi_python-0.38.0 → vgi_python-0.39.0}/ci/README.md +0 -0
  35. {vgi_python-0.38.0 → vgi_python-0.39.0}/ci/preprocess-require.awk +0 -0
  36. {vgi_python-0.38.0 → vgi_python-0.39.0}/ci/run-integration.sh +0 -0
  37. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/README.md +0 -0
  38. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/and-too-few-children.json +0 -0
  39. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/delta-required-upsert.json +0 -0
  40. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/nested-runtime-filter.json +0 -0
  41. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/remove-with-expression.json +0 -0
  42. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/required-runtime-filter.json +0 -0
  43. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/snapshot-nonzero-revision.json +0 -0
  44. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/unknown-document-property.json +0 -0
  45. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/negative/unknown-node.json +0 -0
  46. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/positive/advisory-upsert-delta.json +0 -0
  47. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/positive/boolean-column-predicate.json +0 -0
  48. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/positive/empty-snapshot.json +0 -0
  49. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/positive/nested-required-snapshot.json +0 -0
  50. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/positive/remove-delta.json +0 -0
  51. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/cases/positive/runtime-filter-snapshot.json +0 -0
  52. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/filter-v2.schema.json +0 -0
  53. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/generate_runtime.py +0 -0
  54. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/manifest.json +0 -0
  55. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/run_worker.py +0 -0
  56. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-add/expected.arrow +0 -0
  57. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-add/filter.arrow +0 -0
  58. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-add/input.arrow +0 -0
  59. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-multiply/expected.arrow +0 -0
  60. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-multiply/filter.arrow +0 -0
  61. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-multiply/input.arrow +0 -0
  62. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-negate/expected.arrow +0 -0
  63. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-negate/filter.arrow +0 -0
  64. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-negate/input.arrow +0 -0
  65. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-subtract/expected.arrow +0 -0
  66. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-subtract/filter.arrow +0 -0
  67. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/arithmetic-subtract/input.arrow +0 -0
  68. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/cast-integer-to-double/expected.arrow +0 -0
  69. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/cast-integer-to-double/filter.arrow +0 -0
  70. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/cast-integer-to-double/input.arrow +0 -0
  71. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-distinct_from/expected.arrow +0 -0
  72. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-distinct_from/filter.arrow +0 -0
  73. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-distinct_from/input.arrow +0 -0
  74. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-distinct_from/worker-expected.arrow +0 -0
  75. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-eq/expected.arrow +0 -0
  76. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-eq/filter.arrow +0 -0
  77. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-eq/input.arrow +0 -0
  78. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-eq/worker-expected.arrow +0 -0
  79. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ge/expected.arrow +0 -0
  80. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ge/filter.arrow +0 -0
  81. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ge/input.arrow +0 -0
  82. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ge/worker-expected.arrow +0 -0
  83. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-gt/expected.arrow +0 -0
  84. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-gt/filter.arrow +0 -0
  85. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-gt/input.arrow +0 -0
  86. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-gt/worker-expected.arrow +0 -0
  87. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-le/expected.arrow +0 -0
  88. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-le/filter.arrow +0 -0
  89. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-le/input.arrow +0 -0
  90. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-le/worker-expected.arrow +0 -0
  91. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-lt/expected.arrow +0 -0
  92. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-lt/filter.arrow +0 -0
  93. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-lt/input.arrow +0 -0
  94. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-lt/worker-expected.arrow +0 -0
  95. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ne/expected.arrow +0 -0
  96. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ne/filter.arrow +0 -0
  97. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ne/input.arrow +0 -0
  98. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-ne/worker-expected.arrow +0 -0
  99. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/expected.arrow +0 -0
  100. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/filter.arrow +0 -0
  101. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/input.arrow +0 -0
  102. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/comparison-not_distinct_from/worker-expected.arrow +0 -0
  103. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/delta-0.arrow +0 -0
  104. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/expected.arrow +0 -0
  105. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/filter.arrow +0 -0
  106. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-atomic-multi-update/input.arrow +0 -0
  107. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-empty-noop/delta-0.arrow +0 -0
  108. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-empty-noop/expected.arrow +0 -0
  109. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-empty-noop/filter.arrow +0 -0
  110. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-empty-noop/input.arrow +0 -0
  111. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-0.arrow +0 -0
  112. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-1.arrow +0 -0
  113. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/delta-2.arrow +0 -0
  114. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/expected.arrow +0 -0
  115. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/filter.arrow +0 -0
  116. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/delta-upsert-remove-stale/input.arrow +0 -0
  117. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/empty-snapshot/expected.arrow +0 -0
  118. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/empty-snapshot/filter.arrow +0 -0
  119. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/empty-snapshot/input.arrow +0 -0
  120. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/empty-snapshot/worker-expected.arrow +0 -0
  121. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-cast-type-not-null/filter.arrow +0 -0
  122. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-cast-type-not-null/input.arrow +0 -0
  123. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-column-index/filter.arrow +0 -0
  124. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-column-index/input.arrow +0 -0
  125. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-column-name/filter.arrow +0 -0
  126. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-column-name/input.arrow +0 -0
  127. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/filter.arrow +0 -0
  128. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-contextual-cast-without-session/input.arrow +0 -0
  129. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/filter.arrow +0 -0
  130. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-duplicate-predicate-id/input.arrow +0 -0
  131. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-external-column-index/filter.arrow +0 -0
  132. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-external-column-index/input.arrow +0 -0
  133. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-external-column-index/join-keys-0.arrow +0 -0
  134. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-external-column-name/filter.arrow +0 -0
  135. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-external-column-name/input.arrow +0 -0
  136. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-external-column-name/join-keys-0.arrow +0 -0
  137. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-field-non-struct/filter.arrow +0 -0
  138. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-field-non-struct/input.arrow +0 -0
  139. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-in-payload-not-list/filter.arrow +0 -0
  140. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-in-payload-not-list/input.arrow +0 -0
  141. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-in-payload-null-list/filter.arrow +0 -0
  142. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-in-payload-null-list/input.arrow +0 -0
  143. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-invalid-overload/filter.arrow +0 -0
  144. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-invalid-overload/input.arrow +0 -0
  145. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-missing-literal/filter.arrow +0 -0
  146. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-missing-literal/input.arrow +0 -0
  147. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-non-boolean-root/filter.arrow +0 -0
  148. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-non-boolean-root/input.arrow +0 -0
  149. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-unknown-standard-function/filter.arrow +0 -0
  150. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/error-unknown-standard-function/input.arrow +0 -0
  151. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/external-in-nonzero-column/expected.arrow +0 -0
  152. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/external-in-nonzero-column/filter.arrow +0 -0
  153. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/external-in-nonzero-column/input.arrow +0 -0
  154. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/external-in-nonzero-column/join-keys-0.arrow +0 -0
  155. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/external-in-nonzero-column/worker-expected.arrow +0 -0
  156. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-contains/expected.arrow +0 -0
  157. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-contains/filter.arrow +0 -0
  158. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-contains/input.arrow +0 -0
  159. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-ends-with/expected.arrow +0 -0
  160. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-ends-with/filter.arrow +0 -0
  161. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-ends-with/input.arrow +0 -0
  162. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-list-contains/expected.arrow +0 -0
  163. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-list-contains/filter.arrow +0 -0
  164. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-list-contains/input.arrow +0 -0
  165. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-starts-with/expected.arrow +0 -0
  166. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-starts-with/filter.arrow +0 -0
  167. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/function-starts-with/input.arrow +0 -0
  168. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-empty/expected.arrow +0 -0
  169. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-empty/filter.arrow +0 -0
  170. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-empty/input.arrow +0 -0
  171. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-empty/worker-expected.arrow +0 -0
  172. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-with-null/expected.arrow +0 -0
  173. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-with-null/filter.arrow +0 -0
  174. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-with-null/input.arrow +0 -0
  175. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/in-with-null/worker-expected.arrow +0 -0
  176. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-not-null/expected.arrow +0 -0
  177. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-not-null/filter.arrow +0 -0
  178. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-not-null/input.arrow +0 -0
  179. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-not-null/worker-expected.arrow +0 -0
  180. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-null/expected.arrow +0 -0
  181. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-null/filter.arrow +0 -0
  182. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-null/input.arrow +0 -0
  183. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/is-null/worker-expected.arrow +0 -0
  184. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-and/expected.arrow +0 -0
  185. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-and/filter.arrow +0 -0
  186. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-and/input.arrow +0 -0
  187. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-not/expected.arrow +0 -0
  188. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-not/filter.arrow +0 -0
  189. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-not/input.arrow +0 -0
  190. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-or/expected.arrow +0 -0
  191. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-or/filter.arrow +0 -0
  192. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/kleene-or/input.arrow +0 -0
  193. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/nan-comparison/expected.arrow +0 -0
  194. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/nan-comparison/filter.arrow +0 -0
  195. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/nan-comparison/input.arrow +0 -0
  196. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/negative-zero-membership/expected.arrow +0 -0
  197. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/negative-zero-membership/filter.arrow +0 -0
  198. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/negative-zero-membership/input.arrow +0 -0
  199. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/nested-null-propagation/expected.arrow +0 -0
  200. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/nested-null-propagation/filter.arrow +0 -0
  201. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/nested-null-propagation/input.arrow +0 -0
  202. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-empty/expected.arrow +0 -0
  203. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-empty/filter.arrow +0 -0
  204. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-empty/input.arrow +0 -0
  205. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-empty/worker-expected.arrow +0 -0
  206. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-with-null/expected.arrow +0 -0
  207. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-with-null/filter.arrow +0 -0
  208. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-with-null/input.arrow +0 -0
  209. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/not-in-with-null/worker-expected.arrow +0 -0
  210. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/session-integer-division/expected.arrow +0 -0
  211. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/session-integer-division/filter.arrow +0 -0
  212. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime/session-integer-division/input.arrow +0 -0
  213. {vgi_python-0.38.0 → vgi_python-0.39.0}/conformance/filter-v2/runtime-manifest.json +0 -0
  214. {vgi_python-0.38.0 → vgi_python-0.39.0}/dist-vgi/.gitignore +0 -0
  215. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/aggregate-functions.md +0 -0
  216. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/arguments.md +0 -0
  217. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/auth.md +0 -0
  218. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/catalogs.md +0 -0
  219. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/client.md +0 -0
  220. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/exceptions.md +0 -0
  221. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/filters.md +0 -0
  222. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/functions.md +0 -0
  223. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/http.md +0 -0
  224. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/index.md +0 -0
  225. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/metadata.md +0 -0
  226. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/observability.md +0 -0
  227. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/storage.md +0 -0
  228. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/transactor.md +0 -0
  229. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/api/worker.md +0 -0
  230. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/argument-serialization.md +0 -0
  231. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/apple-touch-icon.png +0 -0
  232. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/favicon-16x16.png +0 -0
  233. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/favicon-32x32.png +0 -0
  234. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/favicon.ico +0 -0
  235. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/kinds/aggregate.svg +0 -0
  236. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/kinds/buffering.svg +0 -0
  237. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/kinds/scalar.svg +0 -0
  238. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/kinds/table-in-out.svg +0 -0
  239. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/kinds/table.svg +0 -0
  240. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/logo.png +0 -0
  241. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/social-card.png +0 -0
  242. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/assets/video-thumbnail.jpg +0 -0
  243. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/authentication.md +0 -0
  244. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/cli.md +0 -0
  245. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/column-statistics.md +0 -0
  246. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/concepts/index.md +0 -0
  247. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/contributing-docs.md +0 -0
  248. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/filter-pushdown.md +0 -0
  249. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/generator-api.md +0 -0
  250. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/global-functions.md +0 -0
  251. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/catalogs.md +0 -0
  252. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/function-patterns.md +0 -0
  253. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/http-auth.md +0 -0
  254. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/index.md +0 -0
  255. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/iroh.md +0 -0
  256. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/pushdown-and-statistics.md +0 -0
  257. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/state-storage.md +0 -0
  258. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/how-to/tailnet.md +0 -0
  259. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/index.md +0 -0
  260. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/lifecycle.md +0 -0
  261. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/metadata.md +0 -0
  262. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/overrides/main.html +0 -0
  263. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/protocol/index.md +0 -0
  264. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/protocol/vgi-catalog-query-pushdown-design.md +0 -0
  265. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/protocol/vgi-duckdb-filter-adapter.md +0 -0
  266. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/protocol/vgi-filter-encoding-v2-spec.md +0 -0
  267. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/protocol/vgi-protocol-proposed-changes.md +0 -0
  268. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/protocol/vgi-runtime-filter-artifacts.md +0 -0
  269. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/robots.txt +0 -0
  270. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/shared-storage.md +0 -0
  271. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/stylesheets/extra.css +0 -0
  272. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/tutorial/index.md +0 -0
  273. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/tutorial/scalar.md +0 -0
  274. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/tutorial/table.md +0 -0
  275. {vgi_python-0.38.0 → vgi_python-0.39.0}/docs/vgi-logo.png +0 -0
  276. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/batch_index_worker.py +0 -0
  277. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/cache_worker.py +0 -0
  278. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/calc_scalar_worker.py +0 -0
  279. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/calc_worker.py +0 -0
  280. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/copy_format_worker.py +0 -0
  281. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/filter_worker.py +0 -0
  282. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/greeting_scalar_worker.py +0 -0
  283. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/row_count_worker.py +0 -0
  284. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/series_streaming_worker.py +0 -0
  285. {vgi_python-0.38.0 → vgi_python-0.39.0}/examples/sum_worker.py +0 -0
  286. {vgi_python-0.38.0 → vgi_python-0.39.0}/identity.png +0 -0
  287. {vgi_python-0.38.0 → vgi_python-0.39.0}/mkdocs.yml +0 -0
  288. {vgi_python-0.38.0 → vgi_python-0.39.0}/packages/vgi-fixtures/LICENSE +0 -0
  289. {vgi_python-0.38.0 → vgi_python-0.39.0}/packages/vgi-fixtures/README.md +0 -0
  290. {vgi_python-0.38.0 → vgi_python-0.39.0}/packages/vgi-fixtures/docker/Dockerfile +0 -0
  291. {vgi_python-0.38.0 → vgi_python-0.39.0}/packages/vgi-fixtures/docker/docker-entrypoint.sh +0 -0
  292. {vgi_python-0.38.0 → vgi_python-0.39.0}/packages/vgi-fixtures/pyproject.toml +0 -0
  293. {vgi_python-0.38.0 → vgi_python-0.39.0}/scripts/measure_startup.py +0 -0
  294. {vgi_python-0.38.0 → vgi_python-0.39.0}/scripts/run_all_tests.sh +0 -0
  295. {vgi_python-0.38.0 → vgi_python-0.39.0}/test-data/generate.sh +0 -0
  296. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/__init__.py +0 -0
  297. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/_http_fixtures.py +0 -0
  298. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/__init__.py +0 -0
  299. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_attach_option.py +0 -0
  300. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_catalog_interface.py +0 -0
  301. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_client_catalog.py +0 -0
  302. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_column_statistics.py +0 -0
  303. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_declarative.py +0 -0
  304. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_example_worker_catalog.py +0 -0
  305. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_integration.py +0 -0
  306. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_required_filters.py +0 -0
  307. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_scan_branches.py +0 -0
  308. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_serialization.py +0 -0
  309. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_setting.py +0 -0
  310. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_storage.py +0 -0
  311. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_time_travel.py +0 -0
  312. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/catalog/test_writable_table.py +0 -0
  313. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/__init__.py +0 -0
  314. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_aggregate_client.py +0 -0
  315. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_batch_metadata_callback.py +0 -0
  316. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_bind_and_join_keys.py +0 -0
  317. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_broken_pipe.py +0 -0
  318. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_cli.py +0 -0
  319. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_cli_catalog_functions.py +0 -0
  320. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_copy_client.py +0 -0
  321. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_http_response_budget.py +0 -0
  322. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_iroh_client.py +0 -0
  323. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_scan_branches_client.py +0 -0
  324. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_split_client.py +0 -0
  325. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_stop_force.py +0 -0
  326. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_table_column_statistics.py +0 -0
  327. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_time_travel_client.py +0 -0
  328. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/client/test_worker_debug.py +0 -0
  329. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/__init__.py +0 -0
  330. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/_stub.py +0 -0
  331. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/conftest.py +0 -0
  332. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_accumulate.py +0 -0
  333. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_aggregate.py +0 -0
  334. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_attach.py +0 -0
  335. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_bearer_auth.py +0 -0
  336. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_const_param_enforcement.py +0 -0
  337. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_container.py +0 -0
  338. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_copy_from.py +0 -0
  339. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_copy_to.py +0 -0
  340. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_function_inventory.py +0 -0
  341. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_github.py +0 -0
  342. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_http_client.py +0 -0
  343. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_http_external_location.py +0 -0
  344. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_http_upload_url.py +0 -0
  345. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_macro.py +0 -0
  346. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_overload.py +0 -0
  347. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_protocol_inventory.py +0 -0
  348. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_protocol_version.py +0 -0
  349. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_resumable_scan.py +0 -0
  350. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_scalar.py +0 -0
  351. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_scalar_attach_opaque_data.py +0 -0
  352. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_secret.py +0 -0
  353. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_settings.py +0 -0
  354. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_splits.py +0 -0
  355. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_table.py +0 -0
  356. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_table_in_out.py +0 -0
  357. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_view.py +0 -0
  358. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conformance/test_writable.py +0 -0
  359. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/conftest.py +0 -0
  360. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/anchor_len_overrun.bin +0 -0
  361. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/bad_fingerprint.bin +0 -0
  362. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/bad_flags_unsealed_but_key_present.bin +0 -0
  363. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/bad_version.bin +0 -0
  364. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/generate.py +0 -0
  365. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/manifest.json +0 -0
  366. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/reserved_flag_bit.bin +0 -0
  367. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/stale_anchor.bin +0 -0
  368. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/truncated.bin +0 -0
  369. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/valid_sealed.bin +0 -0
  370. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/data/split_tokens/valid_unsealed.bin +0 -0
  371. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/__init__.py +0 -0
  372. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_bernoulli_function.py +0 -0
  373. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_binary_packet_function.py +0 -0
  374. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_client.py +0 -0
  375. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_conditional_message_function.py +0 -0
  376. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_hash_seed_function.py +0 -0
  377. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_multiply_by_setting_function.py +0 -0
  378. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_multiply_function.py +0 -0
  379. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_random_bytes_function.py +0 -0
  380. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/scalar/test_return_secret_value_function.py +0 -0
  381. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/__init__.py +0 -0
  382. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/__init__.py +0 -0
  383. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_constant_columns_function.py +0 -0
  384. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_double_sequence_function.py +0 -0
  385. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_exception_function.py +0 -0
  386. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_filter_echo_function.py +0 -0
  387. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_logging_function.py +0 -0
  388. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_nested_sequence_function.py +0 -0
  389. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_partitioned_function.py +0 -0
  390. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_projected_data_function.py +0 -0
  391. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_sequence_function.py +0 -0
  392. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_settings_function.py +0 -0
  393. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_struct_settings_function.py +0 -0
  394. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/generator/test_ten_thousand_function.py +0 -0
  395. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table/test_wide_columns.py +0 -0
  396. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/__init__.py +0 -0
  397. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/__init__.py +0 -0
  398. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/test_buffer_input_function.py +0 -0
  399. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/test_echo_function.py +0 -0
  400. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/test_exception_functions.py +0 -0
  401. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/test_filter_by_setting_function.py +0 -0
  402. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/test_repeat_inputs_function.py +0 -0
  403. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/test_substream_partial_sum_function.py +0 -0
  404. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/generator/test_sum_all_columns_function.py +0 -0
  405. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/test_blended_exchange.py +0 -0
  406. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/test_blended_metadata.py +0 -0
  407. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/table_in_out/test_client.py +0 -0
  408. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/tailnet/Dockerfile +0 -0
  409. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/tailnet/__init__.py +0 -0
  410. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/tailnet/compose.yaml +0 -0
  411. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/tailnet/probe.py +0 -0
  412. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/tailnet/run.sh +0 -0
  413. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/tailnet/test_worker.py +0 -0
  414. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/tailnet/worker.py +0 -0
  415. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_access_log_audit.py +0 -0
  416. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_aggregate_function.py +0 -0
  417. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_argument_spec.py +0 -0
  418. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_auth.py +0 -0
  419. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_bind_exceptions.py +0 -0
  420. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_bind_request_at_clause.py +0 -0
  421. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_bound_storage_conformance.py +0 -0
  422. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_cache_control.py +0 -0
  423. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_call_state_attach.py +0 -0
  424. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_catalog_auth_binding.py +0 -0
  425. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_client_oauth.py +0 -0
  426. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_codegen_request_inventory.py +0 -0
  427. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_copy_from_function.py +0 -0
  428. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_copy_to_function.py +0 -0
  429. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_docstrings.py +0 -0
  430. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_documentation_examples.py +0 -0
  431. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_dynamic_filter_http_turns.py +0 -0
  432. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_example_function_arg_types.py +0 -0
  433. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_examples_workers.py +0 -0
  434. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_exception_handling.py +0 -0
  435. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_exceptions.py +0 -0
  436. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_filter_pushdown.py +0 -0
  437. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_filter_pushdown_extension.py +0 -0
  438. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_filter_v2.py +0 -0
  439. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_filter_v2_builder.py +0 -0
  440. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_filter_v2_runtime_corpus.py +0 -0
  441. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_filter_v2_spec_schema.py +0 -0
  442. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_fixture_catalog_parity.py +0 -0
  443. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_function_shape_mismatch.py +0 -0
  444. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_function_storage.py +0 -0
  445. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_function_storage_azure_sql.py +0 -0
  446. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_function_storage_cf_do.py +0 -0
  447. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_function_storage_cf_do_integration.py +0 -0
  448. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_function_storage_conformance.py +0 -0
  449. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_cpp_constants.py +0 -0
  450. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_cpp_protocol_name.py +0 -0
  451. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_cpp_protocol_version.py +0 -0
  452. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_cpp_request_builders.py +0 -0
  453. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_cpp_schemas.py +0 -0
  454. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_cpp_secret.py +0 -0
  455. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_go_schemas.py +0 -0
  456. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_java_schemas.py +0 -0
  457. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_protocol_version.py +0 -0
  458. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_rust_request_builders.py +0 -0
  459. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_rust_schemas.py +0 -0
  460. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_schemas_cross_lang.py +0 -0
  461. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_ts_client.py +0 -0
  462. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_generated_ts_schemas.py +0 -0
  463. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_http_demo_storage.py +0 -0
  464. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_http_s3_offload_input.py +0 -0
  465. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_http_s3_offload_output.py +0 -0
  466. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_import_side_effects.py +0 -0
  467. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_landing_discovery.py +0 -0
  468. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_launch_transport.py +0 -0
  469. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_metadata.py +0 -0
  470. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_mypy_consolidated.py +0 -0
  471. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_nest_tensor.py +0 -0
  472. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_otel.py +0 -0
  473. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_projection_enforcement.py +0 -0
  474. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_projection_repro.py +0 -0
  475. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_protocol_classes.py +0 -0
  476. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_resolved_secrets.py +0 -0
  477. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_schema_paths_v2.py +0 -0
  478. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_schema_scoped_functions.py +0 -0
  479. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_schema_utils.py +0 -0
  480. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_serve.py +0 -0
  481. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_setting_secret_annotations.py +0 -0
  482. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_signing_key.py +0 -0
  483. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_split_token.py +0 -0
  484. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_subprocess_transport.py +0 -0
  485. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_table_buffering_function.py +0 -0
  486. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_table_function_dynamic_to_string.py +0 -0
  487. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_tcp_transport.py +0 -0
  488. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_type_bounds.py +0 -0
  489. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_union_argument.py +0 -0
  490. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_wire_record_schema_parity.py +0 -0
  491. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_worker.py +0 -0
  492. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_worker_cli.py +0 -0
  493. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_worker_page.py +0 -0
  494. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/test_write_results.py +0 -0
  495. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/transactor/__init__.py +0 -0
  496. {vgi_python-0.38.0 → vgi_python-0.39.0}/tests/transactor/test_transactor.py +0 -0
  497. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/__init__.py +0 -0
  498. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_duckdb.py +0 -0
  499. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_storage_profile.py +0 -0
  500. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/__init__.py +0 -0
  501. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/accumulate/__init__.py +0 -0
  502. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/accumulate/worker.py +0 -0
  503. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/__init__.py +0 -0
  504. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/_common.py +0 -0
  505. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/basic.py +0 -0
  506. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/dynamic.py +0 -0
  507. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/generic.py +0 -0
  508. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/listagg.py +0 -0
  509. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/percentile.py +0 -0
  510. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/same_name.py +0 -0
  511. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/secret_typed.py +0 -0
  512. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/streaming.py +0 -0
  513. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/varargs.py +0 -0
  514. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/aggregate/window.py +0 -0
  515. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/attach_options.py +0 -0
  516. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/bad_enum.py +0 -0
  517. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/bad_protocol.py +0 -0
  518. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/cancellable.py +0 -0
  519. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/catalog.py +0 -0
  520. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/companion.py +0 -0
  521. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/copy_from.py +0 -0
  522. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/copy_to.py +0 -0
  523. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/global_functions.py +0 -0
  524. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/http_server.py +0 -0
  525. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/narrow_bind/__init__.py +0 -0
  526. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/narrow_bind/worker.py +0 -0
  527. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/nest_tensor.py +0 -0
  528. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/orchard_catalog.py +0 -0
  529. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/projection_repro/__init__.py +0 -0
  530. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/projection_repro/worker.py +0 -0
  531. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/__init__.py +0 -0
  532. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/_common.py +0 -0
  533. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/arithmetic.py +0 -0
  534. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/bench_ladder.py +0 -0
  535. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/binary.py +0 -0
  536. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/formatting.py +0 -0
  537. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/geo.py +0 -0
  538. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/null_handling.py +0 -0
  539. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/random_demo.py +0 -0
  540. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/same_name.py +0 -0
  541. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/settings_secrets.py +0 -0
  542. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/scalar/type_info.py +0 -0
  543. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/schema_reconcile/__init__.py +0 -0
  544. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/schema_reconcile/worker.py +0 -0
  545. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/secret_cache.py +0 -0
  546. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/simple_writable.py +0 -0
  547. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/__init__.py +0 -0
  548. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/_common.py +0 -0
  549. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/batch_index.py +0 -0
  550. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/batch_index_broken.py +0 -0
  551. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/cache.py +0 -0
  552. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/catalog_scans.py +0 -0
  553. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/filters.py +0 -0
  554. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/late_materialization.py +0 -0
  555. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/make_series.py +0 -0
  556. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/misc.py +0 -0
  557. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/order_modes.py +0 -0
  558. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/pairs.py +0 -0
  559. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/partition_columns.py +0 -0
  560. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/partition_columns_broken.py +0 -0
  561. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/profiling_example.py +0 -0
  562. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/required_filters.py +0 -0
  563. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/same_name_cached.py +0 -0
  564. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/same_name_schemas.py +0 -0
  565. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/sequence.py +0 -0
  566. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/settings.py +0 -0
  567. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/splits.py +0 -0
  568. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/transaction_storage.py +0 -0
  569. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/tt_pushdown.py +0 -0
  570. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/typed_probe.py +0 -0
  571. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/versioned.py +0 -0
  572. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table/wide.py +0 -0
  573. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table_in_out.py +0 -0
  574. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/table_in_out_same_name.py +0 -0
  575. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/twin_catalogs.py +0 -0
  576. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/versioned.py +0 -0
  577. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/versioned_tables.py +0 -0
  578. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/worker.py +0 -0
  579. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/writable/__init__.py +0 -0
  580. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/writable/generic.py +0 -0
  581. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/writable/table.py +0 -0
  582. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/_test_fixtures/writable/worker.py +0 -0
  583. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/aggregate_function.py +0 -0
  584. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/argument_spec.py +0 -0
  585. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/arguments.py +0 -0
  586. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/attach_header.py +0 -0
  587. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/auth.py +0 -0
  588. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/cache_control.py +0 -0
  589. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/__init__.py +0 -0
  590. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/_descriptor_spec.py +0 -0
  591. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/catalog_interface.py +0 -0
  592. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/descriptors.py +0 -0
  593. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/duckdb_statistics.py +0 -0
  594. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/secret_type.py +0 -0
  595. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/setting.py +0 -0
  596. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/catalog/storage.py +0 -0
  597. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/__init__.py +0 -0
  598. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/aggregate.py +0 -0
  599. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/catalog_mixin.py +0 -0
  600. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/cli.py +0 -0
  601. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/cli_catalog.py +0 -0
  602. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/cli_schema.py +0 -0
  603. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/cli_table.py +0 -0
  604. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/cli_transaction.py +0 -0
  605. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/cli_utils.py +0 -0
  606. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/cli_view.py +0 -0
  607. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/client.py +0 -0
  608. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/client/errors.py +0 -0
  609. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/__init__.py +0 -0
  610. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/_common.py +0 -0
  611. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_constants.py +0 -0
  612. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_protocol_name.py +0 -0
  613. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_protocol_version.py +0 -0
  614. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_request_builders.py +0 -0
  615. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_schemas.py +0 -0
  616. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_secret_protocol_version.py +0 -0
  617. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_secret_request_builders.py +0 -0
  618. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/cpp_secret_schemas.py +0 -0
  619. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/go_schemas.py +0 -0
  620. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/java_schemas.py +0 -0
  621. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/protocol_version.py +0 -0
  622. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/rust_request_builders.py +0 -0
  623. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/rust_schemas.py +0 -0
  624. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/ts_client.py +0 -0
  625. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/codegen/ts_schemas.py +0 -0
  626. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/copy_from_function.py +0 -0
  627. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/copy_to_function.py +0 -0
  628. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/exceptions.py +0 -0
  629. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/filter_v2.py +0 -0
  630. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/filter_v2_builder.py +0 -0
  631. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/function.py +0 -0
  632. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/function_storage.py +0 -0
  633. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/function_storage_azure_sql.py +0 -0
  634. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/function_storage_cf_do.py +0 -0
  635. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/http/__init__.py +0 -0
  636. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/http/demo_storage.py +0 -0
  637. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/http/landing_page.py +0 -0
  638. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/http/vgi-client.js +0 -0
  639. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/invocation.py +0 -0
  640. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/logging_config.py +0 -0
  641. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/meta_worker.py +0 -0
  642. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/metadata.py +0 -0
  643. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/otel.py +0 -0
  644. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/profiling.py +0 -0
  645. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/protocol.py +0 -0
  646. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/protocol_version.txt +0 -0
  647. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/py.typed +0 -0
  648. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/scalar_function.py +0 -0
  649. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/schema_path.py +0 -0
  650. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/schema_utils.py +0 -0
  651. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/secret_protocol.py +0 -0
  652. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/secret_service.py +0 -0
  653. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/serve.py +0 -0
  654. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/split_token.py +0 -0
  655. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/table_buffering_function.py +0 -0
  656. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/table_filter_pushdown.py +0 -0
  657. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/table_function.py +0 -0
  658. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/table_in_out_function.py +0 -0
  659. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/transactor/__init__.py +0 -0
  660. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/transactor/_duckdb_compat.py +0 -0
  661. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/transactor/client.py +0 -0
  662. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/transactor/protocol.py +0 -0
  663. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/transactor/server.py +0 -0
  664. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/worker.py +0 -0
  665. {vgi_python-0.38.0 → vgi_python-0.39.0}/vgi/write_results.py +0 -0
  666. {vgi_python-0.38.0 → vgi_python-0.39.0}/wrangler.jsonc +0 -0
@@ -392,7 +392,7 @@ Set `SENTRY_DSN` (and install `vgi[sentry]`) to forward unhandled exceptions to
392
392
 
393
393
  **Attach options redaction:** by default *no* options are logged in the `catalog.attach` / `catalog.create` breadcrumbs because options routinely carry credentials. Implementers opt in via `CatalogInterface.loggable_attach_options(options) -> Mapping`, which returns a redacted, safe-to-log subset (host, region, bucket — never password/token/secret). When the override returns an empty mapping (the default), the `options` field is omitted from the breadcrumb entirely. See `docs/catalog-interface.md` for details.
394
394
 
395
- **Secret attach options:** credential options (API keys, tokens, passwords) MUST be declared `AttachOption(..., secret=True)`. `AttachOptionSpec.secret` rides as a nullable `bool` column named `secret` appended after `required` (an absent column reads as `False`); clients and the DuckDB extension mask such options, keep them out of cache keys and logs, and can supply them from a `vgi_attach` DuckDB secret (`CREATE SECRET (TYPE vgi_attach, SCOPE '<worker url>', api_key '…')`). Secret + required is fine; secret + default is allowed but discouraged.
395
+ **Secret attach options:** credential options (API keys, tokens, passwords) MUST be declared `AttachOption(..., secret=True)`. `AttachOptionSpec.secret` rides as a nullable `bool` column named `secret` appended after `required` (an absent column reads as `False`); they are passed inline at ATTACH; clients mask them, and the DuckDB extension redacts them from `duckdb_databases()`, keeps only a salted hash of them in its cache key, and never logs them. Keep a credential out of the SQL text with an expression: `ATTACH 'sales' (TYPE vgi, LOCATION '…', api_key getenv('SALES_API_KEY'))`. Secret + required is fine; secret + default is allowed but discouraged.
396
396
 
397
397
  **Releases.** `vgi-serve` populates `release` from `SENTRY_RELEASE` if set, otherwise from `importlib.metadata.version("vgi-python")`. Production deploys should set `SENTRY_RELEASE=$(git rev-parse HEAD)` (or a tagged release identifier) so Sentry's commit-tracking and regression-detection features can correlate events to specific commits. Publishing GitHub releases makes the release-comparison UI more useful.
398
398
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vgi-python
3
- Version: 0.38.0
3
+ Version: 0.39.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
@@ -267,11 +267,10 @@ class MyWorker(Worker):
267
267
  | `required=True` | The caller must supply the option. Declare it with no class-level default; `required` plus a default is rejected. |
268
268
  | `secret=True` | The option carries a credential. |
269
269
 
270
- **Credential options (API keys, tokens, passwords) MUST be declared `secret=True`.** Clients and the DuckDB extension then mask the value, keep it out of result-cache keys and logs, and can supply it from a `vgi_attach` DuckDB secret, so the `ATTACH` statement never carries it:
270
+ **Credential options (API keys, tokens, passwords) MUST be declared `secret=True`.** The caller passes them inline as attach options. Clients mask secret options, and the DuckDB extension redacts them from `duckdb_databases()`, keeps only a salted hash of them in its result-cache key, and never logs them. To keep a credential out of the SQL text (shell history, scripts, shared links), write the option as an expression:
271
271
 
272
272
  ```sql
273
- CREATE SECRET (TYPE vgi_attach, SCOPE 'https://worker.example.com', api_key '...');
274
- ATTACH 'mydb' AS mydb (TYPE vgi, LOCATION 'https://worker.example.com');
273
+ ATTACH 'mydb' (TYPE vgi, LOCATION 'https://worker.example.com', api_key getenv('MYDB_API_KEY'));
275
274
  ```
276
275
 
277
276
  `secret` combines with `required`. It is allowed together with a default, but a secret option should normally have none: the default is advertised in plain text to every client at discovery.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vgi-python"
3
- version = "0.38.0"
3
+ version = "0.39.0"
4
4
  description = "Vector Gateway Interface - Connect DuckDB to external programs via Apache Arrow"
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -55,6 +55,12 @@ _TARGETS: list[tuple[str, str, str]] = [
55
55
  ("vgi.codegen.rust_request_builders", "vgi-protocol/src/generated/request_params.rs", "vgi-rust"),
56
56
  ("vgi.codegen.ts_schemas", "src/generated/vgi-protocol-schemas.ts", "vgi-typescript"),
57
57
  ("vgi.codegen.ts_client", "src/generated/vgi-client.ts", "vgi-typescript"),
58
+ ("vgi.codegen.csharp_types", "src/QueryFarm.Vgi/Protocol/Generated/VgiProtocolTypes.g.cs", "vgi-csharp"),
59
+ (
60
+ "vgi.codegen.csharp_schemas",
61
+ "test/QueryFarm.Vgi.Tests/Generated/VgiProtocolSchemas.g.cs",
62
+ "vgi-csharp",
63
+ ),
58
64
  (
59
65
  "vgi.codegen.java_schemas",
60
66
  "vgi/src/test/java/farm/query/vgi/generated/VgiProtocolSchemas.java",
@@ -79,6 +79,12 @@ _EXEMPTIONS: dict[str, str] = {
79
79
  "(it spawns the Python worker as a subprocess); the Python client never "
80
80
  "exercises the launcher surface."
81
81
  ),
82
+ "location_policy": (
83
+ "LOCATION transport policy (vgi_allowed_transports, enable_external_access) "
84
+ "is enforced by the C++ extension before it starts or connects to a worker; "
85
+ "it is a DuckDB setting with no counterpart in the Python client, which is "
86
+ "handed a transport directly."
87
+ ),
82
88
  "simple_writable": (
83
89
  "INSERT/UPDATE/DELETE/RETURNING write paths are mirrored by "
84
90
  "test_writable.py, which drives the same operations against the writable "
@@ -0,0 +1,111 @@
1
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
2
+
3
+ """Drift + behavior tests for `vgi.codegen.csharp_types` and `vgi.codegen.csharp_schemas`.
4
+
5
+ vgi-csharp checks in two generated files: the protocol's records and enums as C#
6
+ types (its wire schemas are derived from them by reflection), and the protocol's
7
+ schemas as C# Arrow schemas, which its test project compares that derivation
8
+ against. Both must match what the generators emit right now.
9
+
10
+ The drift tests compare text, not parsed schemas: the types file is more than
11
+ schemas (CLR types, attributes, initializers), and any byte of it changing is a
12
+ change to what vgi-csharp compiles.
13
+
14
+ Skipped when the `vgi-csharp` checkout is not next to vgi-python;
15
+ ``VGI_CSHARP_ROOT`` overrides the location.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import io
21
+ import os
22
+ from pathlib import Path
23
+
24
+ import pytest
25
+
26
+ from vgi.codegen import csharp_schemas, csharp_types
27
+
28
+ _TYPES = Path("src/QueryFarm.Vgi/Protocol/Generated/VgiProtocolTypes.g.cs")
29
+ _SCHEMAS = Path("test/QueryFarm.Vgi.Tests/Generated/VgiProtocolSchemas.g.cs")
30
+
31
+ _REGEN_HINT = (
32
+ "To regenerate, run:\n"
33
+ " uv run --project ~/Development/vgi-python python scripts/regen_generated.py\n"
34
+ "\n"
35
+ "Do not redirect a generator into its destination with `>`: the shell\n"
36
+ "truncates the file before the generator runs, so any failure destroys\n"
37
+ "the checked-in artifact. The script renders to memory first."
38
+ )
39
+
40
+
41
+ def _vgi_csharp_root() -> Path:
42
+ override = os.environ.get("VGI_CSHARP_ROOT")
43
+ if override:
44
+ return Path(override)
45
+ return Path(__file__).resolve().parents[2] / "vgi-csharp"
46
+
47
+
48
+ def _render(module: object) -> str:
49
+ buf = io.StringIO()
50
+ module.emit(buf) # type: ignore[attr-defined]
51
+ return buf.getvalue()
52
+
53
+
54
+ @pytest.mark.parametrize("module", [csharp_types, csharp_schemas], ids=["types", "schemas"])
55
+ def test_generator_is_deterministic(module: object) -> None:
56
+ """Calling emit() twice produces byte-identical output."""
57
+ assert _render(module) == _render(module)
58
+
59
+
60
+ @pytest.mark.parametrize(
61
+ ("module", "relative"),
62
+ [(csharp_types, _TYPES), (csharp_schemas, _SCHEMAS)],
63
+ ids=["types", "schemas"],
64
+ )
65
+ def test_checked_in_file_matches_generator(module: object, relative: Path) -> None:
66
+ """Drift check: the checked-in C# matches what the generator produces."""
67
+ path = _vgi_csharp_root() / relative
68
+ if not path.exists():
69
+ pytest.skip(f"{path} not found; set VGI_CSHARP_ROOT or check out vgi-csharp")
70
+ assert path.read_text() == _render(module), f"{path} is stale.\n{_REGEN_HINT}"
71
+
72
+
73
+ def test_every_csharp_rename_is_used() -> None:
74
+ """A rename whose Python type no longer exists is dead, and would hide the next rename it needs."""
75
+ model = csharp_types.build_model()
76
+ emitted = set(model.records) | set(model.enums)
77
+ reachable_python_names = {py for py, cs in csharp_types.CSHARP_NAMES.items() if cs in emitted}
78
+ stale = set(csharp_types.CSHARP_NAMES) - reachable_python_names
79
+ assert not stale, f"CSHARP_NAMES entries map to nothing emitted: {sorted(stale)}"
80
+
81
+
82
+ def test_merged_items_responses_share_one_type() -> None:
83
+ """The catalog items responses collapse into one C# type, built from all of them."""
84
+ record = csharp_types.build_model().records["ItemsResponse"]
85
+ methods = {o.removeprefix("method '").split("'")[0] for o in record.origins}
86
+ assert {"catalog_catalogs", "catalog_schemas", "catalog_table_get", "catalog_index_get"} <= methods
87
+ assert [p.wire_name for p in record.props] == ["items"]
88
+
89
+
90
+ def test_large_binary_list_carries_large_width() -> None:
91
+ """`list<large_binary>` is declared on the property; without it the derivation says `list<binary>`."""
92
+ props = {p.wire_name: p for p in csharp_types.build_model().records["InitRequest"].props}
93
+ assert "[global::QueryFarm.VgiRpc.Reflection.LargeWidth]" in props["join_keys"].attrs
94
+ assert props["join_keys"].clr_type == "global::System.Collections.Generic.List<byte[]>?"
95
+ assert "[global::QueryFarm.VgiRpc.Reflection.LargeWidth]" in props["pushdown_filters"].attrs
96
+
97
+
98
+ def test_appended_nullable_flag_is_wire_optional() -> None:
99
+ """A nullable column typed as a plain value with a default is an appended column."""
100
+ props = {p.wire_name: p for p in csharp_types.build_model().records["AttachOptionSpec"].props}
101
+ assert props["required"].clr_type == "bool"
102
+ assert "[global::QueryFarm.Vgi.Internal.WireOptional]" in props["required"].attrs
103
+
104
+
105
+ def test_enum_members_round_trip_to_their_wire_names() -> None:
106
+ """C# derives an enum member's wire name as UPPER_SNAKE of its name; every member must survive that."""
107
+ for e in csharp_types.build_model().enums.values():
108
+ for m in e.members:
109
+ derived = csharp_types._to_snake_case(m.name).upper()
110
+ rendered = csharp_types._render_enum(e)
111
+ assert derived == m.wire_name or f'RpcName("{m.wire_name}")' in rendered, (e.name, m.name)
@@ -2668,7 +2668,7 @@ requires-dist = [
2668
2668
 
2669
2669
  [[package]]
2670
2670
  name = "vgi-python"
2671
- version = "0.38.0"
2671
+ version = "0.39.0"
2672
2672
  source = { editable = "." }
2673
2673
  dependencies = [
2674
2674
  { name = "click" },
@@ -11,12 +11,12 @@ format, same Python type → Arrow mapping, same extractor shape — so both sha
11
11
  the machinery in ``vgi.catalog._descriptor_spec``.
12
12
 
13
13
  Credential options (API keys, tokens, passwords) MUST be declared
14
- ``secret=True``. Clients and the DuckDB extension then mask the value, keep it
15
- out of result-cache keys and logs, and can supply it from a ``vgi_attach``
16
- DuckDB secret instead of the ``ATTACH`` text::
14
+ ``secret=True``. The caller passes them inline as attach options; the DuckDB
15
+ extension redacts them from ``duckdb_databases()``, keeps only a salted hash of
16
+ them in its result-cache key, and never logs them. To keep a credential out of
17
+ the SQL text, write the option as an expression::
17
18
 
18
- CREATE SECRET (TYPE vgi_attach, SCOPE 'https://worker.example.com', api_key '...');
19
- ATTACH 'mydb' AS mydb (TYPE vgi, LOCATION 'https://worker.example.com');
19
+ ATTACH 'mydb' (TYPE vgi, LOCATION 'https://worker.example.com', api_key getenv('MYDB_API_KEY'));
20
20
  """
21
21
 
22
22
  from dataclasses import dataclass
@@ -51,11 +51,12 @@ class AttachOptionSpec(_SpecBase):
51
51
  Mutually exclusive with ``default`` — an option that falls back to
52
52
  a value is by definition satisfiable without the caller.
53
53
  secret: The option carries a credential (an API key, token or
54
- password). Clients and the DuckDB extension mask its value, keep it
55
- out of result-cache keys and logs, and can supply it from a
56
- ``vgi_attach`` DuckDB secret
57
- (``CREATE SECRET (TYPE vgi_attach, SCOPE '<worker url>', api_key '...')``)
58
- rather than the ``ATTACH`` text. Credential options MUST set this.
54
+ password). It is still passed inline at ``ATTACH``, but clients
55
+ mask it, and the DuckDB extension redacts it from
56
+ ``duckdb_databases()``, keeps only a salted hash of it in its
57
+ result-cache key, and never logs it. Keep it out of the SQL text
58
+ with an expression, e.g. ``api_key getenv('MYDB_API_KEY')``.
59
+ Credential options MUST set this.
59
60
  Compatible with ``required``. Allowed alongside a ``default``, but a
60
61
  secret option should normally have none: a default credential is
61
62
  advertised in plain text to every client at discovery.
@@ -123,9 +124,8 @@ class AttachOption(_DescriptorBase):
123
124
  Attributes:
124
125
  required: The caller must supply this option at ``ATTACH`` time.
125
126
  secret: The option carries a credential. Clients and the DuckDB
126
- extension mask it, keep it out of cache keys and logs, and can
127
- supply it from a ``vgi_attach`` DuckDB secret. Should normally have
128
- no default.
127
+ extension mask it, keep only a salted hash of it in cache keys, and
128
+ never log it. Should normally have no default.
129
129
 
130
130
  """
131
131
 
@@ -0,0 +1,203 @@
1
+ # Copyright 2025, 2026 Query Farm LLC - https://query.farm
2
+
3
+ r"""Emit the VGI protocol's Arrow schemas as C#, for vgi-csharp's test project.
4
+
5
+ The companion of ``vgi.codegen.csharp_types``. That module emits the C# record
6
+ types vgi-csharp derives its wire schemas from; this one emits the schemas the
7
+ derivation must produce, taken from the protocol rather than from C#, so a test
8
+ can compare the two field for field — the same "second description" vgi-java's
9
+ ``WireRecordSchemaConformanceTest`` relies on.
10
+
11
+ Generating the types makes them agree with the protocol only as far as the
12
+ generator's CLR mapping agrees with vgi-rpc-csharp's ``SchemaDerivation``; this
13
+ is what checks that. It also covers what is still written by hand: the flat
14
+ parameters of ``IVgiService``'s methods, and which record each method returns.
15
+
16
+ Three maps, all keyed by protocol names:
17
+
18
+ - ``Records`` — every record ``csharp_types`` emits, by C# type name.
19
+ - ``MethodResults`` — each unary method's result record schema (the record
20
+ inside the ``result`` binary), by wire method name; methods returning nothing
21
+ or raw IPC are absent.
22
+ - ``MethodParams`` — each method's params batch schema, by wire method name.
23
+
24
+ .. code-block:: bash
25
+
26
+ uv run --project ~/Development/vgi-python python scripts/regen_generated.py
27
+ """
28
+
29
+ from __future__ import annotations
30
+
31
+ import argparse
32
+ import io
33
+ import sys
34
+ from typing import TYPE_CHECKING, Any
35
+
36
+ import pyarrow as pa
37
+ from vgi_rpc.rpc._types import MethodType, rpc_methods # type: ignore[attr-defined]
38
+
39
+ from vgi.codegen._common import GeneratorError, _resolve_inner_schema, provenance_comment
40
+ from vgi.codegen.csharp_types import build_model
41
+ from vgi.protocol import VgiProtocol
42
+
43
+ if TYPE_CHECKING:
44
+ from typing import TextIO
45
+
46
+
47
+ GENERATOR_VERSION = "1"
48
+
49
+ DEFAULT_NAMESPACE = "QueryFarm.Vgi.Tests.Generated"
50
+
51
+ _SCALARS: list[tuple[pa.DataType, str]] = [
52
+ (pa.bool_(), "BooleanType.Default"),
53
+ (pa.int8(), "Int8Type.Default"),
54
+ (pa.int16(), "Int16Type.Default"),
55
+ (pa.int32(), "Int32Type.Default"),
56
+ (pa.int64(), "Int64Type.Default"),
57
+ (pa.uint8(), "UInt8Type.Default"),
58
+ (pa.uint16(), "UInt16Type.Default"),
59
+ (pa.uint32(), "UInt32Type.Default"),
60
+ (pa.uint64(), "UInt64Type.Default"),
61
+ (pa.float32(), "FloatType.Default"),
62
+ (pa.float64(), "DoubleType.Default"),
63
+ (pa.string(), "StringType.Default"),
64
+ (pa.large_string(), "LargeStringType.Default"),
65
+ (pa.binary(), "BinaryType.Default"),
66
+ (pa.large_binary(), "LargeBinaryType.Default"),
67
+ ]
68
+
69
+ _UNITS = {"s": "Second", "ms": "Millisecond", "us": "Microsecond", "ns": "Nanosecond"}
70
+
71
+
72
+ def _type(dtype: pa.DataType, origin: str, indent: str) -> str:
73
+ for proto, expr in _SCALARS:
74
+ if dtype.equals(proto):
75
+ return expr
76
+ if pa.types.is_dictionary(dtype):
77
+ index = _type(dtype.index_type, f"{origin}[dict index]", indent)
78
+ value = _type(dtype.value_type, f"{origin}[dict value]", indent)
79
+ return f"new DictionaryType({index}, {value}, ordered: {str(dtype.ordered).lower()})"
80
+ if pa.types.is_fixed_size_binary(dtype):
81
+ return f"new FixedSizeBinaryType({dtype.byte_width})"
82
+ if pa.types.is_timestamp(dtype):
83
+ tz = "(string?)null" if dtype.tz is None else f'"{dtype.tz}"'
84
+ return f"new TimestampType(TimeUnit.{_UNITS[dtype.unit]}, {tz})"
85
+ if pa.types.is_list(dtype):
86
+ return f"new ListType({_field(dtype.value_field, origin, indent)})"
87
+ if pa.types.is_map(dtype):
88
+ key = _field(dtype.key_field.with_name("key"), origin, indent)
89
+ value = _field(dtype.item_field.with_name("value"), origin, indent)
90
+ return f"new MapType({key}, {value})"
91
+ if pa.types.is_struct(dtype):
92
+ inner = indent + " "
93
+ children = ",\n".join(inner + _field(dtype.field(i), origin, inner) for i in range(dtype.num_fields))
94
+ return f"new StructType(\n{indent}[\n{children},\n{indent}])"
95
+ raise GeneratorError(f"vgi.codegen.csharp_schemas: unsupported Arrow type {dtype} at {origin}.")
96
+
97
+
98
+ def _field(f: pa.Field[Any], origin: str, indent: str) -> str:
99
+ return f'F("{f.name}", {_type(f.type, f"{origin}.{f.name}", indent)}, {str(f.nullable).lower()})'
100
+
101
+
102
+ def _schema(schema: pa.Schema, origin: str) -> str:
103
+ if len(schema) == 0:
104
+ return "S()"
105
+ indent = " "
106
+ fields = ",\n".join(indent + _field(f, origin, indent) for f in schema)
107
+ return f"S(\n{fields})"
108
+
109
+
110
+ def _map(name: str, doc: str, entries: list[tuple[str, pa.Schema]]) -> str:
111
+ lines = [
112
+ f" /// <summary>{doc}</summary>",
113
+ f" public static IReadOnlyDictionary<string, Schema> {name} {{ get; }} = new Dictionary<string, Schema>",
114
+ " {",
115
+ ]
116
+ for key, schema in entries:
117
+ lines.append(f' ["{key}"] = {_schema(schema, key)},')
118
+ lines.append(" };")
119
+ return "\n".join(lines) + "\n"
120
+
121
+
122
+ def emit(out: TextIO, *, namespace: str = DEFAULT_NAMESPACE) -> None:
123
+ """Emit the generated C# schema class to *out*."""
124
+ model = build_model()
125
+ records = [(name, model.records[name].schema) for name in sorted(model.records)]
126
+
127
+ methods = rpc_methods(VgiProtocol)
128
+ results: list[tuple[str, pa.Schema]] = []
129
+ params: list[tuple[str, pa.Schema]] = []
130
+ for method_name in sorted(methods):
131
+ info = methods[method_name]
132
+ params.append((method_name, info.params_schema))
133
+ if info.method_type == MethodType.UNARY and info.has_return:
134
+ inner = _resolve_inner_schema(info.result_type, method_name)
135
+ if inner is not None:
136
+ results.append((method_name, inner))
137
+
138
+ body = io.StringIO()
139
+ body.write("// Copyright 2025, 2026 Query Farm LLC - https://query.farm\n")
140
+ body.write("// <auto-generated/>\n")
141
+ body.write("\n")
142
+ body.write("#nullable enable\n")
143
+ body.write("\n")
144
+ body.write("using Apache.Arrow;\n")
145
+ body.write("using Apache.Arrow.Types;\n")
146
+ body.write("\n")
147
+ body.write(f"namespace {namespace};\n")
148
+ body.write("\n")
149
+ body.write(
150
+ "/// <summary>\n"
151
+ "/// The VGI protocol's Arrow schemas, generated from the protocol itself (vgi-python) rather\n"
152
+ "/// than derived from this port's CLR types, so a test can compare the two. Dictionary ids and\n"
153
+ "/// metadata are not part of the comparison.\n"
154
+ "/// </summary>\n"
155
+ )
156
+ body.write("public static class VgiProtocolSchemas\n{\n")
157
+ body.write(
158
+ " private static Schema S(params Field[] fields) => new(fields, metadata: null);\n\n"
159
+ " private static Field F(string name, IArrowType type, bool nullable) => new(name, type, nullable);\n\n"
160
+ )
161
+ body.write(_map("Records", "Every protocol record's schema, by its C# type name.", records))
162
+ body.write("\n")
163
+ body.write(
164
+ _map(
165
+ "MethodResults",
166
+ "Each unary method's result record schema, by wire method name. Methods that return "
167
+ "nothing or raw IPC are absent.",
168
+ results,
169
+ )
170
+ )
171
+ body.write("\n")
172
+ body.write(_map("MethodParams", "Each method's params batch schema, by wire method name.", params))
173
+ body.write("}\n")
174
+
175
+ out.write(
176
+ provenance_comment(
177
+ generator_module="vgi.codegen.csharp_schemas",
178
+ generator_command="python -m vgi.codegen.csharp_schemas",
179
+ generator_version=GENERATOR_VERSION,
180
+ regen_command_lines=[
181
+ "uv run --project ~/Development/vgi-python python scripts/regen_generated.py",
182
+ ],
183
+ body=body.getvalue(),
184
+ )
185
+ )
186
+ out.write("\n")
187
+ out.write(body.getvalue())
188
+
189
+
190
+ def main() -> None:
191
+ """Console-script entrypoint — write the C# schema class to stdout."""
192
+ parser = argparse.ArgumentParser(description=__doc__)
193
+ parser.add_argument("--namespace", default=DEFAULT_NAMESPACE, help="C# namespace of the emitted class")
194
+ args = parser.parse_args()
195
+ try:
196
+ emit(sys.stdout, namespace=args.namespace)
197
+ except GeneratorError as e:
198
+ print(f"\nerror: {e}\n", file=sys.stderr)
199
+ sys.exit(2)
200
+
201
+
202
+ if __name__ == "__main__":
203
+ main()