[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