changeset 355:9a2618ab9bbc trunk

Refactored the checker system. It's now possible to partially validate translations on a per-message level.
author aronacher
date Tue, 17 Jun 2008 20:30:02 +0000
parents 13c968efa492
children 4cdca48fc832
files babel/messages/catalog.py babel/messages/checkers.py
diffstat 2 files changed, 36 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/babel/messages/catalog.py
+++ b/babel/messages/catalog.py
@@ -108,6 +108,25 @@
                        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 @@
 
         :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
 
--- a/babel/messages/checkers.py
+++ b/babel/messages/checkers.py
@@ -35,6 +35,10 @@
                                    "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 @@
                                             (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()
Copyright (C) 2012-2017 Edgewall Software