dirsql 0.3.5__tar.gz → 0.3.6__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.3.5 → dirsql-0.3.6}/Cargo.lock +1 -1
- {dirsql-0.3.5 → dirsql-0.3.6}/PKG-INFO +2 -2
- dirsql-0.3.6/docs/.vitepress/config.ts +83 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/AGENTS.md +6 -0
- {dirsql-0.3.5/packages/python/docs/guide → dirsql-0.3.6/docs/cli}/config.md +7 -7
- dirsql-0.3.5/docs/guide/cli.md → dirsql-0.3.6/docs/cli/http-api.md +12 -58
- dirsql-0.3.6/docs/cli/index.md +71 -0
- {dirsql-0.3.5/docs/guide → dirsql-0.3.6/docs/cli}/init.md +4 -4
- dirsql-0.3.6/docs/cli/server.md +41 -0
- {dirsql-0.3.5/packages/python → dirsql-0.3.6}/docs/getting-started.md +2 -2
- {dirsql-0.3.5/packages/rust → dirsql-0.3.6}/docs/guide/querying.md +4 -0
- {dirsql-0.3.5/packages/rust → dirsql-0.3.6}/docs/guide/watching.md +4 -0
- dirsql-0.3.6/docs/tests/unit/config.test.ts +22 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/Cargo.toml +1 -1
- dirsql-0.3.6/packages/python/docs/.vitepress/config.ts +83 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/AGENTS.md +6 -0
- {dirsql-0.3.5/packages/rust/docs/guide → dirsql-0.3.6/packages/python/docs/cli}/config.md +7 -7
- dirsql-0.3.5/packages/rust/docs/guide/cli.md → dirsql-0.3.6/packages/python/docs/cli/http-api.md +12 -58
- dirsql-0.3.6/packages/python/docs/cli/index.md +71 -0
- {dirsql-0.3.5/packages/rust/docs/guide → dirsql-0.3.6/packages/python/docs/cli}/init.md +4 -4
- dirsql-0.3.6/packages/python/docs/cli/server.md +41 -0
- {dirsql-0.3.5 → dirsql-0.3.6/packages/python}/docs/getting-started.md +2 -2
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/guide/querying.md +4 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/guide/watching.md +4 -0
- dirsql-0.3.6/packages/python/docs/tests/unit/config.test.ts +22 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/Cargo.toml +3 -1
- {dirsql-0.3.5/docs/guide → dirsql-0.3.6/packages/rust/docs/cli}/config.md +7 -7
- dirsql-0.3.5/packages/python/docs/guide/cli.md → dirsql-0.3.6/packages/rust/docs/cli/http-api.md +12 -58
- dirsql-0.3.6/packages/rust/docs/cli/index.md +71 -0
- {dirsql-0.3.5/packages/python/docs/guide → dirsql-0.3.6/packages/rust/docs/cli}/init.md +4 -4
- dirsql-0.3.6/packages/rust/docs/cli/server.md +41 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/getting-started.md +2 -2
- {dirsql-0.3.5 → dirsql-0.3.6/packages/rust}/docs/guide/querying.md +4 -0
- {dirsql-0.3.5 → dirsql-0.3.6/packages/rust}/docs/guide/watching.md +4 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/pyproject.toml +1 -1
- dirsql-0.3.5/docs/.vitepress/config.ts +0 -65
- dirsql-0.3.5/docs/tests/unit/config.test.ts +0 -9
- dirsql-0.3.5/packages/python/docs/.vitepress/config.ts +0 -65
- dirsql-0.3.5/packages/python/docs/tests/unit/config.test.ts +0 -9
- {dirsql-0.3.5 → dirsql-0.3.6}/Cargo.toml +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/README.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/dirsql/__init__.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/dirsql/_async.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/dirsql/_cli/__init__.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/dirsql/_cli/binary_path.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/dirsql/_cli/is_windows.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/dirsql/_cli/main.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/dirsql/test_async.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/api/index.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/guide/async.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/guide/crdt.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/guide/persistence.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/guide/tables.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/index.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/migrations.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/package.json +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/playwright.config.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/tests/integration/home.spec.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/tests/integration/language-flag.spec.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/tests/unit/lang.test.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/docs/vitest.config.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/README.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/conftest.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/api/index.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/guide/async.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/guide/crdt.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/guide/persistence.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/guide/tables.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/index.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/migrations.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/package.json +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/playwright.config.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/tests/integration/home.spec.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/tests/integration/language-flag.spec.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/tests/unit/lang.test.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/docs/vitest.config.ts +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/src/lib.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/test_async_dirsql.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/test_binding.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/test_dirsql.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/test_docs_examples.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/test_docs_gaps.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/test_from_config.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/python/tests/integration/test_persist.py +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/README.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/api/index.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/guide/async.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/guide/crdt.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/guide/persistence.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/guide/tables.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/index.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/docs/migrations.md +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/cli/router.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/cli/server.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/config.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/db.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/lib.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/matcher.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/scanner.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/src/watcher.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/async_sdk.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/cli_e2e.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/cli_integration.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/docs_examples.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/docs_gaps.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/from_config.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/init_e2e.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/init_integration.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/persist.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/readonly_query.rs +0 -0
- {dirsql-0.3.5 → dirsql-0.3.6}/packages/rust/tests/sdk.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dirsql
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Requires-Dist: pytest>=8 ; extra == 'dev'
|
|
5
5
|
Requires-Dist: pytest-describe>=2 ; extra == 'dev'
|
|
6
6
|
Requires-Dist: pytest-asyncio>=0.23 ; extra == 'dev'
|
|
@@ -12,7 +12,7 @@ Summary: Ephemeral SQL index over a local directory
|
|
|
12
12
|
Keywords: sql,filesystem,directory,sqlite,index
|
|
13
13
|
Author: Kevin Scott
|
|
14
14
|
License-Expression: MIT
|
|
15
|
-
Requires-Python: >=3.
|
|
15
|
+
Requires-Python: >=3.11
|
|
16
16
|
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
17
17
|
|
|
18
18
|
# `dirsql` (Python SDK)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { defineConfig } from 'vitepress'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
title: 'dirsql',
|
|
5
|
+
description: 'Ephemeral SQL index over a local directory. Watches a filesystem, ingests structured files into an in-memory SQLite database, and exposes a SQL query interface.',
|
|
6
|
+
base: '/dirsql/',
|
|
7
|
+
|
|
8
|
+
themeConfig: {
|
|
9
|
+
search: {
|
|
10
|
+
provider: 'local'
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
nav: [
|
|
14
|
+
{ text: 'Getting Started', link: '/getting-started' },
|
|
15
|
+
{ text: 'Guide', link: '/guide/tables' },
|
|
16
|
+
{ text: 'CLI', link: '/cli/' },
|
|
17
|
+
{ text: 'Reference', link: '/api/' },
|
|
18
|
+
{ text: 'Migrations', link: '/migrations' },
|
|
19
|
+
{ text: 'GitHub', link: 'https://github.com/thekevinscott/dirsql' }
|
|
20
|
+
],
|
|
21
|
+
|
|
22
|
+
sidebar: {
|
|
23
|
+
'/cli/': [
|
|
24
|
+
{
|
|
25
|
+
text: 'CLI',
|
|
26
|
+
items: [
|
|
27
|
+
{ text: 'Overview & Installation', link: '/cli/' },
|
|
28
|
+
{ text: 'Running the Server', link: '/cli/server' },
|
|
29
|
+
{ text: 'Generating a Config (`init`)', link: '/cli/init' },
|
|
30
|
+
{ text: 'Configuration File', link: '/cli/config' },
|
|
31
|
+
{ text: 'HTTP API', link: '/cli/http-api' }
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
'/': [
|
|
36
|
+
{
|
|
37
|
+
text: 'Tutorials',
|
|
38
|
+
items: [
|
|
39
|
+
{ text: 'Getting Started', link: '/getting-started' }
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
text: 'How-to Guides',
|
|
44
|
+
items: [
|
|
45
|
+
{ text: 'Defining Tables', link: '/guide/tables' },
|
|
46
|
+
{ text: 'Querying', link: '/guide/querying' },
|
|
47
|
+
{ text: 'File Watching', link: '/guide/watching' },
|
|
48
|
+
{ text: 'Persistence', link: '/guide/persistence' },
|
|
49
|
+
{ text: 'Async API', link: '/guide/async' },
|
|
50
|
+
{ text: 'Collaboration with CRDTs', link: '/guide/crdt' }
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
text: 'CLI',
|
|
55
|
+
items: [
|
|
56
|
+
{ text: 'Using `dirsql` from the CLI', link: '/cli/' }
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
text: 'Reference',
|
|
61
|
+
items: [
|
|
62
|
+
{ text: 'API Reference', link: '/api/' },
|
|
63
|
+
{ text: 'Migrations', link: '/migrations' }
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
outline: {
|
|
70
|
+
level: [2, 3],
|
|
71
|
+
label: 'On this page'
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
socialLinks: [
|
|
75
|
+
{ icon: 'github', link: 'https://github.com/thekevinscott/dirsql' }
|
|
76
|
+
],
|
|
77
|
+
|
|
78
|
+
footer: {
|
|
79
|
+
message: 'Released under the MIT License.',
|
|
80
|
+
copyright: 'Copyright 2024-present'
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
})
|
|
@@ -42,6 +42,12 @@ The docs follow the [Diataxis](https://diataxis.fr/) framework:
|
|
|
42
42
|
- **Reference** (`api/`) -- information-oriented, API details
|
|
43
43
|
- **Explanation** (`architecture.md`) -- understanding-oriented, design decisions
|
|
44
44
|
|
|
45
|
+
The **CLI** (`cli/`) is a self-contained section reachable from its own
|
|
46
|
+
top-level `CLI` nav tab, with a path-scoped sidebar (`/cli/` key in
|
|
47
|
+
`config.ts`). Everything a CLI user needs -- installation, running the server,
|
|
48
|
+
`init`, the `.dirsql.toml` config file, and the HTTP API -- lives under
|
|
49
|
+
`cli/`. Do not move CLI pages back into `guide/`.
|
|
50
|
+
|
|
45
51
|
## Conventions
|
|
46
52
|
|
|
47
53
|
- Wrap `dirsql` in backticks in all prose text
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
canonical: https://thekevinscott.github.io/dirsql/
|
|
2
|
+
canonical: https://thekevinscott.github.io/dirsql/cli/config
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# Configuration File
|
|
6
6
|
|
|
7
|
-
> Online: <https://thekevinscott.github.io/dirsql/
|
|
7
|
+
> Online: <https://thekevinscott.github.io/dirsql/cli/config>
|
|
8
8
|
|
|
9
9
|
`dirsql` can be configured with a `.dirsql.toml` file. Tables defined this
|
|
10
10
|
way produce **one row per matched file**. Each row's columns come from
|
|
@@ -16,7 +16,7 @@ filesystem facts:
|
|
|
16
16
|
|
|
17
17
|
Content interpretation (parsing JSON, CSV, frontmatter, etc.) is **not**
|
|
18
18
|
configured in `.dirsql.toml`. If you need columns derived from file
|
|
19
|
-
contents, register a programmatic [`Table`](
|
|
19
|
+
contents, register a programmatic [`Table`](../guide/tables.md) whose `extract`
|
|
20
20
|
function does the parsing in your host language.
|
|
21
21
|
|
|
22
22
|
## Basic Example
|
|
@@ -131,7 +131,7 @@ ignore = ["node_modules/**", ".git/**", "*.pyc", "__pycache__/**"]
|
|
|
131
131
|
|
|
132
132
|
The top-level `.dirsql/` directory is always excluded, whether you list it
|
|
133
133
|
or not — it is a reserved namespace for `dirsql`'s own metadata (see
|
|
134
|
-
[Persistence](
|
|
134
|
+
[Persistence](../guide/persistence.md)).
|
|
135
135
|
|
|
136
136
|
## Persistence
|
|
137
137
|
|
|
@@ -144,7 +144,7 @@ persist = true
|
|
|
144
144
|
# persist_path = ".dirsql/cache.db" # optional; this is the default
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
-
See [Persistence](
|
|
147
|
+
See [Persistence](../guide/persistence.md) for the full reconcile algorithm,
|
|
148
148
|
storage layout, and limitations.
|
|
149
149
|
|
|
150
150
|
## Strict Mode
|
|
@@ -163,7 +163,7 @@ strict = true
|
|
|
163
163
|
Strict mode does **not** apply to auto-injected stat virtuals — those are
|
|
164
164
|
always filtered to the DDL's declared columns regardless. Strict mode
|
|
165
165
|
applies only to keys produced by an extract callback (relevant for
|
|
166
|
-
programmatic [tables](
|
|
166
|
+
programmatic [tables](../guide/tables.md)).
|
|
167
167
|
|
|
168
168
|
## Full Example
|
|
169
169
|
|
|
@@ -188,6 +188,6 @@ glob = "logs/*.csv"
|
|
|
188
188
|
|
|
189
189
|
`.dirsql.toml` does not parse file contents. For columns derived from the
|
|
190
190
|
*inside* of files (frontmatter keys, JSON values, CSV cells, etc.),
|
|
191
|
-
register a programmatic [`Table`](
|
|
191
|
+
register a programmatic [`Table`](../guide/tables.md) instead, and parse the
|
|
192
192
|
bytes in your host language. Glob captures and stat virtuals are still
|
|
193
193
|
auto-injected into rows produced by your extract.
|
|
@@ -1,65 +1,16 @@
|
|
|
1
1
|
---
|
|
2
|
-
canonical: https://thekevinscott.github.io/dirsql/
|
|
2
|
+
canonical: https://thekevinscott.github.io/dirsql/cli/http-api
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# HTTP API
|
|
6
6
|
|
|
7
|
-
> Online: <https://thekevinscott.github.io/dirsql/
|
|
7
|
+
> Online: <https://thekevinscott.github.io/dirsql/cli/http-api>
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Once the [server is running](./server.md), `dirsql` exposes two HTTP
|
|
10
|
+
endpoints: `POST /query` for SQL queries and `GET /events` for a real-time
|
|
11
|
+
change stream.
|
|
10
12
|
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
::: code-group
|
|
14
|
-
|
|
15
|
-
```bash [npm]
|
|
16
|
-
npx dirsql
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
```bash [PyPI]
|
|
20
|
-
uvx dirsql
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
```bash [Cargo]
|
|
24
|
-
# Installs the binary only (non-default feature)
|
|
25
|
-
cargo install dirsql --features cli
|
|
26
|
-
dirsql
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
:::
|
|
30
|
-
|
|
31
|
-
::: tip For Rust library consumers
|
|
32
|
-
The `cli` feature is **opt-in**. Adding `dirsql` as a library dependency (`cargo add dirsql`) pulls no CLI dependencies — only the core library. See the [Rust library README](https://github.com/thekevinscott/dirsql/tree/main/packages/rust) for details.
|
|
33
|
-
:::
|
|
34
|
-
|
|
35
|
-
## Subcommands
|
|
36
|
-
|
|
37
|
-
| Command | Purpose |
|
|
38
|
-
|---|---|
|
|
39
|
-
| `dirsql` (no subcommand) | Start the long-lived HTTP server (default behavior, see below). |
|
|
40
|
-
| `dirsql init` | Generate a starter `.dirsql.toml` from the contents of a directory. See [Generating a Config](./init.md). |
|
|
41
|
-
|
|
42
|
-
## Running the server
|
|
43
|
-
|
|
44
|
-
Run `dirsql` from the directory containing your files:
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
dirsql
|
|
48
|
-
|
|
49
|
-
$ Running at localhost:7117
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Flags
|
|
53
|
-
|
|
54
|
-
| Flag | Default | Description |
|
|
55
|
-
|---|---|---|
|
|
56
|
-
| `--config <path>` | `./.dirsql.toml` | Path to the config file. The index is rooted at the directory containing this file. |
|
|
57
|
-
| `--host <addr>` | `localhost` | Bind address |
|
|
58
|
-
| `--port <n>` | `7117` | TCP port to bind |
|
|
59
|
-
|
|
60
|
-
## HTTP API
|
|
61
|
-
|
|
62
|
-
### `POST /query`
|
|
13
|
+
## `POST /query`
|
|
63
14
|
|
|
64
15
|
Run a SQL query. Request body is JSON:
|
|
65
16
|
|
|
@@ -91,9 +42,12 @@ curl -s http://localhost:7117/query \
|
|
|
91
42
|
| jq
|
|
92
43
|
```
|
|
93
44
|
|
|
94
|
-
|
|
45
|
+
The query interface is the same one the SDK exposes; see [Querying](../guide/querying.md)
|
|
46
|
+
for SQL semantics, the read-only restriction, and the return format.
|
|
47
|
+
|
|
48
|
+
## `GET /events`
|
|
95
49
|
|
|
96
|
-
Opens a [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) stream of change events. Each `data:` payload is the same JSON schema the SDK emits from [`db.watch()`](
|
|
50
|
+
Opens a [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) stream of change events. Each `data:` payload is the same JSON schema the SDK emits from [`db.watch()`](../guide/watching.md#event-types):
|
|
97
51
|
|
|
98
52
|
```
|
|
99
53
|
event: row
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
canonical: https://thekevinscott.github.io/dirsql/cli/
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Using `dirsql` from the CLI
|
|
6
|
+
|
|
7
|
+
> Online: <https://thekevinscott.github.io/dirsql/cli/>
|
|
8
|
+
|
|
9
|
+
`dirsql` ships a command-line interface that starts an HTTP server exposing
|
|
10
|
+
the same indexing, querying, and watching functionality as the SDK — no host
|
|
11
|
+
language required. Point it at a directory, give it a [`.dirsql.toml`](./config.md)
|
|
12
|
+
config, and query your files over HTTP.
|
|
13
|
+
|
|
14
|
+
Everything you need to run `dirsql` as a CLI lives in this section:
|
|
15
|
+
|
|
16
|
+
- **[Installation](#installation)** — get the `dirsql` binary.
|
|
17
|
+
- **[Running the Server](./server.md)** — subcommands and flags.
|
|
18
|
+
- **[Generating a Config (`init`)](./init.md)** — scaffold a `.dirsql.toml`.
|
|
19
|
+
- **[Configuration File](./config.md)** — the `.dirsql.toml` format. The CLI
|
|
20
|
+
defines tables exclusively through this file.
|
|
21
|
+
- **[HTTP API](./http-api.md)** — the `POST /query` and `GET /events`
|
|
22
|
+
endpoints, status codes, and event streaming.
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
::: code-group
|
|
27
|
+
|
|
28
|
+
```bash [npm]
|
|
29
|
+
npx dirsql
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```bash [PyPI]
|
|
33
|
+
uvx dirsql
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```bash [Cargo]
|
|
37
|
+
# Installs the binary only (the `cli` feature is non-default)
|
|
38
|
+
cargo install dirsql --features cli
|
|
39
|
+
dirsql
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
:::
|
|
43
|
+
|
|
44
|
+
::: tip For Rust library consumers
|
|
45
|
+
The `cli` feature is **opt-in**. Adding `dirsql` as a library dependency
|
|
46
|
+
(`cargo add dirsql`) pulls no CLI dependencies — only the core library. See the
|
|
47
|
+
[Rust library README](https://github.com/thekevinscott/dirsql/tree/main/packages/rust)
|
|
48
|
+
for the library-vs-CLI feature split.
|
|
49
|
+
:::
|
|
50
|
+
|
|
51
|
+
## Quick start
|
|
52
|
+
|
|
53
|
+
From a directory containing your files and a [`.dirsql.toml`](./config.md):
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
dirsql
|
|
57
|
+
|
|
58
|
+
$ Running at localhost:7117
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Then query it over HTTP:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
curl -s http://localhost:7117/query \
|
|
65
|
+
-H 'content-type: application/json' \
|
|
66
|
+
-d '{"sql":"SELECT COUNT(*) AS n FROM posts"}' \
|
|
67
|
+
| jq
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
See [Running the Server](./server.md) for flags and [HTTP API](./http-api.md)
|
|
71
|
+
for the full endpoint reference.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
canonical: https://thekevinscott.github.io/dirsql/
|
|
2
|
+
canonical: https://thekevinscott.github.io/dirsql/cli/init
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# Generating a config with `dirsql init`
|
|
6
6
|
|
|
7
|
-
> Online: <https://thekevinscott.github.io/dirsql/
|
|
7
|
+
> Online: <https://thekevinscott.github.io/dirsql/cli/init>
|
|
8
8
|
|
|
9
|
-
`dirsql init` generates a `.dirsql.toml` by running `claude` over the target directory.
|
|
9
|
+
`dirsql init` generates a [`.dirsql.toml`](./config.md) by running `claude` over the target directory.
|
|
10
10
|
|
|
11
|
-
The output is limited to filesystem-fact tables. For content-aware schemas, see [Defining Tables](
|
|
11
|
+
The output is limited to filesystem-fact tables. For content-aware schemas, see [Defining Tables](../guide/tables.md).
|
|
12
12
|
|
|
13
13
|
## Examples
|
|
14
14
|
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
canonical: https://thekevinscott.github.io/dirsql/cli/server
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Running the Server
|
|
6
|
+
|
|
7
|
+
> Online: <https://thekevinscott.github.io/dirsql/cli/server>
|
|
8
|
+
|
|
9
|
+
The `dirsql` CLI is an HTTP server that exposes identical SDK functionality
|
|
10
|
+
over [`POST /query`](./http-api.md#post-query) and [`GET /events`](./http-api.md#get-events).
|
|
11
|
+
|
|
12
|
+
## Subcommands
|
|
13
|
+
|
|
14
|
+
| Command | Purpose |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `dirsql` (no subcommand) | Start the long-lived HTTP server (default behavior, see below). |
|
|
17
|
+
| `dirsql init` | Generate a starter `.dirsql.toml` from the contents of a directory. See [Generating a Config](./init.md). |
|
|
18
|
+
|
|
19
|
+
## Running the server
|
|
20
|
+
|
|
21
|
+
Run `dirsql` from the directory containing your files:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
dirsql
|
|
25
|
+
|
|
26
|
+
$ Running at localhost:7117
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The server reads tables from a [`.dirsql.toml`](./config.md) config file. By
|
|
30
|
+
default it looks for `./.dirsql.toml`; override the path with `--config`.
|
|
31
|
+
|
|
32
|
+
## Flags
|
|
33
|
+
|
|
34
|
+
| Flag | Default | Description |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `--config <path>` | `./.dirsql.toml` | Path to the config file. The index is rooted at the directory containing this file. |
|
|
37
|
+
| `--host <addr>` | `localhost` | Bind address |
|
|
38
|
+
| `--port <n>` | `7117` | TCP port to bind |
|
|
39
|
+
|
|
40
|
+
Once the server is running, see the [HTTP API](./http-api.md) for the request
|
|
41
|
+
and response formats.
|
|
@@ -31,7 +31,7 @@ cargo install dirsql --features cli
|
|
|
31
31
|
|
|
32
32
|
:::
|
|
33
33
|
|
|
34
|
-
See the [CLI
|
|
34
|
+
See the [CLI section](./cli/) for details on the command-line interface, and the [Rust library README](https://github.com/thekevinscott/dirsql/tree/main/packages/rust) for the library-vs-CLI feature split.
|
|
35
35
|
|
|
36
36
|
## Quick start
|
|
37
37
|
|
|
@@ -182,5 +182,5 @@ The filesystem is always the source of truth. The database is rebuilt from files
|
|
|
182
182
|
- [Querying](./guide/querying.md) -- SQL queries and return format
|
|
183
183
|
- [File Watching](./guide/watching.md) -- real-time change events
|
|
184
184
|
- [Async API](./guide/async.md) -- async ready(), query(), and watch()
|
|
185
|
-
- [
|
|
185
|
+
- [Using `dirsql` from the CLI](./cli/) -- `dirsql` runs an HTTP server (`POST /query`, `GET /events` SSE)
|
|
186
186
|
- [Collaboration with CRDTs](./guide/crdt.md) -- multi-writer document merging alongside `dirsql`
|
|
@@ -8,6 +8,10 @@ canonical: https://thekevinscott.github.io/dirsql/guide/querying
|
|
|
8
8
|
|
|
9
9
|
Once a `DirSQL` instance is created, the initial directory scan is complete and you can run SQL queries against the indexed data.
|
|
10
10
|
|
|
11
|
+
::: tip From the CLI
|
|
12
|
+
The `dirsql` HTTP server exposes the same query interface over [`POST /query`](../cli/http-api.md#post-query). Send `{"sql": "..."}` and get back the same JSON array of row objects. See the [CLI section](../cli/) for the full server setup.
|
|
13
|
+
:::
|
|
14
|
+
|
|
11
15
|
## Basic queries
|
|
12
16
|
|
|
13
17
|
::: code-group
|
|
@@ -8,6 +8,10 @@ canonical: https://thekevinscott.github.io/dirsql/guide/watching
|
|
|
8
8
|
|
|
9
9
|
`dirsql` can monitor the filesystem for changes and emit events when rows are inserted, updated, or deleted. This is useful for building reactive applications that respond to file changes in real time.
|
|
10
10
|
|
|
11
|
+
::: tip From the CLI
|
|
12
|
+
The `dirsql` HTTP server streams the same events over [`GET /events`](../cli/http-api.md#get-events) as a [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) stream. Each `data:` payload uses the same JSON schema described in [Event types](#event-types) below. See the [CLI section](../cli/) for the full server setup.
|
|
13
|
+
:::
|
|
14
|
+
|
|
11
15
|
## Starting a watch stream
|
|
12
16
|
|
|
13
17
|
::: code-group
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import config from '../../.vitepress/config'
|
|
3
|
+
|
|
4
|
+
type SidebarItem = { text?: string; link?: string; items?: SidebarItem[] }
|
|
5
|
+
|
|
6
|
+
describe('vitepress config', () => {
|
|
7
|
+
it('has the expected site title and base path', () => {
|
|
8
|
+
expect(config.title).toBe('dirsql')
|
|
9
|
+
expect(config.base).toBe('/dirsql/')
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
// Regression guard: CLI docs live in their own `/cli/` section, not
|
|
13
|
+
// interleaved with the SDK how-to guides (see #179).
|
|
14
|
+
it('keeps CLI pages out of the How-to Guides group', () => {
|
|
15
|
+
const sidebar = config.themeConfig!.sidebar as Record<string, SidebarItem[]>
|
|
16
|
+
const howTo = sidebar['/'].find((group) => group.text === 'How-to Guides')
|
|
17
|
+
const links = (howTo!.items ?? []).map((item) => item.link)
|
|
18
|
+
expect(links).not.toContain('/guide/cli')
|
|
19
|
+
expect(links).not.toContain('/guide/init')
|
|
20
|
+
expect(links).not.toContain('/guide/config')
|
|
21
|
+
})
|
|
22
|
+
})
|
|
@@ -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.3.
|
|
7
|
+
version = "0.3.6"
|
|
8
8
|
edition.workspace = true
|
|
9
9
|
publish = false
|
|
10
10
|
readme = "README.md"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { defineConfig } from 'vitepress'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
title: 'dirsql',
|
|
5
|
+
description: 'Ephemeral SQL index over a local directory. Watches a filesystem, ingests structured files into an in-memory SQLite database, and exposes a SQL query interface.',
|
|
6
|
+
base: '/dirsql/',
|
|
7
|
+
|
|
8
|
+
themeConfig: {
|
|
9
|
+
search: {
|
|
10
|
+
provider: 'local'
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
nav: [
|
|
14
|
+
{ text: 'Getting Started', link: '/getting-started' },
|
|
15
|
+
{ text: 'Guide', link: '/guide/tables' },
|
|
16
|
+
{ text: 'CLI', link: '/cli/' },
|
|
17
|
+
{ text: 'Reference', link: '/api/' },
|
|
18
|
+
{ text: 'Migrations', link: '/migrations' },
|
|
19
|
+
{ text: 'GitHub', link: 'https://github.com/thekevinscott/dirsql' }
|
|
20
|
+
],
|
|
21
|
+
|
|
22
|
+
sidebar: {
|
|
23
|
+
'/cli/': [
|
|
24
|
+
{
|
|
25
|
+
text: 'CLI',
|
|
26
|
+
items: [
|
|
27
|
+
{ text: 'Overview & Installation', link: '/cli/' },
|
|
28
|
+
{ text: 'Running the Server', link: '/cli/server' },
|
|
29
|
+
{ text: 'Generating a Config (`init`)', link: '/cli/init' },
|
|
30
|
+
{ text: 'Configuration File', link: '/cli/config' },
|
|
31
|
+
{ text: 'HTTP API', link: '/cli/http-api' }
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
'/': [
|
|
36
|
+
{
|
|
37
|
+
text: 'Tutorials',
|
|
38
|
+
items: [
|
|
39
|
+
{ text: 'Getting Started', link: '/getting-started' }
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
text: 'How-to Guides',
|
|
44
|
+
items: [
|
|
45
|
+
{ text: 'Defining Tables', link: '/guide/tables' },
|
|
46
|
+
{ text: 'Querying', link: '/guide/querying' },
|
|
47
|
+
{ text: 'File Watching', link: '/guide/watching' },
|
|
48
|
+
{ text: 'Persistence', link: '/guide/persistence' },
|
|
49
|
+
{ text: 'Async API', link: '/guide/async' },
|
|
50
|
+
{ text: 'Collaboration with CRDTs', link: '/guide/crdt' }
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
text: 'CLI',
|
|
55
|
+
items: [
|
|
56
|
+
{ text: 'Using `dirsql` from the CLI', link: '/cli/' }
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
text: 'Reference',
|
|
61
|
+
items: [
|
|
62
|
+
{ text: 'API Reference', link: '/api/' },
|
|
63
|
+
{ text: 'Migrations', link: '/migrations' }
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
outline: {
|
|
70
|
+
level: [2, 3],
|
|
71
|
+
label: 'On this page'
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
socialLinks: [
|
|
75
|
+
{ icon: 'github', link: 'https://github.com/thekevinscott/dirsql' }
|
|
76
|
+
],
|
|
77
|
+
|
|
78
|
+
footer: {
|
|
79
|
+
message: 'Released under the MIT License.',
|
|
80
|
+
copyright: 'Copyright 2024-present'
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
})
|
|
@@ -42,6 +42,12 @@ The docs follow the [Diataxis](https://diataxis.fr/) framework:
|
|
|
42
42
|
- **Reference** (`api/`) -- information-oriented, API details
|
|
43
43
|
- **Explanation** (`architecture.md`) -- understanding-oriented, design decisions
|
|
44
44
|
|
|
45
|
+
The **CLI** (`cli/`) is a self-contained section reachable from its own
|
|
46
|
+
top-level `CLI` nav tab, with a path-scoped sidebar (`/cli/` key in
|
|
47
|
+
`config.ts`). Everything a CLI user needs -- installation, running the server,
|
|
48
|
+
`init`, the `.dirsql.toml` config file, and the HTTP API -- lives under
|
|
49
|
+
`cli/`. Do not move CLI pages back into `guide/`.
|
|
50
|
+
|
|
45
51
|
## Conventions
|
|
46
52
|
|
|
47
53
|
- Wrap `dirsql` in backticks in all prose text
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
canonical: https://thekevinscott.github.io/dirsql/
|
|
2
|
+
canonical: https://thekevinscott.github.io/dirsql/cli/config
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
# Configuration File
|
|
6
6
|
|
|
7
|
-
> Online: <https://thekevinscott.github.io/dirsql/
|
|
7
|
+
> Online: <https://thekevinscott.github.io/dirsql/cli/config>
|
|
8
8
|
|
|
9
9
|
`dirsql` can be configured with a `.dirsql.toml` file. Tables defined this
|
|
10
10
|
way produce **one row per matched file**. Each row's columns come from
|
|
@@ -16,7 +16,7 @@ filesystem facts:
|
|
|
16
16
|
|
|
17
17
|
Content interpretation (parsing JSON, CSV, frontmatter, etc.) is **not**
|
|
18
18
|
configured in `.dirsql.toml`. If you need columns derived from file
|
|
19
|
-
contents, register a programmatic [`Table`](
|
|
19
|
+
contents, register a programmatic [`Table`](../guide/tables.md) whose `extract`
|
|
20
20
|
function does the parsing in your host language.
|
|
21
21
|
|
|
22
22
|
## Basic Example
|
|
@@ -131,7 +131,7 @@ ignore = ["node_modules/**", ".git/**", "*.pyc", "__pycache__/**"]
|
|
|
131
131
|
|
|
132
132
|
The top-level `.dirsql/` directory is always excluded, whether you list it
|
|
133
133
|
or not — it is a reserved namespace for `dirsql`'s own metadata (see
|
|
134
|
-
[Persistence](
|
|
134
|
+
[Persistence](../guide/persistence.md)).
|
|
135
135
|
|
|
136
136
|
## Persistence
|
|
137
137
|
|
|
@@ -144,7 +144,7 @@ persist = true
|
|
|
144
144
|
# persist_path = ".dirsql/cache.db" # optional; this is the default
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
-
See [Persistence](
|
|
147
|
+
See [Persistence](../guide/persistence.md) for the full reconcile algorithm,
|
|
148
148
|
storage layout, and limitations.
|
|
149
149
|
|
|
150
150
|
## Strict Mode
|
|
@@ -163,7 +163,7 @@ strict = true
|
|
|
163
163
|
Strict mode does **not** apply to auto-injected stat virtuals — those are
|
|
164
164
|
always filtered to the DDL's declared columns regardless. Strict mode
|
|
165
165
|
applies only to keys produced by an extract callback (relevant for
|
|
166
|
-
programmatic [tables](
|
|
166
|
+
programmatic [tables](../guide/tables.md)).
|
|
167
167
|
|
|
168
168
|
## Full Example
|
|
169
169
|
|
|
@@ -188,6 +188,6 @@ glob = "logs/*.csv"
|
|
|
188
188
|
|
|
189
189
|
`.dirsql.toml` does not parse file contents. For columns derived from the
|
|
190
190
|
*inside* of files (frontmatter keys, JSON values, CSV cells, etc.),
|
|
191
|
-
register a programmatic [`Table`](
|
|
191
|
+
register a programmatic [`Table`](../guide/tables.md) instead, and parse the
|
|
192
192
|
bytes in your host language. Glob captures and stat virtuals are still
|
|
193
193
|
auto-injected into rows produced by your extract.
|