import cmd2
import argparse

class DemoApp(cmd2.Cmd):
    """A cmd2 demo application."""

    greet_parser = argparse.ArgumentParser()
    greet_parser.add_argument('name', nargs='?', default='World')
    greet_parser.add_argument('--upper', action='store_true')

    @cmd2.with_argparser(greet_parser)
    def do_greet(self, args):
        """Greet someone. Usage: greet [name] [--upper]"""
        msg = f'Hello, {args.name}!'
        self.poutput(msg.upper() if args.upper else msg)

    def do_upper(self, args: cmd2.Statement):
        """Convert text to uppercase."""
        self.poutput(str(args).upper())

    def do_reverse(self, args: cmd2.Statement):
        """Reverse a string."""
        self.poutput(str(args)[::-1])

if __name__ == '__main__':
    import sys
    app = DemoApp()
    sys.exit(app.cmdloop())