dirsql 0.3.124__tar.gz → 0.3.125__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 (203) hide show
  1. {dirsql-0.3.124 → dirsql-0.3.125}/Cargo.lock +1 -1
  2. {dirsql-0.3.124 → dirsql-0.3.125}/PKG-INFO +1 -1
  3. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/Cargo.toml +1 -1
  4. dirsql-0.3.125/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +3 -0
  5. dirsql-0.3.125/packages/python/e2e-attestations/feat-634-core-remove-injection.json +7 -0
  6. dirsql-0.3.125/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +51 -0
  7. dirsql-0.3.125/packages/rust/changelog.d/2026-07-24-remove-stat-fact-injection.md +3 -0
  8. dirsql-0.3.125/packages/rust/migrations.d/2026-07-24-remove-stat-fact-injection.md +55 -0
  9. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/lib.rs +14 -92
  10. dirsql-0.3.124/packages/python/e2e-attestations/feat-634-prep-python-selfemit.json +0 -7
  11. dirsql-0.3.124/packages/python/e2e-attestations/feat-662-query-default-cli.json +0 -7
  12. {dirsql-0.3.124 → dirsql-0.3.125}/Cargo.toml +0 -0
  13. {dirsql-0.3.124 → dirsql-0.3.125}/README.md +0 -0
  14. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/__init__.py +0 -0
  15. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/_async.py +0 -0
  16. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/_dirsql.pyi +0 -0
  17. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/__init__.py +0 -0
  18. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/binary_path.py +0 -0
  19. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/discover_plugins/__init__.py +0 -0
  20. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  21. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  22. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  23. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  24. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  25. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/is_windows.py +0 -0
  26. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/main.py +0 -0
  27. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/cli/resolve_config_extensions.py +0 -0
  28. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/py.typed +0 -0
  29. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/resolve_config_extensions.py +0 -0
  30. {dirsql-0.3.124 → dirsql-0.3.125}/dirsql/resolve_extension.py +0 -0
  31. {dirsql-0.3.124 → dirsql-0.3.125}/docs/.claude/CLAUDE.md +0 -0
  32. {dirsql-0.3.124 → dirsql-0.3.125}/docs/.vitepress/config.ts +0 -0
  33. {dirsql-0.3.124 → dirsql-0.3.125}/docs/.vitepress/theme/index.ts +0 -0
  34. {dirsql-0.3.124 → dirsql-0.3.125}/docs/.vitepress/theme/lang.ts +0 -0
  35. {dirsql-0.3.124 → dirsql-0.3.125}/docs/AGENTS.md +0 -0
  36. {dirsql-0.3.124 → dirsql-0.3.125}/docs/explanation.md +0 -0
  37. {dirsql-0.3.124 → dirsql-0.3.125}/docs/getting-started.md +0 -0
  38. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/columns-from-paths.md +0 -0
  39. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/define-tables.md +0 -0
  40. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/embed.md +0 -0
  41. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/extract-from-contents.md +0 -0
  42. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/load-extension.md +0 -0
  43. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/parse-files-into-columns.md +0 -0
  44. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/persist.md +0 -0
  45. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/query-without-config.md +0 -0
  46. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/react-to-changes.md +0 -0
  47. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/search-by-meaning.md +0 -0
  48. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/skip-files.md +0 -0
  49. {dirsql-0.3.124 → dirsql-0.3.125}/docs/howto/write-a-plugin.md +0 -0
  50. {dirsql-0.3.124 → dirsql-0.3.125}/docs/index.md +0 -0
  51. {dirsql-0.3.124 → dirsql-0.3.125}/docs/migrations.md +0 -0
  52. {dirsql-0.3.124 → dirsql-0.3.125}/docs/package.json +0 -0
  53. {dirsql-0.3.124 → dirsql-0.3.125}/docs/pnpm-lock.yaml +0 -0
  54. {dirsql-0.3.124 → dirsql-0.3.125}/docs/pnpm-workspace.yaml +0 -0
  55. {dirsql-0.3.124 → dirsql-0.3.125}/docs/reference/cli.md +0 -0
  56. {dirsql-0.3.124 → dirsql-0.3.125}/docs/reference/columns.md +0 -0
  57. {dirsql-0.3.124 → dirsql-0.3.125}/docs/reference/config.md +0 -0
  58. {dirsql-0.3.124 → dirsql-0.3.125}/docs/reference/hooks.md +0 -0
  59. {dirsql-0.3.124 → dirsql-0.3.125}/docs/reference/http-api.md +0 -0
  60. {dirsql-0.3.124 → dirsql-0.3.125}/docs/reference/path-tables.md +0 -0
  61. {dirsql-0.3.124 → dirsql-0.3.125}/docs/reference/sdk.md +0 -0
  62. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/CHANGELOG.md +0 -0
  63. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/MIGRATIONS.md +0 -0
  64. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/README.md +0 -0
  65. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  66. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  67. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  68. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  69. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  70. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  71. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  72. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/changelog.d/README.md +0 -0
  73. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/conftest.py +0 -0
  74. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/.claude/CLAUDE.md +0 -0
  75. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/.vitepress/config.ts +0 -0
  76. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  77. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  78. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/AGENTS.md +0 -0
  79. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/explanation.md +0 -0
  80. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/getting-started.md +0 -0
  81. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/columns-from-paths.md +0 -0
  82. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/define-tables.md +0 -0
  83. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/embed.md +0 -0
  84. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/extract-from-contents.md +0 -0
  85. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/load-extension.md +0 -0
  86. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  87. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/persist.md +0 -0
  88. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/query-without-config.md +0 -0
  89. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/react-to-changes.md +0 -0
  90. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/search-by-meaning.md +0 -0
  91. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/skip-files.md +0 -0
  92. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/howto/write-a-plugin.md +0 -0
  93. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/index.md +0 -0
  94. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/migrations.md +0 -0
  95. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/package.json +0 -0
  96. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/pnpm-lock.yaml +0 -0
  97. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/pnpm-workspace.yaml +0 -0
  98. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/reference/cli.md +0 -0
  99. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/reference/columns.md +0 -0
  100. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/reference/config.md +0 -0
  101. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/reference/hooks.md +0 -0
  102. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/reference/http-api.md +0 -0
  103. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/reference/path-tables.md +0 -0
  104. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/docs/reference/sdk.md +0 -0
  105. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  106. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  107. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  108. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  109. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  110. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/migrations.d/README.md +0 -0
  111. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/src/lib.rs +0 -0
  112. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/__init__.py +0 -0
  113. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/conftest.py +0 -0
  114. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/e2e/__init__.py +0 -0
  115. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  116. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  117. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/integration/__init__.py +0 -0
  118. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/integration/binding/__init__.py +0 -0
  119. {dirsql-0.3.124 → dirsql-0.3.125}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  120. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/CHANGELOG.md +0 -0
  121. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/Cargo.toml +0 -0
  122. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/MIGRATIONS.md +0 -0
  123. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/README.md +0 -0
  124. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/benches/db_bench.rs +0 -0
  125. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/benches/differ_bench.rs +0 -0
  126. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/benches/matcher_bench.rs +0 -0
  127. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/benches/scanner_bench.rs +0 -0
  128. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-batch-ingest-transaction.md +0 -0
  129. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-chained-pre-post-query-hooks.md +0 -0
  130. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  131. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  132. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-persist-wal.md +0 -0
  133. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  134. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-repeatable-builder-config.md +0 -0
  135. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-repeatable-cli-config.md +0 -0
  136. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  137. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  138. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-19-path-table-query-fallback.md +0 -0
  139. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-19-path-table-vtab.md +0 -0
  140. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  141. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-20-path-table-glob-semantics.md +0 -0
  142. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-20-schema-inference.md +0 -0
  143. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-21-on-file-flag.md +0 -0
  144. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  145. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-23-init-escalation-example.md +0 -0
  146. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/2026-07-23-query-default-cli.md +0 -0
  147. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/changelog.d/README.md +0 -0
  148. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/explanation.md +0 -0
  149. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/getting-started.md +0 -0
  150. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  151. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/define-tables.md +0 -0
  152. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/embed.md +0 -0
  153. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  154. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/load-extension.md +0 -0
  155. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  156. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/persist.md +0 -0
  157. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/query-without-config.md +0 -0
  158. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/react-to-changes.md +0 -0
  159. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  160. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/skip-files.md +0 -0
  161. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  162. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/index.md +0 -0
  163. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/migrations.md +0 -0
  164. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/reference/cli.md +0 -0
  165. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/reference/columns.md +0 -0
  166. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/reference/config.md +0 -0
  167. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/reference/hooks.md +0 -0
  168. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/reference/http-api.md +0 -0
  169. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/reference/path-tables.md +0 -0
  170. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/docs/reference/sdk.md +0 -0
  171. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  172. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  173. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-13-persist-wal.md +0 -0
  174. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  175. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  176. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  177. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  178. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-20-path-table-glob-semantics.md +0 -0
  179. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  180. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-23-init-escalation-example.md +0 -0
  181. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/2026-07-23-query-default-cli.md +0 -0
  182. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/migrations.d/README.md +0 -0
  183. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/bin/dirsql.rs +0 -0
  184. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/cli/execute.rs +0 -0
  185. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/cli/init.rs +0 -0
  186. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/cli/mod.rs +0 -0
  187. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/cli/router.rs +0 -0
  188. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/cli/serialize.rs +0 -0
  189. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/cli/server.rs +0 -0
  190. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/command.rs +0 -0
  191. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/config.rs +0 -0
  192. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/db.rs +0 -0
  193. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/default_config.toml +0 -0
  194. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/differ.rs +0 -0
  195. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/infer.rs +0 -0
  196. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/matcher.rs +0 -0
  197. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/parsed_vtab.rs +0 -0
  198. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/path_table.rs +0 -0
  199. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/persist.rs +0 -0
  200. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/scanner.rs +0 -0
  201. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/vtab.rs +0 -0
  202. {dirsql-0.3.124 → dirsql-0.3.125}/packages/rust/src/watcher.rs +0 -0
  203. {dirsql-0.3.124 → dirsql-0.3.125}/pyproject.toml +0 -0
@@ -500,7 +500,7 @@ dependencies = [
500
500
 
501
501
  [[package]]
502
502
  name = "dirsql-py-ext"
503
- version = "0.3.124"
503
+ version = "0.3.125"
504
504
  dependencies = [
505
505
  "dirsql",
506
506
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.3.124
3
+ Version: 0.3.125
4
4
  Summary: Ephemeral SQL index over a local directory
5
5
  Keywords: sql,filesystem,directory,sqlite,index
6
6
  Author: Kevin Scott
@@ -4,7 +4,7 @@ name = "dirsql-py-ext"
4
4
  # pypi/maturin handler can rewrite it via `write-version` before
5
5
  # `maturin build`. `pyproject.toml` declares `dynamic = ["version"]`
6
6
  # and maturin reads this field. Mirrors `packages/rust/Cargo.toml`.
7
- version = "0.3.124"
7
+ version = "0.3.125"
8
8
  # abi3 note: the `abi3-py311` pyo3 feature (below) builds ONE stable-ABI
9
9
  # `cp311-abi3` wheel per platform that loads on every CPython >= 3.11
10
10
  # (matching `pyproject.toml`'s `requires-python = ">=3.11"`), instead of
@@ -0,0 +1,3 @@
1
+ **Removed**
2
+
3
+ - **Removed the stat-fact injection layer** (core change, surfaced through the Python SDK). dirsql no longer auto-fills DDL columns named `path`/`basename`/`dir`/`ext`/`size`/`mtime`/`ctime` from filesystem stat. A `Table` now contains exactly what its `on_file` callback returns; a DDL column the callback never emits is `None`/`NULL`, not injected. To keep a stat column populated, emit it from the callback (e.g. derive `path` from the file argument), or query the path directly with a path-table (`FROM './'`). (#634)
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1784902229,
4
+ "exit_code": 0,
5
+ "commit": "7571e0d010b096821bfc99b1f893db2b320347dc",
6
+ "branch": "feat/634-core-remove-injection"
7
+ }
@@ -0,0 +1,51 @@
1
+ ### Stat-fact injection removed (#634)
2
+
3
+ #### Summary
4
+
5
+ dirsql previously injected filesystem-derived values into any DDL column named
6
+ `path`, `basename`, `dir`, `ext`, `size`, `mtime`, or `ctime` — filling them
7
+ even when a table's `on_file` callback emitted nothing for that column. That
8
+ injection layer (in the shared Rust core) is gone. A `Table` now contains
9
+ **exactly what its `on_file` callback returns**; a declared column the callback
10
+ never emits is `None`/`NULL`. No Python API signature changes — runtime
11
+ behavior only.
12
+
13
+ #### Required changes
14
+
15
+ | Before (injected) | After (NULL unless emitted) | Fix |
16
+ | ----------------- | --------------------------- | --- |
17
+ | DDL declares `path TEXT`, callback omits it → column held the root-relative path | Column is `None` | Emit it from the callback: `Table("CREATE TABLE t (path TEXT)", "**/*", on_file=lambda path: [{"path": path}])`. |
18
+ | DDL declares `size INTEGER`, callback omits it → column held the file size | Column is `None` | Emit it: `on_file=lambda path: [{"size": os.path.getsize(path)}]`. |
19
+ | Want stat columns with **no** callback at all | (was injection) | Query the path directly with a path-table: `FROM './'`. |
20
+
21
+ #### Deprecations removed
22
+
23
+ _None._
24
+
25
+ #### Behavior changes without code changes
26
+
27
+ - A DDL column named `path`/`basename`/`dir`/`ext`/`size`/`mtime`/`ctime` that
28
+ the `on_file` callback does not emit is now `None`/`NULL` instead of an
29
+ injected filesystem value.
30
+ - A **strict** table whose DDL declares such a column but whose callback does
31
+ not emit it now raises a schema-validation error rather than being silently
32
+ filled.
33
+
34
+ #### Verification
35
+
36
+ ```python
37
+ from dirsql import DirSQL, Table
38
+
39
+ # Callback emits only "size"; DDL also declares "path".
40
+ db = DirSQL(root, tables=[Table(
41
+ ddl="CREATE TABLE files (path TEXT, size INTEGER)",
42
+ glob="**/*.txt",
43
+ on_file=lambda _path: [{"size": 42}],
44
+ )])
45
+ rows = db.query("SELECT path, size FROM files")
46
+ # Before: rows[0]["path"] == "a.txt" (injected)
47
+ # After: rows[0]["path"] is None (not emitted)
48
+
49
+ # Restore by emitting it:
50
+ # on_file=lambda path: [{"path": path, "size": 42}]
51
+ ```
@@ -0,0 +1,3 @@
1
+ **Removed**
2
+
3
+ - **Removed the stat-fact injection layer.** dirsql no longer auto-fills DDL columns named `path`/`basename`/`dir`/`ext`/`size`/`mtime`/`ctime` from filesystem stat. A named table now contains exactly what its `on-file` hook emits; a DDL column the hook never emits is `NULL` (standard SQL), not injected. To keep a stat column populated, emit it from the hook (e.g. derive `path` from the file argument), or query the path directly with a path-table (`FROM './'`). (#634)
@@ -0,0 +1,55 @@
1
+ ### Stat-fact injection removed (#634)
2
+
3
+ #### Summary
4
+
5
+ dirsql previously injected filesystem-derived values into any DDL column named
6
+ `path`, `basename`, `dir`, `ext`, `size`, `mtime`, or `ctime` — filling them
7
+ even when the `on-file` hook emitted nothing for that column. That injection
8
+ layer is gone. A named table now contains **exactly what its hook emits**; a
9
+ declared column the hook never emits is `NULL` (standard SQL). No API signature
10
+ changes — this is a runtime behavior change.
11
+
12
+ #### Required changes
13
+
14
+ | Before (injected) | After (NULL unless emitted) | Fix |
15
+ | ----------------- | --------------------------- | --- |
16
+ | DDL declares `path TEXT`, hook emits neither `path` nor a value for it → column held the root-relative path | Column is `NULL` | Emit it from the hook. Config `on-file` shell hook (`$1` = abs path, `$2` = index root): `rel=${1#"$2"/}; jq -n --arg path "$rel" '[{path:$path}]'`. Rust SDK closure: `\|path\| vec![HashMap::from([("path".into(), Value::Text(path.to_string()))])]`. |
17
+ | DDL declares `size INTEGER`, hook emits neither → column held the file size | Column is `NULL` | Emit it from the hook: `jq -n --argjson size "$(stat -c%s "$1")" '[{size:$size}]'`, or in Rust read `std::fs::metadata(path)?.len()`. |
18
+ | Want stat columns with **no** hook code at all | (was injection) | Query the path directly with a path-table: `FROM './'`. |
19
+
20
+ #### Deprecations removed
21
+
22
+ _None._
23
+
24
+ #### Behavior changes without code changes
25
+
26
+ - A DDL column named `path`/`basename`/`dir`/`ext`/`size`/`mtime`/`ctime` that
27
+ the `on-file` hook does not emit is now `NULL` instead of an injected
28
+ filesystem value. Configs and SDK tables that relied on injection must emit
29
+ the column themselves (see the table above).
30
+ - A **strict** table whose DDL declares such a column but whose hook does not
31
+ emit it now fails schema validation (`missing columns for table …`) rather
32
+ than being silently filled.
33
+
34
+ #### Verification
35
+
36
+ Given `a.txt` in the index root and a non-strict table whose DDL is
37
+ `CREATE TABLE files (path TEXT, size INTEGER)` and whose hook emits only
38
+ `size`:
39
+
40
+ ```bash
41
+ # Config flags follow the subcommand: `dirsql query <sql> -c <cfg>`.
42
+
43
+ # Before this change (hook emits only size):
44
+ dirsql query "SELECT path, size FROM files" -c ./.dirsql.toml
45
+ # -> [{"path":"a.txt","size":42}] (path injected)
46
+
47
+ # After this change (same config):
48
+ dirsql query "SELECT path, size FROM files" -c ./.dirsql.toml
49
+ # -> [{"path":null,"size":42}] (path NULL — not emitted)
50
+
51
+ # Restore it by emitting path from the hook:
52
+ # on-file = 'rel=${1#"$2"/}; jq -n --arg path "$rel" '\''[{path:$path}]'\'''
53
+ dirsql query "SELECT path, size FROM files" -c ./.dirsql.toml
54
+ # -> [{"path":"a.txt", ...}] (path populated again)
55
+ ```
@@ -547,8 +547,6 @@ impl DirSQL {
547
547
  Err(e) => return vec![error_event(Some(table), rel_path, e.to_string())],
548
548
  };
549
549
 
550
- let stat = compute_stat_virtuals(rel_path, abs_path);
551
-
552
550
  let strict = *self.inner.strict_map.get(table).unwrap_or(&false);
553
551
 
554
552
  // Normalize, snapshot the file's previous rows, and apply the
@@ -559,11 +557,6 @@ impl DirSQL {
559
557
  Ok(g) => g,
560
558
  Err(e) => return vec![error_event(Some(table), rel_path, e.to_string())],
561
559
  };
562
- let declared_columns = match db.get_table_columns(table) {
563
- Ok(cols) => cols,
564
- Err(e) => return vec![error_event(Some(table), rel_path, e.to_string())],
565
- };
566
- let raw_rows = merge_filesystem_facts(raw_rows, &stat, &declared_columns);
567
560
  let mut new_rows = Vec::with_capacity(raw_rows.len());
568
561
  for raw in &raw_rows {
569
562
  match db.normalize_row(table, raw, strict) {
@@ -840,10 +833,6 @@ impl DirSQL {
840
833
  message: e.to_string(),
841
834
  })?;
842
835
 
843
- let stat_virtuals = compute_stat_virtuals(&rel_path, &abs_path);
844
- let declared_columns = db.get_table_columns(&table_name).map_err(map_db_error)?;
845
- let raw_rows = merge_filesystem_facts(raw_rows, &stat_virtuals, &declared_columns);
846
-
847
836
  // When updating an existing file in the persistent cache, drop
848
837
  // its old rows before inserting the new ones.
849
838
  if persist_ready.is_some() {
@@ -1475,21 +1464,14 @@ fn relative_path(root: &Path, path: &Path) -> String {
1475
1464
 
1476
1465
  /// Build [`Table`] objects from a parsed config.
1477
1466
  ///
1478
- /// A plain config-defined table produces one row per matched file built
1479
- /// entirely from filesystem facts: glob path captures and stat virtuals
1480
- /// (`path`, `basename`, `dir`, `ext`, `size`, `mtime`, `ctime`) are
1481
- /// injected by the core pipeline ([`merge_filesystem_facts`]). Its synthesized
1482
- /// on_file emits a single empty row per file; the fact-injection layer fills it
1483
- /// in.
1484
- ///
1485
- /// A table with an `on-file` command instead runs that command once per matched
1486
- /// file (see [`run_on_file`]): the command reads the file and prints a JSON
1487
- /// array of row objects on stdout, which becomes the file's rows (filesystem
1488
- /// facts are still merged on top, user values winning). `config_dir` is the
1489
- /// command's working directory (the config file's parent) and `root` is the
1490
- /// resolved index root exposed as the `{root}` placeholder. `timeout` bounds
1491
- /// each `on-file` run; the caller resolves it from the global
1492
- /// `[dirsql].hook-timeout` key, falling back to
1467
+ /// A config-defined table runs its `on-file` command once per matched file
1468
+ /// (see [`run_on_file`]): the command reads the file and prints a JSON array of
1469
+ /// row objects on stdout, which becomes the file's rows verbatim. The core
1470
+ /// injects nothing — a DDL column the hook does not emit is NULL, validated
1471
+ /// against the DDL as usual. `config_dir` is the command's working directory
1472
+ /// (the config file's parent) and `root` is the resolved index root exposed as
1473
+ /// the `{root}` placeholder. `timeout` bounds each `on-file` run; the caller
1474
+ /// resolves it from the global `[dirsql].hook-timeout` key, falling back to
1493
1475
  /// [`command::DEFAULT_COMMAND_TIMEOUT`].
1494
1476
  /// Whether this build declared no tables by any route — neither a config file
1495
1477
  /// nor a programmatic table. That is exactly the state in which `files` used to
@@ -1719,33 +1701,6 @@ fn find_capture_column_collision(glob: &str, declared_columns: &[String]) -> Opt
1719
1701
  .find(|name| declared.contains(name.as_str()))
1720
1702
  }
1721
1703
 
1722
- /// Merge filesystem-fact columns (stat virtuals) into each raw row produced by
1723
- /// an on_file closure. Auto-injected keys are filtered to those declared in
1724
- /// `declared_columns`, so a strict-mode table with a minimal DDL is not broken
1725
- /// by virtuals it didn't ask for. User-provided values in `raw_rows` win over
1726
- /// auto-injected values: an on_file that explicitly emits e.g. `path` is
1727
- /// honored.
1728
- fn merge_filesystem_facts(raw_rows: Vec<Row>, stat: &Row, declared_columns: &[String]) -> Vec<Row> {
1729
- let declared: std::collections::HashSet<&str> =
1730
- declared_columns.iter().map(String::as_str).collect();
1731
-
1732
- raw_rows
1733
- .into_iter()
1734
- .map(|raw| {
1735
- let mut merged = Row::new();
1736
- for (k, v) in stat {
1737
- if declared.contains(k.as_str()) {
1738
- merged.insert(k.clone(), v.clone());
1739
- }
1740
- }
1741
- for (k, v) in raw {
1742
- merged.insert(k, v);
1743
- }
1744
- merged
1745
- })
1746
- .collect()
1747
- }
1748
-
1749
1704
  /// Async wrapper around [`DirSQL`] whose constructor returns immediately while
1750
1705
  /// the initial scan runs on a background thread.
1751
1706
  ///
@@ -2157,7 +2112,7 @@ mod internal_tests {
2157
2112
  let db = DirSQL::with_ignore_and_fs(
2158
2113
  &root,
2159
2114
  vec![Table::new(
2160
- "CREATE TABLE items (name TEXT, path TEXT)",
2115
+ "CREATE TABLE items (name TEXT)",
2161
2116
  "**/*.txt",
2162
2117
  |_| {
2163
2118
  vec![Row::from_iter([(
@@ -2174,10 +2129,9 @@ mod internal_tests {
2174
2129
  let events = db.process_file_event(FileEvent::Created(abs));
2175
2130
  assert_eq!(events.len(), 1, "expected one insert: {events:?}");
2176
2131
  match &events[0] {
2177
- RowEvent::Insert { row, .. } => {
2132
+ RowEvent::Insert { file_path, .. } => {
2178
2133
  assert_eq!(
2179
- row.get("path"),
2180
- Some(&Value::Text("nested/a.txt".to_string())),
2134
+ file_path, "nested/a.txt",
2181
2135
  "watch_root prefix must be stripped to a root-relative path"
2182
2136
  );
2183
2137
  }
@@ -2195,7 +2149,7 @@ mod internal_tests {
2195
2149
  let mut db = DirSQL::with_ignore_and_fs(
2196
2150
  &root,
2197
2151
  vec![Table::new(
2198
- "CREATE TABLE items (name TEXT, path TEXT)",
2152
+ "CREATE TABLE items (name TEXT)",
2199
2153
  "**/*.txt",
2200
2154
  |_| {
2201
2155
  vec![Row::from_iter([(
@@ -2215,10 +2169,9 @@ mod internal_tests {
2215
2169
  let events = db.process_file_event(FileEvent::Created(abs));
2216
2170
  assert_eq!(events.len(), 1, "expected one insert: {events:?}");
2217
2171
  match &events[0] {
2218
- RowEvent::Insert { row, .. } => {
2172
+ RowEvent::Insert { file_path, .. } => {
2219
2173
  assert_eq!(
2220
- row.get("path"),
2221
- Some(&Value::Text("b.txt".to_string())),
2174
+ file_path, "b.txt",
2222
2175
  "root fallback must strip the user-supplied root prefix"
2223
2176
  );
2224
2177
  }
@@ -3089,37 +3042,6 @@ mod internal_tests {
3089
3042
  );
3090
3043
  }
3091
3044
 
3092
- #[test]
3093
- fn merge_filesystem_facts_filters_to_declared_columns() {
3094
- let mut stat = Row::new();
3095
- stat.insert("path".to_string(), Value::Text("2024-01/a.txt".into()));
3096
- stat.insert("size".to_string(), Value::Integer(9));
3097
- let raw = vec![Row::from_iter([(
3098
- "name".to_string(),
3099
- Value::Text("x".into()),
3100
- )])];
3101
- let declared = vec!["name".to_string(), "path".to_string()];
3102
- let merged = merge_filesystem_facts(raw, &stat, &declared);
3103
- assert_eq!(merged.len(), 1);
3104
- let row = &merged[0];
3105
- assert_eq!(row["path"], Value::Text("2024-01/a.txt".into()));
3106
- assert!(!row.contains_key("size"), "undeclared stat dropped");
3107
- assert_eq!(row["name"], Value::Text("x".into()));
3108
- }
3109
-
3110
- #[test]
3111
- fn merge_filesystem_facts_raw_value_wins_over_stat() {
3112
- let mut stat = Row::new();
3113
- stat.insert("path".to_string(), Value::Text("auto".into()));
3114
- let raw = vec![Row::from_iter([(
3115
- "path".to_string(),
3116
- Value::Text("explicit".into()),
3117
- )])];
3118
- let declared = vec!["path".to_string()];
3119
- let merged = merge_filesystem_facts(raw, &stat, &declared);
3120
- assert_eq!(merged[0]["path"], Value::Text("explicit".into()));
3121
- }
3122
-
3123
3045
  #[test]
3124
3046
  fn find_capture_column_collision_flags_a_placeholder_naming_a_column() {
3125
3047
  let declared = vec!["thread_id".to_string(), "basename".to_string()];
@@ -1,7 +0,0 @@
1
- {
2
- "command": "just test-e2e",
3
- "ran_at": 1784897533,
4
- "exit_code": 0,
5
- "commit": "6285e8c0753676dbe7333f42d3a66749a2e808b8",
6
- "branch": "feat/634-prep-python-selfemit"
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "command": "just test-e2e",
3
- "ran_at": 1784897776,
4
- "exit_code": 0,
5
- "commit": "93084d576d3080073dc2e0af6c20201de7def162",
6
- "branch": "feat/662-query-default-cli"
7
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes