Repository Analysis

dbcli/mycli

A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.

31.3 Strong AI signal View on GitHub
31.3
Adjusted Score
31.3
Raw Score
100%
Time Factor
2026-05-30
Last Push
11,917
Stars
Python
Language
37,065
Lines of Code
136
Files
1199
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 15MEDIUM 15LOW 1169

Pattern Findings

1199 matches across 11 categories. Click a row to expand file-level details.

Hyper-Verbose Identifiers948 hits · 845 pts
SeverityFileLineSnippet
LOWmycli/config.py223def read_and_decrypt_mylogin_cnf(f: BinaryIO) -> BytesIO | None:
LOWmycli/clitoolbar.py11def create_toolbar_tokens_func(
LOWmycli/client_commands.py30 def register_special_commands(self) -> None:
LOWmycli/sqlcompleter.py1211 def _register_schema_completions(
LOWmycli/sqlcompleter.py1250 def quote_collection_if_needed(
LOWmycli/client_query.py59 def _on_completions_refreshed(self, new_completer: SQLCompleter) -> None:
LOWmycli/app_state.py46def destructive_keywords_from_config(config: ConfigObj) -> list[str]:
LOWmycli/packages/cli_utils.py13def is_valid_connection_scheme(text: str) -> tuple[bool, str | None]:
LOWmycli/packages/interactive_utils.py28def confirm_destructive_query(keywords: list[str], queries: str) -> bool | None:
LOWmycli/packages/batch_utils.py9def statements_from_filehandle(file_h: IO) -> Generator[tuple[str, int], None, None]:
LOWmycli/packages/key_binding_utils.py114def handle_unprettify_binding(
LOWmycli/packages/completion_engine.py73def _keyword_and_special_suggestions() -> list[Suggestion]:
LOWmycli/packages/completion_engine.py78def _parse_suggestion_statement(text_before_cursor: str) -> sqlparse.sql.Statement:
LOWmycli/packages/completion_engine.py126def _is_single_or_double_quoted(ctx: SuggestContext) -> bool:
LOWmycli/packages/completion_engine.py383def _word_starts_with_digit_or_dot(ctx: SuggestContext) -> bool:
LOWmycli/packages/completion_engine.py391def _word_inside_single_or_double_quotes(ctx: SuggestContext) -> bool:
LOWmycli/packages/completion_engine.py411def _token_is_relation_keyword(ctx: SuggestContext) -> bool:
LOWmycli/packages/completion_engine.py419def _token_is_binary_or_comma(ctx: SuggestContext) -> bool:
LOWmycli/packages/completion_engine.py815def suggest_based_on_last_token(
LOWmycli/packages/sql_utils.py173def extract_table_identifiers(token_stream: Generator[Any, None, None]) -> Generator[tuple[str | None, str, str], None,
LOWmycli/packages/sql_utils.py221def extract_columns_from_select(sql: str) -> list[str]:
LOWmycli/packages/sql_utils.py271def extract_tables_from_complete_statements(sql: str) -> list[tuple[str | None, str, str | None]]:
LOWmycli/packages/sql_utils.py362def query_is_single_table_update(query: str) -> bool:
LOWmycli/packages/sql_utils.py475def classify_sandbox_statement(text: str) -> tuple[str | None, str | None]:
LOWmycli/packages/special/iocommands.py85def set_show_warnings_enabled(val: bool) -> None:
LOWmycli/packages/special/iocommands.py190def set_forced_horizontal_output(val: bool) -> None:
LOWmycli/packages/special/iocommands.py386def subst_favorite_query_args(query: str, args: list[str]) -> list[str | None]:
LOWmycli/packages/special/iocommands.py654def flush_pipe_once_if_written(post_redirect_command: str) -> None:
LOWmycli/packages/ptoolkit/history.py27 def load_history_with_timestamp(self) -> list[tuple[str, str]]:
LOWmycli/main_modes/repl.py97def complete_while_typing_filter() -> bool:
LOWmycli/main_modes/repl.py164def set_external_terminal_tab_title(mycli: 'MyCli') -> None:
LOWmycli/main_modes/repl.py182def set_external_terminal_window_title(mycli: 'MyCli') -> None:
LOWmycli/main_modes/repl.py200def set_external_multiplex_window_title(mycli: 'MyCli') -> None:
LOWmycli/main_modes/repl.py226def set_external_multiplex_pane_title(mycli: 'MyCli') -> None:
LOWmycli/main_modes/batch.py71def dispatch_batch_statements(
LOWmycli/main_modes/batch.py112def main_batch_with_progress_bar(mycli: 'MyCli', cli_args: 'CliArgs') -> int:
LOWmycli/main_modes/batch.py166def main_batch_without_progress_bar(mycli: 'MyCli', cli_args: 'CliArgs') -> int:
LOWtest/utils.py246def call_click_entrypoint_direct(cli_args: main.CliArgs) -> None:
LOWtest/features/steps/crud_database.py40def step_db_connect_quoted_tmp(context):
LOWtest/features/steps/crud_database.py99def step_see_db_dropped_no_default(context):
LOWtest/features/steps/named_queries.py33def step_see_named_query_saved(context):
LOWtest/features/steps/named_queries.py39def step_see_named_query_executed(context):
LOWtest/features/steps/named_queries.py45def step_see_named_query_deleted(context):
LOWtest/features/steps/named_queries.py51def step_save_named_query_with_parameters(context):
LOWtest/features/steps/named_queries.py57def step_use_named_query_with_parameters(context):
LOWtest/features/steps/named_queries.py63def step_see_named_query_with_parameters_executed(context):
LOWtest/features/steps/named_queries.py69def step_use_named_query_with_too_few_parameters(context):
LOWtest/features/steps/named_queries.py75def step_see_named_query_with_parameters_fail_with_missing_parameters(context):
LOWtest/features/steps/named_queries.py81def step_use_named_query_with_too_many_parameters(context):
LOWtest/features/steps/named_queries.py87def step_see_named_query_with_parameters_fail_with_extra_parameters(context):
LOWtest/features/steps/connection.py19def step_run_cli_without_args(context, excluded_args, exact_args=""):
LOWtest/features/steps/connection.py42def step_create_mylogin_cnf_file(context):
LOWtest/features/steps/iocommands.py107def step_see_csv_result_in_redirected_ouput(context, result):
LOWtest/features/steps/iocommands.py115def step_see_text_result_in_redirected_ouput(context, result):
LOWtest/features/steps/basic_commands.py68def step_check_application_name(context):
LOWtest/features/steps/basic_commands.py123def step_confirm_destructive_command(context): # noqa
LOWtest/features/steps/basic_commands.py130def step_confirm_destructive_command(context, confirmation): # noqa
LOWtest/features/steps/basic_commands.py137def step_confirm_destructive_command(context, confirmation, text): # noqa
LOWtest/pytests/test_sqlresult.py6def test_sqlresult_str_includes_all_fields() -> None:
LOWtest/pytests/test_sqlresult.py24def test_sqlresult_status_plain_handles_none_and_formatted_text() -> None:
888 more matches not shown…
Unused Imports136 hits · 110 pts
SeverityFileLineSnippet
LOWmycli/cli_runner.py1
LOWmycli/cli_args.py1
LOWmycli/client.py1
LOWmycli/schema_prefetcher.py10
LOWmycli/schema_prefetcher.py20
LOWmycli/schema_prefetcher.py21
LOWmycli/client_commands.py1
LOWmycli/client_connection.py1
LOWmycli/sqlcompleter.py1
LOWmycli/client_query.py1
LOWmycli/app_state.py1
LOWmycli/main.py1
LOWmycli/main.py3
LOWmycli/main.py6
LOWmycli/main.py7
LOWmycli/main.py10
LOWmycli/main.py11
LOWmycli/main.py12
LOWmycli/main.py13
LOWmycli/main.py13
LOWmycli/main.py16
LOWmycli/main.py19
LOWmycli/main.py19
LOWmycli/main.py20
LOWmycli/main.py21
LOWmycli/main.py21
LOWmycli/main.py21
LOWmycli/main.py21
LOWmycli/main.py21
LOWmycli/main.py22
LOWmycli/main.py23
LOWmycli/main.py23
LOWmycli/main.py23
LOWmycli/main.py24
LOWmycli/main.py25
LOWmycli/main.py26
LOWmycli/main.py27
LOWmycli/main.py28
LOWmycli/main.py28
LOWmycli/main.py29
LOWmycli/main.py30
LOWmycli/main.py31
LOWmycli/main.py31
LOWmycli/main.py32
LOWmycli/main.py33
LOWmycli/main.py34
LOWmycli/main.py35
LOWmycli/main.py36
LOWmycli/main.py37
LOWmycli/main.py38
LOWmycli/output.py1
LOWmycli/sqlexecute.py1
LOWmycli/sqlexecute.py23
LOWmycli/packages/cli_utils.py1
LOWmycli/packages/key_binding_utils.py1
LOWmycli/packages/key_binding_utils.py12
LOWmycli/packages/sql_utils.py1
LOWmycli/packages/tabular_output/sql_format.py3
LOWmycli/packages/special/delimitercommand.py1
LOWmycli/packages/special/__init__.py1
76 more matches not shown…
Cross-Language Confusion10 hits · 70 pts
SeverityFileLineSnippet
HIGHtest/features/steps/crud_table.py109 context.cli.sendline("select null;")
HIGHtest/pytests/test_sqlexecute.py360 run(executor, """create table ts_null(a timestamp null)""")
HIGHtest/pytests/test_sqlexecute.py361 run(executor, """insert into ts_null values(null)""")
HIGHtest/pytests/test_sqlexecute.py368 run(executor, """create table dt_null(a datetime null)""")
HIGHtest/pytests/test_sqlexecute.py369 run(executor, """insert into dt_null values(null)""")
HIGHtest/pytests/test_sqlexecute.py376 run(executor, """create table date_null(a date null)""")
HIGHtest/pytests/test_sqlexecute.py377 run(executor, """insert into date_null values(null)""")
HIGHtest/pytests/test_sqlexecute.py384 run(executor, """create table time_null(a time null)""")
HIGHtest/pytests/test_sqlexecute.py385 run(executor, """insert into time_null values(null)""")
HIGHtest/pytests/test_completion_engine.py1130 suggestion = suggest_type("SELECT MAX(col1 || FROM tbl", "SELECT MAX(col1 || ")
Excessive Try-Catch Wrapping54 hits · 56 pts
SeverityFileLineSnippet
LOWmycli/cli_args.py333 except Exception as e:
MEDIUMmycli/client.py206 print("Error: Unable to read login path file.")
LOWmycli/schema_prefetcher.py121 except Exception as e: # pragma: no cover - defensive
LOWmycli/schema_prefetcher.py129 except Exception as e:
LOWmycli/schema_prefetcher.py141 except Exception as e:
LOWmycli/schema_prefetcher.py146 except Exception: # pragma: no cover - defensive
LOWmycli/schema_prefetcher.py240 except Exception: # pragma: no cover - defensive
LOWmycli/client_connection.py214 except Exception as e:
LOWmycli/client_connection.py321 except Exception as e: # Connecting to a database could fail.
LOWmycli/sqlcompleter.py1114 except Exception:
LOWmycli/sqlexecute.py344 except Exception as e:
LOWmycli/sqlexecute.py477 except Exception as e:
LOWmycli/sqlexecute.py592 except Exception as e:
LOWmycli/packages/key_binding_utils.py100 except Exception:
LOWmycli/packages/key_binding_utils.py122 except Exception:
LOWmycli/packages/ssh_utils.py23 except Exception as err:
LOWmycli/packages/sql_utils.py436 except Exception:
LOWmycli/packages/sql_utils.py454 except Exception:
LOWmycli/packages/special/llm.py76 except Exception as e:
LOWmycli/packages/special/llm.py283 except Exception as e:
LOWmycli/packages/special/llm.py358 except Exception:
LOWmycli/packages/special/iocommands.py618 except Exception as e:
LOWmycli/main_modes/repl.py523 except Exception as e:
LOWmycli/main_modes/repl.py745 except Exception as e2:
LOWmycli/main_modes/repl.py770 except Exception as e:
LOWmycli/main_modes/repl.py784 except Exception as e:
LOWmycli/main_modes/execute.py39 except Exception as e:
LOWmycli/main_modes/list_dsn.py17 except Exception as e:
LOWtest/utils.py260except Exception:
LOWtest/utils.py271 except Exception:
LOWtest/features/environment.py89 except Exception:
MEDIUMtest/pytests/test_special_iocommands.py224 print(f"An error occurred while attempting to delete the file: {e}")
MEDIUMtest/pytests/test_special_iocommands.py287 print(f"An error occurred while attempting to delete the file: {e}")
LOWtest/pytests/test_special_iocommands.py223 except Exception as e:
LOWtest/pytests/test_special_iocommands.py286 except Exception as e:
LOWtest/pytests/test_special_main.py55 except Exception:
MEDIUMtest/pytests/test_main.py2056 print(f"An error occurred while attempting to delete the file: {e}")
MEDIUMtest/pytests/test_main.py2075 print(f"An error occurred while attempting to delete the file: {e}")
LOWtest/pytests/test_main.py296 except Exception as e:
LOWtest/pytests/test_main.py301 except Exception as e:
MEDIUMtest/pytests/test_main.py531 print(f"An error occurred while attempting to delete the file: {e}")
MEDIUMtest/pytests/test_main.py622 print(f"An error occurred while attempting to delete the file: {e}")
LOWtest/pytests/test_main.py2055 except Exception as e:
LOWtest/pytests/test_main.py2074 except Exception as e:
MEDIUMtest/pytests/test_main.py2239 print(f'An error occurred while attempting to delete the file: {e}')
MEDIUMtest/pytests/test_main.py838 print(f"An error occurred while attempting to delete the file: {e}")
MEDIUMtest/pytests/test_main.py867 print(f"An error occurred while attempting to delete the file: {e}")
MEDIUMtest/pytests/test_main.py1998 print(f"An error occurred while attempting to delete the file: {e}")
LOWtest/pytests/test_main.py530 except Exception as e:
LOWtest/pytests/test_main.py621 except Exception as e:
LOWtest/pytests/test_main.py2238 except Exception as e:
LOWtest/pytests/test_main.py837 except Exception as e:
LOWtest/pytests/test_main.py866 except Exception as e:
LOWtest/pytests/test_main.py1997 except Exception as e:
Deep Nesting37 hits · 37 pts
SeverityFileLineSnippet
LOWmycli/cli_runner.py19
LOWmycli/config.py53
LOWmycli/clistyle.py140
LOWmycli/clistyle.py170
LOWmycli/client_connection.py37
LOWmycli/client_connection.py217
LOWmycli/sqlcompleter.py1403
LOWmycli/sqlcompleter.py1841
LOWmycli/client_query.py74
LOWmycli/output.py111
LOWmycli/output.py195
LOWmycli/sqlexecute.py126
LOWmycli/sqlexecute.py370
LOWmycli/sqlexecute.py622
LOWmycli/packages/batch_utils.py9
LOWmycli/packages/completion_engine.py632
LOWmycli/packages/completion_engine.py688
LOWmycli/packages/sql_utils.py128
LOWmycli/packages/sql_utils.py173
LOWmycli/packages/sql_utils.py221
LOWmycli/packages/filepaths.py12
LOWmycli/packages/filepaths.py113
LOWmycli/packages/tabular_output/sql_format.py30
LOWmycli/packages/special/delimitercommand.py38
LOWmycli/packages/special/llm.py47
LOWmycli/packages/special/llm.py220
LOWmycli/packages/special/iocommands.py333
LOWmycli/packages/special/iocommands.py691
LOWmycli/packages/ptoolkit/history.py27
LOWmycli/main_modes/checkup.py71
LOWmycli/main_modes/repl.py407
LOWmycli/main_modes/repl.py590
LOWmycli/main_modes/repl.py838
LOWmycli/main_modes/batch.py28
LOWmycli/main_modes/batch.py71
LOWmycli/main_modes/batch.py112
LOWmycli/main_modes/execute.py13
Cross-File Repetition5 hits · 25 pts
SeverityFileLineSnippet
HIGHtest/features/steps/crud_database.py0steps for behavioral style tests are defined in this module. each step is defined by the string decorating it. this stri
HIGHtest/features/steps/named_queries.py0steps for behavioral style tests are defined in this module. each step is defined by the string decorating it. this stri
HIGHtest/features/steps/crud_table.py0steps for behavioral style tests are defined in this module. each step is defined by the string decorating it. this stri
HIGHtest/features/steps/basic_commands.py0steps for behavioral style tests are defined in this module. each step is defined by the string decorating it. this stri
HIGHtest/features/steps/specials.py0steps for behavioral style tests are defined in this module. each step is defined by the string decorating it. this stri
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippet
MEDIUMmycli/config.py264 # Create a bytes buffer to hold the plaintext.
MEDIUMmycli/completion_refresher.py61 # Create a new sqlexecute method to populate the completions.
Dead Code2 hits · 4 pts
SeverityFileLineSnippet
MEDIUMtest/pytests/test_sqlcompleter.py428
MEDIUMtest/pytests/test_main_modes_batch.py197
Redundant / Tautological Comments2 hits · 3 pts
SeverityFileLineSnippet
LOWmycli/client_connection.py313 # Check if SQLExecute detected sandbox mode during connection
LOWtest/pytests/test_completion_refresher.py141 # Set refreshers to 0: we're not testing refresh logic here
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippet
LOWmycli/packages/completion_engine.py21# missing because not binary
Fake / Example Data2 hits · 1 pts
SeverityFileLineSnippet
LOWtest/pytests/test_main.py787 testdata = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do".split(" ")
LOWtest/pytests/test_main.py787 testdata = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do".split(" ")