Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 20 additions & 6 deletions examples/dynamic_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,32 @@
"""A simple example demonstrating how do_* commands can be created in a loop.
"""
import functools

import cmd2
COMMAND_LIST = ['foo', 'bar', 'baz']
from cmd2.constants import COMMAND_FUNC_PREFIX, HELP_FUNC_PREFIX

COMMAND_LIST = ['foo', 'bar']
CATEGORY = 'Dynamic Commands'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a very nice improvement to the example. Thanks!



class CommandsInLoop(cmd2.Cmd):
"""Example of dynamically adding do_* commands."""
def __init__(self):
# Add dynamic commands before calling cmd2.Cmd's init since it validates command names
for command in COMMAND_LIST:
# Create command function and add help category to it
cmd_func = functools.partial(self.send_text, text=command)
cmd2.categorize(cmd_func, CATEGORY)

# Add command function to CLI object
cmd_func_name = COMMAND_FUNC_PREFIX + command
setattr(self, cmd_func_name, cmd_func)

# Add help function to CLI object
help_func = functools.partial(self.text_help, text=command)
help_func_name = HELP_FUNC_PREFIX + command
setattr(self, help_func_name, help_func)

super().__init__(use_ipython=True)

def send_text(self, args: cmd2.Statement, *, text: str):
Expand All @@ -21,11 +40,6 @@ def text_help(self, *, text: str):
self.poutput("Simulate sending {!r} to a server and printing the response".format(text))


for command in COMMAND_LIST:
setattr(CommandsInLoop, 'do_{}'.format(command), functools.partialmethod(CommandsInLoop.send_text, text=command))
setattr(CommandsInLoop, 'help_{}'.format(command), functools.partialmethod(CommandsInLoop.text_help, text=command))


if __name__ == '__main__':
app = CommandsInLoop()
app.cmdloop()