diff --git a/glanceclient/common/utils.py b/glanceclient/common/utils.py index 3e327631..01205728 100644 --- a/glanceclient/common/utils.py +++ b/glanceclient/common/utils.py @@ -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'))) diff --git a/glanceclient/v1/shell.py b/glanceclient/v1/shell.py index 8cf4b43a..a0089baf 100644 --- a/glanceclient/v1/shell.py +++ b/glanceclient/v1/shell.py @@ -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>', diff --git a/glanceclient/v2/shell.py b/glanceclient/v2/shell.py index 5851acdd..5ee87a5c 100644 --- a/glanceclient/v2/shell.py +++ b/glanceclient/v2/shell.py @@ -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, diff --git a/tests/test_utils.py b/tests/test_utils.py index e5d7f191..8bf58f5f 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -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): diff --git a/tests/v2/test_shell_v2.py b/tests/v2/test_shell_v2.py index 4a13e0b5..32e113dd 100644 --- a/tests/v2/test_shell_v2.py +++ b/tests/v2/test_shell_v2.py @@ -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',