dirsql 0.4.88__tar.gz → 0.4.90__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.88 → dirsql-0.4.90}/Cargo.lock +2 -2
- {dirsql-0.4.88 → dirsql-0.4.90}/PKG-INFO +1 -1
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/Cargo.toml +1 -1
- dirsql-0.4.90/packages/python/changelog.d/2026-10-06-config-braces.md +3 -0
- dirsql-0.4.90/packages/python/changelog.d/2026-10-06-config-directory.md +3 -0
- dirsql-0.4.90/packages/python/e2e-attestations/claude-1258-config-braces.json +7 -0
- dirsql-0.4.90/packages/python/e2e-attestations/claude-1258-config-directory.json +7 -0
- dirsql-0.4.90/packages/python/migrations.d/2026-10-06-config-braces.md +40 -0
- dirsql-0.4.90/packages/python/migrations.d/2026-10-06-config-directory.md +39 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/lib.rs +4 -81
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/matcher.rs +4 -178
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/path_table.rs +50 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/Cargo.toml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/README.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/_async.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/py.typed +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/read_config.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/AGENTS.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/context/recipes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/context/usage.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/explanation.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/getting-started.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/embed.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/persist.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/index.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/package.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/plugins.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/reference/cli.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/reference/columns.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/reference/config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/reference/http-api.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/docs/reference/sdk.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/README.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/conftest.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/reference/cli.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/reference/http-api.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/docs/reference/sdk.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/README.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/reference/cli.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/reference/http-api.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/docs/reference/sdk.md +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/router.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/run.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/server.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/db.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/on_file.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/scanner.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/tree_walk.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/vtab.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/vtab_scaffold.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/packages/rust/src/watcher.rs +0 -0
- {dirsql-0.4.88 → dirsql-0.4.90}/pyproject.toml +0 -0
|
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
|
|
|
552
552
|
|
|
553
553
|
[[package]]
|
|
554
554
|
name = "dirsql"
|
|
555
|
-
version = "0.4.
|
|
555
|
+
version = "0.4.90"
|
|
556
556
|
dependencies = [
|
|
557
557
|
"assert_cmd",
|
|
558
558
|
"axum",
|
|
@@ -603,7 +603,7 @@ dependencies = [
|
|
|
603
603
|
|
|
604
604
|
[[package]]
|
|
605
605
|
name = "dirsql-py-ext"
|
|
606
|
-
version = "0.4.
|
|
606
|
+
version = "0.4.90"
|
|
607
607
|
dependencies = [
|
|
608
608
|
"dirsql",
|
|
609
609
|
"pyo3",
|
|
@@ -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.90"
|
|
8
8
|
# abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
|
|
9
9
|
# `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
|
|
10
10
|
# (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791333540,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "37586d9320ebca5d4be159cfe3a523ebcf017884",
|
|
6
|
+
"branch": "claude/1258-config-braces"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791331926,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "04430dd3eae48a6936b5ff45c9c51a38900fbacc",
|
|
6
|
+
"branch": "claude/1258-config-directory"
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
### A braced name in a config glob is a literal
|
|
2
|
+
|
|
3
|
+
#### Summary
|
|
4
|
+
|
|
5
|
+
`glob = "data/{id}/metadata.json"` used to treat `{id}` as `*`. It now matches
|
|
6
|
+
a directory literally named `{id}`. `{a,b}` alternation is unchanged. A column
|
|
7
|
+
named like a `{name}` no longer errors at load.
|
|
8
|
+
|
|
9
|
+
#### Required changes
|
|
10
|
+
|
|
11
|
+
| Before | After |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `glob = "data/{id}/metadata.json"` | `glob = "data/*/metadata.json"` |
|
|
14
|
+
|
|
15
|
+
#### Deprecations removed
|
|
16
|
+
|
|
17
|
+
- The `CaptureColumnCollision` error: a `{name}` is no longer a capture, so
|
|
18
|
+
nothing can collide.
|
|
19
|
+
|
|
20
|
+
#### Behavior changes without code changes
|
|
21
|
+
|
|
22
|
+
- A config that kept `{name}` in a glob stops matching files and loads no rows.
|
|
23
|
+
|
|
24
|
+
#### Verification
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd "$(mktemp -d)"
|
|
28
|
+
mkdir -p 'data/{id}' data/x
|
|
29
|
+
echo '[{"p":"lit"}]' > 'data/{id}/m.json'
|
|
30
|
+
echo '[{"p":"other"}]' > data/x/m.json
|
|
31
|
+
cat > .dirsql.toml <<'TOML'
|
|
32
|
+
[[table]]
|
|
33
|
+
name = "t"
|
|
34
|
+
glob = "data/{id}/m.json"
|
|
35
|
+
ddl = "CREATE TABLE t (p TEXT)"
|
|
36
|
+
on-file = "jq -sc add"
|
|
37
|
+
TOML
|
|
38
|
+
dirsql query "SELECT p FROM t" -c .dirsql.toml
|
|
39
|
+
# expected: [{"p":"lit"}]
|
|
40
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
### A config glob naming a directory lists its files
|
|
2
|
+
|
|
3
|
+
#### Summary
|
|
4
|
+
|
|
5
|
+
`glob = "docs"` used to match nothing, because no file is named `docs`. It now
|
|
6
|
+
lists the files directly inside `docs`, as `FROM './docs'` does. A config that
|
|
7
|
+
relied on the empty result gains rows.
|
|
8
|
+
|
|
9
|
+
#### Required changes
|
|
10
|
+
|
|
11
|
+
| Before | After |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `glob = "docs"` (no rows) | `glob = "docs"` lists `docs/*`; write `docs/**` for every depth |
|
|
14
|
+
|
|
15
|
+
#### Deprecations removed
|
|
16
|
+
|
|
17
|
+
_None._
|
|
18
|
+
|
|
19
|
+
#### Behavior changes without code changes
|
|
20
|
+
|
|
21
|
+
- A glob with no wildcard that names a directory expands to `<dir>/*`.
|
|
22
|
+
- A glob with no wildcard that names a file still names only that file.
|
|
23
|
+
|
|
24
|
+
#### Verification
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd "$(mktemp -d)"
|
|
28
|
+
mkdir docs
|
|
29
|
+
echo '[{"p":"a"}]' > docs/a.json
|
|
30
|
+
cat > .dirsql.toml <<'TOML'
|
|
31
|
+
[[table]]
|
|
32
|
+
name = "t"
|
|
33
|
+
glob = "docs"
|
|
34
|
+
ddl = "CREATE TABLE t (p TEXT)"
|
|
35
|
+
on-file = "jq -sc add"
|
|
36
|
+
TOML
|
|
37
|
+
dirsql query "SELECT p FROM t" -c .dirsql.toml
|
|
38
|
+
# expected: [{"p":"a"}]
|
|
39
|
+
```
|
|
@@ -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.90"
|
|
10
10
|
edition.workspace = true
|
|
11
11
|
# Literal `license` (not `license.workspace = true`) because
|
|
12
12
|
# putitoutthere's preflight check reads `[package].license` directly
|
|
@@ -199,14 +199,6 @@ pub enum DirSqlError {
|
|
|
199
199
|
source: Option<BoxError>,
|
|
200
200
|
},
|
|
201
201
|
|
|
202
|
-
#[error(
|
|
203
|
-
"glob capture `{{{placeholder}}}` collides with declared column `{column}`: \
|
|
204
|
-
captures no longer populate columns, so `{column}` would always be NULL. \
|
|
205
|
-
Remove `{column}` from the table's DDL, or emit its value from the on-file \
|
|
206
|
-
hook by splitting the path yourself."
|
|
207
|
-
)]
|
|
208
|
-
CaptureColumnCollision { placeholder: String, column: String },
|
|
209
|
-
|
|
210
202
|
#[error(
|
|
211
203
|
"query() only accepts read-only statements; SQLite classified this statement as a write"
|
|
212
204
|
)]
|
|
@@ -1323,18 +1315,6 @@ impl DirSQL {
|
|
|
1323
1315
|
eprintln!("{warning}");
|
|
1324
1316
|
}
|
|
1325
1317
|
}
|
|
1326
|
-
// Reject a `{name}` glob placeholder whose name is also a declared
|
|
1327
|
-
// column: captures no longer populate columns, so it would read
|
|
1328
|
-
// NULL forever. The table exists here either way (freshly created
|
|
1329
|
-
// or restored from cache), so its columns are knowable, and this
|
|
1330
|
-
// runs before any file is ingested — a load-time failure.
|
|
1331
|
-
let declared_columns = db.get_table_columns(&table_name).map_err(map_db_error)?;
|
|
1332
|
-
if let Some(name) = find_capture_column_collision(&table.glob, &declared_columns) {
|
|
1333
|
-
return Err(DirSqlError::CaptureColumnCollision {
|
|
1334
|
-
placeholder: name.clone(),
|
|
1335
|
-
column: name,
|
|
1336
|
-
});
|
|
1337
|
-
}
|
|
1338
1318
|
on_file_map.insert(table_name.clone(), table.hook);
|
|
1339
1319
|
strict_map.insert(table_name.clone(), table.strict);
|
|
1340
1320
|
ddl_map.insert(table_name, table.ddl);
|
|
@@ -2011,7 +1991,10 @@ fn compile_groups(
|
|
|
2011
1991
|
}
|
|
2012
1992
|
None => root.to_path_buf(),
|
|
2013
1993
|
};
|
|
2014
|
-
let mapping = (
|
|
1994
|
+
let mapping = (
|
|
1995
|
+
path_table::directory_as_glob(&table.glob, &anchor, &|p| p.is_dir()),
|
|
1996
|
+
table_name.clone(),
|
|
1997
|
+
);
|
|
2015
1998
|
match grouped
|
|
2016
1999
|
.iter_mut()
|
|
2017
2000
|
.find(|(a, i, _)| *a == anchor && *i == table.ignore)
|
|
@@ -2516,18 +2499,6 @@ pub(crate) fn json_to_value(value: &serde_json::Value) -> Value {
|
|
|
2516
2499
|
}
|
|
2517
2500
|
}
|
|
2518
2501
|
|
|
2519
|
-
/// Returns the first `{name}` placeholder in `glob` whose name is also one of
|
|
2520
|
-
/// `declared_columns`. `None` when the glob has no placeholders or none of
|
|
2521
|
-
/// them names a declared column. Pure: the sole input is the glob string and
|
|
2522
|
-
/// the column list, so it is exhaustively unit-testable.
|
|
2523
|
-
fn find_capture_column_collision(glob: &str, declared_columns: &[String]) -> Option<String> {
|
|
2524
|
-
let declared: std::collections::HashSet<&str> =
|
|
2525
|
-
declared_columns.iter().map(String::as_str).collect();
|
|
2526
|
-
crate::matcher::placeholder_names(glob)
|
|
2527
|
-
.into_iter()
|
|
2528
|
-
.find(|name| declared.contains(name.as_str()))
|
|
2529
|
-
}
|
|
2530
|
-
|
|
2531
2502
|
/// Async wrapper around [`DirSQL`] whose constructor returns immediately while
|
|
2532
2503
|
/// the initial scan runs on a background thread.
|
|
2533
2504
|
///
|
|
@@ -4503,54 +4474,6 @@ mod internal_tests {
|
|
|
4503
4474
|
assert_eq!(deleted, vec![("gone.txt".to_string(), "t".to_string())]);
|
|
4504
4475
|
}
|
|
4505
4476
|
|
|
4506
|
-
#[test]
|
|
4507
|
-
fn find_capture_column_collision_flags_a_placeholder_naming_a_column() {
|
|
4508
|
-
let declared = vec!["thread_id".to_string(), "basename".to_string()];
|
|
4509
|
-
assert_eq!(
|
|
4510
|
-
find_capture_column_collision("_comments/{thread_id}/*.txt", &declared),
|
|
4511
|
-
Some("thread_id".to_string())
|
|
4512
|
-
);
|
|
4513
|
-
}
|
|
4514
|
-
|
|
4515
|
-
#[test]
|
|
4516
|
-
fn find_capture_column_collision_ignores_a_placeholder_with_no_column() {
|
|
4517
|
-
let declared = vec!["path".to_string(), "basename".to_string()];
|
|
4518
|
-
assert_eq!(
|
|
4519
|
-
find_capture_column_collision("_comments/{thread_id}/*.txt", &declared),
|
|
4520
|
-
None
|
|
4521
|
-
);
|
|
4522
|
-
}
|
|
4523
|
-
|
|
4524
|
-
#[test]
|
|
4525
|
-
fn find_capture_column_collision_none_without_placeholders() {
|
|
4526
|
-
let declared = vec!["thread_id".to_string()];
|
|
4527
|
-
assert_eq!(
|
|
4528
|
-
find_capture_column_collision("_comments/*/*.txt", &declared),
|
|
4529
|
-
None
|
|
4530
|
-
);
|
|
4531
|
-
}
|
|
4532
|
-
|
|
4533
|
-
#[test]
|
|
4534
|
-
fn find_capture_column_collision_returns_first_colliding_placeholder() {
|
|
4535
|
-
let declared = vec!["repo".to_string(), "org".to_string()];
|
|
4536
|
-
assert_eq!(
|
|
4537
|
-
find_capture_column_collision("{org}/{repo}/data.json", &declared),
|
|
4538
|
-
Some("org".to_string())
|
|
4539
|
-
);
|
|
4540
|
-
}
|
|
4541
|
-
|
|
4542
|
-
#[test]
|
|
4543
|
-
fn capture_column_collision_error_names_placeholder_and_fix() {
|
|
4544
|
-
let err = DirSqlError::CaptureColumnCollision {
|
|
4545
|
-
placeholder: "thread_id".to_string(),
|
|
4546
|
-
column: "thread_id".to_string(),
|
|
4547
|
-
};
|
|
4548
|
-
let msg = err.to_string();
|
|
4549
|
-
assert!(msg.contains("thread_id"));
|
|
4550
|
-
assert!(msg.contains("collides"));
|
|
4551
|
-
assert!(msg.contains("on-file"));
|
|
4552
|
-
}
|
|
4553
|
-
|
|
4554
4477
|
/// A `name` the batch never created: the error has to say what it *did*
|
|
4555
4478
|
/// create, or a typo gives the reader nothing to compare against.
|
|
4556
4479
|
#[test]
|
|
@@ -79,8 +79,6 @@ pub struct MatchResult {
|
|
|
79
79
|
pub table_name: String,
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
/// A compiled glob pattern. `{name}` placeholders are rewritten to `*` before
|
|
83
|
-
/// compilation, so they are pure match wildcards.
|
|
84
82
|
#[derive(Clone)]
|
|
85
83
|
struct PatternEntry {
|
|
86
84
|
pattern: PathGlob,
|
|
@@ -100,72 +98,13 @@ pub struct TableMatcher {
|
|
|
100
98
|
gitignore: bool,
|
|
101
99
|
}
|
|
102
100
|
|
|
103
|
-
/// Byte spans of the `{name}` placeholders in `pattern`, in order: `(start,
|
|
104
|
-
/// end, name)` with `end` past the closing brace.
|
|
105
|
-
///
|
|
106
|
-
/// The grammar is exactly `{` `[a-zA-Z_][a-zA-Z0-9_]*` `}`. Anything else --
|
|
107
|
-
/// `{}`, `{1a}`, `{a-b}`, an unclosed `{` -- is not a placeholder and is left
|
|
108
|
-
/// alone, matching the leftmost-first, non-overlapping scan the equivalent
|
|
109
|
-
/// regex performed.
|
|
110
|
-
fn placeholder_spans(pattern: &str) -> Vec<(usize, usize, String)> {
|
|
111
|
-
let bytes = pattern.as_bytes();
|
|
112
|
-
let mut spans = Vec::new();
|
|
113
|
-
let mut i = 0;
|
|
114
|
-
while i < bytes.len() {
|
|
115
|
-
if bytes[i] == b'{' {
|
|
116
|
-
let mut j = i + 1;
|
|
117
|
-
if j < bytes.len() && (bytes[j].is_ascii_alphabetic() || bytes[j] == b'_') {
|
|
118
|
-
j += 1;
|
|
119
|
-
while j < bytes.len() && (bytes[j].is_ascii_alphanumeric() || bytes[j] == b'_') {
|
|
120
|
-
j += 1;
|
|
121
|
-
}
|
|
122
|
-
if j < bytes.len() && bytes[j] == b'}' {
|
|
123
|
-
// Every byte in `i..=j` is ASCII, so these are char boundaries.
|
|
124
|
-
spans.push((i, j + 1, pattern[i + 1..j].to_string()));
|
|
125
|
-
i = j + 1;
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
i += 1;
|
|
131
|
-
}
|
|
132
|
-
spans
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/// Names of the `{name}` placeholders in `pattern`, in order of appearance.
|
|
136
|
-
pub fn placeholder_names(pattern: &str) -> Vec<String> {
|
|
137
|
-
placeholder_spans(pattern)
|
|
138
|
-
.into_iter()
|
|
139
|
-
.map(|(_, _, name)| name)
|
|
140
|
-
.collect()
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/// Rewrite `{name}` placeholders in a glob to `*`, so they match a single path
|
|
144
|
-
/// segment without producing any captured value.
|
|
145
|
-
fn glob_with_placeholders_as_star(pattern: &str) -> String {
|
|
146
|
-
let spans = placeholder_spans(pattern);
|
|
147
|
-
if spans.is_empty() {
|
|
148
|
-
return pattern.to_string();
|
|
149
|
-
}
|
|
150
|
-
let mut out = String::with_capacity(pattern.len());
|
|
151
|
-
let mut last = 0;
|
|
152
|
-
for (start, end, _) in spans {
|
|
153
|
-
out.push_str(&pattern[last..start]);
|
|
154
|
-
out.push('*');
|
|
155
|
-
last = end;
|
|
156
|
-
}
|
|
157
|
-
out.push_str(&pattern[last..]);
|
|
158
|
-
out
|
|
159
|
-
}
|
|
160
|
-
|
|
161
101
|
impl TableMatcher {
|
|
162
102
|
/// Build a new matcher from (glob_pattern, table_name) pairs and ignore patterns.
|
|
163
|
-
/// Glob patterns may contain `{name}` placeholders, which match like `*`.
|
|
164
103
|
pub fn new(mappings: &[(&str, &str)], ignore_patterns: &[&str]) -> Result<Self, GlobError> {
|
|
165
104
|
let mut entries = Vec::new();
|
|
166
105
|
for (pattern, table_name) in mappings {
|
|
167
106
|
entries.push(PatternEntry {
|
|
168
|
-
pattern: compile_glob(
|
|
107
|
+
pattern: compile_glob(pattern)?,
|
|
169
108
|
table_name: table_name.to_string(),
|
|
170
109
|
});
|
|
171
110
|
}
|
|
@@ -273,20 +212,6 @@ mod tests {
|
|
|
273
212
|
);
|
|
274
213
|
}
|
|
275
214
|
|
|
276
|
-
#[test]
|
|
277
|
-
fn placeholder_glob_matches_like_a_star() {
|
|
278
|
-
// A `{name}` placeholder and a `*` compile to the same matcher: both
|
|
279
|
-
// globs match exactly the same file.
|
|
280
|
-
let placeholder = TableMatcher::new(&[("data/{id}/metadata.json", "a")], &[]).unwrap();
|
|
281
|
-
let star = TableMatcher::new(&[("data/*/metadata.json", "a")], &[]).unwrap();
|
|
282
|
-
let path = Path::new("data/x/metadata.json");
|
|
283
|
-
assert_eq!(names(&placeholder, "data/x/metadata.json"), vec!["a"]);
|
|
284
|
-
assert_eq!(
|
|
285
|
-
placeholder.match_all(path).is_empty(),
|
|
286
|
-
star.match_all(path).is_empty(),
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
215
|
#[test]
|
|
291
216
|
fn match_all_with_nested_path() {
|
|
292
217
|
let matcher = TableMatcher::new(&[("**/*.jsonl", "events")], &[]).unwrap();
|
|
@@ -368,105 +293,6 @@ mod tests {
|
|
|
368
293
|
assert_eq!(names(&matcher, "logs/deep/nested/b.txt"), vec!["t"]);
|
|
369
294
|
}
|
|
370
295
|
|
|
371
|
-
#[test]
|
|
372
|
-
fn placeholder_matches_the_filled_segment() {
|
|
373
|
-
let matcher =
|
|
374
|
-
TableMatcher::new(&[("comments/{thread_id}/index.jsonl", "comments")], &[]).unwrap();
|
|
375
|
-
assert_eq!(
|
|
376
|
-
names(&matcher, "comments/abc123/index.jsonl"),
|
|
377
|
-
vec!["comments"]
|
|
378
|
-
);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
#[test]
|
|
382
|
-
fn multiple_placeholders_match() {
|
|
383
|
-
let matcher = TableMatcher::new(&[("{org}/{repo}/data.json", "repos")], &[]).unwrap();
|
|
384
|
-
assert_eq!(names(&matcher, "acme/widgets/data.json"), vec!["repos"]);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
#[test]
|
|
388
|
-
fn placeholder_no_match_returns_empty() {
|
|
389
|
-
let matcher =
|
|
390
|
-
TableMatcher::new(&[("comments/{thread_id}/index.jsonl", "comments")], &[]).unwrap();
|
|
391
|
-
assert!(matcher.match_all(Path::new("other/file.txt")).is_empty());
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
#[test]
|
|
395
|
-
fn placeholder_with_double_star_matches() {
|
|
396
|
-
let matcher = TableMatcher::new(&[("**/{category}/items.json", "items")], &[]).unwrap();
|
|
397
|
-
assert_eq!(
|
|
398
|
-
names(&matcher, "shop/electronics/items.json"),
|
|
399
|
-
vec!["items"]
|
|
400
|
-
);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
#[test]
|
|
404
|
-
fn placeholder_with_question_mark_matches() {
|
|
405
|
-
let matcher = TableMatcher::new(&[("{name}?.txt", "files")], &[]).unwrap();
|
|
406
|
-
assert_eq!(names(&matcher, "ab.txt"), vec!["files"]);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
#[test]
|
|
410
|
-
fn placeholder_names_lists_names_in_order() {
|
|
411
|
-
assert_eq!(
|
|
412
|
-
placeholder_names("{org}/{repo}/data.json"),
|
|
413
|
-
vec!["org".to_string(), "repo".to_string()]
|
|
414
|
-
);
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
#[test]
|
|
418
|
-
fn placeholder_names_empty_when_none() {
|
|
419
|
-
assert!(placeholder_names("data/*/metadata.json").is_empty());
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
#[test]
|
|
423
|
-
fn placeholder_names_rejects_everything_outside_the_grammar() {
|
|
424
|
-
// The grammar is exactly `{` `[a-zA-Z_][a-zA-Z0-9_]*` `}`. Each of these
|
|
425
|
-
// fails it at a different point -- empty name, a leading digit, a
|
|
426
|
-
// disallowed interior byte, and a brace that runs off the end of the
|
|
427
|
-
// pattern -- and all are left alone rather than read as a placeholder.
|
|
428
|
-
for pattern in ["{}", "{1a}", "{a-b}", "{a b}", "{", "a{", "{a", "{_"] {
|
|
429
|
-
assert!(
|
|
430
|
-
placeholder_names(pattern).is_empty(),
|
|
431
|
-
"`{pattern}` is outside the grammar, so it is not a placeholder"
|
|
432
|
-
);
|
|
433
|
-
assert_eq!(
|
|
434
|
-
glob_with_placeholders_as_star(pattern),
|
|
435
|
-
pattern,
|
|
436
|
-
"`{pattern}` is not a placeholder, so the glob is unrewritten"
|
|
437
|
-
);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
#[test]
|
|
442
|
-
fn placeholder_names_accepts_the_whole_grammar() {
|
|
443
|
-
// A name starts with a letter or `_` and continues with those plus
|
|
444
|
-
// digits.
|
|
445
|
-
assert_eq!(placeholder_names("{a}"), vec!["a".to_string()]);
|
|
446
|
-
assert_eq!(placeholder_names("{_}"), vec!["_".to_string()]);
|
|
447
|
-
assert_eq!(placeholder_names("{_a1}"), vec!["_a1".to_string()]);
|
|
448
|
-
assert_eq!(placeholder_names("{A_1z}"), vec!["A_1z".to_string()]);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
#[test]
|
|
452
|
-
fn the_scan_resumes_at_the_byte_after_a_closing_brace() {
|
|
453
|
-
// Leftmost-first and non-overlapping: back-to-back placeholders both
|
|
454
|
-
// register, and every byte outside a span survives the rewrite.
|
|
455
|
-
assert_eq!(
|
|
456
|
-
placeholder_names("{a}{b}"),
|
|
457
|
-
vec!["a".to_string(), "b".to_string()]
|
|
458
|
-
);
|
|
459
|
-
assert_eq!(glob_with_placeholders_as_star("x{a}y{b}z"), "x*y*z");
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
#[test]
|
|
463
|
-
fn an_unclosed_brace_leaves_a_later_placeholder_intact() {
|
|
464
|
-
// The `{` at 0 fails the grammar, so the scan advances one byte at a
|
|
465
|
-
// time and still finds the real placeholder behind it.
|
|
466
|
-
assert_eq!(placeholder_names("{a{b}"), vec!["b".to_string()]);
|
|
467
|
-
assert_eq!(glob_with_placeholders_as_star("{a{b}"), "{a*");
|
|
468
|
-
}
|
|
469
|
-
|
|
470
296
|
/// Two files at depth 0, two under `folder/`, two under `folder/sub/`, one
|
|
471
297
|
/// under a sibling directory.
|
|
472
298
|
const FIXTURE: [&str; 7] = [
|
|
@@ -602,12 +428,12 @@ mod tests {
|
|
|
602
428
|
}
|
|
603
429
|
|
|
604
430
|
#[test]
|
|
605
|
-
fn
|
|
431
|
+
fn a_braced_name_matches_only_itself() {
|
|
606
432
|
let matcher = TableMatcher::new(&[("data/{id}/metadata.json", "a")], &[]).unwrap();
|
|
607
|
-
assert_eq!(names(&matcher, "data/
|
|
433
|
+
assert_eq!(names(&matcher, "data/{id}/metadata.json"), vec!["a"]);
|
|
608
434
|
assert!(
|
|
609
435
|
matcher
|
|
610
|
-
.match_all(Path::new("data/x/
|
|
436
|
+
.match_all(Path::new("data/x/metadata.json"))
|
|
611
437
|
.is_empty()
|
|
612
438
|
);
|
|
613
439
|
}
|
|
@@ -149,6 +149,17 @@ fn resolve_as<S: Syntax>(
|
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
/// `glob` as a path-table reads the same string after `FROM './`: a trailing
|
|
153
|
+
/// separator or a wholly literal name that is a directory under `index_root`
|
|
154
|
+
/// lists the files directly inside it.
|
|
155
|
+
pub fn directory_as_glob(glob: &str, index_root: &Path, is_dir: &dyn Fn(&Path) -> bool) -> String {
|
|
156
|
+
let target = trailing_separator_as_star::<Utf8UnixEncoding>(glob);
|
|
157
|
+
if !target.is_empty() && !has_glob_metacharacter(&target) && is_dir(&index_root.join(&target)) {
|
|
158
|
+
return format!("{target}/{DIRECTORY_GLOB}");
|
|
159
|
+
}
|
|
160
|
+
target
|
|
161
|
+
}
|
|
162
|
+
|
|
152
163
|
/// Where a config `[[table]] glob` anchors, and the glob to match beneath it.
|
|
153
164
|
///
|
|
154
165
|
/// A glob with a path-table prefix (`/`, `../`, `~/`, a drive or UNC root)
|
|
@@ -360,6 +371,45 @@ mod tests {
|
|
|
360
371
|
}
|
|
361
372
|
}
|
|
362
373
|
|
|
374
|
+
fn directory_glob(glob: &str, is_dir: &dyn Fn(&Path) -> bool) -> String {
|
|
375
|
+
directory_as_glob(glob, Path::new(ROOT), is_dir)
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
#[test]
|
|
379
|
+
fn a_literal_directory_name_lists_one_level() {
|
|
380
|
+
assert_eq!(directory_glob("docs", &everything_is_a_dir), "docs/*");
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
#[test]
|
|
384
|
+
fn a_literal_directory_is_looked_up_under_the_index_root() {
|
|
385
|
+
let only_docs = |p: &Path| p == Path::new("/index/docs");
|
|
386
|
+
assert_eq!(directory_glob("docs", &only_docs), "docs/*");
|
|
387
|
+
assert_eq!(directory_glob("other", &only_docs), "other");
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
#[test]
|
|
391
|
+
fn a_literal_file_name_is_left_alone() {
|
|
392
|
+
assert_eq!(directory_glob("top.md", ¬hing_is_a_dir), "top.md");
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
#[test]
|
|
396
|
+
fn a_glob_is_left_alone_even_when_a_directory_has_its_name() {
|
|
397
|
+
assert_eq!(
|
|
398
|
+
directory_glob("docs/*.md", &everything_is_a_dir),
|
|
399
|
+
"docs/*.md"
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
#[test]
|
|
404
|
+
fn a_trailing_separator_lists_one_level() {
|
|
405
|
+
assert_eq!(directory_glob("docs/", ¬hing_is_a_dir), "docs/*");
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
#[test]
|
|
409
|
+
fn an_empty_glob_is_left_alone() {
|
|
410
|
+
assert_eq!(directory_glob("", &everything_is_a_dir), "");
|
|
411
|
+
}
|
|
412
|
+
|
|
363
413
|
#[test]
|
|
364
414
|
fn default_ignores_cover_vcs_and_dependency_directories() {
|
|
365
415
|
assert_eq!(DEFAULT_IGNORES, ["**/node_modules/**", "**/.git/**"]);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|