diff options
| -rw-r--r-- | lesana/command.py | 58 | ||||
| -rwxr-xr-x | scripts/lesana | 17 | 
2 files changed, 57 insertions, 18 deletions
| diff --git a/lesana/command.py b/lesana/command.py index 407544a..85ed73b 100644 --- a/lesana/command.py +++ b/lesana/command.py @@ -1,3 +1,4 @@ +import argparse  import logging  import os  import subprocess @@ -58,9 +59,35 @@ def edit_file_in_external_editor(filepath):          return True -class Command: -    help = '' +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.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) +            for arg in sub.arguments: +                s_parser.add_argument(*arg[0], **arg[1]) +            s_parser.set_defaults(func=sub._main) +        self.args = self.parser.parse_args() +        self.args.func(self.args) + +class Command:      def __init__(self, collection_class=Collection, entry_class=Entry):          self.collection_class = collection_class          self.entry_class = entry_class @@ -71,6 +98,9 @@ class Command:  class New(Command): +    """ +    Create a new entry +    """      arguments = [          (              ['--collection', '-c'], @@ -100,6 +130,9 @@ class New(Command):  class Edit(Command): +    """ +    Edit a lesana entry +    """      arguments = [          (              ['--collection', '-c'], @@ -136,6 +169,9 @@ class Edit(Command):  class Show(Command): +    """ +    Show a lesana entry +    """      arguments = [          (              ['--collection', '-c'], @@ -169,6 +205,9 @@ class Show(Command):  class Index(Command): +    """ +    Index entries in a lesana collection +    """      arguments = [          (              ['--collection', '-c'], @@ -195,6 +234,9 @@ class Index(Command):  class Search(Command): +    """ +    Search for entries +    """      arguments = [          (              ['--collection', '-c'], @@ -252,6 +294,9 @@ class Search(Command):  class Export(Command): +    """ +    Export entries to a different collection +    """      arguments = [          (              ['--collection', '-c'], @@ -292,6 +337,9 @@ class Export(Command):  class Init(Command): +    """ +    Initialize a lesana collection +    """      arguments = [          (              ['--collection', '-c'], @@ -316,6 +364,9 @@ class Init(Command):  class Remove(Command): +    """ +    Remove an entry from a collection +    """      arguments = [          (              ['--collection', '-c'], @@ -330,6 +381,9 @@ class Remove(Command):  class Update(Command): +    """ +    Update a field in multiple entries +    """      arguments = [          (              ['--collection', '-c'], diff --git a/scripts/lesana b/scripts/lesana index c8e6b7f..8e34179 100755 --- a/scripts/lesana +++ b/scripts/lesana @@ -8,7 +8,7 @@ import argparse  import lesana.command -class Lesana: +class Lesana(lesana.command.MainCommand):      """      Manage collections      """ @@ -25,21 +25,6 @@ class Lesana:          ("rm", lesana.command.Remove()),      ) -    def _main(self, args): -        self.parser.print_help() - -    def main(self): -        self.parser = argparse.ArgumentParser() -        self.parser.set_defaults(func=self._main) -        self.subparsers = self.parser.add_subparsers() -        for name, sub in self.commands: -            s_parser = self.subparsers.add_parser(name, help=sub.help) -            for arg in sub.arguments: -                s_parser.add_argument(*arg[0], **arg[1]) -            s_parser.set_defaults(func=sub._main) -        self.args = self.parser.parse_args() -        self.args.func(self.args) -  if __name__ == "__main__":      Lesana().main() | 
