--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package pylint
This is a bugfix release (althought upstream has done some reorganization of the
test files, but that doesn't impact the program usage) for which astroid was
already unblocked.
unblock pylint/1.3.1-1
-- System Information:
Debian Release: jessie/sid
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (500, 'oldstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.14-2-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
diff -Nru pylint-1.3.0/ChangeLog pylint-1.3.1/ChangeLog
--- pylint-1.3.0/ChangeLog 2014-07-26 07:47:06.000000000 +0100
+++ pylint-1.3.1/ChangeLog 2014-08-24 22:06:20.000000000 +0100
@@ -1,6 +1,38 @@
ChangeLog for Pylint
====================
+2014-08-24 -- 1.3.1
+
+ * Fix a false positive with string formatting checker, when
+ encountering a string which uses only position-based arguments.
+ Closes issue #285.
+
+ * Fix a false positive with string formatting checker, when using
+ keyword argument packing. Closes issue #288.
+
+ * Handle 'too-few-format-args' or 'too-many-format-args' for format
+ strings with both named and positional fields. Closes issue #286.
+
+ * Analyze only strings by the string format checker. Closes issue #287.
+
+ * Properly handle nested format string fields. Closes issue #294.
+
+ * Properly handle unicode format strings for Python 2.
+ Closes issue #296.
+
+ * Fix a false positive with 'too-few-format-args', when the format
+ strings contains duplicate manual position arguments.
+ Closes issue #310.
+
+ * fixme regex handles comments without spaces after the hash.
+ Closes issue #311.
+
+ * Fix a crash encountered when looking for attribute docstrings.
+
+ * Fix a crash which ocurred while checking for 'method-hidden',
+ when the parent frame was something different than a function.
+
+
2014-07-26 -- 1.3.0
* Allow hanging continued indentation for implicitly concatenated
diff -Nru pylint-1.3.0/checkers/base.py pylint-1.3.1/checkers/base.py
--- pylint-1.3.0/checkers/base.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/checkers/base.py 2014-08-24 21:58:08.000000000 +0100
@@ -555,7 +555,7 @@
pass
else:
sibling = expr.previous_sibling()
- if (sibling.scope() is scope and
+ if (sibling is not None and sibling.scope() is scope and
isinstance(sibling, astroid.Assign)):
return
self.add_message('pointless-string-statement', node=node)
diff -Nru pylint-1.3.0/checkers/classes.py pylint-1.3.1/checkers/classes.py
--- pylint-1.3.0/checkers/classes.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/checkers/classes.py 2014-08-24 21:59:46.000000000 +0100
@@ -344,9 +344,11 @@
try:
overridden = klass.instance_attr(node.name)[0] # XXX
overridden_frame = overridden.frame()
- if overridden_frame.type == 'method':
+ if (isinstance(overridden_frame, astroid.Function)
+ and overridden_frame.type == 'method'):
overridden_frame = overridden_frame.parent.frame()
- if isinstance(overridden_frame, Class) and klass._is_subtype_of(overridden_frame.qname()):
+ if (isinstance(overridden_frame, Class)
+ and klass._is_subtype_of(overridden_frame.qname())):
args = (overridden.root().name, overridden.fromlineno)
self.add_message('method-hidden', args=args, node=node)
except astroid.NotFoundError:
diff -Nru pylint-1.3.0/checkers/misc.py pylint-1.3.1/checkers/misc.py
--- pylint-1.3.0/checkers/misc.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/checkers/misc.py 2014-08-24 22:00:54.000000000 +0100
@@ -54,6 +54,17 @@
'separated by a comma.')}),)
def _check_note(self, notes, lineno, line):
+ # First, simply check if the notes are in the line at all. This is an
+ # optimisation to prevent using the regular expression on every line,
+ # but rather only on lines which may actually contain one of the notes.
+ # This prevents a pathological problem with lines that are hundreds
+ # of thousands of characters long.
+ for note in self.config.notes:
+ if note in line:
+ break
+ else:
+ return
+
match = notes.search(line)
if not match:
return
@@ -74,7 +85,7 @@
stream.seek(0) # XXX may be removed with astroid > 0.23
if self.config.notes:
notes = re.compile(
- r'.*?#\s+(%s)(:*\s*.+)' % "|".join(self.config.notes))
+ r'.*?#\s*(%s)(:*\s*.+)' % "|".join(self.config.notes))
else:
notes = None
if module.file_encoding:
diff -Nru pylint-1.3.0/checkers/strings.py pylint-1.3.1/checkers/strings.py
--- pylint-1.3.0/checkers/strings.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/checkers/strings.py 2014-08-24 21:58:08.000000000 +0100
@@ -21,6 +21,10 @@
import sys
import tokenize
import string
+try:
+ import numbers
+except ImportError:
+ numbers = None
import astroid
@@ -122,7 +126,7 @@
else:
def _field_iterator_convertor(iterator):
for is_attr, key in iterator:
- if not isinstance(key, str):
+ if isinstance(key, numbers.Number):
yield is_attr, int(key)
else:
yield is_attr, key
@@ -133,15 +137,13 @@
# the output
return keyname, _field_iterator_convertor(fielditerator)
-def parse_format_method_string(format_string):
- """
- Parses a PEP 3101 format string, returning a tuple of
- (keys, num_args),
- where keys is the set of mapping keys in the format string and num_args
- is the number of arguments required by the format string.
+
+def collect_string_fields(format_string):
+ """ Given a format string, return an iterator
+ of all the valid format fields. It handles nested fields
+ as well.
"""
- keys = []
- num_args = 0
+
formatter = string.Formatter()
parseiterator = formatter.parse(format_string)
try:
@@ -150,20 +152,40 @@
# not a replacement format
continue
name = result[1]
- if name:
- keyname, fielditerator = split_format_field_names(name)
- if not isinstance(keyname, str):
- # In Python 2 it will return long which will lead
- # to different output between 2 and 3
- keyname = int(keyname)
- keys.append((keyname, list(fielditerator)))
- else:
- num_args += 1
+ nested = result[2]
+ yield name
+ if nested:
+ for field in collect_string_fields(nested):
+ yield field
except ValueError:
# probably the format string is invalid
# should we check the argument of the ValueError?
raise utils.IncompleteFormatString(format_string)
- return keys, num_args
+
+def parse_format_method_string(format_string):
+ """
+ Parses a PEP 3101 format string, returning a tuple of
+ (keys, num_args, manual_pos_arg),
+ where keys is the set of mapping keys in the format string, num_args
+ is the number of arguments required by the format string and
+ manual_pos_arg is the number of arguments passed with the position.
+ """
+ keys = []
+ num_args = 0
+ manual_pos_arg = set()
+ for name in collect_string_fields(format_string):
+ if name and str(name).isdigit():
+ manual_pos_arg.add(str(name))
+ elif name:
+ keyname, fielditerator = split_format_field_names(name)
+ if isinstance(keyname, numbers.Number):
+ # In Python 2 it will return long which will lead
+ # to different output between 2 and 3
+ keyname = int(keyname)
+ keys.append((keyname, list(fielditerator)))
+ else:
+ num_args += 1
+ return keys, num_args, len(manual_pos_arg)
def get_args(callfunc):
""" Get the arguments from the given `CallFunc` node.
@@ -219,7 +241,8 @@
utils.parse_format_string(format_string)
except utils.UnsupportedFormatCharacter, e:
c = format_string[e.index]
- self.add_message('bad-format-character', node=node, args=(c, ord(c), e.index))
+ self.add_message('bad-format-character',
+ node=node, args=(c, ord(c), e.index))
return
except utils.IncompleteFormatString:
self.add_message('truncated-format-string', node=node)
@@ -242,7 +265,8 @@
if isinstance(key, basestring):
keys.add(key)
else:
- self.add_message('bad-format-string-key', node=node, args=key)
+ self.add_message('bad-format-string-key',
+ node=node, args=key)
else:
# One of the keys was something other than a
# constant. Since we can't tell what it is,
@@ -252,13 +276,16 @@
if not unknown_keys:
for key in required_keys:
if key not in keys:
- self.add_message('missing-format-string-key', node=node, args=key)
+ self.add_message('missing-format-string-key',
+ node=node, args=key)
for key in keys:
if key not in required_keys:
- self.add_message('unused-format-string-key', node=node, args=key)
+ self.add_message('unused-format-string-key',
+ node=node, args=key)
elif isinstance(args, OTHER_NODES + (astroid.Tuple,)):
type_name = type(args).__name__
- self.add_message('format-needs-mapping', node=node, args=type_name)
+ self.add_message('format-needs-mapping',
+ node=node, args=type_name)
# else:
# The RHS of the format specifier is a name or
# expression. It may be a mapping object, so
@@ -313,6 +340,13 @@
def _check_new_format(self, node, func):
""" Check the new string formatting. """
+ # TODO: skip (for now) format nodes which don't have
+ # an explicit string on the left side of the format operation.
+ # We do this because our inference engine can't properly handle
+ # redefinitions of the original string.
+ # For more details, see issue 287.
+ if not isinstance(node.func.expr, astroid.Const):
+ return
try:
strnode = func.bound.infer().next()
except astroid.InferenceError:
@@ -327,20 +361,24 @@
except astroid.InferenceError:
return
try:
- fields, num_args = parse_format_method_string(strnode.value)
+ fields, num_args, manual_pos = parse_format_method_string(strnode.value)
except utils.IncompleteFormatString:
self.add_message('bad-format-string', node=node)
return
manual_fields = set(field[0] for field in fields
- if isinstance(field[0], int))
+ if isinstance(field[0], numbers.Number))
named_fields = set(field[0] for field in fields
- if isinstance(field[0], str))
- if manual_fields and num_args:
+ if isinstance(field[0], basestring))
+ if num_args and manual_pos:
self.add_message('format-combined-specification',
node=node)
return
+ check_args = False
+ # Consider "{[0]} {[1]}" as num_args.
+ num_args += sum(1 for field in named_fields
+ if field == '')
if named_fields:
for field in named_fields:
if field not in named and field:
@@ -352,7 +390,23 @@
self.add_message('unused-format-string-argument',
node=node,
args=(field, ))
+ # num_args can be 0 if manual_pos is not.
+ num_args = num_args or manual_pos
+ if positional or num_args:
+ empty = any(True for field in named_fields
+ if field == '')
+ if named or empty:
+ # Verify the required number of positional arguments
+ # only if the .format got at least one keyword argument.
+ # This means that the format strings accepts both
+ # positional and named fields and we should warn
+ # when one of the them is missing or is extra.
+ check_args = True
else:
+ check_args = True
+ if check_args:
+ # num_args can be 0 if manual_pos is not.
+ num_args = num_args or manual_pos
if positional > num_args:
# We can have two possibilities:
# * "{0} {1}".format(a, b)
@@ -363,9 +417,6 @@
elif positional < num_args:
self.add_message('too-few-format-args', node=node)
- if manual_fields and positional < len(manual_fields):
- self.add_message('too-few-format-args', node=node)
-
self._check_new_format_specifiers(node, fields, named)
def _check_new_format_specifiers(self, node, fields, named):
@@ -381,26 +432,32 @@
# to 0. It will not be present in `named`, so use the value
# 0 for it.
key = 0
- if isinstance(key, int):
+ if isinstance(key, numbers.Number):
try:
- argument = utils.get_argument_from_call(node, key)
+ argname = utils.get_argument_from_call(node, key)
except utils.NoSuchArgumentError:
continue
else:
if key not in named:
continue
- argument = named[key]
- if argument in (astroid.YES, None):
+ argname = named[key]
+ if argname in (astroid.YES, None):
continue
try:
- argument = argument.infer().next()
+ argument = argname.infer().next()
except astroid.InferenceError:
continue
if not specifiers or argument is astroid.YES:
# No need to check this key if it doesn't
# use attribute / item access
continue
-
+ if argument.parent and isinstance(argument.parent, astroid.Arguments):
+ # Check to see if our argument is kwarg or vararg,
+ # and skip the check for this argument if so, because when inferring,
+ # astroid will return empty objects (dicts and tuples) and
+ # that can lead to false positives.
+ if argname.name in (argument.parent.kwarg, argument.parent.vararg):
+ continue
previous = argument
parsed = []
for is_attribute, specifier in specifiers:
diff -Nru pylint-1.3.0/checkers/variables.py pylint-1.3.1/checkers/variables.py
--- pylint-1.3.0/checkers/variables.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/checkers/variables.py 2014-08-24 21:58:08.000000000 +0100
@@ -649,8 +649,15 @@
# comprehension and its direct outer scope is a class
if scope_type == 'class' and i != start_index and not (
base_scope_type == 'comprehension' and i == start_index-1):
- # XXX find a way to handle class scope in a smoother way
- continue
+ # Detect if we are in a local class scope, as an assignment.
+ # For example, the following is fair game.
+ # class A:
+ # b = 1
+ # c = lambda b=b: b * b
+ class_assignment = (isinstance(frame, astroid.Class) and
+ name in frame.locals)
+ if not class_assignment:
+ continue
# the name has already been consumed, only check it's not a loop
# variable used outside the loop
if name in consumed:
@@ -689,8 +696,14 @@
maybee0601 = not any(isinstance(child, astroid.Nonlocal)
and name in child.names
for child in defframe.get_children())
+ if (self._to_consume[-1][-1] == 'lambda' and
+ isinstance(frame, astroid.Class)
+ and name in frame.locals):
+ maybee0601 = True
+ else:
+ maybee0601 = maybee0601 and stmt.fromlineno <= defstmt.fromlineno
+
if (maybee0601
- and stmt.fromlineno <= defstmt.fromlineno
and not is_defined_before(node)
and not are_exclusive(stmt, defstmt, ('NameError',
'Exception',
@@ -699,8 +712,27 @@
astroid.AssName)):
self.add_message('undefined-variable', args=name, node=node)
elif self._to_consume[-1][-1] != 'lambda':
- # E0601 may *not* occurs in lambda scope
+ # E0601 may *not* occurs in lambda scope.
self.add_message('used-before-assignment', args=name, node=node)
+ elif self._to_consume[-1][-1] == 'lambda':
+ # E0601 can occur in class-level scope in lambdas, as in
+ # the following example:
+ # class A:
+ # x = lambda attr: f + attr
+ # f = 42
+ if isinstance(frame, astroid.Class) and name in frame.locals:
+ if isinstance(node.parent, astroid.Arguments):
+ # Doing the following is fine:
+ # class A:
+ # x = 42
+ # y = lambda attr=x: attr
+ if stmt.fromlineno <= defstmt.fromlineno:
+ self.add_message('used-before-assignment',
+ args=name, node=node)
+ else:
+ self.add_message('undefined-variable',
+ args=name, node=node)
+
if isinstance(node, astroid.AssName): # Aug AssName
del consumed[name]
else:
diff -Nru pylint-1.3.0/debian/changelog pylint-1.3.1/debian/changelog
--- pylint-1.3.0/debian/changelog 2014-11-07 00:02:08.000000000 +0000
+++ pylint-1.3.1/debian/changelog 2014-11-07 00:02:08.000000000 +0000
@@ -1,3 +1,15 @@
+pylint (1.3.1-1) unstable; urgency=medium
+
+ * New upstream release
+ * debian/rules
+ - force execution of test suite
+ * debian/control
+ - bump version of astroid to minimum 1.2.1
+ - bump Standards-Version to 3.9.6 (no changes needed)
+ - add dh-python to b-d
+
+ -- Sandro Tosi <morph@debian.org> Thu, 06 Nov 2014 23:53:16 +0000
+
pylint (1.3.0-1) unstable; urgency=medium
* New upstream release
diff -Nru pylint-1.3.0/debian/control pylint-1.3.1/debian/control
--- pylint-1.3.0/debian/control 2014-11-07 00:02:08.000000000 +0000
+++ pylint-1.3.1/debian/control 2014-11-07 00:02:08.000000000 +0000
@@ -3,9 +3,9 @@
Priority: optional
Maintainer: Sandro Tosi <morph@debian.org>
Uploaders: Python Applications Packaging Team <python-apps-team@lists.alioth.debian.org>
-Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~)
-Build-Depends-Indep: python-logilab-common (>= 0.53.0), python-astroid (>= 1.2.0), python-unittest2
-Standards-Version: 3.9.5
+Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), dh-python
+Build-Depends-Indep: python-logilab-common (>= 0.53.0), python-astroid (>= 1.2.1), python-unittest2
+Standards-Version: 3.9.6
XS-Python-Version: >= 2.6
Homepage: http://www.pylint.org/
Vcs-Svn: svn://anonscm.debian.org/python-apps/packages/pylint/trunk/
@@ -13,7 +13,7 @@
Package: pylint
Architecture: all
-Depends: ${python:Depends}, ${misc:Depends}, python-logilab-common (>= 0.53.0), python-astroid (>= 1.2.0)
+Depends: ${python:Depends}, ${misc:Depends}, python-logilab-common (>= 0.53.0), python-astroid (>= 1.2.1)
Recommends: python-tk
Description: Python code static checker and UML diagram generator
Pylint is a Python source code analyzer which looks for programming
diff -Nru pylint-1.3.0/debian/rules pylint-1.3.1/debian/rules
--- pylint-1.3.0/debian/rules 2014-11-07 00:02:08.000000000 +0000
+++ pylint-1.3.1/debian/rules 2014-11-07 00:02:08.000000000 +0000
@@ -15,7 +15,7 @@
override_dh_auto_test:
ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
# use the default python version to select the script dir to run the tests
- -./test/fulltest.sh $(PYVERS)
+ -/bin/sh ./test/fulltest.sh $(PYVERS)
endif
diff -Nru pylint-1.3.0/DEPENDS pylint-1.3.1/DEPENDS
--- pylint-1.3.0/DEPENDS 2014-07-26 07:45:30.000000000 +0100
+++ pylint-1.3.1/DEPENDS 2014-08-24 22:07:48.000000000 +0100
@@ -1,3 +1,3 @@
python-logilab-common (>= 0.19.0)
-python-astroid (>= 1.2.0)
+python-astroid (>= 1.2.1)
python-tk
diff -Nru pylint-1.3.0/MANIFEST.in pylint-1.3.1/MANIFEST.in
--- pylint-1.3.0/MANIFEST.in 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/MANIFEST.in 2014-08-24 21:58:08.000000000 +0100
@@ -7,7 +7,7 @@
include elisp/startup elisp/*.el
include man/*.1
recursive-include doc *.rst *.jpeg Makefile *.html *.py
-recursive-include test *.py *.txt *.dot *.sh *.args
+recursive-include test *.py *.txt *.dot *.sh *.rc
include test/input/similar*
include test/input/noext
include test/data/ascript
diff -Nru pylint-1.3.0/PKG-INFO pylint-1.3.1/PKG-INFO
--- pylint-1.3.0/PKG-INFO 2014-07-26 08:29:40.000000000 +0100
+++ pylint-1.3.1/PKG-INFO 2014-08-24 22:20:42.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pylint
-Version: 1.3.0
+Version: 1.3.1
Summary: python code static checker
Home-page: http://www.pylint.org
Author: Logilab
diff -Nru pylint-1.3.0/__pkginfo__.py pylint-1.3.1/__pkginfo__.py
--- pylint-1.3.0/__pkginfo__.py 2014-07-26 07:46:10.000000000 +0100
+++ pylint-1.3.1/__pkginfo__.py 2014-08-24 22:06:36.000000000 +0100
@@ -19,14 +19,14 @@
modname = distname = 'pylint'
-numversion = (1, 3, 0)
+numversion = (1, 3, 1)
version = '.'.join([str(num) for num in numversion])
if sys.version_info < (2, 6):
- install_requires = ['logilab-common >= 0.53.0', 'astroid >= 1.1',
+ install_requires = ['logilab-common >= 0.53.0', 'astroid >= 1.2.1',
'StringFormat']
else:
- install_requires = ['logilab-common >= 0.53.0', 'astroid >= 1.1']
+ install_requires = ['logilab-common >= 0.53.0', 'astroid >= 1.2.1']
license = 'GPL'
description = "python code static checker"
diff -Nru pylint-1.3.0/pylint.egg-info/entry_points.txt pylint-1.3.1/pylint.egg-info/entry_points.txt
--- pylint-1.3.0/pylint.egg-info/entry_points.txt 2014-07-26 08:29:30.000000000 +0100
+++ pylint-1.3.1/pylint.egg-info/entry_points.txt 2014-08-24 22:20:24.000000000 +0100
@@ -1,7 +1,7 @@
[console_scripts]
-pylint = pylint:run_pylint
+pylint-gui = pylint:run_pylint_gui
pyreverse = pylint:run_pyreverse
epylint = pylint:run_epylint
symilar = pylint:run_symilar
-pylint-gui = pylint:run_pylint_gui
+pylint = pylint:run_pylint
diff -Nru pylint-1.3.0/pylint.egg-info/PKG-INFO pylint-1.3.1/pylint.egg-info/PKG-INFO
--- pylint-1.3.0/pylint.egg-info/PKG-INFO 2014-07-26 08:29:30.000000000 +0100
+++ pylint-1.3.1/pylint.egg-info/PKG-INFO 2014-08-24 22:20:24.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pylint
-Version: 1.3.0
+Version: 1.3.1
Summary: python code static checker
Home-page: http://www.pylint.org
Author: Logilab
diff -Nru pylint-1.3.0/pylint.egg-info/requires.txt pylint-1.3.1/pylint.egg-info/requires.txt
--- pylint-1.3.0/pylint.egg-info/requires.txt 2014-07-26 08:29:30.000000000 +0100
+++ pylint-1.3.1/pylint.egg-info/requires.txt 2014-08-24 22:20:24.000000000 +0100
@@ -1,2 +1,2 @@
logilab-common >= 0.53.0
-astroid >= 1.1
\ No newline at end of file
+astroid >= 1.2.1
\ No newline at end of file
diff -Nru pylint-1.3.0/pylint.egg-info/SOURCES.txt pylint-1.3.1/pylint.egg-info/SOURCES.txt
--- pylint-1.3.0/pylint.egg-info/SOURCES.txt 2014-07-26 08:29:32.000000000 +0100
+++ pylint-1.3.1/pylint.egg-info/SOURCES.txt 2014-08-24 22:20:24.000000000 +0100
@@ -116,63 +116,92 @@
test/data/packages_No_Name.dot
test/data/suppliermodule_test.py
test/functional/__init__.py
-test/functional/abstract_abc_methods.args
test/functional/abstract_abc_methods.py
-test/functional/anomalous_unicode_escape.args
+test/functional/abstract_abc_methods.rc
+test/functional/access_to__name__.py
+test/functional/access_to__name__.txt
+test/functional/access_to_protected_members.py
+test/functional/access_to_protected_members.txt
test/functional/anomalous_unicode_escape.py
+test/functional/anomalous_unicode_escape.rc
test/functional/anomalous_unicode_escape.txt
+test/functional/arguments.py
+test/functional/arguments.txt
test/functional/bad_continuation.py
test/functional/bad_continuation.txt
-test/functional/bad_inline_option.args
test/functional/bad_inline_option.py
+test/functional/bad_inline_option.rc
test/functional/bad_inline_option.txt
test/functional/cellvar_escaping_loop.py
test/functional/cellvar_escaping_loop.txt
+test/functional/class_scope.py
+test/functional/class_scope.txt
test/functional/ctor_arguments.py
test/functional/ctor_arguments.txt
test/functional/docstrings.py
test/functional/docstrings.txt
+test/functional/duplicate_dict_literal_key.py
+test/functional/duplicate_dict_literal_key.txt
test/functional/exception_is_binary_op.py
test/functional/exception_is_binary_op.txt
test/functional/future_import.py
-test/functional/future_unicode_literals.args
test/functional/future_unicode_literals.py
+test/functional/future_unicode_literals.rc
test/functional/future_unicode_literals.txt
+test/functional/globals.py
+test/functional/globals.txt
+test/functional/invalid__all__object.py
+test/functional/invalid__all__object.txt
+test/functional/invalid_exceptions_raised.py
+test/functional/invalid_exceptions_raised.txt
test/functional/method_hidden.py
test/functional/method_hidden.txt
-test/functional/name_styles.args
test/functional/name_styles.py
+test/functional/name_styles.rc
test/functional/name_styles.txt
-test/functional/namedtuple_member_inference.args
test/functional/namedtuple_member_inference.py
+test/functional/namedtuple_member_inference.rc
test/functional/namedtuple_member_inference.txt
+test/functional/names_in__all__.py
+test/functional/names_in__all__.txt
test/functional/newstyle__slots__.py
test/functional/newstyle__slots__.txt
+test/functional/newstyle_properties.py
+test/functional/newstyle_properties.txt
+test/functional/pygtk_enum_crash.py
+test/functional/pygtk_enum_crash.rc
+test/functional/pygtk_import.py
+test/functional/pygtk_import.rc
test/functional/redefined_builtin.py
test/functional/redefined_builtin.txt
-test/functional/suspicious_str_strip_call.args
+test/functional/socketerror_import.py
+test/functional/string_formatting.py
+test/functional/string_formatting.txt
+test/functional/string_formatting_py27.py
+test/functional/string_formatting_py27.rc
+test/functional/string_formatting_py27.txt
+test/functional/super_checks.py
+test/functional/super_checks.txt
test/functional/suspicious_str_strip_call.py
+test/functional/suspicious_str_strip_call.rc
test/functional/suspicious_str_strip_call.txt
-test/functional/suspicious_str_strip_call_py3.args
test/functional/suspicious_str_strip_call_py3.py
+test/functional/suspicious_str_strip_call_py3.rc
test/functional/suspicious_str_strip_call_py3.txt
test/functional/undefined_variable.py
test/functional/undefined_variable.txt
+test/functional/uninferable_all_object.py
test/functional/unnecessary_lambda.py
test/functional/unnecessary_lambda.txt
-test/functional/unpacked_exceptions.args
test/functional/unpacked_exceptions.py
+test/functional/unpacked_exceptions.rc
test/functional/unpacked_exceptions.txt
test/functional/useless_else_on_loop.py
test/functional/useless_else_on_loop.txt
test/input/__init__.py
test/input/func_3k_removed_stuff_py_30.py
-test/input/func___name___access.py
test/input/func_abstract_class_instantiated_py30.py
test/input/func_abstract_class_instantiated_py34.py
-test/input/func_all.py
-test/input/func_all_undefined.py
-test/input/func_arguments.py
test/input/func_assert_2uple.py
test/input/func_assigning_non_slot.py
test/input/func_attrs_definition_order.py
@@ -190,7 +219,6 @@
test/input/func_break_or_return_in_try_finally.py
test/input/func_bug113231.py
test/input/func_catching_non_exception.py
-test/input/func_class_access_protected_members.py
test/input/func_class_members.py
test/input/func_continue_not_in_loop.py
test/input/func_dangerous_default.py
@@ -198,7 +226,6 @@
test/input/func_deprecated_lambda_py_30.py
test/input/func_deprecated_module_py30.py
test/input/func_deprecated_module_py_30.py
-test/input/func_dict_keys.py
test/input/func_disable_linebased.py
test/input/func_dotted_ancestor.py
test/input/func_e0001_py30.py
@@ -215,7 +242,6 @@
test/input/func_e13xx.py
test/input/func_empty_module.py
test/input/func_eval_used.py
-test/input/func_exceptions_raise_type_error.py
test/input/func_excess_escapes.py
test/input/func_exec_used_py30.py
test/input/func_f0001.py
@@ -225,7 +251,6 @@
test/input/func_format_py27.py
test/input/func_format_py_27.py
test/input/func_genexpr_var_scope_py24.py
-test/input/func_globals.py
test/input/func_i0011.py
test/input/func_i0012.py
test/input/func_i0013.py
@@ -247,19 +272,14 @@
test/input/func_method_could_be_function.py
test/input/func_method_missing_self.py
test/input/func_method_without_self_but_self_assignment.py
-test/input/func_missing_super_argument_py_30.py
test/input/func_module___dict__.py
test/input/func_more_e0604.py
test/input/func_nameerror_on_string_substitution.py
test/input/func_names_imported_from_module.py
-test/input/func_newstyle_exceptions.py
-test/input/func_newstyle_property.py
-test/input/func_newstyle_super.py
test/input/func_no_dummy_redefined.py
test/input/func_no_final_new_line.py
test/input/func_noerror___init___return_from_inner_function.py
test/input/func_noerror_access_attr_before_def_false_positive.py
-test/input/func_noerror_all_no_inference.py
test/input/func_noerror_base_init_vars.py
test/input/func_noerror_builtin_module_test.py
test/input/func_noerror_class_attributes.py
@@ -320,7 +340,6 @@
test/input/func_reqattrs.py
test/input/func_return_outside_func.py
test/input/func_return_yield_mix_py_33.py
-test/input/func_scope_regrtest.py
test/input/func_set_literal_as_default_py27.py
test/input/func_string_format_py27.py
test/input/func_superfluous_parens.py
@@ -402,13 +421,8 @@
test/input/func_w0401_package/thing2.py
test/messages/builtin_module.txt
test/messages/func_3k_removed_stuff_py_30.txt
-test/messages/func___name___access.txt
-test/messages/func___name___access_py30.txt
test/messages/func_abstract_class_instantiated_py30.txt
test/messages/func_abstract_class_instantiated_py34.txt
-test/messages/func_all.txt
-test/messages/func_all_undefined.txt
-test/messages/func_arguments.txt
test/messages/func_assert_2uple.txt
test/messages/func_assigning_non_slot.txt
test/messages/func_attrs_definition_order.txt
@@ -426,7 +440,6 @@
test/messages/func_break_or_return_in_try_finally.txt
test/messages/func_bug113231.txt
test/messages/func_catching_non_exception.txt
-test/messages/func_class_access_protected_members.txt
test/messages/func_class_members.txt
test/messages/func_continue_not_in_loop.txt
test/messages/func_dangerous_default.txt
@@ -435,7 +448,6 @@
test/messages/func_deprecated_lambda_py_30.txt
test/messages/func_deprecated_module_py30.txt
test/messages/func_deprecated_module_py_30.txt
-test/messages/func_dict_keys.txt
test/messages/func_disable_linebased.txt
test/messages/func_disable_linebased_py30.txt
test/messages/func_dotted_ancestor.txt
@@ -454,7 +466,6 @@
test/messages/func_e13xx_py30.txt
test/messages/func_empty_module.txt
test/messages/func_eval_used.txt
-test/messages/func_exceptions_raise_type_error.txt
test/messages/func_excess_escapes.txt
test/messages/func_exec_used_py30.txt
test/messages/func_f0001.txt
@@ -464,7 +475,6 @@
test/messages/func_format_py27.txt
test/messages/func_format_py_27.txt
test/messages/func_genexpr_var_scope_py24.txt
-test/messages/func_globals.txt
test/messages/func_i0011.txt
test/messages/func_i0012.txt
test/messages/func_i0013.txt
@@ -488,17 +498,10 @@
test/messages/func_method_could_be_function.txt
test/messages/func_method_missing_self.txt
test/messages/func_method_without_self_but_self_assignment.txt
-test/messages/func_missing_super_argument_py_30.txt
test/messages/func_module___dict__.txt
test/messages/func_more_e0604.txt
test/messages/func_nameerror_on_string_substitution.txt
test/messages/func_names_imported_from_module.txt
-test/messages/func_newstyle_exceptions.txt
-test/messages/func_newstyle_exceptions_py30.txt
-test/messages/func_newstyle_property.txt
-test/messages/func_newstyle_property_py30.txt
-test/messages/func_newstyle_super.txt
-test/messages/func_newstyle_super_py30.txt
test/messages/func_no_dummy_redefined.txt
test/messages/func_no_final_new_line.txt
test/messages/func_non_iterator_returned_py30.txt
@@ -516,7 +519,6 @@
test/messages/func_reqattrs.txt
test/messages/func_return_outside_func.txt
test/messages/func_return_yield_mix_py_33.txt
-test/messages/func_scope_regrtest.txt
test/messages/func_set_literal_as_default_py27.txt
test/messages/func_string_format_py27.txt
test/messages/func_superfluous_parens.txt
@@ -603,9 +605,6 @@
test/regrtest_data/numarray_import.py
test/regrtest_data/numarray_inf.py
test/regrtest_data/precedence_test.py
-test/regrtest_data/pygtk_enum_crash.py
-test/regrtest_data/pygtk_import.py
-test/regrtest_data/socketerror_import.py
test/regrtest_data/special_attr_scope_lookup_crash.py
test/regrtest_data/try_finally_disable_msg_crash.py
test/regrtest_data/absimp/__init__.py
diff -Nru pylint-1.3.0/test/functional/abstract_abc_methods.args pylint-1.3.1/test/functional/abstract_abc_methods.args
--- pylint-1.3.0/test/functional/abstract_abc_methods.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/abstract_abc_methods.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,3 +0,0 @@
-[testoptions]
-min_pyver=2.6
-
diff -Nru pylint-1.3.0/test/functional/abstract_abc_methods.rc pylint-1.3.1/test/functional/abstract_abc_methods.rc
--- pylint-1.3.0/test/functional/abstract_abc_methods.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/abstract_abc_methods.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=2.6
+
diff -Nru pylint-1.3.0/test/functional/access_to__name__.py pylint-1.3.1/test/functional/access_to__name__.py
--- pylint-1.3.0/test/functional/access_to__name__.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/access_to__name__.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,21 @@
+# pylint: disable=too-few-public-methods,star-args
+"""test access to __name__ gives undefined member on new/old class instances
+but not on new/old class object
+"""
+
+
+class Aaaa: # <3.0:[old-style-class]
+ """old class"""
+ def __init__(self):
+ print self.__name__ # [no-member]
+ print self.__class__.__name__
+
+class NewClass(object):
+ """new class"""
+
+ def __new__(cls, *args, **kwargs):
+ print 'new', cls.__name__
+ return object.__new__(cls, *args, **kwargs)
+
+ def __init__(self):
+ print 'init', self.__name__ # [no-member]
diff -Nru pylint-1.3.0/test/functional/access_to__name__.txt pylint-1.3.1/test/functional/access_to__name__.txt
--- pylint-1.3.0/test/functional/access_to__name__.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/access_to__name__.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,3 @@
+old-style-class:7:Aaaa:Old-style class defined.
+no-member:10:Aaaa.__init__:Instance of 'Aaaa' has no '__name__' member
+no-member:21:NewClass.__init__:Instance of 'NewClass' has no '__name__' member
diff -Nru pylint-1.3.0/test/functional/access_to_protected_members.py pylint-1.3.1/test/functional/access_to_protected_members.py
--- pylint-1.3.0/test/functional/access_to_protected_members.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/access_to_protected_members.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,39 @@
+# pylint: disable=too-few-public-methods, W0231
+"""Test external access to protected class members."""
+
+
+class MyClass(object):
+ """Class with protected members."""
+ _cls_protected = 5
+
+ def __init__(self, other):
+ MyClass._cls_protected = 6
+ self._protected = 1
+ self.public = other
+ self.attr = 0
+
+ def test(self):
+ """Docstring."""
+ self._protected += self._cls_protected
+ print self.public._haha # [protected-access]
+
+ def clsmeth(cls):
+ """Docstring."""
+ cls._cls_protected += 1
+ print cls._cls_protected
+ clsmeth = classmethod(clsmeth)
+
+class Subclass(MyClass):
+ """Subclass with protected members."""
+
+ def __init__(self):
+ MyClass._protected = 5
+
+INST = Subclass()
+INST.attr = 1
+print INST.attr
+INST._protected = 2 # [protected-access]
+print INST._protected # [protected-access]
+INST._cls_protected = 3 # [protected-access]
+print INST._cls_protected # [protected-access]
+
diff -Nru pylint-1.3.0/test/functional/access_to_protected_members.txt pylint-1.3.1/test/functional/access_to_protected_members.txt
--- pylint-1.3.0/test/functional/access_to_protected_members.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/access_to_protected_members.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,5 @@
+protected-access:18:MyClass.test:Access to a protected member _haha of a client class
+protected-access:35::Access to a protected member _protected of a client class
+protected-access:36::Access to a protected member _protected of a client class
+protected-access:37::Access to a protected member _cls_protected of a client class
+protected-access:38::Access to a protected member _cls_protected of a client class
diff -Nru pylint-1.3.0/test/functional/anomalous_unicode_escape.args pylint-1.3.1/test/functional/anomalous_unicode_escape.args
--- pylint-1.3.0/test/functional/anomalous_unicode_escape.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/anomalous_unicode_escape.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[testoptions]
-min_pyver=2.6
diff -Nru pylint-1.3.0/test/functional/anomalous_unicode_escape.rc pylint-1.3.1/test/functional/anomalous_unicode_escape.rc
--- pylint-1.3.0/test/functional/anomalous_unicode_escape.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/anomalous_unicode_escape.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=2.6
diff -Nru pylint-1.3.0/test/functional/arguments.py pylint-1.3.1/test/functional/arguments.py
--- pylint-1.3.0/test/functional/arguments.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/arguments.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,98 @@
+# pylint: disable=too-few-public-methods
+"""Test function argument checker"""
+
+def decorator(fun):
+ """Decorator"""
+ return fun
+
+
+class DemoClass(object):
+ """Test class for method invocations."""
+
+ @staticmethod
+ def static_method(arg):
+ """static method."""
+ return arg + arg
+
+ @classmethod
+ def class_method(cls, arg):
+ """class method"""
+ return arg + arg
+
+ def method(self, arg):
+ """method."""
+ return (self, arg)
+
+ @decorator
+ def decorated_method(self, arg):
+ """decorated method."""
+ return (self, arg)
+
+
+def function_1_arg(first_argument):
+ """one argument function"""
+ return first_argument
+
+def function_3_args(first_argument, second_argument, third_argument):
+ """three arguments function"""
+ return first_argument, second_argument, third_argument
+
+def function_default_arg(one=1, two=2):
+ """fonction with default value"""
+ return two, one
+
+
+function_1_arg(420)
+function_1_arg() # [no-value-for-parameter]
+function_1_arg(1337, 347) # [too-many-function-args]
+
+function_3_args(420, 789) # [no-value-for-parameter]
+# +1:[no-value-for-parameter,no-value-for-parameter,no-value-for-parameter]
+function_3_args()
+function_3_args(1337, 347, 456)
+function_3_args('bab', 'bebe', None, 5.6) # [too-many-function-args]
+
+function_default_arg(1, two=5)
+function_default_arg(two=5)
+
+function_1_arg(bob=4) # [unexpected-keyword-arg,no-value-for-parameter]
+function_default_arg(1, 4, coin="hello") # [unexpected-keyword-arg]
+
+function_default_arg(1, one=5) # [redundant-keyword-arg]
+
+# Remaining tests are for coverage of correct names in messages.
+LAMBDA = lambda arg: 1
+
+LAMBDA() # [no-value-for-parameter]
+
+def method_tests():
+ """"Method invocations."""
+ demo = DemoClass()
+ demo.static_method() # [no-value-for-parameter]
+ DemoClass.static_method() # [no-value-for-parameter]
+
+ demo.class_method() # [no-value-for-parameter]
+ DemoClass.class_method() # [no-value-for-parameter]
+
+ demo.method() # [no-value-for-parameter]
+ DemoClass.method(demo) # [no-value-for-parameter]
+
+ demo.decorated_method() # [no-value-for-parameter]
+ DemoClass.decorated_method(demo) # [no-value-for-parameter]
+
+# Test a regression (issue #234)
+import sys
+
+class Text(object):
+ """ Regression """
+
+ if sys.version_info > (3,):
+ def __new__(cls):
+ """ empty """
+ return object.__new__(cls)
+ else:
+ def __new__(cls):
+ """ empty """
+ return object.__new__(cls)
+
+Text()
diff -Nru pylint-1.3.0/test/functional/arguments.txt pylint-1.3.1/test/functional/arguments.txt
--- pylint-1.3.0/test/functional/arguments.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/arguments.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,20 @@
+no-value-for-parameter:46::No value for argument 'first_argument' in function call
+too-many-function-args:47::Too many positional arguments for function call
+no-value-for-parameter:49::No value for argument 'third_argument' in function call
+no-value-for-parameter:51::No value for argument 'first_argument' in function call
+no-value-for-parameter:51::No value for argument 'second_argument' in function call
+no-value-for-parameter:51::No value for argument 'third_argument' in function call
+too-many-function-args:53::Too many positional arguments for function call
+no-value-for-parameter:58::No value for argument 'first_argument' in function call
+unexpected-keyword-arg:58::Unexpected keyword argument 'bob' in function call
+unexpected-keyword-arg:59::Unexpected keyword argument 'coin' in function call
+redundant-keyword-arg:61::Argument 'one' passed by position and keyword in function call
+no-value-for-parameter:66::No value for argument 'arg' in lambda call
+no-value-for-parameter:71:method_tests:No value for argument 'arg' in staticmethod call
+no-value-for-parameter:72:method_tests:No value for argument 'arg' in staticmethod call
+no-value-for-parameter:74:method_tests:No value for argument 'arg' in classmethod call
+no-value-for-parameter:75:method_tests:No value for argument 'arg' in classmethod call
+no-value-for-parameter:77:method_tests:No value for argument 'arg' in method call
+no-value-for-parameter:78:method_tests:No value for argument 'arg' in unbound method call
+no-value-for-parameter:80:method_tests:No value for argument 'arg' in method call
+no-value-for-parameter:81:method_tests:No value for argument 'arg' in unbound method call
diff -Nru pylint-1.3.0/test/functional/bad_inline_option.args pylint-1.3.1/test/functional/bad_inline_option.args
--- pylint-1.3.0/test/functional/bad_inline_option.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/bad_inline_option.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[Messages Control]
-enable=I
diff -Nru pylint-1.3.0/test/functional/bad_inline_option.rc pylint-1.3.1/test/functional/bad_inline_option.rc
--- pylint-1.3.0/test/functional/bad_inline_option.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/bad_inline_option.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[Messages Control]
+enable=I
diff -Nru pylint-1.3.0/test/functional/class_scope.py pylint-1.3.1/test/functional/class_scope.py
--- pylint-1.3.0/test/functional/class_scope.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/class_scope.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,22 @@
+# pylint: disable=R0903,W0232
+"""check for scope problems"""
+
+__revision__ = None
+
+class Well(object):
+ """well"""
+ attr = 42
+ get_attr = lambda arg=attr: arg * 24
+ # +1: [used-before-assignment]
+ get_attr_bad = lambda arg=revattr: revattr * 42
+ revattr = 24
+ bad_lambda = lambda: get_attr_bad # [undefined-variable]
+
+ class Data(object):
+ """base hidden class"""
+ class Sub(Data): # [undefined-variable
+ """whaou, is Data found???"""
+ attr = Data() # [undefined-variable]
+ def func(self):
+ """check Sub is not defined here"""
+ return Sub(), self # [undefined-variable]
diff -Nru pylint-1.3.0/test/functional/class_scope.txt pylint-1.3.1/test/functional/class_scope.txt
--- pylint-1.3.0/test/functional/class_scope.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/class_scope.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,4 @@
+used-before-assignment:11:Well.<lambda>:Using variable 'revattr' before assignment
+undefined-variable:13:Well.<lambda>:Undefined variable 'get_attr_bad'
+undefined-variable:19:Well.Sub:Undefined variable 'Data'
+undefined-variable:22:Well.func:Undefined variable 'Sub'
diff -Nru pylint-1.3.0/test/functional/duplicate_dict_literal_key.py pylint-1.3.1/test/functional/duplicate_dict_literal_key.py
--- pylint-1.3.0/test/functional/duplicate_dict_literal_key.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/duplicate_dict_literal_key.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,14 @@
+"""Check multiple key definition"""
+#pylint: disable=C0103
+
+correct_dict = {
+ 'tea': 'for two',
+ 'two': 'for tea',
+}
+
+wrong_dict = { # [duplicate-key]
+ 'tea': 'for two',
+ 'two': 'for tea',
+ 'tea': 'time',
+
+}
diff -Nru pylint-1.3.0/test/functional/duplicate_dict_literal_key.txt pylint-1.3.1/test/functional/duplicate_dict_literal_key.txt
--- pylint-1.3.0/test/functional/duplicate_dict_literal_key.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/duplicate_dict_literal_key.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1 @@
+duplicate-key:9::Duplicate key 'tea' in dictionary
diff -Nru pylint-1.3.0/test/functional/future_unicode_literals.args pylint-1.3.1/test/functional/future_unicode_literals.args
--- pylint-1.3.0/test/functional/future_unicode_literals.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/future_unicode_literals.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[testoptions]
-min_pyver=2.6
\ No newline at end of file
diff -Nru pylint-1.3.0/test/functional/future_unicode_literals.rc pylint-1.3.1/test/functional/future_unicode_literals.rc
--- pylint-1.3.0/test/functional/future_unicode_literals.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/future_unicode_literals.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=2.6
\ No newline at end of file
diff -Nru pylint-1.3.0/test/functional/globals.py pylint-1.3.1/test/functional/globals.py
--- pylint-1.3.0/test/functional/globals.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/globals.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,24 @@
+"""Warnings about global statements and usage of global variables."""
+
+global CSTE # [global-at-module-level]
+print CSTE # [undefined-variable]
+
+CONSTANT = 1
+
+def fix_contant(value):
+ """all this is ok, but try not using global ;)"""
+ global CONSTANT # [global-statement]
+ print CONSTANT
+ CONSTANT = value
+
+
+def other():
+ """global behaviour test"""
+ global HOP # [global-variable-not-assigned]
+ print HOP # [undefined-variable]
+
+
+def define_constant():
+ """ok but somevar is not defined at the module scope"""
+ global SOMEVAR # [global-variable-undefined]
+ SOMEVAR = 2
diff -Nru pylint-1.3.0/test/functional/globals.txt pylint-1.3.1/test/functional/globals.txt
--- pylint-1.3.0/test/functional/globals.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/globals.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,6 @@
+global-at-module-level:3::Using the global statement at the module level
+undefined-variable:4::Undefined variable 'CSTE'
+global-statement:10:fix_contant:Using the global statement
+global-variable-not-assigned:17:other:Using global for 'HOP' but no assignment is done
+undefined-variable:18:other:Undefined variable 'HOP'
+global-variable-undefined:23:define_constant:Global variable 'SOMEVAR' undefined at the module level
diff -Nru pylint-1.3.0/test/functional/invalid__all__object.py pylint-1.3.1/test/functional/invalid__all__object.py
--- pylint-1.3.0/test/functional/invalid__all__object.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/invalid__all__object.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,3 @@
+"""Test that non-inferable __all__ variables do not make Pylint crash."""
+
+__all__ = [SomeUndefinedName] # [undefined-variable]
diff -Nru pylint-1.3.0/test/functional/invalid__all__object.txt pylint-1.3.1/test/functional/invalid__all__object.txt
--- pylint-1.3.0/test/functional/invalid__all__object.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/invalid__all__object.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1 @@
+undefined-variable:3::Undefined variable 'SomeUndefinedName'
diff -Nru pylint-1.3.0/test/functional/invalid_exceptions_raised.py pylint-1.3.1/test/functional/invalid_exceptions_raised.py
--- pylint-1.3.0/test/functional/invalid_exceptions_raised.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/invalid_exceptions_raised.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,51 @@
+# pylint:disable=too-few-public-methods,old-style-class,no-init
+"""test pb with exceptions and old/new style classes"""
+
+
+class ValidException(Exception):
+ """Valid Exception."""
+
+class OldStyleClass:
+ """Not an exception."""
+
+class NewStyleClass(object):
+ """Not an exception."""
+
+
+def good_case():
+ """raise"""
+ raise ValidException('hop')
+
+def bad_case0():
+ """raise"""
+ # +2:<3.0:[nonstandard-exception]
+ # +1:>=3.0:[raising-non-exception]
+ raise OldStyleClass('hop')
+
+def bad_case1():
+ """raise"""
+ raise NewStyleClass() # [raising-non-exception]
+
+def bad_case2():
+ """raise"""
+ # +2:<3.0:[old-raise-syntax,nonstandard-exception]
+ # +1:>=3.0:[raising-non-exception]
+ raise OldStyleClass, 'hop'
+
+def bad_case3():
+ """raise"""
+ raise NewStyleClass # [raising-non-exception]
+
+def bad_case4():
+ """raise"""
+ # +1:<3.0:[old-raise-syntax]
+ raise NotImplemented, 'hop' # [notimplemented-raised]
+
+def bad_case5():
+ """raise"""
+ raise 1 # [raising-bad-type]
+
+def base_case6():
+ """raise"""
+ raise None # [raising-bad-type]
+
diff -Nru pylint-1.3.0/test/functional/invalid_exceptions_raised.txt pylint-1.3.1/test/functional/invalid_exceptions_raised.txt
--- pylint-1.3.0/test/functional/invalid_exceptions_raised.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/invalid_exceptions_raised.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,11 @@
+raising-non-exception:23:bad_case0:Raising a new style class which doesn't inherit from BaseException
+nonstandard-exception:23:bad_case0:Exception doesn't inherit from standard "Exception" class
+raising-non-exception:27:bad_case1:Raising a new style class which doesn't inherit from BaseException
+raising-non-exception:33:bad_case2:Raising a new style class which doesn't inherit from BaseException
+nonstandard-exception:33:bad_case2:Exception doesn't inherit from standard "Exception" class
+old-raise-syntax:33:bad_case2:Use raise ErrorClass(args) instead of raise ErrorClass, args.
+raising-non-exception:37:bad_case3:Raising a new style class which doesn't inherit from BaseException
+notimplemented-raised:42:bad_case4:NotImplemented raised - should raise NotImplementedError
+old-raise-syntax:42:bad_case4:Use raise ErrorClass(args) instead of raise ErrorClass, args.
+raising-bad-type:46:bad_case5:Raising int while only classes, instances or string are allowed
+raising-bad-type:50:base_case6:Raising NoneType while only classes, instances or string are allowed
diff -Nru pylint-1.3.0/test/functional/namedtuple_member_inference.args pylint-1.3.1/test/functional/namedtuple_member_inference.args
--- pylint-1.3.0/test/functional/namedtuple_member_inference.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/namedtuple_member_inference.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[testoptions]
-min_pyver=2.6
diff -Nru pylint-1.3.0/test/functional/namedtuple_member_inference.rc pylint-1.3.1/test/functional/namedtuple_member_inference.rc
--- pylint-1.3.0/test/functional/namedtuple_member_inference.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/namedtuple_member_inference.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=2.6
diff -Nru pylint-1.3.0/test/functional/names_in__all__.py pylint-1.3.1/test/functional/names_in__all__.py
--- pylint-1.3.0/test/functional/names_in__all__.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/names_in__all__.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,46 @@
+# pylint: disable=too-few-public-methods,no-self-use
+"""Test Pylint's use of __all__.
+
+* NonExistant is not defined in this module, and it is listed in
+ __all__. An error is expected.
+
+* This module imports path and republished it in __all__. No errors
+ are expected.
+"""
+
+
+from os import path
+from collections import deque
+
+__all__ = [
+ 'Dummy',
+ 'NonExistant', # [undefined-all-variable]
+ 'path',
+ 'func', # [undefined-all-variable]
+ 'inner', # [undefined-all-variable]
+ 'InnerKlass', deque.__name__] # [undefined-all-variable]
+
+
+class Dummy(object):
+ """A class defined in this module."""
+ pass
+
+DUMMY = Dummy()
+
+def function():
+ """Function docstring
+ """
+ pass
+
+function()
+
+class Klass(object):
+ """A klass which contains a function"""
+ def func(self):
+ """A klass method"""
+ inner = None
+ print inner
+
+ class InnerKlass(object):
+ """A inner klass"""
+ pass
diff -Nru pylint-1.3.0/test/functional/names_in__all__.txt pylint-1.3.1/test/functional/names_in__all__.txt
--- pylint-1.3.0/test/functional/names_in__all__.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/names_in__all__.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,4 @@
+undefined-all-variable:17::Undefined variable name 'NonExistant' in __all__
+undefined-all-variable:19::Undefined variable name 'func' in __all__
+undefined-all-variable:20::Undefined variable name 'inner' in __all__
+undefined-all-variable:21::Undefined variable name 'InnerKlass' in __all__
diff -Nru pylint-1.3.0/test/functional/name_styles.args pylint-1.3.1/test/functional/name_styles.args
--- pylint-1.3.0/test/functional/name_styles.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/name_styles.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-[testoptions]
-min_pyver=2.6
-
-[Messages Control]
-disable=too-few-public-methods,abstract-class-not-used,global-statement
diff -Nru pylint-1.3.0/test/functional/name_styles.rc pylint-1.3.1/test/functional/name_styles.rc
--- pylint-1.3.0/test/functional/name_styles.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/name_styles.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,5 @@
+[testoptions]
+min_pyver=2.6
+
+[Messages Control]
+disable=too-few-public-methods,abstract-class-not-used,global-statement
diff -Nru pylint-1.3.0/test/functional/newstyle_properties.py pylint-1.3.1/test/functional/newstyle_properties.py
--- pylint-1.3.0/test/functional/newstyle_properties.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/newstyle_properties.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,53 @@
+# pylint: disable=too-few-public-methods
+"""Test properties on old style classes and property.setter/deleter usage"""
+
+
+def getter(self):
+ """interesting"""
+ return self
+
+class CorrectClass(object):
+ """correct usage"""
+ method = property(getter, doc='hop')
+
+class OldStyleClass: # <3.0:[old-style-class]
+ """bad usage"""
+ method = property(getter, doc='hop') # <3.0:[property-on-old-class]
+
+ def __init__(self):
+ pass
+
+
+def decorator(func):
+ """Redefining decorator."""
+ def wrapped(self):
+ """Wrapper function."""
+ return func(self)
+ return wrapped
+
+
+class SomeClass(object):
+ """another docstring"""
+
+ def __init__(self):
+ self._prop = None
+
+ @property
+ def prop(self):
+ """I'm the 'prop' property."""
+ return self._prop
+
+ @prop.setter
+ def prop(self, value):
+ """I'm the 'prop' property."""
+ self._prop = value
+
+ @prop.deleter
+ def prop(self):
+ """I'm the 'prop' property."""
+ del self._prop
+
+ @decorator
+ def noregr(self):
+ """Just a normal method with a decorator."""
+ return self.prop
diff -Nru pylint-1.3.0/test/functional/newstyle_properties.txt pylint-1.3.1/test/functional/newstyle_properties.txt
--- pylint-1.3.0/test/functional/newstyle_properties.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/newstyle_properties.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+old-style-class:13:OldStyleClass:Old-style class defined.
+property-on-old-class:15:OldStyleClass:Use of "property" on an old style class
diff -Nru pylint-1.3.0/test/functional/pygtk_enum_crash.py pylint-1.3.1/test/functional/pygtk_enum_crash.py
--- pylint-1.3.0/test/functional/pygtk_enum_crash.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/pygtk_enum_crash.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,11 @@
+# pylint: disable=C0121
+"""http://www.logilab.org/ticket/124337"""
+
+import gtk
+
+def print_some_constant(arg=gtk.BUTTONS_OK):
+ """crash because gtk.BUTTONS_OK, a gtk enum type, is returned by
+ astroid as a constant
+ """
+ print arg
+
diff -Nru pylint-1.3.0/test/functional/pygtk_enum_crash.rc pylint-1.3.1/test/functional/pygtk_enum_crash.rc
--- pylint-1.3.0/test/functional/pygtk_enum_crash.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/pygtk_enum_crash.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[testoptions]
+requires=gtk
diff -Nru pylint-1.3.0/test/functional/pygtk_import.py pylint-1.3.1/test/functional/pygtk_import.py
--- pylint-1.3.0/test/functional/pygtk_import.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/pygtk_import.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,14 @@
+"""Import PyGTK."""
+#pylint: disable=too-few-public-methods,too-many-public-methods
+
+from gtk import VBox
+import gtk
+
+class FooButton(gtk.Button):
+ """extend gtk.Button"""
+ def extend(self):
+ """hop"""
+ print self
+
+print gtk.Button
+print VBox
diff -Nru pylint-1.3.0/test/functional/pygtk_import.rc pylint-1.3.1/test/functional/pygtk_import.rc
--- pylint-1.3.0/test/functional/pygtk_import.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/pygtk_import.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[testoptions]
+requires=gtk
diff -Nru pylint-1.3.0/test/functional/socketerror_import.py pylint-1.3.1/test/functional/socketerror_import.py
--- pylint-1.3.0/test/functional/socketerror_import.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/socketerror_import.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,6 @@
+"""ds"""
+
+__revision__ = '$Id: socketerror_import.py,v 1.2 2005-12-28 14:58:22 syt Exp $'
+
+from socket import error
+print error
diff -Nru pylint-1.3.0/test/functional/string_formatting.py pylint-1.3.1/test/functional/string_formatting.py
--- pylint-1.3.0/test/functional/string_formatting.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/string_formatting.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,121 @@
+"""test for Python 3 string formatting error
+"""
+# pylint: disable=too-few-public-methods, import-error, unused-argument, star-args, line-too-long
+import os
+from missing import Missing
+
+__revision__ = 1
+
+class Custom(object):
+ """ Has a __getattr__ """
+ def __getattr__(self):
+ return self
+
+class Test(object):
+ """ test format attribute access """
+ custom = Custom()
+ ids = [1, 2, 3, [4, 5, 6]]
+
+class Getitem(object):
+ """ test custom getitem for lookup access """
+ def __getitem__(self, index):
+ return 42
+
+class ReturnYes(object):
+ """ can't be properly infered """
+ missing = Missing()
+
+def log(message, message_type="error"):
+ """ Test """
+ return message
+
+def print_good():
+ """ Good format strings """
+ "{0} {1}".format(1, 2)
+ "{0!r:20}".format("Hello")
+ "{!r:20}".format("Hello")
+ "{a!r:20}".format(a="Hello")
+ "{pid}".format(pid=os.getpid())
+ str("{}").format(2)
+ "{0.missing.length}".format(ReturnYes())
+ "{1.missing.length}".format(ReturnYes())
+ "{a.ids[3][1]}".format(a=Test())
+ "{a[0][0]}".format(a=[[1]])
+ "{[0][0]}".format({0: {0: 1}})
+ "{a.test}".format(a=Custom())
+ "{a.__len__}".format(a=[])
+ "{a.ids.__len__}".format(a=Test())
+ "{a[0]}".format(a=Getitem())
+ "{a[0][0]}".format(a=[Getitem()])
+ "{[0][0]}".format(["test"])
+ # these are skipped
+ "{0} {1}".format(*[1, 2])
+ "{a} {b}".format(**{'a': 1, 'b': 2})
+ "{a}".format(a=Missing())
+
+def pprint_bad():
+ """Test string format """
+ "{{}}".format(1) # [too-many-format-args]
+ "{} {".format() # [bad-format-string]
+ "{} }".format() # [bad-format-string]
+ "{0} {}".format(1, 2) # [format-combined-specification]
+ # +1: [missing-format-argument-key, unused-format-string-argument]
+ "{a} {b}".format(a=1, c=2)
+ "{} {a}".format(1, 2) # [missing-format-argument-key]
+ "{} {}".format(1) # [too-few-format-args]
+ "{} {}".format(1, 2, 3) # [too-many-format-args]
+ # +1: [missing-format-argument-key,missing-format-argument-key,missing-format-argument-key]
+ "{a} {b} {c}".format()
+ "{} {}".format(a=1, b=2) # [too-few-format-args]
+ # +1: [missing-format-argument-key, missing-format-argument-key]
+ "{a} {b}".format(1, 2)
+ "{0} {1} {a}".format(1, 2, 3) # [missing-format-argument-key]
+ # +1: [missing-format-attribute]
+ "{a.ids.__len__.length}".format(a=Test())
+ "{a.ids[3][400]}".format(a=Test()) # [invalid-format-index]
+ "{a.ids[3]['string']}".format(a=Test()) # [invalid-format-index]
+ "{[0][1]}".format(["a"]) # [invalid-format-index]
+ "{[0][0]}".format(((1, ))) # [invalid-format-index]
+ # +1: [missing-format-argument-key, unused-format-string-argument]
+ "{b[0]}".format(a=23)
+ "{a[0]}".format(a=object) # [invalid-format-index]
+ log("{}".format(2, "info")) # [too-many-format-args]
+ "{0.missing}".format(2) # [missing-format-attribute]
+ "{0} {1} {2}".format(1, 2) # [too-few-format-args]
+ "{0} {1}".format(1, 2, 3) # [too-many-format-args]
+ "{0} {a}".format(a=4) # [too-few-format-args]
+ "{[0]} {}".format([4]) # [too-few-format-args]
+ "{[0]} {}".format([4], 5, 6) # [too-many-format-args]
+
+def good_issue288(*args, **kwargs):
+ """ Test that using kwargs does not emit a false
+ positive.
+ """
+ 'Hello John Doe {0[0]}'.format(args)
+ 'Hello {0[name]}'.format(kwargs)
+
+def good_issue287():
+ """ Test that the string format checker skips
+ format nodes which don't have a string as a parent
+ (but a subscript, name etc).
+ """
+ name = 'qwerty'
+ ret = {'comment': ''}
+ ret['comment'] = 'MySQL grant {0} is set to be revoked'
+ ret['comment'] = ret['comment'].format(name)
+ return ret, name
+
+def nested_issue294():
+ """ Test nested format fields. """
+ '{0:>{1}}'.format(42, 24)
+ '{0:{a[1]}} {a}'.format(1, a=[1, 2])
+ '{:>{}}'.format(42, 24)
+ '{0:>{1}}'.format(42) # [too-few-format-args]
+ '{0:>{1}}'.format(42, 24, 54) # [too-many-format-args]
+ '{0:{a[1]}}'.format(1) # [missing-format-argument-key]
+ '{0:{a.x}}'.format(1, a=2) # [missing-format-attribute]
+
+def issue310():
+ """ Test a regression using duplicate manual position arguments. """
+ '{0} {1} {0}'.format(1, 2)
+ '{0} {1} {0}'.format(1) # [too-few-format-args]
diff -Nru pylint-1.3.0/test/functional/string_formatting_py27.py pylint-1.3.1/test/functional/string_formatting_py27.py
--- pylint-1.3.0/test/functional/string_formatting_py27.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/string_formatting_py27.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,23 @@
+"""test for Python 2 string formatting error
+"""
+from __future__ import unicode_literals
+# pylint: disable=line-too-long
+__revision__ = 1
+
+def pprint_bad():
+ """Test string format """
+ "{{}}".format(1) # [too-many-format-args]
+ "{} {".format() # [bad-format-string]
+ "{} }".format() # [bad-format-string]
+ "{0} {}".format(1, 2) # [format-combined-specification]
+ # +1: [missing-format-argument-key, unused-format-string-argument]
+ "{a} {b}".format(a=1, c=2)
+ "{} {a}".format(1, 2) # [missing-format-argument-key]
+ "{} {}".format(1) # [too-few-format-args]
+ "{} {}".format(1, 2, 3) # [too-many-format-args]
+ # +1: [missing-format-argument-key,missing-format-argument-key,missing-format-argument-key]
+ "{a} {b} {c}".format()
+ "{} {}".format(a=1, b=2) # [too-few-format-args]
+ # +1: [missing-format-argument-key, missing-format-argument-key]
+ "{a} {b}".format(1, 2)
+
diff -Nru pylint-1.3.0/test/functional/string_formatting_py27.rc pylint-1.3.1/test/functional/string_formatting_py27.rc
--- pylint-1.3.0/test/functional/string_formatting_py27.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/string_formatting_py27.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=2.7
+max_pyver=3.0
\ No newline at end of file
diff -Nru pylint-1.3.0/test/functional/string_formatting_py27.txt pylint-1.3.1/test/functional/string_formatting_py27.txt
--- pylint-1.3.0/test/functional/string_formatting_py27.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/string_formatting_py27.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,15 @@
+too-many-format-args:9:pprint_bad:Too many arguments for format string
+bad-format-string:10:pprint_bad:Invalid format string
+bad-format-string:11:pprint_bad:Invalid format string
+format-combined-specification:12:pprint_bad:Format string contains both automatic field numbering and manual field specification
+missing-format-argument-key:14:pprint_bad:Missing keyword argument u'b' for format string
+unused-format-string-argument:14:pprint_bad:Unused format argument 'c'
+missing-format-argument-key:15:pprint_bad:Missing keyword argument u'a' for format string
+too-few-format-args:16:pprint_bad:Not enough arguments for format string
+too-many-format-args:17:pprint_bad:Too many arguments for format string
+missing-format-argument-key:19:pprint_bad:Missing keyword argument u'a' for format string
+missing-format-argument-key:19:pprint_bad:Missing keyword argument u'b' for format string
+missing-format-argument-key:19:pprint_bad:Missing keyword argument u'c' for format string
+too-few-format-args:20:pprint_bad:Not enough arguments for format string
+missing-format-argument-key:22:pprint_bad:Missing keyword argument u'a' for format string
+missing-format-argument-key:22:pprint_bad:Missing keyword argument u'b' for format string
diff -Nru pylint-1.3.0/test/functional/string_formatting.txt pylint-1.3.1/test/functional/string_formatting.txt
--- pylint-1.3.0/test/functional/string_formatting.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/string_formatting.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,36 @@
+too-many-format-args:58:pprint_bad:Too many arguments for format string
+bad-format-string:59:pprint_bad:Invalid format string
+bad-format-string:60:pprint_bad:Invalid format string
+format-combined-specification:61:pprint_bad:Format string contains both automatic field numbering and manual field specification
+missing-format-argument-key:63:pprint_bad:Missing keyword argument 'b' for format string
+unused-format-string-argument:63:pprint_bad:Unused format argument 'c'
+missing-format-argument-key:64:pprint_bad:Missing keyword argument 'a' for format string
+too-few-format-args:65:pprint_bad:Not enough arguments for format string
+too-many-format-args:66:pprint_bad:Too many arguments for format string
+missing-format-argument-key:68:pprint_bad:Missing keyword argument 'a' for format string
+missing-format-argument-key:68:pprint_bad:Missing keyword argument 'b' for format string
+missing-format-argument-key:68:pprint_bad:Missing keyword argument 'c' for format string
+too-few-format-args:69:pprint_bad:Not enough arguments for format string
+missing-format-argument-key:71:pprint_bad:Missing keyword argument 'a' for format string
+missing-format-argument-key:71:pprint_bad:Missing keyword argument 'b' for format string
+missing-format-argument-key:72:pprint_bad:Missing keyword argument 'a' for format string
+missing-format-attribute:74:pprint_bad:Missing format attribute 'length' in format specifier 'a.ids.__len__.length'
+invalid-format-index:75:pprint_bad:Using invalid lookup key 400 in format specifier 'a.ids[3][400]'
+invalid-format-index:76:pprint_bad:Using invalid lookup key "'string'" in format specifier 'a.ids[3]["\'string\'"]'
+invalid-format-index:77:pprint_bad:Using invalid lookup key 1 in format specifier '0[0][1]'
+invalid-format-index:78:pprint_bad:Using invalid lookup key 0 in format specifier '0[0][0]'
+missing-format-argument-key:80:pprint_bad:Missing keyword argument 'b' for format string
+unused-format-string-argument:80:pprint_bad:Unused format argument 'a'
+invalid-format-index:81:pprint_bad:Using invalid lookup key 0 in format specifier 'a[0]'
+too-many-format-args:82:pprint_bad:Too many arguments for format string
+missing-format-attribute:83:pprint_bad:Missing format attribute 'missing' in format specifier '0.missing'
+too-few-format-args:84:pprint_bad:Not enough arguments for format string
+too-many-format-args:85:pprint_bad:Too many arguments for format string
+too-few-format-args:86:pprint_bad:Not enough arguments for format string
+too-few-format-args:87:pprint_bad:Not enough arguments for format string
+too-many-format-args:88:pprint_bad:Too many arguments for format string
+too-few-format-args:113:nested_issue294:Not enough arguments for format string
+too-many-format-args:114:nested_issue294:Too many arguments for format string
+missing-format-argument-key:115:nested_issue294:Missing keyword argument 'a' for format string
+missing-format-attribute:116:nested_issue294:Missing format attribute 'x' in format specifier 'a.x'
+too-few-format-args:121:issue310:Not enough arguments for format string
diff -Nru pylint-1.3.0/test/functional/super_checks.py pylint-1.3.1/test/functional/super_checks.py
--- pylint-1.3.0/test/functional/super_checks.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/super_checks.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,46 @@
+# pylint: disable=too-few-public-methods,import-error
+"""check use of super"""
+
+from unknown import Missing
+
+class Aaaa: # <3.0:[old-style-class]
+ """old style"""
+ def hop(self): # <3.0:[super-on-old-class]
+ """hop"""
+ super(Aaaa, self).hop()
+
+ def __init__(self): # <3.0:[super-on-old-class]
+ super(Aaaa, self).__init__()
+
+class NewAaaa(object):
+ """old style"""
+ def hop(self):
+ """hop"""
+ super(NewAaaa, self).hop()
+
+ def __init__(self):
+ super(object, self).__init__() # [bad-super-call]
+
+class Py3kAaaa(NewAaaa):
+ """new style"""
+ def __init__(self):
+ super().__init__() # <3.0:[missing-super-argument]
+
+class Py3kWrongSuper(Py3kAaaa):
+ """new style"""
+ def __init__(self):
+ super(NewAaaa, self).__init__() # [bad-super-call]
+
+class WrongNameRegression(Py3kAaaa):
+ """ test a regression with the message """
+ def __init__(self):
+ super(Missing, self).__init__() # [bad-super-call]
+
+class Getattr(object):
+ """ crash """
+ name = NewAaaa
+
+class CrashSuper(object):
+ """ test a crash with this checker """
+ def __init__(self):
+ super(Getattr.name, self).__init__() # [bad-super-call]
diff -Nru pylint-1.3.0/test/functional/super_checks.txt pylint-1.3.1/test/functional/super_checks.txt
--- pylint-1.3.0/test/functional/super_checks.txt 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/super_checks.txt 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,8 @@
+old-style-class:6:Aaaa:Old-style class defined.
+super-on-old-class:8:Aaaa.hop:Use of super on an old style class
+super-on-old-class:12:Aaaa.__init__:Use of super on an old style class
+bad-super-call:22:NewAaaa.__init__:Bad first argument 'object' given to super()
+missing-super-argument:27:Py3kAaaa.__init__:Missing argument to super()
+bad-super-call:32:Py3kWrongSuper.__init__:Bad first argument 'NewAaaa' given to super()
+bad-super-call:37:WrongNameRegression.__init__:Bad first argument 'Missing' given to super()
+bad-super-call:46:CrashSuper.__init__:Bad first argument 'NewAaaa' given to super()
diff -Nru pylint-1.3.0/test/functional/suspicious_str_strip_call.args pylint-1.3.1/test/functional/suspicious_str_strip_call.args
--- pylint-1.3.0/test/functional/suspicious_str_strip_call.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/suspicious_str_strip_call.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,3 +0,0 @@
-[testoptions]
-min_pyver=2.6
-max_pyver=3.0
diff -Nru pylint-1.3.0/test/functional/suspicious_str_strip_call_py3.args pylint-1.3.1/test/functional/suspicious_str_strip_call_py3.args
--- pylint-1.3.0/test/functional/suspicious_str_strip_call_py3.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/suspicious_str_strip_call_py3.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[testoptions]
-min_pyver=3.0
diff -Nru pylint-1.3.0/test/functional/suspicious_str_strip_call_py3.rc pylint-1.3.1/test/functional/suspicious_str_strip_call_py3.rc
--- pylint-1.3.0/test/functional/suspicious_str_strip_call_py3.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/suspicious_str_strip_call_py3.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.0
diff -Nru pylint-1.3.0/test/functional/suspicious_str_strip_call.rc pylint-1.3.1/test/functional/suspicious_str_strip_call.rc
--- pylint-1.3.0/test/functional/suspicious_str_strip_call.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/suspicious_str_strip_call.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=2.6
+max_pyver=3.0
diff -Nru pylint-1.3.0/test/functional/uninferable_all_object.py pylint-1.3.1/test/functional/uninferable_all_object.py
--- pylint-1.3.0/test/functional/uninferable_all_object.py 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/uninferable_all_object.py 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,9 @@
+"""Test that non-inferable __all__ variables do not make Pylint crash."""
+
+__all__ = sorted([
+ 'Dummy',
+ 'NonExistant',
+ 'path',
+ 'func',
+ 'inner',
+ 'InnerKlass'])
diff -Nru pylint-1.3.0/test/functional/unpacked_exceptions.args pylint-1.3.1/test/functional/unpacked_exceptions.args
--- pylint-1.3.0/test/functional/unpacked_exceptions.args 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/unpacked_exceptions.args 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[testoptions]
-max_pyver=3.0
diff -Nru pylint-1.3.0/test/functional/unpacked_exceptions.rc pylint-1.3.1/test/functional/unpacked_exceptions.rc
--- pylint-1.3.0/test/functional/unpacked_exceptions.rc 1970-01-01 01:00:00.000000000 +0100
+++ pylint-1.3.1/test/functional/unpacked_exceptions.rc 2014-08-24 21:58:08.000000000 +0100
@@ -0,0 +1,2 @@
+[testoptions]
+max_pyver=3.0
diff -Nru pylint-1.3.0/test/functional/unpacked_exceptions.txt pylint-1.3.1/test/functional/unpacked_exceptions.txt
--- pylint-1.3.0/test/functional/unpacked_exceptions.txt 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/functional/unpacked_exceptions.txt 2014-08-24 21:58:08.000000000 +0100
@@ -1,4 +1,4 @@
unpacking-in-except:7:new_style:Implicit unpacking of exceptions is not supported in Python 3
-unpacking-in-except:10:new_style:Implicit unpacking of exceptions is not supported in Python 3
redefine-in-handler:10:new_style:Redefining name 'new_style' from outer scope (line 3) in exception handler
redefine-in-handler:10:new_style:Redefining name 'tuple' from builtins in exception handler
+unpacking-in-except:10:new_style:Implicit unpacking of exceptions is not supported in Python 3
diff -Nru pylint-1.3.0/test/input/func_all.py pylint-1.3.1/test/input/func_all.py
--- pylint-1.3.0/test/input/func_all.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_all.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,46 +0,0 @@
-"""Test Pylint's use of __all__.
-
-* NonExistant is not defined in this module, and it is listed in
- __all__. An error is expected.
-
-* This module imports path and republished it in __all__. No errors
- are expected.
-"""
-# pylint: disable=R0903,R0201,W0612
-
-__revision__ = 0
-
-from os import path
-from collections import deque
-
-__all__ = [
- 'Dummy',
- 'NonExistant',
- 'path',
- 'func',
- 'inner',
- 'InnerKlass', deque.__name__]
-
-
-class Dummy(object):
- """A class defined in this module."""
- pass
-
-DUMMY = Dummy()
-
-def function():
- """Function docstring
- """
- pass
-
-function()
-
-class Klass(object):
- """A klass which contains a function"""
- def func(self):
- """A klass method"""
- inner = None
-
- class InnerKlass(object):
- """A inner klass"""
- pass
diff -Nru pylint-1.3.0/test/input/func_all_undefined.py pylint-1.3.1/test/input/func_all_undefined.py
--- pylint-1.3.0/test/input/func_all_undefined.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_all_undefined.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,8 +0,0 @@
-"""Test that non-inferable __all__ variables do not make Pylint crash.
-
-"""
-# pylint: disable=R0903,R0201,W0612
-
-__revision__ = 0
-
-__all__ = [SomeUndefinedName]
diff -Nru pylint-1.3.0/test/input/func_arguments.py pylint-1.3.1/test/input/func_arguments.py
--- pylint-1.3.0/test/input/func_arguments.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_arguments.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,100 +0,0 @@
-"""Test function argument checker"""
-__revision__ = ''
-
-def decorator(fun):
- """Decorator"""
- return fun
-
-
-class DemoClass(object):
- """Test class for method invocations."""
-
- @staticmethod
- def static_method(arg):
- """static method."""
- return arg + arg
-
- @classmethod
- def class_method(cls, arg):
- """class method"""
- return arg + arg
-
- def method(self, arg):
- """method."""
- return (self, arg)
-
- @decorator
- def decorated_method(self, arg):
- """decorated method."""
- return (self, arg)
-
-
-def function_1_arg(first_argument):
- """one argument function"""
- return first_argument
-
-def function_3_args(first_argument, second_argument, third_argument):
- """three arguments function"""
- return first_argument, second_argument, third_argument
-
-def function_default_arg(one=1, two=2):
- """fonction with default value"""
- return two, one
-
-
-function_1_arg(420)
-function_1_arg()
-function_1_arg(1337, 347)
-
-function_3_args(420, 789)
-function_3_args()
-function_3_args(1337, 347, 456)
-function_3_args('bab', 'bebe', None, 5.6)
-
-function_default_arg(1, two=5)
-function_default_arg(two=5)
-# repeated keyword is syntax error in python >= 2.6:
-# tests are moved to func_keyword_repeat_py25- / func_keyword_repeat_py26
-
-function_1_arg(bob=4)
-function_default_arg(1, 4, coin="hello")
-
-function_default_arg(1, one=5)
-
-# Remaining tests are for coverage of correct names in messages.
-LAMBDA = lambda arg: 1
-
-LAMBDA()
-
-def method_tests():
- """"Method invocations."""
- demo = DemoClass()
- demo.static_method()
- DemoClass.static_method()
-
- demo.class_method()
- DemoClass.class_method()
-
- demo.method()
- DemoClass.method(demo)
-
- demo.decorated_method()
- DemoClass.decorated_method(demo)
-
-# Test a regression (issue #234)
-import sys
-
-# pylint: disable=too-few-public-methods
-class Text(object):
- """ Regression """
-
- if sys.version_info > (3,):
- def __new__(cls):
- """ empty """
- return object.__new__(cls)
- else:
- def __new__(cls):
- """ empty """
- return object.__new__(cls)
-
-Text()
diff -Nru pylint-1.3.0/test/input/func_class_access_protected_members.py pylint-1.3.1/test/input/func_class_access_protected_members.py
--- pylint-1.3.0/test/input/func_class_access_protected_members.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_class_access_protected_members.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,36 +0,0 @@
-# pylint: disable=R0903, C0111, W0231
-"""test external access to protected class members"""
-
-__revision__ = ''
-
-class MyClass(object):
- _cls_protected = 5
-
- def __init__(self, other):
- MyClass._cls_protected = 6
- self._protected = 1
- self.public = other
- self.attr = 0
-
- def test(self):
- self._protected += self._cls_protected
- print self.public._haha
-
- def clsmeth(cls):
- cls._cls_protected += 1
- print cls._cls_protected
- clsmeth = classmethod(clsmeth)
-
-class Subclass(MyClass):
-
- def __init__(self):
- MyClass._protected = 5
-
-INST = Subclass()
-INST.attr = 1
-print INST.attr
-INST._protected = 2
-print INST._protected
-INST._cls_protected = 3
-print INST._cls_protected
-
diff -Nru pylint-1.3.0/test/input/func_dict_keys.py pylint-1.3.1/test/input/func_dict_keys.py
--- pylint-1.3.0/test/input/func_dict_keys.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_dict_keys.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,15 +0,0 @@
-"""Check multiple key definition"""
-#pylint: disable=C0103
-__revision__ = 5
-
-correct_dict = {
- 'tea': 'for two',
- 'two': 'for tea',
-}
-
-wrong_dict = {
- 'tea': 'for two',
- 'two': 'for tea',
- 'tea': 'time',
-
-}
diff -Nru pylint-1.3.0/test/input/func_exceptions_raise_type_error.py pylint-1.3.1/test/input/func_exceptions_raise_type_error.py
--- pylint-1.3.0/test/input/func_exceptions_raise_type_error.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_exceptions_raise_type_error.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-"""
-'E0702': Raising an %s while only classes, instances or string are allowed
-
-Used when something which is neither a class, an instance or a string is
-raised (i.e. a `TypeError` will be raised).
-"""
-
-__revision__ = 1
-
-if __revision__:
- raise 1
-
-if __revision__:
- raise None
diff -Nru pylint-1.3.0/test/input/func_globals.py pylint-1.3.1/test/input/func_globals.py
--- pylint-1.3.0/test/input/func_globals.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_globals.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,40 +0,0 @@
-"""
-'W0601': ('global variable %s undefined at the module level',
- 'Used when a variable is defined through the "global" statement \
- but the variable is not defined in the module scope.'),
-'W0602': ('Using global for %s but no assignment is done',
- 'Used when a variable is defined through the "global" statement \
- but no assignment to this variable is done.'),
-'W0603': ('Using the global statement', # W0121
- 'Used when you use the "global" statement to update a global \
- variable. Pylint just try to discourage this \
- usage. That doesn\'t mean you can not use it !'),
-'W0604': ('Using the global statement at the module level', # W0103
- 'Used when you use the "global" statement at the module level \
- since it has no effect'),
-"""
-
-__revision__ = ''
-
-CONSTANT = 1
-
-def fix_contant(value):
- """all this is ok, but try not using global ;)"""
- global CONSTANT
- print CONSTANT
- CONSTANT = value
-global CSTE # useless
-print CSTE # ko
-
-def other():
- """global behaviour test"""
- global HOP
- print HOP # ko
-
-other()
-
-
-def define_constant():
- """ok but somevar is not defined at the module scope"""
- global SOMEVAR
- SOMEVAR = 2
diff -Nru pylint-1.3.0/test/input/func_missing_super_argument_py_30.py pylint-1.3.1/test/input/func_missing_super_argument_py_30.py
--- pylint-1.3.0/test/input/func_missing_super_argument_py_30.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_missing_super_argument_py_30.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,9 +0,0 @@
-"""Check missing super argument for Python 2"""
-
-__revision__ = 0
-
-class MyClass(object):
- """ New style class """
- def __init__(self):
- super().__init__()
-
\ No newline at end of file
diff -Nru pylint-1.3.0/test/input/func___name___access.py pylint-1.3.1/test/input/func___name___access.py
--- pylint-1.3.0/test/input/func___name___access.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func___name___access.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,21 +0,0 @@
-# pylint: disable=R0903,W0142
-"""test access to __name__ gives undefined member on new/old class instances
-but not on new/old class object
-"""
-
-__revision__ = 1
-
-class Aaaa:
- """old class"""
- def __init__(self):
- print self.__name__
- print self.__class__.__name__
-class NewClass(object):
- """new class"""
-
- def __new__(cls, *args, **kwargs):
- print 'new', cls.__name__
- return object.__new__(cls, *args, **kwargs)
-
- def __init__(self):
- print 'init', self.__name__
diff -Nru pylint-1.3.0/test/input/func_newstyle_exceptions.py pylint-1.3.1/test/input/func_newstyle_exceptions.py
--- pylint-1.3.0/test/input/func_newstyle_exceptions.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_newstyle_exceptions.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,37 +0,0 @@
-# pylint: disable=C0103
-"""test pb with exceptions and old/new style classes"""
-
-__revision__ = 1
-
-class OkException(Exception):
- """bien bien bien"""
-
-class BofException:
- """mouais"""
-
-class NewException(object):
- """non si py < 2.5 !"""
-
-def fonctionOk():
- """raise"""
- raise OkException('hop')
-
-def fonctionBof():
- """raise"""
- raise BofException('hop')
-
-def fonctionNew():
- """raise"""
- raise NewException()
-
-def fonctionBof2():
- """raise"""
- raise BofException, 'hop'
-
-def fonctionNew2():
- """raise"""
- raise NewException
-
-def fonctionNotImplemented():
- """raise"""
- raise NotImplemented, 'hop'
diff -Nru pylint-1.3.0/test/input/func_newstyle_property.py pylint-1.3.1/test/input/func_newstyle_property.py
--- pylint-1.3.0/test/input/func_newstyle_property.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_newstyle_property.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,48 +0,0 @@
-# pylint: disable=R0903
-"""test property on old style class and property.setter/deleter usage"""
-
-__revision__ = 1
-
-def getter(self):
- """interesting"""
- return self
-
-class OkOk(object):
- """correct usage"""
- method = property(getter, doc='hop')
-
-class HaNonNonNon:
- """bad usage"""
- method = property(getter, doc='hop')
-
- def __init__(self):
- pass
-
-import logilab.common.decorators
-
-class SomeClass(object):
- """another docstring"""
-
- def __init__(self):
- self._prop = None
-
- @property
- def prop(self):
- """I'm the 'prop' property."""
- return self._prop
-
- @prop.setter
- def prop(self, value):
- """I'm the 'prop' property."""
- self._prop = value
-
- @prop.deleter
- def prop(self):
- """I'm the 'prop' property."""
- del self._prop
-
- # test regression
- @logilab.common.decorators.cached
- def noregr(self):
- """used to crash in redefined_by_decorator"""
- return self.prop
diff -Nru pylint-1.3.0/test/input/func_newstyle_super.py pylint-1.3.1/test/input/func_newstyle_super.py
--- pylint-1.3.0/test/input/func_newstyle_super.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_newstyle_super.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,47 +0,0 @@
-# pylint: disable=R0903,import-error
-"""check use of super"""
-
-from unknown import Missing
-__revision__ = None
-
-class Aaaa:
- """old style"""
- def hop(self):
- """hop"""
- super(Aaaa, self).hop()
-
- def __init__(self):
- super(Aaaa, self).__init__()
-
-class NewAaaa(object):
- """old style"""
- def hop(self):
- """hop"""
- super(NewAaaa, self).hop()
-
- def __init__(self):
- super(object, self).__init__()
-
-class Py3kAaaa(NewAaaa):
- """new style"""
- def __init__(self):
- super().__init__()
-
-class Py3kWrongSuper(Py3kAaaa):
- """new style"""
- def __init__(self):
- super(NewAaaa, self).__init__()
-
-class WrongNameRegression(Py3kAaaa):
- """ test a regression with the message """
- def __init__(self):
- super(Missing, self).__init__()
-
-class Getattr(object):
- """ crash """
- name = NewAaaa
-
-class CrashSuper(object):
- """ test a crash with this checker """
- def __init__(self):
- super(Getattr.name, self).__init__()
diff -Nru pylint-1.3.0/test/input/func_noerror_all_no_inference.py pylint-1.3.1/test/input/func_noerror_all_no_inference.py
--- pylint-1.3.0/test/input/func_noerror_all_no_inference.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_noerror_all_no_inference.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-"""Test that non-inferable __all__ variables do not make Pylint crash.
-
-"""
-# pylint: disable=R0903,R0201,W0612
-
-__revision__ = 0
-
-__all__ = sorted([
- 'Dummy',
- 'NonExistant',
- 'path',
- 'func',
- 'inner',
- 'InnerKlass'])
diff -Nru pylint-1.3.0/test/input/func_scope_regrtest.py pylint-1.3.1/test/input/func_scope_regrtest.py
--- pylint-1.3.0/test/input/func_scope_regrtest.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_scope_regrtest.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,15 +0,0 @@
-# pylint: disable=R0903,W0232
-"""check for scope problems"""
-
-__revision__ = None
-
-class Well(object):
- """well"""
- class Data(object):
- """base hidden class"""
- class Sub(Data):
- """whaou, is Data found???"""
- attr = Data()
- def func(self):
- """check Sub is not defined here"""
- return Sub(), self
diff -Nru pylint-1.3.0/test/input/func_string_format_py27.py pylint-1.3.1/test/input/func_string_format_py27.py
--- pylint-1.3.0/test/input/func_string_format_py27.py 2014-07-26 07:44:30.000000000 +0100
+++ pylint-1.3.1/test/input/func_string_format_py27.py 2014-08-24 21:58:08.000000000 +0100
@@ -76,3 +76,13 @@
print "{a[0]}".format(a=object)
print log("{}".format(2, "info"))
print "{0.missing}".format(2)
+ print "{0} {1} {2}".format(1, 2)
+ print "{0} {1}".format(1, 2, 3)
+
+def good_issue288(*args, **kwargs):
+ """ Test that using kwargs does not emit a false
+ positive.
+ """
+ data = 'Hello John Doe {0[0]}'.format(args)
+ print data
+ return 'Hello {0[name]}'.format(kwargs)
diff -Nru pylint-1.3.0/test/messages/func_all.txt pylint-1.3.1/test/messages/func_all.txt
--- pylint-1.3.0/test/messages/func_all.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_all.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-E: 18: Undefined variable name 'NonExistant' in __all__
-E: 20: Undefined variable name 'func' in __all__
-E: 21: Undefined variable name 'inner' in __all__
-E: 22: Undefined variable name 'InnerKlass' in __all__
diff -Nru pylint-1.3.0/test/messages/func_all_undefined.txt pylint-1.3.1/test/messages/func_all_undefined.txt
--- pylint-1.3.0/test/messages/func_all_undefined.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_all_undefined.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-E: 8: Undefined variable 'SomeUndefinedName'
diff -Nru pylint-1.3.0/test/messages/func_arguments.txt pylint-1.3.1/test/messages/func_arguments.txt
--- pylint-1.3.0/test/messages/func_arguments.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_arguments.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,20 +0,0 @@
-E: 46: No value for argument 'first_argument' in function call
-E: 47: Too many positional arguments for function call
-E: 49: No value for argument 'third_argument' in function call
-E: 50: No value for argument 'first_argument' in function call
-E: 50: No value for argument 'second_argument' in function call
-E: 50: No value for argument 'third_argument' in function call
-E: 52: Too many positional arguments for function call
-E: 59: No value for argument 'first_argument' in function call
-E: 59: Unexpected keyword argument 'bob' in function call
-E: 60: Unexpected keyword argument 'coin' in function call
-E: 62: Argument 'one' passed by position and keyword in function call
-E: 67: No value for argument 'arg' in lambda call
-E: 72:method_tests: No value for argument 'arg' in staticmethod call
-E: 73:method_tests: No value for argument 'arg' in staticmethod call
-E: 75:method_tests: No value for argument 'arg' in classmethod call
-E: 76:method_tests: No value for argument 'arg' in classmethod call
-E: 78:method_tests: No value for argument 'arg' in method call
-E: 79:method_tests: No value for argument 'arg' in unbound method call
-E: 81:method_tests: No value for argument 'arg' in method call
-E: 82:method_tests: No value for argument 'arg' in unbound method call
diff -Nru pylint-1.3.0/test/messages/func_class_access_protected_members.txt pylint-1.3.1/test/messages/func_class_access_protected_members.txt
--- pylint-1.3.0/test/messages/func_class_access_protected_members.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_class_access_protected_members.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-W: 17:MyClass.test: Access to a protected member _haha of a client class
-W: 32: Access to a protected member _protected of a client class
-W: 33: Access to a protected member _protected of a client class
-W: 34: Access to a protected member _cls_protected of a client class
-W: 35: Access to a protected member _cls_protected of a client class
\ No newline at end of file
diff -Nru pylint-1.3.0/test/messages/func_dict_keys.txt pylint-1.3.1/test/messages/func_dict_keys.txt
--- pylint-1.3.0/test/messages/func_dict_keys.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_dict_keys.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-W: 10: Duplicate key 'tea' in dictionary
diff -Nru pylint-1.3.0/test/messages/func_exceptions_raise_type_error.txt pylint-1.3.1/test/messages/func_exceptions_raise_type_error.txt
--- pylint-1.3.0/test/messages/func_exceptions_raise_type_error.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_exceptions_raise_type_error.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-E: 11: Raising int while only classes, instances or string are allowed
-E: 14: Raising NoneType while only classes, instances or string are allowed
diff -Nru pylint-1.3.0/test/messages/func_globals.txt pylint-1.3.1/test/messages/func_globals.txt
--- pylint-1.3.0/test/messages/func_globals.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_globals.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-E: 27: Undefined variable 'CSTE'
-E: 32:other: Undefined variable 'HOP'
-W: 23:fix_contant: Using the global statement
-W: 26: Using the global statement at the module level
-W: 31:other: Using global for 'HOP' but no assignment is done
-W: 39:define_constant: Global variable 'SOMEVAR' undefined at the module level
diff -Nru pylint-1.3.0/test/messages/func_missing_super_argument_py_30.txt pylint-1.3.1/test/messages/func_missing_super_argument_py_30.txt
--- pylint-1.3.0/test/messages/func_missing_super_argument_py_30.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_missing_super_argument_py_30.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-E: 8:MyClass.__init__: Missing argument to super()
-R: 5:MyClass: Too few public methods (0/2)
diff -Nru pylint-1.3.0/test/messages/func___name___access_py30.txt pylint-1.3.1/test/messages/func___name___access_py30.txt
--- pylint-1.3.0/test/messages/func___name___access_py30.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func___name___access_py30.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,3 +0,0 @@
-E: 11:Aaaa.__init__: Instance of 'Aaaa' has no '__name__' member
-E: 21:NewClass.__init__: Instance of 'NewClass' has no '__name__' member
-
diff -Nru pylint-1.3.0/test/messages/func___name___access.txt pylint-1.3.1/test/messages/func___name___access.txt
--- pylint-1.3.0/test/messages/func___name___access.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func___name___access.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-C: 8:Aaaa: Old-style class defined.
-E: 11:Aaaa.__init__: Instance of 'Aaaa' has no '__name__' member
-E: 21:NewClass.__init__: Instance of 'NewClass' has no '__name__' member
-
diff -Nru pylint-1.3.0/test/messages/func_newstyle_exceptions_py30.txt pylint-1.3.1/test/messages/func_newstyle_exceptions_py30.txt
--- pylint-1.3.0/test/messages/func_newstyle_exceptions_py30.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_newstyle_exceptions_py30.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,5 +0,0 @@
-E: 21:fonctionBof: Raising a new style class which doesn't inherit from BaseException
-E: 25:fonctionNew: Raising a new style class which doesn't inherit from BaseException
-E: 29:fonctionBof2: Raising a new style class which doesn't inherit from BaseException
-E: 33:fonctionNew2: Raising a new style class which doesn't inherit from BaseException
-E: 37:fonctionNotImplemented: NotImplemented raised - should raise NotImplementedError
diff -Nru pylint-1.3.0/test/messages/func_newstyle_exceptions.txt pylint-1.3.1/test/messages/func_newstyle_exceptions.txt
--- pylint-1.3.0/test/messages/func_newstyle_exceptions.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_newstyle_exceptions.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-E: 25:fonctionNew: Raising a new style class which doesn't inherit from BaseException
-E: 33:fonctionNew2: Raising a new style class which doesn't inherit from BaseException
-E: 37:fonctionNotImplemented: NotImplemented raised - should raise NotImplementedError
-W: 21:fonctionBof: Exception doesn't inherit from standard "Exception" class
-W: 29:fonctionBof2: Exception doesn't inherit from standard "Exception" class
-W: 29:fonctionBof2: Use raise ErrorClass(args) instead of raise ErrorClass, args.
-W: 37:fonctionNotImplemented: Use raise ErrorClass(args) instead of raise ErrorClass, args.
diff -Nru pylint-1.3.0/test/messages/func_newstyle_property.txt pylint-1.3.1/test/messages/func_newstyle_property.txt
--- pylint-1.3.0/test/messages/func_newstyle_property.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_newstyle_property.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-C: 14:HaNonNonNon: Old-style class defined.
-W: 16:HaNonNonNon: Use of "property" on an old style class
diff -Nru pylint-1.3.0/test/messages/func_newstyle_super_py30.txt pylint-1.3.1/test/messages/func_newstyle_super_py30.txt
--- pylint-1.3.0/test/messages/func_newstyle_super_py30.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_newstyle_super_py30.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-E: 23:NewAaaa.__init__: Bad first argument 'object' given to super()
-E: 33:Py3kWrongSuper.__init__: Bad first argument 'NewAaaa' given to super()
-E: 38:WrongNameRegression.__init__: Bad first argument 'Missing' given to super()
-E: 47:CrashSuper.__init__: Bad first argument 'NewAaaa' given to super()
\ No newline at end of file
diff -Nru pylint-1.3.0/test/messages/func_newstyle_super.txt pylint-1.3.1/test/messages/func_newstyle_super.txt
--- pylint-1.3.0/test/messages/func_newstyle_super.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_newstyle_super.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,8 +0,0 @@
-C: 7:Aaaa: Old-style class defined.
-E: 9:Aaaa.hop: Use of super on an old style class
-E: 13:Aaaa.__init__: Use of super on an old style class
-E: 23:NewAaaa.__init__: Bad first argument 'object' given to super()
-E: 28:Py3kAaaa.__init__: Missing argument to super()
-E: 33:Py3kWrongSuper.__init__: Bad first argument 'NewAaaa' given to super()
-E: 38:WrongNameRegression.__init__: Bad first argument 'Missing' given to super()
-E: 47:CrashSuper.__init__: Bad first argument 'NewAaaa' given to super()
\ No newline at end of file
diff -Nru pylint-1.3.0/test/messages/func_scope_regrtest.txt pylint-1.3.1/test/messages/func_scope_regrtest.txt
--- pylint-1.3.0/test/messages/func_scope_regrtest.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_scope_regrtest.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-E: 12:Well.Sub: Undefined variable 'Data'
-E: 15:Well.func: Undefined variable 'Sub'
diff -Nru pylint-1.3.0/test/messages/func_string_format_py27.txt pylint-1.3.1/test/messages/func_string_format_py27.txt
--- pylint-1.3.0/test/messages/func_string_format_py27.txt 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/messages/func_string_format_py27.txt 2014-08-24 21:58:08.000000000 +0100
@@ -3,6 +3,8 @@
E: 65:pprint_bad: Too many arguments for format string
E: 67:pprint_bad: Not enough arguments for format string
E: 77:pprint_bad: Too many arguments for format string
+E: 79:pprint_bad: Not enough arguments for format string
+E: 80:pprint_bad: Too many arguments for format string
W: 59:pprint_bad: Invalid format string
W: 60:pprint_bad: Invalid format string
W: 61:pprint_bad: Format string contains both automatic field numbering and manual field specification
diff -Nru pylint-1.3.0/test/regrtest_data/pygtk_enum_crash.py pylint-1.3.1/test/regrtest_data/pygtk_enum_crash.py
--- pylint-1.3.0/test/regrtest_data/pygtk_enum_crash.py 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/regrtest_data/pygtk_enum_crash.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-# pylint: disable=C0121
-"""http://www.logilab.org/ticket/124337"""
-
-import gtk
-
-def print_some_constant(arg=gtk.BUTTONS_OK):
- """crash because gtk.BUTTONS_OK, a gtk enum type, is returned by
- astroid as a constant
- """
- print arg
-
diff -Nru pylint-1.3.0/test/regrtest_data/pygtk_import.py pylint-1.3.1/test/regrtest_data/pygtk_import.py
--- pylint-1.3.0/test/regrtest_data/pygtk_import.py 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/regrtest_data/pygtk_import.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-#pylint: disable=R0903,R0904
-"""#10026"""
-__revision__ = 1
-from gtk import VBox
-import gtk
-
-class FooButton(gtk.Button):
- """extend gtk.Button"""
- def extend(self):
- """hop"""
- print self
-
-print gtk.Button
-print VBox
diff -Nru pylint-1.3.0/test/regrtest_data/socketerror_import.py pylint-1.3.1/test/regrtest_data/socketerror_import.py
--- pylint-1.3.0/test/regrtest_data/socketerror_import.py 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/regrtest_data/socketerror_import.py 1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-"""ds"""
-
-__revision__ = '$Id: socketerror_import.py,v 1.2 2005-12-28 14:58:22 syt Exp $'
-
-from socket import error
-print error
diff -Nru pylint-1.3.0/test/test_func.py pylint-1.3.1/test/test_func.py
--- pylint-1.3.0/test/test_func.py 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/test_func.py 2014-08-24 21:58:08.000000000 +0100
@@ -45,7 +45,9 @@
class TestTests(testlib.TestCase):
"""check that all testable messages have been checked"""
PORTED = set(['I0001', 'I0010', 'W0712', 'E1001', 'W1402', 'E1310', 'E0202',
- 'W0711', 'W0108', 'C0112'])
+ 'W0711', 'W0108', 'E0603', 'W0710', 'E0710', 'E0711', 'W1001',
+ 'E1124', 'E1120', 'E1121', 'E1123', 'E1003', 'E1002', 'W0212',
+ 'W0109', 'E1004', 'W0604', 'W0601', 'W0602', 'C0112', 'C0330'])
@testlib.tag('coverage')
def test_exhaustivity(self):
@@ -73,10 +75,7 @@
callbacks = [cb_test_gen(LintTestUpdate)]
else:
callbacks = [cb_test_gen(LintTestUsingModule)]
- if not MODULES_ONLY:
- callbacks.append(cb_test_gen(LintTestUsingFile))
tests = make_tests(INPUT_DIR, MSG_DIR, filter_rgx, callbacks)
-
if UPDATE:
return tests
@@ -94,12 +93,12 @@
# test all features are tested :)
tests.append(TestTests)
+ assert len(tests) < 196, "Please do not add new test cases here."
return tests
# Create suite
FILTER_RGX = None
-MODULES_ONLY = False
UPDATE = False
def suite():
@@ -108,10 +107,6 @@
if __name__=='__main__':
- if '-m' in sys.argv:
- MODULES_ONLY = True
- sys.argv.remove('-m')
-
if '-u' in sys.argv:
UPDATE = True
sys.argv.remove('-u')
diff -Nru pylint-1.3.0/test/test_functional.py pylint-1.3.1/test/test_functional.py
--- pylint-1.3.0/test/test_functional.py 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/test_functional.py 2014-08-24 21:58:08.000000000 +0100
@@ -1,6 +1,7 @@
"""Functional full-module tests for PyLint."""
from __future__ import with_statement
import ConfigParser
+import contextlib
import cStringIO
import operator
import os
@@ -16,6 +17,10 @@
class NoFileError(Exception):
pass
+# TODOs
+# - use a namedtuple for expected lines
+# - implement exhaustivity tests
+# - call skipTests in setUp when not using logilab.testlib any more.
# If message files should be updated instead of checked.
UPDATE = False
@@ -54,6 +59,7 @@
_CONVERTERS = {
'min_pyver': parse_python_version,
'max_pyver': parse_python_version,
+ 'requires': lambda s: s.split(',')
}
@@ -63,6 +69,7 @@
self.options = {
'min_pyver': (2, 5),
'max_pyver': (4, 0),
+ 'requires': []
}
self._parse_options()
@@ -80,7 +87,7 @@
@property
def option_file(self):
- return self._file_type('.args')
+ return self._file_type('.rc')
@property
def module(self):
@@ -110,6 +117,19 @@
'<=': operator.le,
}
+def parse_expected_output(stream):
+ lines = []
+ for line in stream:
+ parts = line.split(':', 3)
+ if len(parts) != 4:
+ symbol, lineno, obj, msg = lines.pop()
+ lines.append((symbol, lineno, obj, msg + line))
+ else:
+ linenum = int(parts[1])
+ lines.append((parts[0], linenum, parts[2], parts[3]))
+ return lines
+
+
def get_expected_messages(stream):
"""Parses a file and get expected messages.
@@ -180,46 +200,52 @@
pass
self._test_file = test_file
- def shortDescription(self):
- return self._test_file.base
+ def check_test(self):
+ if (sys.version_info < self._test_file.options['min_pyver']
+ or sys.version_info >= self._test_file.options['max_pyver']):
+ self.skipTest(
+ 'Test cannot run with Python %s.' % (sys.version.split(' ')[0],))
+ missing = []
+ for req in self._test_file.options['requires']:
+ try:
+ __import__(req)
+ except ImportError:
+ missing.append(req)
+ if missing:
+ self.skipTest('Requires %s to be present.' % (','.join(missing),))
+
+ def __str__(self):
+ return "%s (%s.%s)" % (self._test_file.base, self.__class__.__module__,
+ self.__class__.__name__)
- def _produces_output(self):
- return True
+ def _open_expected_file(self):
+ return open(self._test_file.expected_output, 'U')
def _get_expected(self):
with open(self._test_file.source) as fobj:
- expected = get_expected_messages(fobj)
+ expected_msgs = get_expected_messages(fobj)
- lines = []
- if self._produces_output() and expected:
- with open(self._test_file.expected_output, 'U') as fobj:
- used = True
- for line in fobj:
- parts = line.split(':', 2)
- if len(parts) != 3 and used:
- lines.append(line)
- else:
- linenum = int(parts[1])
- if (linenum, parts[0]) in expected:
- used = True
- lines.append(line)
- else:
- used = False
- return expected, ''.join(lines)
+ if expected_msgs:
+ with self._open_expected_file() as fobj:
+ expected_output_lines = parse_expected_output(fobj)
+ else:
+ expected_output_lines = []
+ return expected_msgs, expected_output_lines
def _get_received(self):
messages = self._linter.reporter.messages
- messages.sort(key=lambda m: (m.line, m.C, m.msg))
- text_result = cStringIO.StringIO()
- received = {}
+ messages.sort(key=lambda m: (m.line, m.symbol, m.msg))
+ received_msgs = {}
+ received_output_lines = []
for msg in messages:
- received.setdefault((msg.line, msg.symbol), 0)
- received[msg.line, msg.symbol] += 1
- text_result.write(msg.format('{symbol}:{line}:{obj}:{msg}'))
- text_result.write('\n')
- return received, text_result.getvalue()
+ received_msgs.setdefault((msg.line, msg.symbol), 0)
+ received_msgs[msg.line, msg.symbol] += 1
+ received_output_lines.append(
+ (msg.symbol, msg.line, msg.obj or '', msg.msg + '\n'))
+ return received_msgs, received_output_lines
def runTest(self):
+ self.check_test()
self._linter.check([self._test_file.module])
expected_messages, expected_text = self._get_expected()
@@ -238,22 +264,40 @@
self.fail('\n'.join(msg))
self._check_output_text(expected_messages, expected_text, received_text)
- def _check_output_text(self, expected_messages, expected_text, received_text):
- self.assertMultiLineEqual(expected_text, received_text)
+ def _split_lines(self, expected_messages, lines):
+ emitted, omitted = [], []
+ for msg in lines:
+ if (msg[1], msg[0]) in expected_messages:
+ emitted.append(msg)
+ else:
+ omitted.append(msg)
+ return emitted, omitted
+
+ def _check_output_text(self, expected_messages, expected_lines,
+ received_lines):
+ self.assertSequenceEqual(
+ self._split_lines(expected_messages, expected_lines)[0],
+ received_lines)
class LintModuleOutputUpdate(LintModuleTest):
- def _produces_output(self):
- return False
-
- def _check_output_text(self, expected_messages, expected_text, received_text):
- if expected_messages:
+ def _open_expected_file(self):
+ try:
+ return super(LintModuleOutputUpdate, self)._open_expected_file()
+ except IOError:
+ return contextlib.closing(cStringIO.StringIO())
+
+ def _check_output_text(self, expected_messages, expected_lines,
+ received_lines):
+ if not expected_messages:
+ return
+ emitted, remaining = self._split_lines(expected_messages, expected_lines)
+ if emitted != received_lines:
+ remaining.extend(received_lines)
+ remaining.sort(key=lambda m: (m[1], m[0], m[3]))
with open(self._test_file.expected_output, 'w') as fobj:
- fobj.write(received_text)
-
-
-def active_in_running_python_version(options):
- return options['min_pyver'] < sys.version_info <= options['max_pyver']
+ for line in remaining:
+ fobj.write('{0}:{1}:{2}:{3}'.format(*line))
def suite():
@@ -263,17 +307,13 @@
for fname in os.listdir(input_dir):
if fname != '__init__.py' and fname.endswith('.py'):
test_file = TestFile(input_dir, fname)
- if active_in_running_python_version(test_file.options):
- if UPDATE:
- suite.addTest(LintModuleOutputUpdate(test_file))
- else:
- suite.addTest(LintModuleTest(test_file))
+ if UPDATE:
+ suite.addTest(LintModuleOutputUpdate(test_file))
+ else:
+ suite.addTest(LintModuleTest(test_file))
return suite
-# TODO(tmarek): Port exhaustivity test from test_func once all tests have been added.
-
-
if __name__=='__main__':
if '-u' in sys.argv:
UPDATE = True
diff -Nru pylint-1.3.0/test/test_regr.py pylint-1.3.1/test/test_regr.py
--- pylint-1.3.0/test/test_regr.py 2014-07-26 07:44:32.000000000 +0100
+++ pylint-1.3.1/test/test_regr.py 2014-08-24 21:58:08.000000000 +0100
@@ -75,28 +75,6 @@
sys.path.pop(0)
os.chdir(cwd)
- def test_gtk_import(self):
- try:
- import gtk
- except ImportError:
- self.skipTest('test skipped: gtk is not available')
- except RuntimeError: # RuntimeError when missing display
- self.skipTest('no display, can\'t run this test')
- linter.check(join(REGR_DATA, 'pygtk_import.py'))
- got = linter.reporter.finalize().strip()
- self.assertEqual(got, '')
-
- def test_gtk_enum_crash(self):
- try:
- import gtk
- except ImportError:
- self.skipTest('test skipped: gtk is not available')
- except RuntimeError: # RuntimeError when missing display
- self.skipTest('no display, can\'t run this test')
- linter.check(join(REGR_DATA, 'pygtk_enum_crash.py'))
- got = linter.reporter.finalize().strip()
- self.assertEqual(got, '')
-
def test_numarray_inference(self):
try:
from numarray import random_array
@@ -115,11 +93,6 @@
got = linter.reporter.finalize().strip()
self.assertEqual(got, '')
- def test_socketerror_import(self):
- linter.check(join(REGR_DATA, 'socketerror_import.py'))
- got = linter.reporter.finalize().strip()
- self.assertEqual(got, '')
-
def test_class__doc__usage(self):
linter.check(join(REGR_DATA, 'classdoc_usage.py'))
got = linter.reporter.finalize().strip()
--- End Message ---