Commits

Benji York  committed f48fd8a

make_analysator can now handle TypeErrors

  • Participants
  • Parent commits d1a3f36

Comments (0)

Files changed (2)

File pygments/util.py

             return 0.0
         try:
             return min(1.0, max(0.0, float(rv)))
-        except ValueError:
+        except (ValueError, TypeError):
             return 0.0
     text_analyse.__doc__ = f.__doc__
     return staticmethod(text_analyse)

File tests/test_util.py

 from pygments import util
 
 
+class FakeLexer(object):
+    def analyse(text):
+        return float(text)
+    analyse = util.make_analysator(analyse)
+
+
 class UtilTest(unittest.TestCase):
 
     def test_getoptions(self):
         self.assertEquals(util.docstring_headline(f1), "docstring headline")
         self.assertEquals(util.docstring_headline(f2), "docstring headline")
 
-    def test_analysator(self):
+    def test_analysator_returns_float(self):
+        # If an analysator wrapped by make_analysator returns a floating point
+        # number, then that number will be returned by the wrapper.
+        self.assertEquals(FakeLexer.analyse('0.5'), 0.5)
+
+    def test_analysator_returns_boolean(self):
+        # If an analysator wrapped by make_analysator returns a boolean value,
+        # then the wrapper will return 1.0 if the boolean was True or 0.0 if
+        # it was False.
+        self.assertEquals(FakeLexer.analyse(True), 1.0)
+        self.assertEquals(FakeLexer.analyse(False), 0.0)
+
+    def test_analysator_raises_exception(self):
+        # If an analysator wrapped by make_analysator raises an exception,
+        # then the wrapper will return 0.0.
+        class ErrorLexer(object):
+            def analyse(text):
+                raise RuntimeError('something bad happened')
+            analyse = util.make_analysator(analyse)
+        self.assertEquals(FakeLexer.analyse(''), 0.0)
+
+    def test_analysator_value_error(self):
+        # When converting the analysator's return value to a float a
+        # ValueError may occur.  If that happens 0.0 is returned instead.
+        self.assertEquals(FakeLexer.analyse('bad input'), 0.0)
+
+    def test_analysator_type_error(self):
+        # When converting the analysator's return value to a float a
+        # TypeError may occur.  If that happens 0.0 is returned instead.
         class X(object):
             def analyse(text):
-                return 0.5
+                return float(text)
             analyse = util.make_analysator(analyse)
-        self.assertEquals(X.analyse(''), 0.5)
+        self.assertEquals(X.analyse(None), 0.0)
 
     def test_shebang_matches(self):
         self.assert_(util.shebang_matches('#!/usr/bin/env python', r'python(2\.\d)?'))