dirsql 0.4.0__tar.gz → 0.4.2__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 (209) hide show
  1. {dirsql-0.4.0 → dirsql-0.4.2}/Cargo.lock +1 -1
  2. {dirsql-0.4.0 → dirsql-0.4.2}/PKG-INFO +3 -2
  3. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/_dirsql.pyi +2 -2
  4. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/binary_path.py +4 -1
  5. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/resolve_config_extensions.py +21 -3
  6. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/Cargo.toml +5 -5
  7. dirsql-0.4.2/packages/python/changelog.d/2026-07-29-restore-python-310.md +3 -0
  8. dirsql-0.4.2/packages/python/e2e-attestations/claude-710-accumulate-onfile.json +7 -0
  9. dirsql-0.4.2/packages/python/migrations.d/2026-07-29-restore-python-310.md +50 -0
  10. dirsql-0.4.2/packages/rust/changelog.d/2026-07-29-on-file-failures-accumulate.md +8 -0
  11. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/lib.rs +60 -5
  12. {dirsql-0.4.0 → dirsql-0.4.2}/pyproject.toml +11 -2
  13. dirsql-0.4.0/packages/python/e2e-attestations/chore-681-ruff-016.json +0 -7
  14. {dirsql-0.4.0 → dirsql-0.4.2}/Cargo.toml +0 -0
  15. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/README.md +0 -0
  16. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/__init__.py +0 -0
  17. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/_async.py +0 -0
  18. {dirsql-0.4.0/packages/python/tests/integration/binding → dirsql-0.4.2/dirsql/cli}/__init__.py +0 -0
  19. {dirsql-0.4.0/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture → dirsql-0.4.2/dirsql/cli/discover_plugins}/__init__.py +0 -0
  20. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  21. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  22. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  23. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  24. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  25. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/is_windows.py +0 -0
  26. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/main.py +0 -0
  27. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/cli/resolve_config_extensions.py +0 -0
  28. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/py.typed +0 -0
  29. {dirsql-0.4.0 → dirsql-0.4.2}/dirsql/resolve_extension.py +0 -0
  30. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/.claude/CLAUDE.md +0 -0
  31. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/.vitepress/config.ts +0 -0
  32. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/.vitepress/theme/index.ts +0 -0
  33. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/.vitepress/theme/lang.ts +0 -0
  34. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/AGENTS.md +0 -0
  35. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/explanation.md +0 -0
  36. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/getting-started.md +0 -0
  37. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/columns-from-paths.md +0 -0
  38. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/define-tables.md +0 -0
  39. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/embed.md +0 -0
  40. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/extract-from-contents.md +0 -0
  41. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/load-extension.md +0 -0
  42. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/parse-files-into-columns.md +0 -0
  43. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/persist.md +0 -0
  44. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/query-without-config.md +0 -0
  45. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/react-to-changes.md +0 -0
  46. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/search-by-meaning.md +0 -0
  47. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/skip-files.md +0 -0
  48. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/howto/write-a-plugin.md +0 -0
  49. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/index.md +0 -0
  50. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/migrations.md +0 -0
  51. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/package.json +0 -0
  52. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/pnpm-lock.yaml +0 -0
  53. {dirsql-0.4.0/packages/python → dirsql-0.4.2}/docs/pnpm-workspace.yaml +0 -0
  54. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/reference/cli.md +0 -0
  55. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/reference/columns.md +0 -0
  56. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/reference/config.md +0 -0
  57. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/reference/hooks.md +0 -0
  58. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/reference/http-api.md +0 -0
  59. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/reference/path-tables.md +0 -0
  60. {dirsql-0.4.0/packages/rust → dirsql-0.4.2}/docs/reference/sdk.md +0 -0
  61. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/CHANGELOG.md +0 -0
  62. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/MIGRATIONS.md +0 -0
  63. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/README.md +0 -0
  64. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  65. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  66. {dirsql-0.4.0/packages/rust → dirsql-0.4.2/packages/python}/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  67. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  68. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  69. {dirsql-0.4.0/packages/rust → dirsql-0.4.2/packages/python}/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  70. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  71. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  72. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  73. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/changelog.d/README.md +0 -0
  74. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/conftest.py +0 -0
  75. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/.claude/CLAUDE.md +0 -0
  76. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/.vitepress/config.ts +0 -0
  77. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/.vitepress/theme/index.ts +0 -0
  78. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/.vitepress/theme/lang.ts +0 -0
  79. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/AGENTS.md +0 -0
  80. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/explanation.md +0 -0
  81. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/getting-started.md +0 -0
  82. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/columns-from-paths.md +0 -0
  83. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/define-tables.md +0 -0
  84. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/embed.md +0 -0
  85. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/extract-from-contents.md +0 -0
  86. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/load-extension.md +0 -0
  87. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  88. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/persist.md +0 -0
  89. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/query-without-config.md +0 -0
  90. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/react-to-changes.md +0 -0
  91. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/search-by-meaning.md +0 -0
  92. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/skip-files.md +0 -0
  93. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/howto/write-a-plugin.md +0 -0
  94. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/index.md +0 -0
  95. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/migrations.md +0 -0
  96. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/package.json +0 -0
  97. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/pnpm-lock.yaml +0 -0
  98. {dirsql-0.4.0 → dirsql-0.4.2/packages/python}/docs/pnpm-workspace.yaml +0 -0
  99. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/reference/cli.md +0 -0
  100. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/reference/columns.md +0 -0
  101. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/reference/config.md +0 -0
  102. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/reference/hooks.md +0 -0
  103. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/reference/http-api.md +0 -0
  104. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/reference/path-tables.md +0 -0
  105. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/docs/reference/sdk.md +0 -0
  106. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  107. {dirsql-0.4.0/packages/rust → dirsql-0.4.2/packages/python}/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  108. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  109. {dirsql-0.4.0/packages/rust → dirsql-0.4.2/packages/python}/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  110. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  111. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  112. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  113. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/migrations.d/README.md +0 -0
  114. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/src/lib.rs +0 -0
  115. {dirsql-0.4.0/packages/python/tests/integration/hermetic → dirsql-0.4.2/packages/python/tests}/__init__.py +0 -0
  116. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/tests/conftest.py +0 -0
  117. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/tests/e2e/__init__.py +0 -0
  118. {dirsql-0.4.0/dirsql/cli/discover_plugins → dirsql-0.4.2/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture}/__init__.py +0 -0
  119. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  120. {dirsql-0.4.0 → dirsql-0.4.2}/packages/python/tests/integration/__init__.py +0 -0
  121. {dirsql-0.4.0/dirsql/cli → dirsql-0.4.2/packages/python/tests/integration/binding}/__init__.py +0 -0
  122. {dirsql-0.4.0/packages/python/tests → dirsql-0.4.2/packages/python/tests/integration/hermetic}/__init__.py +0 -0
  123. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/CHANGELOG.md +0 -0
  124. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/Cargo.toml +0 -0
  125. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/MIGRATIONS.md +0 -0
  126. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/README.md +0 -0
  127. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/benches/db_bench.rs +0 -0
  128. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/benches/differ_bench.rs +0 -0
  129. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/benches/matcher_bench.rs +0 -0
  130. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/benches/scanner_bench.rs +0 -0
  131. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-batch-ingest-transaction.md +0 -0
  132. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-chained-pre-post-query-hooks.md +0 -0
  133. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  134. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  135. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-persist-wal.md +0 -0
  136. {dirsql-0.4.0/packages/python → dirsql-0.4.2/packages/rust}/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  137. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-repeatable-builder-config.md +0 -0
  138. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-repeatable-cli-config.md +0 -0
  139. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  140. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  141. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-19-path-table-query-fallback.md +0 -0
  142. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-19-path-table-vtab.md +0 -0
  143. {dirsql-0.4.0/packages/python → dirsql-0.4.2/packages/rust}/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  144. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-20-path-table-glob-semantics.md +0 -0
  145. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-20-schema-inference.md +0 -0
  146. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-21-on-file-flag.md +0 -0
  147. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  148. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-23-init-escalation-example.md +0 -0
  149. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-23-query-default-cli.md +0 -0
  150. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  151. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  152. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/changelog.d/README.md +0 -0
  153. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/explanation.md +0 -0
  154. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/getting-started.md +0 -0
  155. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/columns-from-paths.md +0 -0
  156. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/define-tables.md +0 -0
  157. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/embed.md +0 -0
  158. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/extract-from-contents.md +0 -0
  159. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/load-extension.md +0 -0
  160. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/parse-files-into-columns.md +0 -0
  161. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/persist.md +0 -0
  162. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/query-without-config.md +0 -0
  163. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/react-to-changes.md +0 -0
  164. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/search-by-meaning.md +0 -0
  165. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/skip-files.md +0 -0
  166. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/howto/write-a-plugin.md +0 -0
  167. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/index.md +0 -0
  168. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/migrations.md +0 -0
  169. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/reference/cli.md +0 -0
  170. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/reference/columns.md +0 -0
  171. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/reference/config.md +0 -0
  172. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/reference/hooks.md +0 -0
  173. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/reference/http-api.md +0 -0
  174. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/reference/path-tables.md +0 -0
  175. {dirsql-0.4.0 → dirsql-0.4.2/packages/rust}/docs/reference/sdk.md +0 -0
  176. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  177. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-13-fan-out-file-table-matching.md +0 -0
  178. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-13-persist-wal.md +0 -0
  179. {dirsql-0.4.0/packages/python → dirsql-0.4.2/packages/rust}/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  180. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  181. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-13-subcommand-local-config-flags.md +0 -0
  182. {dirsql-0.4.0/packages/python → dirsql-0.4.2/packages/rust}/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  183. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-20-path-table-glob-semantics.md +0 -0
  184. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  185. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-23-init-escalation-example.md +0 -0
  186. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-23-query-default-cli.md +0 -0
  187. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  188. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  189. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/migrations.d/README.md +0 -0
  190. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/bin/dirsql.rs +0 -0
  191. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/cli/execute.rs +0 -0
  192. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/cli/init.rs +0 -0
  193. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/cli/mod.rs +0 -0
  194. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/cli/router.rs +0 -0
  195. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/cli/serialize.rs +0 -0
  196. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/cli/server.rs +0 -0
  197. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/command.rs +0 -0
  198. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/config.rs +0 -0
  199. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/db.rs +0 -0
  200. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/default_config.toml +0 -0
  201. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/differ.rs +0 -0
  202. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/infer.rs +0 -0
  203. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/matcher.rs +0 -0
  204. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/parsed_vtab.rs +0 -0
  205. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/path_table.rs +0 -0
  206. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/persist.rs +0 -0
  207. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/scanner.rs +0 -0
  208. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/vtab.rs +0 -0
  209. {dirsql-0.4.0 → dirsql-0.4.2}/packages/rust/src/watcher.rs +0 -0
@@ -500,7 +500,7 @@ dependencies = [
500
500
 
501
501
  [[package]]
502
502
  name = "dirsql-py-ext"
503
- version = "0.4.0"
503
+ version = "0.4.2"
504
504
  dependencies = [
505
505
  "dirsql",
506
506
  "pyo3",
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
+ Requires-Dist: tomli>=2 ; python_full_version < '3.11'
4
5
  Summary: Ephemeral SQL index over a local directory
5
6
  Keywords: sql,filesystem,directory,sqlite,index
6
7
  Author: Kevin Scott
7
8
  License-Expression: MIT
8
- Requires-Python: >=3.11
9
+ Requires-Python: >=3.10
9
10
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
10
11
 
11
12
  # `dirsql` (Python SDK)
@@ -11,9 +11,9 @@ same PR -- and ``PARITY.md`` is the canonical reminder.
11
11
 
12
12
  from collections.abc import Callable
13
13
  from os import PathLike
14
- from typing import Any, NotRequired, TypedDict
14
+ from typing import Any, TypedDict
15
15
 
16
- from typing_extensions import override
16
+ from typing_extensions import NotRequired, override
17
17
 
18
18
  __version__: str
19
19
 
@@ -9,7 +9,10 @@ from dirsql.cli.is_windows import is_windows
9
9
 
10
10
  def binary_path() -> str:
11
11
  name = "dirsql.exe" if is_windows() else "dirsql"
12
- path = files("dirsql").joinpath("_binary", name)
12
+ # Chained rather than `joinpath("_binary", name)`: multi-segment joinpath
13
+ # is 3.11+, and `files()` returns a bare `Traversable` for non-filesystem
14
+ # loaders.
15
+ path = files("dirsql").joinpath("_binary").joinpath(name)
13
16
  if not path.is_file():
14
17
  raise FileNotFoundError(
15
18
  f"bundled `{name}` not found at {path}. The dirsql PyPI wheel "
@@ -14,11 +14,29 @@ Shared by the ``DirSQL`` constructor (``config=`` path) and the CLI launcher
14
14
  from __future__ import annotations
15
15
 
16
16
  import os
17
- import tomllib
17
+ import sys
18
+ from importlib import import_module
18
19
 
19
20
  from .resolve_extension import is_bare_name, resolve_extension_path
20
21
 
21
22
 
23
+ def _load_toml_module():
24
+ """Return the TOML parser module for the running interpreter.
25
+
26
+ ``tomllib`` is stdlib only on 3.11+; on 3.10 the ``tomli`` backport it was
27
+ derived from (a version-gated dependency) provides the same surface.
28
+ Imported by name so a unit test can exercise both arms on any
29
+ interpreter -- a literal ``import tomllib`` is unreachable on 3.10 no
30
+ matter what ``sys.version_info`` claims.
31
+ """
32
+ if sys.version_info >= (3, 11):
33
+ return import_module("tomllib")
34
+ return import_module("tomli")
35
+
36
+
37
+ _toml = _load_toml_module()
38
+
39
+
22
40
  def _load_extension_entries(config_path):
23
41
  """Return ``(entries, base_dir)`` for a config's ``[[dirsql.extension]]``.
24
42
 
@@ -29,8 +47,8 @@ def _load_extension_entries(config_path):
29
47
  return None
30
48
  try:
31
49
  with open(config_path, "rb") as f:
32
- doc = tomllib.load(f)
33
- except (OSError, tomllib.TOMLDecodeError):
50
+ doc = _toml.load(f)
51
+ except (OSError, _toml.TOMLDecodeError):
34
52
  # Leave a malformed / unreadable config for the core to report.
35
53
  return None
36
54
 
@@ -4,10 +4,10 @@ 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.4.0"
8
- # abi3 note: the `abi3-py311` pyo3 feature (below) builds ONE stable-ABI
9
- # `cp311-abi3` wheel per platform that loads on every CPython >= 3.11
10
- # (matching `pyproject.toml`'s `requires-python = ">=3.11"`), instead of
7
+ version = "0.4.2"
8
+ # abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
9
+ # `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
10
+ # (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
11
11
  # one wheel per interpreter. putitoutthere's `wheel-abi` detector (#401)
12
12
  # reads the abi3 feature straight off this direct `pyo3` dependency and
13
13
  # collapses the per-version build fan to a single wheel -- no
@@ -23,7 +23,7 @@ crate-type = ["cdylib", "rlib"]
23
23
 
24
24
  [dependencies]
25
25
  dirsql.workspace = true
26
- pyo3 = { version = "0.28", features = ["extension-module", "generate-import-lib", "abi3-py311"], optional = true }
26
+ pyo3 = { version = "0.28", features = ["extension-module", "generate-import-lib", "abi3-py310"], optional = true }
27
27
 
28
28
  [features]
29
29
  default = []
@@ -0,0 +1,3 @@
1
+ **Added**
2
+
3
+ - **Python 3.10 is supported again.** `requires-python` drops back to `>=3.10`, reversing the 0.3.6 raise to `>=3.11` — that raise was release tooling, not the API, and putitoutthere#401 cleared it by collapsing dirsql's abi3 wheel to a single row built on the newest interpreter. The pyo3 feature moves `abi3-py311` → `abi3-py310` in lock-step, so the wheel tag becomes `cp310-abi3` and still loads on every CPython from 3.10 up. `resolve_config_extensions` picks up the `tomli` backport (a new `python_version < "3.11"` dependency) since `tomllib` is stdlib only on 3.11+, and `binary_path` stops relying on 3.11's multi-segment `Traversable.joinpath`. The unit / integration / binding CI matrices gain a 3.10 leg so the declared floor is exercised rather than asserted. (#698)
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/ -x -q",
3
+ "ran_at": 1785444370,
4
+ "exit_code": 0,
5
+ "commit": "287fb980b2380a894543a652a0439f6ab8ea71cf",
6
+ "branch": "claude/710-accumulate-onfile"
7
+ }
@@ -0,0 +1,50 @@
1
+ ### Python 3.10 support restored (#698)
2
+
3
+ #### Summary
4
+
5
+ `requires-python` is lowered from `>=3.11` back to `>=3.10`, reversing the drop
6
+ made in 0.3.6 ("Python 3.10 support dropped"). No public API changes: this is a
7
+ packaging/installability change plus the wheel-tag change that follows it.
8
+
9
+ The 0.3.6 drop was forced by release tooling, not by the codebase — putitoutthere's
10
+ multi-version wheel fan ran an `import tomllib` verify step on every row, so the
11
+ 3.10 row crashed the release build. Since putitoutthere#401 a wheel detected as
12
+ Python-version-independent (dirsql's pyo3 `abi3-pyXY` feature, read off
13
+ `packages/python/Cargo.toml`) collapses to a single wheel row built on the
14
+ **newest** resolved interpreter, so that verify step never runs on 3.10 again.
15
+
16
+ #### Required changes
17
+
18
+ _None._ Every 3.11+ install keeps resolving and installing exactly as before.
19
+
20
+ | Before | After | Action |
21
+ | ------ | ----- | ------ |
22
+ | `pip install dirsql` on 3.10 → `Requires-Python >=3.11`, no candidate | resolves and installs | None — upgrading Python is no longer required. |
23
+ | Wheel filename `…-cp311-abi3-<platform>.whl` | `…-cp310-abi3-<platform>.whl` | Only if you **pin or hash exact wheel filenames** (lockfile with hashes, vendored artifact mirror, CI cache key): re-resolve so the new `cp310-abi3` name is recorded. |
24
+
25
+ #### Deprecations removed
26
+
27
+ _None._
28
+
29
+ #### Behavior changes without code changes
30
+
31
+ - Installs now succeed on CPython 3.10; the package previously refused to
32
+ resolve there.
33
+ - The published wheel is tagged `cp310-abi3` instead of `cp311-abi3`. It is
34
+ still one stable-ABI wheel per platform, loadable on every CPython from the
35
+ tagged version up — 3.11 through 3.14 keep installing the same artifact shape.
36
+ - On 3.10 only, `dirsql` pulls in one new runtime dependency, `tomli>=2` (the
37
+ backport `tomllib` was derived from). It is not installed on 3.11+.
38
+
39
+ #### Verification
40
+
41
+ ```console
42
+ $ python3.10 -m pip install dirsql
43
+ $ python3.10 -c "import dirsql; print(dirsql.__version__)"
44
+ ```
45
+
46
+ ```python
47
+ # On 3.10 the config parser transparently uses the backport:
48
+ import dirsql.resolve_config_extensions as rce
49
+ print(rce._toml.__name__) # -> 'tomli' on 3.10, 'tomllib' on 3.11+
50
+ ```
@@ -0,0 +1,8 @@
1
+ **Changed** — a scan now attempts every matched file instead of stopping at the
2
+ first whose `on-file` hook fails, and reports every failure rather than only the
3
+ first. A single failure still raises `DirSqlError::OnFile` unchanged; several
4
+ now raise a new `DirSqlError::OnFileMany` carrying one `OnFileFailure { path,
5
+ message }` per file.
6
+
7
+ A scan with failures still fails and still leaves the cache exactly as it was —
8
+ only the reporting improved. Committing a partial index is tracked in #697.
@@ -78,6 +78,16 @@ pub const DEFAULT_CONFIG_TOML: &str = include_str!("default_config.toml");
78
78
  type BoxError = Box<dyn StdError + Send + Sync + 'static>;
79
79
  type OnFileFn = dyn Fn(&str) -> std::result::Result<Vec<Row>, BoxError> + Send + Sync + 'static;
80
80
 
81
+ /// One file whose on-file hook failed, carried so a scan can report every
82
+ /// failure rather than only whichever came first.
83
+ #[derive(Debug, Clone, PartialEq, Eq)]
84
+ pub struct OnFileFailure {
85
+ /// Path relative to the scan root.
86
+ pub path: String,
87
+ /// The hook's error, as rendered by its `Display`.
88
+ pub message: String,
89
+ }
90
+
81
91
  #[derive(Debug, Error)]
82
92
  pub enum DirSqlError {
83
93
  #[error(transparent)]
@@ -122,6 +132,20 @@ pub enum DirSqlError {
122
132
  #[error("on-file error for {path}: {message}")]
123
133
  OnFile { path: String, message: String },
124
134
 
135
+ /// Several files' on-file hooks failed during one scan. A scan attempts
136
+ /// every matched file, so more than one can fail; reporting only the first
137
+ /// would make the rest invisible until it was fixed and the scan re-run.
138
+ #[error(
139
+ "{} files failed their on-file hook:\n{}",
140
+ .failures.len(),
141
+ .failures
142
+ .iter()
143
+ .map(|OnFileFailure { path, message }| format!(" {path}: {message}"))
144
+ .collect::<Vec<_>>()
145
+ .join("\n")
146
+ )]
147
+ OnFileMany { failures: Vec<OnFileFailure> },
148
+
125
149
  #[error("config error: {message}")]
126
150
  Config {
127
151
  message: String,
@@ -816,6 +840,7 @@ impl DirSQL {
816
840
  }
817
841
 
818
842
  let snapshot_ns = now_ns();
843
+ let mut on_file_failures: Vec<OnFileFailure> = Vec::new();
819
844
  for ScannedFile {
820
845
  rel_path,
821
846
  table_name,
@@ -827,11 +852,20 @@ impl DirSQL {
827
852
  })?;
828
853
  let strict = *strict_map.get(&table_name).unwrap_or(&false);
829
854
  let abs_path = root.join(&rel_path);
830
- let raw_rows =
831
- on_file(&abs_path.to_string_lossy()).map_err(|e| DirSqlError::OnFile {
832
- path: rel_path.clone(),
833
- message: e.to_string(),
834
- })?;
855
+ // A hook failure is this file's problem, not the scan's: record it
856
+ // and keep going, so one unreadable file cannot hide the state of
857
+ // every file after it. The collected failures still fail the build
858
+ // below -- whether a partial index commits is dirsql#697.
859
+ let raw_rows = match on_file(&abs_path.to_string_lossy()) {
860
+ Ok(rows) => rows,
861
+ Err(e) => {
862
+ on_file_failures.push(OnFileFailure {
863
+ path: rel_path.clone(),
864
+ message: e.to_string(),
865
+ });
866
+ continue;
867
+ }
868
+ };
835
869
 
836
870
  // When updating an existing file in the persistent cache, drop
837
871
  // its old rows before inserting the new ones.
@@ -870,6 +904,27 @@ impl DirSQL {
870
904
  write_meta(db.conn(), meta).map_err(DirSqlError::sqlite)?;
871
905
  }
872
906
 
907
+ // Returning before the commit drops `_tx`, so a scan with failures
908
+ // still leaves the cache exactly as it was -- the pre-existing
909
+ // behavior. The single-failure case keeps its original error verbatim;
910
+ // only the multi-failure case reports more than it used to. Whether a
911
+ // partial index should commit instead is dirsql#697.
912
+ match on_file_failures.len() {
913
+ 0 => {}
914
+ 1 => {
915
+ let only = on_file_failures.remove(0);
916
+ return Err(DirSqlError::OnFile {
917
+ path: only.path,
918
+ message: only.message,
919
+ });
920
+ }
921
+ _ => {
922
+ return Err(DirSqlError::OnFileMany {
923
+ failures: on_file_failures,
924
+ });
925
+ }
926
+ }
927
+
873
928
  // Commit the ingest transaction.
874
929
  _tx.commit().map_err(DirSqlError::sqlite)?;
875
930
 
@@ -11,13 +11,19 @@ name = "dirsql"
11
11
  dynamic = ["version"]
12
12
  description = "Ephemeral SQL index over a local directory"
13
13
  license = "MIT"
14
- requires-python = ">=3.11"
14
+ requires-python = ">=3.10"
15
15
  authors = [
16
16
  { name = "Kevin Scott" },
17
17
  ]
18
18
  repository = "https://github.com/thekevinscott/dirsql"
19
19
  keywords = ["sql", "filesystem", "directory", "sqlite", "index"]
20
20
  readme = "README.md"
21
+ dependencies = [
22
+ # `tomllib` is stdlib only on 3.11+; `resolve_config_extensions` falls back
23
+ # to the backport it was derived from. Drop this the day the floor reaches
24
+ # 3.11 again.
25
+ 'tomli>=2; python_version < "3.11"',
26
+ ]
21
27
 
22
28
  # Dev/test dependencies live in a PEP 735 dependency-group (not a
23
29
  # `[project.optional-dependencies]` extra) so a plain `uv sync` installs them
@@ -90,7 +96,10 @@ exclude = [
90
96
  ]
91
97
 
92
98
  [tool.ty.environment]
93
- python-version = "3.11"
99
+ # Tracks `requires-python`: type-check against the FLOOR so a 3.11-only symbol
100
+ # (`tomllib`, `StrEnum`, `typing.Self`) fails here rather than at a user's
101
+ # import on the oldest supported interpreter.
102
+ python-version = "3.10"
94
103
 
95
104
  # ruff 0.16.0 formats Python code blocks in Markdown by default. Keep ruff
96
105
  # scoped to Python source (its effective scope under the prior pin): the README
@@ -1,7 +0,0 @@
1
- {
2
- "command": "just test-e2e",
3
- "ran_at": 1785113998,
4
- "exit_code": 0,
5
- "commit": "d26765dc31e8a9e47df429bb81c0aedb05dc6a21",
6
- "branch": "chore/681-ruff-016"
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