def dump_annotated(data, stream=None, *args, **kwargs): kwargs['Dumper'] = LineAnnotationDumper sio = StringIO() yaml.dump(data, sio, *args, **kwargs) lines = sio.getvalue().rstrip().split('\n') getvalue = None if stream is None: stream = StringIO() getvalue = stream.getvalue # write out annotations and lines, accounting for color width = max(clen(a) for a in _annotations) formats = ['%%-%ds %%s\n' % (width + cextra(a)) for a in _annotations] for f, a, l in zip(formats, _annotations, lines): stream.write(f % (a, l)) if getvalue: return getvalue()
def dump_annotated(data, stream=None, *args, **kwargs): kwargs['Dumper'] = LineAnnotationDumper sio = StringIO() yaml.dump(data, sio, *args, **kwargs) lines = sio.getvalue().rstrip().split('\n') getvalue = None if stream is None: stream = StringIO() getvalue = stream.getvalue # write out annotations and linees, accounting for color width = max(clen(a) for a in _annotations) formats = ['%%-%ds %%s\n' % (width + cextra(a)) for a in _annotations] for f, a, l in zip(formats, _annotations, lines): stream.write(f % (a, l)) if getvalue: return getvalue()
def dump_annotated(data, stream=None, *args, **kwargs): kwargs['Dumper'] = LineAnnotationDumper sio = StringIO() yaml.dump(data, sio, *args, **kwargs) # write_line_break() is not called by YAML for empty lines, so we # skip empty lines here with \n+. lines = re.split(r"\n+", sio.getvalue().rstrip()) getvalue = None if stream is None: stream = StringIO() getvalue = stream.getvalue # write out annotations and lines, accounting for color width = max(clen(a) for a in _annotations) formats = ['%%-%ds %%s\n' % (width + cextra(a)) for a in _annotations] for f, a, l in zip(formats, _annotations, lines): stream.write(f % (a, l)) if getvalue: return getvalue()
def colify(elts, **options): """Takes a list of elements as input and finds a good columnization of them, similar to how gnu ls does. This supports both uniform-width and variable-width (tighter) columns. If elts is not a list of strings, each element is first conveted using str(). Keyword arguments: output=<stream> A file object to write to. Default is sys.stdout. indent=<int> Optionally indent all columns by some number of spaces. padding=<int> Spaces between columns. Default is 2. width=<int> Width of the output. Default is 80 if tty is not detected. cols=<int> Force number of columns. Default is to size to terminal, or single-column if no tty tty=<bool> Whether to attempt to write to a tty. Default is to autodetect a tty. Set to False to force single-column output. method=<string> Method to use to fit columns. Options are variable or uniform. Variable-width columns are tighter, uniform columns are all the same width and fit less data on the screen. """ # Get keyword arguments or set defaults cols = options.pop("cols", 0) output = options.pop("output", sys.stdout) indent = options.pop("indent", 0) padding = options.pop("padding", 2) tty = options.pop("tty", None) method = options.pop("method", "variable") console_cols = options.pop("width", None) if options: raise TypeError("'%s' is an invalid keyword argument for this function." % next(options.iterkeys())) # 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 (0, ()) # environment size is of the form "<rows>x<cols>" env_size = os.environ.get("COLIFY_SIZE") if env_size: try: r, c = env_size.split("x") console_rows, console_cols = int(r), int(c) tty = True except: pass # Use only one column if not a tty. if not tty: if tty is False or not output.isatty(): cols = 1 # Specify the number of character columns to use. if not console_cols: console_rows, console_cols = terminal_size() elif type(console_cols) != int: raise ValueError("Number of columns must be an int") console_cols = max(1, console_cols - indent) # Choose a method. Variable-width colums vs uniform-width. if method == "variable": config = config_variable_cols(elts, console_cols, padding, cols) elif method == "uniform": config = config_uniform_cols(elts, console_cols, padding, cols) else: raise ValueError("method must be one of: " + allowed_methods) cols = config.cols rows = (len(elts) + cols - 1) / cols rows_last_col = len(elts) % rows for row in xrange(rows): output.write(" " * indent) for col in xrange(cols): elt = col * rows + row width = config.widths[col] + cextra(elts[elt]) fmt = "%%-%ds" % width output.write(fmt % elts[elt]) output.write("\n") row += 1 if row == rows_last_col: cols -= 1 return (config.cols, tuple(config.widths))
def colify(elts, **options): """Takes a list of elements as input and finds a good columnization of them, similar to how gnu ls does. This supports both uniform-width and variable-width (tighter) columns. If elts is not a list of strings, each element is first conveted using ``str()``. Keyword Arguments: output (stream): A file object to write to. Default is ``sys.stdout`` indent (int): Optionally indent all columns by some number of spaces padding (int): Spaces between columns. Default is 2 width (int): Width of the output. Default is 80 if tty not detected cols (int): Force number of columns. Default is to size to terminal, or single-column if no tty tty (bool): Whether to attempt to write to a tty. Default is to autodetect a tty. Set to False to force single-column output method (str): Method to use to fit columns. Options are variable or uniform. Variable-width columns are tighter, uniform columns are all the same width and fit less data on the screen """ # Get keyword arguments or set defaults cols = options.pop("cols", 0) output = options.pop("output", sys.stdout) indent = options.pop("indent", 0) padding = options.pop("padding", 2) tty = options.pop('tty', None) method = options.pop("method", "variable") console_cols = options.pop("width", None) if options: raise TypeError( "'%s' is an invalid keyword argument for this function." % next(options.iterkeys())) # elts needs to be an array of strings so we can count the elements elts = [text_type(elt) for elt in elts] if not elts: return (0, ()) # environment size is of the form "<rows>x<cols>" env_size = os.environ.get('COLIFY_SIZE') if env_size: try: r, c = env_size.split('x') console_rows, console_cols = int(r), int(c) tty = True except BaseException: pass # Use only one column if not a tty. if not tty: if tty is False or not output.isatty(): cols = 1 # Specify the number of character columns to use. if not console_cols: console_rows, console_cols = terminal_size() elif type(console_cols) != int: raise ValueError("Number of columns must be an int") console_cols = max(1, console_cols - indent) # Choose a method. Variable-width colums vs uniform-width. if method == "variable": config = config_variable_cols(elts, console_cols, padding, cols) elif method == "uniform": config = config_uniform_cols(elts, console_cols, padding, cols) else: raise ValueError("method must be either 'variable' or 'uniform'") cols = config.cols rows = (len(elts) + cols - 1) // cols rows_last_col = len(elts) % rows for row in range(rows): output.write(" " * indent) for col in range(cols): elt = col * rows + row width = config.widths[col] + cextra(elts[elt]) if col < cols - 1: fmt = '%%-%ds' % width output.write(fmt % elts[elt]) else: # Don't pad the rightmost column (sapces can wrap on # small teriminals if one line is overlong) output.write(elts[elt]) output.write("\n") row += 1 if row == rows_last_col: cols -= 1 return (config.cols, tuple(config.widths))