Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
Upcoming Release (TBD)
======================

Internal
--------

* Work on passing `ruff check` linting.


1.31.2 (2025/05/01)
===================

Expand Down
5 changes: 3 additions & 2 deletions mycli/clibuffer.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from prompt_toolkit.application import get_app
from prompt_toolkit.enums import DEFAULT_BUFFER
from prompt_toolkit.filters import Condition
from prompt_toolkit.application import get_app
from .packages import special

from mycli.packages import special


def cli_is_multiline(mycli):
Expand Down
8 changes: 4 additions & 4 deletions mycli/clistyle.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import logging

import pygments.styles
from pygments.token import string_to_tokentype, Token
from prompt_toolkit.styles import Style, merge_styles
from prompt_toolkit.styles.pygments import style_from_pygments_cls
from pygments.style import Style as PygmentsStyle
import pygments.styles
from pygments.token import Token, string_to_tokentype
from pygments.util import ClassNotFound
from prompt_toolkit.styles.pygments import style_from_pygments_cls
from prompt_toolkit.styles import merge_styles, Style

logger = logging.getLogger(__name__)

Expand Down
5 changes: 3 additions & 2 deletions mycli/clitoolbar.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from prompt_toolkit.key_binding.vi_state import InputMode
from prompt_toolkit.application import get_app
from prompt_toolkit.enums import EditingMode
from .packages import special
from prompt_toolkit.key_binding.vi_state import InputMode

from mycli.packages import special


def create_toolbar_tokens_func(mycli, show_fish_help):
Expand Down
1 change: 0 additions & 1 deletion mycli/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@

import sys


WIN = sys.platform in ("win32", "cygwin")
8 changes: 4 additions & 4 deletions mycli/completion_refresher.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import threading
from .packages.special.main import COMMANDS
from collections import OrderedDict
import threading

from .sqlcompleter import SQLCompleter
from .sqlexecute import SQLExecute, ServerSpecies
from mycli.packages.special.main import COMMANDS
from mycli.sqlcompleter import SQLCompleter
from mycli.sqlexecute import ServerSpecies, SQLExecute


class CompletionRefresher(object):
Expand Down
3 changes: 1 addition & 2 deletions mycli/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@
from os.path import exists
import struct
import sys
from typing import Union, IO
from typing import IO, Union

from configobj import ConfigObj, ConfigObjError
import pyaes


logger = logging.getLogger(__name__)


Expand Down
3 changes: 2 additions & 1 deletion mycli/key_bindings.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import logging

from prompt_toolkit.enums import EditingMode
from prompt_toolkit.filters import completion_is_selected, emacs_mode
from prompt_toolkit.key_binding import KeyBindings

from .packages.toolkit.fzf import search_history
from mycli.packages.toolkit.fzf import search_history

_logger = logging.getLogger(__name__)

Expand Down
8 changes: 5 additions & 3 deletions mycli/magic.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from .main import MyCli
import sql.parse
import sql.connection
import logging

import sql.connection
import sql.parse

from mycli.main import MyCli

_logger = logging.getLogger(__name__)


Expand Down
84 changes: 39 additions & 45 deletions mycli/main.py
Original file line number Diff line number Diff line change
@@ -1,73 +1,67 @@
from collections import defaultdict
from collections import defaultdict, namedtuple
import logging
import os
import sys
import re
import shutil
import traceback
import logging
import sys
import threading
import re
from collections import namedtuple
import traceback

try:
from pwd import getpwuid
except ImportError:
pass
from time import time
from datetime import datetime
from importlib import resources
import itertools
from random import choice
from time import time
from urllib.parse import unquote, urlparse

from pymysql import OperationalError
from cli_helpers.tabular_output import TabularOutputFormatter
from cli_helpers.tabular_output import preprocessors
from cli_helpers.tabular_output import TabularOutputFormatter, preprocessors
from cli_helpers.utils import strip_ansi
import click
import sqlparse
import sqlglot
from mycli.packages.parseutils import is_dropping_database, is_destructive
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.completion import DynamicCompleter
from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode
from prompt_toolkit.key_binding.bindings.named_commands import register as prompt_register
from prompt_toolkit.shortcuts import PromptSession, CompleteStyle
from prompt_toolkit.document import Document
from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode
from prompt_toolkit.filters import HasFocus, IsDone
from prompt_toolkit.formatted_text import ANSI
from prompt_toolkit.layout.processors import HighlightMatchingBracketProcessor, ConditionalProcessor
from prompt_toolkit.key_binding.bindings.named_commands import register as prompt_register
from prompt_toolkit.layout.processors import ConditionalProcessor, HighlightMatchingBracketProcessor
from prompt_toolkit.lexers import PygmentsLexer
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory

from .packages.special.main import NO_QUERY
from .packages.prompt_utils import confirm, confirm_destructive_query
from .packages.tabular_output import sql_format
from .packages import special
from .packages.special.favoritequeries import FavoriteQueries
from .packages.toolkit.history import FileHistoryWithTimestamp
from .sqlcompleter import SQLCompleter
from .clitoolbar import create_toolbar_tokens_func
from .clistyle import style_factory, style_factory_output
from .sqlexecute import FIELD_TYPES, SQLExecute, ERROR_CODE_ACCESS_DENIED
from .clibuffer import cli_is_multiline
from .completion_refresher import CompletionRefresher
from .config import write_default_config, get_mylogin_cnf_path, open_mylogin_cnf, read_config_files, str_to_bool, strip_matching_quotes
from .key_bindings import mycli_bindings
from .lexer import MyCliLexer
from . import __version__
from .compat import WIN
from .packages.filepaths import dir_path_exists, guess_socket_location

import itertools

click.disable_unicode_literals_warning = True

from urllib.parse import urlparse
from urllib.parse import unquote
from prompt_toolkit.shortcuts import CompleteStyle, PromptSession
from pymysql import OperationalError
import sqlglot
import sqlparse

from importlib import resources
from mycli import __version__
from mycli.clibuffer import cli_is_multiline
from mycli.clistyle import style_factory, style_factory_output
from mycli.clitoolbar import create_toolbar_tokens_func
from mycli.compat import WIN
from mycli.completion_refresher import CompletionRefresher
from mycli.config import get_mylogin_cnf_path, open_mylogin_cnf, read_config_files, str_to_bool, strip_matching_quotes, write_default_config
from mycli.key_bindings import mycli_bindings
from mycli.lexer import MyCliLexer
from mycli.packages import special
from mycli.packages.filepaths import dir_path_exists, guess_socket_location
from mycli.packages.parseutils import is_destructive, is_dropping_database
from mycli.packages.prompt_utils import confirm, confirm_destructive_query
from mycli.packages.special.favoritequeries import FavoriteQueries
from mycli.packages.special.main import NO_QUERY
from mycli.packages.tabular_output import sql_format
from mycli.packages.toolkit.history import FileHistoryWithTimestamp
from mycli.sqlcompleter import SQLCompleter
from mycli.sqlexecute import ERROR_CODE_ACCESS_DENIED, FIELD_TYPES, SQLExecute

try:
import paramiko
except ImportError:
from mycli.packages.paramiko_stub import paramiko

click.disable_unicode_literals_warning = True

# Query tuples are used for maintaining history
Query = namedtuple("Query", ["query", "successful", "mutating"])

Expand Down
5 changes: 3 additions & 2 deletions mycli/packages/completion_engine.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import sqlparse
from sqlparse.sql import Comparison, Identifier, Where
from .parseutils import last_word, extract_tables, find_prev_keyword
from .special import parse_special_command

from mycli.packages.parseutils import extract_tables, find_prev_keyword, last_word
from mycli.packages.special import parse_special_command


def suggest_type(full_text, text_before_cursor):
Expand Down
1 change: 0 additions & 1 deletion mycli/packages/filepaths.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import os
import platform


if os.name == "posix":
if platform.system() == "Darwin":
DEFAULT_SOCKET_DIRS = ["/tmp"]
Expand Down
5 changes: 3 additions & 2 deletions mycli/packages/parseutils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import re

import sqlglot
import sqlparse
from sqlparse.sql import IdentifierList, Identifier, Function
from sqlparse.tokens import Keyword, DML, Punctuation
from sqlparse.sql import Function, Identifier, IdentifierList
from sqlparse.tokens import DML, Keyword, Punctuation

cleanup_regex = {
# This matches only alphanumerics and underscores.
Expand Down
4 changes: 3 additions & 1 deletion mycli/packages/prompt_utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import sys

import click
from .parseutils import is_destructive

from mycli.packages.parseutils import is_destructive


class ConfirmBoolParamType(click.ParamType):
Expand Down
6 changes: 4 additions & 2 deletions mycli/packages/special/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ def export(defn):
return defn


from . import dbcommands # noqa: E402 F401
from . import iocommands # noqa: E402 F401
from mycli.packages.special import (
dbcommands, # noqa: E402 F401
iocommands, # noqa: E402 F401
)
6 changes: 4 additions & 2 deletions mycli/packages/special/dbcommands.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import logging
import os
import platform

from pymysql import ProgrammingError

from mycli import __version__
from mycli.packages.special import iocommands
from mycli.packages.special.main import PARSED_QUERY, RAW_QUERY, special_command
from mycli.packages.special.utils import format_uptime
from .main import special_command, RAW_QUERY, PARSED_QUERY
from pymysql import ProgrammingError

log = logging.getLogger(__name__)

Expand Down
1 change: 1 addition & 0 deletions mycli/packages/special/delimitercommand.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import re

import sqlparse


Expand Down
16 changes: 8 additions & 8 deletions mycli/packages/special/iocommands.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import os
import re
import locale
import logging
import subprocess
import os
import re
import shlex
import subprocess
from time import sleep

import click
import pyperclip
import sqlparse

from . import export
from .main import special_command, NO_QUERY, PARSED_QUERY
from .favoritequeries import FavoriteQueries
from .delimitercommand import DelimiterCommand
from .utils import handle_cd_command
from mycli.packages.prompt_utils import confirm_destructive_query
from mycli.packages.special import export
from mycli.packages.special.delimitercommand import DelimiterCommand
from mycli.packages.special.favoritequeries import FavoriteQueries
from mycli.packages.special.main import NO_QUERY, PARSED_QUERY, special_command
from mycli.packages.special.utils import handle_cd_command

TIMING_ENABLED = False
use_expanded_output = False
Expand Down
4 changes: 2 additions & 2 deletions mycli/packages/special/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging
from collections import namedtuple
import logging

from . import export
from mycli.packages.special import export

log = logging.getLogger(__name__)

Expand Down
4 changes: 2 additions & 2 deletions mycli/packages/toolkit/fzf.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import re
from shutil import which

from pyfzf import FzfPrompt
from prompt_toolkit import search
from prompt_toolkit.key_binding.key_processor import KeyPressEvent
from pyfzf import FzfPrompt

from .history import FileHistoryWithTimestamp
from mycli.packages.toolkit.history import FileHistoryWithTimestamp


class Fzf(FzfPrompt):
Expand Down
2 changes: 1 addition & 1 deletion mycli/packages/toolkit/history.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import os
from typing import Union, List, Tuple
from typing import List, Tuple, Union

from prompt_toolkit.history import FileHistory

Expand Down
10 changes: 5 additions & 5 deletions mycli/sqlcompleter.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from collections import Counter
import logging
import re
from collections import Counter

from prompt_toolkit.completion import Completer, Completion

from .packages.completion_engine import suggest_type
from .packages.parseutils import last_word
from .packages.filepaths import parse_path, complete_path, suggest_path
from .packages.special.favoritequeries import FavoriteQueries
from mycli.packages.completion_engine import suggest_type
from mycli.packages.filepaths import complete_path, parse_path, suggest_path
from mycli.packages.parseutils import last_word
from mycli.packages.special.favoritequeries import FavoriteQueries

_logger = logging.getLogger(__name__)

Expand Down
5 changes: 3 additions & 2 deletions mycli/sqlexecute.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
import re

import pymysql
from .packages import special
from pymysql.constants import FIELD_TYPE
from pymysql.converters import convert_datetime, convert_timedelta, convert_date, conversions, decoders
from pymysql.converters import conversions, convert_date, convert_datetime, convert_timedelta, decoders

from mycli.packages import special

try:
import paramiko # noqa: F401
Expand Down
Loading