[blivet:master 1/4] Do an initial setup for running pylint tests in blivet.

mulhern amulhern at redhat.com
Wed Mar 19 16:54:52 UTC 2014


The files are just copied from files in anaconda and anaconda specific
stuff removed.
---
 tests/pylint/intl.py                |  63 ++++++++++++++++++
 tests/pylint/pylint-false-positives |   0
 tests/pylint/pylint-one.sh          |  33 ++++++++++
 tests/pylint/runpylint.sh           | 127 ++++++++++++++++++++++++++++++++++++
 tests/testenv.sh                    |  13 ++++
 5 files changed, 236 insertions(+)
 create mode 100644 tests/pylint/intl.py
 create mode 100644 tests/pylint/pylint-false-positives
 create mode 100755 tests/pylint/pylint-one.sh
 create mode 100755 tests/pylint/runpylint.sh
 create mode 100644 tests/testenv.sh

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/pylint-false-positives b/tests/pylint/pylint-false-positives
new file mode 100644
index 0000000..e69de29
diff --git a/tests/pylint/pylint-one.sh b/tests/pylint/pylint-one.sh
new file mode 100755
index 0000000..38f3bfa
--- /dev/null
+++ b/tests/pylint/pylint-one.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# $1 -- python source to run pylint on
+#
+
+if [ $# -lt 1 ]; then
+    # no source, just exit
+    exit 1
+fi
+
+file_suffix="$(eval echo \$$#|sed s?/?_?g)"
+
+pylint_output="$(pylint \
+    --msg-template='{msg_id}:{line:3d},{column}: {obj}: {msg}' \
+    -r n --disable=C,R --rcfile=/dev/null \
+    --dummy-variables-rgx=_ \
+    --ignored-classes=Popen,TransactionSet \
+    --defining-attr-methods=__init__,_grabObjects,initialize,reset,start,setUp \
+    --load-plugins=intl \
+    $DISABLED_WARN_OPTIONS \
+    $DISABLED_ERR_OPTIONS \
+    $NON_STRICT_OPTIONS "$@" 2>&1 | \
+    egrep -v -f "$FALSE_POSITIVES" \
+    )"
+
+# I0011 is the informational "Locally disabling ...." message
+if [ -n "$(echo "$pylint_output" | fgrep -v '************* Module ' |\
+          grep -v '^I0011:')" ]; then
+    # Replace the Module line with the actual filename
+    pylint_output="$(echo "$pylint_output" | sed "s|\* Module .*|* Module $(eval echo \$$#)|")"
+    echo "$pylint_output" > pylint-out_$file_suffix
+    touch "pylint-$file_suffix-failed"
+fi
diff --git a/tests/pylint/runpylint.sh b/tests/pylint/runpylint.sh
new file mode 100755
index 0000000..5d452b8
--- /dev/null
+++ b/tests/pylint/runpylint.sh
@@ -0,0 +1,127 @@
+#!/bin/bash
+
+# This script will check for any pylint warning and errors using a set
+# of options minimizing false positives, in combination with filtering of any
+# warning regularexpressions listed in pylint-false-positives.
+#
+# If any warnings are found they will be stored in pylint-log and printed
+# to stdout and this script will exit with a status of 1, if no (non filtered)
+# warnings are found it exits with a status of 0
+
+# If $top_srcdir is set, assume this is being run from automake and we don't
+# need to keep a separate log
+export pylint_log=0
+if [ -z "$top_srcdir" ]; then
+    export pylint_log=1
+fi
+
+# Unset TERM so that things that use readline don't output terminal garbage
+unset TERM
+
+# Don't try to connect to the accessibility socket
+export NO_AT_BRIDGE=1
+
+# If $top_srcdir has not been set by automake, import the test environment
+if [ -z "$top_srcdir" ]; then
+    top_srcdir="$(dirname "$0")/../.."
+    . ${top_srcdir}/tests/testenv.sh
+fi
+
+srcdir="${top_srcdir}/tests/pylint"
+builddir="${top_builddir}/tests/pylint"
+
+# Need to add the pylint module directory to PYTHONPATH as well.
+export PYTHONPATH="${PYTHONPATH}:${srcdir}"
+
+# Save analysis data in the pylint directory
+export PYLINTHOME="${builddir}/.pylint.d"
+[ -d "$PYLINTHOME" ] || mkdir "$PYLINTHOME"
+
+export FALSE_POSITIVES="${srcdir}"/pylint-false-positives
+
+# W0212 - Access to a protected member %s of a client class
+export NON_STRICT_OPTIONS="--disable=W0212"
+
+# E1103 - %s %r has no %r member (but some types could not be inferred)
+export DISABLED_ERR_OPTIONS="--disable=E1103"
+
+# W0110 - map/filter on lambda could be replaced by comprehension
+# W0141 - Used builtin function %r
+# W0142 - Used * or ** magic
+# W0511 - Used when a warning note as FIXME or XXX is detected.
+# W0603 - Using the global statement
+# W0613 - Unused argument %r
+# W0614 - Unused import %s from wildcard import
+export DISABLED_WARN_OPTIONS="--disable=W0110,W0141,W0142,W0511,W0603,W0613,W0614"
+
+usage () {
+  echo "usage: `basename $0` [--strict] [--help] [files...]"
+  exit $1
+}
+
+# Separate the module parameters from the files list
+ARGS=
+FILES=
+while [ $# -gt 0 ]; do
+  case $1 in
+    --strict)
+      export NON_STRICT_OPTIONS=
+      ;;
+    --help)
+      usage 0
+      ;;
+    -*)
+      ARGS="$ARGS $1"
+      ;;
+    *)
+      FILES=$@
+      break
+  esac
+  shift
+done
+
+exit_status=0
+
+if [ -s pylint-log ]; then
+    rm pylint-log
+fi
+
+# run pylint one file / module at a time, otherwise it sometimes gets
+# confused
+if [ -z "$FILES" ]; then
+    # Find any file in the git working tree that either ends in .py
+    # or contains #!/usr/bin/python in the first line.
+    # Scan everything except old_tests
+    for testfile in $(git ls-files -c "${top_srcdir}" | egrep -v '(^|/)old_tests/') ; do
+        if [ -f "${testfile}" ] && \
+                ( [ "${testfile%.py}" != "${testfile}" ] || \
+                  head -1 "${testfile}" | grep -q '^#!/usr/bin/python' ) ; then
+            FILES="$FILES $testfile"
+        fi
+    done
+fi
+
+num_cpus=$(getconf _NPROCESSORS_ONLN)
+# run pylint in paralel
+echo $FILES | xargs --max-procs=$num_cpus -n 1 "$srcdir"/pylint-one.sh $ARGS || exit 1
+
+for file in $(find -name 'pylint-out*'); do
+    cat "$file" >> pylint-log
+    rm "$file"
+done
+
+fails=$(find -name 'pylint*failed' -print -exec rm '{}' \;)
+if [ -z "$fails" ]; then
+    exit_status=0
+else
+    exit_status=1
+fi
+
+if [ -s pylint-log ]; then
+    echo "pylint reports the following issues:"
+    cat pylint-log
+elif [ -e pylint-log ]; then
+    rm pylint-log
+fi
+
+exit "$exit_status"
diff --git a/tests/testenv.sh b/tests/testenv.sh
new file mode 100644
index 0000000..fca48db
--- /dev/null
+++ b/tests/testenv.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+if [ -z "$top_srcdir" ]; then
+    echo "*** top_srcdir must be set"
+    exit 1
+fi
+
+# If no top_builddir is set, use top_srcdir
+: "${top_builddir:=$top_srcdir}"
+
+export PYTHONPATH
+export top_srcdir
+export top_builddir
-- 
1.8.3.1



More information about the anaconda-patches mailing list