From 5ecd401a0a9d392bb1111cf61fbab9b2448f94dc Mon Sep 17 00:00:00 2001 From: Alessio Ababilov Date: Thu, 16 May 2013 16:01:58 +0300 Subject: [PATCH] Configure pylint and update the code This will allow us to run automatic checks for future commits. Change-Id: Idbf08a44df0a940de51fb418d99f90da19fa6dc3 --- anvil/actions/restart.py | 8 +- anvil/components/horizon.py | 6 - anvil/decorators.py | 2 +- anvil/distro.py | 3 +- anvil/distros/rhel.py | 6 +- anvil/log.py | 2 + anvil/packaging/helpers/changelog.py | 2 +- anvil/packaging/helpers/pip_helper.py | 2 - anvil/packaging/pip.py | 1 - anvil/packaging/yum.py | 2 +- anvil/shell.py | 4 +- anvil/utils.py | 2 +- pylintrc | 269 ++++++++++++++++++++++++-- setup.cfg | 10 + tools/pre-commit | 2 +- 15 files changed, 275 insertions(+), 46 deletions(-) create mode 100644 setup.cfg diff --git a/anvil/actions/restart.py b/anvil/actions/restart.py index 0bd0f372..953876e4 100644 --- a/anvil/actions/restart.py +++ b/anvil/actions/restart.py @@ -15,18 +15,14 @@ # under the License. from anvil import action -from anvil import colorizer -from anvil import log from anvil.actions import start from anvil.actions import stop -from anvil.action import PhaseFunctors - -LOG = log.getLogger(__name__) - class RestartAction(action.Action): + def __init__(self, name, distro, root_dir, cli_opts): + super(RestartAction, self).__init__(name, distro, root_dir, cli_opts) self.start = start.StartAction(name, distro, root_dir, cli_opts.copy()) self.stop = stop.StopAction(name, distro, root_dir, cli_opts.copy()) diff --git a/anvil/components/horizon.py b/anvil/components/horizon.py index 61be1355..717a4efc 100644 --- a/anvil/components/horizon.py +++ b/anvil/components/horizon.py @@ -14,18 +14,12 @@ # License for the specific language governing permissions and limitations # under the License. -from anvil import colorizer from anvil import components as comp -from anvil import downloader as down from anvil import exceptions as excp from anvil import log as logging from anvil import shell as sh from anvil import utils -from anvil.packaging import yum - -from tempfile import NamedTemporaryFile - import binascii import os import re diff --git a/anvil/decorators.py b/anvil/decorators.py index 102c6577..4f665167 100644 --- a/anvil/decorators.py +++ b/anvil/decorators.py @@ -21,7 +21,7 @@ import functools # http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize -class memoized(object): +class memoized(object): # pylint: disable=C0103 '''Decorator. Caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned (not reevaluated). diff --git a/anvil/distro.py b/anvil/distro.py index 9b5a72c8..5f629bd0 100644 --- a/anvil/distro.py +++ b/anvil/distro.py @@ -32,7 +32,8 @@ from anvil import shell as sh LOG = logging.getLogger(__name__) -Component = collections.namedtuple("Component", 'entry_point,options,siblings') +Component = collections.namedtuple( # pylint: disable=C0103 + "Component", 'entry_point,options,siblings') class Distro(object): diff --git a/anvil/distros/rhel.py b/anvil/distros/rhel.py index abc6f17a..808e0638 100644 --- a/anvil/distros/rhel.py +++ b/anvil/distros/rhel.py @@ -83,11 +83,11 @@ class HorizonInstaller(horizon.HorizonInstaller): # Directives in the configuration files are case-insensitive, # but arguments to directives are often case sensitive... # NOTE(harlowja): we aren't handling multi-line fixups... - if re.match("^\s*User\s+(.*)$", line, re.I): + if re.match(r"^\s*User\s+(.*)$", line, re.I): line = "User %s" % (user) - if re.match("^\s*Group\s+(.*)$", line, re.I): + if re.match(r"^\s*Group\s+(.*)$", line, re.I): line = "Group %s" % (group) - if re.match("^\s*Listen\s+(.*)$", line, re.I): + if re.match(r"^\s*Listen\s+(.*)$", line, re.I): line = "Listen 0.0.0.0:80" new_lines.append(line) with sh.Rooted(True): diff --git a/anvil/log.py b/anvil/log.py index f3681ea0..52624218 100644 --- a/anvil/log.py +++ b/anvil/log.py @@ -17,6 +17,8 @@ # License for the specific language governing permissions and limitations # under the License. +# pylint: disable=C0103 + import logging import sys diff --git a/anvil/packaging/helpers/changelog.py b/anvil/packaging/helpers/changelog.py index 897fa2c3..710c1c01 100644 --- a/anvil/packaging/helpers/changelog.py +++ b/anvil/packaging/helpers/changelog.py @@ -77,7 +77,7 @@ class GitChangeLog(object): if len(ret) == 1: ret = ret[0] else: - ret = filter(lambda x: x.strip() != '', ret) + ret = [x for x in ret if x.strip() != ''] ret = "\n".join(ret) return ret diff --git a/anvil/packaging/helpers/pip_helper.py b/anvil/packaging/helpers/pip_helper.py index 82d28ecc..6902b806 100644 --- a/anvil/packaging/helpers/pip_helper.py +++ b/anvil/packaging/helpers/pip_helper.py @@ -14,8 +14,6 @@ # License for the specific language governing permissions and limitations # under the License. -from distutils import version as vr - import copy import pkg_resources import xmlrpclib diff --git a/anvil/packaging/pip.py b/anvil/packaging/pip.py index 0be7f07f..172f0c3c 100644 --- a/anvil/packaging/pip.py +++ b/anvil/packaging/pip.py @@ -21,7 +21,6 @@ from anvil import shell as sh from anvil.packaging.helpers import pip_helper -import pkg_resources LOG = logging.getLogger(__name__) diff --git a/anvil/packaging/yum.py b/anvil/packaging/yum.py index 7d9cb1ae..66704198 100644 --- a/anvil/packaging/yum.py +++ b/anvil/packaging/yum.py @@ -91,7 +91,7 @@ class YumPackager(pack.Packager): non_same_versions_packages[p.name].append(p) satisfying_packages = [] - for (name, packages) in non_same_versions_packages.items(): + for (_, packages) in non_same_versions_packages.items(): if len(packages) == 1: satisfying_packages.extend(packages) else: diff --git a/anvil/shell.py b/anvil/shell.py index 7cc56f6b..d6ce3464 100644 --- a/anvil/shell.py +++ b/anvil/shell.py @@ -38,8 +38,8 @@ SHELL_QUOTE_REPLACERS = { "\"": "\\\"", "(": "\\(", ")": "\\)", - "$": '\$', - '`': '\`', + "$": "\\$", + "`": "\\`", } # Locally stash these so that they can not be changed diff --git a/anvil/utils.py b/anvil/utils.py index c987c663..26f03a8f 100644 --- a/anvil/utils.py +++ b/anvil/utils.py @@ -51,7 +51,7 @@ from anvil import version from anvil.pprint import center_text -MONTY_PYTHON_TEXT_RE = re.compile("([a-z0-9A-Z\?!.,'\"]+)") +MONTY_PYTHON_TEXT_RE = re.compile(r"([a-z0-9A-Z\?!.,'\"]+)") # Thx cowsay # See: http://www.nog.net/~tony/warez/cowsay.shtml diff --git a/pylintrc b/pylintrc index a7447a19..623da8c7 100644 --- a/pylintrc +++ b/pylintrc @@ -1,42 +1,271 @@ -# The format of this file isn't really documented; just use --generate-rcfile +[MASTER] -[Master] +# Specify a configuration file. +#rcfile= -[Messages Control] +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= +# Profiled execution. +profile=no + +# Add to the black list. It should be a base name, not a +# path. You may set this option multiple times. + +# ignore= + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[MESSAGES CONTROL] + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. +#enable= +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifier separated by comma (,) or put this option +# multiple time. # http://pylint-messages.wikidot.com/all-codes -# NOTE(justinsb): We might want to have a 2nd strict pylintrc in future + +# I0011: Locally disabling %s +# I0012: Locally enabling %s +# I0013: Ignoring entire file # C0111: Don't require docstrings on every method +# E0213: We want different names for 'self', e. g. 'inner_self' +# E0611: No name in module -- test cover that +# E1101: Mocks make pylint type deduction crazy +# E1103: When some types could not be inferred, we ignore pylint +# F0401: Unable to import smth -- test cover that +# R0201: Method could be a function +# TODO(aababilov): remove similar lines +# R0801: Similar lines in %s files # R0912: Too many branches (huh) # R0914: Too many local variables is odd. +# R0922: Abstract class is only referenced %s times +# W0141: Used builtin function %r # W0142: *args and **kwargs are fine. +# W0212: Access to a protected member %s of a client class +# W0223: Don't want to override all the abstract methods +# W0232: Our models have no __init__ methods, but this is OK +# W0401: Wildcard imports are fine # W0511: TODOs in code comments are fine. +# W0603: Using the global statement # W0613: Unused argument '??' should be ok (they are useful sometimes to know intention of variable) # W0622: Redefining id is fine. -disable=C0111,W0142,W0622,C0301,R0902,R0201,R0914,W0613,R0912,R0801 +# W0702: No exception type(s) specified +# W0703: Catching "Exception" is fine if you need it +disable=I0011,I0012,I0013,C0111,E0213,E0611,E1101,E1103,F0401,R0201,R0801,R0912,R0914,R0922,W0141,W0142,W0212,W0223,W0232,W0401,W0511,W0603,W0613,W0622,W0702,W0703 -[Basic] +[REPORTS] -# Variable names can be 1 to 31 characters long, with lowercase and underscores -variable-rgx=[a-z_][a-z0-9_]{0,30}$ +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html +output-format=parseable -# Argument names can be 2 to 31 characters long, with lowercase and underscores -argument-rgx=[a-z_][a-z0-9_]{1,30}$ +# Include message's id in output +include-ids=yes -# Method names should be at least 3 characters long -# and be lowercased with underscores -method-rgx=([a-z_][a-z0-9_]{2,50}|setUp|tearDown)$ +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no -# Don't require docstrings on tests. -no-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$ +# Tells whether to display a full report or only the messages +reports=no -[Design] +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (R0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) -max-public-methods=100 -min-public-methods=0 -max-args=6 +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (R0004). +comment=no -[Variables] + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching names used for dummy variables (i.e. not used). +dummy-variables-rgx=.*_|dummy|error # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. +additional-builtins=_ + + +[FORMAT] + +# Maximum number of characters on a single line. +# make it 80 some day +max-line-length=150 + +# Maximum number of lines in a module +# TODO(aababilov): make it 1024 +max-module-lines=2000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=5 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=UUID + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. +generated-members=AndReturn + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +# NOTE(aababilov): allow contants have names like variables +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__)|[a-z_][a-z0-9_]{0,30})$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}|setUp|tearDown$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-z0-9_]{0,30}$ + +# Regular expression which should only match correct argument names +# allow short names like `fn' +argument-rgx=[a-z_][a-z0-9_]{1,30}$ + +# Regular expression which should only match correct variable names +# variable-rgx=[a-z_][a-z0-9_]{2,30}$ +variable-rgx=[a-z_][a-z0-9_]{0,30}$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Regular expression which should only match functions or classes name which do +# not require a docstring +no-docstring-rgx=__.*__ + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,string,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[DESIGN] + +# Maximum number of arguments for function / method +# TODO(aababilov): make it 10 +max-args=13 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branchs=12 + +# Maximum number of statements in function / method body +# TODO(aababilov): make it 50 +max-statements=60 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=12 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=80 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..7e27c5c3 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,10 @@ +[nosetests] +verbosity=2 + +[build_sphinx] +source-dir = docs/source +build-dir = docs/build +all_files = 1 + +[upload_sphinx] +upload-dir = docs/build/html diff --git a/tools/pre-commit b/tools/pre-commit index badd8be3..4201b88a 100755 --- a/tools/pre-commit +++ b/tools/pre-commit @@ -9,7 +9,7 @@ trap 'git stash pop -q' EXIT STATUS=0 FILES="$(git diff --cached --name-only --diff-filter=AM | grep -E '\.py$')" if [ -n "$FILES" ]; then - pep8 -r $FILES || STATUS=1 + pylint $FILES || STATUS=1 if grep -nEH --color '(import pdb|pdb.set_trace)' $FILES; then echo "Please remove pdb" STATUS=1