Commit 82452951 authored by Michal Berger's avatar Michal Berger Committed by Tomasz Zawadzki
Browse files

python/spdk: Add simple spell checker for the RPCs

Lazily hooked into command-not-found module which already provides
simple implementation of the https://norvig.com/spell-correct.html

.

Usually shipped with ubuntu|debian where it's used by the bash's
command_not_found_handle() wrapper.

Change-Id: I97f679d1cdd225066b8e986509d1126d7caf1c40
Signed-off-by: default avatarMichal Berger <michallinuxstuff@gmail.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/25598


Reviewed-by: default avatarKarol Latecki <karol.latecki@nutanix.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
parent 3cfef20d
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -29,3 +29,33 @@ def deprecated_method(method):
            method.deprecated_warning = True
        return method(*args, **kwargs)
    return wrap


def hint_rpc_name(parser):
    try:
        from CommandNotFound.CommandNotFound import similar_words as similar_rpcs
    except (ImportError, ModuleNotFoundError):
        return parser

    def error(msg):
        srpcs = set()
        e = msg

        if "choose from " in msg:
            fmsg = msg.split("choose from ")

            bad_arg = fmsg[0].split("'")[1]
            rpcs = fmsg[1].strip().strip(")").replace("'", "").split(", ")

            for similar_rpc in similar_rpcs(bad_arg):
                if similar_rpc in rpcs:
                    srpcs.add(similar_rpc)

            if srpcs:
                e = f"'{bad_arg}' not recognized, did you mean: {', '.join(srpcs)}?"

        print(e, file=sys.stderr)
        sys.exit(2)

    parser.error = error
    return parser
+2 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ sys.path.insert(0, os.path.dirname(__file__) + '/../python')

import spdk.cli as cli  # noqa
from spdk.rpc.client import print_dict, print_json, print_array, JSONRPCClient, JSONRPCGoClient, JSONRPCException  # noqa
from spdk.rpc.helpers import deprecated_aliases  # noqa
from spdk.rpc.helpers import deprecated_aliases, hint_rpc_name  # noqa
from spdk.rpc.cmd_parser import remove_null  # noqa


@@ -165,6 +165,7 @@ def main():

    replace_arg_underscores(sys.argv)

    parser = hint_rpc_name(parser)
    args = parser.parse_args()

    try: