dirsql 0.4.57__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.57 → dirsql-0.4.59}/Cargo.lock +9 -2
  2. {dirsql-0.4.57 → dirsql-0.4.59}/PKG-INFO +1 -1
  3. {dirsql-0.4.57/packages/python → dirsql-0.4.59}/docs/reference/path-tables.md +6 -0
  4. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/Cargo.toml +1 -1
  5. {dirsql-0.4.57 → dirsql-0.4.59/packages/python}/docs/reference/path-tables.md +6 -0
  6. dirsql-0.4.59/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +7 -0
  7. dirsql-0.4.59/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +7 -0
  8. dirsql-0.4.59/packages/python/e2e-attestations/claude-1186-win-test-harness.json +7 -0
  9. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/Cargo.toml +2 -1
  10. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/reference/path-tables.md +6 -0
  11. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/db.rs +1 -1
  12. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/lib.rs +12 -23
  13. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/parsed_vtab.rs +10 -7
  14. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/path_table.rs +316 -35
  15. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/scanner.rs +36 -0
  16. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/vtab.rs +14 -4
  17. {dirsql-0.4.57 → dirsql-0.4.59}/Cargo.toml +0 -0
  18. {dirsql-0.4.57 → dirsql-0.4.59}/README.md +0 -0
  19. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/__init__.py +0 -0
  20. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/_async.py +0 -0
  21. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/_dirsql.pyi +0 -0
  22. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/__init__.py +0 -0
  23. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/discover_plugins/__init__.py +0 -0
  24. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  25. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  26. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  27. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  28. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  29. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/main.py +0 -0
  30. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/cli/resolve_config_extensions.py +0 -0
  31. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/plan_entry_path.py +0 -0
  32. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/py.typed +0 -0
  33. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/read_config.py +0 -0
  34. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/resolve_configs_extension_specs.py +0 -0
  35. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/resolve_extension.py +0 -0
  36. {dirsql-0.4.57 → dirsql-0.4.59}/dirsql/resolve_package.py +0 -0
  37. {dirsql-0.4.57 → dirsql-0.4.59}/docs/.claude/CLAUDE.md +0 -0
  38. {dirsql-0.4.57 → dirsql-0.4.59}/docs/.vitepress/config.ts +0 -0
  39. {dirsql-0.4.57 → dirsql-0.4.59}/docs/.vitepress/theme/index.ts +0 -0
  40. {dirsql-0.4.57 → dirsql-0.4.59}/docs/.vitepress/theme/lang.ts +0 -0
  41. {dirsql-0.4.57 → dirsql-0.4.59}/docs/AGENTS.md +0 -0
  42. {dirsql-0.4.57 → dirsql-0.4.59}/docs/explanation.md +0 -0
  43. {dirsql-0.4.57 → dirsql-0.4.59}/docs/getting-started.md +0 -0
  44. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/columns-from-paths.md +0 -0
  45. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/define-tables.md +0 -0
  46. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/embed.md +0 -0
  47. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/extract-from-contents.md +0 -0
  48. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/load-extension.md +0 -0
  49. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/parse-files-into-columns.md +0 -0
  50. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/persist.md +0 -0
  51. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/query-json.md +0 -0
  52. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/query-without-config.md +0 -0
  53. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/react-to-changes.md +0 -0
  54. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/search-by-meaning.md +0 -0
  55. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/search-indexes.md +0 -0
  56. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/skip-files.md +0 -0
  57. {dirsql-0.4.57 → dirsql-0.4.59}/docs/howto/write-a-plugin.md +0 -0
  58. {dirsql-0.4.57 → dirsql-0.4.59}/docs/index.md +0 -0
  59. {dirsql-0.4.57 → dirsql-0.4.59}/docs/package.json +0 -0
  60. {dirsql-0.4.57 → dirsql-0.4.59}/docs/plugins.md +0 -0
  61. {dirsql-0.4.57 → dirsql-0.4.59}/docs/pnpm-lock.yaml +0 -0
  62. {dirsql-0.4.57 → dirsql-0.4.59}/docs/pnpm-workspace.yaml +0 -0
  63. {dirsql-0.4.57 → dirsql-0.4.59}/docs/reference/cli.md +0 -0
  64. {dirsql-0.4.57 → dirsql-0.4.59}/docs/reference/columns.md +0 -0
  65. {dirsql-0.4.57 → dirsql-0.4.59}/docs/reference/config.md +0 -0
  66. {dirsql-0.4.57 → dirsql-0.4.59}/docs/reference/hooks.md +0 -0
  67. {dirsql-0.4.57 → dirsql-0.4.59}/docs/reference/http-api.md +0 -0
  68. {dirsql-0.4.57 → dirsql-0.4.59}/docs/reference/sdk.md +0 -0
  69. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/CHANGELOG.md +0 -0
  70. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/MIGRATIONS.md +0 -0
  71. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/README.md +0 -0
  72. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  73. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  74. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  75. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  76. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  77. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  78. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  79. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  80. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  81. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  82. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  83. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  84. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  85. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  86. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  87. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  88. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  89. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  90. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  91. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  92. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  93. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  94. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  95. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  96. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  97. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  98. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  99. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  100. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  101. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  102. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/changelog.d/README.md +0 -0
  103. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/conftest.py +0 -0
  104. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/.claude/CLAUDE.md +0 -0
  105. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/.vitepress/config.ts +0 -0
  106. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  107. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  108. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/AGENTS.md +0 -0
  109. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/explanation.md +0 -0
  110. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/getting-started.md +0 -0
  111. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/columns-from-paths.md +0 -0
  112. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/define-tables.md +0 -0
  113. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/embed.md +0 -0
  114. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/extract-from-contents.md +0 -0
  115. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/load-extension.md +0 -0
  116. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  117. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/persist.md +0 -0
  118. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/query-json.md +0 -0
  119. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/query-without-config.md +0 -0
  120. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/react-to-changes.md +0 -0
  121. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/search-by-meaning.md +0 -0
  122. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/search-indexes.md +0 -0
  123. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/skip-files.md +0 -0
  124. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/howto/write-a-plugin.md +0 -0
  125. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/index.md +0 -0
  126. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/package.json +0 -0
  127. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/plugins.md +0 -0
  128. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/pnpm-lock.yaml +0 -0
  129. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/pnpm-workspace.yaml +0 -0
  130. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/reference/cli.md +0 -0
  131. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/reference/columns.md +0 -0
  132. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/reference/config.md +0 -0
  133. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/reference/hooks.md +0 -0
  134. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/reference/http-api.md +0 -0
  135. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/docs/reference/sdk.md +0 -0
  136. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  137. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  138. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  139. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  140. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  141. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  142. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  143. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  144. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  145. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  146. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  147. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  148. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  149. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  150. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  151. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  152. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  153. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  154. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  155. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  156. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  157. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  158. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  159. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  160. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  161. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  162. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  163. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  164. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  165. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  166. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  167. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  168. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  169. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  170. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  171. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  172. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  173. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  174. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  175. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  176. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  177. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  178. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  179. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  180. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  181. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  182. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  183. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  184. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/migrations.d/README.md +0 -0
  185. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/src/lib.rs +0 -0
  186. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/testing-conventions.toml +0 -0
  187. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/__init__.py +0 -0
  188. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/conftest.py +0 -0
  189. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/e2e/__init__.py +0 -0
  190. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  191. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  192. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/e2e/speed_of_light.py +0 -0
  193. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/integration/__init__.py +0 -0
  194. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/integration/binding/__init__.py +0 -0
  195. {dirsql-0.4.57 → dirsql-0.4.59}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  196. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/CHANGELOG.md +0 -0
  197. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/MIGRATIONS.md +0 -0
  198. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/README.md +0 -0
  199. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/benches/db_bench.rs +0 -0
  200. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/benches/differ_bench.rs +0 -0
  201. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/benches/matcher_bench.rs +0 -0
  202. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/benches/scanner_bench.rs +0 -0
  203. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/explanation.md +0 -0
  204. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/getting-started.md +0 -0
  205. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  206. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/define-tables.md +0 -0
  207. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/embed.md +0 -0
  208. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  209. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/load-extension.md +0 -0
  210. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  211. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/persist.md +0 -0
  212. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/query-json.md +0 -0
  213. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/query-without-config.md +0 -0
  214. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/react-to-changes.md +0 -0
  215. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  216. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/search-indexes.md +0 -0
  217. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/skip-files.md +0 -0
  218. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  219. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/index.md +0 -0
  220. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/plugins.md +0 -0
  221. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/reference/cli.md +0 -0
  222. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/reference/columns.md +0 -0
  223. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/reference/config.md +0 -0
  224. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/reference/hooks.md +0 -0
  225. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/reference/http-api.md +0 -0
  226. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/docs/reference/sdk.md +0 -0
  227. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/bin/dirsql.rs +0 -0
  228. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/execute.rs +0 -0
  229. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/init.rs +0 -0
  230. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/mod.rs +0 -0
  231. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/repl.rs +0 -0
  232. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/router.rs +0 -0
  233. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/run.rs +0 -0
  234. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/serialize.rs +0 -0
  235. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/server.rs +0 -0
  236. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/cli/table.rs +0 -0
  237. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/command.rs +0 -0
  238. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/config.rs +0 -0
  239. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/default_config.toml +0 -0
  240. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/differ.rs +0 -0
  241. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/extension_resolution.rs +0 -0
  242. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/functions.rs +0 -0
  243. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/infer.rs +0 -0
  244. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/launcher.rs +0 -0
  245. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/matcher.rs +0 -0
  246. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/parsed_cache.rs +0 -0
  247. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/persist.rs +0 -0
  248. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/progress.rs +0 -0
  249. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/row_event_flat.rs +0 -0
  250. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/sql_literal.rs +0 -0
  251. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/vtab_scaffold.rs +0 -0
  252. {dirsql-0.4.57 → dirsql-0.4.59}/packages/rust/src/watcher.rs +0 -0
  253. {dirsql-0.4.57 → 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.57"
555
+ version = "0.4.59"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -584,6 +584,7 @@ dependencies = [
584
584
  "tokio",
585
585
  "tokio-stream",
586
586
  "toml",
587
+ "typed-path",
587
588
  "walkdir",
588
589
  ]
589
590
 
@@ -600,7 +601,7 @@ dependencies = [
600
601
 
601
602
  [[package]]
602
603
  name = "dirsql-py-ext"
603
- version = "0.4.57"
604
+ version = "0.4.59"
604
605
  dependencies = [
605
606
  "dirsql",
606
607
  "pyo3",
@@ -2915,6 +2916,12 @@ version = "0.2.5"
2915
2916
  source = "registry+https://github.com/rust-lang/crates.io-index"
2916
2917
  checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
2917
2918
 
2919
+ [[package]]
2920
+ name = "typed-path"
2921
+ version = "0.12.3"
2922
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2923
+ checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e"
2924
+
2918
2925
  [[package]]
2919
2926
  name = "unicase"
2920
2927
  version = "2.9.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.57
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
@@ -96,6 +96,12 @@ SELECT path FROM '/var/log/*.log';
96
96
  -- /var/log/syslog
97
97
  ```
98
98
 
99
+ On Windows, the absolute forms also include a drive letter
100
+ (`'C:\logs\*.log'` or `'C:/logs/*.log'`), a UNC share
101
+ (`'\\server\share\*.md'`) and `'~\notes'`. `\` and `/` both separate there,
102
+ and the `path` these report uses `/` throughout (`C:/logs/app.log`), matching
103
+ the `/`-separated relative paths.
104
+
99
105
  On a system with no home directory, a `~/` path-table reports that it cannot
100
106
  resolve rather than guessing.
101
107
 
@@ -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.57"
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
@@ -96,6 +96,12 @@ SELECT path FROM '/var/log/*.log';
96
96
  -- /var/log/syslog
97
97
  ```
98
98
 
99
+ On Windows, the absolute forms also include a drive letter
100
+ (`'C:\logs\*.log'` or `'C:/logs/*.log'`), a UNC share
101
+ (`'\\server\share\*.md'`) and `'~\notes'`. `\` and `/` both separate there,
102
+ and the `path` these report uses `/` throughout (`C:/logs/app.log`), matching
103
+ the `/`-separated relative paths.
104
+
99
105
  On a system with no home directory, a `~/` path-table reports that it cannot
100
106
  resolve rather than guessing.
101
107
 
@@ -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": 1790604714,
4
+ "exit_code": 0,
5
+ "commit": "f719e49b96e8610e5692f76ebfb564ae3188d04e",
6
+ "branch": "claude/1185-win-abs-table-names"
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.57"
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
@@ -86,6 +86,7 @@ thiserror.workspace = true
86
86
  tokio.workspace = true
87
87
  tokio-stream = { version = "0.1", features = ["sync"], optional = true }
88
88
  toml = "0.8"
89
+ typed-path = "0.12"
89
90
  walkdir = "2"
90
91
 
91
92
  [lints.rust]
@@ -96,6 +96,12 @@ SELECT path FROM '/var/log/*.log';
96
96
  -- /var/log/syslog
97
97
  ```
98
98
 
99
+ On Windows, the absolute forms also include a drive letter
100
+ (`'C:\logs\*.log'` or `'C:/logs/*.log'`), a UNC share
101
+ (`'\\server\share\*.md'`) and `'~\notes'`. `\` and `/` both separate there,
102
+ and the `path` these report uses `/` throughout (`C:/logs/app.log`), matching
103
+ the `/`-separated relative paths.
104
+
99
105
  On a system with no home directory, a `~/` path-table reports that it cannot
100
106
  resolve rather than guessing.
101
107
 
@@ -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]