Get better format for long lines with PrettyTable
Based on current implement, the cli output format will be bad if the lines are too long. This issue can be fixed by setting 'max_width'. However, there is a bug against it, see https://code.google.com/p/prettytable/source/browse/trunk/CHANGELOG?r=85 line 3. So the requirements.txt is updated as well. docImpact Fixes bug 1251283 Change-Id: I0d4192ad9d10a3d6d47a8319463a5edb57719a68
This commit is contained in:
parent
80cf47e229
commit
336feeb523
@ -119,9 +119,10 @@ def print_list(objs, fields, formatters={}):
|
||||
print(strutils.safe_encode(pt.get_string()))
|
||||
|
||||
|
||||
def print_dict(d):
|
||||
def print_dict(d, max_column_width=80):
|
||||
pt = prettytable.PrettyTable(['Property', 'Value'], caching=False)
|
||||
pt.align = 'l'
|
||||
pt.max_width = max_column_width
|
||||
[pt.add_row(list(r)) for r in d.iteritems()]
|
||||
print(strutils.safe_encode(pt.get_string(sortby='Property')))
|
||||
|
||||
|
@ -108,7 +108,7 @@ def do_image_list(gc, args):
|
||||
utils.print_list(images, columns)
|
||||
|
||||
|
||||
def _image_show(image, human_readable=False):
|
||||
def _image_show(image, human_readable=False, max_column_width=80):
|
||||
# Flatten image properties dict for display
|
||||
info = copy.deepcopy(image._info)
|
||||
if human_readable:
|
||||
@ -116,7 +116,7 @@ def _image_show(image, human_readable=False):
|
||||
for (k, v) in info.pop('properties').iteritems():
|
||||
info['Property \'%s\'' % k] = v
|
||||
|
||||
utils.print_dict(info)
|
||||
utils.print_dict(info, max_column_width=max_column_width)
|
||||
|
||||
|
||||
def _set_data_field(fields, args):
|
||||
@ -127,11 +127,14 @@ def _set_data_field(fields, args):
|
||||
@utils.arg('image', metavar='<IMAGE>', help='Name or ID of image to describe.')
|
||||
@utils.arg('--human-readable', action='store_true', default=False,
|
||||
help='Print image size in a human-friendly format.')
|
||||
@utils.arg('--max-column-width', metavar='<integer>', default=80,
|
||||
help='The max column width of the printed table.')
|
||||
def do_image_show(gc, args):
|
||||
"""Describe a specific image."""
|
||||
image_id = utils.find_resource(gc.images, args.image).id
|
||||
image = gc.images.get(image_id)
|
||||
_image_show(image, args.human_readable)
|
||||
_image_show(image, args.human_readable,
|
||||
max_column_width=int(args.max_column_width))
|
||||
|
||||
|
||||
@utils.arg('--file', metavar='<FILE>',
|
||||
|
@ -118,12 +118,14 @@ def do_image_list(gc, args):
|
||||
|
||||
|
||||
@utils.arg('id', metavar='<IMAGE_ID>', help='ID of image to describe.')
|
||||
@utils.arg('--max-column-width', metavar='<integer>', default=80,
|
||||
help='The max column width of the printed table.')
|
||||
def do_image_show(gc, args):
|
||||
"""Describe a specific image."""
|
||||
image = gc.images.get(args.id)
|
||||
ignore = ['self', 'access', 'file', 'schema']
|
||||
image = dict([item for item in image.iteritems() if item[0] not in ignore])
|
||||
utils.print_dict(image)
|
||||
utils.print_dict(image, max_column_width=int(args.max_column_width))
|
||||
|
||||
|
||||
@utils.arg('--image-id', metavar='<IMAGE_ID>', required=True,
|
||||
|
@ -68,7 +68,11 @@ class TestUtils(testtools.TestCase):
|
||||
utils.print_list(images, columns)
|
||||
|
||||
sys.stdout = output_dict = StringIO.StringIO()
|
||||
utils.print_dict({'K': 'k', 'Key': 'Value'})
|
||||
utils.print_dict({'K': 'k', 'Key': 'veeeeeeeeeeeeeeeeeeeeeeee'
|
||||
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'
|
||||
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'
|
||||
'eeeeeeeeeeeery long value'},
|
||||
max_column_width=60)
|
||||
|
||||
finally:
|
||||
sys.stdout = saved_stdout
|
||||
@ -84,12 +88,14 @@ class TestUtils(testtools.TestCase):
|
||||
''')
|
||||
|
||||
self.assertEqual(output_dict.getvalue(), '''\
|
||||
+----------+-------+
|
||||
| Property | Value |
|
||||
+----------+-------+
|
||||
| K | k |
|
||||
| Key | Value |
|
||||
+----------+-------+
|
||||
+----------+--------------------------------------------------------------+
|
||||
| Property | Value |
|
||||
+----------+--------------------------------------------------------------+
|
||||
| K | k |
|
||||
| Key | veeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee |
|
||||
| | eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee |
|
||||
| | ery long value |
|
||||
+----------+--------------------------------------------------------------+
|
||||
''')
|
||||
|
||||
def test_exception_to_str(self):
|
||||
|
@ -90,7 +90,8 @@ class ShellV2Test(testtools.TestCase):
|
||||
utils.print_list.assert_called_once_with({}, ['ID', 'Name'])
|
||||
|
||||
def test_do_image_show(self):
|
||||
args = self._make_args({'id': 'pass', 'page_size': 18})
|
||||
args = self._make_args({'id': 'pass', 'page_size': 18,
|
||||
'max_column_width': 120})
|
||||
with mock.patch.object(self.gc.images, 'get') as mocked_list:
|
||||
ignore_fields = ['self', 'access', 'file', 'schema']
|
||||
expect_image = dict([(field, field) for field in ignore_fields])
|
||||
@ -100,7 +101,8 @@ class ShellV2Test(testtools.TestCase):
|
||||
test_shell.do_image_show(self.gc, args)
|
||||
|
||||
mocked_list.assert_called_once_with('pass')
|
||||
utils.print_dict.assert_called_once_with({'id': 'pass'})
|
||||
utils.print_dict.assert_called_once_with({'id': 'pass'},
|
||||
max_column_width=120)
|
||||
|
||||
def test_do_image_create_no_user_props(self):
|
||||
args = self._make_args({'name': 'IMG-01', 'disk_format': 'vhd',
|
||||
|
Loading…
x
Reference in New Issue
Block a user