File: dynamic_commands.py

package info (click to toggle)
cmd2 3.2.0%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 2,664 kB
  • sloc: python: 17,488; makefile: 114; sh: 39; javascript: 7
file content (48 lines) | stat: -rwxr-xr-x 1,615 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python3
"""A simple example demonstrating how do_* commands can be created in a loop."""

import functools

import cmd2
from cmd2.constants import (
    COMMAND_FUNC_PREFIX,
    HELP_FUNC_PREFIX,
)

COMMAND_LIST = ['foo', 'bar']
CATEGORY = 'Dynamic Commands'


class CommandsInLoop(cmd2.Cmd):
    """Example of dynamically adding do_* commands."""

    def __init__(self) -> None:
        # 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__(include_ipy=True)

    def send_text(self, _args: cmd2.Statement, *, text: str) -> None:
        """Simulate sending text to a server and printing the response."""
        self.poutput(text.capitalize())

    def text_help(self, *, text: str) -> None:
        """Deal with printing help for the dynamically added commands."""
        self.poutput(f"Simulate sending {text!r} to a server and printing the response")


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