dirsql 0.4.46__tar.gz → 0.4.47__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 (233) hide show
  1. {dirsql-0.4.46 → dirsql-0.4.47}/Cargo.lock +2 -2
  2. {dirsql-0.4.46 → dirsql-0.4.47}/PKG-INFO +1 -1
  3. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/_dirsql.pyi +3 -1
  4. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/resolve_extension.py +6 -14
  5. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/Cargo.toml +1 -1
  6. dirsql-0.4.47/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +8 -0
  7. dirsql-0.4.47/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +7 -0
  8. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/src/lib.rs +31 -9
  9. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/Cargo.toml +1 -1
  10. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/extension_resolution.rs +98 -1
  11. {dirsql-0.4.46 → dirsql-0.4.47}/Cargo.toml +0 -0
  12. {dirsql-0.4.46 → dirsql-0.4.47}/README.md +0 -0
  13. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/__init__.py +0 -0
  14. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/_async.py +0 -0
  15. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/__init__.py +0 -0
  16. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/discover_plugins/__init__.py +0 -0
  17. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  18. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  19. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  20. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/discover_plugins/user_passed_config.py +0 -0
  21. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  22. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/main.py +0 -0
  23. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/cli/resolve_config_extensions.py +0 -0
  24. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/plan_entry_path.py +0 -0
  25. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/py.typed +0 -0
  26. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/read_config.py +0 -0
  27. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/resolve_configs_extension_specs.py +0 -0
  28. {dirsql-0.4.46 → dirsql-0.4.47}/dirsql/resolve_package.py +0 -0
  29. {dirsql-0.4.46 → dirsql-0.4.47}/docs/.claude/CLAUDE.md +0 -0
  30. {dirsql-0.4.46 → dirsql-0.4.47}/docs/.vitepress/config.ts +0 -0
  31. {dirsql-0.4.46 → dirsql-0.4.47}/docs/.vitepress/theme/index.ts +0 -0
  32. {dirsql-0.4.46 → dirsql-0.4.47}/docs/.vitepress/theme/lang.ts +0 -0
  33. {dirsql-0.4.46 → dirsql-0.4.47}/docs/AGENTS.md +0 -0
  34. {dirsql-0.4.46 → dirsql-0.4.47}/docs/explanation.md +0 -0
  35. {dirsql-0.4.46 → dirsql-0.4.47}/docs/getting-started.md +0 -0
  36. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/columns-from-paths.md +0 -0
  37. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/define-tables.md +0 -0
  38. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/embed.md +0 -0
  39. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/extract-from-contents.md +0 -0
  40. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/load-extension.md +0 -0
  41. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/parse-files-into-columns.md +0 -0
  42. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/persist.md +0 -0
  43. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/query-json.md +0 -0
  44. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/query-without-config.md +0 -0
  45. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/react-to-changes.md +0 -0
  46. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/search-by-meaning.md +0 -0
  47. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/search-indexes.md +0 -0
  48. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/skip-files.md +0 -0
  49. {dirsql-0.4.46 → dirsql-0.4.47}/docs/howto/write-a-plugin.md +0 -0
  50. {dirsql-0.4.46 → dirsql-0.4.47}/docs/index.md +0 -0
  51. {dirsql-0.4.46 → dirsql-0.4.47}/docs/package.json +0 -0
  52. {dirsql-0.4.46 → dirsql-0.4.47}/docs/plugins.md +0 -0
  53. {dirsql-0.4.46 → dirsql-0.4.47}/docs/pnpm-lock.yaml +0 -0
  54. {dirsql-0.4.46 → dirsql-0.4.47}/docs/pnpm-workspace.yaml +0 -0
  55. {dirsql-0.4.46 → dirsql-0.4.47}/docs/reference/cli.md +0 -0
  56. {dirsql-0.4.46 → dirsql-0.4.47}/docs/reference/columns.md +0 -0
  57. {dirsql-0.4.46 → dirsql-0.4.47}/docs/reference/config.md +0 -0
  58. {dirsql-0.4.46 → dirsql-0.4.47}/docs/reference/hooks.md +0 -0
  59. {dirsql-0.4.46 → dirsql-0.4.47}/docs/reference/http-api.md +0 -0
  60. {dirsql-0.4.46 → dirsql-0.4.47}/docs/reference/path-tables.md +0 -0
  61. {dirsql-0.4.46 → dirsql-0.4.47}/docs/reference/sdk.md +0 -0
  62. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/CHANGELOG.md +0 -0
  63. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/MIGRATIONS.md +0 -0
  64. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/README.md +0 -0
  65. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  66. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  67. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  68. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  69. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  70. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  71. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  72. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  73. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  74. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  75. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  76. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  77. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  78. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  79. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  80. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  81. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  82. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  83. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  84. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  85. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  86. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  87. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  88. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  89. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  90. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/changelog.d/README.md +0 -0
  91. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/conftest.py +0 -0
  92. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/.claude/CLAUDE.md +0 -0
  93. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/.vitepress/config.ts +0 -0
  94. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  95. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  96. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/AGENTS.md +0 -0
  97. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/explanation.md +0 -0
  98. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/getting-started.md +0 -0
  99. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/columns-from-paths.md +0 -0
  100. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/define-tables.md +0 -0
  101. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/embed.md +0 -0
  102. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/extract-from-contents.md +0 -0
  103. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/load-extension.md +0 -0
  104. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  105. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/persist.md +0 -0
  106. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/query-json.md +0 -0
  107. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/query-without-config.md +0 -0
  108. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/react-to-changes.md +0 -0
  109. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/search-by-meaning.md +0 -0
  110. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/search-indexes.md +0 -0
  111. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/skip-files.md +0 -0
  112. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/howto/write-a-plugin.md +0 -0
  113. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/index.md +0 -0
  114. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/package.json +0 -0
  115. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/plugins.md +0 -0
  116. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/pnpm-lock.yaml +0 -0
  117. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/pnpm-workspace.yaml +0 -0
  118. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/reference/cli.md +0 -0
  119. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/reference/columns.md +0 -0
  120. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/reference/config.md +0 -0
  121. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/reference/hooks.md +0 -0
  122. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/reference/http-api.md +0 -0
  123. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/reference/path-tables.md +0 -0
  124. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/docs/reference/sdk.md +0 -0
  125. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  126. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  127. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  128. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  129. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  130. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  131. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  132. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  133. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  134. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  135. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  136. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  137. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  138. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  139. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  140. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  141. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  142. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  143. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  144. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  145. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  146. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  147. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  148. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  149. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  150. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  151. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  152. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  153. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  154. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  155. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  156. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  157. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  158. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  159. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  160. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  161. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/migrations.d/README.md +0 -0
  162. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/testing-conventions.toml +0 -0
  163. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/__init__.py +0 -0
  164. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/conftest.py +0 -0
  165. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/e2e/__init__.py +0 -0
  166. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  167. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  168. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/integration/__init__.py +0 -0
  169. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/integration/binding/__init__.py +0 -0
  170. {dirsql-0.4.46 → dirsql-0.4.47}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  171. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/CHANGELOG.md +0 -0
  172. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/MIGRATIONS.md +0 -0
  173. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/README.md +0 -0
  174. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/benches/db_bench.rs +0 -0
  175. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/benches/differ_bench.rs +0 -0
  176. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/benches/matcher_bench.rs +0 -0
  177. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/benches/scanner_bench.rs +0 -0
  178. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/explanation.md +0 -0
  179. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/getting-started.md +0 -0
  180. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  181. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/define-tables.md +0 -0
  182. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/embed.md +0 -0
  183. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  184. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/load-extension.md +0 -0
  185. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  186. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/persist.md +0 -0
  187. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/query-json.md +0 -0
  188. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/query-without-config.md +0 -0
  189. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/react-to-changes.md +0 -0
  190. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  191. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/search-indexes.md +0 -0
  192. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/skip-files.md +0 -0
  193. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  194. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/index.md +0 -0
  195. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/plugins.md +0 -0
  196. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/reference/cli.md +0 -0
  197. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/reference/columns.md +0 -0
  198. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/reference/config.md +0 -0
  199. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/reference/hooks.md +0 -0
  200. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/reference/http-api.md +0 -0
  201. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/reference/path-tables.md +0 -0
  202. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/docs/reference/sdk.md +0 -0
  203. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/bin/dirsql.rs +0 -0
  204. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/execute.rs +0 -0
  205. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/init.rs +0 -0
  206. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/mod.rs +0 -0
  207. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/repl.rs +0 -0
  208. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/router.rs +0 -0
  209. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/run.rs +0 -0
  210. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/serialize.rs +0 -0
  211. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/server.rs +0 -0
  212. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/cli/table.rs +0 -0
  213. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/command.rs +0 -0
  214. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/config.rs +0 -0
  215. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/db.rs +0 -0
  216. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/default_config.toml +0 -0
  217. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/differ.rs +0 -0
  218. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/functions.rs +0 -0
  219. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/infer.rs +0 -0
  220. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/launcher.rs +0 -0
  221. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/lib.rs +0 -0
  222. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/matcher.rs +0 -0
  223. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/parsed_cache.rs +0 -0
  224. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/parsed_vtab.rs +0 -0
  225. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/path_table.rs +0 -0
  226. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/persist.rs +0 -0
  227. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/progress.rs +0 -0
  228. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/scanner.rs +0 -0
  229. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/sql_literal.rs +0 -0
  230. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/vtab.rs +0 -0
  231. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/vtab_scaffold.rs +0 -0
  232. {dirsql-0.4.46 → dirsql-0.4.47}/packages/rust/src/watcher.rs +0 -0
  233. {dirsql-0.4.46 → dirsql-0.4.47}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.46"
555
+ version = "0.4.47"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -597,7 +597,7 @@ dependencies = [
597
597
 
598
598
  [[package]]
599
599
  name = "dirsql-py-ext"
600
- version = "0.4.46"
600
+ version = "0.4.47"
601
601
  dependencies = [
602
602
  "dirsql",
603
603
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.46
3
+ Version: 0.4.47
4
4
  Requires-Dist: bin-shim>=0.1
5
5
  Summary: Ephemeral SQL index over a local directory
6
6
  Keywords: sql,filesystem,directory,sqlite,index
@@ -97,4 +97,6 @@ def plan_config_extensions(
97
97
  configs: list[tuple[str, str | None]],
98
98
  ) -> list[ExtensionPlanEntry] | None: ...
99
99
  def select_loadable(name: str, dirs: list[str], candidates: list[str]) -> str: ...
100
- def is_bare_name(path: str) -> bool: ...
100
+ def plan_extension_path(
101
+ path: str, base: str, resolve_relative: bool
102
+ ) -> ExtensionPlanEntry: ...
@@ -1,7 +1,8 @@
1
1
  """Resolve an extension entry's ``path`` to a concrete loadable file.
2
2
 
3
- Resolution is an ordered probe (file-first, then package), so only a bare
4
- package name reaches the package machinery:
3
+ Resolution is an ordered probe (file-first, then package), planned by the core
4
+ (``_dirsql.plan_extension_path``) and carried out here: only locating an
5
+ installed package is host-specific.
5
6
 
6
7
  1. **Path-looking** (contains a separator, or ends in ``.so`` / ``.dylib`` /
7
8
  ``.dll`` / ``.pyd``) -- returned as a file path: made absolute against
@@ -13,10 +14,8 @@ package name reaches the package machinery:
13
14
  picked from inside it.
14
15
  """
15
16
 
16
- import os
17
-
18
- from ._dirsql import is_bare_name
19
- from .resolve_package import _resolve_package
17
+ from ._dirsql import plan_extension_path
18
+ from .plan_entry_path import _plan_entry_path
20
19
 
21
20
 
22
21
  def resolve_extension_path(path, base, resolve_relative):
@@ -28,11 +27,4 @@ def resolve_extension_path(path, base, resolve_relative):
28
27
  against ``base`` (config-file semantics); when false it is returned verbatim
29
28
  (programmatic semantics).
30
29
  """
31
- if not is_bare_name(path):
32
- if resolve_relative and not os.path.isabs(path):
33
- return os.path.join(base, path)
34
- return path
35
- local = os.path.join(base, path)
36
- if os.path.isfile(local):
37
- return local
38
- return _resolve_package(path)
30
+ return _plan_entry_path(plan_extension_path(path, base, resolve_relative))
@@ -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.46"
7
+ version = "0.4.47"
8
8
  # abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
9
9
  # `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
10
10
  # (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
@@ -0,0 +1,8 @@
1
+ **Changed**
2
+
3
+ - `resolve_extension_path` now plans through the core
4
+ (`_dirsql.plan_extension_path`) instead of re-implementing the ordered probe,
5
+ so a programmatic `extensions=[{path}]` entry is classified by the same code
6
+ as a config entry. `importlib` package lookup is unchanged, and so is the
7
+ resolved path. The internal `_dirsql.is_bare_name` binding export is gone,
8
+ replaced by `plan_extension_path`. No change to the published API. (#1122)
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "just test-e2e",
3
+ "ran_at": 1789742374,
4
+ "exit_code": 0,
5
+ "commit": "c05317742ecadafeabc1f5de5ccffa75fa983756",
6
+ "branch": "claude/1122-ext-cleanup"
7
+ }
@@ -573,10 +573,19 @@ mod python {
573
573
  .map_err(|err| err.to_string())
574
574
  }
575
575
 
576
- /// Whether an extension entry names a package rather than a file.
576
+ /// Plan one extension path given outside a config file.
577
+ ///
578
+ /// `base` is the directory a relative path and the bare-name shadow probe
579
+ /// resolve against; `resolve_relative` makes a relative path-looking value
580
+ /// absolute against it (config semantics) rather than verbatim.
577
581
  #[pyfunction]
578
- fn is_bare_name(path: &str) -> bool {
579
- extension_resolution::is_bare_name(path, PY_SUFFIXES)
582
+ fn plan_extension_path(path: &str, base: &str, resolve_relative: bool) -> PyExtensionPlanEntry {
583
+ plan_entry_to_py(extension_resolution::plan_extension_path(
584
+ path,
585
+ Path::new(base),
586
+ resolve_relative,
587
+ PY_SUFFIXES,
588
+ ))
580
589
  }
581
590
 
582
591
  #[pymodule]
@@ -591,7 +600,7 @@ mod python {
591
600
  m.add_function(wrap_pyfunction!(config_paths_from_argv, m)?)?;
592
601
  m.add_function(wrap_pyfunction!(plan_config_extensions, m)?)?;
593
602
  m.add_function(wrap_pyfunction!(select_loadable, m)?)?;
594
- m.add_function(wrap_pyfunction!(is_bare_name, m)?)?;
603
+ m.add_function(wrap_pyfunction!(plan_extension_path, m)?)?;
595
604
  m.add_class::<PyExtensionPlanEntry>()?;
596
605
  Ok(())
597
606
  }
@@ -763,11 +772,24 @@ mod python {
763
772
  }
764
773
 
765
774
  #[test]
766
- fn is_bare_name_applies_the_cpython_suffix_list() {
767
- assert!(is_bare_name("sqlite_vec"));
768
- assert!(!is_bare_name("vec0.pyd"));
769
- assert!(is_bare_name("vec0.node"));
770
- assert!(!is_bare_name("ext/vec0"));
775
+ fn a_programmatic_path_marshals_as_a_literal_entry() {
776
+ let entry = plan_extension_path("ext/vec0.so", "/cwd", false);
777
+ assert_eq!(entry.path.as_deref(), Some("ext/vec0.so"));
778
+ assert_eq!(entry.package, None);
779
+ assert_eq!(
780
+ plan_extension_path("ext/vec0.so", "/cwd", true)
781
+ .path
782
+ .as_deref(),
783
+ Some("/cwd/ext/vec0.so")
784
+ );
785
+ }
786
+
787
+ #[test]
788
+ fn a_programmatic_entry_applies_the_cpython_suffix_list() {
789
+ let entry = plan_extension_path("vec0.node", "/cwd", false);
790
+ assert_eq!(entry.package.as_deref(), Some("vec0.node"));
791
+ assert_eq!(entry.shadow.as_deref(), Some("/cwd/vec0.node"));
792
+ assert_eq!(plan_extension_path("vec0.pyd", "/cwd", false).package, None);
771
793
  }
772
794
 
773
795
  #[test]
@@ -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.46"
9
+ version = "0.4.47"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -169,6 +169,38 @@ fn spec_is_bare_name(extension: &ExtensionSpec, suffixes: &[&str]) -> bool {
169
169
  .is_some_and(|path| is_bare_name(path, suffixes))
170
170
  }
171
171
 
172
+ /// Plan one extension path given outside a config file.
173
+ ///
174
+ /// A constructor's `extensions=[{path}]` entry takes the same ordered probe as
175
+ /// a config entry: a path-looking value is literal, made absolute against
176
+ /// `base` only when `resolve_relative` is set (config semantics; programmatic
177
+ /// entries keep a relative path verbatim), and a bare name is a package whose
178
+ /// shadow probe sits under `base`. The entry's `entrypoint` travels with the
179
+ /// caller, so the returned entry carries none.
180
+ pub fn plan_extension_path(
181
+ path: &str,
182
+ base: &Path,
183
+ resolve_relative: bool,
184
+ suffixes: &[&str],
185
+ ) -> PlanEntry {
186
+ if is_bare_name(path, suffixes) {
187
+ return PlanEntry::Package {
188
+ name: path.to_owned(),
189
+ shadow: base.join(path),
190
+ entrypoint: None,
191
+ };
192
+ }
193
+ PlanEntry::Literal {
194
+ // `join` yields an absolute path verbatim.
195
+ path: if resolve_relative {
196
+ base.join(path)
197
+ } else {
198
+ PathBuf::from(path)
199
+ },
200
+ entrypoint: None,
201
+ }
202
+ }
203
+
172
204
  /// Pick the single loadable file for package `name` out of a host's listing.
173
205
  ///
174
206
  /// `dirs` are the package's directories (used only for the not-found message);
@@ -209,7 +241,8 @@ pub fn select_loadable(
209
241
  #[cfg(test)]
210
242
  mod tests {
211
243
  use super::{
212
- ConfigSource, PlanEntry, SelectError, is_bare_name, plan_config_extensions, select_loadable,
244
+ ConfigSource, PlanEntry, SelectError, is_bare_name, plan_config_extensions,
245
+ plan_extension_path, select_loadable,
213
246
  };
214
247
  use std::path::{Path, PathBuf};
215
248
 
@@ -357,6 +390,70 @@ mod tests {
357
390
  );
358
391
  }
359
392
 
393
+ #[test]
394
+ fn a_programmatic_relative_path_is_made_absolute_only_when_asked() {
395
+ let base = Path::new("/cwd");
396
+ assert_eq!(
397
+ plan_extension_path("ext/vec0.so", base, true, PY),
398
+ PlanEntry::Literal {
399
+ path: PathBuf::from("/cwd/ext/vec0.so"),
400
+ entrypoint: None,
401
+ }
402
+ );
403
+ assert_eq!(
404
+ plan_extension_path("ext/vec0.so", base, false, PY),
405
+ PlanEntry::Literal {
406
+ path: PathBuf::from("ext/vec0.so"),
407
+ entrypoint: None,
408
+ }
409
+ );
410
+ }
411
+
412
+ #[test]
413
+ fn a_programmatic_absolute_path_is_left_alone() {
414
+ assert_eq!(
415
+ plan_extension_path("/opt/vec0.so", Path::new("/cwd"), true, PY),
416
+ PlanEntry::Literal {
417
+ path: PathBuf::from("/opt/vec0.so"),
418
+ entrypoint: None,
419
+ }
420
+ );
421
+ }
422
+
423
+ #[test]
424
+ fn a_programmatic_bare_name_plans_a_package_shadowed_by_base() {
425
+ for resolve_relative in [true, false] {
426
+ assert_eq!(
427
+ plan_extension_path("sqlite_vec", Path::new("/cwd"), resolve_relative, PY),
428
+ PlanEntry::Package {
429
+ name: "sqlite_vec".into(),
430
+ shadow: PathBuf::from("/cwd/sqlite_vec"),
431
+ entrypoint: None,
432
+ }
433
+ );
434
+ }
435
+ }
436
+
437
+ #[test]
438
+ fn a_programmatic_entry_uses_the_hosts_own_suffix_list() {
439
+ let base = Path::new("/cwd");
440
+ assert_eq!(
441
+ plan_extension_path("vec0.node", base, true, PY),
442
+ PlanEntry::Package {
443
+ name: "vec0.node".into(),
444
+ shadow: PathBuf::from("/cwd/vec0.node"),
445
+ entrypoint: None,
446
+ }
447
+ );
448
+ assert_eq!(
449
+ plan_extension_path("vec0.node", base, true, NODE),
450
+ PlanEntry::Literal {
451
+ path: PathBuf::from("/cwd/vec0.node"),
452
+ entrypoint: None,
453
+ }
454
+ );
455
+ }
456
+
360
457
  #[test]
361
458
  fn select_loadable_returns_the_single_matching_file() {
362
459
  let dir = PathBuf::from("/site-packages/sqlite_vec");
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