dirsql 0.3.85__tar.gz → 0.3.86__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. {dirsql-0.3.85 → dirsql-0.3.86}/Cargo.lock +1 -1
  2. {dirsql-0.3.85 → dirsql-0.3.86}/PKG-INFO +1 -1
  3. {dirsql-0.3.85/packages/rust → dirsql-0.3.86}/docs/reference/config.md +5 -1
  4. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/Cargo.toml +1 -1
  5. {dirsql-0.3.85 → dirsql-0.3.86/packages/python}/docs/reference/config.md +5 -1
  6. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/e2e-attestation.json +2 -2
  7. {dirsql-0.3.85/packages/python → dirsql-0.3.86/packages/rust}/docs/reference/config.md +5 -1
  8. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/config.rs +47 -5
  9. {dirsql-0.3.85 → dirsql-0.3.86}/Cargo.toml +0 -0
  10. {dirsql-0.3.85 → dirsql-0.3.86}/README.md +0 -0
  11. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/__init__.py +0 -0
  12. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/_async.py +0 -0
  13. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/_dirsql.pyi +0 -0
  14. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/cli/__init__.py +0 -0
  15. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/cli/binary_path.py +0 -0
  16. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/cli/is_windows.py +0 -0
  17. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/cli/main.py +0 -0
  18. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/cli/resolve_config_extensions.py +0 -0
  19. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/py.typed +0 -0
  20. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/resolve_config_extensions.py +0 -0
  21. {dirsql-0.3.85 → dirsql-0.3.86}/dirsql/resolve_extension.py +0 -0
  22. {dirsql-0.3.85 → dirsql-0.3.86}/docs/.claude/CLAUDE.md +0 -0
  23. {dirsql-0.3.85 → dirsql-0.3.86}/docs/.vitepress/config.ts +0 -0
  24. {dirsql-0.3.85 → dirsql-0.3.86}/docs/.vitepress/theme/index.ts +0 -0
  25. {dirsql-0.3.85 → dirsql-0.3.86}/docs/.vitepress/theme/lang.ts +0 -0
  26. {dirsql-0.3.85 → dirsql-0.3.86}/docs/AGENTS.md +0 -0
  27. {dirsql-0.3.85 → dirsql-0.3.86}/docs/explanation.md +0 -0
  28. {dirsql-0.3.85 → dirsql-0.3.86}/docs/getting-started.md +0 -0
  29. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/columns-from-paths.md +0 -0
  30. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/define-tables.md +0 -0
  31. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/embed.md +0 -0
  32. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/extract-from-contents.md +0 -0
  33. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/load-extension.md +0 -0
  34. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/persist.md +0 -0
  35. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/react-to-changes.md +0 -0
  36. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/search-by-meaning.md +0 -0
  37. {dirsql-0.3.85 → dirsql-0.3.86}/docs/howto/skip-files.md +0 -0
  38. {dirsql-0.3.85 → dirsql-0.3.86}/docs/index.md +0 -0
  39. {dirsql-0.3.85 → dirsql-0.3.86}/docs/migrations.md +0 -0
  40. {dirsql-0.3.85 → dirsql-0.3.86}/docs/package.json +0 -0
  41. {dirsql-0.3.85 → dirsql-0.3.86}/docs/playwright.config.ts +0 -0
  42. {dirsql-0.3.85 → dirsql-0.3.86}/docs/pnpm-lock.yaml +0 -0
  43. {dirsql-0.3.85 → dirsql-0.3.86}/docs/pnpm-workspace.yaml +0 -0
  44. {dirsql-0.3.85 → dirsql-0.3.86}/docs/reference/cli.md +0 -0
  45. {dirsql-0.3.85 → dirsql-0.3.86}/docs/reference/columns.md +0 -0
  46. {dirsql-0.3.85 → dirsql-0.3.86}/docs/reference/hooks.md +0 -0
  47. {dirsql-0.3.85 → dirsql-0.3.86}/docs/reference/http-api.md +0 -0
  48. {dirsql-0.3.85 → dirsql-0.3.86}/docs/reference/sdk.md +0 -0
  49. {dirsql-0.3.85 → dirsql-0.3.86}/docs/tests/integration/home.spec.ts +0 -0
  50. {dirsql-0.3.85 → dirsql-0.3.86}/docs/tests/integration/language-flag.spec.ts +0 -0
  51. {dirsql-0.3.85 → dirsql-0.3.86}/docs/tests/integration/sidebar.spec.ts +0 -0
  52. {dirsql-0.3.85 → dirsql-0.3.86}/docs/tests/unit/config.test.ts +0 -0
  53. {dirsql-0.3.85 → dirsql-0.3.86}/docs/tests/unit/lang.test.ts +0 -0
  54. {dirsql-0.3.85 → dirsql-0.3.86}/docs/vitest.config.ts +0 -0
  55. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/README.md +0 -0
  56. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/conftest.py +0 -0
  57. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/.claude/CLAUDE.md +0 -0
  58. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/.vitepress/config.ts +0 -0
  59. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  60. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  61. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/AGENTS.md +0 -0
  62. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/explanation.md +0 -0
  63. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/getting-started.md +0 -0
  64. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/columns-from-paths.md +0 -0
  65. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/define-tables.md +0 -0
  66. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/embed.md +0 -0
  67. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/extract-from-contents.md +0 -0
  68. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/load-extension.md +0 -0
  69. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/persist.md +0 -0
  70. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/react-to-changes.md +0 -0
  71. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/search-by-meaning.md +0 -0
  72. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/howto/skip-files.md +0 -0
  73. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/index.md +0 -0
  74. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/migrations.md +0 -0
  75. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/package.json +0 -0
  76. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/playwright.config.ts +0 -0
  77. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/pnpm-lock.yaml +0 -0
  78. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/pnpm-workspace.yaml +0 -0
  79. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/reference/cli.md +0 -0
  80. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/reference/columns.md +0 -0
  81. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/reference/hooks.md +0 -0
  82. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/reference/http-api.md +0 -0
  83. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/reference/sdk.md +0 -0
  84. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/tests/integration/home.spec.ts +0 -0
  85. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/tests/integration/language-flag.spec.ts +0 -0
  86. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/tests/integration/sidebar.spec.ts +0 -0
  87. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/tests/unit/config.test.ts +0 -0
  88. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/tests/unit/lang.test.ts +0 -0
  89. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/docs/vitest.config.ts +0 -0
  90. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/src/lib.rs +0 -0
  91. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/tests/__init__.py +0 -0
  92. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/tests/conftest.py +0 -0
  93. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/tests/e2e/__init__.py +0 -0
  94. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/tests/integration/__init__.py +0 -0
  95. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/tests/integration/binding/__init__.py +0 -0
  96. {dirsql-0.3.85 → dirsql-0.3.86}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  97. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/Cargo.toml +0 -0
  98. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/README.md +0 -0
  99. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/benches/db_bench.rs +0 -0
  100. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/benches/differ_bench.rs +0 -0
  101. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/benches/matcher_bench.rs +0 -0
  102. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/benches/scanner_bench.rs +0 -0
  103. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/explanation.md +0 -0
  104. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/getting-started.md +0 -0
  105. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  106. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/define-tables.md +0 -0
  107. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/embed.md +0 -0
  108. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  109. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/load-extension.md +0 -0
  110. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/persist.md +0 -0
  111. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/react-to-changes.md +0 -0
  112. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  113. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/howto/skip-files.md +0 -0
  114. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/index.md +0 -0
  115. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/migrations.md +0 -0
  116. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/reference/cli.md +0 -0
  117. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/reference/columns.md +0 -0
  118. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/reference/hooks.md +0 -0
  119. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/reference/http-api.md +0 -0
  120. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/docs/reference/sdk.md +0 -0
  121. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/bin/dirsql.rs +0 -0
  122. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/cli/execute.rs +0 -0
  123. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/cli/init.rs +0 -0
  124. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/cli/mod.rs +0 -0
  125. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/cli/router.rs +0 -0
  126. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/cli/serialize.rs +0 -0
  127. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/cli/server.rs +0 -0
  128. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/command.rs +0 -0
  129. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/db.rs +0 -0
  130. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/default_config.toml +0 -0
  131. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/differ.rs +0 -0
  132. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/lib.rs +0 -0
  133. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/matcher.rs +0 -0
  134. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/persist.rs +0 -0
  135. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/scanner.rs +0 -0
  136. {dirsql-0.3.85 → dirsql-0.3.86}/packages/rust/src/watcher.rs +0 -0
  137. {dirsql-0.3.85 → dirsql-0.3.86}/pyproject.toml +0 -0
@@ -500,7 +500,7 @@ dependencies = [
500
500
 
501
501
  [[package]]
502
502
  name = "dirsql-py-ext"
503
- version = "0.3.85"
503
+ version = "0.3.86"
504
504
  dependencies = [
505
505
  "dirsql",
506
506
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.3.85
3
+ Version: 0.3.86
4
4
  Summary: Ephemeral SQL index over a local directory
5
5
  Keywords: sql,filesystem,directory,sqlite,index
6
6
  Author: Kevin Scott
@@ -3,7 +3,9 @@
3
3
  `.dirsql.toml` is a TOML file with one optional `[dirsql]` section, zero or
4
4
  more `[[dirsql.extension]]` entries, and zero or more `[[table]]` entries.
5
5
  An empty file is valid. A missing `[dirsql]` section behaves as an
6
- all-defaults one. Unknown keys are ignored.
6
+ all-defaults one. Unknown keys are a parse error at every level (top level,
7
+ `[dirsql]`, `[[table]]`, `[[dirsql.extension]]`) — a typo or a removed key
8
+ fails loudly, naming the offending key, rather than silently no-opping.
7
9
 
8
10
  The [CLI](./cli.md) loads `./.dirsql.toml` by default (`--config <path>`
9
11
  overrides). The [SDKs](./sdk.md) load a config via the `config` constructor
@@ -136,6 +138,8 @@ Loading fails (the CLI enters [degraded mode](./cli.md#degraded-mode); the
136
138
  SDKs raise/reject) when:
137
139
 
138
140
  - The TOML is malformed.
141
+ - Any table contains an unknown key (top level, `[dirsql]`, `[[table]]`, or
142
+ `[[dirsql.extension]]`). The error names the offending key.
139
143
  - A `[[table]]` entry omits `ddl` or `glob`.
140
144
  - A `[[dirsql.extension]]` entry omits `path`, or `path` is empty.
141
145
  - `on-file`, `pre-query`, or `post-query` is present but empty/whitespace.
@@ -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.85"
7
+ version = "0.3.86"
8
8
  # abi3 note: the `abi3-py311` pyo3 feature (below) builds ONE stable-ABI
9
9
  # `cp311-abi3` wheel per platform that loads on every CPython >= 3.11
10
10
  # (matching `pyproject.toml`'s `requires-python = ">=3.11"`), instead of
@@ -3,7 +3,9 @@
3
3
  `.dirsql.toml` is a TOML file with one optional `[dirsql]` section, zero or
4
4
  more `[[dirsql.extension]]` entries, and zero or more `[[table]]` entries.
5
5
  An empty file is valid. A missing `[dirsql]` section behaves as an
6
- all-defaults one. Unknown keys are ignored.
6
+ all-defaults one. Unknown keys are a parse error at every level (top level,
7
+ `[dirsql]`, `[[table]]`, `[[dirsql.extension]]`) — a typo or a removed key
8
+ fails loudly, naming the offending key, rather than silently no-opping.
7
9
 
8
10
  The [CLI](./cli.md) loads `./.dirsql.toml` by default (`--config <path>`
9
11
  overrides). The [SDKs](./sdk.md) load a config via the `config` constructor
@@ -136,6 +138,8 @@ Loading fails (the CLI enters [degraded mode](./cli.md#degraded-mode); the
136
138
  SDKs raise/reject) when:
137
139
 
138
140
  - The TOML is malformed.
141
+ - Any table contains an unknown key (top level, `[dirsql]`, `[[table]]`, or
142
+ `[[dirsql.extension]]`). The error names the offending key.
139
143
  - A `[[table]]` entry omits `ddl` or `glob`.
140
144
  - A `[[dirsql.extension]]` entry omits `path`, or `path` is empty.
141
145
  - `on-file`, `pre-query`, or `post-query` is present but empty/whitespace.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "command": "uv run python -m pytest tests/e2e/ -x -q",
3
- "ran_at": 1783627504,
3
+ "ran_at": 1783631000,
4
4
  "exit_code": 0,
5
- "commit": "beec6f594a507116377066bdf2102b029554b6d0"
5
+ "commit": "10123e5e2561015cbf7cceb07e838145f32318b9"
6
6
  }
@@ -3,7 +3,9 @@
3
3
  `.dirsql.toml` is a TOML file with one optional `[dirsql]` section, zero or
4
4
  more `[[dirsql.extension]]` entries, and zero or more `[[table]]` entries.
5
5
  An empty file is valid. A missing `[dirsql]` section behaves as an
6
- all-defaults one. Unknown keys are ignored.
6
+ all-defaults one. Unknown keys are a parse error at every level (top level,
7
+ `[dirsql]`, `[[table]]`, `[[dirsql.extension]]`) — a typo or a removed key
8
+ fails loudly, naming the offending key, rather than silently no-opping.
7
9
 
8
10
  The [CLI](./cli.md) loads `./.dirsql.toml` by default (`--config <path>`
9
11
  overrides). The [SDKs](./sdk.md) load a config via the `config` constructor
@@ -136,6 +138,8 @@ Loading fails (the CLI enters [degraded mode](./cli.md#degraded-mode); the
136
138
  SDKs raise/reject) when:
137
139
 
138
140
  - The TOML is malformed.
141
+ - Any table contains an unknown key (top level, `[dirsql]`, `[[table]]`, or
142
+ `[[dirsql.extension]]`). The error names the offending key.
139
143
  - A `[[table]]` entry omits `ddl` or `glob`.
140
144
  - A `[[dirsql.extension]]` entry omits `path`, or `path` is empty.
141
145
  - `on-file`, `pre-query`, or `post-query` is present but empty/whitespace.
@@ -269,12 +269,14 @@ pub struct TableConfig {
269
269
  }
270
270
 
271
271
  #[derive(Deserialize)]
272
+ #[serde(deny_unknown_fields)]
272
273
  struct RawConfig {
273
274
  dirsql: Option<RawDirsql>,
274
275
  table: Option<Vec<RawTable>>,
275
276
  }
276
277
 
277
278
  #[derive(Deserialize, Default)]
279
+ #[serde(deny_unknown_fields)]
278
280
  struct RawDirsql {
279
281
  root: Option<PathBuf>,
280
282
  ignore: Option<Vec<String>>,
@@ -290,12 +292,14 @@ struct RawDirsql {
290
292
  }
291
293
 
292
294
  #[derive(Deserialize)]
295
+ #[serde(deny_unknown_fields)]
293
296
  struct RawExtension {
294
297
  path: Option<String>,
295
298
  entrypoint: Option<String>,
296
299
  }
297
300
 
298
301
  #[derive(Deserialize)]
302
+ #[serde(deny_unknown_fields)]
299
303
  struct RawTable {
300
304
  ddl: Option<String>,
301
305
  glob: Option<String>,
@@ -587,17 +591,55 @@ glob = "c/*.yaml"
587
591
  }
588
592
 
589
593
  #[test]
590
- fn unknown_top_level_keys_in_table_are_rejected() {
591
- // serde ignores unknown table keys, so configs still carrying removed
592
- // keys (e.g. `format`) load with the key dropped.
594
+ fn unknown_key_in_table_is_rejected() {
595
+ // An unknown `[[table]]` key (a removed key like `format`, or a typo)
596
+ // is a hard parse error naming the key, never silently dropped.
593
597
  let toml = r#"
594
598
  [[table]]
595
599
  ddl = "CREATE TABLE t (path TEXT)"
596
600
  glob = "*.json"
597
601
  format = "json"
598
602
  "#;
599
- let config = load_config_str(toml).unwrap();
600
- assert_eq!(config.tables.len(), 1);
603
+ let err = load_config_str(toml).unwrap_err();
604
+ assert!(matches!(err, ConfigError::Toml(_)), "got: {err:?}");
605
+ assert!(err.to_string().contains("format"), "got: {err}");
606
+ }
607
+
608
+ #[test]
609
+ fn unknown_key_in_dirsql_section_is_rejected() {
610
+ // A misspelled `[dirsql]` key (`persistpath` for `persist_path`) errors
611
+ // rather than silently no-opping.
612
+ let toml = r#"
613
+ [dirsql]
614
+ persistpath = "cache.db"
615
+ "#;
616
+ let err = load_config_str(toml).unwrap_err();
617
+ assert!(matches!(err, ConfigError::Toml(_)), "got: {err:?}");
618
+ assert!(err.to_string().contains("persistpath"), "got: {err}");
619
+ }
620
+
621
+ #[test]
622
+ fn unknown_top_level_key_is_rejected() {
623
+ // A stray key outside any known section (`glbo` for `[dirsql]`) errors.
624
+ let toml = r#"
625
+ glbo = "typo"
626
+ "#;
627
+ let err = load_config_str(toml).unwrap_err();
628
+ assert!(matches!(err, ConfigError::Toml(_)), "got: {err:?}");
629
+ assert!(err.to_string().contains("glbo"), "got: {err}");
630
+ }
631
+
632
+ #[test]
633
+ fn unknown_key_in_extension_is_rejected() {
634
+ // A misspelled `[[dirsql.extension]]` key (`entrypont`) errors.
635
+ let toml = r#"
636
+ [[dirsql.extension]]
637
+ path = "vec0.so"
638
+ entrypont = "sqlite3_vec_init"
639
+ "#;
640
+ let err = load_config_str(toml).unwrap_err();
641
+ assert!(matches!(err, ConfigError::Toml(_)), "got: {err:?}");
642
+ assert!(err.to_string().contains("entrypont"), "got: {err}");
601
643
  }
602
644
 
603
645
  #[test]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes