Configure pylint and update the code

This will allow us to run automatic checks for future commits.

Change-Id: Idbf08a44df0a940de51fb418d99f90da19fa6dc3
This commit is contained in:
Alessio Ababilov 2013-05-16 16:01:58 +03:00 committed by Joshua Harlow
parent c4808b303a
commit 5ecd401a0a
15 changed files with 275 additions and 46 deletions

View File

@ -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())

View File

@ -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

View File

@ -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).

View File

@ -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):

View File

@ -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):

View File

@ -17,6 +17,8 @@
# License for the specific language governing permissions and limitations
# under the License.
# pylint: disable=C0103
import logging
import sys

View File

@ -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

View File

@ -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

View File

@ -21,7 +21,6 @@ from anvil import shell as sh
from anvil.packaging.helpers import pip_helper
import pkg_resources
LOG = logging.getLogger(__name__)

View File

@ -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:

View File

@ -38,8 +38,8 @@ SHELL_QUOTE_REPLACERS = {
"\"": "\\\"",
"(": "\\(",
")": "\\)",
"$": '\$',
'`': '\`',
"$": "\\$",
"`": "\\`",
}
# Locally stash these so that they can not be changed

View File

@ -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

269
pylintrc
View File

@ -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 <file or directory> 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

10
setup.cfg Normal file
View File

@ -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

View File

@ -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