[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#768387: marked as done (unblock: pylint/1.3.1-1)



Your message dated Fri, 07 Nov 2014 11:28:07 +0000
with message-id <434a39c16ea532e5ac5e171976d8d38c@hogwarts.powdarrmonkey.net>
and subject line Re: Bug#768387: unblock: pylint/1.3.1-1
has caused the Debian Bug report #768387,
regarding unblock: pylint/1.3.1-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
768387: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=768387
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- 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 ---
--- Begin Message ---
On 2014-11-07 00:03, Sandro Tosi wrote:
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.

Unblocked.

--
Jonathan Wiltshire                                      jmw@debian.org
Debian Developer                         http://people.debian.org/~jmw

4096R: 0xD3524C51 / 0A55 B7C5 1223 3942 86EC  74C3 5394 479D D352 4C51

<directhex> i have six years of solaris sysadmin experience, from
            8->10. i am well qualified to say it is made from bonghits
			layered on top of bonghits

--- End Message ---

Reply to: