mycli 1.76.0__tar.gz → 2.0.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 (177) hide show
  1. {mycli-1.76.0 → mycli-2.0.0}/.github/workflows/ci.yml +6 -6
  2. mycli-2.0.0/.github/workflows/publish.yml +265 -0
  3. {mycli-1.76.0 → mycli-2.0.0}/.github/workflows/typecheck.yml +1 -1
  4. {mycli-1.76.0 → mycli-2.0.0}/AGENTS.md +0 -1
  5. {mycli-1.76.0/mycli.egg-info → mycli-2.0.0}/PKG-INFO +70 -49
  6. {mycli-1.76.0 → mycli-2.0.0}/README.md +69 -42
  7. {mycli-1.76.0 → mycli-2.0.0}/changelog.md +51 -0
  8. {mycli-1.76.0 → mycli-2.0.0}/doc/llm.md +27 -27
  9. {mycli-1.76.0 → mycli-2.0.0}/mycli/TIPS +32 -32
  10. mycli-2.0.0/mycli/app_state.py +101 -0
  11. {mycli-1.76.0 → mycli-2.0.0}/mycli/cli_runner.py +7 -169
  12. {mycli-1.76.0 → mycli-2.0.0}/mycli/client.py +20 -42
  13. {mycli-1.76.0 → mycli-2.0.0}/mycli/client_commands.py +7 -7
  14. {mycli-1.76.0 → mycli-2.0.0}/mycli/client_connection.py +40 -83
  15. {mycli-1.76.0 → mycli-2.0.0}/mycli/clitoolbar.py +2 -0
  16. {mycli-1.76.0 → mycli-2.0.0}/mycli/completion_refresher.py +0 -5
  17. {mycli-1.76.0 → mycli-2.0.0}/mycli/config.py +0 -82
  18. {mycli-1.76.0 → mycli-2.0.0}/mycli/main.py +80 -59
  19. {mycli-1.76.0 → mycli-2.0.0}/mycli/main_modes/batch.py +4 -5
  20. {mycli-1.76.0 → mycli-2.0.0}/mycli/main_modes/execute.py +16 -2
  21. {mycli-1.76.0 → mycli-2.0.0}/mycli/main_modes/repl.py +2 -0
  22. {mycli-1.76.0 → mycli-2.0.0}/mycli/myclirc +4 -6
  23. {mycli-1.76.0 → mycli-2.0.0}/mycli/output.py +7 -12
  24. mycli-2.0.0/mycli/packages/cli_utils.py +33 -0
  25. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/interactive_utils.py +1 -1
  26. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/dbcommands.py +3 -3
  27. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/iocommands.py +15 -15
  28. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/main.py +47 -30
  29. {mycli-1.76.0 → mycli-2.0.0}/mycli/schema_prefetcher.py +0 -5
  30. {mycli-1.76.0 → mycli-2.0.0}/mycli/sqlexecute.py +1 -58
  31. {mycli-1.76.0 → mycli-2.0.0/mycli.egg-info}/PKG-INFO +70 -49
  32. {mycli-1.76.0 → mycli-2.0.0}/mycli.egg-info/SOURCES.txt +2 -5
  33. {mycli-1.76.0 → mycli-2.0.0}/mycli.egg-info/requires.txt +0 -7
  34. mycli-2.0.0/mycli.egg-info/scm_file_list.json +161 -0
  35. mycli-2.0.0/mycli.egg-info/scm_version.json +8 -0
  36. {mycli-1.76.0 → mycli-2.0.0}/pyproject.toml +2 -13
  37. {mycli-1.76.0 → mycli-2.0.0}/test/features/connection.feature +0 -12
  38. {mycli-1.76.0 → mycli-2.0.0}/test/features/environment.py +4 -16
  39. mycli-2.0.0/test/features/fixture_data/help_commands.txt +38 -0
  40. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/connection.py +1 -22
  41. {mycli-1.76.0 → mycli-2.0.0}/test/myclirc +41 -43
  42. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/conftest.py +1 -6
  43. mycli-2.0.0/test/pytests/test_app_state.py +147 -0
  44. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_checkup.py +24 -5
  45. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_cli_runner.py +89 -16
  46. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_cli_utils.py +11 -1
  47. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_client.py +3 -28
  48. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_client_connection.py +83 -69
  49. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_completion_refresher.py +0 -10
  50. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_config.py +0 -66
  51. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_interactive_utils.py +2 -2
  52. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_main.py +27 -341
  53. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_main_modes_batch.py +4 -4
  54. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_main_modes_execute.py +70 -0
  55. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_main_modes_repl.py +18 -0
  56. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_output.py +9 -13
  57. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_schema_prefetcher.py +0 -5
  58. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_special_main.py +10 -6
  59. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_sqlexecute.py +2 -131
  60. {mycli-1.76.0 → mycli-2.0.0}/test/utils.py +2 -5
  61. mycli-1.76.0/.github/workflows/publish.yml +0 -107
  62. mycli-1.76.0/mycli/app_state.py +0 -107
  63. mycli-1.76.0/mycli/main_modes/list_ssh_config.py +0 -27
  64. mycli-1.76.0/mycli/packages/cli_utils.py +0 -21
  65. mycli-1.76.0/mycli/packages/paramiko_stub/__init__.py +0 -36
  66. mycli-1.76.0/mycli/packages/ssh_utils.py +0 -27
  67. mycli-1.76.0/test/features/fixture_data/help_commands.txt +0 -38
  68. mycli-1.76.0/test/pytests/test_app_state.py +0 -146
  69. mycli-1.76.0/test/pytests/test_main_modes_list_ssh_config.py +0 -95
  70. mycli-1.76.0/test/pytests/test_ssh_utils.py +0 -90
  71. {mycli-1.76.0 → mycli-2.0.0}/.git-blame-ignore-revs +0 -0
  72. {mycli-1.76.0 → mycli-2.0.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  73. {mycli-1.76.0 → mycli-2.0.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  74. {mycli-1.76.0 → mycli-2.0.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  75. {mycli-1.76.0 → mycli-2.0.0}/.github/dependabot.yml +0 -0
  76. {mycli-1.76.0 → mycli-2.0.0}/.github/workflows/lint.yml +0 -0
  77. {mycli-1.76.0 → mycli-2.0.0}/.gitignore +0 -0
  78. {mycli-1.76.0 → mycli-2.0.0}/AUTHORS.rst +0 -0
  79. {mycli-1.76.0 → mycli-2.0.0}/CONTRIBUTING.md +0 -0
  80. {mycli-1.76.0 → mycli-2.0.0}/LICENSE.txt +0 -0
  81. {mycli-1.76.0 → mycli-2.0.0}/MANIFEST.in +0 -0
  82. {mycli-1.76.0 → mycli-2.0.0}/SPONSORS.rst +0 -0
  83. {mycli-1.76.0 → mycli-2.0.0}/doc/key_bindings.rst +0 -0
  84. {mycli-1.76.0 → mycli-2.0.0}/doc/screenshots/main.gif +0 -0
  85. {mycli-1.76.0 → mycli-2.0.0}/doc/screenshots/tables.png +0 -0
  86. {mycli-1.76.0 → mycli-2.0.0}/mycli/AUTHORS +0 -0
  87. {mycli-1.76.0 → mycli-2.0.0}/mycli/SPONSORS +0 -0
  88. {mycli-1.76.0 → mycli-2.0.0}/mycli/__init__.py +0 -0
  89. {mycli-1.76.0 → mycli-2.0.0}/mycli/clibuffer.py +0 -0
  90. {mycli-1.76.0 → mycli-2.0.0}/mycli/client_query.py +0 -0
  91. {mycli-1.76.0 → mycli-2.0.0}/mycli/clistyle.py +0 -0
  92. {mycli-1.76.0 → mycli-2.0.0}/mycli/compat.py +0 -0
  93. {mycli-1.76.0 → mycli-2.0.0}/mycli/constants.py +0 -0
  94. {mycli-1.76.0 → mycli-2.0.0}/mycli/key_bindings.py +0 -0
  95. {mycli-1.76.0 → mycli-2.0.0}/mycli/lexer.py +0 -0
  96. {mycli-1.76.0 → mycli-2.0.0}/mycli/main_modes/checkup.py +0 -0
  97. {mycli-1.76.0 → mycli-2.0.0}/mycli/main_modes/list_dsn.py +0 -0
  98. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/__init__.py +0 -0
  99. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/batch_utils.py +0 -0
  100. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/completion_engine.py +0 -0
  101. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/filepaths.py +0 -0
  102. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/hybrid_redirection.py +0 -0
  103. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/key_binding_utils.py +0 -0
  104. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/ptoolkit/__init__.py +0 -0
  105. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/ptoolkit/fzf.py +0 -0
  106. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/ptoolkit/history.py +0 -0
  107. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/ptoolkit/utils.py +0 -0
  108. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/__init__.py +0 -0
  109. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/delimitercommand.py +0 -0
  110. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/favoritequeries.py +0 -0
  111. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/llm.py +0 -0
  112. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/special/utils.py +0 -0
  113. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/sql_utils.py +0 -0
  114. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/sqlresult.py +0 -0
  115. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/string_utils.py +0 -0
  116. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/tabular_output/__init__.py +0 -0
  117. {mycli-1.76.0 → mycli-2.0.0}/mycli/packages/tabular_output/sql_format.py +0 -0
  118. {mycli-1.76.0 → mycli-2.0.0}/mycli/sqlcompleter.py +0 -0
  119. {mycli-1.76.0 → mycli-2.0.0}/mycli/types.py +0 -0
  120. {mycli-1.76.0 → mycli-2.0.0}/mycli.egg-info/dependency_links.txt +0 -0
  121. {mycli-1.76.0 → mycli-2.0.0}/mycli.egg-info/entry_points.txt +0 -0
  122. {mycli-1.76.0 → mycli-2.0.0}/mycli.egg-info/top_level.txt +0 -0
  123. {mycli-1.76.0 → mycli-2.0.0}/setup.cfg +0 -0
  124. {mycli-1.76.0 → mycli-2.0.0}/test/__init__.py +0 -0
  125. {mycli-1.76.0 → mycli-2.0.0}/test/features/__init__.py +0 -0
  126. {mycli-1.76.0 → mycli-2.0.0}/test/features/auto_vertical.feature +0 -0
  127. {mycli-1.76.0 → mycli-2.0.0}/test/features/basic_commands.feature +0 -0
  128. {mycli-1.76.0 → mycli-2.0.0}/test/features/crud_database.feature +0 -0
  129. {mycli-1.76.0 → mycli-2.0.0}/test/features/crud_table.feature +0 -0
  130. {mycli-1.76.0 → mycli-2.0.0}/test/features/db_utils.py +0 -0
  131. {mycli-1.76.0 → mycli-2.0.0}/test/features/fixture_utils.py +0 -0
  132. {mycli-1.76.0 → mycli-2.0.0}/test/features/iocommands.feature +0 -0
  133. {mycli-1.76.0 → mycli-2.0.0}/test/features/named_queries.feature +0 -0
  134. {mycli-1.76.0 → mycli-2.0.0}/test/features/specials.feature +0 -0
  135. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/__init__.py +0 -0
  136. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/auto_vertical.py +0 -0
  137. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/basic_commands.py +0 -0
  138. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/crud_database.py +0 -0
  139. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/crud_table.py +0 -0
  140. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/iocommands.py +0 -0
  141. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/named_queries.py +0 -0
  142. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/specials.py +0 -0
  143. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/utils.py +0 -0
  144. {mycli-1.76.0 → mycli-2.0.0}/test/features/steps/wrappers.py +0 -0
  145. {mycli-1.76.0 → mycli-2.0.0}/test/features/wrappager.py +0 -0
  146. {mycli-1.76.0 → mycli-2.0.0}/test/mylogin.cnf +0 -0
  147. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_batch_utils.py +0 -0
  148. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_clibuffer.py +0 -0
  149. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_client_commands.py +0 -0
  150. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_client_query.py +0 -0
  151. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_clistyle.py +0 -0
  152. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_clitoolbar.py +0 -0
  153. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_completer_use_switch.py +0 -0
  154. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_completion_engine.py +0 -0
  155. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_delimitercommand.py +0 -0
  156. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_favoritequeries.py +0 -0
  157. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_filepaths.py +0 -0
  158. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_hybrid_redirection.py +0 -0
  159. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_key_binding_utils.py +0 -0
  160. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_key_bindings.py +0 -0
  161. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_lexer.py +0 -0
  162. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_main_modes_list_dsn.py +0 -0
  163. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_naive_completion.py +0 -0
  164. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_ptoolkit_fzf.py +0 -0
  165. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_ptoolkit_history.py +0 -0
  166. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_ptoolkit_utils.py +0 -0
  167. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_smart_completion_public_schema_only.py +0 -0
  168. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_special_dbcommands.py +0 -0
  169. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_special_init.py +0 -0
  170. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_special_iocommands.py +0 -0
  171. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_special_llm.py +0 -0
  172. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_special_utils.py +0 -0
  173. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_sql_utils.py +0 -0
  174. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_sqlcompleter.py +0 -0
  175. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_sqlresult.py +0 -0
  176. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_string_utils.py +0 -0
  177. {mycli-1.76.0 → mycli-2.0.0}/test/pytests/test_tabular_output.py +0 -0
@@ -29,7 +29,7 @@ jobs:
29
29
  version: "latest"
30
30
 
31
31
  - name: Set up Python ${{ matrix.python-version }}
32
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
32
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
33
33
  with:
34
34
  python-version: ${{ matrix.python-version }}
35
35
 
@@ -71,7 +71,7 @@ jobs:
71
71
  version: "latest"
72
72
 
73
73
  - name: Set up Python ${{ matrix.python-version }}
74
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
74
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
75
75
  with:
76
76
  python-version: ${{ matrix.python-version }}
77
77
 
@@ -121,7 +121,7 @@ jobs:
121
121
  version: 'latest'
122
122
 
123
123
  - name: Set up Python ${{ matrix.python-version }}
124
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
124
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
125
125
  with:
126
126
  python-version: ${{ matrix.python-version }}
127
127
 
@@ -130,7 +130,7 @@ jobs:
130
130
  run: uv sync --all-extras -p ${{ matrix.python-version }}
131
131
 
132
132
  - name: Set up MySQL
133
- uses: shogo82148/actions-setup-mysql@b35e23af29aa7b32dc3c434e87a53e12d5706911 # v1.52.0
133
+ uses: shogo82148/actions-setup-mysql@076e636c45996ec8cb1a455c65f9f5364aeebd8a # v1.52.1
134
134
  with:
135
135
  mysql-version: '9.7'
136
136
  root-password: root
@@ -165,7 +165,7 @@ jobs:
165
165
  run: |
166
166
  mkdir -p /root/mycli
167
167
 
168
- - uses: ubuntu/wsl/.github/actions/wsl-checkout@c23a4a0b03292618a19966ec299b799417d25580
168
+ - uses: ubuntu/wsl/.github/actions/wsl-checkout@f861f1083e518354e4c3637b08c0edfcf8bc3d51
169
169
  with:
170
170
  distro: Ubuntu-24.04
171
171
  working-dir: /root/mycli
@@ -224,7 +224,7 @@ jobs:
224
224
  version: "latest"
225
225
 
226
226
  - name: Set up Python ${{ matrix.python-version }}
227
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
227
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
228
228
  with:
229
229
  python-version: '3.14'
230
230
 
@@ -0,0 +1,265 @@
1
+ name: Publish Python Package
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ docs:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
16
+
17
+ - name: Require release changelog form
18
+ run: |
19
+ if grep -q TBD changelog.md; then false; fi
20
+
21
+ tests:
22
+ runs-on: ubuntu-latest
23
+ needs: [docs]
24
+ continue-on-error: true
25
+
26
+ strategy:
27
+ matrix:
28
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
29
+
30
+ steps:
31
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
32
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
33
+ with:
34
+ version: "latest"
35
+
36
+ - name: Set up Python ${{ matrix.python-version }}
37
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
38
+ with:
39
+ python-version: ${{ matrix.python-version }}
40
+
41
+ - name: Start MySQL
42
+ run: |
43
+ sudo /etc/init.d/mysql start
44
+
45
+ - name: Install dependencies
46
+ run: uv sync --all-extras -p ${{ matrix.python-version }}
47
+
48
+ - name: Wait for MySQL connection
49
+ run: |
50
+ while ! mysqladmin ping --host=localhost --port=3306 --user=root --password=root --silent; do
51
+ sleep 5
52
+ done
53
+
54
+ - name: Pytest / behave
55
+ env:
56
+ PYTEST_PASSWORD: root
57
+ PYTEST_HOST: 127.0.0.1
58
+ run: |
59
+ uv run tox -e py${{ matrix.python-version }}
60
+
61
+ # arguably this should be made identical to CI for PRs
62
+ - name: Run Style Checks
63
+ run: uv run tox -e style
64
+
65
+ tests-macos:
66
+ name: Tests macOS
67
+ runs-on: macos-latest
68
+
69
+ strategy:
70
+ fail-fast: false
71
+ matrix:
72
+ python-version: ["3.14"]
73
+
74
+ steps:
75
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
76
+
77
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
78
+ with:
79
+ version: "latest"
80
+
81
+ - name: Set up Python ${{ matrix.python-version }}
82
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
83
+ with:
84
+ python-version: ${{ matrix.python-version }}
85
+
86
+ - name: Set up MySQL
87
+ run: |
88
+ brew install mysql
89
+
90
+ - name: Start MySQL
91
+ run: |
92
+ brew services start mysql
93
+
94
+ - name: Install dependencies
95
+ run: uv sync --all-extras -p ${{ matrix.python-version }}
96
+
97
+ - name: Wait for MySQL connection
98
+ run: |
99
+ while ! mysqladmin ping --host=localhost --port=3306 --user=root --silent; do
100
+ sleep 5
101
+ done
102
+
103
+ - name: Set MySQL test credentials
104
+ run: |
105
+ $(brew --prefix mysql)/bin/mysqladmin --host=localhost --port=3306 --user=root password root
106
+
107
+ - name: Pytest / behave
108
+ env:
109
+ PYTEST_PASSWORD: root
110
+ PYTEST_HOST: 127.0.0.1
111
+ TERM: xterm
112
+ run: |
113
+ uv run tox -e py${{ matrix.python-version }}
114
+
115
+ tests-windows:
116
+ name: Tests Windows
117
+ runs-on: windows-latest
118
+
119
+ strategy:
120
+ fail-fast: false
121
+ matrix:
122
+ python-version: ['3.14']
123
+
124
+ steps:
125
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
126
+
127
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
128
+ with:
129
+ version: 'latest'
130
+
131
+ - name: Set up Python ${{ matrix.python-version }}
132
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
133
+ with:
134
+ python-version: ${{ matrix.python-version }}
135
+
136
+ - name: Install dependencies
137
+ shell: cmd
138
+ run: uv sync --all-extras -p ${{ matrix.python-version }}
139
+
140
+ - name: Set up MySQL
141
+ uses: shogo82148/actions-setup-mysql@076e636c45996ec8cb1a455c65f9f5364aeebd8a # v1.52.1
142
+ with:
143
+ mysql-version: '9.7'
144
+ root-password: root
145
+
146
+ - name: Run pytest
147
+ env:
148
+ PYTEST_PASSWORD: root
149
+ PYTEST_HOST: 127.0.0.1
150
+ run: |
151
+ uv run -- coverage run -m pytest
152
+ uv run -- coverage report -m --sort=Miss --skip-covered --skip-empty
153
+
154
+ tests-wsl:
155
+ name: Tests WSL
156
+ runs-on: windows-latest
157
+
158
+ steps:
159
+ - uses: vampire/setup-wsl@d1da7f2c0322a5ee4f24975344f67fc0f5baf364 # v7.0.0
160
+ with:
161
+ distribution: Ubuntu-24.04
162
+ update: 'true'
163
+ additional-packages: |
164
+ curl
165
+ git
166
+ mysql-server
167
+ pkg-config
168
+ build-essential
169
+ python3-pip
170
+
171
+ - name: Create working directory
172
+ shell: wsl-bash {0}
173
+ run: |
174
+ mkdir -p /root/mycli
175
+
176
+ - uses: ubuntu/wsl/.github/actions/wsl-checkout@f861f1083e518354e4c3637b08c0edfcf8bc3d51
177
+ with:
178
+ distro: Ubuntu-24.04
179
+ working-dir: /root/mycli
180
+
181
+ - name: Install uv
182
+ shell: wsl-bash {0}
183
+ run: |
184
+ export PATH="$HOME/.local/bin:$PATH"
185
+ env PYTHONPATH=/usr/local/lib/python3.14/site-packages pip install --upgrade --break-system-packages --prefix=/usr uv
186
+
187
+ - name: Install dependencies
188
+ shell: wsl-bash {0}
189
+ run: |
190
+ export PATH="$HOME/.local/bin:$PATH"
191
+ cd /root/mycli
192
+ uv sync --all-extras --python 3.14
193
+
194
+ - name: Start MySQL in WSL
195
+ shell: wsl-bash {0}
196
+ run: |
197
+ sudo service mysql start
198
+
199
+ - name: Wait for MySQL connection
200
+ shell: wsl-bash {0}
201
+ run: |
202
+ while ! mysqladmin ping --host=localhost --port=3306 --user=root --silent; do
203
+ sleep 5
204
+ done
205
+
206
+ - name: Set up MySQL
207
+ shell: wsl-bash {0}
208
+ run: |
209
+ mysqladmin -u root password root
210
+
211
+ - name: Run pytest
212
+ shell: wsl-bash {0}
213
+ env:
214
+ PYTEST_HOST: 127.0.0.1
215
+ PYTEST_USER: root
216
+ PYTEST_PASSWORD: root
217
+ run: |
218
+ export PATH="$HOME/.local/bin:$PATH"
219
+ cd /root/mycli
220
+ uv run --python 3.14 -- coverage run -m pytest
221
+ uv run --python 3.14 -- coverage report -m --sort=Miss --skip-covered --skip-empty
222
+
223
+ build:
224
+ runs-on: ubuntu-latest
225
+ needs: [tests, tests-macos, tests-windows, tests-wsl]
226
+
227
+ steps:
228
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
229
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
230
+ with:
231
+ version: "latest"
232
+
233
+ - name: Set up Python
234
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
235
+ with:
236
+ python-version: '3.14'
237
+
238
+ - name: Install dependencies
239
+ run: uv sync --all-extras -p 3.14
240
+
241
+ - name: Build
242
+ run: uv build
243
+
244
+ - name: Store the distribution packages
245
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
246
+ with:
247
+ name: python-packages
248
+ path: dist/
249
+
250
+ publish:
251
+ name: Publish to PyPI
252
+ runs-on: ubuntu-latest
253
+ if: startsWith(github.ref, 'refs/tags/')
254
+ needs: [build]
255
+ environment: release
256
+ permissions:
257
+ id-token: write
258
+ steps:
259
+ - name: Download distribution packages
260
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
261
+ with:
262
+ name: python-packages
263
+ path: dist/
264
+ - name: Publish to PyPI
265
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
@@ -21,7 +21,7 @@ jobs:
21
21
  uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
22
22
 
23
23
  - name: Set up Python
24
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
24
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
25
25
  with:
26
26
  python-version: '3.14'
27
27
 
@@ -39,7 +39,6 @@ A command line client for MySQL with auto-completion and syntax highlighting.
39
39
  ├── mycli/packages/hybrid_redirection.py # implementation of shell-style redirects
40
40
  ├── mycli/packages/interactive_utils.py # utilities for confirming on destructive statements
41
41
  ├── mycli/packages/key_binding_utils.py # handlers for key bindings and related special commands
42
- ├── mycli/packages/paramiko_stub/ # stub in case the Paramiko library is not installed
43
42
  ├── mycli/packages/sql_utils.py # utilities for parsing SQL statements
44
43
  ├── mycli/packages/ptoolkit/ # extends prompt_toolkit
45
44
  ├── mycli/packages/special/ # implementation of mycli special commands
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mycli
3
- Version: 1.76.0
3
+ Version: 2.0.0
4
4
  Summary: CLI for MySQL Database. With auto-completion and syntax highlighting.
5
5
  Author: Mycli Core Team
6
6
  License-Expression: BSD-3-Clause
@@ -31,16 +31,12 @@ Requires-Dist: pyfzf~=0.3.1
31
31
  Requires-Dist: rapidfuzz~=3.14.3
32
32
  Requires-Dist: keyring~=25.7.0
33
33
  Requires-Dist: yaspin~=3.4.0
34
- Provides-Extra: ssh
35
- Requires-Dist: paramiko~=3.5.1; extra == "ssh"
36
- Requires-Dist: sshtunnel~=0.4.0; extra == "ssh"
37
34
  Provides-Extra: llm
38
35
  Requires-Dist: llm~=0.30.0; extra == "llm"
39
36
  Requires-Dist: pydantic_core~=2.41.5; extra == "llm"
40
37
  Requires-Dist: setuptools==82.*; extra == "llm"
41
38
  Requires-Dist: pip==26.*; extra == "llm"
42
39
  Provides-Extra: all
43
- Requires-Dist: mycli[ssh]; extra == "all"
44
40
  Requires-Dist: mycli[llm]; extra == "all"
45
41
  Provides-Extra: dev
46
42
  Requires-Dist: behave~=1.3.3; extra == "dev"
@@ -52,8 +48,6 @@ Requires-Dist: pytest-cov~=7.0.0; extra == "dev"
52
48
  Requires-Dist: pytest-random-order~=1.2.0; extra == "dev"
53
49
  Requires-Dist: tox~=4.35.0; extra == "dev"
54
50
  Requires-Dist: pdbpp~=0.11.7; extra == "dev"
55
- Requires-Dist: paramiko~=3.5.1; extra == "dev"
56
- Requires-Dist: sshtunnel~=0.4.0; extra == "dev"
57
51
  Requires-Dist: llm~=0.30.0; extra == "dev"
58
52
  Requires-Dist: pydantic_core~=2.41.5; extra == "dev"
59
53
  Requires-Dist: setuptools==82.*; extra == "dev"
@@ -65,7 +59,7 @@ Dynamic: license-file
65
59
 
66
60
  [![Build Status](https://github.com/dbcli/mycli/workflows/mycli/badge.svg)](https://github.com/dbcli/mycli/actions?query=workflow%3Amycli)
67
61
 
68
- A command line client for MySQL that can do auto-completion and syntax highlighting.
62
+ A command line client for MySQL with auto-completion and syntax highlighting.
69
63
 
70
64
  Homepage: [https://mycli.net](https://mycli.net)
71
65
  Documentation: [https://mycli.net/docs](https://mycli.net/docs)
@@ -73,31 +67,38 @@ Documentation: [https://mycli.net/docs](https://mycli.net/docs)
73
67
  ![Completion](doc/screenshots/tables.png)
74
68
  ![CompletionGif](doc/screenshots/main.gif)
75
69
 
76
- Mycli is compatible with MySQL, MariaDB, Percona, TiDB, and Doris.
70
+ Mycli is compatible with MySQL, MariaDB, Percona, TiDB, and Apache Doris.
77
71
 
78
72
  Postgres Equivalent: [https://pgcli.com](https://pgcli.com)
79
73
 
74
+ Release 2.x
75
+ -----------
76
+
77
+ Release 2.0.0 has [breaking changes](https://github.com/dbcli/mycli/blob/v2.0.0/changelog.md#breaking-changes)!
78
+
79
+
80
80
  Quick Start
81
81
  -----------
82
82
 
83
- If you already know how to install Python packages, then you can install it via `pip`:
83
+ If you already know how to install Python packages, then you can install mycli
84
+ via `pip`. This package is always up to date.
84
85
 
85
- You might need sudo on Linux.
86
+ You might need `sudo` on Linux.
86
87
 
87
88
  ```bash
88
- pip install -U 'mycli[all]'
89
+ pip install --upgrade 'mycli[all]'
89
90
  ```
90
91
 
91
- or
92
+ or, only on macOS (`fzf` and `pygments` are optional):
92
93
 
93
94
  ```bash
94
- brew update && brew install mycli # Only on macOS
95
+ brew update && brew install mycli fzf pygments
95
96
  ```
96
97
 
97
- or
98
+ or, only on Debian or Ubuntu (`fzf` and `pygments` are optional):
98
99
 
99
100
  ```bash
100
- sudo apt-get install mycli # Only on Debian or Ubuntu
101
+ sudo apt-get install mycli fzf python3-pygments
101
102
  ```
102
103
 
103
104
  ### Usage
@@ -111,67 +112,82 @@ mycli --help
111
112
  Features
112
113
  --------
113
114
 
114
- `mycli` is written using [prompt_toolkit](https://github.com/jonathanslenders/python-prompt-toolkit/).
115
-
116
- * Auto-completion as you type for SQL keywords as well as tables, views and
117
- columns in the database.
115
+ * Auto-completion as you type for SQL keywords as well as tables, views,
116
+ columns, enums, and more!
118
117
  * Fuzzy history search using [fzf](https://github.com/junegunn/fzf).
119
- * Syntax highlighting using Pygments.
118
+ * Syntax highlighting using [Pygments](https://pygments.org/).
120
119
  * Smart-completion (enabled by default) will suggest context-sensitive completion.
121
120
  - `SELECT * FROM <tab>` will only show table names.
122
121
  - `SELECT * FROM users WHERE <tab>` will only show column names.
123
122
  * Support for multiline queries.
124
123
  * Favorite queries with optional positional parameters. Save a query using
125
- `\fs <alias> <query>` and execute it with `\f <alias>`.
124
+ `/fs <alias> <query>` and execute it with `/f <alias>`.
126
125
  * Timing of sql statements and table rendering.
127
126
  * Log every query and its results to a file (disabled by default).
128
127
  * Pretty print tabular data (with colors!).
129
128
  * Support for SSL connections
130
129
  * Shell-style trailing redirects with `$>`, `$>>` and `$|` operators.
131
- * Support for querying LLMs with context derived from your schema.
130
+ * Support for querying LLMs with context derived from your schema using `/llm`.
132
131
  * Support for storing passwords in the system keyring.
133
132
 
134
- Mycli creates a config file `~/.myclirc` on first run; you can use the
133
+ Mycli creates a config file `~/.myclirc` on the first run; you can use the
135
134
  options in that file to configure the above features, and more.
136
135
 
137
136
  Some features are only exposed as [key bindings](doc/key_bindings.rst).
138
137
 
139
- Contributions:
138
+
139
+ Implementation
140
140
  --------------
141
141
 
142
- If you're interested in contributing to this project, first of all I would like
143
- to extend my heartfelt gratitude. I've written a small doc to describe how to
144
- get this running in a development setup.
142
+ `mycli` is written using [prompt_toolkit](https://github.com/jonathanslenders/python-prompt-toolkit/) and other Python libraries.
143
+
144
+
145
+ Contributions
146
+ -------------
147
+
148
+ If you're interested in contributing to this project, first of all we would like
149
+ to extend our heartfelt gratitude. We've written a small doc to describe how to
150
+ get mycli running in a development setup.
145
151
 
146
152
  https://github.com/dbcli/mycli/blob/main/CONTRIBUTING.md
147
153
 
148
154
 
149
155
  ## Additional Install Instructions:
150
156
 
151
- These are some alternative ways to install mycli that are not managed by our team but provided by OS package maintainers. These packages could be slightly out of date and take time to release the latest version.
157
+ These are some alternative ways to install mycli that are not managed by our
158
+ team but provided by OS package maintainers. OS packages could be somewhat
159
+ out of date.
160
+
161
+ If present, the `fzf` package can be used for fuzzy history search, and
162
+ `pygemtize` can be used for syntax highlighting within the fuzzy history
163
+ search. The `less` package is also expected, but almost always already
164
+ installed.
152
165
 
153
166
  ### Arch, Manjaro
154
167
 
155
- You can install the mycli package available in the AUR:
168
+ You can install the `mycli` package available in the AUR. `fzf` and
169
+ `python-pygments` are optional:
156
170
 
157
- ```
158
- yay -S mycli
171
+ ```bash
172
+ yay -S mycli fzf python-pygments
159
173
  ```
160
174
 
161
175
  ### Debian, Ubuntu
162
176
 
163
- On Debian, Ubuntu distributions, you can easily install the mycli package using apt:
177
+ On Debian and Ubuntu distributions, you can easily install the mycli package
178
+ using apt. The `fzf` and `python3-pygments` packages are optional:
164
179
 
165
- ```
166
- sudo apt-get install mycli
180
+ ```bash
181
+ sudo apt-get install mycli fzf python3-pygments
167
182
  ```
168
183
 
169
184
  ### Fedora
170
185
 
171
- Fedora has a package available for mycli, install it using dnf:
186
+ Fedora has a package available for mycli; install it using dnf. The `fzf` and
187
+ `python-pygments` packages are optional:
172
188
 
173
- ```
174
- sudo dnf install mycli
189
+ ```bash
190
+ sudo dnf install mycli fzf python-pygments
175
191
  ```
176
192
 
177
193
  ### Windows
@@ -182,20 +198,22 @@ Install the `less` pager, for example by `scoop install less`.
182
198
 
183
199
  Follow the instructions on this blogpost: https://web.archive.org/web/20221006045208/https://www.codewall.co.uk/installing-using-mycli-on-windows/
184
200
 
185
- **Mycli is not tested on Windows**, but the libraries used in the app are Windows-compatible.
186
- This means it should work without any modifications, but isn't supported.
201
+ The libraries used in mycli are Windows-compatible, but there are known
202
+ limitations according to the test suite. The basics work without any
203
+ modifications, but this configuration isn't supported software at this time.
187
204
 
188
- PRs to add native Windows testing to Mycli CI would be welcome!
205
+ PRs to address shortcomings on Windows would be welcome!
189
206
 
190
207
  #### Option 2: WSL
191
208
 
192
- Everything should work as expected in WSL. This is a good option for using
193
- Mycli on Windows.
209
+ Mycli is more compatible with WSL than with native Windows, though still
210
+ not 100% perfect. This is a good option for using mycli on Windows.
194
211
 
212
+ PRs to complete WSL support would be welcome!
195
213
 
196
- ### Thanks:
214
+ ### Thanks
197
215
 
198
- This project was funded through kickstarter. My thanks to the [backers](https://mycli.net/sponsors) who supported the project.
216
+ This project was funded through kickstarter. Our thanks to the [backers](https://mycli.net/sponsors) who supported the project.
199
217
 
200
218
  A special thanks to [Jonathan Slenders](https://twitter.com/jonathan_s) for
201
219
  creating [Python Prompt Toolkit](https://github.com/jonathanslenders/python-prompt-toolkit),
@@ -206,16 +224,19 @@ of this app.
206
224
  [Click](https://palletsprojects.com/projects/click) is used for command line option parsing
207
225
  and printing error messages.
208
226
 
209
- Thanks to [PyMysql](https://github.com/PyMySQL/PyMySQL) for a pure python adapter to MySQL database.
227
+ Thanks to [PyMysql](https://github.com/PyMySQL/PyMySQL) for a pure Python adapter to MySQL databases.
210
228
 
211
229
 
212
230
  ### Compatibility
213
231
 
214
- Mycli is tested on macOS and Linux, and requires Python 3.10 or better.
232
+ Mycli is tested on macOS (full), Linux (full), Windows (partial), and WSL
233
+ (partial), and requires Python 3.10 or better.
215
234
 
216
- To connect to MySQL versions earlier than 5.5, you may need to set the following in `~/.myclirc`:
235
+ To connect to MySQL versions earlier than 5.5, you may need to set the
236
+ following in `~/.myclirc`:
217
237
 
218
- ```
238
+ ```ini
239
+ [connection]
219
240
  # character set for connections without --charset being set at the CLI
220
241
  default_character_set = utf8
221
242
  ```