#! /usr/bin/python2.6 # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. # import zfs.util class Table: __slots__ = "fields", "rjustfields", "maxfieldlen", "lines" __repr__ = zfs.util.default_repr def __init__(self, fields, rjustfields=()): # XXX maybe have a defaults, too? self.fields = fields self.rjustfields = rjustfields self.maxfieldlen = dict.fromkeys(fields, 0) self.lines = list() def __updatemax(self, k, v): self.maxfieldlen[k] = max(self.maxfieldlen.get(k, None), v) def addline(self, sortkey, values): """values is a dict from field name to value""" va = list() for f in self.fields: v = str(values[f]) va.append(v) self.__updatemax(f, len(v)) self.lines.append((sortkey, va)) def printme(self, headers=True): if headers: d = dict([(f, f.upper()) for f in self.fields]) self.addline(None, d) self.lines.sort() for (k, va) in self.lines: line = str() for i in range(len(self.fields)): if not headers: line += va[i] line += "\t" else: if self.fields[i] in self.rjustfields: fmt = "%*s " else: fmt = "%-*s " mfl = self.maxfieldlen[self.fields[i]] line += fmt % (mfl, va[i]) print(line) |