xref: /freebsd-src/cddl/contrib/opensolaris/lib/pyzfs/common/table.py (revision 10b9d77bf1ccf2f3affafa6261692cb92cf7e992)
1*10b9d77bSPawel Jakub Dawidek#! /usr/bin/python2.6
2*10b9d77bSPawel Jakub Dawidek#
3*10b9d77bSPawel Jakub Dawidek# CDDL HEADER START
4*10b9d77bSPawel Jakub Dawidek#
5*10b9d77bSPawel Jakub Dawidek# The contents of this file are subject to the terms of the
6*10b9d77bSPawel Jakub Dawidek# Common Development and Distribution License (the "License").
7*10b9d77bSPawel Jakub Dawidek# You may not use this file except in compliance with the License.
8*10b9d77bSPawel Jakub Dawidek#
9*10b9d77bSPawel Jakub Dawidek# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*10b9d77bSPawel Jakub Dawidek# or http://www.opensolaris.org/os/licensing.
11*10b9d77bSPawel Jakub Dawidek# See the License for the specific language governing permissions
12*10b9d77bSPawel Jakub Dawidek# and limitations under the License.
13*10b9d77bSPawel Jakub Dawidek#
14*10b9d77bSPawel Jakub Dawidek# When distributing Covered Code, include this CDDL HEADER in each
15*10b9d77bSPawel Jakub Dawidek# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*10b9d77bSPawel Jakub Dawidek# If applicable, add the following below this CDDL HEADER, with the
17*10b9d77bSPawel Jakub Dawidek# fields enclosed by brackets "[]" replaced with your own identifying
18*10b9d77bSPawel Jakub Dawidek# information: Portions Copyright [yyyy] [name of copyright owner]
19*10b9d77bSPawel Jakub Dawidek#
20*10b9d77bSPawel Jakub Dawidek# CDDL HEADER END
21*10b9d77bSPawel Jakub Dawidek#
22*10b9d77bSPawel Jakub Dawidek# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
23*10b9d77bSPawel Jakub Dawidek#
24*10b9d77bSPawel Jakub Dawidek
25*10b9d77bSPawel Jakub Dawidekimport zfs.util
26*10b9d77bSPawel Jakub Dawidek
27*10b9d77bSPawel Jakub Dawidekclass Table:
28*10b9d77bSPawel Jakub Dawidek	__slots__ = "fields", "rjustfields", "maxfieldlen", "lines"
29*10b9d77bSPawel Jakub Dawidek	__repr__ = zfs.util.default_repr
30*10b9d77bSPawel Jakub Dawidek
31*10b9d77bSPawel Jakub Dawidek	def __init__(self, fields, rjustfields=()):
32*10b9d77bSPawel Jakub Dawidek		# XXX maybe have a defaults, too?
33*10b9d77bSPawel Jakub Dawidek		self.fields = fields
34*10b9d77bSPawel Jakub Dawidek		self.rjustfields = rjustfields
35*10b9d77bSPawel Jakub Dawidek		self.maxfieldlen = dict.fromkeys(fields, 0)
36*10b9d77bSPawel Jakub Dawidek		self.lines = list()
37*10b9d77bSPawel Jakub Dawidek
38*10b9d77bSPawel Jakub Dawidek	def __updatemax(self, k, v):
39*10b9d77bSPawel Jakub Dawidek		self.maxfieldlen[k] = max(self.maxfieldlen.get(k, None), v)
40*10b9d77bSPawel Jakub Dawidek
41*10b9d77bSPawel Jakub Dawidek	def addline(self, sortkey, values):
42*10b9d77bSPawel Jakub Dawidek		"""values is a dict from field name to value"""
43*10b9d77bSPawel Jakub Dawidek
44*10b9d77bSPawel Jakub Dawidek		va = list()
45*10b9d77bSPawel Jakub Dawidek		for f in self.fields:
46*10b9d77bSPawel Jakub Dawidek			v = str(values[f])
47*10b9d77bSPawel Jakub Dawidek			va.append(v)
48*10b9d77bSPawel Jakub Dawidek			self.__updatemax(f, len(v))
49*10b9d77bSPawel Jakub Dawidek		self.lines.append((sortkey, va))
50*10b9d77bSPawel Jakub Dawidek
51*10b9d77bSPawel Jakub Dawidek	def printme(self, headers=True):
52*10b9d77bSPawel Jakub Dawidek		if headers:
53*10b9d77bSPawel Jakub Dawidek			d = dict([(f, f.upper()) for f in self.fields])
54*10b9d77bSPawel Jakub Dawidek			self.addline(None, d)
55*10b9d77bSPawel Jakub Dawidek
56*10b9d77bSPawel Jakub Dawidek		self.lines.sort()
57*10b9d77bSPawel Jakub Dawidek		for (k, va) in self.lines:
58*10b9d77bSPawel Jakub Dawidek			line = str()
59*10b9d77bSPawel Jakub Dawidek			for i in range(len(self.fields)):
60*10b9d77bSPawel Jakub Dawidek				if not headers:
61*10b9d77bSPawel Jakub Dawidek					line += va[i]
62*10b9d77bSPawel Jakub Dawidek					line += "\t"
63*10b9d77bSPawel Jakub Dawidek				else:
64*10b9d77bSPawel Jakub Dawidek					if self.fields[i] in self.rjustfields:
65*10b9d77bSPawel Jakub Dawidek						fmt = "%*s  "
66*10b9d77bSPawel Jakub Dawidek					else:
67*10b9d77bSPawel Jakub Dawidek						fmt = "%-*s  "
68*10b9d77bSPawel Jakub Dawidek					mfl = self.maxfieldlen[self.fields[i]]
69*10b9d77bSPawel Jakub Dawidek					line += fmt % (mfl, va[i])
70*10b9d77bSPawel Jakub Dawidek			print(line)
71