Move roman conversion to compat
authorGuido Trotter <ultrotter@google.com>
Thu, 27 May 2010 10:21:17 +0000 (11:21 +0100)
committerGuido Trotter <ultrotter@google.com>
Tue, 1 Jun 2010 10:22:49 +0000 (11:22 +0100)
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
scripts/gnt-node
test/ganeti.compat_unittest.py

index 692ab24..013206f 100644 (file)
@@ -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:
index 8ca09e4..182ddc5 100755 (executable)
 
 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,
index 19f82b7..dbe9940 100755 (executable)
@@ -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()