From b099f593d5227453b999271ec2f00d8e81ab5b86 Mon Sep 17 00:00:00 2001 From: Elena ``of Valhalla'' Grandi Date: Thu, 4 Aug 2022 18:08:52 +0200 Subject: Use hazwaz to generate command line commands --- CHANGELOG.rst | 3 ++ lesana/command.py | 117 ++++++++---------------------------------------------- scripts/lesana | 26 ++++++------ setup.py | 1 + 4 files changed, 34 insertions(+), 113 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a52ce38..19d0926 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,9 @@ Unreleased ========== +* Command line code has been split in the hazwaz library. +* Code cleanup. + 0.9.1 ===== diff --git a/lesana/command.py b/lesana/command.py index ac7eba2..8c0ac15 100644 --- a/lesana/command.py +++ b/lesana/command.py @@ -1,9 +1,10 @@ import argparse import logging import os -import subprocess import sys +import hazwaz + try: import argcomplete except ImportError: @@ -14,110 +15,20 @@ from . import Collection, Entry, TemplatingError logger = logging.getLogger(__name__) -def _get_first_docstring_line(obj): - try: - return obj.__doc__.split('\n')[1].strip() - except (AttributeError, IndexError): - return None - - -class MainCommand: - commands = () - - def _main(self, args): - self.parser.print_help() - - def main(self): - desc = _get_first_docstring_line(self) - self.parser = argparse.ArgumentParser(description=desc) - self.parser.add_argument('--verbose', '-v', - action='store_true', - help="Display debug messages") - self.parser.set_defaults(func=self._main) - self.subparsers = self.parser.add_subparsers() - for name, sub in self.commands: - sub_help = _get_first_docstring_line(sub) - s_parser = self.subparsers.add_parser( - name, - help=sub_help, - description=sub.__doc__, - ) - for arg in sub.arguments: - s_parser.add_argument(*arg[0], **arg[1]) - s_parser.set_defaults(func=sub._main) - if argcomplete: - argcomplete.autocomplete(self.parser) - self.args = self.parser.parse_args() - - if self.args.verbose: - logging.getLogger('lesana').setLevel(logging.DEBUG) - - self.args.func(self.args) - - -class Command: +class Command(hazwaz.Command): def __init__(self, collection_class=Collection, entry_class=Entry): + super().__init__() self.collection_class = collection_class self.entry_class = entry_class - def _main(self, args): - self.args = args - self.main() - - def edit_file_in_external_editor(self, filepath): - # First we try to use $EDITOR - editor = os.environ.get('EDITOR') - if editor: - try: - subprocess.call([editor, filepath]) - except FileNotFoundError as e: - if editor in str(e): - logger.info( - 'Could not open file {} with $EDITOR (currently {})' - .format( - filepath, editor - ) - ) - else: - logger.warning("Could not open file {}".format(filepath)) - return False - else: - return True - # then we try to use sensible-editor (which should be available on - # debian and derivatives) - try: - subprocess.call(['sensible-editor', filepath]) - except FileNotFoundError as e: - if 'sensible-editor' in e.strerror: - logger.debug( - "Could not open file {} with editor: sensible-editor" - .format(filepath) - ) - else: - logger.warning("Could not open file {}".format(filepath)) - return False - else: - return True - # and finally we fallback to vi, because ed is the standard editor, - # but that would be way too cruel, and vi is also in posix - try: - subprocess.call(['vi', filepath]) - except FileNotFoundError as e: - if 'vi' in e.strerror: - logger.warning( - "Could not open file {} with any known editor".format( - filepath - ) - ) - return False - else: - logger.warning("Could not open file {}".format(filepath)) - return False - else: - return True + def add_arguments(self, parser: argparse.ArgumentParser): + # compatibility with the old way to add arguments: for new + # commands override add_arguments directly + for arg in self.arguments: + parser.add_argument(*arg[0], **arg[1]) -class New(Command): +class New(Command, hazwaz.mixins.ExternalEditorMixin): """ Create a new entry """ @@ -149,7 +60,7 @@ class New(Command): print(saved_entry) -class Edit(Command): +class Edit(Command, hazwaz.mixins.ExternalEditorMixin): """ Edit a lesana entry """ @@ -358,6 +269,8 @@ class GetValues(Command): """ List all values for one field, with entry counts. """ + name = "get-values" + arguments = [ ( ['--collection', '-c'], @@ -451,7 +364,7 @@ class Export(Command): sys.exit(1) -class Init(Command): +class Init(Command, hazwaz.mixins.ExternalEditorMixin): """ Initialize a lesana collection """ @@ -482,6 +395,8 @@ class Remove(Command): """ Remove an entry from a collection """ + name = "rm" + arguments = [ ( ['--collection', '-c'], diff --git a/scripts/lesana b/scripts/lesana index ed6084a..5c84d56 100755 --- a/scripts/lesana +++ b/scripts/lesana @@ -4,25 +4,27 @@ Lesana Command Line interface """ import logging +import hazwaz + import lesana.command -class Lesana(lesana.command.MainCommand): +class Lesana(hazwaz.MainCommand): """ Manage collections """ commands = ( - ("new", lesana.command.New()), - ("edit", lesana.command.Edit()), - ("show", lesana.command.Show()), - ("index", lesana.command.Index()), - ("search", lesana.command.Search()), - ("get-values", lesana.command.GetValues()), - ("update", lesana.command.Update()), - ("export", lesana.command.Export()), - ("init", lesana.command.Init()), - ("rm", lesana.command.Remove()), + lesana.command.New(), + lesana.command.Edit(), + lesana.command.Show(), + lesana.command.Index(), + lesana.command.Search(), + lesana.command.GetValues(), + lesana.command.Update(), + lesana.command.Export(), + lesana.command.Init(), + lesana.command.Remove(), ) @@ -36,4 +38,4 @@ if __name__ == "__main__": logger.addHandler(ch) logger.setLevel(logging.INFO) - Lesana().main() + Lesana().run() diff --git a/setup.py b/setup.py index edbec63..ec85f17 100644 --- a/setup.py +++ b/setup.py @@ -21,6 +21,7 @@ setup( 'ruamel.yaml', 'jinja2', 'python-dateutil', + 'hazwaz', ], python_requires='>=3', # Metadata -- cgit v1.2.3