[Python-apps-commits] r13212 - in packages/pyflakes/trunk/debian (2 files)

barry at users.alioth.debian.org barry at users.alioth.debian.org
Thu May 12 17:07:46 UTC 2016


    Date: Thursday, May 12, 2016 @ 17:07:44
  Author: barry
Revision: 13212

d/patches/relative-import.patch: Update based on latest upstream pull
request.

Modified:
  packages/pyflakes/trunk/debian/changelog
  packages/pyflakes/trunk/debian/patches/relative-import.patch

Modified: packages/pyflakes/trunk/debian/changelog
===================================================================
--- packages/pyflakes/trunk/debian/changelog	2016-05-12 07:24:32 UTC (rev 13211)
+++ packages/pyflakes/trunk/debian/changelog	2016-05-12 17:07:44 UTC (rev 13212)
@@ -1,3 +1,10 @@
+pyflakes (1.2.2-3) UNRELEASED; urgency=medium
+
+  * d/patches/relative-import.patch: Update based on latest upstream pull
+    request.
+
+ -- Barry Warsaw <barry at debian.org>  Thu, 12 May 2016 12:57:40 -0400
+
 pyflakes (1.2.2-2) unstable; urgency=medium
 
   * d/patches/relative-import.patch: Fix for crash on relative imports.

Modified: packages/pyflakes/trunk/debian/patches/relative-import.patch
===================================================================
--- packages/pyflakes/trunk/debian/patches/relative-import.patch	2016-05-12 07:24:32 UTC (rev 13211)
+++ packages/pyflakes/trunk/debian/patches/relative-import.patch	2016-05-12 17:07:44 UTC (rev 13212)
@@ -1,18 +1,237 @@
-Description: Relative imports of the form "from . import foo" crash PyFlakes
- 1.2.2 with a TypeError trying to append a string to None.
-Origin: https://bugs.launchpad.net/debian/+source/pyflakes/+bug/1560134/comments/14
+From aafb312ed8a8b1e71386a1f92d4d6af673863592 Mon Sep 17 00:00:00 2001
+From: John Vandenberg <jayvdb at gmail.com>
+Date: Wed, 4 May 2016 17:38:46 +0700
+Subject: [PATCH] Fix TypeError when processing relative imports
+Origin: https://patch-diff.githubusercontent.com/raw/pyflakes/pyflakes/pull/61.patch
 Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=824072
 Bug-Ubuntu: https://bugs.launchpad.net/debian/+source/pyflakes/+bug/1560134
-Forwarded: No
+Forwarded: not-needed
 
+Fixes lp:1560134
+
+aec68a784 added module names to error messages,
+however it caused a TypeError for relative imports
+that do not specify a module such as:
+
+   from . import x
+
+This fixes the TypeError, and also adds the necessary
+leading dots for relative import error messages.
+
+Add tests for various types of relative imports.
+---
+ pyflakes/checker.py           |  23 ++++++---
+ pyflakes/test/test_imports.py | 105 ++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 122 insertions(+), 6 deletions(-)
+
+diff --git a/pyflakes/checker.py b/pyflakes/checker.py
+index 9545cab..43acc69 100644
 --- a/pyflakes/checker.py
 +++ b/pyflakes/checker.py
-@@ -209,7 +209,7 @@
+@@ -209,7 +209,12 @@ class ImportationFrom(Importation):
      def __init__(self, name, source, module, real_name=None):
          self.module = module
          self.real_name = real_name or name
 -        full_name = module + '.' + self.real_name
-+        full_name = (module or '') + '.' + self.real_name
++
++        if module.endswith('.'):
++            full_name = module + self.real_name
++        else:
++            full_name = module + '.' + self.real_name
++
          super(ImportationFrom, self).__init__(name, source, full_name)
  
      def __str__(self):
+@@ -244,7 +249,11 @@ def source_statement(self):
+         return 'from ' + self.fullName + ' import *'
+ 
+     def __str__(self):
+-        return self.name
++        # When the module ends with a ., avoid the ambiguous '..*'
++        if self.fullName.endswith('.'):
++            return self.source_statement
++        else:
++            return self.name
+ 
+ 
+ class FutureImportation(ImportationFrom):
+@@ -1142,6 +1151,8 @@ def IMPORTFROM(self, node):
+         else:
+             self.futuresAllowed = False
+ 
++        module = ('.' * node.level) + (node.module or '')
++
+         for alias in node.names:
+             name = alias.asname or alias.name
+             if node.module == '__future__':
+@@ -1153,15 +1164,15 @@ def IMPORTFROM(self, node):
+                 # Only Python 2, local import * is a SyntaxWarning
+                 if not PY2 and not isinstance(self.scope, ModuleScope):
+                     self.report(messages.ImportStarNotPermitted,
+-                                node, node.module)
++                                node, module)
+                     continue
+ 
+                 self.scope.importStarred = True
+-                self.report(messages.ImportStarUsed, node, node.module)
+-                importation = StarImportation(node.module, node)
++                self.report(messages.ImportStarUsed, node, module)
++                importation = StarImportation(module, node)
+             else:
+                 importation = ImportationFrom(name, node,
+-                                              node.module, alias.name)
++                                              module, alias.name)
+             self.addBinding(node, importation)
+ 
+     def TRY(self, node):
+diff --git a/pyflakes/test/test_imports.py b/pyflakes/test/test_imports.py
+index 9cbd4d7..f1bb5cd 100644
+--- a/pyflakes/test/test_imports.py
++++ b/pyflakes/test/test_imports.py
+@@ -40,6 +40,26 @@ def test_import_submodule_as_source_name(self):
+         assert binding.source_statement == 'import a.b as a'
+         assert str(binding) == 'a.b as a'
+ 
++    def test_importfrom_relative(self):
++        binding = ImportationFrom('a', None, '.', 'a')
++        assert binding.source_statement == 'from . import a'
++        assert str(binding) == '.a'
++
++    def test_importfrom_relative_parent(self):
++        binding = ImportationFrom('a', None, '..', 'a')
++        assert binding.source_statement == 'from .. import a'
++        assert str(binding) == '..a'
++
++    def test_importfrom_relative_with_module(self):
++        binding = ImportationFrom('b', None, '..a', 'b')
++        assert binding.source_statement == 'from ..a import b'
++        assert str(binding) == '..a.b'
++
++    def test_importfrom_relative_with_module_as(self):
++        binding = ImportationFrom('c', None, '..a', 'b')
++        assert binding.source_statement == 'from ..a import b as c'
++        assert str(binding) == '..a.b as c'
++
+     def test_importfrom_member(self):
+         binding = ImportationFrom('b', None, 'a', 'b')
+         assert binding.source_statement == 'from a import b'
+@@ -65,6 +85,11 @@ def test_importfrom_star(self):
+         assert binding.source_statement == 'from a.b import *'
+         assert str(binding) == 'a.b.*'
+ 
++    def test_importfrom_star_relative(self):
++        binding = StarImportation('.b', None)
++        assert binding.source_statement == 'from .b import *'
++        assert str(binding) == '.b.*'
++
+     def test_importfrom_future(self):
+         binding = FutureImportation('print_function', None, None)
+         assert binding.source_statement == 'from __future__ import print_function'
+@@ -77,6 +102,29 @@ def test_unusedImport(self):
+         self.flakes('import fu, bar', m.UnusedImport, m.UnusedImport)
+         self.flakes('from baz import fu, bar', m.UnusedImport, m.UnusedImport)
+ 
++    def test_unusedImport_relative(self):
++        self.flakes('from . import fu', m.UnusedImport)
++        self.flakes('from . import fu as baz', m.UnusedImport)
++        self.flakes('from .. import fu', m.UnusedImport)
++        self.flakes('from ... import fu', m.UnusedImport)
++        self.flakes('from .. import fu as baz', m.UnusedImport)
++        self.flakes('from .bar import fu', m.UnusedImport)
++        self.flakes('from ..bar import fu', m.UnusedImport)
++        self.flakes('from ...bar import fu', m.UnusedImport)
++        self.flakes('from ...bar import fu as baz', m.UnusedImport)
++
++        checker = self.flakes('from . import fu', m.UnusedImport)
++
++        error = checker.messages[0]
++        assert error.message == '%r imported but unused'
++        assert error.message_args == ('.fu', )
++
++        checker = self.flakes('from . import fu as baz', m.UnusedImport)
++
++        error = checker.messages[0]
++        assert error.message == '%r imported but unused'
++        assert error.message_args == ('.fu as baz', )
++
+     def test_aliasedImport(self):
+         self.flakes('import fu as FU, bar as FU',
+                     m.RedefinedWhileUnused, m.UnusedImport)
+@@ -94,6 +142,12 @@ def test_usedImport(self):
+         self.flakes('from baz import fu; print(fu)')
+         self.flakes('import fu; del fu')
+ 
++    def test_usedImport_relative(self):
++        self.flakes('from . import fu; assert fu')
++        self.flakes('from .bar import fu; assert fu')
++        self.flakes('from .. import fu; assert fu')
++        self.flakes('from ..bar import fu as baz; assert baz')
++
+     def test_redefinedWhileUnused(self):
+         self.flakes('import fu; fu = 3', m.RedefinedWhileUnused)
+         self.flakes('import fu; fu, bar = 3', m.RedefinedWhileUnused)
+@@ -687,6 +741,49 @@ def test_importStar(self):
+             pass
+         ''', m.ImportStarUsed, m.UnusedImport)
+ 
++        checker = self.flakes('from fu import *',
++                              m.ImportStarUsed, m.UnusedImport)
++
++        error = checker.messages[0]
++        assert error.message.startswith("'from %s import *' used; unable ")
++        assert error.message_args == ('fu', )
++
++        error = checker.messages[1]
++        assert error.message == '%r imported but unused'
++        assert error.message_args == ('fu.*', )
++
++    def test_importStar_relative(self):
++        """Use of import * from a relative import is reported."""
++        self.flakes('from .fu import *', m.ImportStarUsed, m.UnusedImport)
++        self.flakes('''
++        try:
++            from .fu import *
++        except:
++            pass
++        ''', m.ImportStarUsed, m.UnusedImport)
++
++        checker = self.flakes('from .fu import *',
++                              m.ImportStarUsed, m.UnusedImport)
++
++        error = checker.messages[0]
++        assert error.message.startswith("'from %s import *' used; unable ")
++        assert error.message_args == ('.fu', )
++
++        error = checker.messages[1]
++        assert error.message == '%r imported but unused'
++        assert error.message_args == ('.fu.*', )
++
++        checker = self.flakes('from .. import *',
++                              m.ImportStarUsed, m.UnusedImport)
++
++        error = checker.messages[0]
++        assert error.message.startswith("'from %s import *' used; unable ")
++        assert error.message_args == ('..', )
++
++        error = checker.messages[1]
++        assert error.message == '%r imported but unused'
++        assert error.message_args == ('from .. import *', )
++
+     @skipIf(version_info < (3,),
+             'import * below module level is a warning on Python 2')
+     def test_localImportStar(self):
+@@ -700,6 +797,14 @@ class a:
+             from fu import *
+         ''', m.ImportStarNotPermitted)
+ 
++        checker = self.flakes('''
++        class a:
++            from .. import *
++        ''', m.ImportStarNotPermitted)
++        error = checker.messages[0]
++        assert error.message == "'from %s import *' only allowed at module level"
++        assert error.message_args == ('..', )
++
+     @skipIf(version_info > (3,),
+             'import * below module level is an error on Python 3')
+     def test_importStarNested(self):




More information about the Python-apps-commits mailing list