summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorTodd Leonhardt <todd.leonhardt@gmail.com>2018-01-20 11:54:43 -0500
committerTodd Leonhardt <todd.leonhardt@gmail.com>2018-01-20 11:54:43 -0500
commit136de7e22fa04ed41fc37b8a6c900cf507db8f26 (patch)
tree4f4f4662a6075398b2a7d2de9db7083406d3506a /examples
parent7b564b4424accfbd7439de10a169d9b64bc599c5 (diff)
downloadcmd2-git-136de7e22fa04ed41fc37b8a6c900cf507db8f26.tar.gz
Added support for argparse sub-commands when using cmd2 decorators
Modified the do_help() method to behave differently for methods which have been decorated with an argparse ArgumentParser. This is so that help will properly deal with sub-command help. Suppose you have a base command "base" which has two sub-commands, "foo" and "bar". Then "help base" will provide very different help text than "help base foo". Slightly tweaked the two argparse decorators to set an attribute in the decorated function's dictionary so that the do_help method can know which functions have an ArgumentParser and which do not. Added a "subcommands.py" example for demonstrating how to create and use subcommands based on argparse and the cmd2 @with_argument_parser decorator.
Diffstat (limited to 'examples')
-rwxr-xr-xexamples/subcommands.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/examples/subcommands.py b/examples/subcommands.py
new file mode 100755
index 00000000..347cb61d
--- /dev/null
+++ b/examples/subcommands.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+# coding=utf-8
+"""A simple example demonstrating how to use Argparse to support sub-commands.
+
+
+This example shows an easy way for a single command to have many subcommands, each of which takes different arguments
+and provides separate contextual help.
+"""
+import argparse
+
+import cmd2
+from cmd2 import with_argument_parser
+
+
+class SubcommandsExample(cmd2.Cmd):
+ """ Example cmd2 application where we a base command which has a couple subcommands."""
+
+ def __init__(self):
+ cmd2.Cmd.__init__(self)
+
+ # sub-command functions for the base command
+ def foo(self, args):
+ """foo subcommand of base command"""
+ print(args.x * args.y)
+
+ def bar(self, args):
+ """bar sucommand of base command"""
+ print('((%s))' % args.z)
+
+ # create the top-level parser
+ base_parser = argparse.ArgumentParser(prog='base')
+ base_subparsers = base_parser.add_subparsers(title='subcommands', help='subcommand help')
+
+ # create the parser for the "foo" command
+ parser_foo = base_subparsers.add_parser('foo', help='foo help')
+ parser_foo.add_argument('-x', type=int, default=1, help='integer')
+ parser_foo.add_argument('y', type=float, help='float')
+ parser_foo.set_defaults(func=foo)
+
+ # create the parser for the "bar" command
+ parser_bar = base_subparsers.add_parser('bar', help='bar help')
+ parser_bar.add_argument('z', help='string')
+ parser_bar.set_defaults(func=bar)
+
+ @with_argument_parser(base_parser)
+ def do_base(self, args):
+ """Base command help"""
+ try:
+ # Call whatever sub-command function was selected
+ args.func(self, args)
+ except AttributeError:
+ # No sub-command was provided, so as called
+ self.do_help('base')
+
+
+if __name__ == '__main__':
+ app = SubcommandsExample()
+ app.cmdloop()