diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000..69a9c58e --- /dev/null +++ b/.pylintrc @@ -0,0 +1,82 @@ +# The format of this file isn't really documented; just use --generate-rcfile +[MASTER] +# Add to the black list. It should be a base name, not a +# path. You may set this option multiple times. +ignore=.git,tests + +[MESSAGES CONTROL] +# NOTE: This list is copied from neutron, the options which do not need to be +# suppressed have been removed. +disable= +# "F" Fatal errors that prevent further processing +# "I" Informational noise +# "E" Error for important programming issues (likely bugs) + no-member, +# "W" Warnings for stylistic problems or minor programming issues + arguments-differ, + attribute-defined-outside-init, + broad-except, + fixme, + protected-access, + redefined-outer-name, + unused-argument, + useless-super-delegation, +# "C" Coding convention violations + bad-continuation, + invalid-name, + missing-docstring, +# "R" Refactor recommendations + no-self-use, + too-few-public-methods, + too-many-ancestors, + too-many-arguments, + too-many-branches, + too-many-instance-attributes, + too-many-lines, + too-many-locals, + too-many-public-methods, + too-many-return-statements, + too-many-statements + +[BASIC] +# Variable names can be 1 to 31 characters long, with lowercase and underscores +variable-rgx=[a-z_][a-z0-9_]{0,30}$ + +# Argument names can be 2 to 31 characters long, with lowercase and underscores +argument-rgx=[a-z_][a-z0-9_]{1,30}$ + +# Method names should be at least 3 characters long +# and be lowercased with underscores +method-rgx=([a-z_][a-z0-9_]{2,}|setUp|tearDown)$ + +# Module names matching +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Don't require docstrings on tests. +no-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$ + +[FORMAT] +# Maximum number of characters on a single line. +max-line-length=79 + +[VARIABLES] +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +[CLASSES] +# List of interface methods to ignore, separated by a comma. +ignore-iface-methods= + +[IMPORTS] +# Deprecated modules which should not be used, separated by a comma +deprecated-modules= + +[TYPECHECK] +# List of module names for which member attributes should not be checked +ignored-modules=six.moves,_MovedItems + +[REPORTS] +# Tells whether to display a full report or only the messages +reports=no + diff --git a/ovsdbapp/backend/ovs_idl/idlutils.py b/ovsdbapp/backend/ovs_idl/idlutils.py index 80d1cb7d..e24e5c0d 100644 --- a/ovsdbapp/backend/ovs_idl/idlutils.py +++ b/ovsdbapp/backend/ovs_idl/idlutils.py @@ -156,7 +156,7 @@ def get_column_value(row, col): val = getattr(row, col) # Idl returns lists of Rows where ovs-vsctl returns lists of UUIDs - if isinstance(val, list) and len(val): + if isinstance(val, list) and val: if isinstance(val[0], idl.Row): val = [v.uuid for v in val] col_type = row._table.columns[col].type @@ -205,7 +205,7 @@ def condition_match(row, condition): if isinstance(match, dict): for key in match: if op == '=': - if (key not in val or match[key] != val[key]): + if key not in val or match[key] != val[key]: matched = False break elif op == '!=': diff --git a/ovsdbapp/schema/open_vswitch/helpers.py b/ovsdbapp/schema/open_vswitch/helpers.py index c1fe3f45..435980ba 100644 --- a/ovsdbapp/schema/open_vswitch/helpers.py +++ b/ovsdbapp/schema/open_vswitch/helpers.py @@ -23,8 +23,7 @@ def _connection_to_manager_uri(conn_uri): if ':' in addr: ip, port = addr.split(':', 1) return 'p%s:%s:%s' % (proto, port, ip) - else: - return 'p%s:%s' % (proto, addr) + return 'p%s:%s' % (proto, addr) # TODO(jlibosva): Get rid of this runtime configuration and raise a message to diff --git a/test-requirements.txt b/test-requirements.txt index a4ad8d5f..71d6d86c 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -10,6 +10,7 @@ sphinx>=1.6.2 # BSD oslosphinx>=4.7.0 # Apache-2.0 oslotest>=1.10.0 # Apache-2.0 os-testr>=0.8.0 # Apache-2.0 +pylint==1.4.5 # GPLv2 testrepository>=0.0.18 # Apache-2.0/BSD testscenarios>=0.4 # Apache-2.0/BSD testtools>=1.4.0 # MIT diff --git a/tools/coding-checks.sh b/tools/coding-checks.sh new file mode 100755 index 00000000..0aa78490 --- /dev/null +++ b/tools/coding-checks.sh @@ -0,0 +1,66 @@ +#!/bin/sh +# This script is copied from neutron and adapted for ovsdbapp. +set -eu + +usage () { + echo "Usage: $0 [OPTION]..." + echo "Run ovsdbapp's coding check(s)" + echo "" + echo " -Y, --pylint [] Run pylint check on the entire ovsdbapp module or just files changed in basecommit (e.g. HEAD~1)" + echo " -h, --help Print this usage message" + echo + exit 0 +} + +join_args() { + if [ -z "$scriptargs" ]; then + scriptargs="$opt" + else + scriptargs="$scriptargs $opt" + fi +} + +process_options () { + i=1 + while [ $i -le $# ]; do + eval opt=\$$i + case $opt in + -h|--help) usage;; + -Y|--pylint) pylint=1;; + *) join_args;; + esac + i=$((i+1)) + done +} + +run_pylint () { + local target="${scriptargs:-all}" + + if [ "$target" = "all" ]; then + files="ovsdbapp" + else + case "$target" in + *HEAD~[0-9]*) files=$(git diff --diff-filter=AM --name-only $target -- "*.py");; + *) echo "$target is an unrecognized basecommit"; exit 1;; + esac + fi + + echo "Running pylint..." + echo "You can speed this up by running it on 'HEAD~[0-9]' (e.g. HEAD~1, this change only)..." + if [ -n "${files}" ]; then + pylint --rcfile=.pylintrc --output-format=colorized ${files} + else + echo "No python changes in this commit, pylint check not required." + exit 0 + fi +} + +scriptargs= +pylint=1 + +process_options $@ + +if [ $pylint -eq 1 ]; then + run_pylint + exit 0 +fi diff --git a/tox.ini b/tox.ini index 0fa72ede..d03f6dba 100644 --- a/tox.ini +++ b/tox.ini @@ -16,6 +16,7 @@ commands = python setup.py testr --slowest --testr-args='{posargs}' [testenv:pep8] commands = flake8 {posargs} + {toxinidir}/tools/coding-checks.sh --pylint '{posargs}' [testenv:venv] commands = {posargs}