mycli 2.24.3__tar.gz → 2.24.5__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.
- {mycli-2.24.3 → mycli-2.24.5}/.github/dependabot.yml +2 -0
- {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/ci.yml +24 -5
- {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/publish.yml +10 -15
- {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/typecheck.yml +1 -1
- {mycli-2.24.3 → mycli-2.24.5}/AGENTS.md +2 -0
- {mycli-2.24.3/mycli.egg-info → mycli-2.24.5}/PKG-INFO +18 -12
- {mycli-2.24.3 → mycli-2.24.5}/README.md +17 -11
- {mycli-2.24.3 → mycli-2.24.5}/changelog.md +33 -1
- {mycli-2.24.3 → mycli-2.24.5}/docker/resources/test_db-1.0.7.tar.gz +1 -1
- {mycli-2.24.3 → mycli-2.24.5}/mycli/client_connection.py +2 -1
- mycli-2.24.5/mycli/keyring_utils.py +34 -0
- mycli-2.24.5/mycli/macos_keychain.py +80 -0
- {mycli-2.24.3 → mycli-2.24.5/mycli.egg-info}/PKG-INFO +18 -12
- {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/SOURCES.txt +4 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/scm_file_list.json +4 -0
- mycli-2.24.5/mycli.egg-info/scm_version.json +8 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client_connection.py +50 -7
- mycli-2.24.5/test/pytests/test_keyring_utils.py +105 -0
- mycli-2.24.5/test/pytests/test_macos_keychain.py +160 -0
- mycli-2.24.3/mycli.egg-info/scm_version.json +0 -8
- {mycli-2.24.3 → mycli-2.24.5}/.git-blame-ignore-revs +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/lint.yml +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/.gitignore +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/AUTHORS.rst +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/CONTRIBUTING.md +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/LICENSE.txt +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/MANIFEST.in +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/SPONSORS.rst +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/doc/key_bindings.rst +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/doc/llm.md +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/doc/screenshots/main.gif +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/doc/screenshots/tables.png +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/doc/screenshots/total_histogram.png +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/doc/transforms.md +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/docker/Dockerfile +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/AUTHORS +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/SPONSORS +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/TIPS +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/app_state.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/boundary_tunnel.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/cli_runner.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/clibuffer.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/client.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/client_commands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/client_query.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/clistyle.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/clitoolbar.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/compat.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/completion_refresher.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/config.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/constants.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/key_bindings.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/kubectl_tunnel.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/lexer.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/main.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/batch.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/checkup.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/completions.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/execute.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/list_dsn.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/repl.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/myclirc +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/output.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/batch_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/cli_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/completion_engine.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/filepaths.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/hybrid_redirection.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/interactive_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/key_binding_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/polars_completion.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/polars_transform.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/fzf.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/history.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/dbcommands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/delimitercommand.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/dsn_aliases.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/favoritequeries.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/iocommands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/llm.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/main.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/source.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/sql_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/sqlresult.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/string_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/tabular_output/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/tabular_output/sql_format.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/password_sources.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/resources/completions/bash/mycli +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/resources/completions/fish/mycli.fish +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/resources/completions/zsh/_mycli +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/schema_prefetcher.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/sqlcompleter.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/sqlexecute.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/ssh_tunnel.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/types.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli/vault.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/dependency_links.txt +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/entry_points.txt +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/requires.txt +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/top_level.txt +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/pyproject.toml +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/setup.cfg +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/auto_vertical.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/basic_commands.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/connection.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/crud_database.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/crud_table.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/db_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/environment.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/fixture_data/help_commands.txt +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/fixture_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/iocommands.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/named_queries.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/specials.feature +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/__init__.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/auto_vertical.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/basic_commands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/connection.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/crud_database.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/crud_table.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/iocommands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/named_queries.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/specials.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/wrappers.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/features/wrappager.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/myclirc +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/mylogin.cnf +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/conftest.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_app_state.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_bash_completion.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_batch_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_boundary_tunnel.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_checkup.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_cli_runner.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_cli_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_clibuffer.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client_commands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client_query.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_clistyle.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_clitoolbar.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_completer_use_switch.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_completion_engine.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_completion_refresher.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_config.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_delimitercommand.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_dsn_aliases.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_favoritequeries.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_filepaths.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_fish_completion.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_hybrid_redirection.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_interactive_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_key_binding_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_key_bindings.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_kubectl_tunnel.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_batch.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_execute.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_list_dsn.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_repl.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_naive_completion.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_output.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_password_sources.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_polars_completion.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_polars_transform.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ptoolkit_fzf.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ptoolkit_history.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ptoolkit_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_schema_prefetcher.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_smart_completion_public_schema_only.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_dbcommands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_init.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_iocommands.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_llm.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_main.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_source.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sql_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sqlcompleter.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sqlexecute.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sqlresult.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ssh_tunnel.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_string_utils.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_tabular_output.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_vault.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_zsh_completion.py +0 -0
- {mycli-2.24.3 → mycli-2.24.5}/test/utils.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@
|
|
27
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.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@
|
|
69
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.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@
|
|
119
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
|
|
120
120
|
with:
|
|
121
121
|
version: 'latest'
|
|
122
122
|
|
|
@@ -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@
|
|
133
|
+
uses: shogo82148/actions-setup-mysql@083ec148d28e62f2b24b8f4541693dfe1d50488d # v1.54.0
|
|
134
134
|
with:
|
|
135
135
|
mysql-version: '9.7'
|
|
136
136
|
root-password: root
|
|
@@ -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@
|
|
223
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
|
|
224
224
|
with:
|
|
225
225
|
version: "latest"
|
|
226
226
|
|
|
@@ -249,3 +249,22 @@ jobs:
|
|
|
249
249
|
TERM: xterm
|
|
250
250
|
run: |
|
|
251
251
|
uv run tox -e py3.14
|
|
252
|
+
|
|
253
|
+
docker-build:
|
|
254
|
+
name: Build Docker Image
|
|
255
|
+
runs-on: ubuntu-latest
|
|
256
|
+
|
|
257
|
+
permissions:
|
|
258
|
+
contents: read
|
|
259
|
+
|
|
260
|
+
steps:
|
|
261
|
+
- name: Checkout repository
|
|
262
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
263
|
+
|
|
264
|
+
- name: Build Docker image
|
|
265
|
+
id: build
|
|
266
|
+
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
|
267
|
+
with:
|
|
268
|
+
context: .
|
|
269
|
+
file: docker/Dockerfile
|
|
270
|
+
push: false
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name: Publish
|
|
1
|
+
name: Publish Packages
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
release:
|
|
@@ -25,7 +25,6 @@ jobs:
|
|
|
25
25
|
tests:
|
|
26
26
|
runs-on: ubuntu-latest
|
|
27
27
|
needs: [docs]
|
|
28
|
-
continue-on-error: true
|
|
29
28
|
|
|
30
29
|
strategy:
|
|
31
30
|
matrix:
|
|
@@ -33,7 +32,7 @@ jobs:
|
|
|
33
32
|
|
|
34
33
|
steps:
|
|
35
34
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
36
|
-
- uses: astral-sh/setup-uv@
|
|
35
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
|
|
37
36
|
with:
|
|
38
37
|
version: "latest"
|
|
39
38
|
|
|
@@ -78,7 +77,7 @@ jobs:
|
|
|
78
77
|
steps:
|
|
79
78
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
80
79
|
|
|
81
|
-
- uses: astral-sh/setup-uv@
|
|
80
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
|
|
82
81
|
with:
|
|
83
82
|
version: "latest"
|
|
84
83
|
|
|
@@ -128,7 +127,7 @@ jobs:
|
|
|
128
127
|
steps:
|
|
129
128
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
130
129
|
|
|
131
|
-
- uses: astral-sh/setup-uv@
|
|
130
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
|
|
132
131
|
with:
|
|
133
132
|
version: 'latest'
|
|
134
133
|
|
|
@@ -142,7 +141,7 @@ jobs:
|
|
|
142
141
|
run: uv sync --all-extras -p ${{ matrix.python-version }}
|
|
143
142
|
|
|
144
143
|
- name: Set up MySQL
|
|
145
|
-
uses: shogo82148/actions-setup-mysql@
|
|
144
|
+
uses: shogo82148/actions-setup-mysql@083ec148d28e62f2b24b8f4541693dfe1d50488d # v1.54.0
|
|
146
145
|
with:
|
|
147
146
|
mysql-version: '9.7'
|
|
148
147
|
root-password: root
|
|
@@ -231,7 +230,7 @@ jobs:
|
|
|
231
230
|
|
|
232
231
|
steps:
|
|
233
232
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
234
|
-
- uses: astral-sh/setup-uv@
|
|
233
|
+
- uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
|
|
235
234
|
with:
|
|
236
235
|
version: "latest"
|
|
237
236
|
|
|
@@ -253,7 +252,7 @@ jobs:
|
|
|
253
252
|
path: dist/
|
|
254
253
|
|
|
255
254
|
publish-pypi:
|
|
256
|
-
name: Publish to PyPI
|
|
255
|
+
name: Publish Wheel to PyPI
|
|
257
256
|
runs-on: ubuntu-latest
|
|
258
257
|
if: startsWith(github.ref, 'refs/tags/')
|
|
259
258
|
needs: [build]
|
|
@@ -270,9 +269,11 @@ jobs:
|
|
|
270
269
|
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
271
270
|
|
|
272
271
|
publish-image:
|
|
273
|
-
name: Publish to ghcr.io
|
|
272
|
+
name: Publish Image to ghcr.io
|
|
274
273
|
runs-on: ubuntu-latest
|
|
275
274
|
if: startsWith(github.ref, 'refs/tags/')
|
|
275
|
+
# doesn't actually need the results of build, but it makes sense to run this
|
|
276
|
+
# concurrently with publish-pypi
|
|
276
277
|
needs: [build]
|
|
277
278
|
environment: release
|
|
278
279
|
|
|
@@ -309,9 +310,3 @@ jobs:
|
|
|
309
310
|
push: true
|
|
310
311
|
tags: ${{ steps.meta.outputs.tags }}
|
|
311
312
|
labels: ${{ steps.meta.outputs.labels }}
|
|
312
|
-
|
|
313
|
-
- name: Generate artifact attestation
|
|
314
|
-
uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
|
|
315
|
-
with:
|
|
316
|
-
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
|
|
317
|
-
push-to-registry: true
|
|
@@ -25,8 +25,10 @@ A command line client for MySQL with auto-completion and syntax highlighting.
|
|
|
25
25
|
├── mycli/config.py # configuration file readers and utilities
|
|
26
26
|
├── mycli/constants.py # shared constants
|
|
27
27
|
├── mycli/key_bindings.py # prompt_toolkit key binding utilities
|
|
28
|
+
├── mycli/keyring_utils.py # saved credential utilities
|
|
28
29
|
├── mycli/kubectl_tunnel.py # connection over kubectl tunnel
|
|
29
30
|
├── mycli/lexer.py # extends `MySqlLexer` from Pygments
|
|
31
|
+
├── mycli/macos_keychain.py # macOS Keychain credentials preserving access controls
|
|
30
32
|
├── mycli/main.py # processes CLI arguments
|
|
31
33
|
├── mycli/main_modes/ # main execution paths
|
|
32
34
|
├── mycli/main_modes/batch.py # `--batch` mode
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mycli
|
|
3
|
-
Version: 2.24.
|
|
3
|
+
Version: 2.24.5
|
|
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
|
|
@@ -143,20 +143,26 @@ mycli --help
|
|
|
143
143
|
* Fuzzy history search using [fzf](https://github.com/junegunn/fzf).
|
|
144
144
|
* Output explorer using [fzf](https://github.com/junegunn/fzf) or other tools.
|
|
145
145
|
* Syntax highlighting using [Pygments](https://pygments.org/).
|
|
146
|
-
* Smart-completion
|
|
147
|
-
- `SELECT * FROM
|
|
148
|
-
- `SELECT * FROM users WHERE
|
|
149
|
-
*
|
|
146
|
+
* Smart-completion suggests context-sensitive completion:
|
|
147
|
+
- `SELECT * FROM `<kbd>tab</kbd> will only show table names.
|
|
148
|
+
- `SELECT * FROM users WHERE `<kbd>tab</kbd> will only show column names.
|
|
149
|
+
* Multiline queries.
|
|
150
150
|
* Favorite queries with positional or named parameters using [Jinja](https://jinja.palletsprojects.com/en/stable/). Save a query using
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
```
|
|
152
|
+
/fs alias <query>
|
|
153
|
+
```
|
|
154
|
+
and execute it with
|
|
155
|
+
```
|
|
156
|
+
/f alias --key=value
|
|
157
|
+
```
|
|
158
|
+
* Timing of SQL statements and table rendering.
|
|
159
|
+
* Logging of every query and its results to a file (off by default).
|
|
160
|
+
* Pretty printing of tabular data.
|
|
156
161
|
* Shell-style trailing redirects with `$>`, `$>>` and `$|` operators.
|
|
157
162
|
* [Polars](https://pola.rs) dataframe [transforms and plots](https://github.com/dbcli/mycli/blob/main/doc/transforms.md) with `.|`, and Parquet saves with `.>`.
|
|
158
|
-
*
|
|
159
|
-
*
|
|
163
|
+
* [Querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
|
|
164
|
+
* Storing passwords in the system keyring.
|
|
165
|
+
* Modern defaults such as UTF-8 connection type and SSL.
|
|
160
166
|
* Integrations with: [SSH](https://www.openssh.org/), [Kubernetes](https://kubernetes.io/), [Vault](https://github.com/hashicorp/vault), and [Boundary](https://github.com/hashicorp/boundary).
|
|
161
167
|
|
|
162
168
|
Mycli creates a config file `~/.myclirc` on the first run; you can use the
|
|
@@ -71,20 +71,26 @@ mycli --help
|
|
|
71
71
|
* Fuzzy history search using [fzf](https://github.com/junegunn/fzf).
|
|
72
72
|
* Output explorer using [fzf](https://github.com/junegunn/fzf) or other tools.
|
|
73
73
|
* Syntax highlighting using [Pygments](https://pygments.org/).
|
|
74
|
-
* Smart-completion
|
|
75
|
-
- `SELECT * FROM
|
|
76
|
-
- `SELECT * FROM users WHERE
|
|
77
|
-
*
|
|
74
|
+
* Smart-completion suggests context-sensitive completion:
|
|
75
|
+
- `SELECT * FROM `<kbd>tab</kbd> will only show table names.
|
|
76
|
+
- `SELECT * FROM users WHERE `<kbd>tab</kbd> will only show column names.
|
|
77
|
+
* Multiline queries.
|
|
78
78
|
* Favorite queries with positional or named parameters using [Jinja](https://jinja.palletsprojects.com/en/stable/). Save a query using
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
```
|
|
80
|
+
/fs alias <query>
|
|
81
|
+
```
|
|
82
|
+
and execute it with
|
|
83
|
+
```
|
|
84
|
+
/f alias --key=value
|
|
85
|
+
```
|
|
86
|
+
* Timing of SQL statements and table rendering.
|
|
87
|
+
* Logging of every query and its results to a file (off by default).
|
|
88
|
+
* Pretty printing of tabular data.
|
|
84
89
|
* Shell-style trailing redirects with `$>`, `$>>` and `$|` operators.
|
|
85
90
|
* [Polars](https://pola.rs) dataframe [transforms and plots](https://github.com/dbcli/mycli/blob/main/doc/transforms.md) with `.|`, and Parquet saves with `.>`.
|
|
86
|
-
*
|
|
87
|
-
*
|
|
91
|
+
* [Querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
|
|
92
|
+
* Storing passwords in the system keyring.
|
|
93
|
+
* Modern defaults such as UTF-8 connection type and SSL.
|
|
88
94
|
* Integrations with: [SSH](https://www.openssh.org/), [Kubernetes](https://kubernetes.io/), [Vault](https://github.com/hashicorp/vault), and [Boundary](https://github.com/hashicorp/boundary).
|
|
89
95
|
|
|
90
96
|
Mycli creates a config file `~/.myclirc` on the first run; you can use the
|
|
@@ -1,3 +1,36 @@
|
|
|
1
|
+
2.24.5 (2026/09/16)
|
|
2
|
+
==============
|
|
3
|
+
|
|
4
|
+
Bug Fixes
|
|
5
|
+
--------
|
|
6
|
+
* New macOS keyring entries no longer automatically trust Python.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Documentation
|
|
10
|
+
--------
|
|
11
|
+
* Update features bullets in `README.md`.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Internal
|
|
15
|
+
--------
|
|
16
|
+
* Naming and commentary in `publish.yml` workflow.
|
|
17
|
+
* Build Docker image as part of regular CI tests.
|
|
18
|
+
* One week cooldown for dependabot.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
2.24.4 (2026/09/12)
|
|
22
|
+
==============
|
|
23
|
+
|
|
24
|
+
Bug Fixes
|
|
25
|
+
--------
|
|
26
|
+
* Remove artifact attestations from ghcr.io images, fixing package examples.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
Internal
|
|
30
|
+
--------
|
|
31
|
+
* Remove `continue-on-error` from release tests.
|
|
32
|
+
|
|
33
|
+
|
|
1
34
|
2.24.3 (2026/09/12)
|
|
2
35
|
==============
|
|
3
36
|
|
|
@@ -15,7 +48,6 @@ Bug Fixes
|
|
|
15
48
|
* Set `artifact-metadata: write` in `publish.yml`.
|
|
16
49
|
|
|
17
50
|
|
|
18
|
-
|
|
19
51
|
2.24.1 (2026/09/12)
|
|
20
52
|
==============
|
|
21
53
|
|
|
@@ -22,6 +22,7 @@ from mycli.constants import (
|
|
|
22
22
|
EMPTY_PASSWORD_FLAG_SENTINEL,
|
|
23
23
|
ER_MUST_CHANGE_PASSWORD_LOGIN,
|
|
24
24
|
)
|
|
25
|
+
from mycli.keyring_utils import set_keyring_password
|
|
25
26
|
from mycli.kubectl_tunnel import KubectlTunnel, KubectlTunnelError
|
|
26
27
|
from mycli.packages.filepaths import guess_socket_location
|
|
27
28
|
from mycli.packages.special.utils import format_connection_dsn
|
|
@@ -381,7 +382,7 @@ class ClientConnectionMixin:
|
|
|
381
382
|
try:
|
|
382
383
|
saved_pw = keyring.get_password(keyring_domain, keyring_identifier)
|
|
383
384
|
if password != saved_pw or reset_keyring:
|
|
384
|
-
|
|
385
|
+
set_keyring_password(keyring_domain, keyring_identifier, password)
|
|
385
386
|
click.secho(
|
|
386
387
|
f'Password from source: "{password_source}" '
|
|
387
388
|
f'saved to the system keyring at {keyring_domain}/{keyring_identifier}',
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
|
|
3
|
+
import keyring
|
|
4
|
+
from keyring.backend import KeyringBackend
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _set_password_with_backend(backend: KeyringBackend, service: str, account: str, password: str) -> None:
|
|
8
|
+
from keyring.backends.macOS import Keyring
|
|
9
|
+
|
|
10
|
+
if type(backend) is Keyring:
|
|
11
|
+
from mycli import macos_keychain
|
|
12
|
+
|
|
13
|
+
macos_keychain.set_password(service, account, password)
|
|
14
|
+
else:
|
|
15
|
+
backend.set_password(service, account, password)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def set_keyring_password(service: str, account: str, password: str) -> None:
|
|
19
|
+
if sys.platform != 'darwin':
|
|
20
|
+
keyring.set_password(service, account, password)
|
|
21
|
+
return
|
|
22
|
+
|
|
23
|
+
from keyring.backends.chainer import ChainerBackend # type: ignore[unreachable]
|
|
24
|
+
|
|
25
|
+
backend = keyring.get_keyring()
|
|
26
|
+
if type(backend) is ChainerBackend:
|
|
27
|
+
for candidate in backend.backends:
|
|
28
|
+
try:
|
|
29
|
+
_set_password_with_backend(candidate, service, account, password)
|
|
30
|
+
return
|
|
31
|
+
except NotImplementedError:
|
|
32
|
+
continue
|
|
33
|
+
else:
|
|
34
|
+
_set_password_with_backend(backend, service, account, password)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import ctypes
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from keyring.errors import KeyringLocked, PasswordSetError
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _get_api() -> Any:
|
|
8
|
+
from keyring.backends.macOS import api
|
|
9
|
+
|
|
10
|
+
return api
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def set_password(service: str, account: str, password: str) -> None:
|
|
14
|
+
"""Preserve existing ACLs and create credentials without trusting Python."""
|
|
15
|
+
api = _get_api()
|
|
16
|
+
cf_array_create = api._found.CFArrayCreate
|
|
17
|
+
cf_array_create.restype = ctypes.c_void_p
|
|
18
|
+
cf_array_create.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.c_long, ctypes.c_void_p)
|
|
19
|
+
cf_data_create = api._found.CFDataCreate
|
|
20
|
+
cf_data_create.restype = ctypes.c_void_p
|
|
21
|
+
cf_data_create.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.c_long)
|
|
22
|
+
cf_release = api._found.CFRelease
|
|
23
|
+
cf_release.restype = None
|
|
24
|
+
cf_release.argtypes = (ctypes.c_void_p,)
|
|
25
|
+
sec_access_create = api._sec.SecAccessCreate
|
|
26
|
+
sec_access_create.restype = api.OS_status
|
|
27
|
+
sec_access_create.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.POINTER(ctypes.c_void_p))
|
|
28
|
+
sec_item_update = api._sec.SecItemUpdate
|
|
29
|
+
sec_item_update.restype = api.OS_status
|
|
30
|
+
sec_item_update.argtypes = (ctypes.c_void_p, ctypes.c_void_p)
|
|
31
|
+
|
|
32
|
+
retained: list[ctypes.c_void_p] = []
|
|
33
|
+
|
|
34
|
+
def retain(value: int | ctypes.c_void_p | None, name: str) -> ctypes.c_void_p:
|
|
35
|
+
if not value:
|
|
36
|
+
raise RuntimeError(f'Unable to allocate Keychain {name}')
|
|
37
|
+
pointer = value if isinstance(value, ctypes.c_void_p) else ctypes.c_void_p(value)
|
|
38
|
+
retained.append(pointer)
|
|
39
|
+
return pointer
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
service_value = retain(api.create_cf(service), 'service')
|
|
43
|
+
account_value = retain(api.create_cf(account), 'account')
|
|
44
|
+
encoded = password.encode('utf-8')
|
|
45
|
+
password_value = retain(cf_data_create(None, ctypes.create_string_buffer(encoded), len(encoded)), 'password')
|
|
46
|
+
search = retain(
|
|
47
|
+
api.create_query(
|
|
48
|
+
kSecClass=api.k_('kSecClassGenericPassword'),
|
|
49
|
+
kSecAttrService=service_value,
|
|
50
|
+
kSecAttrAccount=account_value,
|
|
51
|
+
),
|
|
52
|
+
'search',
|
|
53
|
+
)
|
|
54
|
+
attributes = retain(api.create_query(kSecValueData=password_value), 'attributes')
|
|
55
|
+
status = sec_item_update(search, attributes)
|
|
56
|
+
if status == api.error.item_not_found:
|
|
57
|
+
# An empty array trusts nobody; NULL would trust the calling executable.
|
|
58
|
+
trusted_apps = retain(cf_array_create(None, None, 0, None), 'access controls')
|
|
59
|
+
access = ctypes.c_void_p()
|
|
60
|
+
api.Error.raise_for_status(sec_access_create(service_value, trusted_apps, ctypes.byref(access)))
|
|
61
|
+
retain(access, 'access')
|
|
62
|
+
item = retain(
|
|
63
|
+
api.create_query(
|
|
64
|
+
kSecClass=api.k_('kSecClassGenericPassword'),
|
|
65
|
+
kSecAttrService=service_value,
|
|
66
|
+
kSecAttrAccount=account_value,
|
|
67
|
+
kSecValueData=password_value,
|
|
68
|
+
kSecAttrAccess=access,
|
|
69
|
+
),
|
|
70
|
+
'item',
|
|
71
|
+
)
|
|
72
|
+
status = api.SecItemAdd(item, None)
|
|
73
|
+
api.Error.raise_for_status(status)
|
|
74
|
+
except api.KeychainDenied as e:
|
|
75
|
+
raise KeyringLocked(f"Can't store password on keychain: {e}") from e
|
|
76
|
+
except api.Error as e:
|
|
77
|
+
raise PasswordSetError(f"Can't store password on keychain: {e}") from e
|
|
78
|
+
finally:
|
|
79
|
+
for value in reversed(retained):
|
|
80
|
+
cf_release(value)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mycli
|
|
3
|
-
Version: 2.24.
|
|
3
|
+
Version: 2.24.5
|
|
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
|
|
@@ -143,20 +143,26 @@ mycli --help
|
|
|
143
143
|
* Fuzzy history search using [fzf](https://github.com/junegunn/fzf).
|
|
144
144
|
* Output explorer using [fzf](https://github.com/junegunn/fzf) or other tools.
|
|
145
145
|
* Syntax highlighting using [Pygments](https://pygments.org/).
|
|
146
|
-
* Smart-completion
|
|
147
|
-
- `SELECT * FROM
|
|
148
|
-
- `SELECT * FROM users WHERE
|
|
149
|
-
*
|
|
146
|
+
* Smart-completion suggests context-sensitive completion:
|
|
147
|
+
- `SELECT * FROM `<kbd>tab</kbd> will only show table names.
|
|
148
|
+
- `SELECT * FROM users WHERE `<kbd>tab</kbd> will only show column names.
|
|
149
|
+
* Multiline queries.
|
|
150
150
|
* Favorite queries with positional or named parameters using [Jinja](https://jinja.palletsprojects.com/en/stable/). Save a query using
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
```
|
|
152
|
+
/fs alias <query>
|
|
153
|
+
```
|
|
154
|
+
and execute it with
|
|
155
|
+
```
|
|
156
|
+
/f alias --key=value
|
|
157
|
+
```
|
|
158
|
+
* Timing of SQL statements and table rendering.
|
|
159
|
+
* Logging of every query and its results to a file (off by default).
|
|
160
|
+
* Pretty printing of tabular data.
|
|
156
161
|
* Shell-style trailing redirects with `$>`, `$>>` and `$|` operators.
|
|
157
162
|
* [Polars](https://pola.rs) dataframe [transforms and plots](https://github.com/dbcli/mycli/blob/main/doc/transforms.md) with `.|`, and Parquet saves with `.>`.
|
|
158
|
-
*
|
|
159
|
-
*
|
|
163
|
+
* [Querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
|
|
164
|
+
* Storing passwords in the system keyring.
|
|
165
|
+
* Modern defaults such as UTF-8 connection type and SSL.
|
|
160
166
|
* Integrations with: [SSH](https://www.openssh.org/), [Kubernetes](https://kubernetes.io/), [Vault](https://github.com/hashicorp/vault), and [Boundary](https://github.com/hashicorp/boundary).
|
|
161
167
|
|
|
162
168
|
Mycli creates a config file `~/.myclirc` on the first run; you can use the
|
|
@@ -44,8 +44,10 @@ mycli/completion_refresher.py
|
|
|
44
44
|
mycli/config.py
|
|
45
45
|
mycli/constants.py
|
|
46
46
|
mycli/key_bindings.py
|
|
47
|
+
mycli/keyring_utils.py
|
|
47
48
|
mycli/kubectl_tunnel.py
|
|
48
49
|
mycli/lexer.py
|
|
50
|
+
mycli/macos_keychain.py
|
|
49
51
|
mycli/main.py
|
|
50
52
|
mycli/myclirc
|
|
51
53
|
mycli/output.py
|
|
@@ -159,7 +161,9 @@ test/pytests/test_hybrid_redirection.py
|
|
|
159
161
|
test/pytests/test_interactive_utils.py
|
|
160
162
|
test/pytests/test_key_binding_utils.py
|
|
161
163
|
test/pytests/test_key_bindings.py
|
|
164
|
+
test/pytests/test_keyring_utils.py
|
|
162
165
|
test/pytests/test_kubectl_tunnel.py
|
|
166
|
+
test/pytests/test_macos_keychain.py
|
|
163
167
|
test/pytests/test_main.py
|
|
164
168
|
test/pytests/test_main_modes_batch.py
|
|
165
169
|
test/pytests/test_main_modes_execute.py
|
|
@@ -45,8 +45,10 @@
|
|
|
45
45
|
"mycli/config.py",
|
|
46
46
|
"mycli/constants.py",
|
|
47
47
|
"mycli/key_bindings.py",
|
|
48
|
+
"mycli/keyring_utils.py",
|
|
48
49
|
"mycli/kubectl_tunnel.py",
|
|
49
50
|
"mycli/lexer.py",
|
|
51
|
+
"mycli/macos_keychain.py",
|
|
50
52
|
"mycli/main.py",
|
|
51
53
|
"mycli/main_modes/batch.py",
|
|
52
54
|
"mycli/main_modes/checkup.py",
|
|
@@ -152,7 +154,9 @@
|
|
|
152
154
|
"test/pytests/test_interactive_utils.py",
|
|
153
155
|
"test/pytests/test_key_binding_utils.py",
|
|
154
156
|
"test/pytests/test_key_bindings.py",
|
|
157
|
+
"test/pytests/test_keyring_utils.py",
|
|
155
158
|
"test/pytests/test_kubectl_tunnel.py",
|
|
159
|
+
"test/pytests/test_macos_keychain.py",
|
|
156
160
|
"test/pytests/test_main.py",
|
|
157
161
|
"test/pytests/test_main_modes_batch.py",
|
|
158
162
|
"test/pytests/test_main_modes_execute.py",
|