summaryrefslogtreecommitdiff
path: root/examples/colors.py
diff options
context:
space:
mode:
authorkotfu <kotfu@kotfu.net>2018-08-11 19:54:10 -0600
committerkotfu <kotfu@kotfu.net>2018-08-11 19:54:10 -0600
commit1daf5d2cb63145408520f39c799425a82b2ec948 (patch)
tree5b1458aaaf54b9b740974ab14cacdb5ade4e2724 /examples/colors.py
parent0053f18fade2f2148daf19975581e8372ca7a69b (diff)
downloadcmd2-git-1daf5d2cb63145408520f39c799425a82b2ec948.tar.gz
First pass at improved colorizing
- colors setting now allows Always, Terminal, Never values - poutput() and perror() honor these new settings
Diffstat (limited to 'examples/colors.py')
-rwxr-xr-xexamples/colors.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/examples/colors.py b/examples/colors.py
new file mode 100755
index 00000000..59e108b6
--- /dev/null
+++ b/examples/colors.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+# coding=utf-8
+"""
+A sample application for cmd2. Demonstrating colorized output.
+
+Experiment with the command line options on the `speak` command to see how
+different output colors ca
+
+The colors setting has three possible values:
+
+Never
+ poutput() and pfeedback() strip all ANSI escape sequences
+ which instruct the terminal to colorize output
+
+Terminal
+ (the default value) poutput() and pfeedback() do not strip any ANSI escape
+ sequences when the output is a terminal, but if the output is a pipe or a
+ file the escape sequences are stripped. If you want colorized output you
+ must add ANSI escape sequences, preferably using some python color library
+ like `plumbum.colors`, `colorama`, `blessings`, or `termcolor`.
+
+Always
+ poutput() and pfeedback() never strip ANSI escape sequences, regardless of
+ the output destination
+
+
+"""
+
+import random
+import argparse
+
+import cmd2
+from colorama import Fore, Back
+
+FG_COLORS = {
+ 'black': Fore.BLACK,
+ 'red': Fore.RED,
+ 'green': Fore.GREEN,
+ 'yellow': Fore.YELLOW,
+ 'blue': Fore.BLUE,
+ 'magenta': Fore.MAGENTA,
+ 'cyan': Fore.CYAN,
+ 'white': Fore.WHITE,
+}
+BG_COLORS ={
+ 'black': Back.BLACK,
+ 'red': Back.RED,
+ 'green': Back.GREEN,
+ 'yellow': Back.YELLOW,
+ 'blue': Back.BLUE,
+ 'magenta': Back.MAGENTA,
+ 'cyan': Back.CYAN,
+ 'white':Back.WHITE,
+}
+
+class CmdLineApp(cmd2.Cmd):
+ """Example cmd2 application demonstrating colorized output."""
+
+ # Setting this true makes it run a shell command if a cmd2/cmd command doesn't exist
+ # default_to_shell = True
+ MUMBLES = ['like', '...', 'um', 'er', 'hmmm', 'ahh']
+ MUMBLE_FIRST = ['so', 'like', 'well']
+ MUMBLE_LAST = ['right?']
+
+ def __init__(self):
+ self.multiline_commands = ['orate']
+ self.maxrepeats = 3
+
+ # Add stuff to settable and shortcuts before calling base class initializer
+ self.settable['maxrepeats'] = 'max repetitions for speak command'
+ self.shortcuts.update({'&': 'speak'})
+
+ # Set use_ipython to True to enable the "ipy" command which embeds and interactive IPython shell
+ super().__init__(use_ipython=False)
+
+ speak_parser = argparse.ArgumentParser()
+ speak_parser.add_argument('-p', '--piglatin', action='store_true', help='atinLay')
+ speak_parser.add_argument('-s', '--shout', action='store_true', help='N00B EMULATION MODE')
+ speak_parser.add_argument('-r', '--repeat', type=int, help='output [n] times')
+ speak_parser.add_argument('-f', '--fg', help='foreground color to apply to output')
+ speak_parser.add_argument('-b', '--bg', help='background color to apply to output')
+ speak_parser.add_argument('words', nargs='+', help='words to say')
+
+ @cmd2.with_argparser(speak_parser)
+ def do_speak(self, args):
+ """Repeats what you tell me to."""
+ words = []
+ for word in args.words:
+ if args.piglatin:
+ word = '%s%say' % (word[1:], word[0])
+ if args.shout:
+ word = word.upper()
+ words.append(word)
+
+ repetitions = args.repeat or 1
+
+ color_on = ''
+ if args.fg and args.fg in FG_COLORS:
+ color_on += FG_COLORS[args.fg]
+ if args.bg and args.bg in BG_COLORS:
+ color_on += BG_COLORS[args.bg]
+ color_off = Fore.RESET + Back.RESET
+
+ for i in range(min(repetitions, self.maxrepeats)):
+ # .poutput handles newlines, and accommodates output redirection too
+ self.poutput(color_on + ' '.join(words) + color_off)
+
+ do_say = do_speak # now "say" is a synonym for "speak"
+ do_orate = do_speak # another synonym, but this one takes multi-line input
+
+ mumble_parser = argparse.ArgumentParser()
+ mumble_parser.add_argument('-r', '--repeat', type=int, help='how many times to repeat')
+ mumble_parser.add_argument('-f', '--fg', help='foreground color to apply to output')
+ mumble_parser.add_argument('-b', '--bg', help='background color to apply to output')
+ mumble_parser.add_argument('words', nargs='+', help='words to say')
+
+ @cmd2.with_argparser(mumble_parser)
+ def do_mumble(self, args):
+ """Mumbles what you tell me to."""
+ color_on = ''
+ if args.fg and args.fg in FG_COLORS:
+ color_on += FG_COLORS[args.fg]
+ if args.bg and args.bg in BG_COLORS:
+ color_on += BG_COLORS[args.bg]
+ color_off = Fore.RESET + Back.RESET
+
+ repetitions = args.repeat or 1
+ for i in range(min(repetitions, self.maxrepeats)):
+ output = []
+ if random.random() < .33:
+ output.append(random.choice(self.MUMBLE_FIRST))
+ for word in args.words:
+ if random.random() < .40:
+ output.append(random.choice(self.MUMBLES))
+ output.append(word)
+ if random.random() < .25:
+ output.append(random.choice(self.MUMBLE_LAST))
+ self.poutput(color_on + ' '.join(output) + color_off)
+
+
+if __name__ == '__main__':
+ c = CmdLineApp()
+ c.cmdloop()