mycli 2.25.3__tar.gz → 2.26.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 (205) hide show
  1. {mycli-2.25.3 → mycli-2.26.0}/.github/workflows/ci.yml +2 -2
  2. {mycli-2.25.3 → mycli-2.26.0}/.github/workflows/publish.yml +1 -1
  3. {mycli-2.25.3 → mycli-2.26.0}/AGENTS.md +9 -8
  4. mycli-2.26.0/CONTRIBUTING.md +152 -0
  5. {mycli-2.25.3/mycli.egg-info → mycli-2.26.0}/PKG-INFO +15 -7
  6. {mycli-2.25.3 → mycli-2.26.0}/README.md +12 -3
  7. {mycli-2.25.3 → mycli-2.26.0}/changelog.md +188 -164
  8. {mycli-2.25.3 → mycli-2.26.0}/doc/key_bindings.md +8 -0
  9. {mycli-2.25.3 → mycli-2.26.0}/docker/resources/test_db-1.0.7.tar.gz +1 -1
  10. mycli-2.26.0/docker/resources/test_db_license.md +18 -0
  11. {mycli-2.25.3 → mycli-2.26.0}/mycli/TIPS +2 -0
  12. {mycli-2.25.3 → mycli-2.26.0}/mycli/boundary_tunnel.py +3 -7
  13. {mycli-2.25.3 → mycli-2.26.0}/mycli/client_connection.py +7 -25
  14. {mycli-2.25.3 → mycli-2.26.0}/mycli/constants.py +9 -0
  15. {mycli-2.25.3 → mycli-2.26.0}/mycli/key_bindings.py +18 -0
  16. {mycli-2.25.3 → mycli-2.26.0}/mycli/main_modes/repl.py +2 -2
  17. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/completion_engine.py +68 -1
  18. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/key_binding_utils.py +9 -0
  19. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/dbcommands.py +1 -1
  20. {mycli-2.25.3 → mycli-2.26.0}/mycli/sqlcompleter.py +24 -1
  21. {mycli-2.25.3 → mycli-2.26.0}/mycli/sqlexecute.py +26 -17
  22. {mycli-2.25.3 → mycli-2.26.0/mycli.egg-info}/PKG-INFO +15 -7
  23. {mycli-2.25.3 → mycli-2.26.0}/mycli.egg-info/SOURCES.txt +1 -0
  24. {mycli-2.25.3 → mycli-2.26.0}/mycli.egg-info/requires.txt +1 -1
  25. {mycli-2.25.3 → mycli-2.26.0}/mycli.egg-info/scm_file_list.json +1 -0
  26. mycli-2.26.0/mycli.egg-info/scm_version.json +8 -0
  27. {mycli-2.25.3 → mycli-2.26.0}/pyproject.toml +3 -4
  28. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_boundary_tunnel.py +73 -70
  29. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_client.py +15 -3
  30. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_client_connection.py +0 -10
  31. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_completion_engine.py +89 -0
  32. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_key_binding_utils.py +33 -0
  33. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_key_bindings.py +61 -0
  34. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_main_modes_repl.py +3 -9
  35. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_smart_completion_public_schema_only.py +85 -0
  36. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_special_dbcommands.py +1 -6
  37. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_sqlcompleter.py +97 -0
  38. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_sqlexecute.py +106 -13
  39. mycli-2.25.3/CONTRIBUTING.md +0 -118
  40. mycli-2.25.3/mycli.egg-info/scm_version.json +0 -8
  41. {mycli-2.25.3 → mycli-2.26.0}/.git-blame-ignore-revs +0 -0
  42. {mycli-2.25.3 → mycli-2.26.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  43. {mycli-2.25.3 → mycli-2.26.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  44. {mycli-2.25.3 → mycli-2.26.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  45. {mycli-2.25.3 → mycli-2.26.0}/.github/dependabot.yml +0 -0
  46. {mycli-2.25.3 → mycli-2.26.0}/.github/workflows/lint.yml +0 -0
  47. {mycli-2.25.3 → mycli-2.26.0}/.github/workflows/typecheck.yml +0 -0
  48. {mycli-2.25.3 → mycli-2.26.0}/.gitignore +0 -0
  49. {mycli-2.25.3 → mycli-2.26.0}/AUTHORS.md +0 -0
  50. {mycli-2.25.3 → mycli-2.26.0}/LICENSE.txt +0 -0
  51. {mycli-2.25.3 → mycli-2.26.0}/MANIFEST.in +0 -0
  52. {mycli-2.25.3 → mycli-2.26.0}/SPONSORS.md +0 -0
  53. {mycli-2.25.3 → mycli-2.26.0}/doc/llm.md +0 -0
  54. {mycli-2.25.3 → mycli-2.26.0}/doc/screenshots/main.gif +0 -0
  55. {mycli-2.25.3 → mycli-2.26.0}/doc/screenshots/polars_describe.png +0 -0
  56. {mycli-2.25.3 → mycli-2.26.0}/doc/screenshots/polars_group_by.png +0 -0
  57. {mycli-2.25.3 → mycli-2.26.0}/doc/screenshots/polars_histogram.png +0 -0
  58. {mycli-2.25.3 → mycli-2.26.0}/doc/screenshots/polars_pivot.png +0 -0
  59. {mycli-2.25.3 → mycli-2.26.0}/doc/screenshots/tables.png +0 -0
  60. {mycli-2.25.3 → mycli-2.26.0}/doc/transforms.md +0 -0
  61. {mycli-2.25.3 → mycli-2.26.0}/docker/Dockerfile +0 -0
  62. {mycli-2.25.3 → mycli-2.26.0}/mycli/AUTHORS +0 -0
  63. {mycli-2.25.3 → mycli-2.26.0}/mycli/SPONSORS +0 -0
  64. {mycli-2.25.3 → mycli-2.26.0}/mycli/__init__.py +0 -0
  65. {mycli-2.25.3 → mycli-2.26.0}/mycli/app_state.py +0 -0
  66. {mycli-2.25.3 → mycli-2.26.0}/mycli/cli_runner.py +0 -0
  67. {mycli-2.25.3 → mycli-2.26.0}/mycli/clibuffer.py +0 -0
  68. {mycli-2.25.3 → mycli-2.26.0}/mycli/client.py +0 -0
  69. {mycli-2.25.3 → mycli-2.26.0}/mycli/client_commands.py +0 -0
  70. {mycli-2.25.3 → mycli-2.26.0}/mycli/client_query.py +0 -0
  71. {mycli-2.25.3 → mycli-2.26.0}/mycli/clistyle.py +0 -0
  72. {mycli-2.25.3 → mycli-2.26.0}/mycli/clitoolbar.py +0 -0
  73. {mycli-2.25.3 → mycli-2.26.0}/mycli/compat.py +0 -0
  74. {mycli-2.25.3 → mycli-2.26.0}/mycli/completion_refresher.py +0 -0
  75. {mycli-2.25.3 → mycli-2.26.0}/mycli/config.py +0 -0
  76. {mycli-2.25.3 → mycli-2.26.0}/mycli/keyring_utils.py +0 -0
  77. {mycli-2.25.3 → mycli-2.26.0}/mycli/kubectl_tunnel.py +0 -0
  78. {mycli-2.25.3 → mycli-2.26.0}/mycli/lexer.py +0 -0
  79. {mycli-2.25.3 → mycli-2.26.0}/mycli/macos_keychain.py +0 -0
  80. {mycli-2.25.3 → mycli-2.26.0}/mycli/main.py +0 -0
  81. {mycli-2.25.3 → mycli-2.26.0}/mycli/main_modes/batch.py +0 -0
  82. {mycli-2.25.3 → mycli-2.26.0}/mycli/main_modes/checkup.py +0 -0
  83. {mycli-2.25.3 → mycli-2.26.0}/mycli/main_modes/completions.py +0 -0
  84. {mycli-2.25.3 → mycli-2.26.0}/mycli/main_modes/execute.py +0 -0
  85. {mycli-2.25.3 → mycli-2.26.0}/mycli/main_modes/list_dsn.py +0 -0
  86. {mycli-2.25.3 → mycli-2.26.0}/mycli/myclirc +0 -0
  87. {mycli-2.25.3 → mycli-2.26.0}/mycli/output.py +0 -0
  88. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/__init__.py +0 -0
  89. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/batch_utils.py +0 -0
  90. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/cli_utils.py +0 -0
  91. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/filepaths.py +0 -0
  92. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/hybrid_redirection.py +0 -0
  93. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/interactive_utils.py +0 -0
  94. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/polars_completion.py +0 -0
  95. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/polars_transform.py +0 -0
  96. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/ptoolkit/__init__.py +0 -0
  97. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/ptoolkit/fzf.py +0 -0
  98. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/ptoolkit/history.py +0 -0
  99. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/ptoolkit/utils.py +0 -0
  100. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/__init__.py +0 -0
  101. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/delimitercommand.py +0 -0
  102. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/dsn_aliases.py +0 -0
  103. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/favoritequeries.py +0 -0
  104. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/iocommands.py +0 -0
  105. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/llm.py +0 -0
  106. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/main.py +0 -0
  107. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/source.py +0 -0
  108. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/special/utils.py +0 -0
  109. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/sql_utils.py +0 -0
  110. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/sqlresult.py +0 -0
  111. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/string_utils.py +0 -0
  112. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/tabular_output/__init__.py +0 -0
  113. {mycli-2.25.3 → mycli-2.26.0}/mycli/packages/tabular_output/sql_format.py +0 -0
  114. {mycli-2.25.3 → mycli-2.26.0}/mycli/password_sources.py +0 -0
  115. {mycli-2.25.3 → mycli-2.26.0}/mycli/resources/completions/bash/mycli +0 -0
  116. {mycli-2.25.3 → mycli-2.26.0}/mycli/resources/completions/fish/mycli.fish +0 -0
  117. {mycli-2.25.3 → mycli-2.26.0}/mycli/resources/completions/zsh/_mycli +0 -0
  118. {mycli-2.25.3 → mycli-2.26.0}/mycli/schema_prefetcher.py +0 -0
  119. {mycli-2.25.3 → mycli-2.26.0}/mycli/ssh_tunnel.py +0 -0
  120. {mycli-2.25.3 → mycli-2.26.0}/mycli/types.py +0 -0
  121. {mycli-2.25.3 → mycli-2.26.0}/mycli/vault.py +0 -0
  122. {mycli-2.25.3 → mycli-2.26.0}/mycli.egg-info/dependency_links.txt +0 -0
  123. {mycli-2.25.3 → mycli-2.26.0}/mycli.egg-info/entry_points.txt +0 -0
  124. {mycli-2.25.3 → mycli-2.26.0}/mycli.egg-info/top_level.txt +0 -0
  125. {mycli-2.25.3 → mycli-2.26.0}/setup.cfg +0 -0
  126. {mycli-2.25.3 → mycli-2.26.0}/test/__init__.py +0 -0
  127. {mycli-2.25.3 → mycli-2.26.0}/test/features/__init__.py +0 -0
  128. {mycli-2.25.3 → mycli-2.26.0}/test/features/auto_vertical.feature +0 -0
  129. {mycli-2.25.3 → mycli-2.26.0}/test/features/basic_commands.feature +0 -0
  130. {mycli-2.25.3 → mycli-2.26.0}/test/features/connection.feature +0 -0
  131. {mycli-2.25.3 → mycli-2.26.0}/test/features/crud_database.feature +0 -0
  132. {mycli-2.25.3 → mycli-2.26.0}/test/features/crud_table.feature +0 -0
  133. {mycli-2.25.3 → mycli-2.26.0}/test/features/db_utils.py +0 -0
  134. {mycli-2.25.3 → mycli-2.26.0}/test/features/environment.py +0 -0
  135. {mycli-2.25.3 → mycli-2.26.0}/test/features/fixture_data/help_commands.txt +0 -0
  136. {mycli-2.25.3 → mycli-2.26.0}/test/features/fixture_utils.py +0 -0
  137. {mycli-2.25.3 → mycli-2.26.0}/test/features/iocommands.feature +0 -0
  138. {mycli-2.25.3 → mycli-2.26.0}/test/features/named_queries.feature +0 -0
  139. {mycli-2.25.3 → mycli-2.26.0}/test/features/specials.feature +0 -0
  140. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/__init__.py +0 -0
  141. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/auto_vertical.py +0 -0
  142. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/basic_commands.py +0 -0
  143. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/connection.py +0 -0
  144. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/crud_database.py +0 -0
  145. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/crud_table.py +0 -0
  146. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/iocommands.py +0 -0
  147. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/named_queries.py +0 -0
  148. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/specials.py +0 -0
  149. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/utils.py +0 -0
  150. {mycli-2.25.3 → mycli-2.26.0}/test/features/steps/wrappers.py +0 -0
  151. {mycli-2.25.3 → mycli-2.26.0}/test/features/wrappager.py +0 -0
  152. {mycli-2.25.3 → mycli-2.26.0}/test/myclirc +0 -0
  153. {mycli-2.25.3 → mycli-2.26.0}/test/mylogin.cnf +0 -0
  154. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/conftest.py +0 -0
  155. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_app_state.py +0 -0
  156. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_bash_completion.py +0 -0
  157. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_batch_utils.py +0 -0
  158. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_checkup.py +0 -0
  159. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_cli_runner.py +0 -0
  160. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_cli_utils.py +0 -0
  161. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_clibuffer.py +0 -0
  162. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_client_commands.py +0 -0
  163. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_client_query.py +0 -0
  164. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_clistyle.py +0 -0
  165. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_clitoolbar.py +0 -0
  166. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_completer_use_switch.py +0 -0
  167. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_completion_refresher.py +0 -0
  168. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_config.py +0 -0
  169. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_delimitercommand.py +0 -0
  170. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_dsn_aliases.py +0 -0
  171. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_favoritequeries.py +0 -0
  172. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_filepaths.py +0 -0
  173. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_fish_completion.py +0 -0
  174. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_hybrid_redirection.py +0 -0
  175. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_interactive_utils.py +0 -0
  176. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_keyring_utils.py +0 -0
  177. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_kubectl_tunnel.py +0 -0
  178. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_macos_keychain.py +0 -0
  179. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_main.py +0 -0
  180. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_main_modes_batch.py +0 -0
  181. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_main_modes_execute.py +0 -0
  182. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_main_modes_list_dsn.py +0 -0
  183. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_naive_completion.py +0 -0
  184. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_output.py +0 -0
  185. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_password_sources.py +0 -0
  186. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_polars_completion.py +0 -0
  187. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_polars_transform.py +0 -0
  188. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_ptoolkit_fzf.py +0 -0
  189. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_ptoolkit_history.py +0 -0
  190. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_ptoolkit_utils.py +0 -0
  191. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_schema_prefetcher.py +0 -0
  192. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_special_init.py +0 -0
  193. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_special_iocommands.py +0 -0
  194. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_special_llm.py +0 -0
  195. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_special_main.py +0 -0
  196. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_special_source.py +0 -0
  197. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_special_utils.py +0 -0
  198. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_sql_utils.py +0 -0
  199. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_sqlresult.py +0 -0
  200. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_ssh_tunnel.py +0 -0
  201. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_string_utils.py +0 -0
  202. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_tabular_output.py +0 -0
  203. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_vault.py +0 -0
  204. {mycli-2.25.3 → mycli-2.26.0}/test/pytests/test_zsh_completion.py +0 -0
  205. {mycli-2.25.3 → mycli-2.26.0}/test/utils.py +0 -0
@@ -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
@@ -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
@@ -80,13 +80,13 @@ This repo uses `uv` for dependency management. **Always** prefix Python
80
80
  commands with `uv run`. Example:
81
81
 
82
82
  ```bash
83
- uv run -- python script.py
83
+ env -u PYTHONPATH uv run -- python script.py
84
84
  ```
85
85
 
86
86
  #### Python Typing
87
87
 
88
88
  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`.
89
+ type annotations, and always check new code with `env -u PYTHONPATH uv run -- mypy --install-types --non-interactive script.py`.
90
90
 
91
91
  Use lower-case type annotations such as `tuple`, not upper-case type
92
92
  annotations such as `Tuple`.
@@ -96,12 +96,13 @@ Use `Type | None` instead of `Optional[Type]`.
96
96
  #### Python Testing
97
97
 
98
98
  Tests are coordinated by `tox`, and include both `pytest` and `behave` tests.
99
- To run the full test suite, execute `uv run -- tox`.
99
+ To run the full test suite, execute `env -u PYTHONPATH uv run -- tox`.
100
100
 
101
101
  #### Python Compatibility
102
102
 
103
- Use Python features available from Python 3.10 through Python 3.14.
104
- Compatibility with Python 3.9 is not needed.
103
+ Use Python features available from Python 3.11 through Python 3.14.
104
+ Compatibility with Python 3.9 is not needed. Compatibility with Python
105
+ 3.10 is not needed.
105
106
 
106
107
  #### Python Style
107
108
 
@@ -113,9 +114,9 @@ from existing code.
113
114
  #### Python Environment
114
115
 
115
116
  * 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`
117
+ * Formatter: `env -u PYTHONPATH uv run -- ruff format`
118
+ * Linter: `env -u PYTHONPATH uv run -- ruff check`
119
+ * Type checker: `env -u PYTHONPATH uv run -- mypy --install-types --non-interactive`
119
120
 
120
121
  ### Git Workflows
121
122
 
@@ -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.26.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).