python-libraclient/libraclient/utils.py

117 lines
3.4 KiB
Python

# Copyright 2013 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import prettytable
from libraclient.openstack.common import strutils
def _field(orig_field, titled=True):
"""
Allow for writin short-hand field stuff like n='server', dn='Server'
"""
field = {}
aliases = {
'n': 'name',
'dn': 'display',
'f': 'formatter'
}
if isinstance(orig_field, dict):
for alias, name in aliases.items():
if alias in orig_field:
field[name] = orig_field[alias]
elif name in orig_field:
field[name] = orig_field[name]
elif isinstance(orig_field, basestring):
field['name'] = orig_field
elif isinstance(orig_field, tuple):
field['name'], field['display'] = orig_field
if 'display' not in field:
dn = field['name']
if titled:
dn = dn.title()
field['display'] = dn
return field
def _get_fields(obj):
# NOTE: Resource class
try:
i = obj._info
except AttributeError:
pass
# NOTE: dict
if isinstance(obj, dict):
i = obj
return [{'name': n} for n in i.keys()]
def _get_field_data(obj, field):
if 'formatter' in field:
return field['formatter'](obj[field['name']])
else:
if isinstance(obj, dict):
return obj[field['name']]
elif hasattr(obj, '_info'):
return getattr(obj, field['name'])
def create_row(obj, fields=None, titled=False):
"""
:param obj: a :class:`dict` or :class:`Resource`
:param fields: A :class:`list` of :class:`dicts` describing fields to do.
Default: obj.keys() if dict
:param formatters: Field formatters.
"""
fields = [_field(f, titled=titled) for f in fields or _get_fields(obj)]
row = []
for field in fields:
row.append(_get_field_data(obj, field))
return row
def print_list(objs, fields=None, sort_by=None, titled=False):
# If no fields are given use objs[0]
fields = [_field(f, titled=titled) for f in fields or _get_fields(objs[0])]
# Set the display names for headers.
field_names = [f['display'] for f in fields]
# Sort by column
if sort_by is None:
sortby = None
else:
sortby = fields[sortby_index]
pt = prettytable.PrettyTable(field_names, caching=False)
pt.align = 'l'
for o in objs:
row = create_row(o, fields=fields, titled=False)
pt.add_row(row)
if objs:
print(strutils.safe_encode(pt.get_string(sortby=sortby)))
def print_dict(obj, dict_property='Property', fields=None, titled=False):
fields = [_field(f, titled=titled) for f in fields or _get_fields(obj)]
pt = prettytable.PrettyTable([dict_property, 'Value'], caching=False)
pt.align = 'l'
for field in fields:
pt.add_row([field['display'], _get_field_data(obj, field)])
print(strutils.safe_encode(pt.get_string()))