dirsql 0.4.110__tar.gz → 0.4.112__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.110 → dirsql-0.4.112}/Cargo.lock +2 -2
- {dirsql-0.4.110 → dirsql-0.4.112}/PKG-INFO +1 -1
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/cli.md +45 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/Cargo.toml +1 -1
- {dirsql-0.4.110/packages/rust → dirsql-0.4.112/packages/python}/docs/reference/cli.md +45 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1469-ci-speed-sanity-1009.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1487-frontend-query-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1488-frontend-metadata-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1503-bench-watch-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1504-bench-names-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-issue-1486-frontend-20261009.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-gap-childpath-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-parse-overlap-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-parse-paths-1009.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-parse-pragmas-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-walk-components-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-walk-rowpath-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-walk-sched-1009.json +7 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/e2e/speed_of_light.py +53 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.110/packages/python → dirsql-0.4.112/packages/rust}/docs/reference/cli.md +45 -0
- dirsql-0.4.112/packages/rust/src/cli/frontend.html +80 -0
- dirsql-0.4.112/packages/rust/src/cli/frontend.js +161 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/mod.rs +16 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/router.rs +91 -4
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/run.rs +33 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/server.rs +1 -1
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/db.rs +171 -4
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/lib.rs +283 -54
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/matcher.rs +70 -9
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/on_file.rs +211 -74
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/scanner.rs +66 -6
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/tree_walk.rs +3 -8
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/vtab.rs +39 -8
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/vtab_scaffold.rs +59 -1
- {dirsql-0.4.110 → dirsql-0.4.112}/Cargo.toml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/README.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/_async.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/py.typed +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/read_config.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/AGENTS.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/context/recipes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/context/usage.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/explanation.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/getting-started.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/embed.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/persist.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/index.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/package.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/plugins.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/columns.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/glob.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/http-api.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/docs/reference/sdk.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/README.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/conftest.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/reference/glob.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/reference/http-api.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/docs/reference/sdk.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1416-watch-speed-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1461-row-footprint-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1462-paired-speed-harness-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1464-fastest-native-1008.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1470-perf-suite-1009.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/e2e/bench_report.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/e2e/bench_suite.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/README.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/reference/glob.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/reference/http-api.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/docs/reference/sdk.md +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/path_table.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/packages/rust/src/watcher.rs +0 -0
- {dirsql-0.4.110 → dirsql-0.4.112}/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.112"
|
|
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.112"
|
|
629
629
|
dependencies = [
|
|
630
630
|
"dirsql",
|
|
631
631
|
"pyo3",
|
|
@@ -237,6 +237,50 @@ On startup the server prints `Running at <host>:<port>` to stdout. It runs
|
|
|
237
237
|
until it receives `SIGINT` (Ctrl-C) or `SIGTERM`, then drains in-flight
|
|
238
238
|
requests, closes open `/events` streams, and exits.
|
|
239
239
|
|
|
240
|
+
Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
|
|
241
|
+
the same origin as the HTTP API. It works offline and prints `Frontend at
|
|
242
|
+
http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
|
|
243
|
+
printed URL uses the assigned port. The page offers an editable SQL box
|
|
244
|
+
holding the starter query `SELECT * FROM './' LIMIT 100`. Nothing runs until
|
|
245
|
+
you press **Run** (or Ctrl/Cmd+Enter); pressing it again refreshes the
|
|
246
|
+
result. Queries go through `POST /query`, so the read-only rule applies, and
|
|
247
|
+
run exactly as written. The page shows elapsed time, the number of rows
|
|
248
|
+
returned, and errors. Values render as text (`NULL` is marked), and only the
|
|
249
|
+
first 1000 rows are displayed. An empty result says so and shows no column
|
|
250
|
+
names, since the response carries none.
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
dirsql server --frontend
|
|
254
|
+
dirsql server --frontend -c .dirsql.toml
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
The shell reads `GET /frontend/state`. When the index is ready it returns
|
|
258
|
+
HTTP `200`:
|
|
259
|
+
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"error": null,
|
|
263
|
+
"root": "/abs/path/of/the/invocation/directory",
|
|
264
|
+
"tables": [
|
|
265
|
+
{"name": "posts", "columns": [{"name": "basename", "type": "TEXT"}]}
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`root` is the query root, where [path-tables](./path-tables.md) resolve.
|
|
271
|
+
`tables` lists the declared tables, ordered by name, each with its columns in
|
|
272
|
+
declaration order and the declared SQLite type (`""` when untyped). Empty
|
|
273
|
+
tables are listed. A configless server, or a config with only functions or
|
|
274
|
+
extensions, returns `"tables": []`. dirsql's bookkeeping tables, SQLite's own
|
|
275
|
+
tables, virtual tables with their shadow tables, and path-tables are never
|
|
276
|
+
listed. The metadata is read from SQLite's catalog: no file is parsed, no
|
|
277
|
+
directory walked, no table counted.
|
|
278
|
+
|
|
279
|
+
When config loading fails the endpoint returns HTTP `503` with
|
|
280
|
+
`{"error":"<diagnostic>"}` and no `root` or `tables`. Fix the config and
|
|
281
|
+
restart the server. Without `--frontend`, the `/` and `/frontend/state`
|
|
282
|
+
routes return `404`. `POST /query` is unchanged.
|
|
283
|
+
|
|
240
284
|
### Flags
|
|
241
285
|
|
|
242
286
|
Config flags are subcommand-local: pass them after `server`
|
|
@@ -247,6 +291,7 @@ Config flags are subcommand-local: pass them after `server`
|
|
|
247
291
|
| `-c, --config <path>` | none | Path to a [config file](./config.md). **Repeatable** (`-c a -c b`): the configs load and merge in argv order — see [Composing multiple configs](./config.md#composing-multiple-configs). The index root is the **invocation directory** (the current working directory) and governs path-tables; a config's `[[table]]` globs anchor at **that config's own directory** (see [glob anchor](./config.md#glob-anchor)), so `--config /elsewhere/.dirsql.toml` indexes `/elsewhere`, from any working directory. With none given, **no named tables are defined** — query the filesystem with a [path-table](./path-tables.md) (`FROM './'`). A `./.dirsql.toml` on disk is **not** auto-loaded; pass it explicitly. A `-c` naming a file that does not exist is an [error](#degraded-mode). |
|
|
248
292
|
| `--host <addr>` | `localhost` | Bind address. |
|
|
249
293
|
| `--port <n>` | `7117` | TCP port to bind. |
|
|
294
|
+
| `--frontend` | off | Serve the bundled SQL explorer shell and print its URL. |
|
|
250
295
|
| `--cors-origin <origin>` | off | Let browser pages on `<origin>` (an exact origin such as `http://localhost:3202`, or `*` for any) call `/query` and open `/events`. See [Cross-origin requests](#cross-origin-requests). |
|
|
251
296
|
| `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches under the platform cache directory (`$XDG_CACHE_HOME/dirsql/<root hash>/cache.db` on Linux), outside the root; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
|
|
252
297
|
| `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in `.git` skip and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
|
|
@@ -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.112"
|
|
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
|
|
@@ -237,6 +237,50 @@ On startup the server prints `Running at <host>:<port>` to stdout. It runs
|
|
|
237
237
|
until it receives `SIGINT` (Ctrl-C) or `SIGTERM`, then drains in-flight
|
|
238
238
|
requests, closes open `/events` streams, and exits.
|
|
239
239
|
|
|
240
|
+
Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
|
|
241
|
+
the same origin as the HTTP API. It works offline and prints `Frontend at
|
|
242
|
+
http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
|
|
243
|
+
printed URL uses the assigned port. The page offers an editable SQL box
|
|
244
|
+
holding the starter query `SELECT * FROM './' LIMIT 100`. Nothing runs until
|
|
245
|
+
you press **Run** (or Ctrl/Cmd+Enter); pressing it again refreshes the
|
|
246
|
+
result. Queries go through `POST /query`, so the read-only rule applies, and
|
|
247
|
+
run exactly as written. The page shows elapsed time, the number of rows
|
|
248
|
+
returned, and errors. Values render as text (`NULL` is marked), and only the
|
|
249
|
+
first 1000 rows are displayed. An empty result says so and shows no column
|
|
250
|
+
names, since the response carries none.
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
dirsql server --frontend
|
|
254
|
+
dirsql server --frontend -c .dirsql.toml
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
The shell reads `GET /frontend/state`. When the index is ready it returns
|
|
258
|
+
HTTP `200`:
|
|
259
|
+
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"error": null,
|
|
263
|
+
"root": "/abs/path/of/the/invocation/directory",
|
|
264
|
+
"tables": [
|
|
265
|
+
{"name": "posts", "columns": [{"name": "basename", "type": "TEXT"}]}
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`root` is the query root, where [path-tables](./path-tables.md) resolve.
|
|
271
|
+
`tables` lists the declared tables, ordered by name, each with its columns in
|
|
272
|
+
declaration order and the declared SQLite type (`""` when untyped). Empty
|
|
273
|
+
tables are listed. A configless server, or a config with only functions or
|
|
274
|
+
extensions, returns `"tables": []`. dirsql's bookkeeping tables, SQLite's own
|
|
275
|
+
tables, virtual tables with their shadow tables, and path-tables are never
|
|
276
|
+
listed. The metadata is read from SQLite's catalog: no file is parsed, no
|
|
277
|
+
directory walked, no table counted.
|
|
278
|
+
|
|
279
|
+
When config loading fails the endpoint returns HTTP `503` with
|
|
280
|
+
`{"error":"<diagnostic>"}` and no `root` or `tables`. Fix the config and
|
|
281
|
+
restart the server. Without `--frontend`, the `/` and `/frontend/state`
|
|
282
|
+
routes return `404`. `POST /query` is unchanged.
|
|
283
|
+
|
|
240
284
|
### Flags
|
|
241
285
|
|
|
242
286
|
Config flags are subcommand-local: pass them after `server`
|
|
@@ -247,6 +291,7 @@ Config flags are subcommand-local: pass them after `server`
|
|
|
247
291
|
| `-c, --config <path>` | none | Path to a [config file](./config.md). **Repeatable** (`-c a -c b`): the configs load and merge in argv order — see [Composing multiple configs](./config.md#composing-multiple-configs). The index root is the **invocation directory** (the current working directory) and governs path-tables; a config's `[[table]]` globs anchor at **that config's own directory** (see [glob anchor](./config.md#glob-anchor)), so `--config /elsewhere/.dirsql.toml` indexes `/elsewhere`, from any working directory. With none given, **no named tables are defined** — query the filesystem with a [path-table](./path-tables.md) (`FROM './'`). A `./.dirsql.toml` on disk is **not** auto-loaded; pass it explicitly. A `-c` naming a file that does not exist is an [error](#degraded-mode). |
|
|
248
292
|
| `--host <addr>` | `localhost` | Bind address. |
|
|
249
293
|
| `--port <n>` | `7117` | TCP port to bind. |
|
|
294
|
+
| `--frontend` | off | Serve the bundled SQL explorer shell and print its URL. |
|
|
250
295
|
| `--cors-origin <origin>` | off | Let browser pages on `<origin>` (an exact origin such as `http://localhost:3202`, or `*` for any) call `/query` and open `/events`. See [Cross-origin requests](#cross-origin-requests). |
|
|
251
296
|
| `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches under the platform cache directory (`$XDG_CACHE_HOME/dirsql/<root hash>/cache.db` on Linux), outside the root; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
|
|
252
297
|
| `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in `.git` skip and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py tests/e2e/fanout_test.py tests/e2e/extension_package_test.py tests/e2e/server_speed_test.py -x -q",
|
|
3
|
+
"ran_at": 1791765336,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "a2b5671787b3cfa038a128d5cbbeac13e6c268a9",
|
|
6
|
+
"branch": "bot/1487-frontend-query-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py tests/e2e/declared_table_name_test.py tests/e2e/on_file_query_test.py -x -q",
|
|
3
|
+
"ran_at": 1791764712,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "ae61a26f7b9018c3e12aebeea7c6a3cf32ef4d87",
|
|
6
|
+
"branch": "bot/1488-frontend-metadata-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m tests.e2e.bench_suite --pairs 3 --out /tmp/bench-1504 -k \"glob_speed_symlink or glob_speed_dotfiles or glob_speed_recursive\"",
|
|
3
|
+
"ran_at": 1791770495,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "cce3e83ece8026cc8feedbb1cd64f73242f1d230",
|
|
6
|
+
"branch": "bot/1504-bench-names-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py tests/e2e/fanout_test.py tests/e2e/extension_package_test.py -x -q",
|
|
3
|
+
"ran_at": 1791556016,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "fc84f87effcd648162d3c143d308bc0c24222dcb",
|
|
6
|
+
"branch": "bot/issue-1486-frontend-20261009"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/glob_speed_gitignore_test.py -x -q",
|
|
3
|
+
"ran_at": 1791777891,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "fb7068d3883fd35c014146a174f4f342aaf93dab",
|
|
6
|
+
"branch": "bot/speed-gap-childpath-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/jsonl_parse_speed_test.py tests/e2e/frontmatter_parse_speed_test.py tests/e2e/on_file_query_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791768023,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "db8e06627eb807a3932ae3989ef662019a288ce1",
|
|
6
|
+
"branch": "bot/speed-parse-overlap-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/frontmatter_parse_speed_test.py tests/e2e/jsonl_parse_speed_test.py tests/e2e/on_file_query_test.py tests/e2e/query_contract_test.py tests/e2e/fanout_test.py tests/e2e/declared_table_name_test.py tests/e2e/use_case_dossier_test.py tests/e2e/use_case_join_test.py tests/e2e/use_case_notebook_test.py tests/e2e/use_case_transcripts_test.py -x -q -s",
|
|
3
|
+
"ran_at": 1791560842,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "d5ea2e249e40f6b64e6eb1f799fc47d8290b795e",
|
|
6
|
+
"branch": "bot/speed-parse-paths-1009"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/jsonl_parse_speed_test.py tests/e2e/frontmatter_parse_speed_test.py tests/e2e/on_file_query_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791766109,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "a2a42d2c9ac8c5aa5292f4d4d540296cf1e1ee6c",
|
|
6
|
+
"branch": "bot/speed-parse-pragmas-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/glob_speed_node_modules_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_gitignore_test.py tests/e2e/stat_speed_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791771802,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "6a704d60f7963656097b921100e1f3aaefba6bbd",
|
|
6
|
+
"branch": "bot/speed-walk-components-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/glob_speed_node_modules_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_gitignore_test.py tests/e2e/stat_speed_test.py tests/e2e/query_contract_test.py -x -q",
|
|
3
|
+
"ran_at": 1791768231,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "d6653e1f4d8a1d8b4b723b6f24c0bc805e4aa7e1",
|
|
6
|
+
"branch": "bot/speed-walk-rowpath-1011"
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py -x -q",
|
|
3
|
+
"ran_at": 1791561608,
|
|
4
|
+
"exit_code": 0,
|
|
5
|
+
"commit": "d4ace79bbd16978ba199811907976d240ca55507",
|
|
6
|
+
"branch": "bot/speed-walk-sched-1009"
|
|
7
|
+
}
|
|
@@ -415,3 +415,56 @@ def assert_speed_of_light(name, result, startup):
|
|
|
415
415
|
assert median <= TOLERANCE, (
|
|
416
416
|
f"bar native {result.bar}: {line}; median is over {TOLERANCE}x"
|
|
417
417
|
)
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
SLOWDOWN = 1.5
|
|
421
|
+
RELEASE_PAIRS = 10
|
|
422
|
+
ATTEMPTS = 3
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def release_ratios(pr, release, startup, pairs=RELEASE_PAIRS):
|
|
426
|
+
"""Per-pair PR/release time ratios, each side net of its own startup.
|
|
427
|
+
|
|
428
|
+
`startup.dirsql` is the PR build's, `startup.native` the release's. One
|
|
429
|
+
discarded warm-up pair, then pairs alternate which build runs first.
|
|
430
|
+
"""
|
|
431
|
+
release()
|
|
432
|
+
pr()
|
|
433
|
+
series = run_pairs({"release": release}, pr, pairs)
|
|
434
|
+
return pair_ratios(series.native_seconds["release"], series.dirsql_seconds, startup)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def assert_no_slowdown(name, measure, threshold=SLOWDOWN, attempts=ATTEMPTS):
|
|
438
|
+
"""Pass on the first attempt whose median ratio is within `threshold`.
|
|
439
|
+
|
|
440
|
+
Fails only when every attempt is over, so one noisy window on a shared
|
|
441
|
+
runner does not fail the check.
|
|
442
|
+
"""
|
|
443
|
+
medians = []
|
|
444
|
+
for attempt in range(1, attempts + 1):
|
|
445
|
+
ratios = measure()
|
|
446
|
+
low, median, high, spread = summarize(ratios)
|
|
447
|
+
print(
|
|
448
|
+
f"SPEED {name} vs release: attempt {attempt}, {len(ratios)} pairs,"
|
|
449
|
+
f" ratio min {low:.3f} median {median:.3f} max {high:.3f}"
|
|
450
|
+
f" spread {spread:.0%}"
|
|
451
|
+
)
|
|
452
|
+
if median <= threshold:
|
|
453
|
+
return
|
|
454
|
+
medians.append(median)
|
|
455
|
+
shown = ", ".join(f"{median:.3f}" for median in medians)
|
|
456
|
+
raise AssertionError(
|
|
457
|
+
f"{name}: PR build is over {threshold}x the previous release on every"
|
|
458
|
+
f" attempt (median ratios {shown})"
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def install_release(dest):
|
|
463
|
+
"""Install the latest published dirsql into a fresh venv at `dest`."""
|
|
464
|
+
subprocess.run(["uv", "venv", str(dest)], check=True, capture_output=True)
|
|
465
|
+
subprocess.run(
|
|
466
|
+
["uv", "pip", "install", "--python", str(dest), "dirsql"],
|
|
467
|
+
check=True,
|
|
468
|
+
capture_output=True,
|
|
469
|
+
)
|
|
470
|
+
return dest / "bin" / "dirsql"
|
|
@@ -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.112"
|
|
10
10
|
edition.workspace = true
|
|
11
11
|
# Literal `license` (not `license.workspace = true`) because
|
|
12
12
|
# putitoutthere's preflight check reads `[package].license` directly
|
|
@@ -237,6 +237,50 @@ On startup the server prints `Running at <host>:<port>` to stdout. It runs
|
|
|
237
237
|
until it receives `SIGINT` (Ctrl-C) or `SIGTERM`, then drains in-flight
|
|
238
238
|
requests, closes open `/events` streams, and exits.
|
|
239
239
|
|
|
240
|
+
Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
|
|
241
|
+
the same origin as the HTTP API. It works offline and prints `Frontend at
|
|
242
|
+
http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
|
|
243
|
+
printed URL uses the assigned port. The page offers an editable SQL box
|
|
244
|
+
holding the starter query `SELECT * FROM './' LIMIT 100`. Nothing runs until
|
|
245
|
+
you press **Run** (or Ctrl/Cmd+Enter); pressing it again refreshes the
|
|
246
|
+
result. Queries go through `POST /query`, so the read-only rule applies, and
|
|
247
|
+
run exactly as written. The page shows elapsed time, the number of rows
|
|
248
|
+
returned, and errors. Values render as text (`NULL` is marked), and only the
|
|
249
|
+
first 1000 rows are displayed. An empty result says so and shows no column
|
|
250
|
+
names, since the response carries none.
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
dirsql server --frontend
|
|
254
|
+
dirsql server --frontend -c .dirsql.toml
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
The shell reads `GET /frontend/state`. When the index is ready it returns
|
|
258
|
+
HTTP `200`:
|
|
259
|
+
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"error": null,
|
|
263
|
+
"root": "/abs/path/of/the/invocation/directory",
|
|
264
|
+
"tables": [
|
|
265
|
+
{"name": "posts", "columns": [{"name": "basename", "type": "TEXT"}]}
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`root` is the query root, where [path-tables](./path-tables.md) resolve.
|
|
271
|
+
`tables` lists the declared tables, ordered by name, each with its columns in
|
|
272
|
+
declaration order and the declared SQLite type (`""` when untyped). Empty
|
|
273
|
+
tables are listed. A configless server, or a config with only functions or
|
|
274
|
+
extensions, returns `"tables": []`. dirsql's bookkeeping tables, SQLite's own
|
|
275
|
+
tables, virtual tables with their shadow tables, and path-tables are never
|
|
276
|
+
listed. The metadata is read from SQLite's catalog: no file is parsed, no
|
|
277
|
+
directory walked, no table counted.
|
|
278
|
+
|
|
279
|
+
When config loading fails the endpoint returns HTTP `503` with
|
|
280
|
+
`{"error":"<diagnostic>"}` and no `root` or `tables`. Fix the config and
|
|
281
|
+
restart the server. Without `--frontend`, the `/` and `/frontend/state`
|
|
282
|
+
routes return `404`. `POST /query` is unchanged.
|
|
283
|
+
|
|
240
284
|
### Flags
|
|
241
285
|
|
|
242
286
|
Config flags are subcommand-local: pass them after `server`
|
|
@@ -247,6 +291,7 @@ Config flags are subcommand-local: pass them after `server`
|
|
|
247
291
|
| `-c, --config <path>` | none | Path to a [config file](./config.md). **Repeatable** (`-c a -c b`): the configs load and merge in argv order — see [Composing multiple configs](./config.md#composing-multiple-configs). The index root is the **invocation directory** (the current working directory) and governs path-tables; a config's `[[table]]` globs anchor at **that config's own directory** (see [glob anchor](./config.md#glob-anchor)), so `--config /elsewhere/.dirsql.toml` indexes `/elsewhere`, from any working directory. With none given, **no named tables are defined** — query the filesystem with a [path-table](./path-tables.md) (`FROM './'`). A `./.dirsql.toml` on disk is **not** auto-loaded; pass it explicitly. A `-c` naming a file that does not exist is an [error](#degraded-mode). |
|
|
248
292
|
| `--host <addr>` | `localhost` | Bind address. |
|
|
249
293
|
| `--port <n>` | `7117` | TCP port to bind. |
|
|
294
|
+
| `--frontend` | off | Serve the bundled SQL explorer shell and print its URL. |
|
|
250
295
|
| `--cors-origin <origin>` | off | Let browser pages on `<origin>` (an exact origin such as `http://localhost:3202`, or `*` for any) call `/query` and open `/events`. See [Cross-origin requests](#cross-origin-requests). |
|
|
251
296
|
| `--persist [<path>]` | off | Keep the SQLite index on disk between runs so a restart only re-parses files that actually changed. Bare `--persist` caches under the platform cache directory (`$XDG_CACHE_HOME/dirsql/<root hash>/cache.db` on Linux), outside the root; `--persist <path>` caches at `<path>`. Off by default (the index is ephemeral). Also available on [`dirsql query`](#dirsql-query). See [Keep the index across restarts](../howto/persist.md). |
|
|
252
297
|
| `--no-ignore` | off | Scan files a `.gitignore` would hide. [Path-tables](./path-tables.md#skip-rules) respect `.gitignore` files by default; this flag restores the full walk. The built-in `.git` skip and configured `ignore` patterns still apply. Also available on [`dirsql query`](#dirsql-query). |
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>dirsql SQL explorer</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root { color-scheme: light; font-family: ui-sans-serif, system-ui, sans-serif; background: #f4f6f4; color: #173026; }
|
|
9
|
+
* { box-sizing: border-box; }
|
|
10
|
+
body { margin: 0; min-height: 100vh; }
|
|
11
|
+
header { border-bottom: 1px solid #d9e1da; background: #fff; padding: 1.1rem max(1.5rem, calc((100vw - 56rem) / 2)); }
|
|
12
|
+
header strong { font-size: 1.15rem; letter-spacing: -.03em; }
|
|
13
|
+
main { max-width: 56rem; margin: 0 auto; padding: clamp(2rem, 7vw, 5rem) 1.5rem; }
|
|
14
|
+
h1 { font-size: clamp(2rem, 5vw, 3.4rem); line-height: 1.1; letter-spacing: -.055em; margin: 0 0 1rem; }
|
|
15
|
+
p { line-height: 1.6; color: #4a5d51; max-width: 42rem; }
|
|
16
|
+
.panel { margin-top: 2.5rem; padding: 1.5rem; border: 1px solid #d9e1da; border-radius: 12px; background: #fff; box-shadow: 0 3px 12px #17302609; }
|
|
17
|
+
.panel h2 { margin: 0 0 .5rem; font-size: 1rem; }
|
|
18
|
+
.panel p { margin: 0; }
|
|
19
|
+
form { margin-top: 2rem; }
|
|
20
|
+
label { display: block; font-weight: 600; margin-bottom: .4rem; }
|
|
21
|
+
textarea { width: 100%; min-height: 7rem; padding: .7rem; border: 1px solid #b9c7bd; border-radius: 8px; font: .95rem/1.5 ui-monospace, monospace; resize: vertical; }
|
|
22
|
+
button { margin-top: .6rem; padding: .5rem 1.2rem; border: 0; border-radius: 8px; background: #1f6b46; color: #fff; font: inherit; font-weight: 600; cursor: pointer; }
|
|
23
|
+
button[aria-busy="true"] { opacity: .6; cursor: progress; }
|
|
24
|
+
.hint { font-size: .85rem; margin: .4rem 0 0; }
|
|
25
|
+
#result { margin-top: 1.5rem; overflow-x: auto; }
|
|
26
|
+
#result p.error { color: #a0362a; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
27
|
+
table { border-collapse: collapse; font: .85rem/1.4 ui-monospace, monospace; background: #fff; }
|
|
28
|
+
th, td { border: 1px solid #d9e1da; padding: .3rem .6rem; text-align: left; vertical-align: top; white-space: pre-wrap; overflow-wrap: anywhere; max-width: 40rem; }
|
|
29
|
+
th { background: #eef2ee; }
|
|
30
|
+
td.null { color: #7a8a80; font-style: italic; }
|
|
31
|
+
.error { border-color: #d7a7a1; background: #fff8f7; }
|
|
32
|
+
.error h2 { color: #a0362a; }
|
|
33
|
+
.error pre { white-space: pre-wrap; overflow-wrap: anywhere; font: .9rem/1.5 ui-monospace, monospace; margin: .8rem 0; }
|
|
34
|
+
</style>
|
|
35
|
+
</head>
|
|
36
|
+
<body>
|
|
37
|
+
<header><strong>dirsql</strong></header>
|
|
38
|
+
<main>
|
|
39
|
+
<h1>dirsql SQL explorer</h1>
|
|
40
|
+
<p>Explore the files and tables in this directory with SQL.</p>
|
|
41
|
+
<section class="panel" id="state" aria-live="polite">
|
|
42
|
+
<h2 id="state-title">Connecting to dirsql…</h2>
|
|
43
|
+
<p id="state-message">Checking the server state.</p>
|
|
44
|
+
</section>
|
|
45
|
+
<form id="query" onsubmit="return false">
|
|
46
|
+
<label for="sql">SQL (read-only)</label>
|
|
47
|
+
<textarea id="sql" name="sql" spellcheck="false" aria-describedby="sql-hint">SELECT * FROM './' LIMIT 100</textarea>
|
|
48
|
+
<button type="button" id="run">Run</button>
|
|
49
|
+
<p class="hint" id="sql-hint">Runs exactly as written; edit the LIMIT as needed. Press Ctrl+Enter or Cmd+Enter to run.</p>
|
|
50
|
+
</form>
|
|
51
|
+
<section id="result" aria-live="polite" aria-label="Query result"></section>
|
|
52
|
+
</main>
|
|
53
|
+
<script type="module" src="/frontend.js"></script>
|
|
54
|
+
<script>
|
|
55
|
+
(async () => {
|
|
56
|
+
const panel = document.getElementById('state');
|
|
57
|
+
const title = document.getElementById('state-title');
|
|
58
|
+
const message = document.getElementById('state-message');
|
|
59
|
+
try {
|
|
60
|
+
const response = await fetch('/frontend/state');
|
|
61
|
+
const state = await response.json();
|
|
62
|
+
if (state.error) {
|
|
63
|
+
panel.classList.add('error');
|
|
64
|
+
title.textContent = 'Configuration could not load';
|
|
65
|
+
message.textContent = state.error + ' Fix the configuration and restart dirsql server.';
|
|
66
|
+
} else if (response.ok) {
|
|
67
|
+
title.textContent = 'Ready to explore';
|
|
68
|
+
message.textContent = 'The SQL explorer is connected to this directory.';
|
|
69
|
+
} else {
|
|
70
|
+
throw new Error('Unexpected server response');
|
|
71
|
+
}
|
|
72
|
+
} catch (error) {
|
|
73
|
+
panel.classList.add('error');
|
|
74
|
+
title.textContent = 'Could not connect';
|
|
75
|
+
message.textContent = error.message;
|
|
76
|
+
}
|
|
77
|
+
})();
|
|
78
|
+
</script>
|
|
79
|
+
</body>
|
|
80
|
+
</html>
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
export const STARTER_QUERY = "SELECT * FROM './' LIMIT 100";
|
|
2
|
+
export const DISPLAY_ROW_LIMIT = 1000;
|
|
3
|
+
|
|
4
|
+
export function formatCell(value) {
|
|
5
|
+
if (value === null || value === undefined) return { text: 'NULL', isNull: true };
|
|
6
|
+
if (typeof value === 'object') return { text: JSON.stringify(value), isNull: false };
|
|
7
|
+
return { text: String(value), isNull: false };
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async function failureOf(response) {
|
|
11
|
+
let message = `HTTP ${response.status}`;
|
|
12
|
+
try {
|
|
13
|
+
const body = await response.json();
|
|
14
|
+
if (body && typeof body.error === 'string') message = body.error;
|
|
15
|
+
} catch {}
|
|
16
|
+
return { kind: response.status === 400 ? 'query' : 'server', httpStatus: response.status, message };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function createQueryRunner({ fetch, now, onChange }) {
|
|
20
|
+
let current = { status: 'idle' };
|
|
21
|
+
let seq = 0;
|
|
22
|
+
let inflight = null;
|
|
23
|
+
|
|
24
|
+
const set = (state) => {
|
|
25
|
+
current = state;
|
|
26
|
+
onChange(state);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
async function execute(sql, id, controller) {
|
|
30
|
+
const started = now();
|
|
31
|
+
const elapsed = () => Math.round(now() - started);
|
|
32
|
+
let outcome;
|
|
33
|
+
try {
|
|
34
|
+
const response = await fetch('/query', { method: 'POST', body: JSON.stringify({ sql }), signal: controller.signal });
|
|
35
|
+
if (response.ok) {
|
|
36
|
+
const rows = await response.json();
|
|
37
|
+
if (!Array.isArray(rows)) throw new Error('unexpected response');
|
|
38
|
+
const shown = rows.slice(0, DISPLAY_ROW_LIMIT);
|
|
39
|
+
outcome = {
|
|
40
|
+
status: 'success',
|
|
41
|
+
sql,
|
|
42
|
+
rows: shown,
|
|
43
|
+
columns: shown.length ? Object.keys(shown[0]) : [],
|
|
44
|
+
rowCount: rows.length,
|
|
45
|
+
shownCount: shown.length,
|
|
46
|
+
truncated: rows.length > shown.length,
|
|
47
|
+
};
|
|
48
|
+
} else {
|
|
49
|
+
outcome = { status: 'error', sql, ...(await failureOf(response)) };
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {
|
|
52
|
+
outcome =
|
|
53
|
+
error instanceof TypeError || error.name === 'AbortError'
|
|
54
|
+
? { status: 'error', sql, kind: 'network', message: error.message }
|
|
55
|
+
: { status: 'error', sql, kind: 'server', message: error.message };
|
|
56
|
+
}
|
|
57
|
+
if (id !== seq) return;
|
|
58
|
+
inflight = null;
|
|
59
|
+
set({ ...outcome, elapsedMs: elapsed() });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
state: () => current,
|
|
64
|
+
run(sql) {
|
|
65
|
+
if (inflight && inflight.sql === sql) return Promise.resolve();
|
|
66
|
+
if (inflight) inflight.controller.abort();
|
|
67
|
+
seq += 1;
|
|
68
|
+
const controller = new AbortController();
|
|
69
|
+
inflight = { sql, controller, done: null };
|
|
70
|
+
set({ status: 'running', sql });
|
|
71
|
+
inflight.done = execute(sql, seq, controller);
|
|
72
|
+
return inflight.done;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const plural = (n, word) => `${n} ${word}${n === 1 ? '' : 's'}`;
|
|
78
|
+
|
|
79
|
+
function summaryOf(state) {
|
|
80
|
+
const returned = `${plural(state.rowCount, 'row')} returned in ${state.elapsedMs} ms`;
|
|
81
|
+
if (state.truncated) return `${returned}. Display limit: first ${state.shownCount} shown.`;
|
|
82
|
+
if (state.rowCount === 0) return `${returned}. Column names are not available for an empty result.`;
|
|
83
|
+
return `${returned}.`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function tableOf(doc, state) {
|
|
87
|
+
const table = doc.createElement('table');
|
|
88
|
+
const head = doc.createElement('tr');
|
|
89
|
+
for (const column of state.columns) {
|
|
90
|
+
const th = doc.createElement('th');
|
|
91
|
+
th.setAttribute('scope', 'col');
|
|
92
|
+
th.textContent = column;
|
|
93
|
+
head.append(th);
|
|
94
|
+
}
|
|
95
|
+
table.append(head);
|
|
96
|
+
for (const row of state.rows) {
|
|
97
|
+
const tr = doc.createElement('tr');
|
|
98
|
+
for (const column of state.columns) {
|
|
99
|
+
const { text, isNull } = formatCell(row[column]);
|
|
100
|
+
const td = doc.createElement('td');
|
|
101
|
+
td.textContent = text;
|
|
102
|
+
if (isNull) td.className = 'null';
|
|
103
|
+
tr.append(td);
|
|
104
|
+
}
|
|
105
|
+
table.append(tr);
|
|
106
|
+
}
|
|
107
|
+
return table;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const ERROR_LABEL = { query: 'Query error', server: 'Server error', network: 'Could not reach the server' };
|
|
111
|
+
|
|
112
|
+
function errorText(state) {
|
|
113
|
+
if (state.kind === 'network') return `${ERROR_LABEL.network}: ${state.message}`;
|
|
114
|
+
const status = state.httpStatus ? ` (HTTP ${state.httpStatus})` : '';
|
|
115
|
+
return `${ERROR_LABEL[state.kind]}${status}: ${state.message}`;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function renderResult(doc, container, state) {
|
|
119
|
+
const note = doc.createElement('p');
|
|
120
|
+
if (state.status === 'running') {
|
|
121
|
+
note.textContent = 'Running…';
|
|
122
|
+
container.replaceChildren(note);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (state.status === 'error') {
|
|
126
|
+
note.className = 'error';
|
|
127
|
+
note.setAttribute('role', 'alert');
|
|
128
|
+
note.textContent = errorText(state);
|
|
129
|
+
container.replaceChildren(note);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (state.status !== 'success') {
|
|
133
|
+
container.replaceChildren();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
note.textContent = summaryOf(state);
|
|
137
|
+
container.replaceChildren(...(state.rowCount ? [note, tableOf(doc, state)] : [note]));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (typeof document !== 'undefined') {
|
|
141
|
+
const sql = document.getElementById('sql');
|
|
142
|
+
const run = document.getElementById('run');
|
|
143
|
+
const result = document.getElementById('result');
|
|
144
|
+
sql.value = STARTER_QUERY;
|
|
145
|
+
const runner = createQueryRunner({
|
|
146
|
+
fetch: (url, init) => fetch(url, init),
|
|
147
|
+
now: () => performance.now(),
|
|
148
|
+
onChange(state) {
|
|
149
|
+
run.setAttribute('aria-busy', String(state.status === 'running'));
|
|
150
|
+
renderResult(document, result, state);
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
const submit = () => runner.run(sql.value);
|
|
154
|
+
run.addEventListener('click', submit);
|
|
155
|
+
sql.addEventListener('keydown', (event) => {
|
|
156
|
+
if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {
|
|
157
|
+
event.preventDefault();
|
|
158
|
+
submit();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|