From 6396164f9d98effa19f78b0c6f8dbc6266441f70 Mon Sep 17 00:00:00 2001 From: Guido Trotter <ultrotter@google.com> Date: Thu, 27 May 2010 11:21:17 +0100 Subject: [PATCH] Move roman conversion to compat The new TryToRoman function provides optional easy to use roman conversion. Nunc cum demonstrationi unitati. Signed-off-by: Guido Trotter <ultrotter@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/compat.py | 28 ++++++++++++++++++++++++++++ scripts/gnt-node | 14 +++----------- test/ganeti.compat_unittest.py | 21 +++++++++++++++++++++ 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/lib/compat.py b/lib/compat.py index 692ab246f..013206f21 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 8ca09e41b..182ddc537 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 19f82b7a8..dbe9940e7 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() -- GitLab