diff options
author | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2020-09-16 12:43:40 +0200 |
---|---|---|
committer | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2020-09-16 12:43:40 +0200 |
commit | 6cce5380ef1585f72dc4083297932489f793ca0b (patch) | |
tree | ced8c374c1a3a0c162c8898c08f71657f15d5222 | |
parent | c7b332764115de5c41a518c64ce902adc3b9b924 (diff) |
Make the main command boilerplate available to library users.
-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() |