]> git.ipfire.org Git - thirdparty/babel.git/commitdiff
Refactored the checker system. It's now possible to partially validate translations...
authorArmin Ronacher <armin.ronacher@active-4.com>
Tue, 17 Jun 2008 20:30:02 +0000 (20:30 +0000)
committerArmin Ronacher <armin.ronacher@active-4.com>
Tue, 17 Jun 2008 20:30:02 +0000 (20:30 +0000)
babel/messages/catalog.py
babel/messages/checkers.py

index 829eebc10495ee1b3d27f63b236c3e8d485e7ae4..e6dee3167fb9019a5f05281cd8e84c1762888922 100644 (file)
@@ -108,6 +108,25 @@ class Message(object):
                        self.auto_comments, self.user_comments,
                        self.previous_id, self.lineno, self.context)
 
+    def check(self, catalog=None):
+        """Run various validation checks on the message.  Some validations
+        are only performed if the catalog is provided.  This method returns
+        a sequence of `TranslationError` objects.
+
+        :rtype: ``iterator``
+        :param catalog: A catalog instance that is passed to the checkers
+        :see: `Catalog.check` for a way to perform checks for all messages
+              in a catalog.
+        """
+        from babel.messages.checkers import checkers
+        errors = []
+        for checker in checkers:
+            try:
+                checker(catalog, self)
+            except TranslationError, e:
+                errors.append(e)
+        return errors
+
     def fuzzy(self):
         return 'fuzzy' in self.flags
     fuzzy = property(fuzzy, doc="""\
@@ -581,22 +600,8 @@ class Catalog(object):
 
         :rtype: ``iterator``
         """
-        checkers = []
-        try:
-            from pkg_resources import working_set
-        except ImportError:
-            from babel.messages.checkers import builtin_checkers
-            checkers.extend(builtin_checkers)
-        else:
-            for entry_point in working_set.iter_entry_points('babel.checkers'):
-                checkers.append(entry_point.load())
         for message in self._messages.values():
-            errors = []
-            for checker in checkers:
-                try:
-                    checker(self, message)
-                except TranslationError, e:
-                    errors.append(e)
+            errors = message.check(catalog=self)
             if errors:
                 yield message, errors
 
index fdee95dc0bd5c65874fcd32e047683ac2dd72de4..0f02fdc5a0065cbd08d34ffdb84ab4915118bcdc 100644 (file)
@@ -35,6 +35,10 @@ def num_plurals(catalog, message):
                                    "message")
         return
 
+    # skip further tests if no catalog is provided.
+    elif catalog is None:
+        return
+
     msgstrs = message.string
     if not isinstance(msgstrs, (list, tuple)):
         msgstrs = (msgstrs,)
@@ -161,7 +165,15 @@ def _validate_format(format, alternative):
                                             (name, typechar, type_map[name]))
 
 
-#: list of builtin checkers for babel installations without setuptools.
-#: Keep this in sync with the mapping in the setup.py
-#: :see: babel.messages.catalog.Catalog.check
-builtin_checkers = [num_plurals, python_format]
+def _find_checkers():
+    try:
+        from pkg_resources import working_set
+    except ImportError:
+        return [num_plurals, python_format]
+    checkers = []
+    for entry_point in working_set.iter_entry_points('babel.checkers'):
+        checkers.append(entry_point.load())
+    return checkers
+
+
+checkers = _find_checkers()