mycli 2.25.3__tar.gz → 2.27.0__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 (207) hide show
  1. {mycli-2.25.3 → mycli-2.27.0}/.github/workflows/ci.yml +6 -6
  2. {mycli-2.25.3 → mycli-2.27.0}/.github/workflows/publish.yml +5 -5
  3. {mycli-2.25.3 → mycli-2.27.0}/.github/workflows/typecheck.yml +1 -1
  4. {mycli-2.25.3 → mycli-2.27.0}/AGENTS.md +10 -8
  5. mycli-2.27.0/CONTRIBUTING.md +152 -0
  6. {mycli-2.25.3/mycli.egg-info → mycli-2.27.0}/PKG-INFO +15 -7
  7. {mycli-2.25.3 → mycli-2.27.0}/README.md +12 -3
  8. {mycli-2.25.3 → mycli-2.27.0}/changelog.md +203 -164
  9. {mycli-2.25.3 → mycli-2.27.0}/doc/key_bindings.md +8 -0
  10. {mycli-2.25.3 → mycli-2.27.0}/doc/transforms.md +0 -1
  11. {mycli-2.25.3 → mycli-2.27.0}/docker/resources/test_db-1.0.7.tar.gz +1 -1
  12. mycli-2.27.0/docker/resources/test_db_license.md +18 -0
  13. {mycli-2.25.3 → mycli-2.27.0}/mycli/TIPS +2 -0
  14. {mycli-2.25.3 → mycli-2.27.0}/mycli/boundary_tunnel.py +3 -7
  15. {mycli-2.25.3 → mycli-2.27.0}/mycli/client_connection.py +7 -25
  16. {mycli-2.25.3 → mycli-2.27.0}/mycli/constants.py +20 -0
  17. {mycli-2.25.3 → mycli-2.27.0}/mycli/key_bindings.py +18 -0
  18. {mycli-2.25.3 → mycli-2.27.0}/mycli/main_modes/repl.py +68 -28
  19. {mycli-2.25.3 → mycli-2.27.0}/mycli/myclirc +6 -0
  20. {mycli-2.25.3 → mycli-2.27.0}/mycli/output.py +14 -0
  21. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/completion_engine.py +68 -1
  22. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/hybrid_redirection.py +75 -27
  23. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/key_binding_utils.py +9 -0
  24. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/polars_completion.py +3 -0
  25. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/polars_transform.py +36 -1
  26. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/dbcommands.py +1 -1
  27. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/iocommands.py +106 -22
  28. mycli-2.27.0/mycli/query_runner.py +355 -0
  29. {mycli-2.25.3 → mycli-2.27.0}/mycli/sqlcompleter.py +24 -1
  30. {mycli-2.25.3 → mycli-2.27.0}/mycli/sqlexecute.py +58 -18
  31. {mycli-2.25.3 → mycli-2.27.0/mycli.egg-info}/PKG-INFO +15 -7
  32. {mycli-2.25.3 → mycli-2.27.0}/mycli.egg-info/SOURCES.txt +3 -0
  33. {mycli-2.25.3 → mycli-2.27.0}/mycli.egg-info/requires.txt +1 -1
  34. {mycli-2.25.3 → mycli-2.27.0}/mycli.egg-info/scm_file_list.json +3 -0
  35. mycli-2.27.0/mycli.egg-info/scm_version.json +8 -0
  36. {mycli-2.25.3 → mycli-2.27.0}/pyproject.toml +3 -4
  37. {mycli-2.25.3 → mycli-2.27.0}/test/myclirc +6 -0
  38. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_boundary_tunnel.py +73 -70
  39. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_client.py +15 -3
  40. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_client_connection.py +0 -10
  41. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_completion_engine.py +89 -0
  42. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_hybrid_redirection.py +74 -0
  43. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_key_binding_utils.py +33 -0
  44. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_key_bindings.py +61 -0
  45. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_main_modes_repl.py +259 -12
  46. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_output.py +38 -0
  47. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_polars_completion.py +5 -0
  48. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_polars_transform.py +80 -0
  49. mycli-2.27.0/test/pytests/test_query_runner.py +855 -0
  50. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_smart_completion_public_schema_only.py +85 -0
  51. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_special_dbcommands.py +1 -6
  52. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_special_iocommands.py +294 -11
  53. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_sqlcompleter.py +97 -0
  54. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_sqlexecute.py +249 -13
  55. {mycli-2.25.3 → mycli-2.27.0}/test/utils.py +1 -1
  56. mycli-2.25.3/CONTRIBUTING.md +0 -118
  57. mycli-2.25.3/mycli.egg-info/scm_version.json +0 -8
  58. {mycli-2.25.3 → mycli-2.27.0}/.git-blame-ignore-revs +0 -0
  59. {mycli-2.25.3 → mycli-2.27.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  60. {mycli-2.25.3 → mycli-2.27.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  61. {mycli-2.25.3 → mycli-2.27.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  62. {mycli-2.25.3 → mycli-2.27.0}/.github/dependabot.yml +0 -0
  63. {mycli-2.25.3 → mycli-2.27.0}/.github/workflows/lint.yml +0 -0
  64. {mycli-2.25.3 → mycli-2.27.0}/.gitignore +0 -0
  65. {mycli-2.25.3 → mycli-2.27.0}/AUTHORS.md +0 -0
  66. {mycli-2.25.3 → mycli-2.27.0}/LICENSE.txt +0 -0
  67. {mycli-2.25.3 → mycli-2.27.0}/MANIFEST.in +0 -0
  68. {mycli-2.25.3 → mycli-2.27.0}/SPONSORS.md +0 -0
  69. {mycli-2.25.3 → mycli-2.27.0}/doc/llm.md +0 -0
  70. {mycli-2.25.3 → mycli-2.27.0}/doc/screenshots/main.gif +0 -0
  71. {mycli-2.25.3 → mycli-2.27.0}/doc/screenshots/polars_describe.png +0 -0
  72. {mycli-2.25.3 → mycli-2.27.0}/doc/screenshots/polars_group_by.png +0 -0
  73. {mycli-2.25.3 → mycli-2.27.0}/doc/screenshots/polars_histogram.png +0 -0
  74. {mycli-2.25.3 → mycli-2.27.0}/doc/screenshots/polars_pivot.png +0 -0
  75. {mycli-2.25.3 → mycli-2.27.0}/doc/screenshots/tables.png +0 -0
  76. {mycli-2.25.3 → mycli-2.27.0}/docker/Dockerfile +0 -0
  77. {mycli-2.25.3 → mycli-2.27.0}/mycli/AUTHORS +0 -0
  78. {mycli-2.25.3 → mycli-2.27.0}/mycli/SPONSORS +0 -0
  79. {mycli-2.25.3 → mycli-2.27.0}/mycli/__init__.py +0 -0
  80. {mycli-2.25.3 → mycli-2.27.0}/mycli/app_state.py +0 -0
  81. {mycli-2.25.3 → mycli-2.27.0}/mycli/cli_runner.py +0 -0
  82. {mycli-2.25.3 → mycli-2.27.0}/mycli/clibuffer.py +0 -0
  83. {mycli-2.25.3 → mycli-2.27.0}/mycli/client.py +0 -0
  84. {mycli-2.25.3 → mycli-2.27.0}/mycli/client_commands.py +0 -0
  85. {mycli-2.25.3 → mycli-2.27.0}/mycli/client_query.py +0 -0
  86. {mycli-2.25.3 → mycli-2.27.0}/mycli/clistyle.py +0 -0
  87. {mycli-2.25.3 → mycli-2.27.0}/mycli/clitoolbar.py +0 -0
  88. {mycli-2.25.3 → mycli-2.27.0}/mycli/compat.py +0 -0
  89. {mycli-2.25.3 → mycli-2.27.0}/mycli/completion_refresher.py +0 -0
  90. {mycli-2.25.3 → mycli-2.27.0}/mycli/config.py +0 -0
  91. {mycli-2.25.3 → mycli-2.27.0}/mycli/keyring_utils.py +0 -0
  92. {mycli-2.25.3 → mycli-2.27.0}/mycli/kubectl_tunnel.py +0 -0
  93. {mycli-2.25.3 → mycli-2.27.0}/mycli/lexer.py +0 -0
  94. {mycli-2.25.3 → mycli-2.27.0}/mycli/macos_keychain.py +0 -0
  95. {mycli-2.25.3 → mycli-2.27.0}/mycli/main.py +0 -0
  96. {mycli-2.25.3 → mycli-2.27.0}/mycli/main_modes/batch.py +0 -0
  97. {mycli-2.25.3 → mycli-2.27.0}/mycli/main_modes/checkup.py +0 -0
  98. {mycli-2.25.3 → mycli-2.27.0}/mycli/main_modes/completions.py +0 -0
  99. {mycli-2.25.3 → mycli-2.27.0}/mycli/main_modes/execute.py +0 -0
  100. {mycli-2.25.3 → mycli-2.27.0}/mycli/main_modes/list_dsn.py +0 -0
  101. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/__init__.py +0 -0
  102. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/batch_utils.py +0 -0
  103. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/cli_utils.py +0 -0
  104. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/filepaths.py +0 -0
  105. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/interactive_utils.py +0 -0
  106. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/ptoolkit/__init__.py +0 -0
  107. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/ptoolkit/fzf.py +0 -0
  108. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/ptoolkit/history.py +0 -0
  109. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/ptoolkit/utils.py +0 -0
  110. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/__init__.py +0 -0
  111. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/delimitercommand.py +0 -0
  112. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/dsn_aliases.py +0 -0
  113. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/favoritequeries.py +0 -0
  114. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/llm.py +0 -0
  115. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/main.py +0 -0
  116. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/source.py +0 -0
  117. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/special/utils.py +0 -0
  118. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/sql_utils.py +0 -0
  119. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/sqlresult.py +0 -0
  120. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/string_utils.py +0 -0
  121. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/tabular_output/__init__.py +0 -0
  122. {mycli-2.25.3 → mycli-2.27.0}/mycli/packages/tabular_output/sql_format.py +0 -0
  123. {mycli-2.25.3 → mycli-2.27.0}/mycli/password_sources.py +0 -0
  124. {mycli-2.25.3 → mycli-2.27.0}/mycli/resources/completions/bash/mycli +0 -0
  125. {mycli-2.25.3 → mycli-2.27.0}/mycli/resources/completions/fish/mycli.fish +0 -0
  126. {mycli-2.25.3 → mycli-2.27.0}/mycli/resources/completions/zsh/_mycli +0 -0
  127. {mycli-2.25.3 → mycli-2.27.0}/mycli/schema_prefetcher.py +0 -0
  128. {mycli-2.25.3 → mycli-2.27.0}/mycli/ssh_tunnel.py +0 -0
  129. {mycli-2.25.3 → mycli-2.27.0}/mycli/types.py +0 -0
  130. {mycli-2.25.3 → mycli-2.27.0}/mycli/vault.py +0 -0
  131. {mycli-2.25.3 → mycli-2.27.0}/mycli.egg-info/dependency_links.txt +0 -0
  132. {mycli-2.25.3 → mycli-2.27.0}/mycli.egg-info/entry_points.txt +0 -0
  133. {mycli-2.25.3 → mycli-2.27.0}/mycli.egg-info/top_level.txt +0 -0
  134. {mycli-2.25.3 → mycli-2.27.0}/setup.cfg +0 -0
  135. {mycli-2.25.3 → mycli-2.27.0}/test/__init__.py +0 -0
  136. {mycli-2.25.3 → mycli-2.27.0}/test/features/__init__.py +0 -0
  137. {mycli-2.25.3 → mycli-2.27.0}/test/features/auto_vertical.feature +0 -0
  138. {mycli-2.25.3 → mycli-2.27.0}/test/features/basic_commands.feature +0 -0
  139. {mycli-2.25.3 → mycli-2.27.0}/test/features/connection.feature +0 -0
  140. {mycli-2.25.3 → mycli-2.27.0}/test/features/crud_database.feature +0 -0
  141. {mycli-2.25.3 → mycli-2.27.0}/test/features/crud_table.feature +0 -0
  142. {mycli-2.25.3 → mycli-2.27.0}/test/features/db_utils.py +0 -0
  143. {mycli-2.25.3 → mycli-2.27.0}/test/features/environment.py +0 -0
  144. {mycli-2.25.3 → mycli-2.27.0}/test/features/fixture_data/help_commands.txt +0 -0
  145. {mycli-2.25.3 → mycli-2.27.0}/test/features/fixture_utils.py +0 -0
  146. {mycli-2.25.3 → mycli-2.27.0}/test/features/iocommands.feature +0 -0
  147. {mycli-2.25.3 → mycli-2.27.0}/test/features/named_queries.feature +0 -0
  148. {mycli-2.25.3 → mycli-2.27.0}/test/features/specials.feature +0 -0
  149. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/__init__.py +0 -0
  150. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/auto_vertical.py +0 -0
  151. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/basic_commands.py +0 -0
  152. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/connection.py +0 -0
  153. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/crud_database.py +0 -0
  154. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/crud_table.py +0 -0
  155. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/iocommands.py +0 -0
  156. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/named_queries.py +0 -0
  157. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/specials.py +0 -0
  158. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/utils.py +0 -0
  159. {mycli-2.25.3 → mycli-2.27.0}/test/features/steps/wrappers.py +0 -0
  160. {mycli-2.25.3 → mycli-2.27.0}/test/features/wrappager.py +0 -0
  161. {mycli-2.25.3 → mycli-2.27.0}/test/mylogin.cnf +0 -0
  162. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/conftest.py +0 -0
  163. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_app_state.py +0 -0
  164. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_bash_completion.py +0 -0
  165. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_batch_utils.py +0 -0
  166. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_checkup.py +0 -0
  167. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_cli_runner.py +0 -0
  168. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_cli_utils.py +0 -0
  169. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_clibuffer.py +0 -0
  170. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_client_commands.py +0 -0
  171. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_client_query.py +0 -0
  172. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_clistyle.py +0 -0
  173. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_clitoolbar.py +0 -0
  174. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_completer_use_switch.py +0 -0
  175. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_completion_refresher.py +0 -0
  176. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_config.py +0 -0
  177. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_delimitercommand.py +0 -0
  178. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_dsn_aliases.py +0 -0
  179. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_favoritequeries.py +0 -0
  180. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_filepaths.py +0 -0
  181. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_fish_completion.py +0 -0
  182. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_interactive_utils.py +0 -0
  183. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_keyring_utils.py +0 -0
  184. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_kubectl_tunnel.py +0 -0
  185. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_macos_keychain.py +0 -0
  186. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_main.py +0 -0
  187. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_main_modes_batch.py +0 -0
  188. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_main_modes_execute.py +0 -0
  189. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_main_modes_list_dsn.py +0 -0
  190. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_naive_completion.py +0 -0
  191. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_password_sources.py +0 -0
  192. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_ptoolkit_fzf.py +0 -0
  193. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_ptoolkit_history.py +0 -0
  194. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_ptoolkit_utils.py +0 -0
  195. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_schema_prefetcher.py +0 -0
  196. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_special_init.py +0 -0
  197. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_special_llm.py +0 -0
  198. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_special_main.py +0 -0
  199. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_special_source.py +0 -0
  200. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_special_utils.py +0 -0
  201. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_sql_utils.py +0 -0
  202. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_sqlresult.py +0 -0
  203. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_ssh_tunnel.py +0 -0
  204. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_string_utils.py +0 -0
  205. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_tabular_output.py +0 -0
  206. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_vault.py +0 -0
  207. {mycli-2.25.3 → mycli-2.27.0}/test/pytests/test_zsh_completion.py +0 -0
@@ -24,7 +24,7 @@ jobs:
24
24
  steps:
25
25
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
26
 
27
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
27
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
28
28
  with:
29
29
  version: "latest"
30
30
 
@@ -66,7 +66,7 @@ jobs:
66
66
  steps:
67
67
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
68
68
 
69
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
69
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
70
70
  with:
71
71
  version: "latest"
72
72
 
@@ -116,7 +116,7 @@ jobs:
116
116
  steps:
117
117
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
118
118
 
119
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
119
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
120
120
  with:
121
121
  version: 'latest'
122
122
 
@@ -220,7 +220,7 @@ jobs:
220
220
  steps:
221
221
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
222
222
 
223
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
223
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
224
224
  with:
225
225
  version: "latest"
226
226
 
@@ -264,7 +264,7 @@ jobs:
264
264
 
265
265
  - name: Build Docker image
266
266
  id: build
267
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
267
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
268
268
  with:
269
269
  context: .
270
270
  file: docker/Dockerfile
@@ -284,7 +284,7 @@ jobs:
284
284
 
285
285
  - name: Build Docker image
286
286
  id: build
287
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
287
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
288
288
  with:
289
289
  context: .
290
290
  file: docker/Dockerfile
@@ -32,7 +32,7 @@ jobs:
32
32
 
33
33
  steps:
34
34
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
35
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
35
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
36
36
  with:
37
37
  version: "latest"
38
38
 
@@ -77,7 +77,7 @@ jobs:
77
77
  steps:
78
78
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
79
79
 
80
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
80
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
81
81
  with:
82
82
  version: "latest"
83
83
 
@@ -127,7 +127,7 @@ jobs:
127
127
  steps:
128
128
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
129
129
 
130
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
130
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
131
131
  with:
132
132
  version: 'latest'
133
133
 
@@ -230,7 +230,7 @@ jobs:
230
230
 
231
231
  steps:
232
232
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
233
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
233
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
234
234
  with:
235
235
  version: "latest"
236
236
 
@@ -314,7 +314,7 @@ jobs:
314
314
 
315
315
  - name: Build and push Docker image
316
316
  id: push
317
- uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
317
+ uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
318
318
  with:
319
319
  context: .
320
320
  file: docker/Dockerfile
@@ -25,7 +25,7 @@ jobs:
25
25
  with:
26
26
  python-version: '3.14'
27
27
 
28
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
28
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
29
29
  with:
30
30
  version: 'latest'
31
31
 
@@ -56,6 +56,7 @@ A command line client for MySQL with auto-completion and syntax highlighting.
56
56
  ├── mycli/packages/string_utils.py # generic string utilities
57
57
  ├── mycli/packages/tabular_output/ # extends cli_helper with additional output formats
58
58
  ├── mycli/password_sources.py # password sources and precedence
59
+ ├── mycli/query_runner.py # run queries with query state and timing updates
59
60
  ├── mycli/resources/completions/ # shell completions for CLI interface
60
61
  ├── mycli/ssh_tunnel.py # connecting over a tunnel with `--ssh-jump`
61
62
  ├── mycli/schema_prefetcher.py # background prefetcher for multi-schema auto-completion
@@ -80,13 +81,13 @@ This repo uses `uv` for dependency management. **Always** prefix Python
80
81
  commands with `uv run`. Example:
81
82
 
82
83
  ```bash
83
- uv run -- python script.py
84
+ env -u PYTHONPATH uv run -- python script.py
84
85
  ```
85
86
 
86
87
  #### Python Typing
87
88
 
88
89
  This repo uses type annotations which are checked by `mypy`. **Always** add
89
- type annotations, and always check new code with `uv run -- mypy --install-types --non-interactive script.py`.
90
+ type annotations, and always check new code with `env -u PYTHONPATH uv run -- mypy --install-types --non-interactive script.py`.
90
91
 
91
92
  Use lower-case type annotations such as `tuple`, not upper-case type
92
93
  annotations such as `Tuple`.
@@ -96,12 +97,13 @@ Use `Type | None` instead of `Optional[Type]`.
96
97
  #### Python Testing
97
98
 
98
99
  Tests are coordinated by `tox`, and include both `pytest` and `behave` tests.
99
- To run the full test suite, execute `uv run -- tox`.
100
+ To run the full test suite, execute `env -u PYTHONPATH uv run -- tox`.
100
101
 
101
102
  #### Python Compatibility
102
103
 
103
- Use Python features available from Python 3.10 through Python 3.14.
104
- Compatibility with Python 3.9 is not needed.
104
+ Use Python features available from Python 3.11 through Python 3.14.
105
+ Compatibility with Python 3.9 is not needed. Compatibility with Python
106
+ 3.10 is not needed.
105
107
 
106
108
  #### Python Style
107
109
 
@@ -113,9 +115,9 @@ from existing code.
113
115
  #### Python Environment
114
116
 
115
117
  * Package manager: `uv` (not pip)
116
- * Formatter: `uv run -- ruff format`
117
- * Linter: `uv run -- ruff check`
118
- * Type checker: `uv run -- mypy --install-types --non-interactive`
118
+ * Formatter: `env -u PYTHONPATH uv run -- ruff format`
119
+ * Linter: `env -u PYTHONPATH uv run -- ruff check`
120
+ * Type checker: `env -u PYTHONPATH uv run -- mypy --install-types --non-interactive`
119
121
 
120
122
  ### Git Workflows
121
123
 
@@ -0,0 +1,152 @@
1
+ # Development Guide
2
+
3
+ This is a guide for developers who would like to contribute to the project.
4
+
5
+ If you're interested in contributing to mycli, thank you. We'd love your help!
6
+ You'll always get credit and appreciation for your work.
7
+
8
+ ## GitHub Workflow
9
+
10
+ 1. [Fork the repository](https://github.com/dbcli/mycli) on GitHub.
11
+
12
+ 2. Clone your fork locally:
13
+
14
+ ```bash
15
+ git clone <url-for-your-fork>
16
+ ```
17
+
18
+ 3. Add the official repository (`upstream`) as a remote repository:
19
+
20
+ ```bash
21
+ git remote add upstream git@github.com:dbcli/mycli.git
22
+ ```
23
+
24
+ 4. Once you have added upstream, the following command will pull the latest changes to your local `main`:
25
+
26
+ ```bash
27
+ git pull upstream main
28
+ ```
29
+
30
+ 5. Set up [uv](https://docs.astral.sh/uv/getting-started/installation/)
31
+ for development:
32
+
33
+ ```bash
34
+ cd mycli
35
+ uv sync --all-extras
36
+ ```
37
+
38
+ We've just created a virtual environment and installed all the dependencies
39
+ and tools we need to work on mycli.
40
+
41
+ 6. Create a branch for your bugfix or feature based off the `main` branch:
42
+
43
+ ```bash
44
+ git checkout -b <name-of-bugfix-or-feature> main
45
+ ```
46
+
47
+ 7. When your work is ready for the mycli team to review it, push your branch to your fork:
48
+
49
+ ```bash
50
+ git push origin <name-of-bugfix-or-feature>
51
+ ```
52
+
53
+ 8. [Create a pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/)
54
+ on GitHub.
55
+
56
+
57
+ ## Running Mycli with Changes
58
+
59
+ To run mycli with your local changes:
60
+
61
+ ```bash
62
+ uv run mycli
63
+ ```
64
+
65
+
66
+ ## Running the Tests
67
+
68
+ While you work on mycli, it's important to run the tests to make sure your code
69
+ hasn't broken any existing functionality. To run the tests, just run:
70
+
71
+ ```bash
72
+ uv run tox
73
+ ```
74
+
75
+ ### Test Database Credentials
76
+
77
+ Some tests require a database connection to work. You can tell the tests which
78
+ credentials to use by setting the applicable environment variables:
79
+
80
+ ```bash
81
+ export PYTEST_HOST=localhost
82
+ export PYTEST_USER=mycli
83
+ export PYTEST_PASSWORD=myclirocks
84
+ export PYTEST_PORT=3306
85
+ export PYTEST_CHARSET=utf8mb4
86
+ ```
87
+
88
+ Since the default values are
89
+
90
+ ```bash
91
+ export PYTEST_HOST=localhost
92
+ export PYTEST_USER=root
93
+ export PYTEST_PASSWORD=<no password>
94
+ export PYTEST_PORT=3306
95
+ export PYTEST_CHARSET=utf8mb4
96
+ ```
97
+
98
+ for most cases you only need to set the values which differ from the defaults:
99
+
100
+ ```bash
101
+ export PYTEST_USER=mycli
102
+ export PYTEST_PASSWORD=myclirocks
103
+ ```
104
+
105
+ If you would like to run the tests as a user with only the necessary privileges,
106
+ create a `mycli` user on your MySQL server and run the following GRANT statements:
107
+
108
+ ```sql
109
+ GRANT ALL PRIVILEGES ON `mycli_%`.* TO 'mycli'@'localhost';
110
+ GRANT SELECT ON mysql.* TO 'mycli'@'localhost';
111
+ GRANT SELECT ON performance_schema.* TO 'mycli'@'localhost';
112
+ ```
113
+
114
+ ### Editor Tests
115
+
116
+ Some tests expect the program `ex` to be a symbolic link to `vim`.
117
+
118
+ In some systems (e.g. Arch Linux) `ex` is a symbolic link to `vi`, which will
119
+ change the output and therefore make some tests fail.
120
+
121
+ You can check this by running:
122
+ ```bash
123
+ readlink -f $(which ex)
124
+ ```
125
+
126
+ # GitHub PR checklist
127
+
128
+ * add the contribution to `changelog.md`
129
+ * add your name to the `AUTHORS` file (or make sure it is already there)
130
+ * run
131
+
132
+ ```bash
133
+ uv run ruff check && uv run ruff format && uv run mypy --install-types .
134
+ ```
135
+
136
+
137
+ ## Releasing a New Version of Mycli (For Maintainers)
138
+
139
+ We create a new [release](https://github.com/dbcli/mycli/releases) in GitHub. This triggers a GitHub Action which will
140
+
141
+ * run all the tests
142
+ * build a wheel and upload it to PyPI
143
+ * build a Docker image and upload it to ghcr.io
144
+
145
+ Steps to create a release:
146
+
147
+ * Update `changelog.md`, setting the release version and date at the top. Bump the feature version if there are new features in the changelog, otherwise only bump the patch version. Merge this change.
148
+ * Navigate to https://github.com/dbcli/mycli/releases/new .
149
+ * Press "Select Tag" and enter the new version number. It should be the same as in `changelog.md` but with a leading `v`. It should not already exist.
150
+ * Press "Generate Release Notes", which will fill in the notes and the title.
151
+ * Sanity check the generated release notes.
152
+ * Press "Publish Release".
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mycli
3
- Version: 2.25.3
3
+ Version: 2.27.0
4
4
  Summary: Rich MySQL terminal client with autocompletion, syntax highlighting, and dataframes
5
5
  Author: Mycli Core Team
6
6
  License-Expression: BSD-3-Clause
@@ -15,7 +15,6 @@ Classifier: Intended Audience :: Science/Research
15
15
  Classifier: Operating System :: OS Independent
16
16
  Classifier: Programming Language :: Python
17
17
  Classifier: Programming Language :: Python :: 3
18
- Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
21
20
  Classifier: Programming Language :: Python :: 3.13
@@ -24,7 +23,7 @@ Classifier: Programming Language :: SQL
24
23
  Classifier: Topic :: Database
25
24
  Classifier: Topic :: Database :: Front-Ends
26
25
  Classifier: Topic :: Software Development
27
- Requires-Python: >=3.10
26
+ Requires-Python: >=3.11
28
27
  Description-Content-Type: text/markdown
29
28
  License-File: LICENSE.txt
30
29
  License-File: AUTHORS.md
@@ -33,7 +32,7 @@ Requires-Dist: clickdc~=0.1.1
33
32
  Requires-Dist: cryptography~=50.0.1
34
33
  Requires-Dist: Pygments~=2.21.0
35
34
  Requires-Dist: prompt_toolkit<4.0.0,>=3.0.41
36
- Requires-Dist: PyMySQL~=1.1.2
35
+ Requires-Dist: PyMySQL~=1.2.3
37
36
  Requires-Dist: sqlparse~=0.6.0
38
37
  Requires-Dist: sqlglot~=30.17.0
39
38
  Requires-Dist: sqlglotc~=30.17.0
@@ -72,8 +71,9 @@ Dynamic: license-file
72
71
 
73
72
  # mycli
74
73
 
75
- [![Build Status](https://github.com/dbcli/mycli/workflows/mycli/badge.svg)](https://github.com/dbcli/mycli/actions?query=workflow%3Amycli)
76
- [![License](https://img.shields.io/github/license/dbcli/mycli.svg?color=2FC745)](https://github.com/dbcli/mycli/blob/main/LICENSE.txt)
74
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/dbcli/mycli/ci.yml?style=for-the-badge&color=2E9356)](https://github.com/dbcli/mycli/actions/workflows/ci.yml)
75
+ [![PyPI - Version](https://img.shields.io/pypi/v/mycli?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/mycli/)
76
+ [![License](https://img.shields.io/github/license/dbcli/mycli.svg?style=for-the-badge&color=2E9356)](https://github.com/dbcli/mycli/blob/main/LICENSE.txt)
77
77
 
78
78
  Rich MySQL terminal client with auto-completion, syntax highlighting, and dataframes.
79
79
 
@@ -315,7 +315,7 @@ Thanks to [PyMysql](https://github.com/PyMySQL/PyMySQL) for a pure Python adapte
315
315
  # Compatibility
316
316
 
317
317
  Mycli is tested on macOS (full), Linux (full), Windows (partial), and WSL
318
- (partial), and requires Python 3.10 or better.
318
+ (partial), and requires Python 3.11 or better.
319
319
 
320
320
  To connect to MySQL versions earlier than 5.5, you may need to set the
321
321
  following in `~/.myclirc`:
@@ -336,3 +336,11 @@ Common topics include:
336
336
  - [Configuring mycli](https://mycli.net/config)
337
337
  - [Using/Disabling the pager](https://mycli.net/pager)
338
338
  - [Syntax colors](https://mycli.net/syntax)
339
+
340
+
341
+ # License
342
+
343
+ Mycli is Open Source Software provided under the [BSD 3-Clause License](LICENSE.txt).
344
+
345
+ The Mycli Docker image and git repository include a copy of the [employees sample database](https://dev.mysql.com/doc/employee/en/)
346
+ provided by Oracle under the [Creative Commons Attribution-Share Alike 3.0 Unported License](https://dev.mysql.com/doc/employee/en/employees-license.html).
@@ -1,7 +1,8 @@
1
1
  # mycli
2
2
 
3
- [![Build Status](https://github.com/dbcli/mycli/workflows/mycli/badge.svg)](https://github.com/dbcli/mycli/actions?query=workflow%3Amycli)
4
- [![License](https://img.shields.io/github/license/dbcli/mycli.svg?color=2FC745)](https://github.com/dbcli/mycli/blob/main/LICENSE.txt)
3
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/dbcli/mycli/ci.yml?style=for-the-badge&color=2E9356)](https://github.com/dbcli/mycli/actions/workflows/ci.yml)
4
+ [![PyPI - Version](https://img.shields.io/pypi/v/mycli?style=for-the-badge&logo=pypi&logoColor=white)](https://pypi.org/project/mycli/)
5
+ [![License](https://img.shields.io/github/license/dbcli/mycli.svg?style=for-the-badge&color=2E9356)](https://github.com/dbcli/mycli/blob/main/LICENSE.txt)
5
6
 
6
7
  Rich MySQL terminal client with auto-completion, syntax highlighting, and dataframes.
7
8
 
@@ -243,7 +244,7 @@ Thanks to [PyMysql](https://github.com/PyMySQL/PyMySQL) for a pure Python adapte
243
244
  # Compatibility
244
245
 
245
246
  Mycli is tested on macOS (full), Linux (full), Windows (partial), and WSL
246
- (partial), and requires Python 3.10 or better.
247
+ (partial), and requires Python 3.11 or better.
247
248
 
248
249
  To connect to MySQL versions earlier than 5.5, you may need to set the
249
250
  following in `~/.myclirc`:
@@ -264,3 +265,11 @@ Common topics include:
264
265
  - [Configuring mycli](https://mycli.net/config)
265
266
  - [Using/Disabling the pager](https://mycli.net/pager)
266
267
  - [Syntax colors](https://mycli.net/syntax)
268
+
269
+
270
+ # License
271
+
272
+ Mycli is Open Source Software provided under the [BSD 3-Clause License](LICENSE.txt).
273
+
274
+ The Mycli Docker image and git repository include a copy of the [employees sample database](https://dev.mysql.com/doc/employee/en/)
275
+ provided by Oracle under the [Creative Commons Attribution-Share Alike 3.0 Unported License](https://dev.mysql.com/doc/employee/en/employees-license.html).