Minor argparse improvement.

This commit is contained in:
Todd Gamblin 2014-09-29 20:00:00 -07:00
parent 1b67c8493e
commit a8ed1ec414
2 changed files with 21 additions and 6 deletions

View File

@ -108,6 +108,8 @@
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 @@ def _get_value(self, action, arg_string):
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)
# =======================

View File

@ -37,9 +37,11 @@
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