sqlit-tui 1.2.7__tar.gz → 1.2.9__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 (675) hide show
  1. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/PKG-INFO +1 -1
  2. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/_version.py +2 -2
  3. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/keymap.py +28 -10
  4. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/adapters/base.py +5 -0
  5. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/duckdb/adapter.py +5 -0
  6. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/tree/loaders.py +16 -0
  7. sqlit_tui-1.2.9/sqlit/domains/process_worker/app/support.py +15 -0
  8. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/process_worker/ui/mixins/process_worker_lifecycle.py +5 -1
  9. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/state/query_normal.py +16 -0
  10. sqlit_tui-1.2.9/sqlit/domains/query/ui/mixins/query_editing_cursor.py +179 -0
  11. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/main.py +90 -0
  12. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_duckdb.py +88 -0
  13. sqlit_tui-1.2.9/tests/ui/keybindings/test_vim_motions.py +383 -0
  14. sqlit_tui-1.2.9/tests/ui/test_command_version.py +42 -0
  15. sqlit_tui-1.2.7/sqlit/domains/query/ui/mixins/query_editing_cursor.py +0 -94
  16. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/.github/workflows/ci.yml +0 -0
  17. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/.github/workflows/release.yml +0 -0
  18. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/.gitignore +0 -0
  19. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/.pre-commit-config.yaml +0 -0
  20. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/CONTRIBUTING.md +0 -0
  21. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/LICENSE +0 -0
  22. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/README.md +0 -0
  23. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/assets/favorites/logo.png +0 -0
  24. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/assets/favorites/logo_sqlit.png +0 -0
  25. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/aur/.SRCINFO +0 -0
  26. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/aur/PKGBUILD +0 -0
  27. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/config/mock-ssh-missing.json +0 -0
  28. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/config/settings.template.json +0 -0
  29. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/config/sqlit-config/settings.json +0 -0
  30. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/autocomplete-01-basics.gif +0 -0
  31. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/autocomplete-02-select-from.gif +0 -0
  32. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/autocomplete-03-joins.gif +0 -0
  33. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/autocomplete-04-clauses.gif +0 -0
  34. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/d1-demo.json +0 -0
  35. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-connect.gif +0 -0
  36. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-d1.gif +0 -0
  37. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-docker-picker.gif +0 -0
  38. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-filter/demo-filter.gif +0 -0
  39. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-history.gif +0 -0
  40. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-providers.gif +0 -0
  41. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-query.gif +0 -0
  42. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-sqlite.gif +0 -0
  43. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/demos/demo-supabase-mock.gif +0 -0
  44. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/catppuccin-latte.png +0 -0
  45. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/catppuccin-mocha.png +0 -0
  46. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/dracula.png +0 -0
  47. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/everforest.png +0 -0
  48. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/flexoki.png +0 -0
  49. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/gruvbox.png +0 -0
  50. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/hackerman.png +0 -0
  51. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/kanagawa.png +0 -0
  52. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/matte-black.png +0 -0
  53. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/monokai.png +0 -0
  54. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/nord.png +0 -0
  55. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/osaka-jade.png +0 -0
  56. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/ristretto.png +0 -0
  57. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/rose-pine-dawn.png +0 -0
  58. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/rose-pine-moon.png +0 -0
  59. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/rose-pine.png +0 -0
  60. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/solarized-dark.png +0 -0
  61. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/solarized-light.png +0 -0
  62. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/sqlit-light.png +0 -0
  63. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/sqlit.png +0 -0
  64. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/textual-ansi.png +0 -0
  65. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/textual-dark.png +0 -0
  66. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/textual-light.png +0 -0
  67. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/docs/screenshots/all/tokyo-night.png +0 -0
  68. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/flake.lock +0 -0
  69. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/flake.nix +0 -0
  70. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/infra/docker/docker-compose.test.yml +0 -0
  71. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/pyproject.toml +0 -0
  72. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/pyrightconfig.json +0 -0
  73. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/__init__.py +0 -0
  74. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/cli.py +0 -0
  75. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/__init__.py +0 -0
  76. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/action_validation.py +0 -0
  77. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/binding_contexts.py +0 -0
  78. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/connection_manager.py +0 -0
  79. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/input_context.py +0 -0
  80. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/key_router.py +0 -0
  81. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/leader_commands.py +0 -0
  82. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/state_base.py +0 -0
  83. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/core/vim.py +0 -0
  84. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/__init__.py +0 -0
  85. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/__init__.py +0 -0
  86. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/__init__.py +0 -0
  87. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/cloud_actions.py +0 -0
  88. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/connection_flow.py +0 -0
  89. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/credentials.py +0 -0
  90. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/executor.py +0 -0
  91. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/install_strategy.py +0 -0
  92. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/installer.py +0 -0
  93. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/mock_adapter_core.py +0 -0
  94. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/mock_data.py +0 -0
  95. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/mock_default_adapters.py +0 -0
  96. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/mock_profiles.py +0 -0
  97. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/mock_provider.py +0 -0
  98. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/mock_settings.py +0 -0
  99. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/mocks.py +0 -0
  100. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/persist_utils.py +0 -0
  101. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/save_connection.py +0 -0
  102. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/session.py +0 -0
  103. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/tunnel.py +0 -0
  104. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/app/url_parser.py +0 -0
  105. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/cli/__init__.py +0 -0
  106. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/cli/commands.py +0 -0
  107. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/cli/helpers.py +0 -0
  108. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/cli/prompts.py +0 -0
  109. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/__init__.py +0 -0
  110. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/__init__.py +0 -0
  111. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/aws/__init__.py +0 -0
  112. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/aws/cache.py +0 -0
  113. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/aws/provider.py +0 -0
  114. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/azure/__init__.py +0 -0
  115. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/azure/cache.py +0 -0
  116. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/azure/cli.py +0 -0
  117. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/azure/discovery.py +0 -0
  118. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/azure/firewall.py +0 -0
  119. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/azure/models.py +0 -0
  120. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/azure/provider.py +0 -0
  121. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/base.py +0 -0
  122. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/gcp/__init__.py +0 -0
  123. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/gcp/cache.py +0 -0
  124. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/gcp/provider.py +0 -0
  125. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/mock.py +0 -0
  126. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/cloud/registry.py +0 -0
  127. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/discovery/docker_detector.py +0 -0
  128. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/domain/__init__.py +0 -0
  129. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/domain/config.py +0 -0
  130. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/domain/passwords.py +0 -0
  131. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/__init__.py +0 -0
  132. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/adapter_provider.py +0 -0
  133. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/adapters/__init__.py +0 -0
  134. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/athena/__init__.py +0 -0
  135. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/athena/adapter.py +0 -0
  136. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/athena/provider.py +0 -0
  137. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/athena/schema.py +0 -0
  138. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/bigquery/__init__.py +0 -0
  139. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/bigquery/adapter.py +0 -0
  140. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/bigquery/provider.py +0 -0
  141. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/bigquery/schema.py +0 -0
  142. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/catalog.py +0 -0
  143. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/clickhouse/__init__.py +0 -0
  144. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/clickhouse/adapter.py +0 -0
  145. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/clickhouse/provider.py +0 -0
  146. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/clickhouse/schema.py +0 -0
  147. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/cockroachdb/__init__.py +0 -0
  148. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/cockroachdb/adapter.py +0 -0
  149. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/cockroachdb/provider.py +0 -0
  150. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/cockroachdb/schema.py +0 -0
  151. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/config_service.py +0 -0
  152. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/d1/__init__.py +0 -0
  153. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/d1/adapter.py +0 -0
  154. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/d1/provider.py +0 -0
  155. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/d1/schema.py +0 -0
  156. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/db2/__init__.py +0 -0
  157. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/db2/adapter.py +0 -0
  158. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/db2/provider.py +0 -0
  159. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/db2/schema.py +0 -0
  160. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/docker.py +0 -0
  161. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/driver.py +0 -0
  162. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/duckdb/__init__.py +0 -0
  163. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/duckdb/provider.py +0 -0
  164. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/duckdb/schema.py +0 -0
  165. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/exceptions.py +0 -0
  166. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/explorer_nodes.py +0 -0
  167. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/firebird/__init__.py +0 -0
  168. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/firebird/adapter.py +0 -0
  169. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/firebird/provider.py +0 -0
  170. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/firebird/schema.py +0 -0
  171. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/flight/__init__.py +0 -0
  172. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/flight/adapter.py +0 -0
  173. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/flight/provider.py +0 -0
  174. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/flight/schema.py +0 -0
  175. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/hana/__init__.py +0 -0
  176. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/hana/adapter.py +0 -0
  177. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/hana/provider.py +0 -0
  178. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/hana/schema.py +0 -0
  179. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mariadb/__init__.py +0 -0
  180. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mariadb/adapter.py +0 -0
  181. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mariadb/provider.py +0 -0
  182. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mariadb/schema.py +0 -0
  183. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/metadata.py +0 -0
  184. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/model.py +0 -0
  185. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mssql/__init__.py +0 -0
  186. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mssql/adapter.py +0 -0
  187. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mssql/provider.py +0 -0
  188. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mssql/schema.py +0 -0
  189. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mysql/__init__.py +0 -0
  190. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mysql/adapter.py +0 -0
  191. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mysql/base.py +0 -0
  192. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mysql/provider.py +0 -0
  193. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/mysql/schema.py +0 -0
  194. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle/__init__.py +0 -0
  195. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle/adapter.py +0 -0
  196. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle/provider.py +0 -0
  197. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle/schema.py +0 -0
  198. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle_legacy/__init__.py +0 -0
  199. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle_legacy/adapter.py +0 -0
  200. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle_legacy/provider.py +0 -0
  201. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/oracle_legacy/schema.py +0 -0
  202. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/postgresql/__init__.py +0 -0
  203. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/postgresql/adapter.py +0 -0
  204. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/postgresql/base.py +0 -0
  205. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/postgresql/provider.py +0 -0
  206. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/postgresql/schema.py +0 -0
  207. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/presto/__init__.py +0 -0
  208. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/presto/adapter.py +0 -0
  209. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/presto/provider.py +0 -0
  210. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/presto/schema.py +0 -0
  211. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/redshift/__init__.py +0 -0
  212. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/redshift/adapter.py +0 -0
  213. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/redshift/provider.py +0 -0
  214. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/redshift/schema.py +0 -0
  215. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/registry.py +0 -0
  216. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/schema_catalog.py +0 -0
  217. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/schema_helpers.py +0 -0
  218. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/snowflake/__init__.py +0 -0
  219. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/snowflake/adapter.py +0 -0
  220. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/snowflake/provider.py +0 -0
  221. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/snowflake/schema.py +0 -0
  222. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/sqlite/__init__.py +0 -0
  223. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/sqlite/adapter.py +0 -0
  224. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/sqlite/provider.py +0 -0
  225. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/sqlite/schema.py +0 -0
  226. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/supabase/__init__.py +0 -0
  227. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/supabase/adapter.py +0 -0
  228. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/supabase/provider.py +0 -0
  229. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/supabase/schema.py +0 -0
  230. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/teradata/__init__.py +0 -0
  231. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/teradata/adapter.py +0 -0
  232. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/teradata/provider.py +0 -0
  233. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/teradata/schema.py +0 -0
  234. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/tls.py +0 -0
  235. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/trino/__init__.py +0 -0
  236. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/trino/adapter.py +0 -0
  237. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/trino/provider.py +0 -0
  238. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/trino/schema.py +0 -0
  239. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/turso/__init__.py +0 -0
  240. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/turso/adapter.py +0 -0
  241. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/turso/provider.py +0 -0
  242. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/turso/schema.py +0 -0
  243. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/providers/validation.py +0 -0
  244. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/store/__init__.py +0 -0
  245. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/store/connections.py +0 -0
  246. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/store/memory.py +0 -0
  247. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/__init__.py +0 -0
  248. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/connection_error_handlers.py +0 -0
  249. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/connection_focus.py +0 -0
  250. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/connection_form.py +0 -0
  251. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/connection_test_controller.py +0 -0
  252. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/driver_status.py +0 -0
  253. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/driver_status_controller.py +0 -0
  254. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/field_widgets.py +0 -0
  255. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/fields.py +0 -0
  256. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/mixins/__init__.py +0 -0
  257. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/mixins/connection.py +0 -0
  258. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/restart_cache.py +0 -0
  259. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/__init__.py +0 -0
  260. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/azure_firewall.py +0 -0
  261. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection.py +0 -0
  262. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/__init__.py +0 -0
  263. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/cloud_nodes.py +0 -0
  264. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/cloud_providers/__init__.py +0 -0
  265. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/cloud_providers/aws.py +0 -0
  266. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/cloud_providers/azure.py +0 -0
  267. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/cloud_providers/base.py +0 -0
  268. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/cloud_providers/gcp.py +0 -0
  269. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/cloud_providers/utils.py +0 -0
  270. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/constants.py +0 -0
  271. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/controllers/__init__.py +0 -0
  272. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/controllers/cloud.py +0 -0
  273. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/controllers/docker.py +0 -0
  274. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/screen.py +0 -0
  275. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/shortcuts.py +0 -0
  276. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/state.py +0 -0
  277. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/tabs/__init__.py +0 -0
  278. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/tabs/cloud.py +0 -0
  279. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/tabs/connections.py +0 -0
  280. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/tabs/docker.py +0 -0
  281. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_picker/view.py +0 -0
  282. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/connection_styles.py +0 -0
  283. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/folder_input.py +0 -0
  284. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/install_progress.py +0 -0
  285. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/package_setup.py +0 -0
  286. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/screens/password_input.py +0 -0
  287. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/validation.py +0 -0
  288. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/connections/ui/validation_ui_binder.py +0 -0
  289. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/__init__.py +0 -0
  290. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/app/schema_service.py +0 -0
  291. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/domain/__init__.py +0 -0
  292. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/domain/tree_nodes.py +0 -0
  293. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/__init__.py +0 -0
  294. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_filter_active.py +0 -0
  295. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_focused.py +0 -0
  296. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_multi_select.py +0 -0
  297. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_on_connection.py +0 -0
  298. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_on_database.py +0 -0
  299. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_on_folder.py +0 -0
  300. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_on_object.py +0 -0
  301. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_on_table.py +0 -0
  302. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/state/tree_visual_mode.py +0 -0
  303. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/__init__.py +0 -0
  304. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/mixins/__init__.py +0 -0
  305. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/mixins/tree.py +0 -0
  306. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/mixins/tree_filter.py +0 -0
  307. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/mixins/tree_labels.py +0 -0
  308. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/mixins/tree_schema.py +0 -0
  309. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/tree/__init__.py +0 -0
  310. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/tree/builder.py +0 -0
  311. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/tree/db_switching.py +0 -0
  312. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/tree/expansion_state.py +0 -0
  313. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/tree/object_info.py +0 -0
  314. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/explorer/ui/tree/schema_render.py +0 -0
  315. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/process_worker/__init__.py +0 -0
  316. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/process_worker/app/__init__.py +0 -0
  317. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/process_worker/app/process_worker.py +0 -0
  318. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/process_worker/app/process_worker_client.py +0 -0
  319. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/process_worker/ui/__init__.py +0 -0
  320. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/process_worker/ui/mixins/__init__.py +0 -0
  321. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/__init__.py +0 -0
  322. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/app/__init__.py +0 -0
  323. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/app/cancellable.py +0 -0
  324. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/app/multi_statement.py +0 -0
  325. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/app/query_runner.py +0 -0
  326. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/app/query_service.py +0 -0
  327. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/app/transaction.py +0 -0
  328. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/cli/__init__.py +0 -0
  329. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/cli/commands.py +0 -0
  330. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/__init__.py +0 -0
  331. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/alter_table.py +0 -0
  332. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/completion.py +0 -0
  333. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/core.py +0 -0
  334. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/create_index.py +0 -0
  335. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/create_table.py +0 -0
  336. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/create_view.py +0 -0
  337. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/delete.py +0 -0
  338. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/drop.py +0 -0
  339. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/insert.py +0 -0
  340. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/keywords.py +0 -0
  341. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/truncate.py +0 -0
  342. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/completion/update.py +0 -0
  343. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/__init__.py +0 -0
  344. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/clipboard.py +0 -0
  345. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/comments.py +0 -0
  346. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/deletion.py +0 -0
  347. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/__init__.py +0 -0
  348. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/basic.py +0 -0
  349. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/brackets.py +0 -0
  350. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/common.py +0 -0
  351. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/lines.py +0 -0
  352. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/registry.py +0 -0
  353. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/search.py +0 -0
  354. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/motions/words.py +0 -0
  355. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/operators.py +0 -0
  356. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/text_objects.py +0 -0
  357. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/types.py +0 -0
  358. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/editing/undo_history.py +0 -0
  359. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/state/__init__.py +0 -0
  360. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/state/autocomplete_active.py +0 -0
  361. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/state/query_focused.py +0 -0
  362. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/state/query_insert.py +0 -0
  363. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/store/__init__.py +0 -0
  364. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/store/history.py +0 -0
  365. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/store/memory.py +0 -0
  366. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/store/starred.py +0 -0
  367. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/__init__.py +0 -0
  368. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/__init__.py +0 -0
  369. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/autocomplete.py +0 -0
  370. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/autocomplete_schema.py +0 -0
  371. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/autocomplete_suggestions.py +0 -0
  372. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query.py +0 -0
  373. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_constants.py +0 -0
  374. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_editing_clipboard.py +0 -0
  375. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_editing_comments.py +0 -0
  376. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_editing_common.py +0 -0
  377. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_editing_operators.py +0 -0
  378. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_editing_selection.py +0 -0
  379. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_editing_undo.py +0 -0
  380. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_execution.py +0 -0
  381. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/mixins/query_results.py +0 -0
  382. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/screens/__init__.py +0 -0
  383. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/screens/char_pending_menu.py +0 -0
  384. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/screens/query_history.py +0 -0
  385. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/query/ui/screens/text_object_menu.py +0 -0
  386. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/__init__.py +0 -0
  387. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/formatters.py +0 -0
  388. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/state/__init__.py +0 -0
  389. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/state/results_filter_active.py +0 -0
  390. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/state/results_focused.py +0 -0
  391. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/state/value_view_active.py +0 -0
  392. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/ui/__init__.py +0 -0
  393. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/ui/mixins/__init__.py +0 -0
  394. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/ui/mixins/results.py +0 -0
  395. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/ui/mixins/results_filter.py +0 -0
  396. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/ui/screens/__init__.py +0 -0
  397. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/ui/screens/save_file.py +0 -0
  398. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/results/ui/screens/value_view.py +0 -0
  399. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/__init__.py +0 -0
  400. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/__init__.py +0 -0
  401. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/commands/__init__.py +0 -0
  402. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/commands/credentials.py +0 -0
  403. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/commands/debug.py +0 -0
  404. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/commands/router.py +0 -0
  405. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/commands/watchdog.py +0 -0
  406. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/commands/worker.py +0 -0
  407. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/idle_scheduler.py +0 -0
  408. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/main.css +0 -0
  409. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/omarchy.py +0 -0
  410. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/startup_flow.py +0 -0
  411. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/theme_manager.py +0 -0
  412. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/app/themes.py +0 -0
  413. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/state/__init__.py +0 -0
  414. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/state/leader_pending.py +0 -0
  415. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/state/machine.py +0 -0
  416. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/state/main_screen.py +0 -0
  417. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/state/modal_active.py +0 -0
  418. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/state/query_executing.py +0 -0
  419. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/state/root.py +0 -0
  420. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/store/__init__.py +0 -0
  421. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/store/settings.py +0 -0
  422. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/__init__.py +0 -0
  423. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/mixins/__init__.py +0 -0
  424. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/mixins/ui_leader.py +0 -0
  425. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/mixins/ui_navigation.py +0 -0
  426. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/mixins/ui_status.py +0 -0
  427. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/screens/__init__.py +0 -0
  428. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/screens/help.py +0 -0
  429. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/screens/leader_menu.py +0 -0
  430. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/domains/shell/ui/screens/theme.py +0 -0
  431. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/mock_settings.py +0 -0
  432. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/__init__.py +0 -0
  433. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/app/__init__.py +0 -0
  434. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/app/runtime.py +0 -0
  435. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/app/services.py +0 -0
  436. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/app/startup_profiler.py +0 -0
  437. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/__init__.py +0 -0
  438. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/debug_events.py +0 -0
  439. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/processes.py +0 -0
  440. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/protocols.py +0 -0
  441. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/store.py +0 -0
  442. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/system_probe.py +0 -0
  443. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/system_probe_fake.py +0 -0
  444. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/terminal.py +0 -0
  445. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/core/utils.py +0 -0
  446. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/__init__.py +0 -0
  447. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/lifecycle.py +0 -0
  448. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/__init__.py +0 -0
  449. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/autocomplete.py +0 -0
  450. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/connections.py +0 -0
  451. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/core.py +0 -0
  452. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/explorer.py +0 -0
  453. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/lifecycle.py +0 -0
  454. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/metadata.py +0 -0
  455. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/mixins.py +0 -0
  456. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/query.py +0 -0
  457. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/results.py +0 -0
  458. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/screens.py +0 -0
  459. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/startup.py +0 -0
  460. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/ui_navigation.py +0 -0
  461. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/vim.py +0 -0
  462. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/protocols/widgets.py +0 -0
  463. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/screens/__init__.py +0 -0
  464. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/screens/confirm.py +0 -0
  465. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/screens/error.py +0 -0
  466. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/screens/file_picker.py +0 -0
  467. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/screens/loading.py +0 -0
  468. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/screens/message.py +0 -0
  469. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/spinner.py +0 -0
  470. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets.py +0 -0
  471. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_autocomplete.py +0 -0
  472. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_dialogs.py +0 -0
  473. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_filter.py +0 -0
  474. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_flash.py +0 -0
  475. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_footer.py +0 -0
  476. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_json_tree.py +0 -0
  477. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_stacked_results.py +0 -0
  478. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_tables.py +0 -0
  479. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_text_area.py +0 -0
  480. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/sqlit/shared/ui/widgets_value_view.py +0 -0
  481. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/.env.example +0 -0
  482. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/__init__.py +0 -0
  483. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/__init__.py +0 -0
  484. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/fixtures.py +0 -0
  485. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/infra/.gitignore +0 -0
  486. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/infra/create_view.py +0 -0
  487. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/infra/main.tf +0 -0
  488. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/infra/outputs.tf +0 -0
  489. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/infra/variables.tf +0 -0
  490. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/run_tests.sh +0 -0
  491. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/athena/test_athena.py +0 -0
  492. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/cli/test_cli_main.py +0 -0
  493. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/conftest.py +0 -0
  494. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/connections/providers/__init__.py +0 -0
  495. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/connections/providers/oracle/__init__.py +0 -0
  496. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/connections/providers/oracle/test_cursor_cleanup.py +0 -0
  497. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/99-fix-sshd-config.sh +0 -0
  498. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/__init__.py +0 -0
  499. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/bigquery.py +0 -0
  500. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/cli.py +0 -0
  501. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/clickhouse.py +0 -0
  502. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/cockroachdb.py +0 -0
  503. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/d1/Dockerfile +0 -0
  504. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/d1/index.js +0 -0
  505. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/d1/wrangler.toml +0 -0
  506. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/d1.py +0 -0
  507. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/db2.py +0 -0
  508. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/duckdb.py +0 -0
  509. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/firebird.py +0 -0
  510. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/flight.py +0 -0
  511. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/mariadb.py +0 -0
  512. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/mssql.py +0 -0
  513. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/mysql.py +0 -0
  514. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/oracle.py +0 -0
  515. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/oracle_legacy.py +0 -0
  516. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/postgres.py +0 -0
  517. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/presto/catalog/memory.properties +0 -0
  518. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/presto.py +0 -0
  519. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/sqlite.py +0 -0
  520. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/ssh.py +0 -0
  521. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/sshd_config +0 -0
  522. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/trino/catalog/memory.properties +0 -0
  523. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/trino.py +0 -0
  524. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/turso.py +0 -0
  525. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/fixtures/utils.py +0 -0
  526. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/helpers.py +0 -0
  527. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/__init__.py +0 -0
  528. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/browsing_base.py +0 -0
  529. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/docker_detect/__init__.py +0 -0
  530. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/docker_detect/conftest.py +0 -0
  531. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/docker_detect/database_configs.py +0 -0
  532. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/docker_detect/test_all_databases.py +0 -0
  533. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/docker_detect/test_docker_detection.py +0 -0
  534. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/python_packages/README.md +0 -0
  535. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/python_packages/docker-compose.yml +0 -0
  536. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/python_packages/dockerfiles/debian.Dockerfile +0 -0
  537. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/python_packages/run_tests.sh +0 -0
  538. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/python_packages/test_package_install_flow.py +0 -0
  539. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/test_database_browsing_flow.py +0 -0
  540. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/test_mssql_datetimeoffset.py +0 -0
  541. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/test_snowflake_fakesnow.py +0 -0
  542. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/test_stale_connection_reconnect.py +0 -0
  543. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/test_telescope_watchdog.py +0 -0
  544. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/test_tls_cli_config.py +0 -0
  545. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/integration/test_transactions.py +0 -0
  546. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/performance/__init__.py +0 -0
  547. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/performance/test_large_dataset_rendering.py +0 -0
  548. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_adapter_system_databases.py +0 -0
  549. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_apply_database_override.py +0 -0
  550. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_autocomplete_database_modes.py +0 -0
  551. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_bigquery.py +0 -0
  552. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_clickhouse.py +0 -0
  553. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_cloud_discovery.py +0 -0
  554. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_cockroachdb.py +0 -0
  555. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_commands.py +0 -0
  556. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_credentials_connection_store.py +0 -0
  557. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_credentials_global.py +0 -0
  558. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_credentials_keyring.py +0 -0
  559. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_credentials_plaintext.py +0 -0
  560. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_cross_database_queries.py +0 -0
  561. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_d1.py +0 -0
  562. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_database_base.py +0 -0
  563. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_database_docker.py +0 -0
  564. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_db2.py +0 -0
  565. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_docker_detector.py +0 -0
  566. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_driver_resolver.py +0 -0
  567. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_firebird.py +0 -0
  568. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_flight.py +0 -0
  569. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_install_strategy.py +0 -0
  570. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_installer_cancel.py +0 -0
  571. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_mariadb.py +0 -0
  572. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_mocks.py +0 -0
  573. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_mssql.py +0 -0
  574. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_mysql.py +0 -0
  575. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_oracle.py +0 -0
  576. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_oracle_legacy.py +0 -0
  577. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_password_prompts.py +0 -0
  578. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_postgresql.py +0 -0
  579. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_presto.py +0 -0
  580. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_schema_capabilities.py +0 -0
  581. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_sqlite.py +0 -0
  582. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_ssh.py +0 -0
  583. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_trino.py +0 -0
  584. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_turso.py +0 -0
  585. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/test_validation.py +0 -0
  586. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/__init__.py +0 -0
  587. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/conftest.py +0 -0
  588. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/explorer/__init__.py +0 -0
  589. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/explorer/test_cross_database_query.py +0 -0
  590. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/explorer/test_markup_escaping.py +0 -0
  591. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/explorer/test_multidb_refresh.py +0 -0
  592. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/explorer/test_refresh_tree.py +0 -0
  593. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/explorer/test_tree_expansion.py +0 -0
  594. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/__init__.py +0 -0
  595. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/conftest.py +0 -0
  596. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/test_contextual.py +0 -0
  597. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/test_dialogs.py +0 -0
  598. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/test_insert_mode.py +0 -0
  599. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/test_keymap_provider.py +0 -0
  600. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/test_leader.py +0 -0
  601. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/keybindings/test_state_machine.py +0 -0
  602. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/mocks.py +0 -0
  603. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/01_default_sqlite_screen.svg +0 -0
  604. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/02_edit_mode_postgresql.svg +0 -0
  605. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/03_before_cancel.svg +0 -0
  606. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/04_empty_name_after_save_attempt.svg +0 -0
  607. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/04_empty_name_before_save.svg +0 -0
  608. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/05_after_switch_to_postgresql.svg +0 -0
  609. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/05_before_switch_to_postgresql.svg +0 -0
  610. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/06_sqlite_file_path_field.svg +0 -0
  611. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/07_sqlite_filled_form.svg +0 -0
  612. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/08_postgresql_after_switch.svg +0 -0
  613. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/08_postgresql_filled_form.svg +0 -0
  614. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/09_duplicate_name_validation.svg +0 -0
  615. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/10_after_test_connection.svg +0 -0
  616. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/10_before_test_connection.svg +0 -0
  617. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/11_navigation_after_tab.svg +0 -0
  618. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/11_navigation_initial_focus.svg +0 -0
  619. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/12_navigation_after_shift_tab.svg +0 -0
  620. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/12_navigation_after_two_tabs.svg +0 -0
  621. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/snapshots/13_ssh_fields_hidden.svg +0 -0
  622. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_connect_action.py +0 -0
  623. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_connection_screen.py +0 -0
  624. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_explorer_toggle.py +0 -0
  625. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_json_tree.py +0 -0
  626. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_multi_select_actions.py +0 -0
  627. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_password_input.py +0 -0
  628. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_query_history.py +0 -0
  629. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_results_incremental_rendering.py +0 -0
  630. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/ui/test_tree_schema_grouping.py +0 -0
  631. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/__init__.py +0 -0
  632. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/__init__.py +0 -0
  633. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_alter_table.py +0 -0
  634. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_core.py +0 -0
  635. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_create_index.py +0 -0
  636. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_create_table.py +0 -0
  637. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_create_view.py +0 -0
  638. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_delete.py +0 -0
  639. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_drop.py +0 -0
  640. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_edge_cases_cross_returning.py +0 -0
  641. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_edge_cases_misc.py +0 -0
  642. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_edge_cases_select_window.py +0 -0
  643. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_edge_cases_union_cast.py +0 -0
  644. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_insert.py +0 -0
  645. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_select.py +0 -0
  646. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_truncate.py +0 -0
  647. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/sql_completion/test_update.py +0 -0
  648. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_comments.py +0 -0
  649. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_connection_config_from_dict.py +0 -0
  650. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_connection_mixin_edit.py +0 -0
  651. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_docker_credential_parsing.py +0 -0
  652. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_docker_tab_filtering.py +0 -0
  653. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_executor_reset_on_connection_switch.py +0 -0
  654. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_flight_adapter.py +0 -0
  655. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_incremental_rendering_numeric_range.py +0 -0
  656. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_mssql_adapter.py +0 -0
  657. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_multi_statement.py +0 -0
  658. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_open_line.py +0 -0
  659. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_oracle_adapter.py +0 -0
  660. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_postgresql_adapter.py +0 -0
  661. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_query_deletion.py +0 -0
  662. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_schema_config_validator.py +0 -0
  663. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_select_all.py +0 -0
  664. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_snowflake_adapter.py +0 -0
  665. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_starred.py +0 -0
  666. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_text_object_menu.py +0 -0
  667. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_tls_adapters.py +0 -0
  668. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_transaction_executor.py +0 -0
  669. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_transaction_state.py +0 -0
  670. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_undo_history.py +0 -0
  671. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_url_parser.py +0 -0
  672. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_vim_motions.py +0 -0
  673. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_vim_operators.py +0 -0
  674. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/tests/unit/test_vim_text_objects.py +0 -0
  675. {sqlit_tui-1.2.7 → sqlit_tui-1.2.9}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlit-tui
3
- Version: 1.2.7
3
+ Version: 1.2.9
4
4
  Summary: A terminal UI for SQL Server, PostgreSQL, MySQL, SQLite, Oracle, and more
5
5
  Project-URL: Homepage, https://github.com/Maxteabag/sqlit
6
6
  Project-URL: Repository, https://github.com/Maxteabag/sqlit
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.2.7'
32
- __version_tuple__ = version_tuple = (1, 2, 7)
31
+ __version__ = version = '1.2.9'
32
+ __version_tuple__ = version_tuple = (1, 2, 9)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -11,6 +11,8 @@ KEY_DISPLAY_OVERRIDES: dict[str, str] = {
11
11
  "question_mark": "?",
12
12
  "slash": "/",
13
13
  "asterisk": "*",
14
+ "dollar_sign": "$",
15
+ "percent_sign": "%",
14
16
  "space": "<space>",
15
17
  "escape": "<esc>",
16
18
  "enter": "<enter>",
@@ -206,7 +208,7 @@ class DefaultKeymapProvider(KeymapProvider):
206
208
  LeaderCommandDef("e", "word_end", "Delete to word end", "Delete", menu="delete"),
207
209
  LeaderCommandDef("E", "WORD_end", "Delete to WORD end", "Delete", menu="delete"),
208
210
  LeaderCommandDef("0", "line_start", "Delete to line start", "Delete", menu="delete"),
209
- LeaderCommandDef("$", "line_end_motion", "Delete to line end", "Delete", menu="delete"),
211
+ LeaderCommandDef("dollar_sign", "line_end_motion", "Delete to line end", "Delete", menu="delete"),
210
212
  LeaderCommandDef("D", "line_end", "Delete to line end", "Delete", menu="delete"),
211
213
  LeaderCommandDef("x", "char", "Delete char", "Delete", menu="delete"),
212
214
  LeaderCommandDef("X", "char_back", "Delete char back", "Delete", menu="delete"),
@@ -219,7 +221,7 @@ class DefaultKeymapProvider(KeymapProvider):
219
221
  LeaderCommandDef("F", "find_char_back", "Delete back to char...", "Delete", menu="delete"),
220
222
  LeaderCommandDef("t", "till_char", "Delete till char...", "Delete", menu="delete"),
221
223
  LeaderCommandDef("T", "till_char_back", "Delete back till char...", "Delete", menu="delete"),
222
- LeaderCommandDef("%", "matching_bracket", "Delete to bracket", "Delete", menu="delete"),
224
+ LeaderCommandDef("percent_sign", "matching_bracket", "Delete to bracket", "Delete", menu="delete"),
223
225
  LeaderCommandDef("i", "inner", "Delete inside...", "Delete", menu="delete"),
224
226
  LeaderCommandDef("a", "around", "Delete around...", "Delete", menu="delete"),
225
227
  # Copy menu (vim-style, y for yank)
@@ -231,7 +233,7 @@ class DefaultKeymapProvider(KeymapProvider):
231
233
  LeaderCommandDef("e", "word_end", "Copy to word end", "Copy", menu="yank"),
232
234
  LeaderCommandDef("E", "WORD_end", "Copy to WORD end", "Copy", menu="yank"),
233
235
  LeaderCommandDef("0", "line_start", "Copy to line start", "Copy", menu="yank"),
234
- LeaderCommandDef("$", "line_end_motion", "Copy to line end", "Copy", menu="yank"),
236
+ LeaderCommandDef("dollar_sign", "line_end_motion", "Copy to line end", "Copy", menu="yank"),
235
237
  LeaderCommandDef("h", "left", "Copy left", "Copy", menu="yank"),
236
238
  LeaderCommandDef("j", "down", "Copy line down", "Copy", menu="yank"),
237
239
  LeaderCommandDef("k", "up", "Copy line up", "Copy", menu="yank"),
@@ -241,7 +243,7 @@ class DefaultKeymapProvider(KeymapProvider):
241
243
  LeaderCommandDef("F", "find_char_back", "Copy back to char...", "Copy", menu="yank"),
242
244
  LeaderCommandDef("t", "till_char", "Copy till char...", "Copy", menu="yank"),
243
245
  LeaderCommandDef("T", "till_char_back", "Copy back till char...", "Copy", menu="yank"),
244
- LeaderCommandDef("%", "matching_bracket", "Copy to bracket", "Copy", menu="yank"),
246
+ LeaderCommandDef("percent_sign", "matching_bracket", "Copy to bracket", "Copy", menu="yank"),
245
247
  LeaderCommandDef("i", "inner", "Copy inside...", "Copy", menu="yank"),
246
248
  LeaderCommandDef("a", "around", "Copy around...", "Copy", menu="yank"),
247
249
  # Change menu (vim-style)
@@ -253,7 +255,7 @@ class DefaultKeymapProvider(KeymapProvider):
253
255
  LeaderCommandDef("e", "word_end", "Change to word end", "Change", menu="change"),
254
256
  LeaderCommandDef("E", "WORD_end", "Change to WORD end", "Change", menu="change"),
255
257
  LeaderCommandDef("0", "line_start", "Change to line start", "Change", menu="change"),
256
- LeaderCommandDef("$", "line_end_motion", "Change to line end", "Change", menu="change"),
258
+ LeaderCommandDef("dollar_sign", "line_end_motion", "Change to line end", "Change", menu="change"),
257
259
  LeaderCommandDef("h", "left", "Change left", "Change", menu="change"),
258
260
  LeaderCommandDef("j", "down", "Change line down", "Change", menu="change"),
259
261
  LeaderCommandDef("k", "up", "Change line up", "Change", menu="change"),
@@ -263,7 +265,7 @@ class DefaultKeymapProvider(KeymapProvider):
263
265
  LeaderCommandDef("F", "find_char_back", "Change back to char...", "Change", menu="change"),
264
266
  LeaderCommandDef("t", "till_char", "Change till char...", "Change", menu="change"),
265
267
  LeaderCommandDef("T", "till_char_back", "Change back till char...", "Change", menu="change"),
266
- LeaderCommandDef("%", "matching_bracket", "Change to bracket", "Change", menu="change"),
268
+ LeaderCommandDef("percent_sign", "matching_bracket", "Change to bracket", "Change", menu="change"),
267
269
  LeaderCommandDef("i", "inner", "Change inside...", "Change", menu="change"),
268
270
  LeaderCommandDef("a", "around", "Change around...", "Change", menu="change"),
269
271
  # g motion menu (vim-style)
@@ -325,10 +327,6 @@ class DefaultKeymapProvider(KeymapProvider):
325
327
  ActionKeyDef("ctrl+q", "quit", "global"),
326
328
  ActionKeyDef("escape", "cancel_operation", "global"),
327
329
  ActionKeyDef("question_mark", "show_help", "global"),
328
- # Navigation
329
- ActionKeyDef("e", "focus_explorer", "navigation"),
330
- ActionKeyDef("q", "focus_query", "navigation"),
331
- ActionKeyDef("r", "focus_results", "navigation"),
332
330
  # Query (normal mode)
333
331
  ActionKeyDef("i", "enter_insert_mode", "query_normal"),
334
332
  ActionKeyDef("o", "open_line_below", "query_normal"),
@@ -348,10 +346,30 @@ class DefaultKeymapProvider(KeymapProvider):
348
346
  ActionKeyDef("j", "cursor_down", "query_normal"),
349
347
  ActionKeyDef("k", "cursor_up", "query_normal"),
350
348
  ActionKeyDef("l", "cursor_right", "query_normal"),
349
+ ActionKeyDef("w", "cursor_word_forward", "query_normal"),
350
+ ActionKeyDef("W", "cursor_WORD_forward", "query_normal"),
351
+ ActionKeyDef("b", "cursor_word_back", "query_normal"),
352
+ ActionKeyDef("B", "cursor_WORD_back", "query_normal"),
353
+ ActionKeyDef("e", "cursor_word_end", "query_normal"),
354
+ ActionKeyDef("E", "cursor_WORD_end", "query_normal"),
355
+ ActionKeyDef("0", "cursor_line_start", "query_normal"),
356
+ ActionKeyDef("dollar_sign", "cursor_line_end", "query_normal"),
357
+ ActionKeyDef("G", "cursor_last_line", "query_normal"),
358
+ ActionKeyDef("percent_sign", "cursor_matching_bracket", "query_normal"),
359
+ ActionKeyDef("f", "cursor_find_char", "query_normal"),
360
+ ActionKeyDef("F", "cursor_find_char_back", "query_normal"),
361
+ ActionKeyDef("t", "cursor_till_char", "query_normal"),
362
+ ActionKeyDef("T", "cursor_till_char_back", "query_normal"),
363
+ ActionKeyDef("a", "append_insert_mode", "query_normal"),
364
+ ActionKeyDef("A", "append_line_end", "query_normal"),
351
365
  # Query (insert mode)
352
366
  ActionKeyDef("escape", "exit_insert_mode", "query_insert"),
353
367
  ActionKeyDef("ctrl+enter", "execute_query_insert", "query_insert"),
354
368
  ActionKeyDef("tab", "autocomplete_accept", "query_insert"),
369
+ # Navigation
370
+ ActionKeyDef("e", "focus_explorer", "navigation"),
371
+ ActionKeyDef("q", "focus_query", "navigation"),
372
+ ActionKeyDef("r", "focus_results", "navigation"),
355
373
  # Query (autocomplete)
356
374
  ActionKeyDef("ctrl+j", "autocomplete_next", "autocomplete"),
357
375
  ActionKeyDef("ctrl+k", "autocomplete_prev", "autocomplete"),
@@ -194,6 +194,11 @@ class DatabaseAdapter(ABC):
194
194
  """
195
195
  return False
196
196
 
197
+ @property
198
+ def supports_process_worker(self) -> bool:
199
+ """Whether this adapter supports running queries in a separate process."""
200
+ return True
201
+
197
202
  @property
198
203
  def test_query(self) -> str:
199
204
  """A simple query to test the connection.
@@ -55,6 +55,11 @@ class DuckDBAdapter(DatabaseAdapter):
55
55
  """DuckDB supports sequences."""
56
56
  return True
57
57
 
58
+ @property
59
+ def supports_process_worker(self) -> bool:
60
+ """DuckDB file locking conflicts with multi-process connections."""
61
+ return False
62
+
58
63
  @property
59
64
  def default_schema(self) -> str:
60
65
  return "main"
@@ -66,6 +66,14 @@ def load_columns_async(host: TreeMixinHost, node: Any, data: TableNode | ViewNod
66
66
  use_worker = bool(getattr(runtime, "process_worker", False)) and not bool(
67
67
  getattr(getattr(runtime, "mock", None), "enabled", False)
68
68
  )
69
+ if use_worker:
70
+ try:
71
+ from sqlit.domains.process_worker.app.support import supports_process_worker
72
+ except Exception:
73
+ pass
74
+ else:
75
+ provider = getattr(host, "current_provider", None)
76
+ use_worker = supports_process_worker(provider)
69
77
  if use_worker and hasattr(host, "_get_process_worker_client_async"):
70
78
  client = await host._get_process_worker_client_async() # type: ignore[attr-defined]
71
79
  else:
@@ -159,6 +167,14 @@ def load_folder_async(host: TreeMixinHost, node: Any, data: FolderNode) -> None:
159
167
  use_worker = bool(getattr(runtime, "process_worker", False)) and not bool(
160
168
  getattr(getattr(runtime, "mock", None), "enabled", False)
161
169
  )
170
+ if use_worker:
171
+ try:
172
+ from sqlit.domains.process_worker.app.support import supports_process_worker
173
+ except Exception:
174
+ pass
175
+ else:
176
+ provider = getattr(host, "current_provider", None)
177
+ use_worker = supports_process_worker(provider)
162
178
  client = None
163
179
  if use_worker and hasattr(host, "_get_process_worker_client_async"):
164
180
  client = await host._get_process_worker_client_async() # type: ignore[attr-defined]
@@ -0,0 +1,15 @@
1
+ """Helpers for deciding process worker availability."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+
8
+ def supports_process_worker(provider: Any) -> bool:
9
+ """Return False when a provider or adapter opts out of process workers."""
10
+ adapter = getattr(provider, "connection_factory", None)
11
+ for candidate in (adapter, provider):
12
+ value = getattr(candidate, "supports_process_worker", None)
13
+ if isinstance(value, bool):
14
+ return value
15
+ return True
@@ -22,7 +22,11 @@ class ProcessWorkerLifecycleMixin(LifecycleHooksMixin):
22
22
  return False
23
23
  if bool(getattr(getattr(runtime, "mock", None), "enabled", False)):
24
24
  return False
25
- return True
25
+ try:
26
+ from sqlit.domains.process_worker.app.support import supports_process_worker
27
+ except Exception:
28
+ return True
29
+ return supports_process_worker(provider)
26
30
 
27
31
  def _get_process_worker_client(self: QueryMixinHost) -> Any | None:
28
32
  client = getattr(self, "_process_worker_client", None)
@@ -26,6 +26,22 @@ class QueryNormalModeState(State):
26
26
  self.allows("cursor_right", help="Move cursor right")
27
27
  self.allows("cursor_up", help="Move cursor up")
28
28
  self.allows("cursor_down", help="Move cursor down")
29
+ self.allows("cursor_word_forward", help="Move to next word")
30
+ self.allows("cursor_WORD_forward", help="Move to next WORD")
31
+ self.allows("cursor_word_back", help="Move to previous word")
32
+ self.allows("cursor_WORD_back", help="Move to previous WORD")
33
+ self.allows("cursor_word_end", help="Move to end of word")
34
+ self.allows("cursor_WORD_end", help="Move to end of WORD")
35
+ self.allows("cursor_line_start", help="Move to line start")
36
+ self.allows("cursor_line_end", help="Move to line end")
37
+ self.allows("cursor_last_line", help="Move to last line")
38
+ self.allows("cursor_matching_bracket", help="Move to matching bracket")
39
+ self.allows("cursor_find_char", help="Find char forward")
40
+ self.allows("cursor_find_char_back", help="Find char backward")
41
+ self.allows("cursor_till_char", help="Move till char forward")
42
+ self.allows("cursor_till_char_back", help="Move till char backward")
43
+ self.allows("append_insert_mode", help="Append after cursor")
44
+ self.allows("append_line_end", help="Append at line end")
29
45
  # Vim open line
30
46
  self.allows("open_line_below", help="Open line below")
31
47
  self.allows("open_line_above", help="Open line above")
@@ -0,0 +1,179 @@
1
+ """Cursor and navigation actions for query editing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from sqlit.shared.ui.protocols import QueryMixinHost
6
+
7
+
8
+ class QueryEditingCursorMixin:
9
+ """Cursor movement and navigation for the query editor."""
10
+
11
+ def _move_with_motion(self: QueryMixinHost, motion_key: str, char: str | None = None) -> None:
12
+ """Move cursor using a vim motion."""
13
+ from sqlit.domains.query.editing import MOTIONS
14
+
15
+ motion_func = MOTIONS.get(motion_key)
16
+ if not motion_func:
17
+ return
18
+
19
+ text = self.query_input.text
20
+ row, col = self.query_input.cursor_location
21
+ result = motion_func(text, row, col, char)
22
+ self.query_input.cursor_location = (result.position.row, result.position.col)
23
+
24
+ def action_g_leader_key(self: QueryMixinHost) -> None:
25
+ """Show the g motion leader menu."""
26
+ self._start_leader_pending("g")
27
+
28
+ def action_g_first_line(self: QueryMixinHost) -> None:
29
+ """Go to first line (gg)."""
30
+ self._clear_leader_pending()
31
+ self.query_input.cursor_location = (0, 0)
32
+
33
+ def action_g_word_end_back(self: QueryMixinHost) -> None:
34
+ """Go to end of previous word (ge)."""
35
+ self._clear_leader_pending()
36
+ self._move_with_motion("ge")
37
+
38
+ def action_g_WORD_end_back(self: QueryMixinHost) -> None:
39
+ """Go to end of previous WORD (gE)."""
40
+ self._clear_leader_pending()
41
+ self._move_with_motion("gE")
42
+
43
+ def action_cursor_left(self: QueryMixinHost) -> None:
44
+ """Move cursor left (h in normal mode)."""
45
+ row, col = self.query_input.cursor_location
46
+ self.query_input.cursor_location = (row, max(0, col - 1))
47
+
48
+ def action_cursor_right(self: QueryMixinHost) -> None:
49
+ """Move cursor right (l in normal mode)."""
50
+ lines = self.query_input.text.split("\n")
51
+ row, col = self.query_input.cursor_location
52
+ line_len = len(lines[row]) if row < len(lines) else 0
53
+ self.query_input.cursor_location = (row, min(col + 1, line_len))
54
+
55
+ def action_cursor_up(self: QueryMixinHost) -> None:
56
+ """Move cursor up (k in normal mode)."""
57
+ lines = self.query_input.text.split("\n")
58
+ row, col = self.query_input.cursor_location
59
+ new_row = max(0, row - 1)
60
+ new_col = min(col, len(lines[new_row]) if new_row < len(lines) else 0)
61
+ self.query_input.cursor_location = (new_row, new_col)
62
+
63
+ def action_cursor_down(self: QueryMixinHost) -> None:
64
+ """Move cursor down (j in normal mode)."""
65
+ lines = self.query_input.text.split("\n")
66
+ row, col = self.query_input.cursor_location
67
+ new_row = min(row + 1, len(lines) - 1)
68
+ new_col = min(col, len(lines[new_row]) if new_row < len(lines) else 0)
69
+ self.query_input.cursor_location = (new_row, new_col)
70
+
71
+ def action_cursor_word_forward(self: QueryMixinHost) -> None:
72
+ """Move cursor to next word (w)."""
73
+ self._move_with_motion("w")
74
+
75
+ def action_cursor_WORD_forward(self: QueryMixinHost) -> None:
76
+ """Move cursor to next WORD (W)."""
77
+ self._move_with_motion("W")
78
+
79
+ def action_cursor_word_back(self: QueryMixinHost) -> None:
80
+ """Move cursor to previous word (b)."""
81
+ self._move_with_motion("b")
82
+
83
+ def action_cursor_WORD_back(self: QueryMixinHost) -> None:
84
+ """Move cursor to previous WORD (B)."""
85
+ self._move_with_motion("B")
86
+
87
+ def action_cursor_word_end(self: QueryMixinHost) -> None:
88
+ """Move cursor to end of word (e)."""
89
+ self._move_with_motion("e")
90
+
91
+ def action_cursor_WORD_end(self: QueryMixinHost) -> None:
92
+ """Move cursor to end of WORD (E)."""
93
+ self._move_with_motion("E")
94
+
95
+ def action_cursor_line_start(self: QueryMixinHost) -> None:
96
+ """Move cursor to start of line (0)."""
97
+ self._move_with_motion("0")
98
+
99
+ def action_cursor_line_end(self: QueryMixinHost) -> None:
100
+ """Move cursor to end of line ($)."""
101
+ self._move_with_motion("$")
102
+
103
+ def action_cursor_last_line(self: QueryMixinHost) -> None:
104
+ """Move cursor to last line (G)."""
105
+ self._move_with_motion("G")
106
+
107
+ def action_cursor_matching_bracket(self: QueryMixinHost) -> None:
108
+ """Move cursor to matching bracket (%)."""
109
+ self._move_with_motion("%")
110
+
111
+ def action_cursor_find_char(self: QueryMixinHost) -> None:
112
+ """Find next occurrence of char (f{c})."""
113
+ self._show_motion_char_pending_menu("f")
114
+
115
+ def action_cursor_find_char_back(self: QueryMixinHost) -> None:
116
+ """Find previous occurrence of char (F{c})."""
117
+ self._show_motion_char_pending_menu("F")
118
+
119
+ def action_cursor_till_char(self: QueryMixinHost) -> None:
120
+ """Move till before next char (t{c})."""
121
+ self._show_motion_char_pending_menu("t")
122
+
123
+ def action_cursor_till_char_back(self: QueryMixinHost) -> None:
124
+ """Move till after previous char (T{c})."""
125
+ self._show_motion_char_pending_menu("T")
126
+
127
+ def action_append_insert_mode(self: QueryMixinHost) -> None:
128
+ """Enter insert mode after cursor (a)."""
129
+ lines = self.query_input.text.split("\n")
130
+ row, col = self.query_input.cursor_location
131
+ line_len = len(lines[row]) if row < len(lines) else 0
132
+ self.query_input.cursor_location = (row, min(col + 1, line_len))
133
+ self.action_enter_insert_mode()
134
+
135
+ def action_append_line_end(self: QueryMixinHost) -> None:
136
+ """Enter insert mode at end of line (A)."""
137
+ lines = self.query_input.text.split("\n")
138
+ row, _ = self.query_input.cursor_location
139
+ line_len = len(lines[row]) if row < len(lines) else 0
140
+ self.query_input.cursor_location = (row, line_len)
141
+ self.action_enter_insert_mode()
142
+
143
+ def _show_motion_char_pending_menu(self: QueryMixinHost, motion: str) -> None:
144
+ """Show char pending menu for f/F/t/T motions (cursor movement)."""
145
+ from sqlit.domains.query.ui.screens import CharPendingMenuScreen
146
+
147
+ def handle_result(char: str | None) -> None:
148
+ if char:
149
+ self._move_with_motion(motion, char)
150
+
151
+ self.push_screen(CharPendingMenuScreen(motion), handle_result)
152
+
153
+ def action_open_line_below(self: QueryMixinHost) -> None:
154
+ """Open new line below current line and enter insert mode (o in normal mode)."""
155
+ self._push_undo_state()
156
+ lines = self.query_input.text.split("\n")
157
+ row, _ = self.query_input.cursor_location
158
+
159
+ # Insert new line after current row
160
+ lines.insert(row + 1, "")
161
+ self.query_input.text = "\n".join(lines)
162
+ self.query_input.cursor_location = (row + 1, 0)
163
+
164
+ # Enter insert mode
165
+ self.action_enter_insert_mode()
166
+
167
+ def action_open_line_above(self: QueryMixinHost) -> None:
168
+ """Open new line above current line and enter insert mode (O in normal mode)."""
169
+ self._push_undo_state()
170
+ lines = self.query_input.text.split("\n")
171
+ row, _ = self.query_input.cursor_location
172
+
173
+ # Insert new line before current row
174
+ lines.insert(row, "")
175
+ self.query_input.text = "\n".join(lines)
176
+ self.query_input.cursor_location = (row, 0)
177
+
178
+ # Enter insert mode
179
+ self.action_enter_insert_mode()
@@ -3,6 +3,8 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
+ import platform
7
+ import subprocess
6
8
  import sys
7
9
  import time
8
10
  from datetime import datetime
@@ -552,6 +554,10 @@ class SSMSTUI(
552
554
  self._show_command_list()
553
555
  return
554
556
 
557
+ if cmd in {"version", "ver"}:
558
+ self._show_version_info()
559
+ return
560
+
555
561
  if cmd in {"q", "quit", "exit"}:
556
562
  try:
557
563
  handler = getattr(self, "action_quit", None)
@@ -648,6 +654,7 @@ class SSMSTUI(
648
654
  columns = ["Title", "Command", "Description", "Hint"]
649
655
  rows = [
650
656
  ("General", ":commands", "Show this command list", ""),
657
+ ("General", ":version, :ver", "Show version and git hash", ""),
651
658
  ("General", ":help, :h", "Show keyboard shortcuts", ""),
652
659
  ("General", ":q, :quit, :exit", "Quit sqlit", ""),
653
660
  ("Connection", ":connect, :c", "Open connection picker", ""),
@@ -697,6 +704,89 @@ class SSMSTUI(
697
704
  if hasattr(self, "_replace_results_table"):
698
705
  self._replace_results_table(columns, rows)
699
706
 
707
+ def _resolve_repo_root(self) -> Path | None:
708
+ path = Path(__file__).resolve()
709
+ for parent in (path, *path.parents):
710
+ if (parent / ".git").exists():
711
+ return parent
712
+ return None
713
+
714
+ def _parse_git_hash_from_version(self, version: str) -> str | None:
715
+ import re
716
+
717
+ match = re.search(r"\\+g([0-9a-fA-F]{7,})", version)
718
+ if not match:
719
+ return None
720
+ return match.group(1)
721
+
722
+ def _get_git_info(self) -> tuple[str | None, bool | None]:
723
+ repo_root = self._resolve_repo_root()
724
+ if repo_root is None:
725
+ return None, None
726
+ try:
727
+ result = subprocess.run(
728
+ ["git", "rev-parse", "--short", "HEAD"],
729
+ cwd=repo_root,
730
+ check=False,
731
+ capture_output=True,
732
+ text=True,
733
+ )
734
+ git_hash = result.stdout.strip() or None
735
+ except Exception:
736
+ git_hash = None
737
+ dirty: bool | None = None
738
+ try:
739
+ status = subprocess.run(
740
+ ["git", "status", "--porcelain"],
741
+ cwd=repo_root,
742
+ check=False,
743
+ capture_output=True,
744
+ text=True,
745
+ )
746
+ if status.stdout is not None:
747
+ dirty = bool(status.stdout.strip())
748
+ except Exception:
749
+ dirty = None
750
+ return git_hash, dirty
751
+
752
+ def _show_version_info(self) -> None:
753
+ try:
754
+ from sqlit import __version__ as pkg_version
755
+ except Exception:
756
+ pkg_version = "unknown"
757
+
758
+ git_hash = self._parse_git_hash_from_version(pkg_version)
759
+ dirty: bool | None = None
760
+ if git_hash is None:
761
+ git_hash, dirty = self._get_git_info()
762
+ else:
763
+ _repo_hash, dirty = self._get_git_info()
764
+
765
+ git_display = git_hash or "unknown"
766
+ dirty_display = "unknown"
767
+ if dirty is True:
768
+ dirty_display = "yes"
769
+ if git_hash:
770
+ git_display = f"{git_display} (dirty)"
771
+ elif dirty is False:
772
+ dirty_display = "no"
773
+
774
+ info_rows = [
775
+ ("version", pkg_version),
776
+ ("git", git_display),
777
+ ("dirty", dirty_display),
778
+ ("python", platform.python_version()),
779
+ ("platform", sys.platform),
780
+ ]
781
+
782
+ if hasattr(self, "_replace_results_table"):
783
+ self._replace_results_table(["Key", "Value"], info_rows)
784
+
785
+ summary = f"sqlit {pkg_version}"
786
+ if git_hash:
787
+ summary = f"{summary} ({git_hash})"
788
+ self.notify(summary, severity="information")
789
+
700
790
  def _execute_command_action(self, action: str) -> None:
701
791
  ctx = self._get_input_context()
702
792
  if not self._state_machine.check_action(ctx, action):
@@ -2,6 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ import pytest
9
+
5
10
  from .test_database_base import BaseDatabaseTestsWithLimit, DatabaseTestConfig
6
11
 
7
12
 
@@ -128,3 +133,86 @@ class TestDuckDBIntegration(BaseDatabaseTestsWithLimit):
128
133
  )
129
134
  # Should fail gracefully
130
135
  assert result.returncode != 0 or "error" in result.stdout.lower() or "error" in result.stderr.lower()
136
+
137
+
138
+ @pytest.mark.parametrize("use_worker", [True, False])
139
+ def test_duckdb_process_worker_no_lock(duckdb_db, use_worker):
140
+ """Ensure DuckDB queries work with or without the process worker."""
141
+ if sys.platform.startswith("win"):
142
+ pytest.skip("DuckDB file-lock behavior differs on Windows")
143
+
144
+ from sqlit.domains.connections.app.session import ConnectionSession
145
+ from sqlit.domains.connections.domain.config import ConnectionConfig, FileEndpoint
146
+ from sqlit.domains.process_worker.app.process_worker_client import ProcessWorkerClient
147
+ from sqlit.domains.process_worker.app.support import supports_process_worker
148
+ from sqlit.domains.query.app.transaction import TransactionExecutor
149
+
150
+ config = ConnectionConfig(
151
+ name="duckdb_lock_test",
152
+ db_type="duckdb",
153
+ endpoint=FileEndpoint(path=str(duckdb_db)),
154
+ )
155
+
156
+ session = ConnectionSession.create(config)
157
+ try:
158
+ outcome = None
159
+ use_worker_effective = bool(use_worker and supports_process_worker(session.provider))
160
+ if use_worker_effective:
161
+ client = ProcessWorkerClient()
162
+ try:
163
+ outcome = client.execute("SELECT 1", config, max_rows=1)
164
+ finally:
165
+ client.close()
166
+ else:
167
+ executor = TransactionExecutor(config=config, provider=session.provider)
168
+ try:
169
+ executor.execute("SELECT 1", max_rows=1)
170
+ finally:
171
+ executor.close()
172
+ finally:
173
+ session.close()
174
+
175
+ if use_worker_effective:
176
+ assert outcome is not None
177
+ assert outcome.error is None, f"Unexpected error: {outcome.error}"
178
+
179
+
180
+ def test_duckdb_schema_service_repo_file(tmp_path):
181
+ """Validate explorer schema service against the repo DuckDB fixture."""
182
+ if sys.platform.startswith("win"):
183
+ pytest.skip("DuckDB file-lock behavior differs on Windows")
184
+
185
+ from sqlit.domains.connections.app.session import ConnectionSession
186
+ from sqlit.domains.connections.domain.config import ConnectionConfig, FileEndpoint
187
+ from sqlit.domains.explorer.app.schema_service import ExplorerSchemaService
188
+ try:
189
+ import duckdb # type: ignore
190
+ except Exception:
191
+ pytest.skip("duckdb is not installed")
192
+
193
+ db_path = Path(tmp_path) / "cats.duckdb"
194
+ conn = duckdb.connect(str(db_path))
195
+ conn.execute("CREATE TABLE cats (id INTEGER, name VARCHAR, motto VARCHAR)")
196
+ conn.execute("INSERT INTO cats VALUES (1, 'Mochi', 'Nap hard, snack harder')")
197
+ conn.execute("INSERT INTO cats VALUES (2, 'Nimbus', 'Gravity is optional')")
198
+ conn.close()
199
+
200
+ config = ConnectionConfig(
201
+ name="duckdb_repo_fixture",
202
+ db_type="duckdb",
203
+ endpoint=FileEndpoint(path=str(db_path)),
204
+ )
205
+
206
+ session = ConnectionSession.create(config)
207
+ try:
208
+ service = ExplorerSchemaService(session=session, object_cache={})
209
+ tables = service.list_folder_items("tables", None)
210
+ table_names = {name for kind, _, name in tables if kind == "table"}
211
+ assert "cats" in table_names
212
+
213
+ schema = session.provider.capabilities.default_schema or "main"
214
+ columns = service.list_columns(None, schema, "cats")
215
+ column_names = {col.name for col in columns}
216
+ assert {"id", "name", "motto"}.issubset(column_names)
217
+ finally:
218
+ session.close()