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.
- {dirsql-0.4.98 → dirsql-0.4.99}/Cargo.lock +2 -2
- {dirsql-0.4.98 → dirsql-0.4.99}/PKG-INFO +1 -1
- {dirsql-0.4.98/packages/python → dirsql-0.4.99}/docs/reference/glob.md +24 -4
- {dirsql-0.4.98/packages/rust → dirsql-0.4.99}/docs/reference/path-tables.md +3 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/Cargo.toml +1 -1
- dirsql-0.4.99/packages/python/changelog.d/2026-10-07-literal-gitignore.md +3 -0
- dirsql-0.4.99/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +3 -0
- {dirsql-0.4.98 → dirsql-0.4.99/packages/python}/docs/reference/glob.md +24 -4
- {dirsql-0.4.98 → dirsql-0.4.99/packages/python}/docs/reference/path-tables.md +3 -0
- dirsql-0.4.99/packages/python/e2e-attestations/bot-1421-posix-unicode.json +7 -0
- dirsql-0.4.99/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +7 -0
- dirsql-0.4.99/packages/python/migrations.d/2026-10-07-literal-gitignore.md +23 -0
- dirsql-0.4.99/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +23 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/glob.md +24 -4
- {dirsql-0.4.98/packages/python → dirsql-0.4.99/packages/rust}/docs/reference/path-tables.md +3 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/matcher.rs +68 -2
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/posix_class.rs +92 -31
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/scanner.rs +37 -2
- {dirsql-0.4.98 → dirsql-0.4.99}/Cargo.toml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/README.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/_async.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/py.typed +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/read_config.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/AGENTS.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/recipes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/context/usage.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/explanation.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/getting-started.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/embed.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/persist.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/index.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/package.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/plugins.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/cli.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/columns.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/http-api.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/docs/reference/sdk.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/README.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-fix-main-build.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/conftest.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/cli.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/http-api.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/docs/reference/sdk.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-fix-main-build.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/README.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/cli.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/http-api.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/docs/reference/sdk.md +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/router.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/run.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/server.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/db.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/lib.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/on_file.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/path_table.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/tree_walk.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/vtab.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/vtab_scaffold.rs +0 -0
- {dirsql-0.4.98 → dirsql-0.4.99}/packages/rust/src/watcher.rs +0 -0
- {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.
|
|
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.
|
|
628
|
+
version = "0.4.99"
|
|
629
629
|
dependencies = [
|
|
630
630
|
"dirsql",
|
|
631
631
|
"pyo3",
|
|
@@ -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
|
|
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.
|
|
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
|
|
@@ -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
|
|
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,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.
|
|
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
|
|
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)
|
|
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.
|
|
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
|
-
///
|
|
115
|
-
|
|
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
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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!(
|
|
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!(
|
|
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
|
|