diff options
| author | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2022-08-04 18:08:52 +0200 | 
|---|---|---|
| committer | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2022-08-04 18:08:52 +0200 | 
| commit | b099f593d5227453b999271ec2f00d8e81ab5b86 (patch) | |
| tree | 7e20c335bd6ff89c2bb15122b5abef2cb6351f5e | |
| parent | 1fe460ea2d1339358ea9cd4c909151ed7eccdcfc (diff) | |
Use hazwaz to generate command line commands
| -rw-r--r-- | CHANGELOG.rst | 3 | ||||
| -rw-r--r-- | lesana/command.py | 117 | ||||
| -rwxr-xr-x | scripts/lesana | 26 | ||||
| -rw-r--r-- | 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() @@ -21,6 +21,7 @@ setup(          'ruamel.yaml',          'jinja2',          'python-dateutil', +        'hazwaz',      ],      python_requires='>=3',      # Metadata  | 
