summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2015-12-14 03:10:31 +0200
committerClaudiu Popa <pcmanticore@gmail.com>2015-12-14 03:10:31 +0200
commitd65e7cd75d368a075ff271c8320e94ebf2f2d9b1 (patch)
tree0c5dd609a5c90f447323e65ca571a6eb74fd68dd
parentd4d1842ed2c3b51de80869ad0b423f11b1937987 (diff)
downloadastroid-git-d65e7cd75d368a075ff271c8320e94ebf2f2d9b1.tar.gz
Cleanup pylint's warnings over astroid codebase
Some of the messages were disabled in pylintrc, since they're not very useful for our case. Other parameters, such as the number of arguments / statements / attributes etc were configured so that they won't be too restrictive for our codebase, since making the code to respect them right now requires too much development changes, which is not justified by the end result. Closes issue #284.
-rw-r--r--astroid/__init__.py12
-rw-r--r--astroid/__pkginfo__.py1
-rw-r--r--astroid/arguments.py3
-rw-r--r--astroid/as_string.py4
-rw-r--r--astroid/bases.py1
-rw-r--r--astroid/builder.py11
-rw-r--r--astroid/exceptions.py3
-rw-r--r--astroid/inference.py11
-rw-r--r--astroid/mixins.py1
-rw-r--r--astroid/modutils.py12
-rw-r--r--astroid/node_classes.py42
-rw-r--r--astroid/objects.py4
-rw-r--r--astroid/protocols.py18
-rw-r--r--astroid/raw_building.py14
-rw-r--r--astroid/rebuilder.py6
-rw-r--r--astroid/scoped_nodes.py40
-rw-r--r--astroid/test_utils.py8
-rw-r--r--astroid/tests/unittest_brain.py58
-rw-r--r--astroid/tests/unittest_builder.py6
-rw-r--r--astroid/tests/unittest_inference.py10
-rw-r--r--astroid/tests/unittest_lookup.py1
-rw-r--r--astroid/tests/unittest_modutils.py82
-rw-r--r--astroid/tests/unittest_nodes.py40
-rw-r--r--astroid/tests/unittest_protocols.py2
-rw-r--r--astroid/tests/unittest_raw_building.py2
-rw-r--r--astroid/tests/unittest_regrtest.py34
-rw-r--r--astroid/tests/unittest_scoped_nodes.py11
-rw-r--r--pylintrc50
28 files changed, 269 insertions, 218 deletions
diff --git a/astroid/__init__.py b/astroid/__init__.py
index 54d861aa..98c43973 100644
--- a/astroid/__init__.py
+++ b/astroid/__init__.py
@@ -39,7 +39,7 @@ Main modules are:
* builder contains the class responsible to build astroid trees
"""
-
+import os
import sys
import re
from operator import attrgetter
@@ -48,6 +48,7 @@ import enum
_Context = enum.Enum('Context', 'Load Store Del')
+# pylint: disable=no-member; github.com/pycqa/pylint/issues/690
Load = _Context.Load
Store = _Context.Store
Del = _Context.Del
@@ -57,6 +58,8 @@ del _Context
# WARNING: internal imports order matters !
# pylint: disable=redefined-builtin, wildcard-import
+# pylint: disable=wrong-import-position; the current order of imports is critical
+# here, that's why we don't respect it.
# make all exception classes accessible from astroid package
from astroid.exceptions import *
@@ -101,6 +104,7 @@ class AsStringRegexpPredicate(object):
def __call__(self, node):
if self.expression is not None:
+ # pylint: disable=no-member; github.com/pycqa/astroid/126
node = attrgetter(self.expression)(node)
return self.regexp.search(node.as_string())
@@ -131,13 +135,11 @@ def register_module_extender(manager, module_name, get_extension_mod):
# load brain plugins
-from os import listdir
-from os.path import join, dirname
-BRAIN_MODULES_DIR = join(dirname(__file__), 'brain')
+BRAIN_MODULES_DIR = os.path.join(os.path.dirname(__file__), 'brain')
if BRAIN_MODULES_DIR not in sys.path:
# add it to the end of the list so user path take precedence
sys.path.append(BRAIN_MODULES_DIR)
# load modules in this directory
-for module in listdir(BRAIN_MODULES_DIR):
+for module in os.listdir(BRAIN_MODULES_DIR):
if module.endswith('.py'):
__import__(module[:-3])
diff --git a/astroid/__pkginfo__.py b/astroid/__pkginfo__.py
index 3686d03c..64540bf2 100644
--- a/astroid/__pkginfo__.py
+++ b/astroid/__pkginfo__.py
@@ -30,6 +30,7 @@ install_requires = ['lazy_object_proxy', 'six', 'wrapt']
if sys.version_info < (3, 4):
install_requires += ['enum34', 'singledispatch']
+# pylint: disable=redefined-builtin; why license is a builtin anyway?
license = 'LGPL'
author = 'Logilab'
diff --git a/astroid/arguments.py b/astroid/arguments.py
index 949783af..8f4ea2f7 100644
--- a/astroid/arguments.py
+++ b/astroid/arguments.py
@@ -16,13 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License along
# with astroid. If not, see <http://www.gnu.org/licenses/>.
+import six
+
from astroid import bases
from astroid import context as contextmod
from astroid import exceptions
from astroid import nodes
from astroid import util
-import six
class CallSite(object):
diff --git a/astroid/as_string.py b/astroid/as_string.py
index 5bd62335..c081ea56 100644
--- a/astroid/as_string.py
+++ b/astroid/as_string.py
@@ -26,6 +26,10 @@ import sys
import six
+# pylint: disable=no-self-use; some visit methods don't need the self argument.
+# pylint: disable=unused-argument
+
+
class AsStringVisitor(object):
"""Visitor to render an Astroid node as a valid python code string"""
diff --git a/astroid/bases.py b/astroid/bases.py
index 0762f528..109dabce 100644
--- a/astroid/bases.py
+++ b/astroid/bases.py
@@ -263,7 +263,6 @@ class Instance(Proxy):
# TODO(cpopa): this is set in inference.py
# The circular dependency hell goes deeper and deeper.
- # pylint: disable=unused-argument
def getitem(self, index, context=None):
pass
diff --git a/astroid/builder.py b/astroid/builder.py
index 21b227d1..47aee988 100644
--- a/astroid/builder.py
+++ b/astroid/builder.py
@@ -22,6 +22,7 @@ at the same time.
"""
import _ast
+import re
import os
import sys
import textwrap
@@ -41,6 +42,8 @@ def _parse(string):
if sys.version_info >= (3, 0):
# pylint: disable=no-name-in-module; We don't understand flows yet.
+ # pylint: disable=wrong-import-order, wrong-import-position; have to do it here,
+ # rather than moving the entire block between standard and local imports.
from tokenize import detect_encoding
def open_source_file(filename):
@@ -51,8 +54,6 @@ if sys.version_info >= (3, 0):
return stream, encoding, data
else:
- import re
-
_ENCODING_RGX = re.compile(r"\s*#+.*coding[:=]\s*([-\w.]+)")
def _guess_encoding(string):
@@ -86,7 +87,7 @@ class AstroidBuilder(raw_building.InspectBuilder):
applied after the tree was built from source or from a live object,
by default being True.
"""
-
+ # pylint: disable=redefined-outer-name
def __init__(self, manager=None, apply_transforms=True):
super(AstroidBuilder, self).__init__()
self._manager = manager or MANAGER
@@ -129,7 +130,7 @@ class AstroidBuilder(raw_building.InspectBuilder):
# detect_encoding returns utf-8 if no encoding specified
util.reraise(exceptions.AstroidBuildingError(
'Wrong ({encoding}) or no encoding specified for {filename}.',
- encoding=encoding, filename=filename))
+ encoding=encoding, filename=path))
with stream:
# get module name if necessary
if modname is None:
@@ -241,7 +242,7 @@ class AstroidBuilder(raw_building.InspectBuilder):
continue
# get assign in __init__ first XXX useful ?
if (frame.name == '__init__' and values and
- not values[0].frame().name == '__init__'):
+ values[0].frame().name != '__init__'):
values.insert(0, node)
else:
values.append(node)
diff --git a/astroid/exceptions.py b/astroid/exceptions.py
index 3cfadbd2..98a0f881 100644
--- a/astroid/exceptions.py
+++ b/astroid/exceptions.py
@@ -34,6 +34,7 @@ class AstroidError(Exception):
arguments.
"""
def __init__(self, message='', **kws):
+ super(AstroidError, self).__init__(message)
self.message = message
for key, value in kws.items():
setattr(self, key, value)
@@ -202,4 +203,4 @@ BinaryOperationError = util.BadBinaryOperationMessage
SuperArgumentTypeError = SuperError
UnresolvableName = NameInferenceError
NotFoundError = AttributeInferenceError
-AstroidBuildingException = AstroidBuildingError \ No newline at end of file
+AstroidBuildingException = AstroidBuildingError
diff --git a/astroid/inference.py b/astroid/inference.py
index 5bbc34fd..23929b74 100644
--- a/astroid/inference.py
+++ b/astroid/inference.py
@@ -18,8 +18,6 @@
"""this module contains a set of functions to handle inference on astroid trees
"""
-# pylint: disable=no-value-for-parameter; Pylint FP #629, please remove afterwards.
-
import functools
import itertools
import operator
@@ -138,8 +136,8 @@ def infer_import(self, context=None, asname=True):
yield self.do_import_module(name)
except exceptions.AstroidBuildingError as exc:
util.reraise(exceptions.InferenceError(node=self, error=exc,
- context=context))
-
+ context=context))
+
nodes.Import._infer = infer_import
@@ -209,7 +207,8 @@ def infer_global(self, context=None):
context)
except exceptions.AttributeInferenceError as error:
util.reraise(exceptions.InferenceError(
- error.message, target=self, attribute=name, context=context))
+ error.message, target=self, attribute=context.lookupname,
+ context=context))
nodes.Global._infer = infer_global
@@ -289,7 +288,7 @@ def infer_subscript(self, context=None):
except (IndexError, TypeError, AttributeError) as exc:
util.reraise(exceptions.InferenceError(node=self, error=exc,
context=context))
-
+
# Prevent inferring if the inferred subscript
# is the same as the original subscripted object.
if self is assigned or assigned is util.Uninferable:
diff --git a/astroid/mixins.py b/astroid/mixins.py
index e67c9af3..4092fe35 100644
--- a/astroid/mixins.py
+++ b/astroid/mixins.py
@@ -22,7 +22,6 @@ import warnings
from astroid import decorators
from astroid import exceptions
-from astroid import util
class BlockRangeMixIn(object):
diff --git a/astroid/modutils.py b/astroid/modutils.py
index e127d845..749018ca 100644
--- a/astroid/modutils.py
+++ b/astroid/modutils.py
@@ -394,7 +394,7 @@ def get_module_part(dotted_name, context_file=None):
file_from_modpath(parts[starti:i+1], path=path,
context_file=context_file)
except ImportError:
- if not i >= max(1, len(parts) - 2):
+ if i < max(1, len(parts) - 2):
raise
return '.'.join(parts[:i])
return dotted_name
@@ -425,7 +425,7 @@ def get_module_files(src_directory, blacklist, list_all=False):
for directory, dirnames, filenames in os.walk(src_directory):
_handle_blacklist(blacklist, dirnames, filenames)
# check for __init__.py
- if not list_all and not '__init__.py' in filenames:
+ if not list_all and '__init__.py' not in filenames:
dirnames[:] = ()
continue
for filename in filenames:
@@ -581,13 +581,9 @@ def _search_zip(modpath, pic):
filepath)
raise ImportError('No module named %s' % '.'.join(modpath))
-try:
- import pkg_resources
-except ImportError:
- pkg_resources = None
-
def _is_namespace(modname):
+ # pylint: disable=no-member; astroid issue #290, modifying globals at runtime.
return (pkg_resources is not None
and modname in pkg_resources._namespace_packages)
@@ -614,7 +610,7 @@ def _module_file(modpath, path=None):
pic = sys.path_importer_cache
_path = (path is None and sys.path or path)
for __path in _path:
- if not __path in pic:
+ if __path not in pic:
try:
pic[__path] = zipimport.zipimporter(__path)
except zipimport.ZipImportError:
diff --git a/astroid/node_classes.py b/astroid/node_classes.py
index 8293fe45..0e88b17b 100644
--- a/astroid/node_classes.py
+++ b/astroid/node_classes.py
@@ -68,7 +68,7 @@ def unpack_infer(stmt, context=None):
yield inf_inf
-def are_exclusive(stmt1, stmt2, exceptions=None):
+def are_exclusive(stmt1, stmt2, exceptions=None): # pylint: disable=redefined-outer-name
"""return true if the two given statements are mutually exclusive
`exceptions` may be a list of exception names. If specified, discard If
@@ -106,12 +106,22 @@ def are_exclusive(stmt1, stmt2, exceptions=None):
c2attr, c2node = node.locate_child(previous)
c1attr, c1node = node.locate_child(children[node])
if c1node is not c2node:
- if ((c2attr == 'body'
- and c1attr == 'handlers'
- and children[node].catch(exceptions)) or
- (c2attr == 'handlers' and c1attr == 'body' and previous.catch(exceptions)) or
- (c2attr == 'handlers' and c1attr == 'orelse') or
- (c2attr == 'orelse' and c1attr == 'handlers')):
+ first_in_body_catched_by_handlers = (
+ c2attr == 'handlers'
+ and c1attr == 'body'
+ and previous.catch(exceptions))
+ second_in_body_catched_by_handlers = (
+ c2attr == 'body'
+ and c1attr == 'handlers'
+ and children[node].catch(exceptions))
+ first_in_else_other_in_handlers = (
+ c2attr == 'handlers' and c1attr == 'orelse')
+ second_in_else_other_in_handlers = (
+ c2attr == 'orelse' and c1attr == 'handlers')
+ if any((first_in_body_catched_by_handlers,
+ second_in_body_catched_by_handlers,
+ first_in_else_other_in_handlers,
+ second_in_else_other_in_handlers)):
return True
elif c2attr == 'handlers' and c1attr == 'handlers':
return previous is not children[node]
@@ -619,7 +629,6 @@ class _BaseContainer(mixins.ParentAssignTypeMixin,
@classmethod
def from_constants(cls, elts=None):
- # pylint: disable=abstract-class-instantiated; False positive on Pylint #627.
node = cls()
if elts is None:
node.elts = []
@@ -695,7 +704,7 @@ class LookupMixIn(object):
if self.statement() is myframe and myframe.parent:
myframe = myframe.parent.frame()
- if not myframe is frame or self is frame:
+ if myframe is not frame or self is frame:
return stmts
mystmt = self.statement()
# line filtering if we are in the same frame
@@ -838,9 +847,9 @@ class Arguments(mixins.AssignTypeMixin, NodeNG):
_other_fields = ('vararg', 'kwarg')
def __init__(self, vararg=None, kwarg=None, parent=None):
+ super(Arguments, self).__init__(parent=parent)
self.vararg = vararg
self.kwarg = kwarg
- self.parent = parent
self.args = []
self.defaults = []
self.kwonlyargs = []
@@ -1140,8 +1149,10 @@ class Comprehension(NodeNG):
ifs = None
def __init__(self, parent=None):
+ super(Comprehension, self).__init__()
self.parent = parent
+ # pylint: disable=redefined-builtin; same name as builtin ast module.
def postinit(self, target=None, iter=None, ifs=None):
self.target = target
self.iter = iter
@@ -1327,6 +1338,8 @@ class Ellipsis(NodeNG): # pylint: disable=redefined-builtin
class EmptyNode(NodeNG):
"""class representing an EmptyNode node"""
+ object = None
+
class ExceptHandler(mixins.AssignTypeMixin, Statement):
"""class representing an ExceptHandler node"""
@@ -1335,6 +1348,7 @@ class ExceptHandler(mixins.AssignTypeMixin, Statement):
name = None
body = None
+ # pylint: disable=redefined-builtin; had to use the same name as builtin ast module.
def postinit(self, type=None, name=None, body=None):
self.type = type
self.name = name
@@ -1349,7 +1363,7 @@ class ExceptHandler(mixins.AssignTypeMixin, Statement):
else:
return self.lineno
- def catch(self, exceptions):
+ def catch(self, exceptions): # pylint: disable=redefined-outer-name
if self.type is None or exceptions is None:
return True
for node in self.type.nodes_of_class(Name):
@@ -1364,6 +1378,7 @@ class Exec(Statement):
globals = None
locals = None
+ # pylint: disable=redefined-builtin; had to use the same name as builtin ast module.
def postinit(self, expr=None, globals=None, locals=None):
self.expr = expr
self.globals = globals
@@ -1387,6 +1402,7 @@ class For(mixins.BlockRangeMixIn, mixins.AssignTypeMixin, Statement):
body = None
orelse = None
+ # pylint: disable=redefined-builtin; had to use the same name as builtin ast module.
def postinit(self, target=None, iter=None, body=None, orelse=None):
self.target = target
self.iter = iter
@@ -1684,6 +1700,7 @@ class Subscript(NodeNG):
super(Subscript, self).__init__(lineno=lineno,
col_offset=col_offset, parent=parent)
+ # pylint: disable=redefined-builtin; had to use the same name as builtin ast module.
def postinit(self, value=None, slice=None):
self.value = value
self.slice = slice
@@ -1865,6 +1882,7 @@ def _update_const_classes():
"""update constant classes, so the keys of CONST_CLS can be reused"""
klasses = (bool, int, float, complex, str)
if six.PY2:
+ # pylint: disable=undefined-variable
klasses += (unicode, long)
klasses += (bytes,)
for kls in klasses:
@@ -1915,7 +1933,7 @@ def const_factory(value):
initializer_cls = CONST_CLS[value.__class__]
initializer = _CONST_CLS_CONSTRUCTORS[initializer_cls]
return initializer(initializer_cls, elts)
- except (KeyError, AttributeError) as exc:
+ except (KeyError, AttributeError):
node = EmptyNode()
node.object = value
return node
diff --git a/astroid/objects.py b/astroid/objects.py
index c880a4d4..e948396f 100644
--- a/astroid/objects.py
+++ b/astroid/objects.py
@@ -49,7 +49,7 @@ class FrozenSet(node_classes._BaseContainer):
yield self
@decorators.cachedproperty
- def _proxied(self):
+ def _proxied(self): # pylint: disable=method-hidden
builtins = MANAGER.astroid_cache[BUILTINS]
return builtins.getattr('frozenset')[0]
@@ -66,7 +66,7 @@ class Super(node_classes.NodeNG):
*self_class* is the class where the super call is, while
*scope* is the function where the super call is.
"""
-
+ # pylint: disable=super-init-not-called
def __init__(self, mro_pointer, mro_type, self_class, scope):
self.type = mro_type
self.mro_pointer = mro_pointer
diff --git a/astroid/protocols.py b/astroid/protocols.py
index 66ca9784..139b3603 100644
--- a/astroid/protocols.py
+++ b/astroid/protocols.py
@@ -20,7 +20,7 @@ where it makes sense.
"""
import collections
-import operator
+import operator as operator_mod
import sys
import six
@@ -74,10 +74,10 @@ UNARY_OP_METHOD = {'+': '__pos__',
'not': None, # XXX not '__nonzero__'
}
_UNARY_OPERATORS = {
- '+': operator.pos,
- '-': operator.neg,
- '~': operator.invert,
- 'not': operator.not_,
+ '+': operator_mod.pos,
+ '-': operator_mod.neg,
+ '~': operator_mod.invert,
+ 'not': operator_mod.not_,
}
@@ -109,7 +109,7 @@ BIN_OP_IMPL = {'+': lambda a, b: a + b,
}
if sys.version_info >= (3, 5):
# MatMult is available since Python 3.5+.
- BIN_OP_IMPL['@'] = operator.matmul
+ BIN_OP_IMPL['@'] = operator_mod.matmul
for _KEY, _IMPL in list(BIN_OP_IMPL.items()):
BIN_OP_IMPL[_KEY + '='] = _IMPL
@@ -271,9 +271,9 @@ def sequence_assigned_stmts(self, node=None, context=None, asspath=None):
try:
index = self.elts.index(node)
except ValueError:
- util.reraise(exceptions.InferenceError(
- 'Tried to retrieve a node {node!r} which does not exist',
- node=self, assign_path=asspath, context=context))
+ util.reraise(exceptions.InferenceError(
+ 'Tried to retrieve a node {node!r} which does not exist',
+ node=self, assign_path=asspath, context=context))
asspath.insert(0, index)
return self.parent.assigned_stmts(node=self, context=context, asspath=asspath)
diff --git a/astroid/raw_building.py b/astroid/raw_building.py
index ee5c31e5..2ea0f412 100644
--- a/astroid/raw_building.py
+++ b/astroid/raw_building.py
@@ -60,20 +60,20 @@ def _add_dunder_class(func, member):
cls_name = getattr(python_cls, '__name__', None)
if not cls_name:
return
- bases = [ancestor.__name__ for ancestor in python_cls.__bases__]
- ast_klass = build_class(cls_name, bases, python_cls.__doc__)
+ cls_bases = [ancestor.__name__ for ancestor in python_cls.__bases__]
+ ast_klass = build_class(cls_name, cls_bases, python_cls.__doc__)
func.instance_attrs['__class__'] = [ast_klass]
_marker = object()
-def attach_dummy_node(node, name, object=_marker):
+def attach_dummy_node(node, name, runtime_object=_marker):
"""create a dummy node and register it in the locals of the given
node with the specified name
"""
enode = nodes.EmptyNode()
- enode.object = object
+ enode.object = runtime_object
_attach_local_node(node, enode, name)
def _has_underlying_object(self):
@@ -115,7 +115,7 @@ def build_class(name, basenames=(), doc=None):
return node
-def build_function(name, args=None, defaults=None, flag=0, doc=None):
+def build_function(name, args=None, defaults=None, doc=None):
"""create and initialize a astroid FunctionDef node"""
args, defaults = args or [], defaults or []
# first argument is now a list of decorators
@@ -170,14 +170,14 @@ def object_build_class(node, member, localname):
def object_build_function(node, member, localname):
"""create astroid for a living function object"""
+ # pylint: disable=deprecated-method; completely removed in 2.0
args, varargs, varkw, defaults = inspect.getargspec(member)
if varargs is not None:
args.append(varargs)
if varkw is not None:
args.append(varkw)
func = build_function(getattr(member, '__name__', None) or localname, args,
- defaults, six.get_function_code(member).co_flags,
- member.__doc__)
+ defaults, member.__doc__)
node.add_local_node(func, localname)
diff --git a/astroid/rebuilder.py b/astroid/rebuilder.py
index a07fe295..903b3cc3 100644
--- a/astroid/rebuilder.py
+++ b/astroid/rebuilder.py
@@ -259,9 +259,9 @@ class TreeRebuilder(object):
# problem for the correctness of the program).
#
# ("a" + "b" + # one thousand more + "c")
- newnode = self._peepholer.optimize_binop(node, parent)
- if newnode:
- return newnode
+ optimized = self._peepholer.optimize_binop(node, parent)
+ if optimized:
+ return optimized
newnode = nodes.BinOp(_BIN_OP_CLASSES[type(node.op)],
node.lineno, node.col_offset, parent)
diff --git a/astroid/scoped_nodes.py b/astroid/scoped_nodes.py
index 25d28aed..02a9989f 100644
--- a/astroid/scoped_nodes.py
+++ b/astroid/scoped_nodes.py
@@ -96,15 +96,15 @@ def function_to_method(n, klass):
def std_special_attributes(self, name, add_locals=True):
if add_locals:
- locals = self.locals
+ obj_locals = self.locals
else:
- locals = {}
+ obj_locals = {}
if name == '__name__':
- return [node_classes.const_factory(self.name)] + locals.get(name, [])
+ return [node_classes.const_factory(self.name)] + obj_locals.get(name, [])
if name == '__doc__':
- return [node_classes.const_factory(self.doc)] + locals.get(name, [])
+ return [node_classes.const_factory(self.doc)] + obj_locals.get(name, [])
if name == '__dict__':
- return [node_classes.Dict()] + locals.get(name, [])
+ return [node_classes.Dict()] + obj_locals.get(name, [])
# TODO: missing context
raise exceptions.AttributeInferenceError(target=self, attribute=name)
@@ -138,10 +138,13 @@ class LocalsDictNodeNG(node_classes.LookupMixIn,
# dictionary of locals with name as key and node defining the local as
# value
+ locals = {}
+
def qname(self):
"""return the 'qualified' name of the node, eg module.name,
module.class.name ...
"""
+ # pylint: disable=no-member; github.com/pycqa/astroid/issues/278
if self.parent is None:
return self.name
return '%s.%s' % (self.parent.frame().qname(), self.name)
@@ -188,6 +191,10 @@ class LocalsDictNodeNG(node_classes.LookupMixIn,
def _append_node(self, child):
"""append a child, linking it in the tree"""
+ # pylint: disable=no-member; depending by the class
+ # which uses the current class as a mixin or base class.
+ # It's rewritten in 2.0, so it makes no sense for now
+ # to spend development time on it.
self.body.append(child)
child.parent = self
@@ -468,12 +475,12 @@ class Module(LocalsDictNodeNG):
# to avoid catching too many Exceptions
default = [name for name in self.keys() if not name.startswith('_')]
try:
- all = self['__all__']
+ all_values = self['__all__']
except KeyError:
return default
try:
- explicit = next(all.assigned_stmts())
+ explicit = next(all_values.assigned_stmts())
except exceptions.InferenceError:
return default
except AttributeError:
@@ -664,6 +671,10 @@ class Lambda(mixins.FilterStmtsMixin, LocalsDictNodeNG):
def argnames(self):
"""return a list of argument names"""
+ # pylint: disable=no-member; github.com/pycqa/astroid/issues/291
+ # args is in fact redefined later on by postinit. Can't be changed
+ # to None due to a strong interaction between Lambda and FunctionDef.
+
if self.args.args: # maybe None with builtin functions
names = _rec_get_names(self.args.args)
else:
@@ -676,9 +687,17 @@ class Lambda(mixins.FilterStmtsMixin, LocalsDictNodeNG):
def infer_call_result(self, caller, context=None):
"""infer what a function is returning when called"""
+ # pylint: disable=no-member; github.com/pycqa/astroid/issues/291
+ # args is in fact redefined later on by postinit. Can't be changed
+ # to None due to a strong interaction between Lambda and FunctionDef.
+
return self.body.infer(context)
def scope_lookup(self, node, name, offset=0):
+ # pylint: disable=no-member; github.com/pycqa/astroid/issues/291
+ # args is in fact redefined later on by postinit. Can't be changed
+ # to None due to a strong interaction between Lambda and FunctionDef.
+
if node in self.args.defaults or node in self.args.kw_defaults:
frame = self.parent.frame()
# line offset to avoid that def func(f=func) resolve the default
@@ -1096,6 +1115,7 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
if parent is not None:
parent.frame().set_local(name, self)
+ # pylint: disable=redefined-outer-name
def postinit(self, bases, body, decorators, newstyle=None, metaclass=None):
self.bases = bases
self.body = body
@@ -1728,9 +1748,9 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
raise NotImplementedError(
"Could not obtain mro for old-style classes.")
- bases = list(self._inferred_bases(context=context))
+ inferred_bases = list(self._inferred_bases(context=context))
bases_mro = []
- for base in bases:
+ for base in inferred_bases:
try:
mro = base.mro(context=context)
bases_mro.append(mro)
@@ -1743,7 +1763,7 @@ class ClassDef(mixins.FilterStmtsMixin, LocalsDictNodeNG,
ancestors = list(base.ancestors(context=context))
bases_mro.append(ancestors)
- unmerged_mro = ([[self]] + bases_mro + [bases])
+ unmerged_mro = ([[self]] + bases_mro + [inferred_bases])
_verify_duplicates_mro(unmerged_mro, self, context)
return _c3_merge(unmerged_mro, self, context)
diff --git a/astroid/test_utils.py b/astroid/test_utils.py
index 0fbbe80b..82dc9501 100644
--- a/astroid/test_utils.py
+++ b/astroid/test_utils.py
@@ -183,7 +183,7 @@ def require_version(minver=None, maxver=None):
try:
return tuple(int(v) for v in string.split('.'))
except ValueError:
- util.reraise(ValueError('%s is not a correct version : should be X.Y[.Z].' % version))
+ util.reraise(ValueError('%s is not a correct version : should be X.Y[.Z].' % string))
def check_require_version(f):
current = sys.version_info[:3]
@@ -194,9 +194,11 @@ def require_version(minver=None, maxver=None):
@functools.wraps(f)
def new_f(self, *args, **kwargs):
if minver is not None:
- self.skipTest('Needs Python > %s. Current version is %s.' % (minver, str_version))
+ self.skipTest('Needs Python > %s. Current version is %s.'
+ % (minver, str_version))
elif maxver is not None:
- self.skipTest('Needs Python <= %s. Current version is %s.' % (maxver, str_version))
+ self.skipTest('Needs Python <= %s. Current version is %s.'
+ % (maxver, str_version))
return new_f
diff --git a/astroid/tests/unittest_brain.py b/astroid/tests/unittest_brain.py
index 31525ba0..c5a84cf6 100644
--- a/astroid/tests/unittest_brain.py
+++ b/astroid/tests/unittest_brain.py
@@ -15,31 +15,13 @@
# You should have received a copy of the GNU Lesser General Public License along
# with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
"""Tests for basic functionality in astroid.brain."""
-import sys
-import unittest
-
-import six
-
-from astroid import MANAGER
-from astroid import bases
-from astroid import builder
-from astroid import nodes
-from astroid import test_utils
-from astroid import util
-import astroid
-
-
-try:
- import nose # pylint: disable=unused-import
- HAS_NOSE = True
-except ImportError:
- HAS_NOSE = False
-
try:
import multiprocessing # pylint: disable=unused-import
HAS_MULTIPROCESSING = True
except ImportError:
HAS_MULTIPROCESSING = False
+import sys
+import unittest
try:
import enum # pylint: disable=unused-import
@@ -52,6 +34,12 @@ except ImportError:
HAS_ENUM = False
try:
+ import nose # pylint: disable=unused-import
+ HAS_NOSE = True
+except ImportError:
+ HAS_NOSE = False
+
+try:
import dateutil # pylint: disable=unused-import
HAS_DATEUTIL = True
except ImportError:
@@ -68,6 +56,15 @@ try:
HAS_PYTEST = True
except ImportError:
HAS_PYTEST = False
+import six
+
+from astroid import MANAGER
+from astroid import bases
+from astroid import builder
+from astroid import nodes
+from astroid import test_utils
+from astroid import util
+import astroid
class HashlibTest(unittest.TestCase):
@@ -112,9 +109,8 @@ class NamedTupleTest(unittest.TestCase):
class X(namedtuple(name, fields)):
pass
""")
- for base in klass.ancestors():
- if base.name == 'X':
- break
+ base = next(base for base in klass.ancestors()
+ if base.name == 'X')
self.assertSetEqual({"a", "b", "c"}, set(base.instance_attrs))
def test_namedtuple_inference_failure(self):
@@ -381,8 +377,8 @@ class EnumBrainTest(unittest.TestCase):
""")
- enum = next(module['MyEnum'].infer())
- one = enum['one']
+ enumeration = next(module['MyEnum'].infer())
+ one = enumeration['one']
self.assertEqual(one.pytype(), '.MyEnum.one')
property_type = '{}.property'.format(bases.BUILTINS)
@@ -401,8 +397,8 @@ class EnumBrainTest(unittest.TestCase):
pass
test = 42
''')
- enum = module['Enumeration']
- test = next(enum.igetattr('test'))
+ enumeration = module['Enumeration']
+ test = next(enumeration.igetattr('test'))
self.assertEqual(test.value, 42)
def test_enum_multiple_base_classes(self):
@@ -415,8 +411,8 @@ class EnumBrainTest(unittest.TestCase):
class MyEnum(Mixin, enum.Enum):
one = 1
""")
- enum = next(module['MyEnum'].infer())
- one = enum['one']
+ enumeration = next(module['MyEnum'].infer())
+ one = enumeration['one']
clazz = one.getattr('__class__')[0]
self.assertTrue(clazz.is_subtype_of('.Mixin'),
@@ -430,8 +426,8 @@ class EnumBrainTest(unittest.TestCase):
one = 1
""")
- enum = next(module['MyEnum'].infer())
- one = enum['one']
+ enumeration = next(module['MyEnum'].infer())
+ one = enumeration['one']
clazz = one.getattr('__class__')[0]
int_type = '{}.{}'.format(bases.BUILTINS, 'int')
diff --git a/astroid/tests/unittest_builder.py b/astroid/tests/unittest_builder.py
index eb990612..bcd3c4bf 100644
--- a/astroid/tests/unittest_builder.py
+++ b/astroid/tests/unittest_builder.py
@@ -120,7 +120,8 @@ class FromToLineNoTest(unittest.TestCase):
print (arg)
''', __name__)
function = astroid['function']
- self.assertEqual(function.fromlineno, 3) # XXX discussable, but that's what is expected by pylint right now
+ # XXX discussable, but that's what is expected by pylint right now
+ self.assertEqual(function.fromlineno, 3)
self.assertEqual(function.tolineno, 5)
self.assertEqual(function.decorators.fromlineno, 2)
self.assertEqual(function.decorators.tolineno, 2)
@@ -331,7 +332,7 @@ class BuilderTest(unittest.TestCase):
@test_utils.require_version(maxver='3.0')
def test_inspect_build_instance(self):
"""test astroid tree build from a living object"""
- import exceptions
+ import exceptions # pylint: disable=redefined-outer-name
builtin_ast = self.builder.inspect_build(exceptions)
fclass = builtin_ast['OSError']
# things like OSError.strerror are now (2.5) data descriptors on the
@@ -534,6 +535,7 @@ class BuilderTest(unittest.TestCase):
'''
builder.parse(code)
nonetype = nodes.const_factory(None)
+ # pylint: disable=no-member; union type in const_factory, this shouldn't happen
self.assertNotIn('custom_attr', nonetype.locals)
self.assertNotIn('custom_attr', nonetype.instance_attrs)
nonetype = nodes.const_factory({})
diff --git a/astroid/tests/unittest_inference.py b/astroid/tests/unittest_inference.py
index 7ac9fdd4..70eac967 100644
--- a/astroid/tests/unittest_inference.py
+++ b/astroid/tests/unittest_inference.py
@@ -17,6 +17,7 @@
# with astroid. If not, see <http://www.gnu.org/licenses/>.
"""tests for the astroid inference capabilities
"""
+# pylint: disable=too-many-lines
import os
import sys
from functools import partial
@@ -398,9 +399,12 @@ class InferenceTest(resources.SysPathSetup, unittest.TestCase):
self.assertIsInstance(nie, nodes.ClassDef)
nie_ancestors = [c.name for c in nie.ancestors()]
if sys.version_info < (3, 0):
- self.assertEqual(nie_ancestors, ['RuntimeError', 'StandardError', 'Exception', 'BaseException', 'object'])
+ expected = ['RuntimeError', 'StandardError',
+ 'Exception', 'BaseException', 'object']
+ self.assertEqual(nie_ancestors, expected)
else:
- self.assertEqual(nie_ancestors, ['RuntimeError', 'Exception', 'BaseException', 'object'])
+ expected = ['RuntimeError', 'Exception', 'BaseException', 'object']
+ self.assertEqual(nie_ancestors, expected)
def test_except_inference(self):
code = '''
@@ -3188,7 +3192,7 @@ class InferenceTest(resources.SysPathSetup, unittest.TestCase):
''')
# This is not supported yet
inferred = next(ast_node.infer())
- self.assertIsInstance(inferred, ClassDef)
+ self.assertIsInstance(inferred, nodes.ClassDef)
self.assertEqual(inferred.name, 'A')
diff --git a/astroid/tests/unittest_lookup.py b/astroid/tests/unittest_lookup.py
index c91acf70..d4b218c6 100644
--- a/astroid/tests/unittest_lookup.py
+++ b/astroid/tests/unittest_lookup.py
@@ -267,6 +267,7 @@ class LookupTest(resources.SysPathSetup, unittest.TestCase):
self.assertEqual(len(intstmts), 1)
self.assertIsInstance(intstmts[0], nodes.ClassDef)
self.assertEqual(intstmts[0].name, 'int')
+ # pylint: disable=no-member; union type in const_factory, this shouldn't happen
self.assertIs(intstmts[0], nodes.const_factory(1)._proxied)
def test_decorator_arguments_lookup(self):
diff --git a/astroid/tests/unittest_modutils.py b/astroid/tests/unittest_modutils.py
index 644d33f5..6fc2d98f 100644
--- a/astroid/tests/unittest_modutils.py
+++ b/astroid/tests/unittest_modutils.py
@@ -18,10 +18,13 @@
"""
unit tests for module modutils (module manipulation utilities)
"""
+import email
import os
import sys
import unittest
+from xml import etree
+import astroid
from astroid import modutils
from astroid.tests import resources
@@ -116,6 +119,7 @@ class LoadModuleFromPathTest(resources.SysPathSetup, unittest.TestCase):
def test_do_not_load_twice(self):
modutils.load_module_from_modpath(['data', 'lmfp', 'foo'])
modutils.load_module_from_modpath(['data', 'lmfp'])
+ # pylint: disable=no-member; just-once is added by a test file dynamically.
self.assertEqual(len(sys.just_once), 1)
del sys.just_once
@@ -131,24 +135,12 @@ class FileFromModPathTest(resources.SysPathSetup, unittest.TestCase):
self.assertEqual(os.path.realpath(result), os.path.realpath(filename))
def test_std_lib(self):
- from os import path
- self.assertEqual(os.path.realpath(modutils.file_from_modpath(['os', 'path']).replace('.pyc', '.py')),
- os.path.realpath(path.__file__.replace('.pyc', '.py')))
-
- def test_xmlplus(self):
- try:
- # don't fail if pyxml isn't installed
- from xml.dom import ext
- except ImportError:
- pass
- else:
- self.assertEqual(os.path.realpath(modutils.file_from_modpath(['xml', 'dom', 'ext']).replace('.pyc', '.py')),
- os.path.realpath(ext.__file__.replace('.pyc', '.py')))
+ path = modutils.file_from_modpath(['os', 'path']).replace('.pyc', '.py')
+ self.assertEqual(os.path.realpath(path),
+ os.path.realpath(os.path.__file__.replace('.pyc', '.py')))
def test_builtin(self):
- self.assertEqual(modutils.file_from_modpath(['sys']),
- None)
-
+ self.assertIsNone(modutils.file_from_modpath(['sys']))
def test_unexisting(self):
self.assertRaises(ImportError, modutils.file_from_modpath, ['turlututu'])
@@ -178,65 +170,61 @@ class StandardLibModuleTest(resources.SysPathSetup, unittest.TestCase):
def test_builtins(self):
if sys.version_info < (3, 0):
- self.assertEqual(modutils.is_standard_module('__builtin__'), True)
- self.assertEqual(modutils.is_standard_module('builtins'), False)
+ self.assertTrue(modutils.is_standard_module('__builtin__'))
+ self.assertFalse(modutils.is_standard_module('builtins'))
else:
- self.assertEqual(modutils.is_standard_module('__builtin__'), False)
- self.assertEqual(modutils.is_standard_module('builtins'), True)
+ self.assertFalse(modutils.is_standard_module('__builtin__'))
+ self.assertTrue(modutils.is_standard_module('builtins'))
def test_builtin(self):
- self.assertEqual(modutils.is_standard_module('sys'), True)
- self.assertEqual(modutils.is_standard_module('marshal'), True)
+ self.assertTrue(modutils.is_standard_module('sys'))
+ self.assertTrue(modutils.is_standard_module('marshal'))
def test_nonstandard(self):
- self.assertEqual(modutils.is_standard_module('astroid'), False)
+ self.assertFalse(modutils.is_standard_module('astroid'))
def test_unknown(self):
- self.assertEqual(modutils.is_standard_module('unknown'), False)
+ self.assertFalse(modutils.is_standard_module('unknown'))
def test_4(self):
- self.assertEqual(modutils.is_standard_module('hashlib'), True)
- self.assertEqual(modutils.is_standard_module('pickle'), True)
- self.assertEqual(modutils.is_standard_module('email'), True)
- self.assertEqual(modutils.is_standard_module('io'), sys.version_info >= (2, 6))
- self.assertEqual(modutils.is_standard_module('StringIO'), sys.version_info < (3, 0))
- self.assertEqual(modutils.is_standard_module('unicodedata'), True)
+ self.assertTrue(modutils.is_standard_module('hashlib'))
+ self.assertTrue(modutils.is_standard_module('pickle'))
+ self.assertTrue(modutils.is_standard_module('email'))
+ self.assertEqual(modutils.is_standard_module('io'),
+ sys.version_info >= (2, 6))
+ self.assertEqual(modutils.is_standard_module('StringIO'),
+ sys.version_info < (3, 0))
+ self.assertTrue(modutils.is_standard_module('unicodedata'))
def test_custom_path(self):
datadir = resources.find('')
if datadir.startswith(modutils.EXT_LIB_DIR):
self.skipTest('known breakage of is_standard_module on installed package')
- self.assertEqual(modutils.is_standard_module('data.module', (datadir,)), True)
- self.assertEqual(modutils.is_standard_module('data.module', (os.path.abspath(datadir),)), True)
+
+ self.assertTrue(modutils.is_standard_module('data.module', (datadir,)))
+ self.assertTrue(modutils.is_standard_module('data.module', (os.path.abspath(datadir),)))
def test_failing_edge_cases(self):
- from xml import etree
# using a subpackage/submodule path as std_path argument
- self.assertEqual(modutils.is_standard_module('xml.etree', etree.__path__), False)
+ self.assertFalse(modutils.is_standard_module('xml.etree', etree.__path__))
# using a module + object name as modname argument
- self.assertEqual(modutils.is_standard_module('sys.path'), True)
+ self.assertTrue(modutils.is_standard_module('sys.path'))
# this is because only the first package/module is considered
- self.assertEqual(modutils.is_standard_module('sys.whatever'), True)
- self.assertEqual(modutils.is_standard_module('xml.whatever', etree.__path__), False)
+ self.assertTrue(modutils.is_standard_module('sys.whatever'))
+ self.assertFalse(modutils.is_standard_module('xml.whatever', etree.__path__))
class IsRelativeTest(unittest.TestCase):
-
def test_knownValues_is_relative_1(self):
- import email
- self.assertEqual(modutils.is_relative('utils', email.__path__[0]),
- True)
+ self.assertTrue(modutils.is_relative('utils', email.__path__[0]))
def test_knownValues_is_relative_2(self):
- from xml.etree import ElementTree
- self.assertEqual(modutils.is_relative('ElementPath', ElementTree.__file__),
- True)
+ self.assertTrue(modutils.is_relative('ElementPath',
+ etree.ElementTree.__file__))
def test_knownValues_is_relative_3(self):
- import astroid
- self.assertEqual(modutils.is_relative('astroid', astroid.__path__[0]),
- False)
+ self.assertFalse(modutils.is_relative('astroid', astroid.__path__[0]))
class GetModuleFilesTest(unittest.TestCase):
diff --git a/astroid/tests/unittest_nodes.py b/astroid/tests/unittest_nodes.py
index 7050b883..1952bba0 100644
--- a/astroid/tests/unittest_nodes.py
+++ b/astroid/tests/unittest_nodes.py
@@ -74,7 +74,7 @@ class AsStringTest(resources.SysPathSetup, unittest.TestCase):
self.assertEqual(binop.as_string(), '([arg]) * (1)')
def test_frozenset_as_string(self):
- nodes = test_utils.extract_node('''
+ ast_nodes = test_utils.extract_node('''
frozenset((1, 2, 3)) #@
frozenset({1, 2, 3}) #@
frozenset([1, 2, 3,]) #@
@@ -82,14 +82,14 @@ class AsStringTest(resources.SysPathSetup, unittest.TestCase):
frozenset(None) #@
frozenset(1) #@
''')
- nodes = [next(node.infer()) for node in nodes]
+ ast_nodes = [next(node.infer()) for node in ast_nodes]
- self.assertEqual(nodes[0].as_string(), 'frozenset((1, 2, 3))')
- self.assertEqual(nodes[1].as_string(), 'frozenset({1, 2, 3})')
- self.assertEqual(nodes[2].as_string(), 'frozenset([1, 2, 3])')
+ self.assertEqual(ast_nodes[0].as_string(), 'frozenset((1, 2, 3))')
+ self.assertEqual(ast_nodes[1].as_string(), 'frozenset({1, 2, 3})')
+ self.assertEqual(ast_nodes[2].as_string(), 'frozenset([1, 2, 3])')
- self.assertNotEqual(nodes[3].as_string(), 'frozenset(None)')
- self.assertNotEqual(nodes[4].as_string(), 'frozenset(1)')
+ self.assertNotEqual(ast_nodes[3].as_string(), 'frozenset(None)')
+ self.assertNotEqual(ast_nodes[4].as_string(), 'frozenset(1)')
def test_varargs_kwargs_as_string(self):
ast = abuilder.string_build('raise_string(*args, **kwargs)').body[0]
@@ -186,9 +186,9 @@ class _NodeTest(unittest.TestCase):
try:
return self.__class__.__dict__['CODE_Astroid']
except KeyError:
- astroid = builder.parse(self.CODE)
- self.__class__.CODE_Astroid = astroid
- return astroid
+ module = builder.parse(self.CODE)
+ self.__class__.CODE_Astroid = module
+ return module
class IfNodeTest(_NodeTest):
@@ -384,8 +384,8 @@ from ..cave import wine\n\n"""
except PickleError:
pass
'''
- astroid = builder.parse(code)
- handler_type = astroid.body[1].handlers[0].type
+ module = builder.parse(code)
+ handler_type = module.body[1].handlers[0].type
excs = list(node_classes.unpack_infer(handler_type))
# The number of returned object can differ on Python 2
@@ -397,18 +397,18 @@ from ..cave import wine\n\n"""
self.assertIs(excs[-1], util.Uninferable)
def test_absolute_import(self):
- astroid = resources.build_file('data/absimport.py')
+ module = resources.build_file('data/absimport.py')
ctx = contextmod.InferenceContext()
# will fail if absolute import failed
ctx.lookupname = 'message'
- next(astroid['message'].infer(ctx))
+ next(module['message'].infer(ctx))
ctx.lookupname = 'email'
- m = next(astroid['email'].infer(ctx))
+ m = next(module['email'].infer(ctx))
self.assertFalse(m.file.startswith(os.path.join('data', 'email.py')))
def test_more_absolute_import(self):
- astroid = resources.build_file('data/module1abs/__init__.py', 'data.module1abs')
- self.assertIn('sys', astroid.locals)
+ module = resources.build_file('data/module1abs/__init__.py', 'data.module1abs')
+ self.assertIn('sys', module.locals)
class CmpNodeTest(unittest.TestCase):
@@ -420,6 +420,7 @@ class CmpNodeTest(unittest.TestCase):
class ConstNodeTest(unittest.TestCase):
def _test(self, value):
+ # pylint: disable=no-member; union type in const_factory, this shouldn't happen
node = nodes.const_factory(value)
self.assertIsInstance(node._proxied, nodes.ClassDef)
self.assertEqual(node._proxied.name, value.__class__.__name__)
@@ -804,9 +805,8 @@ class ContextTest(unittest.TestCase):
def test_starred_store(self):
node = test_utils.extract_node('a, *b = 1, 2')
starred = node.targets[0].elts[1]
- self.assertIs(starred.ctx, astroid.Store)
-
-
+ self.assertIs(starred.ctx, astroid.Store)
+
if __name__ == '__main__':
unittest.main()
diff --git a/astroid/tests/unittest_protocols.py b/astroid/tests/unittest_protocols.py
index 3b7b4fd0..c0045c77 100644
--- a/astroid/tests/unittest_protocols.py
+++ b/astroid/tests/unittest_protocols.py
@@ -160,7 +160,7 @@ class ProtocolTests(unittest.TestCase):
assigned = list(simple_mul_assnode_2.assigned_stmts())
self.assertNameNodesEqual(['c'], assigned)
- def test_sequence_assigned_stmts_not_accepting_empty_node(self):
+ def test_sequence_assigned_stmts_not_accepting_empty_node(self):
def transform(node):
node.root().locals['__all__'] = [node.value]
diff --git a/astroid/tests/unittest_raw_building.py b/astroid/tests/unittest_raw_building.py
index 2bdaac17..5933d4bf 100644
--- a/astroid/tests/unittest_raw_building.py
+++ b/astroid/tests/unittest_raw_building.py
@@ -40,12 +40,14 @@ class RawBuildingTC(unittest.TestCase):
def test_build_function_args(self):
args = ['myArgs1', 'myArgs2']
+ # pylint: disable=no-member; not aware of postinit
node = build_function('MyFunction', args)
self.assertEqual('myArgs1', node.args.args[0].name)
self.assertEqual('myArgs2', node.args.args[1].name)
self.assertEqual(2, len(node.args.args))
def test_build_function_defaults(self):
+ # pylint: disable=no-member; not aware of postinit
defaults = ['defaults1', 'defaults2']
node = build_function('MyFunction', None, defaults)
self.assertEqual(2, len(node.args.defaults))
diff --git a/astroid/tests/unittest_regrtest.py b/astroid/tests/unittest_regrtest.py
index e409172d..3e6c9b6a 100644
--- a/astroid/tests/unittest_regrtest.py
+++ b/astroid/tests/unittest_regrtest.py
@@ -282,23 +282,23 @@ def test():
''')
self.assertRaises(exceptions.InferenceError, next, node.infer())
- def test_unicode_in_docstring(self):
- # Crashed for astroid==1.4.1
- # Test for https://bitbucket.org/logilab/astroid/issues/273/
-
- # In a regular file, "coding: utf-8" would have been used.
- node = extract_node(u'''
- from __future__ import unicode_literals
-
- class MyClass(object):
- def method(self):
- "With unicode : %s "
-
- instance = MyClass()
- ''' % u"\u2019")
-
- next(node.value.infer()).as_string()
-
+ def test_unicode_in_docstring(self):
+ # Crashed for astroid==1.4.1
+ # Test for https://bitbucket.org/logilab/astroid/issues/273/
+
+ # In a regular file, "coding: utf-8" would have been used.
+ node = extract_node(u'''
+ from __future__ import unicode_literals
+
+ class MyClass(object):
+ def method(self):
+ "With unicode : %s "
+
+ instance = MyClass()
+ ''' % u"\u2019")
+
+ next(node.value.infer()).as_string()
+
class Whatever(object):
a = property(lambda x: x, lambda x: x)
diff --git a/astroid/tests/unittest_scoped_nodes.py b/astroid/tests/unittest_scoped_nodes.py
index e5516a46..c4cb747b 100644
--- a/astroid/tests/unittest_scoped_nodes.py
+++ b/astroid/tests/unittest_scoped_nodes.py
@@ -170,9 +170,9 @@ class ModuleNodeTest(ModuleLoader, unittest.TestCase):
expected = ("Relative import with too many levels "
"({level}) for module {name!r}".format(
- level=level - 1, name=mod.name))
+ level=level - 1, name=mod.name))
self.assertEqual(expected, str(cm.exception))
-
+
def test_import_1(self):
data = '''from . import subpackage'''
sys.path.insert(0, resources.find('data'))
@@ -253,7 +253,8 @@ class FunctionNodeTest(ModuleLoader, unittest.TestCase):
self.assertEqual(func.getattr('__name__')[0].value, 'make_class')
self.assertEqual(len(func.getattr('__doc__')), 1)
self.assertIsInstance(func.getattr('__doc__')[0], nodes.Const)
- self.assertEqual(func.getattr('__doc__')[0].value, 'check base is correctly resolved to Concrete0')
+ self.assertEqual(func.getattr('__doc__')[0].value,
+ 'check base is correctly resolved to Concrete0')
self.assertEqual(len(self.module.getattr('__dict__')), 1)
self.assertIsInstance(self.module.getattr('__dict__')[0], nodes.Dict)
@@ -1075,7 +1076,7 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
self.assertIn('JJJ', ancestors)
def test_no_infinite_metaclass_loop_with_redefine(self):
- nodes = test_utils.extract_node("""
+ ast_nodes = test_utils.extract_node("""
import datetime
class A(datetime.date): #@
@@ -1089,7 +1090,7 @@ class ClassNodeTest(ModuleLoader, unittest.TestCase):
datetime.date = A
datetime.date = B
""")
- for klass in nodes:
+ for klass in ast_nodes:
self.assertEqual(None, klass.metaclass())
def test_metaclass_generator_hack(self):
diff --git a/pylintrc b/pylintrc
index 812cdcb4..06f36690 100644
--- a/pylintrc
+++ b/pylintrc
@@ -70,7 +70,7 @@ confidence=
# 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. See also the "--disable" option for examples.
-#enable=
+enable=useless-suppression
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
@@ -81,20 +81,34 @@ confidence=
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
-disable=invalid-name,protected-access,no-self-use,unused-argument,
- no-member,line-too-long,too-many-branches,too-few-public-methods,
- too-many-public-methods,too-many-instance-attributes,
- super-init-not-called,redefined-builtin,cyclic-import,
- too-many-return-statements,redefined-outer-name,undefined-variable,
- too-many-locals,method-hidden,duplicate-code,attribute-defined-outside-init,
- fixme,missing-docstring,too-many-lines,too-many-statements,undefined-loop-variable,
- unpacking-non-sequence,import-error,no-name-in-module,bad-builtin,too-many-arguments
+
+disable=fixme,invalid-name, missing-docstring, too-few-public-methods,
+ too-many-public-methods,
+ # We know about it and we're doing our best to remove it
+ # in 2.0
+ cyclic-import,
+ # The check is faulty in most cases and it doesn't take in
+ # account how the variable is being used. For instance,
+ # using a variable that is a list or a generator in an
+ # iteration context is fine.
+ redefined-variable-type,
+ # Requires major redesign for fixing this (and private
+ # access in the same project is fine)
+ protected-access,
+ # Most of them are conforming to an API. Putting staticmethod
+ # all over the place changes the aesthetics when these methods
+ # are following a local pattern (visit methods for instance).
+ no-self-use,
+ # API requirements in most of the occurences
+ unused-argument,
+ # Not very useful when it warns about imports..
+ duplicate-code,
[BASIC]
# List of builtins function names that should not be used, separated by a comma
-bad-functions=map,filter
+bad-functions=
# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_
@@ -193,8 +207,8 @@ single-line-if-stmt=no
# List of optional constructs for which whitespace checking is disabled
no-space-check=trailing-comma,dict-separator
-# Maximum number of lines in a module
-max-module-lines=1000
+# Maximum number of lines in a module
+max-module-lines=3000
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
@@ -310,29 +324,29 @@ exclude-protected=_asdict,_fields,_replace,_source,_make
[DESIGN]
# Maximum number of arguments for function / method
-max-args=5
+max-args=10
# 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
+max-locals=25
# Maximum number of return / yield for function / method body
-max-returns=6
+max-returns=10
# Maximum number of branch for function / method body
-max-branches=12
+max-branches=25
# Maximum number of statements in function / method body
-max-statements=50
+max-statements=60
# Maximum number of parents for a class (see R0901).
max-parents=10
# Maximum number of attributes for a class (see R0902).
-max-attributes=7
+max-attributes=15
# Minimum number of public methods for a class (see R0903).
min-public-methods=2