dirsql 0.4.58__tar.gz → 0.4.59__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 (253) hide show
  1. {dirsql-0.4.58 → dirsql-0.4.59}/Cargo.lock +2 -2
  2. {dirsql-0.4.58 → dirsql-0.4.59}/PKG-INFO +1 -1
  3. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/Cargo.toml +1 -1
  4. dirsql-0.4.59/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +7 -0
  5. dirsql-0.4.59/packages/python/e2e-attestations/claude-1186-win-test-harness.json +7 -0
  6. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/Cargo.toml +1 -1
  7. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/db.rs +1 -1
  8. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/lib.rs +12 -23
  9. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/parsed_vtab.rs +10 -7
  10. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/scanner.rs +36 -0
  11. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/vtab.rs +14 -4
  12. {dirsql-0.4.58 → dirsql-0.4.59}/Cargo.toml +0 -0
  13. {dirsql-0.4.58 → dirsql-0.4.59}/README.md +0 -0
  14. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/__init__.py +0 -0
  15. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/_async.py +0 -0
  16. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/_dirsql.pyi +0 -0
  17. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/__init__.py +0 -0
  18. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/discover_plugins/__init__.py +0 -0
  19. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  20. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  21. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  22. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  23. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  24. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/main.py +0 -0
  25. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/cli/resolve_config_extensions.py +0 -0
  26. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/plan_entry_path.py +0 -0
  27. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/py.typed +0 -0
  28. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/read_config.py +0 -0
  29. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/resolve_configs_extension_specs.py +0 -0
  30. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/resolve_extension.py +0 -0
  31. {dirsql-0.4.58 → dirsql-0.4.59}/dirsql/resolve_package.py +0 -0
  32. {dirsql-0.4.58 → dirsql-0.4.59}/docs/.claude/CLAUDE.md +0 -0
  33. {dirsql-0.4.58 → dirsql-0.4.59}/docs/.vitepress/config.ts +0 -0
  34. {dirsql-0.4.58 → dirsql-0.4.59}/docs/.vitepress/theme/index.ts +0 -0
  35. {dirsql-0.4.58 → dirsql-0.4.59}/docs/.vitepress/theme/lang.ts +0 -0
  36. {dirsql-0.4.58 → dirsql-0.4.59}/docs/AGENTS.md +0 -0
  37. {dirsql-0.4.58 → dirsql-0.4.59}/docs/explanation.md +0 -0
  38. {dirsql-0.4.58 → dirsql-0.4.59}/docs/getting-started.md +0 -0
  39. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/columns-from-paths.md +0 -0
  40. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/define-tables.md +0 -0
  41. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/embed.md +0 -0
  42. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/extract-from-contents.md +0 -0
  43. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/load-extension.md +0 -0
  44. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/parse-files-into-columns.md +0 -0
  45. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/persist.md +0 -0
  46. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/query-json.md +0 -0
  47. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/query-without-config.md +0 -0
  48. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/react-to-changes.md +0 -0
  49. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/search-by-meaning.md +0 -0
  50. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/search-indexes.md +0 -0
  51. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/skip-files.md +0 -0
  52. {dirsql-0.4.58 → dirsql-0.4.59}/docs/howto/write-a-plugin.md +0 -0
  53. {dirsql-0.4.58 → dirsql-0.4.59}/docs/index.md +0 -0
  54. {dirsql-0.4.58 → dirsql-0.4.59}/docs/package.json +0 -0
  55. {dirsql-0.4.58 → dirsql-0.4.59}/docs/plugins.md +0 -0
  56. {dirsql-0.4.58 → dirsql-0.4.59}/docs/pnpm-lock.yaml +0 -0
  57. {dirsql-0.4.58 → dirsql-0.4.59}/docs/pnpm-workspace.yaml +0 -0
  58. {dirsql-0.4.58 → dirsql-0.4.59}/docs/reference/cli.md +0 -0
  59. {dirsql-0.4.58 → dirsql-0.4.59}/docs/reference/columns.md +0 -0
  60. {dirsql-0.4.58 → dirsql-0.4.59}/docs/reference/config.md +0 -0
  61. {dirsql-0.4.58 → dirsql-0.4.59}/docs/reference/hooks.md +0 -0
  62. {dirsql-0.4.58 → dirsql-0.4.59}/docs/reference/http-api.md +0 -0
  63. {dirsql-0.4.58 → dirsql-0.4.59}/docs/reference/path-tables.md +0 -0
  64. {dirsql-0.4.58 → dirsql-0.4.59}/docs/reference/sdk.md +0 -0
  65. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/CHANGELOG.md +0 -0
  66. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/MIGRATIONS.md +0 -0
  67. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/README.md +0 -0
  68. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  69. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  70. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  71. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  72. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  73. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  74. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  75. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  76. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  77. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  78. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  79. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  80. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  81. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  82. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  83. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  84. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  85. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  86. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  87. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  88. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  89. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  90. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  91. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  92. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  93. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  94. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  95. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  96. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  97. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  98. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/changelog.d/README.md +0 -0
  99. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/conftest.py +0 -0
  100. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/.claude/CLAUDE.md +0 -0
  101. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/.vitepress/config.ts +0 -0
  102. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  103. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  104. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/AGENTS.md +0 -0
  105. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/explanation.md +0 -0
  106. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/getting-started.md +0 -0
  107. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/columns-from-paths.md +0 -0
  108. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/define-tables.md +0 -0
  109. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/embed.md +0 -0
  110. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/extract-from-contents.md +0 -0
  111. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/load-extension.md +0 -0
  112. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  113. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/persist.md +0 -0
  114. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/query-json.md +0 -0
  115. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/query-without-config.md +0 -0
  116. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/react-to-changes.md +0 -0
  117. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/search-by-meaning.md +0 -0
  118. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/search-indexes.md +0 -0
  119. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/skip-files.md +0 -0
  120. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/howto/write-a-plugin.md +0 -0
  121. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/index.md +0 -0
  122. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/package.json +0 -0
  123. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/plugins.md +0 -0
  124. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/pnpm-lock.yaml +0 -0
  125. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/pnpm-workspace.yaml +0 -0
  126. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/reference/cli.md +0 -0
  127. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/reference/columns.md +0 -0
  128. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/reference/config.md +0 -0
  129. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/reference/hooks.md +0 -0
  130. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/reference/http-api.md +0 -0
  131. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/reference/path-tables.md +0 -0
  132. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/docs/reference/sdk.md +0 -0
  133. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  134. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  135. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  136. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  137. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  138. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  139. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  140. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  141. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  142. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  143. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  144. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  145. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  146. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  147. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  148. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  149. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  150. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  151. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  152. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  153. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  154. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  155. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  156. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  157. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  158. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  159. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  160. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  161. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  162. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  163. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  164. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  165. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  166. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  167. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  168. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  169. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  170. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  171. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  172. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  173. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  174. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  175. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  176. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  177. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  178. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  179. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  180. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  181. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  182. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/migrations.d/README.md +0 -0
  183. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/src/lib.rs +0 -0
  184. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/testing-conventions.toml +0 -0
  185. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/__init__.py +0 -0
  186. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/conftest.py +0 -0
  187. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/e2e/__init__.py +0 -0
  188. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  189. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  190. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/e2e/speed_of_light.py +0 -0
  191. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/integration/__init__.py +0 -0
  192. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/integration/binding/__init__.py +0 -0
  193. {dirsql-0.4.58 → dirsql-0.4.59}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  194. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/CHANGELOG.md +0 -0
  195. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/MIGRATIONS.md +0 -0
  196. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/README.md +0 -0
  197. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/benches/db_bench.rs +0 -0
  198. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/benches/differ_bench.rs +0 -0
  199. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/benches/matcher_bench.rs +0 -0
  200. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/benches/scanner_bench.rs +0 -0
  201. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/explanation.md +0 -0
  202. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/getting-started.md +0 -0
  203. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  204. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/define-tables.md +0 -0
  205. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/embed.md +0 -0
  206. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  207. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/load-extension.md +0 -0
  208. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  209. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/persist.md +0 -0
  210. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/query-json.md +0 -0
  211. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/query-without-config.md +0 -0
  212. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/react-to-changes.md +0 -0
  213. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  214. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/search-indexes.md +0 -0
  215. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/skip-files.md +0 -0
  216. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  217. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/index.md +0 -0
  218. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/plugins.md +0 -0
  219. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/reference/cli.md +0 -0
  220. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/reference/columns.md +0 -0
  221. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/reference/config.md +0 -0
  222. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/reference/hooks.md +0 -0
  223. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/reference/http-api.md +0 -0
  224. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/reference/path-tables.md +0 -0
  225. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/docs/reference/sdk.md +0 -0
  226. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/bin/dirsql.rs +0 -0
  227. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/execute.rs +0 -0
  228. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/init.rs +0 -0
  229. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/mod.rs +0 -0
  230. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/repl.rs +0 -0
  231. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/router.rs +0 -0
  232. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/run.rs +0 -0
  233. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/serialize.rs +0 -0
  234. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/server.rs +0 -0
  235. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/cli/table.rs +0 -0
  236. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/command.rs +0 -0
  237. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/config.rs +0 -0
  238. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/default_config.toml +0 -0
  239. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/differ.rs +0 -0
  240. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/extension_resolution.rs +0 -0
  241. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/functions.rs +0 -0
  242. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/infer.rs +0 -0
  243. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/launcher.rs +0 -0
  244. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/matcher.rs +0 -0
  245. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/parsed_cache.rs +0 -0
  246. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/path_table.rs +0 -0
  247. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/persist.rs +0 -0
  248. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/progress.rs +0 -0
  249. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/row_event_flat.rs +0 -0
  250. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/sql_literal.rs +0 -0
  251. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/vtab_scaffold.rs +0 -0
  252. {dirsql-0.4.58 → dirsql-0.4.59}/packages/rust/src/watcher.rs +0 -0
  253. {dirsql-0.4.58 → dirsql-0.4.59}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.58"
555
+ version = "0.4.59"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -601,7 +601,7 @@ dependencies = [
601
601
 
602
602
  [[package]]
603
603
  name = "dirsql-py-ext"
604
- version = "0.4.58"
604
+ version = "0.4.59"
605
605
  dependencies = [
606
606
  "dirsql",
607
607
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.58
3
+ Version: 0.4.59
4
4
  Requires-Dist: bin-shim>=0.1
5
5
  Summary: Ephemeral SQL index over a local directory
6
6
  Keywords: sql,filesystem,directory,sqlite,index
@@ -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.4.58"
7
+ version = "0.4.59"
8
8
  # abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
9
9
  # `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
10
10
  # (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1790605446,
4
+ "exit_code": 0,
5
+ "commit": "ab668f9f958ed79fe0598f6cc494f1d0cc049316",
6
+ "branch": "claude/1184-win-rel-paths"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1790603833,
4
+ "exit_code": 0,
5
+ "commit": "6b84d84d60179482a842b0db205ee257f8e03c11",
6
+ "branch": "claude/1186-win-test-harness"
7
+ }
@@ -6,7 +6,7 @@ description = "Ephemeral SQL index over a local directory"
6
6
  # version stays for the binding crates (publish = false). The literal
7
7
  # intentionally lags the published version: putitoutthere rewrites it to
8
8
  # the planned release version at build time and never commits it back.
9
- version = "0.4.58"
9
+ version = "0.4.59"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -655,7 +655,7 @@ impl Db {
655
655
  /// Every distinct `(table_name, file_path)` whose file sits beneath the
656
656
  /// directory `dir`, ordered by table then path.
657
657
  pub fn files_under(&self, dir: &str) -> Result<Vec<(String, String)>> {
658
- let prefix = format!("{dir}{}", std::path::MAIN_SEPARATOR);
658
+ let prefix = format!("{dir}/");
659
659
  let mut stmt = self.conn.prepare(
660
660
  "SELECT DISTINCT table_name, file_path FROM _dirsql_internal_rows \
661
661
  WHERE substr(file_path, 1, length(?1)) = ?1 \
@@ -571,7 +571,7 @@ impl DirSQL {
571
571
  // unspecified. An `on_file` failure produces an error event for that
572
572
  // table only; the other matching tables still process the event.
573
573
  let matches = self.inner.matcher.match_all(&rel_path_buf);
574
- let rel_path = rel_path_buf.to_string_lossy().to_string();
574
+ let rel_path = scanner::to_slash(&rel_path_buf);
575
575
 
576
576
  let mut events = Vec::new();
577
577
  for m in matches {
@@ -625,11 +625,7 @@ impl DirSQL {
625
625
  };
626
626
  let mut events = Vec::new();
627
627
  for (path, table) in self.inner.fs.scan_subtree(base, dir, &self.inner.matcher) {
628
- let rel_path = path
629
- .strip_prefix(base)
630
- .unwrap_or(&path)
631
- .to_string_lossy()
632
- .to_string();
628
+ let rel_path = scanner::to_slash(path.strip_prefix(base).unwrap_or(&path));
633
629
  events.extend(self.handle_upsert(&table, &path, &rel_path));
634
630
  }
635
631
  events
@@ -1836,10 +1832,7 @@ fn run_channel_loop(db: DirSQL, tx: UnboundedSender<RowEvent>) {
1836
1832
  }
1837
1833
 
1838
1834
  fn relative_path(root: &Path, path: &Path) -> String {
1839
- path.strip_prefix(root)
1840
- .unwrap_or(path)
1841
- .to_string_lossy()
1842
- .to_string()
1835
+ scanner::to_slash(path.strip_prefix(root).unwrap_or(path))
1843
1836
  }
1844
1837
 
1845
1838
  /// Build [`Table`] objects from a parsed config.
@@ -4346,15 +4339,13 @@ mod internal_tests {
4346
4339
  }
4347
4340
 
4348
4341
  /// `{abspath}` is not in the substitution table: it is left literal like any
4349
- /// unknown `{…}`, so `printf` receives the string `{abspath}` verbatim. The
4350
- /// template references `{path}` so that arg is the real path (and no path is
4351
- /// appended), isolating the `{abspath}` behavior in the `q` column.
4342
+ /// unknown `{…}`, so `printf` receives the string `{abspath}` verbatim.
4352
4343
  #[test]
4353
4344
  fn run_on_file_does_not_substitute_abspath() {
4354
4345
  let dir = TempDir::new().unwrap();
4355
4346
  let abs = dir.path().join("f.txt");
4356
4347
  let rows = run_on_file(
4357
- r#"printf '[{"p":"%s","q":"%s"}]' {path} {abspath}"#,
4348
+ r#"printf '[{"q":"%s"}]' {abspath}"#,
4358
4349
  &abs.to_string_lossy(),
4359
4350
  dir.path(),
4360
4351
  dir.path(),
@@ -4365,25 +4356,23 @@ mod internal_tests {
4365
4356
  }
4366
4357
 
4367
4358
  /// `{path}` interpolates the matched file's **absolute** path (not a
4368
- /// root-relative one). The command echoes its `{path}` argument back as a
4369
- /// row value, and we assert it is byte-for-byte the absolute path even when
4370
- /// the file sits directly under `root` (the case the old `strip_prefix`
4371
- /// would have shortened to a bare relative path).
4359
+ /// root-relative one), byte-for-byte, even when the file sits directly
4360
+ /// under `root`. The command writes its argument to a side file rather than
4361
+ /// into the JSON payload, where a Windows path's `\` would need escaping.
4372
4362
  #[test]
4373
4363
  fn run_on_file_passes_absolute_path_for_path_placeholder() {
4374
4364
  let dir = TempDir::new().unwrap();
4375
4365
  let abs = dir.path().join("f.txt");
4376
- let rows = run_on_file(
4377
- r#"sh -c "printf '[{\"p\":\"%s\"}]' \"$1\"" sh {path}"#,
4366
+ run_on_file(
4367
+ r#"sh -c 'printf %s "$1" > seen; echo "[]"' sh {path}"#,
4378
4368
  &abs.to_string_lossy(),
4379
4369
  dir.path(),
4380
4370
  dir.path(),
4381
4371
  )
4382
4372
  .expect("a well-formed payload parses");
4383
- assert_eq!(rows.len(), 1);
4384
4373
  assert_eq!(
4385
- rows[0]["p"],
4386
- Value::Text(abs.to_string_lossy().into_owned())
4374
+ std::fs::read_to_string(dir.path().join("seen")).unwrap(),
4375
+ abs.to_string_lossy()
4387
4376
  );
4388
4377
  }
4389
4378
 
@@ -36,7 +36,7 @@ use crate::matcher::TableMatcher;
36
36
  use crate::parsed_cache::{self, CachedParse, Entry, RowCache, SqliteRowCache};
37
37
  use crate::path_table;
38
38
  use crate::persist::{FileStat, hash_file, now_ns};
39
- use crate::scanner::scan_glob;
39
+ use crate::scanner::{scan_glob, to_slash};
40
40
  use crate::vtab_scaffold::{self, TableSource};
41
41
 
42
42
  /// SQL module name a parsed path-table is created with.
@@ -161,7 +161,7 @@ fn collect_rows_cached(
161
161
 
162
162
  let mut seen: Vec<(String, Parsed)> = Vec::with_capacity(rel_paths.len());
163
163
  for rel_path in rel_paths {
164
- let key = rel_path.to_string_lossy().into_owned();
164
+ let key = to_slash(rel_path);
165
165
  let Some(live) = fs.stat(rel_path) else {
166
166
  // The file vanished between the scan and the stat. Nothing to
167
167
  // parse and nothing to cache; the next run decides afresh.
@@ -268,7 +268,7 @@ impl ParsedFs for RootedFs<'_> {
268
268
  fn command_skip_message(rel_path: &Path, error: &str) -> String {
269
269
  format!(
270
270
  "dirsql: skipping `{}`: on-file command failed: {error}",
271
- rel_path.display()
271
+ to_slash(rel_path)
272
272
  )
273
273
  }
274
274
 
@@ -276,7 +276,7 @@ fn command_skip_message(rel_path: &Path, error: &str) -> String {
276
276
  fn parse_skip_message(rel_path: &Path, message: &str) -> String {
277
277
  format!(
278
278
  "dirsql: skipping `{}`: on-file output was not a JSON array of rows: {message}",
279
- rel_path.display()
279
+ to_slash(rel_path)
280
280
  )
281
281
  }
282
282
 
@@ -660,9 +660,12 @@ mod tests {
660
660
 
661
661
  #[test]
662
662
  fn run_parser_substitutes_the_absolute_path_and_the_root() {
663
- let payload =
664
- run_parser("echo {path} {root}", Path::new("/tmp"), Path::new("a.json")).unwrap();
665
- assert_eq!(payload, "/tmp/a.json /tmp");
663
+ let root = std::env::temp_dir();
664
+ let payload = run_parser("echo {path} {root}", &root, Path::new("a.json")).unwrap();
665
+ assert_eq!(
666
+ payload,
667
+ format!("{} {}", root.join("a.json").display(), root.display())
668
+ );
666
669
  }
667
670
 
668
671
  #[test]
@@ -10,6 +10,19 @@ use walkdir::WalkDir;
10
10
  /// whether persistence is enabled.
11
11
  pub const RESERVED_DIR: &str = ".dirsql";
12
12
 
13
+ /// A root-relative path as dirsql stores and reports it: `/`-separated on
14
+ /// every platform, so globs, `file_path` keys and `path` columns agree.
15
+ pub(crate) fn to_slash(path: &Path) -> String {
16
+ with_slashes(&path.to_string_lossy(), std::path::MAIN_SEPARATOR)
17
+ }
18
+
19
+ fn with_slashes(path: &str, native: char) -> String {
20
+ if native == '/' {
21
+ return path.to_owned();
22
+ }
23
+ path.replace(native, "/")
24
+ }
25
+
13
26
  /// Walk a directory tree and return all file paths paired with their matching table name.
14
27
  /// Ignored paths and directories are skipped. Only files (not directories) are returned.
15
28
  ///
@@ -354,6 +367,29 @@ mod tests {
354
367
  assert!(!is_glob_match(&set, Path::new("a.md")));
355
368
  }
356
369
 
370
+ #[test]
371
+ fn with_slashes_rewrites_a_backslash_native_separator() {
372
+ assert_eq!(
373
+ with_slashes(r"moved\one\mid.txt", '\\'),
374
+ "moved/one/mid.txt"
375
+ );
376
+ }
377
+
378
+ #[test]
379
+ fn with_slashes_keeps_a_mixed_path_slash_separated() {
380
+ assert_eq!(with_slashes(r"a/b\c.txt", '\\'), "a/b/c.txt");
381
+ }
382
+
383
+ #[test]
384
+ fn with_slashes_leaves_a_backslash_in_a_unix_file_name() {
385
+ assert_eq!(with_slashes(r"dir/a\b.txt", '/'), r"dir/a\b.txt");
386
+ }
387
+
388
+ #[test]
389
+ fn to_slash_keeps_a_native_unix_path() {
390
+ assert_eq!(to_slash(Path::new("docs/nested/a.md")), "docs/nested/a.md");
391
+ }
392
+
357
393
  #[test]
358
394
  fn compile_glob_rejects_an_invalid_pattern() {
359
395
  assert!(compile_glob("[").is_err());
@@ -9,7 +9,7 @@ use rusqlite::{Connection, Result};
9
9
  use crate::compute_stat_virtuals;
10
10
  use crate::matcher::TableMatcher;
11
11
  use crate::path_table;
12
- use crate::scanner::scan_glob;
12
+ use crate::scanner::{scan_glob, to_slash};
13
13
  use crate::vtab_scaffold::{self, TableSource};
14
14
  use crate::{Row, Value};
15
15
 
@@ -111,10 +111,15 @@ fn parse_module_args(args: &[&[u8]]) -> Result<ScanSpec> {
111
111
  /// The string a matched file is reported under: the relative path as scanned,
112
112
  /// under the table's path prefix when it has one.
113
113
  fn reported_path(path_prefix: &Path, rel_path: &Path) -> String {
114
- if path_prefix.as_os_str().is_empty() {
115
- return rel_path.to_string_lossy().into_owned();
114
+ let rel_path = to_slash(rel_path);
115
+ let prefix = path_prefix.to_string_lossy();
116
+ if prefix.is_empty() {
117
+ return rel_path;
116
118
  }
117
- path_prefix.join(rel_path).to_string_lossy().into_owned()
119
+ if prefix.ends_with(['/', std::path::MAIN_SEPARATOR]) {
120
+ return format!("{prefix}{rel_path}");
121
+ }
122
+ format!("{prefix}/{rel_path}")
118
123
  }
119
124
 
120
125
  /// Whether `column` addresses the hidden `content` column.
@@ -388,6 +393,11 @@ mod tests {
388
393
  );
389
394
  }
390
395
 
396
+ #[test]
397
+ fn reported_path_under_the_filesystem_root_has_one_separator() {
398
+ assert_eq!(reported_path(Path::new("/"), Path::new("a.log")), "/a.log");
399
+ }
400
+
391
401
  #[test]
392
402
  fn is_content_column_identifies_only_the_hidden_column() {
393
403
  assert!(is_content_column(CONTENT_COLUMN));
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
File without changes
File without changes
File without changes
File without changes