From a8ed1ec414c678683628a603a1bb3c76d1319ea6 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 29 Sep 2014 20:00:00 -0700 Subject: Minor argparse improvement. --- lib/spack/external/argparse.py | 6 ++++-- lib/spack/llnl/util/tty/colify.py | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/spack/external/argparse.py b/lib/spack/external/argparse.py index c8dfdd3bed..42b64ee7be 100644 --- a/lib/spack/external/argparse.py +++ b/lib/spack/external/argparse.py @@ -108,6 +108,8 @@ import re as _re import sys as _sys import textwrap as _textwrap +from llnl.util.tty.colify import colified + from gettext import gettext as _ try: @@ -2285,8 +2287,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def _check_value(self, action, value): # converted value must be one of the choices (if specified) if action.choices is not None and value not in action.choices: - tup = value, ', '.join(map(repr, action.choices)) - msg = _('invalid choice: %r (choose from %s)') % tup + cols = colified(sorted(action.choices), indent=4, tty=True) + msg = _('invalid choice: %r choose from:\n%s') % (value, cols) raise ArgumentError(action, msg) # ======================= diff --git a/lib/spack/llnl/util/tty/colify.py b/lib/spack/llnl/util/tty/colify.py index 1b04f1012f..5586b2681a 100644 --- a/lib/spack/llnl/util/tty/colify.py +++ b/lib/spack/llnl/util/tty/colify.py @@ -37,9 +37,11 @@ import sys import fcntl import termios import struct +from StringIO import StringIO from llnl.util.tty import terminal_size + class ColumnConfig: def __init__(self, cols): self.cols = cols @@ -102,16 +104,18 @@ def colify(elts, **options): output = options.get("output", sys.stdout) indent = options.get("indent", 0) padding = options.get("padding", 2) + tty = options.get('tty', None) # elts needs to be an array of strings so we can count the elements elts = [str(elt) for elt in elts] if not elts: return - if not isatty(output): - for elt in elts: - output.write("%s\n" % elt) - return + if not tty: + if tty is False or not isatty(output): + for elt in elts: + output.write("%s\n" % elt) + return console_cols = options.get("cols", None) if not console_cols: @@ -147,6 +151,15 @@ def colify(elts, **options): cols -= 1 +def colified(elts, **options): + """Invokes the colify() function but returns the result as a string + instead of writing it to an output string.""" + sio = StringIO() + options['output'] = sio + colify(elts, **options) + return sio.getvalue() + + if __name__ == "__main__": import optparse -- cgit v1.2.3-70-g09d2