dirsql 0.4.86__tar.gz → 0.4.88__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 (362) hide show
  1. {dirsql-0.4.86 → dirsql-0.4.88}/Cargo.lock +2 -2
  2. {dirsql-0.4.86 → dirsql-0.4.88}/PKG-INFO +1 -1
  3. {dirsql-0.4.86/packages/rust → dirsql-0.4.88}/docs/reference/path-tables.md +3 -1
  4. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/Cargo.toml +1 -1
  5. dirsql-0.4.88/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +1 -0
  6. dirsql-0.4.88/packages/python/changelog.d/2026-10-06-config-gitignore.md +3 -0
  7. {dirsql-0.4.86 → dirsql-0.4.88/packages/python}/docs/reference/path-tables.md +3 -1
  8. dirsql-0.4.88/packages/python/e2e-attestations/claude-1258-config-gitignore.json +7 -0
  9. dirsql-0.4.88/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +7 -0
  10. dirsql-0.4.88/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +29 -0
  11. dirsql-0.4.88/packages/python/migrations.d/2026-10-06-config-gitignore.md +45 -0
  12. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/Cargo.toml +1 -1
  13. {dirsql-0.4.86/packages/python → dirsql-0.4.88/packages/rust}/docs/reference/path-tables.md +3 -1
  14. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/brace.rs +14 -8
  15. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/lib.rs +32 -0
  16. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/matcher.rs +20 -1
  17. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/parsed_vtab.rs +1 -1
  18. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/scanner.rs +42 -4
  19. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/vtab.rs +1 -1
  20. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/vtab_scaffold.rs +1 -1
  21. {dirsql-0.4.86 → dirsql-0.4.88}/Cargo.toml +0 -0
  22. {dirsql-0.4.86 → dirsql-0.4.88}/README.md +0 -0
  23. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/__init__.py +0 -0
  24. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/_async.py +0 -0
  25. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/_dirsql.pyi +0 -0
  26. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/__init__.py +0 -0
  27. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/discover_plugins/__init__.py +0 -0
  28. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  29. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  30. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  31. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  32. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/main.py +0 -0
  33. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/cli/resolve_config_extensions.py +0 -0
  34. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/plan_entry_path.py +0 -0
  35. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/py.typed +0 -0
  36. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/read_config.py +0 -0
  37. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/resolve_configs_extension_specs.py +0 -0
  38. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/resolve_extension.py +0 -0
  39. {dirsql-0.4.86 → dirsql-0.4.88}/dirsql/resolve_package.py +0 -0
  40. {dirsql-0.4.86 → dirsql-0.4.88}/docs/.claude/CLAUDE.md +0 -0
  41. {dirsql-0.4.86 → dirsql-0.4.88}/docs/.vitepress/config.ts +0 -0
  42. {dirsql-0.4.86 → dirsql-0.4.88}/docs/.vitepress/theme/index.ts +0 -0
  43. {dirsql-0.4.86 → dirsql-0.4.88}/docs/.vitepress/theme/lang.ts +0 -0
  44. {dirsql-0.4.86 → dirsql-0.4.88}/docs/AGENTS.md +0 -0
  45. {dirsql-0.4.86 → dirsql-0.4.88}/docs/context/.gitattributes +0 -0
  46. {dirsql-0.4.86 → dirsql-0.4.88}/docs/context/recipes.md +0 -0
  47. {dirsql-0.4.86 → dirsql-0.4.88}/docs/context/troubleshooting.md +0 -0
  48. {dirsql-0.4.86 → dirsql-0.4.88}/docs/context/usage.md +0 -0
  49. {dirsql-0.4.86 → dirsql-0.4.88}/docs/explanation.md +0 -0
  50. {dirsql-0.4.86 → dirsql-0.4.88}/docs/getting-started.md +0 -0
  51. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/agent-skill.md +0 -0
  52. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/columns-from-paths.md +0 -0
  53. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/define-tables.md +0 -0
  54. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/embed.md +0 -0
  55. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/extract-from-contents.md +0 -0
  56. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/load-extension.md +0 -0
  57. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/parse-files-into-columns.md +0 -0
  58. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/persist.md +0 -0
  59. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/query-json.md +0 -0
  60. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/query-without-config.md +0 -0
  61. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/react-to-changes.md +0 -0
  62. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/search-by-meaning.md +0 -0
  63. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/search-indexes.md +0 -0
  64. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/skip-files.md +0 -0
  65. {dirsql-0.4.86 → dirsql-0.4.88}/docs/howto/write-a-plugin.md +0 -0
  66. {dirsql-0.4.86 → dirsql-0.4.88}/docs/index.md +0 -0
  67. {dirsql-0.4.86 → dirsql-0.4.88}/docs/package.json +0 -0
  68. {dirsql-0.4.86 → dirsql-0.4.88}/docs/plugins.md +0 -0
  69. {dirsql-0.4.86 → dirsql-0.4.88}/docs/pnpm-lock.yaml +0 -0
  70. {dirsql-0.4.86 → dirsql-0.4.88}/docs/pnpm-workspace.yaml +0 -0
  71. {dirsql-0.4.86 → dirsql-0.4.88}/docs/reference/cli.md +0 -0
  72. {dirsql-0.4.86 → dirsql-0.4.88}/docs/reference/columns.md +0 -0
  73. {dirsql-0.4.86 → dirsql-0.4.88}/docs/reference/config.md +0 -0
  74. {dirsql-0.4.86 → dirsql-0.4.88}/docs/reference/hooks.md +0 -0
  75. {dirsql-0.4.86 → dirsql-0.4.88}/docs/reference/http-api.md +0 -0
  76. {dirsql-0.4.86 → dirsql-0.4.88}/docs/reference/sdk.md +0 -0
  77. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/CHANGELOG.md +0 -0
  78. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/MIGRATIONS.md +0 -0
  79. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/README.md +0 -0
  80. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  81. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  82. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  83. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  84. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  85. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  86. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  87. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  88. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  89. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  90. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  91. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  92. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  93. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  94. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  95. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  96. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  97. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  98. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  99. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  100. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  101. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  102. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  103. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  104. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  105. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  106. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  107. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  108. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  109. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  110. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  111. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  112. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  113. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  114. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  115. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  116. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
  117. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
  118. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  119. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  120. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  121. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
  122. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
  123. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
  124. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  125. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/changelog.d/README.md +0 -0
  126. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/conftest.py +0 -0
  127. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/.claude/CLAUDE.md +0 -0
  128. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/.vitepress/config.ts +0 -0
  129. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  130. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  131. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/AGENTS.md +0 -0
  132. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/context/.gitattributes +0 -0
  133. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/context/recipes.md +0 -0
  134. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/context/troubleshooting.md +0 -0
  135. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/context/usage.md +0 -0
  136. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/explanation.md +0 -0
  137. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/getting-started.md +0 -0
  138. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/agent-skill.md +0 -0
  139. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/columns-from-paths.md +0 -0
  140. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/define-tables.md +0 -0
  141. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/embed.md +0 -0
  142. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/extract-from-contents.md +0 -0
  143. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/load-extension.md +0 -0
  144. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  145. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/persist.md +0 -0
  146. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/query-json.md +0 -0
  147. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/query-without-config.md +0 -0
  148. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/react-to-changes.md +0 -0
  149. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/search-by-meaning.md +0 -0
  150. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/search-indexes.md +0 -0
  151. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/skip-files.md +0 -0
  152. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/howto/write-a-plugin.md +0 -0
  153. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/index.md +0 -0
  154. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/package.json +0 -0
  155. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/plugins.md +0 -0
  156. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/pnpm-lock.yaml +0 -0
  157. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/pnpm-workspace.yaml +0 -0
  158. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/reference/cli.md +0 -0
  159. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/reference/columns.md +0 -0
  160. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/reference/config.md +0 -0
  161. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/reference/hooks.md +0 -0
  162. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/reference/http-api.md +0 -0
  163. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/docs/reference/sdk.md +0 -0
  164. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
  165. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
  166. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
  167. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
  168. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
  169. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  170. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  171. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  172. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  173. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  174. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  175. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  176. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  177. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  178. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  179. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  180. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  181. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  182. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  183. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  184. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  185. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  186. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  187. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  188. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  189. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  190. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  191. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  192. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  193. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  194. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  195. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  196. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  197. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  198. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  199. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  200. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  201. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  202. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  203. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
  204. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  205. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
  206. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
  207. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
  208. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
  209. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  210. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  211. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  212. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  213. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  214. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  215. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
  216. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
  217. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  218. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
  219. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
  220. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
  221. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
  222. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
  223. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
  224. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
  225. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
  226. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
  227. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
  228. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
  229. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
  230. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
  231. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
  232. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
  233. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
  234. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
  235. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
  236. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
  237. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
  238. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
  239. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
  240. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
  241. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
  242. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  243. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  244. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  245. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  246. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  247. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  248. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  249. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  250. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  251. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  252. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  253. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  254. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  255. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  256. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  257. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  258. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  259. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  260. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  261. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  262. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  263. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  264. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  265. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  266. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  267. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  268. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  269. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  270. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  271. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  272. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  273. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  274. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  275. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
  276. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
  277. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  278. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  279. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  280. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
  281. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
  282. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
  283. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  284. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/migrations.d/README.md +0 -0
  285. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/src/lib.rs +0 -0
  286. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/testing-conventions.toml +0 -0
  287. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/__init__.py +0 -0
  288. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/conftest.py +0 -0
  289. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/e2e/__init__.py +0 -0
  290. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  291. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  292. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/e2e/speed_of_light.py +0 -0
  293. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/integration/__init__.py +0 -0
  294. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/integration/binding/__init__.py +0 -0
  295. {dirsql-0.4.86 → dirsql-0.4.88}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  296. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/CHANGELOG.md +0 -0
  297. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/MIGRATIONS.md +0 -0
  298. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/README.md +0 -0
  299. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/benches/db_bench.rs +0 -0
  300. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/benches/differ_bench.rs +0 -0
  301. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/benches/matcher_bench.rs +0 -0
  302. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/benches/scanner_bench.rs +0 -0
  303. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/context/.gitattributes +0 -0
  304. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/context/recipes.md +0 -0
  305. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/context/troubleshooting.md +0 -0
  306. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/context/usage.md +0 -0
  307. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/explanation.md +0 -0
  308. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/getting-started.md +0 -0
  309. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/agent-skill.md +0 -0
  310. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  311. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/define-tables.md +0 -0
  312. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/embed.md +0 -0
  313. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  314. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/load-extension.md +0 -0
  315. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  316. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/persist.md +0 -0
  317. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/query-json.md +0 -0
  318. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/query-without-config.md +0 -0
  319. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/react-to-changes.md +0 -0
  320. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  321. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/search-indexes.md +0 -0
  322. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/skip-files.md +0 -0
  323. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  324. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/index.md +0 -0
  325. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/plugins.md +0 -0
  326. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/reference/cli.md +0 -0
  327. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/reference/columns.md +0 -0
  328. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/reference/config.md +0 -0
  329. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/reference/hooks.md +0 -0
  330. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/reference/http-api.md +0 -0
  331. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/docs/reference/sdk.md +0 -0
  332. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/bin/dirsql.rs +0 -0
  333. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/context.rs +0 -0
  334. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/execute.rs +0 -0
  335. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/init.rs +0 -0
  336. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/mod.rs +0 -0
  337. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/repl.rs +0 -0
  338. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/router.rs +0 -0
  339. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/run.rs +0 -0
  340. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/serialize.rs +0 -0
  341. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/server.rs +0 -0
  342. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/cli/table.rs +0 -0
  343. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/command.rs +0 -0
  344. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/config.rs +0 -0
  345. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/db.rs +0 -0
  346. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/default_config.toml +0 -0
  347. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/differ.rs +0 -0
  348. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/extension_resolution.rs +0 -0
  349. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/functions.rs +0 -0
  350. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/infer.rs +0 -0
  351. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/launcher.rs +0 -0
  352. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/listing.rs +0 -0
  353. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/on_file.rs +0 -0
  354. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/path_table.rs +0 -0
  355. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/persist.rs +0 -0
  356. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/posix_class.rs +0 -0
  357. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/progress.rs +0 -0
  358. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/row_event_flat.rs +0 -0
  359. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/sql_literal.rs +0 -0
  360. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/tree_walk.rs +0 -0
  361. {dirsql-0.4.86 → dirsql-0.4.88}/packages/rust/src/watcher.rs +0 -0
  362. {dirsql-0.4.86 → dirsql-0.4.88}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.86"
555
+ version = "0.4.88"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -603,7 +603,7 @@ dependencies = [
603
603
 
604
604
  [[package]]
605
605
  name = "dirsql-py-ext"
606
- version = "0.4.86"
606
+ version = "0.4.88"
607
607
  dependencies = [
608
608
  "dirsql",
609
609
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.86
3
+ Version: 0.4.88
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
@@ -59,7 +59,9 @@ alternation: `'./docs/{a,b}.md'` is `docs/a.md` and `docs/b.md`, and groups
59
59
  nest. A group holding a `..` range counts: `'./log/{1..3}.txt'`,
60
60
  `'./{a..c}.md'`, `'./{01..10}.md'` (zero-padded) and `'./{1..10..2}.md'`
61
61
  (every second value). Any other brace is literal text, so `'./br/{q}.md'`
62
- names the file `br/{q}.md`, and `\{` is always a literal brace.
62
+ names the file `br/{q}.md`, and `\{` is always a literal brace. A `{`, `}`
63
+ or `[` with no partner is literal too, in a path-table and in a config
64
+ `[[table]] glob`.
63
65
 
64
66
  The scan starts at the last directory named outright before the first glob
65
67
  component, and descends only as deep as the pattern can match --
@@ -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.86"
7
+ version = "0.4.88"
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 @@
1
+ **Fixed** An unmatched `{`, `}` or `[` in a path-table or a config `[[table]] glob` is a literal character, as in bash, instead of a glob compile error.
@@ -0,0 +1,3 @@
1
+ **Changed** Declared `[[table]]` tables respect `.gitignore` by default, as
2
+ path-tables do: inside a git repo, a file a `.gitignore` ignores is no longer a
3
+ row, at startup or while watching. `--no-ignore` turns this off for them too.
@@ -59,7 +59,9 @@ alternation: `'./docs/{a,b}.md'` is `docs/a.md` and `docs/b.md`, and groups
59
59
  nest. A group holding a `..` range counts: `'./log/{1..3}.txt'`,
60
60
  `'./{a..c}.md'`, `'./{01..10}.md'` (zero-padded) and `'./{1..10..2}.md'`
61
61
  (every second value). Any other brace is literal text, so `'./br/{q}.md'`
62
- names the file `br/{q}.md`, and `\{` is always a literal brace.
62
+ names the file `br/{q}.md`, and `\{` is always a literal brace. A `{`, `}`
63
+ or `[` with no partner is literal too, in a path-table and in a config
64
+ `[[table]] glob`.
63
65
 
64
66
  The scan starts at the last directory named outright before the first glob
65
67
  component, and descends only as deep as the pattern can match --
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_gitignore_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/query_contract_test.py -x -q",
3
+ "ran_at": 1791329772,
4
+ "exit_code": 0,
5
+ "commit": "f828a8181c981ab9c5c775117cb60edf3ccd9dcc",
6
+ "branch": "claude/1258-config-gitignore"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/query_contract_test.py tests/e2e/fanout_test.py tests/e2e/capture_collision_test.py -x -q",
3
+ "ran_at": 1791325871,
4
+ "exit_code": 0,
5
+ "commit": "45535f123cfc3ea9cf9460c228196e2630d377db",
6
+ "branch": "claude/1268-unbalanced-brackets"
7
+ }
@@ -0,0 +1,29 @@
1
+ ### Core: unbalanced braces and brackets in a glob are literal
2
+
3
+ #### Summary
4
+
5
+ A `{`, `}` or `[` with no partner in a glob is now a literal character, as in
6
+ bash, on path-tables and on config `[[table]] glob`. It used to fail with a
7
+ glob compile error. Nothing that compiled before changes meaning.
8
+
9
+ #### Required changes
10
+
11
+ _None._
12
+
13
+ #### Deprecations removed
14
+
15
+ _None._
16
+
17
+ #### Behavior changes without code changes
18
+
19
+ - `'./{a.md'`, `'./a}.md'`, `'./[a.md'` and `'./a[b.md'` match files named
20
+ exactly that instead of failing to compile.
21
+
22
+ #### Verification
23
+
24
+ ```bash
25
+ cd "$(mktemp -d)"
26
+ touch '[a.md'
27
+ dirsql query "SELECT path FROM './[a.md'"
28
+ # expected: [{"path":"[a.md"}]
29
+ ```
@@ -0,0 +1,45 @@
1
+ ### Config tables respect .gitignore
2
+
3
+ #### Summary
4
+
5
+ A declared `[[table]]` used to read every file its glob matched, whatever
6
+ `.gitignore` said. It now skips gitignored files, as a path-table does. This
7
+ breaks a config that relied on indexing an ignored file; pass `--no-ignore`
8
+ (or `no_ignore` in the SDKs) to restore the old behavior.
9
+
10
+ #### Required changes
11
+
12
+ | Before | After |
13
+ | --- | --- |
14
+ | a table indexed gitignored files | pass `--no-ignore`, or stop ignoring the file |
15
+
16
+ #### Deprecations removed
17
+
18
+ _None._
19
+
20
+ #### Behavior changes without code changes
21
+
22
+ - Inside a git repo (a directory holding `.git`), files a `.gitignore` ignores
23
+ are not rows of a `[[table]]`, at startup or while watching.
24
+ - Outside a repo nothing changes.
25
+
26
+ #### Verification
27
+
28
+ ```bash
29
+ cd "$(mktemp -d)"
30
+ git init -q
31
+ printf 'skip.json\n' > .gitignore
32
+ echo '[{"p":"keep"}]' > keep.json
33
+ echo '[{"p":"skip"}]' > skip.json
34
+ cat > .dirsql.toml <<'TOML'
35
+ [[table]]
36
+ name = "t"
37
+ glob = "*.json"
38
+ ddl = "CREATE TABLE t (p TEXT)"
39
+ on-file = "jq -sc add"
40
+ TOML
41
+ dirsql query "SELECT p FROM t" -c .dirsql.toml
42
+ # expected: [{"p":"keep"}]
43
+ dirsql query "SELECT p FROM t ORDER BY p" -c .dirsql.toml --no-ignore
44
+ # expected: [{"p":"keep"},{"p":"skip"}]
45
+ ```
@@ -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.86"
9
+ version = "0.4.88"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -59,7 +59,9 @@ alternation: `'./docs/{a,b}.md'` is `docs/a.md` and `docs/b.md`, and groups
59
59
  nest. A group holding a `..` range counts: `'./log/{1..3}.txt'`,
60
60
  `'./{a..c}.md'`, `'./{01..10}.md'` (zero-padded) and `'./{1..10..2}.md'`
61
61
  (every second value). Any other brace is literal text, so `'./br/{q}.md'`
62
- names the file `br/{q}.md`, and `\{` is always a literal brace.
62
+ names the file `br/{q}.md`, and `\{` is always a literal brace. A `{`, `}`
63
+ or `[` with no partner is literal too, in a path-table and in a config
64
+ `[[table]] glob`.
63
65
 
64
66
  The scan starts at the last directory named outright before the first glob
65
67
  component, and descends only as deep as the pattern can match --
@@ -198,7 +198,7 @@ fn steps(lo: i64, hi: i64, step: i64) -> Option<impl Iterator<Item = i128>> {
198
198
 
199
199
  /// Escape the braces bash left as literal text, so globset matches them
200
200
  /// rather than reading an alternation. A complete `[...]` class is copied as
201
- /// written; an unclosed one ends escaping so globset reports the error.
201
+ /// written; an unclosed `[` is a literal character.
202
202
  fn escape_braces(word: &str) -> String {
203
203
  let chars: Vec<char> = word.chars().collect();
204
204
  let mut out = String::with_capacity(word.len());
@@ -222,10 +222,7 @@ fn escape_braces(word: &str) -> String {
222
222
  out.extend(&chars[i..=end]);
223
223
  resume = end + 1;
224
224
  }
225
- None => {
226
- out.extend(&chars[i..]);
227
- return out;
228
- }
225
+ None => out.push_str("[[]"),
229
226
  },
230
227
  ('{', _) => out.push_str("[{]"),
231
228
  ('}', _) => out.push_str("[}]"),
@@ -411,9 +408,18 @@ mod tests {
411
408
  }
412
409
 
413
410
  #[test]
414
- fn an_unclosed_class_ends_escaping() {
415
- assert_eq!(escape_braces("x[{q}"), "x[{q}");
416
- assert_eq!(escape_braces("x[]{"), "x[]{");
411
+ fn an_unclosed_bracket_is_literal() {
412
+ assert_eq!(escape_braces("x[{q}"), "x[[][{]q[}]");
413
+ assert_eq!(escape_braces("x[]{"), "x[[]][{]");
414
+ assert_eq!(escape_braces("[!a"), "[[]!a");
415
+ assert_eq!(escape_braces("a].md"), "a].md");
416
+ }
417
+
418
+ #[test]
419
+ fn expand_leaves_an_unpartnered_brace_literal() {
420
+ assert_eq!(expand("{a.md"), vec!["[{]a.md"]);
421
+ assert_eq!(expand("a}.md"), vec!["a[}].md"]);
422
+ assert_eq!(expand("{a,b}}.md"), vec!["a[}].md", "b[}].md"]);
417
423
  }
418
424
 
419
425
  #[test]
@@ -732,6 +732,14 @@ impl DirSQL {
732
732
  if group.matcher.is_ignored(&rel_path_buf) {
733
733
  continue;
734
734
  }
735
+ if group.matcher.respects_gitignore()
736
+ && scanner::is_gitignored_path(
737
+ &abs_path,
738
+ self.inner.fs.is_dir(&abs_path).unwrap_or(false),
739
+ )
740
+ {
741
+ continue;
742
+ }
735
743
 
736
744
  // A directory that appears whole (`mkdir`, or a populated directory
737
745
  // renamed into the tree) arrives as one event naming the directory and
@@ -1110,6 +1118,13 @@ impl DirSQL {
1110
1118
  } = resolved;
1111
1119
 
1112
1120
  let (groups, anchors, table_names) = compile_groups(&tables, &ignore, &root)?;
1121
+ let groups = groups
1122
+ .into_iter()
1123
+ .map(|group| AnchorGroup {
1124
+ matcher: group.matcher.with_gitignore(!no_ignore),
1125
+ ..group
1126
+ })
1127
+ .collect::<Vec<_>>();
1113
1128
 
1114
1129
  // Resolve the persistent context before scanning, so the scan can
1115
1130
  // consult the cached file index.
@@ -2935,6 +2950,23 @@ mod internal_tests {
2935
2950
  assert_eq!(found, vec!["a.txt"]);
2936
2951
  }
2937
2952
 
2953
+ /// The startup walk honors `.gitignore` unless the build asked not to.
2954
+ #[test]
2955
+ fn prepare_hands_the_walk_a_matcher_that_honors_gitignore_unless_no_ignore() {
2956
+ let dir = TempDir::new().unwrap();
2957
+ for no_ignore in [false, true] {
2958
+ let honored = Cell::new(None);
2959
+ let mut resolved = resolved_over(dir.path(), vec![txt_table()], false);
2960
+ resolved.no_ignore = no_ignore;
2961
+ DirSQL::prepare_resolved_with(resolved, &|_, matcher, _| {
2962
+ honored.set(Some(matcher.respects_gitignore()));
2963
+ Vec::new()
2964
+ })
2965
+ .unwrap();
2966
+ assert_eq!(honored.get(), Some(!no_ignore));
2967
+ }
2968
+ }
2969
+
2938
2970
  /// Skipping the walk skips only the walk: with persist on, the cache is
2939
2971
  /// still opened and reconciled against the (empty) scan.
2940
2972
  #[test]
@@ -97,6 +97,7 @@ pub struct TableMatcher {
97
97
  entries: Vec<PatternEntry>,
98
98
  ignore_set: Vec<Pattern>,
99
99
  ignore_dir_set: Vec<Pattern>,
100
+ gitignore: bool,
100
101
  }
101
102
 
102
103
  /// Byte spans of the `{name}` placeholders in `pattern`, in order: `(start,
@@ -182,9 +183,20 @@ impl TableMatcher {
182
183
  entries,
183
184
  ignore_set,
184
185
  ignore_dir_set,
186
+ gitignore: false,
185
187
  })
186
188
  }
187
189
 
190
+ /// Whether a scan under this matcher honors `.gitignore` files.
191
+ pub fn with_gitignore(mut self, gitignore: bool) -> Self {
192
+ self.gitignore = gitignore;
193
+ self
194
+ }
195
+
196
+ pub(crate) fn respects_gitignore(&self) -> bool {
197
+ self.gitignore
198
+ }
199
+
188
200
  /// Returns one [`MatchResult`] per matching pattern, in declaration order.
189
201
  /// A file matching N patterns yields N results (fan-out). Empty when
190
202
  /// nothing matches.
@@ -230,6 +242,13 @@ mod tests {
230
242
  assert_eq!(names(&matcher, "report.csv"), vec!["data"]);
231
243
  }
232
244
 
245
+ #[test]
246
+ fn a_matcher_honors_gitignore_only_once_asked_to() {
247
+ let matcher = TableMatcher::new(&[], &[]).unwrap();
248
+ assert!(!matcher.respects_gitignore());
249
+ assert!(matcher.with_gitignore(true).respects_gitignore());
250
+ }
251
+
233
252
  #[test]
234
253
  fn match_all_returns_empty_for_no_match() {
235
254
  let matcher = TableMatcher::new(&[("*.csv", "data")], &[]).unwrap();
@@ -323,7 +342,7 @@ mod tests {
323
342
 
324
343
  #[test]
325
344
  fn invalid_glob_returns_error() {
326
- let result = TableMatcher::new(&[("[invalid", "t")], &[]);
345
+ let result = TableMatcher::new(&[("[z-a]", "t")], &[]);
327
346
  assert!(result.is_err());
328
347
  }
329
348
 
@@ -291,7 +291,7 @@ mod tests {
291
291
 
292
292
  #[test]
293
293
  fn parse_module_args_rejects_an_invalid_glob() {
294
- let args = args_with(&[b"'/tmp'", b"'['", b"'cat'", b"'gitignore'", b"'/tmp'"]);
294
+ let args = args_with(&[b"'/tmp'", b"'[z-a]'", b"'cat'", b"'gitignore'", b"'/tmp'"]);
295
295
  assert!(parse_module_args(&args).is_err());
296
296
  }
297
297
 
@@ -93,15 +93,23 @@ fn scan_below(
93
93
  ) -> Vec<(PathBuf, String)> {
94
94
  let mut results = Vec::new();
95
95
  let mut seen: u64 = 0;
96
+ let gitignore = matcher.respects_gitignore();
97
+ let repo = if gitignore {
98
+ enclosing_repo(start, &holds_git)
99
+ } else {
100
+ None
101
+ };
96
102
 
97
103
  // Match against relative path so globs like "comments/**/*.jsonl" work
98
104
  // regardless of the absolute root directory.
99
105
  let walker = Walk {
100
106
  ignore: matcher,
101
107
  glob: None,
102
- gitignore: false,
103
- in_repo: false,
104
- frames: Vec::new(),
108
+ gitignore,
109
+ in_repo: repo.is_some(),
110
+ frames: repo.map_or_else(Vec::new, |top| {
111
+ gitignores_above(start, top, &load_gitignore)
112
+ }),
105
113
  dirs: false,
106
114
  };
107
115
  walk(
@@ -741,6 +749,26 @@ fn load_gitignore(dir: &Path) -> Option<Gitignore> {
741
749
  builder.build().ok()
742
750
  }
743
751
 
752
+ /// Whether the `.gitignore` files of the repo enclosing `path` ignore it, or
753
+ /// a directory above it, as the walk would have: for a path a watcher reports
754
+ /// without having walked to it.
755
+ pub(crate) fn is_gitignored_path(path: &Path, is_dir: bool) -> bool {
756
+ let Some(top) = path
757
+ .parent()
758
+ .and_then(|dir| enclosing_repo(dir, &holds_git))
759
+ else {
760
+ return false;
761
+ };
762
+ for frame in gitignores_above(path, top, &load_gitignore).iter().rev() {
763
+ match frame.matched_path_or_any_parents(path, is_dir) {
764
+ Match::Ignore(_) => return true,
765
+ Match::Whitelist(_) => return false,
766
+ Match::None => {}
767
+ }
768
+ }
769
+ false
770
+ }
771
+
744
772
  /// Whether the `.gitignore` files in force mark `path` ignored. Deeper files
745
773
  /// take precedence (git's rule), and a whitelisting `!pattern` un-ignores.
746
774
  fn is_gitignored(frames: &[Arc<Gitignore>], path: &Path, is_dir: bool) -> bool {
@@ -1110,7 +1138,7 @@ mod tests {
1110
1138
 
1111
1139
  #[test]
1112
1140
  fn compile_glob_rejects_an_invalid_pattern() {
1113
- assert!(compile_glob("[").is_err());
1141
+ assert!(compile_glob("[z-a]").is_err());
1114
1142
  }
1115
1143
 
1116
1144
  #[test]
@@ -1664,4 +1692,14 @@ mod tests {
1664
1692
  let frames = [frame("", &["!keep.log"]), frame("sub", &["*.log"])];
1665
1693
  assert!(is_gitignored(&frames, Path::new("sub/keep.log"), false));
1666
1694
  }
1695
+
1696
+ #[test]
1697
+ fn is_gitignored_path_ignores_a_path_the_repo_gitignore_matches() {
1698
+ let repo = tempfile::tempdir().unwrap();
1699
+ fs::create_dir(repo.path().join(".git")).unwrap();
1700
+ fs::write(repo.path().join(".gitignore"), "*.log\n").unwrap();
1701
+
1702
+ assert!(is_gitignored_path(&repo.path().join("debug.log"), false));
1703
+ assert!(!is_gitignored_path(&repo.path().join("app.js"), false));
1704
+ }
1667
1705
  }
@@ -620,7 +620,7 @@ mod tests {
620
620
 
621
621
  #[test]
622
622
  fn parse_module_args_rejects_an_invalid_glob() {
623
- let args = args_with(&[b"'/tmp'", b"'['", b"''", b"'gitignore'"]);
623
+ let args = args_with(&[b"'/tmp'", b"'[z-a]'", b"''", b"'gitignore'"]);
624
624
  assert!(parse_module_args(&args).is_err());
625
625
  }
626
626
 
@@ -669,7 +669,7 @@ mod tests {
669
669
 
670
670
  #[test]
671
671
  fn compile_glob_rejects_an_invalid_pattern() {
672
- let err = compile_glob("[").unwrap_err();
672
+ let err = compile_glob("[z-a]").unwrap_err();
673
673
  assert!(
674
674
  matches!(err, Error::ModuleError(_)),
675
675
  "invalid globs surface as module errors, got {err:?}"
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
File without changes
File without changes