[PATCH 1/3] Add a custom pylint module to check i18n problems.

Chris Lumens clumens at redhat.com
Thu Nov 7 17:10:43 UTC 2013


pylint will also run this right out of the tests directory, as long as
PYTHONPATH is set up correctly.
---
 tests/pylint/intl.py      | 63 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/pylint/runpylint.sh |  4 +++
 2 files changed, 67 insertions(+)
 create mode 100644 tests/pylint/intl.py

diff --git a/tests/pylint/intl.py b/tests/pylint/intl.py
new file mode 100644
index 0000000..3052680
--- /dev/null
+++ b/tests/pylint/intl.py
@@ -0,0 +1,63 @@
+# I18N-related pylint module
+#
+# Copyright (C) 2013  Red Hat, Inc.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions of
+# the GNU General Public License v.2, or (at your option) any later version.
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY expressed or implied, including the implied warranties of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
+# Public License for more details.  You should have received a copy of the
+# GNU General Public License along with this program; if not, write to the
+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
+# source code or documentation are not subject to the GNU General Public
+# License and may only be used or replicated with the express permission of
+# Red Hat, Inc.
+#
+# Red Hat Author(s): Chris Lumens <clumens at redhat.com>
+#
+
+import astroid
+
+from pylint.checkers import BaseChecker
+from pylint.checkers.utils import check_messages
+from pylint.interfaces import IAstroidChecker
+
+translationMethods = ["_", "N_", "P_", "C_", "CN_", "CP_"]
+
+class IntlChecker(BaseChecker):
+    __implements__ = (IAstroidChecker, )
+    name = "internationalization"
+    msgs = {"W9901": ("Found % in a call to a _() method",
+                      "found-percent-in-_",
+                      "% in a call to one of the _() methods results in incorrect translations"),
+            "W9902": ("Found _ call at module/class level",
+                      "found-_-in-module-class",
+                      "Calling _ at the module or class level results in translations to the wrong language")
+           }
+
+    @check_messages("W9901")
+    def visit_binop(self, node):
+        if node.op != "%":
+            return
+
+        curr = node
+        while curr.parent:
+            if isinstance(curr.parent, astroid.CallFunc) and getattr(curr.parent.func, "name", "") in translationMethods:
+                self.add_message("W9901", node=node)
+                break
+
+            curr = curr.parent
+
+    @check_messages("W9902")
+    def visit_callfunc(self, node):
+        # The first test skips internal functions like getattr.
+        if isinstance(node.func, astroid.Name) and node.func.name == "_":
+            if isinstance(node.scope(), astroid.Module) or isinstance(node.scope(), astroid.Class):
+                self.add_message("W9902", node=node)
+
+def register(linter):
+    """required method to auto register this checker """
+    linter.register_checker(IntlChecker(linter))
diff --git a/tests/pylint/runpylint.sh b/tests/pylint/runpylint.sh
index 927e596..a8e7857 100755
--- a/tests/pylint/runpylint.sh
+++ b/tests/pylint/runpylint.sh
@@ -26,6 +26,9 @@ fi
 
 srcdir="${top_srcdir}/tests/pylint"
 
+# Need to add the pylint module directory to PYTHONPATH as well.
+PYTHONPATH="${PYTHONPATH}:${srcdir}"
+
 FALSE_POSITIVES="${srcdir}"/pylint-false-positives
 
 # W0212 - Access to a protected member %s of a client class
@@ -91,6 +94,7 @@ for i in $FILES; do
     --dummy-variables-rgx=_ \
     --ignored-classes=DefaultInstall,Popen,QueueFactory,TransactionSet \
     --defining-attr-methods=__init__,_grabObjects,initialize,reset,start,setUp \
+    --load-plugins=intl \
     $DISABLED_WARN_OPTIONS \
     $DISABLED_ERR_OPTIONS \
     $NON_STRICT_OPTIONS $i | \
-- 
1.8.3.1



More information about the anaconda-patches mailing list