From 638085ce982ce74d1b6b406a2292016cbf34524f Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Sun, 14 Jan 2024 22:27:18 +0100 Subject: [PATCH] repl --- catcli/catcli.py | 92 ++++++++++++++++++++++++++++++++++++++++++++---- requirements.txt | 2 ++ 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/catcli/catcli.py b/catcli/catcli.py index 8aed08f..c7d8a9a 100755 --- a/catcli/catcli.py +++ b/catcli/catcli.py @@ -12,7 +12,9 @@ import sys import os import datetime from typing import Dict, Any, List +import typing from docopt import docopt +import cmd2 # local imports from catcli.version import __version__ as VERSION @@ -54,6 +56,7 @@ Usage: {NAME} rename [--catalog=] [-BCfV] {NAME} edit [--catalog=] [-BCfV] {NAME} graph [--catalog=] [-BCV] [] + {NAME} [--catalog=] {NAME} fixsizes [--catalog=] {NAME} print_supported_formats {NAME} help @@ -294,6 +297,73 @@ def cmd_edit(args: Dict[str, Any], Logger.err(f'Storage named \"{storage}\" does not exist') +@typing.no_type_check +class CatcliRepl(cmd2.Cmd): + """catcli repl""" + + prompt = 'catcli> ' + intro = '' + + def __init__(self): + super().__init__() + # remove built-ins + del cmd2.Cmd.do_alias + del cmd2.Cmd.do_edit + del cmd2.Cmd.do_macro + del cmd2.Cmd.do_run_pyscript + del cmd2.Cmd.do_run_script + del cmd2.Cmd.do_set + del cmd2.Cmd.do_shell + del cmd2.Cmd.do_shortcuts + self.hidden_commands.append('EOF') + + def cmdloop(self, intro=None): + return cmd2.Cmd.cmdloop(self, intro) + + @cmd2.with_argument_list + def do_ls(self, arglist: List[str]): + """ls """ + arglist.insert(0, '--no-banner') + arglist.insert(0, 'ls') + args, noder, _, _, top = init(arglist) + cmd_ls(args, noder, top) + return False + + @cmd2.with_argument_list + def do_tree(self, arglist): + """tree """ + arglist.insert(0, '--no-banner') + arglist.insert(0, 'tree') + args, noder, _, _, top = init(arglist) + cmd_ls(args, noder, top) + + @cmd2.with_argument_list + def do_find(self, arglist): + """find """ + arglist.insert(0, '--no-banner') + arglist.insert(0, 'find') + args, noder, _, _, top = init(arglist) + cmd_find(args, noder, top) + + @cmd2.with_argument_list + def do_du(self, arglist): + """du """ + arglist.insert(0, '--no-banner') + arglist.insert(0, 'du') + args, noder, _, _, top = init(arglist) + cmd_du(args, noder, top) + + def do_help(self, _): + """help""" + print(USAGE) + return False + + # pylint: disable=C0103 + def do_EOF(self, _): + """exit repl""" + return True + + def banner() -> None: """print banner""" Logger.stderr_nocolor(BANNER) @@ -309,24 +379,23 @@ def print_supported_formats() -> None: print('"fzf-csv" : fzf to csv (only valid for find)') -def main() -> bool: - """entry point""" - args = docopt(USAGE, version=VERSION) +def init(args): + """parse catcli arguments""" + args = docopt(USAGE, argv=args, version=VERSION) if args['help'] or args['--help']: print(USAGE) - return True + sys.exit(0) if args['print_supported_formats']: print_supported_formats() - return True + sys.exit(0) - # check format fmt = args['--format'] if fmt not in FORMATS: Logger.err(f'bad format: {fmt}') print_supported_formats() - return False + sys.exit(0) if args['--verbose']: print(f'args: {args}') @@ -355,6 +424,13 @@ def main() -> bool: meta = noder.update_metanode(top) catalog.set_metanode(meta) + return args, noder, catalog, catalog_path, top + + +def main() -> bool: + """entry point""" + args, noder, catalog, catalog_path, top = init(sys.argv[1:]) + # parse command try: if args['index']: @@ -417,6 +493,8 @@ def main() -> bool: Logger.err(f'no such catalog: {catalog_path}') return False cmd_fixsizes(top, noder, catalog) + else: + CatcliRepl().cmdloop() except CatcliException as exc: Logger.stderr_nocolor('ERROR ' + str(exc)) return False diff --git a/requirements.txt b/requirements.txt index d9cfeb9..f4f334e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,5 @@ anytree; python_version >= '3.0' pyfzf; python_version >= '3.0' fusepy; python_version >= '3.0' natsort; python_version >= '3.0' +cmd2; python_version >= '3.0' +gnureadline; python_version >= '3.0'