diff --git a/lib/compat.py b/lib/compat.py index 692ab246f9845ec7f48379049e2e835a8b325c2d..013206f21bc3711abf8e68949b60375970e92382 100644 --- a/lib/compat.py +++ b/lib/compat.py @@ -30,6 +30,11 @@ try: except ImportError: functools = None +try: + import roman +except ImportError: + roman = None + def all(seq, pred=bool): # pylint: disable-msg=W0622 """Returns True if pred(x) is True for every element in the iterable. @@ -82,6 +87,29 @@ def _partial(func, *args, **keywords): # pylint: disable-msg=W0622 return newfunc +def TryToRoman(val, convert=True): + """Try to convert a value to roman numerals + + If the roman module could be loaded convert the given value to a roman + numeral. Gracefully fail back to leaving the value untouched. + + @type val: integer + @param val: value to convert + @type convert: boolean + @param convert: if False, don't try conversion at all + @rtype: string or typeof(val) + @return: roman numeral for val, or val if conversion didn't succeed + + """ + if roman is not None and convert: + try: + return roman.toRoman(val) + except roman.RomanError: + return val + else: + return val + + if functools is None: partial = _partial else: diff --git a/scripts/gnt-node b/scripts/gnt-node index 8ca09e41bca52b9a1daa412b3f0f9af4b9a196b0..182ddc537f7907638d2a2f01dacc5bbfcabda592 100755 --- a/scripts/gnt-node +++ b/scripts/gnt-node @@ -28,15 +28,11 @@ import sys -try: - import roman -except ImportError: - roman = None - from ganeti.cli import * from ganeti import opcodes from ganeti import utils from ganeti import constants +from ganeti import compat from ganeti import errors from ganeti import bootstrap @@ -232,12 +228,8 @@ def ListNodes(opts, args): val = utils.FormatTime(val) elif val is None: val = "?" - elif (roman is not None and opts.roman_integers - and field in latinfriendlyfields): - try: - val = roman.toRoman(val) - except roman.RomanError: - pass + elif opts.roman_integers and field in latinfriendlyfields: + val = compat.TryToRoman(val) row[idx] = str(val) data = GenerateTable(separator=opts.separator, headers=headers, diff --git a/test/ganeti.compat_unittest.py b/test/ganeti.compat_unittest.py index 19f82b7a8f26b8d225aea2c3dc8364afcc630719..dbe9940e71403666d44c1d7f94f216a50b01172b 100755 --- a/test/ganeti.compat_unittest.py +++ b/test/ganeti.compat_unittest.py @@ -58,5 +58,26 @@ class TestPartial(testutils.GanetiTestCase): (("Foo", ), {"xyz": 999,})) +class TestTryToRoman(testutils.GanetiTestCase): + """test the compat.TryToRoman function""" + + def testAFewIntegers(self): + self.assertEquals(compat.TryToRoman(0), 0) + self.assertEquals(compat.TryToRoman(1), "I") + self.assertEquals(compat.TryToRoman(4), "IV") + self.assertEquals(compat.TryToRoman(5), "V") + + def testStrings(self): + self.assertEquals(compat.TryToRoman("astring"), "astring") + self.assertEquals(compat.TryToRoman("5"), "5") + + def testDontConvert(self): + self.assertEquals(compat.TryToRoman(0, convert=False), 0) + self.assertEquals(compat.TryToRoman(1, convert=False), 1) + self.assertEquals(compat.TryToRoman(7, convert=False), 7) + self.assertEquals(compat.TryToRoman("astring", convert=False), "astring") + self.assertEquals(compat.TryToRoman("19", convert=False), "19") + + if __name__ == "__main__": testutils.GanetiTestProgram()