dirsql 0.4.98__tar.gz → 0.4.99__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 (403) hide show
  1. {dirsql-0.4.98 → dirsql-0.4.99}/Cargo.lock +2 -2
  2. {dirsql-0.4.98 → dirsql-0.4.99}/PKG-INFO +1 -1
  3. {dirsql-0.4.98/packages/python → dirsql-0.4.99}/docs/reference/glob.md +24 -4
  4. {dirsql-0.4.98/packages/rust → dirsql-0.4.99}/docs/reference/path-tables.md +3 -0
  5. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/Cargo.toml +1 -1
  6. dirsql-0.4.99/packages/python/changelog.d/2026-10-07-literal-gitignore.md +3 -0
  7. dirsql-0.4.99/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +3 -0
  8. {dirsql-0.4.98 → dirsql-0.4.99/packages/python}/docs/reference/glob.md +24 -4
  9. {dirsql-0.4.98 → dirsql-0.4.99/packages/python}/docs/reference/path-tables.md +3 -0
  10. dirsql-0.4.99/packages/python/e2e-attestations/bot-1421-posix-unicode.json +7 -0
  11. dirsql-0.4.99/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +7 -0
  12. dirsql-0.4.99/packages/python/migrations.d/2026-10-07-literal-gitignore.md +23 -0
  13. dirsql-0.4.99/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +23 -0
  14. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/Cargo.toml +1 -1
  15. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/glob.md +24 -4
  16. {dirsql-0.4.98/packages/python → dirsql-0.4.99/packages/rust}/docs/reference/path-tables.md +3 -0
  17. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/matcher.rs +68 -2
  18. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/posix_class.rs +92 -31
  19. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/scanner.rs +37 -2
  20. {dirsql-0.4.98 → dirsql-0.4.99}/Cargo.toml +0 -0
  21. {dirsql-0.4.98 → dirsql-0.4.99}/README.md +0 -0
  22. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/__init__.py +0 -0
  23. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/_async.py +0 -0
  24. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/_dirsql.pyi +0 -0
  25. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/__init__.py +0 -0
  26. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/__init__.py +0 -0
  27. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  28. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  29. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  30. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  31. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/main.py +0 -0
  32. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/resolve_config_extensions.py +0 -0
  33. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/plan_entry_path.py +0 -0
  34. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/py.typed +0 -0
  35. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/read_config.py +0 -0
  36. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/resolve_configs_extension_specs.py +0 -0
  37. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/resolve_extension.py +0 -0
  38. {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/resolve_package.py +0 -0
  39. {dirsql-0.4.98 → dirsql-0.4.99}/docs/.claude/CLAUDE.md +0 -0
  40. {dirsql-0.4.98 → dirsql-0.4.99}/docs/.vitepress/config.ts +0 -0
  41. {dirsql-0.4.98 → dirsql-0.4.99}/docs/.vitepress/theme/index.ts +0 -0
  42. {dirsql-0.4.98 → dirsql-0.4.99}/docs/.vitepress/theme/lang.ts +0 -0
  43. {dirsql-0.4.98 → dirsql-0.4.99}/docs/AGENTS.md +0 -0
  44. {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/.gitattributes +0 -0
  45. {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/recipes.md +0 -0
  46. {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/troubleshooting.md +0 -0
  47. {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/usage.md +0 -0
  48. {dirsql-0.4.98 → dirsql-0.4.99}/docs/explanation.md +0 -0
  49. {dirsql-0.4.98 → dirsql-0.4.99}/docs/getting-started.md +0 -0
  50. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/agent-skill.md +0 -0
  51. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/columns-from-paths.md +0 -0
  52. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/define-tables.md +0 -0
  53. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/embed.md +0 -0
  54. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/extract-from-contents.md +0 -0
  55. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/load-extension.md +0 -0
  56. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/parse-files-into-columns.md +0 -0
  57. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/persist.md +0 -0
  58. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/query-json.md +0 -0
  59. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/query-without-config.md +0 -0
  60. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/react-to-changes.md +0 -0
  61. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/search-by-meaning.md +0 -0
  62. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/search-indexes.md +0 -0
  63. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/skip-files.md +0 -0
  64. {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/write-a-plugin.md +0 -0
  65. {dirsql-0.4.98 → dirsql-0.4.99}/docs/index.md +0 -0
  66. {dirsql-0.4.98 → dirsql-0.4.99}/docs/package.json +0 -0
  67. {dirsql-0.4.98 → dirsql-0.4.99}/docs/plugins.md +0 -0
  68. {dirsql-0.4.98 → dirsql-0.4.99}/docs/pnpm-lock.yaml +0 -0
  69. {dirsql-0.4.98 → dirsql-0.4.99}/docs/pnpm-workspace.yaml +0 -0
  70. {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/cli.md +0 -0
  71. {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/columns.md +0 -0
  72. {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/config.md +0 -0
  73. {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/hooks.md +0 -0
  74. {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/http-api.md +0 -0
  75. {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/sdk.md +0 -0
  76. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/CHANGELOG.md +0 -0
  77. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/MIGRATIONS.md +0 -0
  78. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/README.md +0 -0
  79. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  80. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  81. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  82. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  83. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  84. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  85. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  86. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  87. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  88. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  89. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  90. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  91. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  92. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  93. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  94. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  95. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  96. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  97. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  98. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  99. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  100. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  101. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  102. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  103. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  104. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  105. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  106. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  107. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  108. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  109. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  110. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  111. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  112. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  113. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  114. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  115. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
  116. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
  117. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  118. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  119. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  120. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
  121. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
  122. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
  123. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
  124. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  125. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
  126. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
  127. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
  128. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
  129. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  130. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
  131. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  132. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-fix-main-build.md +0 -0
  133. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
  134. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
  135. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/README.md +0 -0
  136. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/conftest.py +0 -0
  137. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.claude/CLAUDE.md +0 -0
  138. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.vitepress/config.ts +0 -0
  139. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  140. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  141. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/AGENTS.md +0 -0
  142. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/.gitattributes +0 -0
  143. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/recipes.md +0 -0
  144. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/troubleshooting.md +0 -0
  145. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/usage.md +0 -0
  146. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/explanation.md +0 -0
  147. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/getting-started.md +0 -0
  148. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/agent-skill.md +0 -0
  149. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/columns-from-paths.md +0 -0
  150. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/define-tables.md +0 -0
  151. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/embed.md +0 -0
  152. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/extract-from-contents.md +0 -0
  153. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/load-extension.md +0 -0
  154. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  155. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/persist.md +0 -0
  156. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/query-json.md +0 -0
  157. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/query-without-config.md +0 -0
  158. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/react-to-changes.md +0 -0
  159. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/search-by-meaning.md +0 -0
  160. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/search-indexes.md +0 -0
  161. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/skip-files.md +0 -0
  162. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/write-a-plugin.md +0 -0
  163. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/index.md +0 -0
  164. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/package.json +0 -0
  165. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/plugins.md +0 -0
  166. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/pnpm-lock.yaml +0 -0
  167. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/pnpm-workspace.yaml +0 -0
  168. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/cli.md +0 -0
  169. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/columns.md +0 -0
  170. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/config.md +0 -0
  171. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/hooks.md +0 -0
  172. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/http-api.md +0 -0
  173. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/sdk.md +0 -0
  174. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
  175. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
  176. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
  177. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
  178. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
  179. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
  180. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
  181. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
  182. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
  183. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
  184. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
  185. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
  186. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
  187. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
  188. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
  189. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  190. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  191. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  192. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  193. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  194. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  195. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  196. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  197. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  198. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  199. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  200. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  201. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  202. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  203. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  204. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  205. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  206. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  207. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  208. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  209. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  210. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  211. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  212. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  213. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  214. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  215. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  216. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  217. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  218. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  219. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  220. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  221. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  222. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  223. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
  224. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  225. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
  226. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
  227. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
  228. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
  229. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  230. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  231. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  232. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  233. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  234. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  235. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
  236. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
  237. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
  238. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
  239. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
  240. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
  241. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
  242. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  243. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
  244. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
  245. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
  246. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
  247. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
  248. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
  249. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
  250. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
  251. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
  252. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
  253. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
  254. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
  255. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
  256. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
  257. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
  258. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
  259. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
  260. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
  261. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
  262. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
  263. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
  264. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
  265. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
  266. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
  267. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
  268. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  269. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  270. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  271. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  272. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  273. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  274. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  275. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  276. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  277. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  278. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  279. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  280. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  281. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  282. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  283. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  284. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  285. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  286. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  287. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  288. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  289. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  290. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  291. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  292. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  293. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  294. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  295. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  296. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  297. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  298. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  299. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  300. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  301. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
  302. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
  303. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  304. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  305. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  306. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
  307. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
  308. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
  309. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
  310. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  311. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
  312. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
  313. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
  314. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
  315. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  316. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
  317. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  318. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-fix-main-build.md +0 -0
  319. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
  320. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
  321. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/README.md +0 -0
  322. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/src/lib.rs +0 -0
  323. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/testing-conventions.toml +0 -0
  324. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/__init__.py +0 -0
  325. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/conftest.py +0 -0
  326. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/__init__.py +0 -0
  327. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  328. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  329. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/speed_of_light.py +0 -0
  330. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/integration/__init__.py +0 -0
  331. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/integration/binding/__init__.py +0 -0
  332. {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  333. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/CHANGELOG.md +0 -0
  334. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/MIGRATIONS.md +0 -0
  335. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/README.md +0 -0
  336. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/db_bench.rs +0 -0
  337. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/differ_bench.rs +0 -0
  338. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/matcher_bench.rs +0 -0
  339. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/scanner_bench.rs +0 -0
  340. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/.gitattributes +0 -0
  341. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/recipes.md +0 -0
  342. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/troubleshooting.md +0 -0
  343. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/usage.md +0 -0
  344. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/explanation.md +0 -0
  345. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/getting-started.md +0 -0
  346. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/agent-skill.md +0 -0
  347. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  348. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/define-tables.md +0 -0
  349. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/embed.md +0 -0
  350. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  351. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/load-extension.md +0 -0
  352. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  353. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/persist.md +0 -0
  354. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/query-json.md +0 -0
  355. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/query-without-config.md +0 -0
  356. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/react-to-changes.md +0 -0
  357. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  358. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/search-indexes.md +0 -0
  359. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/skip-files.md +0 -0
  360. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  361. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/index.md +0 -0
  362. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/plugins.md +0 -0
  363. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/cli.md +0 -0
  364. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/columns.md +0 -0
  365. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/config.md +0 -0
  366. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/hooks.md +0 -0
  367. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/http-api.md +0 -0
  368. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/sdk.md +0 -0
  369. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/bin/dirsql.rs +0 -0
  370. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/brace.rs +0 -0
  371. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/context.rs +0 -0
  372. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/execute.rs +0 -0
  373. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/init.rs +0 -0
  374. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/mod.rs +0 -0
  375. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/repl.rs +0 -0
  376. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/router.rs +0 -0
  377. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/run.rs +0 -0
  378. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/serialize.rs +0 -0
  379. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/server.rs +0 -0
  380. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/table.rs +0 -0
  381. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/command.rs +0 -0
  382. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/config.rs +0 -0
  383. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/db.rs +0 -0
  384. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/default_config.toml +0 -0
  385. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/differ.rs +0 -0
  386. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/extension_resolution.rs +0 -0
  387. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/functions.rs +0 -0
  388. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/infer.rs +0 -0
  389. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/launcher.rs +0 -0
  390. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/lib.rs +0 -0
  391. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/listing.rs +0 -0
  392. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/on_file.rs +0 -0
  393. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/parsed_vtab.rs +0 -0
  394. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/path_table.rs +0 -0
  395. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/persist.rs +0 -0
  396. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/progress.rs +0 -0
  397. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/row_event_flat.rs +0 -0
  398. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/sql_literal.rs +0 -0
  399. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/tree_walk.rs +0 -0
  400. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/vtab.rs +0 -0
  401. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/vtab_scaffold.rs +0 -0
  402. {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/watcher.rs +0 -0
  403. {dirsql-0.4.98 → dirsql-0.4.99}/pyproject.toml +0 -0
@@ -573,7 +573,7 @@ dependencies = [
573
573
 
574
574
  [[package]]
575
575
  name = "dirsql"
576
- version = "0.4.98"
576
+ version = "0.4.99"
577
577
  dependencies = [
578
578
  "assert_cmd",
579
579
  "axum",
@@ -625,7 +625,7 @@ dependencies = [
625
625
 
626
626
  [[package]]
627
627
  name = "dirsql-py-ext"
628
- version = "0.4.98"
628
+ version = "0.4.99"
629
629
  dependencies = [
630
630
  "dirsql",
631
631
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.98
3
+ Version: 0.4.99
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
@@ -49,6 +49,13 @@ docs/nested/deep.md
49
49
  docs/nested/.cache/x.md
50
50
  node_modules/pkg/index.js
51
51
  real/r.md
52
+ uni/1.md
53
+ uni/a.md
54
+ uni/é.md
55
+ uni/É.md
56
+ uni/中.md
57
+ uni/٣.md
58
+ uni/¡.md
52
59
  linkdir -> real
53
60
  link.md -> top.md
54
61
  broken -> nowhere
@@ -69,13 +76,21 @@ A test runs every row against dirsql as a path-table and, with the leading
69
76
  | Pattern | Rows | Divergence |
70
77
  | --- | --- | --- |
71
78
  | `./*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `link.md`, `my file.md`, `top.md`, `{q}.md` | |
72
- | `./**/*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `linkdir/r.md`, `my file.md`, `real/r.md`, `top.md`, `{q}.md` | |
73
- | `./**` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `my file.md`, `node_modules/pkg/index.js`, `real/r.md`, `top.md`, `x.txt`, `{q}.md` | |
79
+ | `./**/*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `linkdir/r.md`, `my file.md`, `real/r.md`, `top.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md`, `{q}.md` | |
80
+ | `./**` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `my file.md`, `node_modules/pkg/index.js`, `real/r.md`, `top.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md`, `x.txt`, `{q}.md` | |
74
81
  | `./?.md` | `1.md`, `2.md`, `3.md`, `4.md`, `a.md`, `b.md`, `c.md` | |
75
82
  | `./[ab].md` | `a.md`, `b.md` | |
76
83
  | `./[!a].md` | `1.md`, `2.md`, `3.md`, `4.md`, `b.md`, `c.md` | |
77
84
  | `./\[a\].md` | `[a].md` | |
78
85
  | `./[z.md` | `[z.md` | |
86
+ | `./uni/[[:alpha:]].md` | `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
87
+ | `./uni/[[:alnum:]].md` | `uni/1.md`, `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
88
+ | `./uni/[[:lower:]].md` | `uni/a.md`, `uni/é.md` | |
89
+ | `./uni/[[:upper:]].md` | `uni/É.md` | |
90
+ | `./uni/[[:digit:]].md` | `uni/1.md` | |
91
+ | `./uni/[[:punct:]].md` | `uni/¡.md` | |
92
+ | `./uni/[[:word:]].md` | `uni/1.md`, `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
93
+ | `./uni/[![:alpha:]].md` | `uni/1.md`, `uni/¡.md` | |
79
94
  | `./[d/x]ocs/api.md` | none | |
80
95
  | `./docs[/]api.md` | none | |
81
96
  | `./[!/]*/api.md` | none | |
@@ -106,9 +121,11 @@ A test runs every row against dirsql as a path-table and, with the leading
106
121
  | `./docs/*/../api.md` | `docs/nested/../api.md` | |
107
122
  | `./docs` | `docs/api.md`, `docs/guide.md` | directory-name |
108
123
  | `./docs/` | `docs/api.md`, `docs/guide.md` | directory-name |
109
- | `./*/` | `docs/api.md`, `docs/guide.md`, `linkdir/r.md`, `real/r.md` | directory-name |
124
+ | `./*/` | `docs/api.md`, `docs/guide.md`, `linkdir/r.md`, `real/r.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | directory-name |
110
125
  | `./d*` | none | files-only |
111
126
  | `./*.log` | none | gitignore |
127
+ | `./ignored.log` | `ignored.log` | |
128
+ | `./{ignored,x}.log` | `ignored.log` | |
112
129
  | `./**/*.js` | `node_modules/pkg/index.js` | |
113
130
  | `./node_modules/*/index.js` | `node_modules/pkg/index.js` | |
114
131
  | `./docs/**/*.md` | `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md` | |
@@ -121,7 +138,7 @@ A test runs every row against dirsql as a path-table and, with the leading
121
138
 
122
139
  | Tag | Rule | Why |
123
140
  | --- | --- | --- |
124
- | `gitignore` | Inside a git repo, `.gitignore` files hide matching files and directories. `--no-ignore` turns it off. | A query over a repo should not drown in build output. |
141
+ | `gitignore` | Inside a git repo, `.gitignore` files hide files and directories a wildcard matches, never one the pattern spells out. `--no-ignore` turns it off. | A query over a repo should not drown in build output. |
125
142
  | `directory-name` | A pattern's last component that names a directory lists the files directly inside it, like `ls docs`. A trailing `/` is `*` appended. | A table is rows of files, and `ls` is the shell habit. |
126
143
  | `files-only` | A pattern that matches a directory but no file returns nothing. | Every row is a file. |
127
144
  | `absolute` | `/`, `~/` and `../` patterns report absolute `path` values, with `..` folded out textually. | The scanned root is derived from the pattern, so there is no relative base. |
@@ -144,6 +161,9 @@ stderr; the exit code is unchanged. Path-tables never warn.
144
161
  `{a..c}` expand, as do zero-padded
145
162
  `{01..10}` and stepped `{1..10..2}` ranges. Groups nest.
146
163
  - `\[` is a literal bracket.
164
+ - POSIX classes (`[[:alpha:]]`) match Unicode characters, as bash does in a UTF-8
165
+ locale: `[[:alpha:]]` matches `é` and `中`. `[[:digit:]]`, `[[:xdigit:]]` and
166
+ `[[:ascii:]]` stay ASCII.
147
167
  - A dot-named file or directory is listed only where a component spells the
148
168
  dot at that depth: `./**/.*` finds `docs/.draft.md` but does not enter
149
169
  `.config/`.
@@ -262,6 +262,9 @@ directory, deeper files override shallower ones, `!pattern` re-includes, and
262
262
  an ignored directory is pruned rather than walked. In a typical repo this
263
263
  excludes build output, virtualenvs, and caches with zero ceremony.
264
264
 
265
+ A `.gitignore` never hides a path the pattern spells out: `'./debug.log'` lists
266
+ that file even when `*.log` is ignored, while `'./*.log'` does not.
267
+
265
268
  A `.gitignore` is in force only when a directory holding `.git` encloses it.
266
269
  Outside a repo none applies, at the scan's start, above it or below it: a
267
270
  `~/.claude` whose `.gitignore` is `*` still lists its files when `~/.claude`
@@ -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.98"
7
+ version = "0.4.99"
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,3 @@
1
+ **Changed**
2
+
3
+ - A pattern with no wildcard, such as ./debug.log, lists the file even when .gitignore ignores it; wildcard matches are still filtered.
@@ -0,0 +1,3 @@
1
+ **Changed**
2
+
3
+ - POSIX classes such as `[[:alpha:]]`, `[[:upper:]]` and `[[:punct:]]` match Unicode characters instead of ASCII only: `./[[:alpha:]].md` now matches `é.md`. `digit`, `xdigit` and `ascii` stay ASCII.
@@ -49,6 +49,13 @@ docs/nested/deep.md
49
49
  docs/nested/.cache/x.md
50
50
  node_modules/pkg/index.js
51
51
  real/r.md
52
+ uni/1.md
53
+ uni/a.md
54
+ uni/é.md
55
+ uni/É.md
56
+ uni/中.md
57
+ uni/٣.md
58
+ uni/¡.md
52
59
  linkdir -> real
53
60
  link.md -> top.md
54
61
  broken -> nowhere
@@ -69,13 +76,21 @@ A test runs every row against dirsql as a path-table and, with the leading
69
76
  | Pattern | Rows | Divergence |
70
77
  | --- | --- | --- |
71
78
  | `./*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `link.md`, `my file.md`, `top.md`, `{q}.md` | |
72
- | `./**/*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `linkdir/r.md`, `my file.md`, `real/r.md`, `top.md`, `{q}.md` | |
73
- | `./**` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `my file.md`, `node_modules/pkg/index.js`, `real/r.md`, `top.md`, `x.txt`, `{q}.md` | |
79
+ | `./**/*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `linkdir/r.md`, `my file.md`, `real/r.md`, `top.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md`, `{q}.md` | |
80
+ | `./**` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `my file.md`, `node_modules/pkg/index.js`, `real/r.md`, `top.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md`, `x.txt`, `{q}.md` | |
74
81
  | `./?.md` | `1.md`, `2.md`, `3.md`, `4.md`, `a.md`, `b.md`, `c.md` | |
75
82
  | `./[ab].md` | `a.md`, `b.md` | |
76
83
  | `./[!a].md` | `1.md`, `2.md`, `3.md`, `4.md`, `b.md`, `c.md` | |
77
84
  | `./\[a\].md` | `[a].md` | |
78
85
  | `./[z.md` | `[z.md` | |
86
+ | `./uni/[[:alpha:]].md` | `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
87
+ | `./uni/[[:alnum:]].md` | `uni/1.md`, `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
88
+ | `./uni/[[:lower:]].md` | `uni/a.md`, `uni/é.md` | |
89
+ | `./uni/[[:upper:]].md` | `uni/É.md` | |
90
+ | `./uni/[[:digit:]].md` | `uni/1.md` | |
91
+ | `./uni/[[:punct:]].md` | `uni/¡.md` | |
92
+ | `./uni/[[:word:]].md` | `uni/1.md`, `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
93
+ | `./uni/[![:alpha:]].md` | `uni/1.md`, `uni/¡.md` | |
79
94
  | `./[d/x]ocs/api.md` | none | |
80
95
  | `./docs[/]api.md` | none | |
81
96
  | `./[!/]*/api.md` | none | |
@@ -106,9 +121,11 @@ A test runs every row against dirsql as a path-table and, with the leading
106
121
  | `./docs/*/../api.md` | `docs/nested/../api.md` | |
107
122
  | `./docs` | `docs/api.md`, `docs/guide.md` | directory-name |
108
123
  | `./docs/` | `docs/api.md`, `docs/guide.md` | directory-name |
109
- | `./*/` | `docs/api.md`, `docs/guide.md`, `linkdir/r.md`, `real/r.md` | directory-name |
124
+ | `./*/` | `docs/api.md`, `docs/guide.md`, `linkdir/r.md`, `real/r.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | directory-name |
110
125
  | `./d*` | none | files-only |
111
126
  | `./*.log` | none | gitignore |
127
+ | `./ignored.log` | `ignored.log` | |
128
+ | `./{ignored,x}.log` | `ignored.log` | |
112
129
  | `./**/*.js` | `node_modules/pkg/index.js` | |
113
130
  | `./node_modules/*/index.js` | `node_modules/pkg/index.js` | |
114
131
  | `./docs/**/*.md` | `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md` | |
@@ -121,7 +138,7 @@ A test runs every row against dirsql as a path-table and, with the leading
121
138
 
122
139
  | Tag | Rule | Why |
123
140
  | --- | --- | --- |
124
- | `gitignore` | Inside a git repo, `.gitignore` files hide matching files and directories. `--no-ignore` turns it off. | A query over a repo should not drown in build output. |
141
+ | `gitignore` | Inside a git repo, `.gitignore` files hide files and directories a wildcard matches, never one the pattern spells out. `--no-ignore` turns it off. | A query over a repo should not drown in build output. |
125
142
  | `directory-name` | A pattern's last component that names a directory lists the files directly inside it, like `ls docs`. A trailing `/` is `*` appended. | A table is rows of files, and `ls` is the shell habit. |
126
143
  | `files-only` | A pattern that matches a directory but no file returns nothing. | Every row is a file. |
127
144
  | `absolute` | `/`, `~/` and `../` patterns report absolute `path` values, with `..` folded out textually. | The scanned root is derived from the pattern, so there is no relative base. |
@@ -144,6 +161,9 @@ stderr; the exit code is unchanged. Path-tables never warn.
144
161
  `{a..c}` expand, as do zero-padded
145
162
  `{01..10}` and stepped `{1..10..2}` ranges. Groups nest.
146
163
  - `\[` is a literal bracket.
164
+ - POSIX classes (`[[:alpha:]]`) match Unicode characters, as bash does in a UTF-8
165
+ locale: `[[:alpha:]]` matches `é` and `中`. `[[:digit:]]`, `[[:xdigit:]]` and
166
+ `[[:ascii:]]` stay ASCII.
147
167
  - A dot-named file or directory is listed only where a component spells the
148
168
  dot at that depth: `./**/.*` finds `docs/.draft.md` but does not enter
149
169
  `.config/`.
@@ -262,6 +262,9 @@ directory, deeper files override shallower ones, `!pattern` re-includes, and
262
262
  an ignored directory is pruned rather than walked. In a typical repo this
263
263
  excludes build output, virtualenvs, and caches with zero ceremony.
264
264
 
265
+ A `.gitignore` never hides a path the pattern spells out: `'./debug.log'` lists
266
+ that file even when `*.log` is ignored, while `'./*.log'` does not.
267
+
265
268
  A `.gitignore` is in force only when a directory holding `.git` encloses it.
266
269
  Outside a repo none applies, at the scan's start, above it or below it: a
267
270
  `~/.claude` whose `.gitignore` is `*` still lists its files when `~/.claude`
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_matchers_test.py -x -q",
3
+ "ran_at": 1791395236,
4
+ "exit_code": 0,
5
+ "commit": "b0d6654084056647e26fb061ad055ded511d5a2c",
6
+ "branch": "bot/1421-posix-unicode"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_one_level_test.py -x -q",
3
+ "ran_at": 1791398612,
4
+ "exit_code": 0,
5
+ "commit": "575ebdcb3e11ea49aefcd52ec2bff9c9a4990257",
6
+ "branch": "bot/1422-literal-gitignore"
7
+ }
@@ -0,0 +1,23 @@
1
+ ### Named paths ignore .gitignore
2
+
3
+ #### Summary
4
+
5
+ A path the pattern spells out is listed even when a .gitignore ignores it.
6
+
7
+ #### Required changes
8
+
9
+ _None._
10
+
11
+ #### Deprecations removed
12
+
13
+ _None._
14
+
15
+ #### Behavior changes without code changes
16
+
17
+ - A pattern with no wildcard, such as ./debug.log, lists the file even when .gitignore ignores it; wildcard matches are still filtered.
18
+
19
+ #### Verification
20
+
21
+ ```bash
22
+ dirsql query "SELECT path FROM './debug.log'"
23
+ ```
@@ -0,0 +1,23 @@
1
+ ### POSIX classes match Unicode characters
2
+
3
+ #### Summary
4
+
5
+ POSIX classes in globs match Unicode characters, as bash does in a UTF-8 locale.
6
+
7
+ #### Required changes
8
+
9
+ _None._
10
+
11
+ #### Deprecations removed
12
+
13
+ _None._
14
+
15
+ #### Behavior changes without code changes
16
+
17
+ - POSIX classes such as `[[:alpha:]]`, `[[:upper:]]` and `[[:punct:]]` match Unicode characters instead of ASCII only: `./[[:alpha:]].md` now matches `é.md`. `digit`, `xdigit` and `ascii` stay ASCII.
18
+
19
+ #### Verification
20
+
21
+ ```bash
22
+ dirsql query "SELECT path FROM './[[:alpha:]].md'"
23
+ ```
@@ -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.98"
9
+ version = "0.4.99"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -49,6 +49,13 @@ docs/nested/deep.md
49
49
  docs/nested/.cache/x.md
50
50
  node_modules/pkg/index.js
51
51
  real/r.md
52
+ uni/1.md
53
+ uni/a.md
54
+ uni/é.md
55
+ uni/É.md
56
+ uni/中.md
57
+ uni/٣.md
58
+ uni/¡.md
52
59
  linkdir -> real
53
60
  link.md -> top.md
54
61
  broken -> nowhere
@@ -69,13 +76,21 @@ A test runs every row against dirsql as a path-table and, with the leading
69
76
  | Pattern | Rows | Divergence |
70
77
  | --- | --- | --- |
71
78
  | `./*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `link.md`, `my file.md`, `top.md`, `{q}.md` | |
72
- | `./**/*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `linkdir/r.md`, `my file.md`, `real/r.md`, `top.md`, `{q}.md` | |
73
- | `./**` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `my file.md`, `node_modules/pkg/index.js`, `real/r.md`, `top.md`, `x.txt`, `{q}.md` | |
79
+ | `./**/*.md` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `linkdir/r.md`, `my file.md`, `real/r.md`, `top.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md`, `{q}.md` | |
80
+ | `./**` | `1.md`, `2.md`, `3.md`, `4.md`, `[a].md`, `[z.md`, `a.md`, `b.md`, `c.md`, `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md`, `link.md`, `my file.md`, `node_modules/pkg/index.js`, `real/r.md`, `top.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md`, `x.txt`, `{q}.md` | |
74
81
  | `./?.md` | `1.md`, `2.md`, `3.md`, `4.md`, `a.md`, `b.md`, `c.md` | |
75
82
  | `./[ab].md` | `a.md`, `b.md` | |
76
83
  | `./[!a].md` | `1.md`, `2.md`, `3.md`, `4.md`, `b.md`, `c.md` | |
77
84
  | `./\[a\].md` | `[a].md` | |
78
85
  | `./[z.md` | `[z.md` | |
86
+ | `./uni/[[:alpha:]].md` | `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
87
+ | `./uni/[[:alnum:]].md` | `uni/1.md`, `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
88
+ | `./uni/[[:lower:]].md` | `uni/a.md`, `uni/é.md` | |
89
+ | `./uni/[[:upper:]].md` | `uni/É.md` | |
90
+ | `./uni/[[:digit:]].md` | `uni/1.md` | |
91
+ | `./uni/[[:punct:]].md` | `uni/¡.md` | |
92
+ | `./uni/[[:word:]].md` | `uni/1.md`, `uni/a.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | |
93
+ | `./uni/[![:alpha:]].md` | `uni/1.md`, `uni/¡.md` | |
79
94
  | `./[d/x]ocs/api.md` | none | |
80
95
  | `./docs[/]api.md` | none | |
81
96
  | `./[!/]*/api.md` | none | |
@@ -106,9 +121,11 @@ A test runs every row against dirsql as a path-table and, with the leading
106
121
  | `./docs/*/../api.md` | `docs/nested/../api.md` | |
107
122
  | `./docs` | `docs/api.md`, `docs/guide.md` | directory-name |
108
123
  | `./docs/` | `docs/api.md`, `docs/guide.md` | directory-name |
109
- | `./*/` | `docs/api.md`, `docs/guide.md`, `linkdir/r.md`, `real/r.md` | directory-name |
124
+ | `./*/` | `docs/api.md`, `docs/guide.md`, `linkdir/r.md`, `real/r.md`, `uni/1.md`, `uni/a.md`, `uni/¡.md`, `uni/É.md`, `uni/é.md`, `uni/٣.md`, `uni/中.md` | directory-name |
110
125
  | `./d*` | none | files-only |
111
126
  | `./*.log` | none | gitignore |
127
+ | `./ignored.log` | `ignored.log` | |
128
+ | `./{ignored,x}.log` | `ignored.log` | |
112
129
  | `./**/*.js` | `node_modules/pkg/index.js` | |
113
130
  | `./node_modules/*/index.js` | `node_modules/pkg/index.js` | |
114
131
  | `./docs/**/*.md` | `docs/api.md`, `docs/guide.md`, `docs/nested/deep.md` | |
@@ -121,7 +138,7 @@ A test runs every row against dirsql as a path-table and, with the leading
121
138
 
122
139
  | Tag | Rule | Why |
123
140
  | --- | --- | --- |
124
- | `gitignore` | Inside a git repo, `.gitignore` files hide matching files and directories. `--no-ignore` turns it off. | A query over a repo should not drown in build output. |
141
+ | `gitignore` | Inside a git repo, `.gitignore` files hide files and directories a wildcard matches, never one the pattern spells out. `--no-ignore` turns it off. | A query over a repo should not drown in build output. |
125
142
  | `directory-name` | A pattern's last component that names a directory lists the files directly inside it, like `ls docs`. A trailing `/` is `*` appended. | A table is rows of files, and `ls` is the shell habit. |
126
143
  | `files-only` | A pattern that matches a directory but no file returns nothing. | Every row is a file. |
127
144
  | `absolute` | `/`, `~/` and `../` patterns report absolute `path` values, with `..` folded out textually. | The scanned root is derived from the pattern, so there is no relative base. |
@@ -144,6 +161,9 @@ stderr; the exit code is unchanged. Path-tables never warn.
144
161
  `{a..c}` expand, as do zero-padded
145
162
  `{01..10}` and stepped `{1..10..2}` ranges. Groups nest.
146
163
  - `\[` is a literal bracket.
164
+ - POSIX classes (`[[:alpha:]]`) match Unicode characters, as bash does in a UTF-8
165
+ locale: `[[:alpha:]]` matches `é` and `中`. `[[:digit:]]`, `[[:xdigit:]]` and
166
+ `[[:ascii:]]` stay ASCII.
147
167
  - A dot-named file or directory is listed only where a component spells the
148
168
  dot at that depth: `./**/.*` finds `docs/.draft.md` but does not enter
149
169
  `.config/`.
@@ -262,6 +262,9 @@ directory, deeper files override shallower ones, `!pattern` re-includes, and
262
262
  an ignored directory is pruned rather than walked. In a typical repo this
263
263
  excludes build output, virtualenvs, and caches with zero ceremony.
264
264
 
265
+ A `.gitignore` never hides a path the pattern spells out: `'./debug.log'` lists
266
+ that file even when `*.log` is ignored, while `'./*.log'` does not.
267
+
265
268
  A `.gitignore` is in force only when a directory holding `.git` encloses it.
266
269
  Outside a repo none applies, at the scan's start, above it or below it: a
267
270
  `~/.claude` whose `.gitignore` is `*` still lists its files when `~/.claude`
@@ -1,4 +1,4 @@
1
- use crate::posix_class::expand_posix_classes;
1
+ use crate::posix_class::{class_regex, expand_posix_classes};
2
2
  use crate::scanner::{PathGlob, compile_glob, compile_globs};
3
3
  use globset::GlobBuilder;
4
4
  use regex::{Regex, RegexBuilder};
@@ -63,7 +63,10 @@ fn unicode_regex(byte_regex: &str) -> String {
63
63
  [] => break,
64
64
  }
65
65
  }
66
- String::from_utf8_lossy(&out).into_owned()
66
+ String::from_utf8_lossy(&out)
67
+ .chars()
68
+ .map(|c| class_regex(c).unwrap_or_else(|| c.to_string()))
69
+ .collect()
67
70
  }
68
71
 
69
72
  fn hex_byte(digits: [u8; 2]) -> u8 {
@@ -459,4 +462,67 @@ mod tests {
459
462
  assert_eq!(names(&matcher, "notes/7.md"), vec!["n"]);
460
463
  assert!(matcher.match_all(Path::new("notes/x.md")).is_empty());
461
464
  }
465
+
466
+ #[test]
467
+ fn a_posix_class_matches_non_ascii_characters() {
468
+ let matcher = TableMatcher::new(
469
+ &[
470
+ ("a/[[:alpha:]].md", "alpha"),
471
+ ("l/[[:lower:]].md", "lower"),
472
+ ("u/[[:upper:]].md", "upper"),
473
+ ("p/[[:punct:]].md", "punct"),
474
+ ],
475
+ &[],
476
+ )
477
+ .unwrap();
478
+ assert_eq!(names(&matcher, "a/\u{e9}.md"), vec!["alpha"]);
479
+ assert_eq!(names(&matcher, "a/\u{4e2d}.md"), vec!["alpha"]);
480
+ assert_eq!(names(&matcher, "l/\u{e9}.md"), vec!["lower"]);
481
+ assert_eq!(names(&matcher, "u/\u{c9}.md"), vec!["upper"]);
482
+ assert_eq!(names(&matcher, "p/\u{a1}.md"), vec!["punct"]);
483
+ assert!(matcher.match_all(Path::new("l/\u{c9}.md")).is_empty());
484
+ }
485
+
486
+ #[test]
487
+ fn every_posix_class_follows_unicode() {
488
+ let cases = [
489
+ ("alnum", "\u{e9}", "\u{b2}"),
490
+ ("alpha", "\u{663}", "1"),
491
+ ("blank", "\u{3000}", "\u{a0}"),
492
+ ("cntrl", "\u{85}", "\u{ad}"),
493
+ ("graph", "\u{a0}", "\u{3000}"),
494
+ ("lower", "\u{1c5}", "\u{c9}"),
495
+ ("print", "\u{3000}", "\u{85}"),
496
+ ("punct", "\u{301}", "\u{e9}"),
497
+ ("space", "\u{2003}", "\u{a0}"),
498
+ ("upper", "\u{1c5}", "\u{e9}"),
499
+ ("word", "\u{4e2d}", "\u{b2}"),
500
+ ("digit", "7", "\u{663}"),
501
+ ("xdigit", "f", "\u{ff46}"),
502
+ ("ascii", "a", "\u{e9}"),
503
+ ];
504
+ for (class, member, outsider) in cases {
505
+ let matcher =
506
+ TableMatcher::new(&[(format!("[[:{class}:]]").as_str(), "c")], &[]).unwrap();
507
+ assert_eq!(names(&matcher, member), vec!["c"], "{class} {member}");
508
+ assert!(
509
+ matcher.match_all(Path::new(outsider)).is_empty(),
510
+ "{class} {outsider}"
511
+ );
512
+ }
513
+ }
514
+
515
+ #[test]
516
+ fn a_posix_class_never_matches_the_separator() {
517
+ let matcher = TableMatcher::new(&[("a[[:punct:]]b", "c")], &[]).unwrap();
518
+ assert_eq!(names(&matcher, "a.b"), vec!["c"]);
519
+ assert!(matcher.match_all(Path::new("a/b")).is_empty());
520
+ }
521
+
522
+ #[test]
523
+ fn a_negated_posix_class_matches_the_other_unicode_characters() {
524
+ let matcher = TableMatcher::new(&[("[![:alpha:]].md", "c")], &[]).unwrap();
525
+ assert_eq!(names(&matcher, "\u{a1}.md"), vec!["c"]);
526
+ assert!(matcher.match_all(Path::new("\u{e9}.md")).is_empty());
527
+ }
462
528
  }
@@ -60,7 +60,7 @@ fn bracket(chars: &[char], start: usize) -> Option<(usize, Option<String>)> {
60
60
  break;
61
61
  }
62
62
  if let Some((name, next)) = class_at(chars, j) {
63
- ranges.extend_from_slice(class_ranges(&name));
63
+ ranges.extend(class_ranges(&name));
64
64
  has_class = true;
65
65
  j = next;
66
66
  continue;
@@ -111,24 +111,58 @@ fn class_at(chars: &[char], j: usize) -> Option<(String, usize)> {
111
111
  }
112
112
  }
113
113
 
114
- /// The ASCII members of a class; an unknown name has none, as in bash.
115
- fn class_ranges(name: &str) -> &'static [(char, char)] {
114
+ /// Classes whose members are Unicode characters, in glibc's `C.utf8`: each is
115
+ /// a regex bracket expression, stood in for inside the rewritten bracket by
116
+ /// one noncharacter that [`class_regex`] turns back into it.
117
+ const UNICODE_CLASSES: [(&str, &str); 11] = [
118
+ ("alnum", r"[\p{Alphabetic}\p{Nd}]"),
119
+ ("alpha", r"[\p{Alphabetic}\p{Nd}--0-9]"),
120
+ ("blank", r"[\p{Zs}\t--\u{a0}\u{2007}\u{202f}]"),
121
+ ("cntrl", r"[\p{Cc}\u{2028}\u{2029}]"),
122
+ (
123
+ "graph",
124
+ r"[[^\p{White_Space}\p{Cc}\p{Unassigned}]\u{a0}\u{2007}\u{202f}]",
125
+ ),
126
+ ("lower", r"[\p{Lowercase}\u{1c5}\u{1c8}\u{1cb}\u{1f2}]"),
127
+ ("print", r"[^\p{Cc}\p{Unassigned}\u{2028}\u{2029}]"),
128
+ (
129
+ "punct",
130
+ r"[[[^\p{White_Space}\p{Cc}\p{Unassigned}]\u{a0}\u{2007}\u{202f}]--[\p{Alphabetic}\p{Nd}]]",
131
+ ),
132
+ ("space", r"[\p{White_Space}--\u{a0}\u{2007}\u{202f}\u{85}]"),
133
+ ("upper", r"[\p{Uppercase}\p{Lt}]"),
134
+ ("word", r"[\p{Alphabetic}\p{Nd}_]"),
135
+ ];
136
+
137
+ /// The first noncharacter, which no path holds.
138
+ const MARKER_BASE: u32 = 0xFDD0;
139
+
140
+ fn marker(index: usize) -> char {
141
+ let offset = u32::try_from(index).expect("a class index fits in u32");
142
+ char::from_u32(MARKER_BASE + offset).expect("noncharacters are chars")
143
+ }
144
+
145
+ /// The regex a marker stands for, as a bracket expression that leaves out
146
+ /// the separator, since a bracket never matches `/`.
147
+ pub(crate) fn class_regex(marker_char: char) -> Option<String> {
148
+ UNICODE_CLASSES
149
+ .iter()
150
+ .enumerate()
151
+ .find(|&(index, _)| marker(index) == marker_char)
152
+ .map(|(_, (_, regex))| format!("[{regex}--/]"))
153
+ }
154
+
155
+ /// The members of a class; an unknown name has none, as in bash.
156
+ fn class_ranges(name: &str) -> Vec<(char, char)> {
116
157
  match name {
117
- "alnum" => &[('0', '9'), ('A', 'Z'), ('a', 'z')],
118
- "alpha" => &[('A', 'Z'), ('a', 'z')],
119
- "ascii" => &[('\0', '\x7f')],
120
- "blank" => &[(' ', ' '), ('\t', '\t')],
121
- "cntrl" => &[('\0', '\x1f'), ('\x7f', '\x7f')],
122
- "digit" => &[('0', '9')],
123
- "graph" => &[('!', '~')],
124
- "lower" => &[('a', 'z')],
125
- "print" => &[(' ', '~')],
126
- "punct" => &[('!', '/'), (':', '@'), ('[', '`'), ('{', '~')],
127
- "space" => &[('\t', '\r'), (' ', ' ')],
128
- "upper" => &[('A', 'Z')],
129
- "word" => &[('0', '9'), ('A', 'Z'), ('a', 'z'), ('_', '_')],
130
- "xdigit" => &[('0', '9'), ('A', 'F'), ('a', 'f')],
131
- _ => &[],
158
+ "ascii" => vec![('\0', '\x7f')],
159
+ "digit" => vec![('0', '9')],
160
+ "xdigit" => vec![('0', '9'), ('A', 'F'), ('a', 'f')],
161
+ _ => UNICODE_CLASSES
162
+ .iter()
163
+ .position(|(known, _)| *known == name)
164
+ .map(|index| vec![(marker(index), marker(index))])
165
+ .unwrap_or_default(),
132
166
  }
133
167
  }
134
168
 
@@ -192,30 +226,46 @@ fn without(set: Vec<(u32, u32)>, c: char) -> Vec<(u32, u32)> {
192
226
 
193
227
  #[cfg(test)]
194
228
  mod tests {
229
+ #[test]
230
+ fn markers_count_up_from_the_first_noncharacter() {
231
+ assert_eq!(marker(0), '\u{fdd0}');
232
+ assert_eq!(marker(2), '\u{fdd2}');
233
+ }
234
+
195
235
  use super::*;
196
236
 
237
+ fn marked(name: &str) -> char {
238
+ let index = UNICODE_CLASSES
239
+ .iter()
240
+ .position(|(known, _)| *known == name)
241
+ .unwrap();
242
+ marker(index)
243
+ }
244
+
197
245
  #[test]
198
246
  fn a_class_becomes_its_ranges() {
199
247
  assert_eq!(expand_posix_classes("[[:digit:]].md"), "[0-9].md");
200
- assert_eq!(expand_posix_classes("[[:upper:]]*"), "[A-Z]*");
248
+ assert_eq!(
249
+ expand_posix_classes("[[:upper:]]*"),
250
+ format!("[{}]*", marked("upper"))
251
+ );
201
252
  }
202
253
 
203
254
  #[test]
204
255
  fn every_named_class_expands() {
256
+ for name in [
257
+ "alnum", "alpha", "blank", "cntrl", "graph", "lower", "print", "punct", "space",
258
+ "upper", "word",
259
+ ] {
260
+ assert_eq!(
261
+ expand_posix_classes(&format!("[[:{name}:]]")),
262
+ format!("[{}]", marked(name)),
263
+ "{name}"
264
+ );
265
+ }
205
266
  let cases = [
206
- ("alnum", "[0-9A-Za-z]"),
207
- ("alpha", "[A-Za-z]"),
208
267
  ("ascii", "[]\0- \"-,.0-\\_-\x7f!^-]"),
209
- ("blank", "[\t ]"),
210
- ("cntrl", "[\0-\x1f\x7f]"),
211
268
  ("digit", "[0-9]"),
212
- ("graph", "[]\"-,.0-\\_-~!^-]"),
213
- ("lower", "[a-z]"),
214
- ("print", "[] \"-,.0-\\_-~!^-]"),
215
- ("punct", "[]\"-,.:-@[-\\_-`{-~!^-]"),
216
- ("space", "[\t-\r ]"),
217
- ("upper", "[A-Z]"),
218
- ("word", "[0-9A-Z_a-z]"),
219
269
  ("xdigit", "[0-9A-Fa-f]"),
220
270
  ];
221
271
  for (name, want) in cases {
@@ -227,6 +277,14 @@ mod tests {
227
277
  }
228
278
  }
229
279
 
280
+ #[test]
281
+ fn every_marker_names_its_class_regex() {
282
+ for (index, (_, regex)) in UNICODE_CLASSES.iter().enumerate() {
283
+ assert_eq!(class_regex(marker(index)), Some(format!("[{regex}--/]")));
284
+ }
285
+ assert_eq!(class_regex('a'), None);
286
+ }
287
+
230
288
  #[test]
231
289
  fn a_negated_class_also_excludes_the_separator() {
232
290
  assert_eq!(expand_posix_classes("[![:digit:]]"), "[!/0-9]");
@@ -236,7 +294,10 @@ mod tests {
236
294
  #[test]
237
295
  fn classes_and_characters_combine() {
238
296
  assert_eq!(expand_posix_classes("[a[:digit:]]"), "[0-9a]");
239
- assert_eq!(expand_posix_classes("[[:digit:][:upper:]]"), "[0-9A-Z]");
297
+ assert_eq!(
298
+ expand_posix_classes("[[:digit:][:upper:]]"),
299
+ format!("[0-9{}]", marked("upper"))
300
+ );
240
301
  assert_eq!(expand_posix_classes("[[:digit:]x-z]"), "[0-9x-z]");
241
302
  }
242
303