diff --git a/senlinclient/common/utils.py b/senlinclient/common/utils.py index bbdd52e3..021d88f1 100644 --- a/senlinclient/common/utils.py +++ b/senlinclient/common/utils.py @@ -80,6 +80,8 @@ def format_nested_dict(d, fields, column_names): value = d[field] if not isinstance(value, six.string_types): value = jsonutils.dumps(value, indent=2, ensure_ascii=False) + if value is None: + value = '-' pt.add_row([field, value.strip('"')]) return pt.get_string() @@ -129,14 +131,16 @@ def _print_list(objs, fields, formatters=None, sortby_index=0, row = [] for field in fields: if field in formatters: - row.append(formatters[field](o)) + data = formatters[field](o) else: if field in mixed_case_fields: field_name = field.replace(' ', '_') else: field_name = field.lower().replace(' ', '_') data = getattr(o, field_name, '') - row.append(data) + if data is None: + data = '-' + row.append(data) pt.add_row(row) if six.PY3: @@ -169,9 +173,12 @@ def print_dict(d, formatters=None): for field in d.keys(): if field in formatters: - pt.add_row([field, formatters[field](d[field])]) + data = formatters[field](d[field]) else: - pt.add_row([field, d[field]]) + data = d[field] + if data is None: + data = '-' + pt.add_row([field, data]) content = pt.get_string(sortby='Property') if six.PY3: diff --git a/senlinclient/tests/unit/test_utils.py b/senlinclient/tests/unit/test_utils.py index fb8c1a75..0fd2a27c 100644 --- a/senlinclient/tests/unit/test_utils.py +++ b/senlinclient/tests/unit/test_utils.py @@ -130,7 +130,7 @@ class PrintListTestCase(testtools.TestCase): +-----------+-----------+ """, cso.read()) - def test_print_list_with_None_data(self): + def test_print_list_with_None_string(self): Row = collections.namedtuple('Row', ['foo', 'bar']) to_print = [Row(foo='fake_foo1', bar='None'), Row(foo='fake_foo2', bar='fake_bar1')] @@ -144,6 +144,22 @@ class PrintListTestCase(testtools.TestCase): | fake_foo1 | None | | fake_foo2 | fake_bar1 | +-----------+-----------+ +""", cso.read()) + + def test_print_list_with_None_data(self): + Row = collections.namedtuple('Row', ['foo', 'bar']) + to_print = [Row(foo='fake_foo1', bar=None), + Row(foo='fake_foo2', bar='fake_bar1')] + with CaptureStdout() as cso: + utils.print_list(to_print, ['foo', 'bar']) + # Output should be sorted by the first key (foo) + self.assertEqual("""\ ++-----------+-----------+ +| foo | bar | ++-----------+-----------+ +| fake_foo1 | - | +| fake_foo2 | fake_bar1 | ++-----------+-----------+ """, cso.read()) def test_print_list_with_list_sortby(self): @@ -211,4 +227,20 @@ class PrintDictTestCase(testtools.TestCase): | bar | fake_bar | | foo | fake_foo | +----------+----------+ +""", cso.read()) + + def test_print_dict_with_None_data(self): + Row = collections.namedtuple('Row', ['foo', 'bar']) + to_print = [Row(foo='fake_foo1', bar=None), + Row(foo='fake_foo2', bar='fake_bar1')] + with CaptureStdout() as cso: + utils.print_list(to_print, ['foo', 'bar']) + # Output should be sorted by the first key (foo) + self.assertEqual("""\ ++-----------+-----------+ +| foo | bar | ++-----------+-----------+ +| fake_foo1 | - | +| fake_foo2 | fake_bar1 | ++-----------+-----------+ """, cso.read())