@@ -40,6 +40,26 @@ def test_import_submodule_as_source_name(self):
40
40
assert binding .source_statement == 'import a.b as a'
41
41
assert str (binding ) == 'a.b as a'
42
42
43
+ def test_importfrom_relative (self ):
44
+ binding = ImportationFrom ('a' , None , '.' , 'a' )
45
+ assert binding .source_statement == 'from . import a'
46
+ assert str (binding ) == '.a'
47
+
48
+ def test_importfrom_relative_parent (self ):
49
+ binding = ImportationFrom ('a' , None , '..' , 'a' )
50
+ assert binding .source_statement == 'from .. import a'
51
+ assert str (binding ) == '..a'
52
+
53
+ def test_importfrom_relative_with_module (self ):
54
+ binding = ImportationFrom ('b' , None , '..a' , 'b' )
55
+ assert binding .source_statement == 'from ..a import b'
56
+ assert str (binding ) == '..a.b'
57
+
58
+ def test_importfrom_relative_with_module_as (self ):
59
+ binding = ImportationFrom ('c' , None , '..a' , 'b' )
60
+ assert binding .source_statement == 'from ..a import b as c'
61
+ assert str (binding ) == '..a.b as c'
62
+
43
63
def test_importfrom_member (self ):
44
64
binding = ImportationFrom ('b' , None , 'a' , 'b' )
45
65
assert binding .source_statement == 'from a import b'
@@ -65,6 +85,11 @@ def test_importfrom_star(self):
65
85
assert binding .source_statement == 'from a.b import *'
66
86
assert str (binding ) == 'a.b.*'
67
87
88
+ def test_importfrom_star_relative (self ):
89
+ binding = StarImportation ('.b' , None )
90
+ assert binding .source_statement == 'from .b import *'
91
+ assert str (binding ) == '.b.*'
92
+
68
93
def test_importfrom_future (self ):
69
94
binding = FutureImportation ('print_function' , None , None )
70
95
assert binding .source_statement == 'from __future__ import print_function'
@@ -77,6 +102,29 @@ def test_unusedImport(self):
77
102
self .flakes ('import fu, bar' , m .UnusedImport , m .UnusedImport )
78
103
self .flakes ('from baz import fu, bar' , m .UnusedImport , m .UnusedImport )
79
104
105
+ def test_unusedImport_relative (self ):
106
+ self .flakes ('from . import fu' , m .UnusedImport )
107
+ self .flakes ('from . import fu as baz' , m .UnusedImport )
108
+ self .flakes ('from .. import fu' , m .UnusedImport )
109
+ self .flakes ('from ... import fu' , m .UnusedImport )
110
+ self .flakes ('from .. import fu as baz' , m .UnusedImport )
111
+ self .flakes ('from .bar import fu' , m .UnusedImport )
112
+ self .flakes ('from ..bar import fu' , m .UnusedImport )
113
+ self .flakes ('from ...bar import fu' , m .UnusedImport )
114
+ self .flakes ('from ...bar import fu as baz' , m .UnusedImport )
115
+
116
+ checker = self .flakes ('from . import fu' , m .UnusedImport )
117
+
118
+ error = checker .messages [0 ]
119
+ assert error .message == '%r imported but unused'
120
+ assert error .message_args == ('.fu' , )
121
+
122
+ checker = self .flakes ('from . import fu as baz' , m .UnusedImport )
123
+
124
+ error = checker .messages [0 ]
125
+ assert error .message == '%r imported but unused'
126
+ assert error .message_args == ('.fu as baz' , )
127
+
80
128
def test_aliasedImport (self ):
81
129
self .flakes ('import fu as FU, bar as FU' ,
82
130
m .RedefinedWhileUnused , m .UnusedImport )
@@ -94,6 +142,12 @@ def test_usedImport(self):
94
142
self .flakes ('from baz import fu; print(fu)' )
95
143
self .flakes ('import fu; del fu' )
96
144
145
+ def test_usedImport_relative (self ):
146
+ self .flakes ('from . import fu; assert fu' )
147
+ self .flakes ('from .bar import fu; assert fu' )
148
+ self .flakes ('from .. import fu; assert fu' )
149
+ self .flakes ('from ..bar import fu as baz; assert baz' )
150
+
97
151
def test_redefinedWhileUnused (self ):
98
152
self .flakes ('import fu; fu = 3' , m .RedefinedWhileUnused )
99
153
self .flakes ('import fu; fu, bar = 3' , m .RedefinedWhileUnused )
@@ -687,6 +741,49 @@ def test_importStar(self):
687
741
pass
688
742
''' , m .ImportStarUsed , m .UnusedImport )
689
743
744
+ checker = self .flakes ('from fu import *' ,
745
+ m .ImportStarUsed , m .UnusedImport )
746
+
747
+ error = checker .messages [0 ]
748
+ assert error .message .startswith ("'from %s import *' used; unable " )
749
+ assert error .message_args == ('fu' , )
750
+
751
+ error = checker .messages [1 ]
752
+ assert error .message == '%r imported but unused'
753
+ assert error .message_args == ('fu.*' , )
754
+
755
+ def test_importStar_relative (self ):
756
+ """Use of import * from a relative import is reported."""
757
+ self .flakes ('from .fu import *' , m .ImportStarUsed , m .UnusedImport )
758
+ self .flakes ('''
759
+ try:
760
+ from .fu import *
761
+ except:
762
+ pass
763
+ ''' , m .ImportStarUsed , m .UnusedImport )
764
+
765
+ checker = self .flakes ('from .fu import *' ,
766
+ m .ImportStarUsed , m .UnusedImport )
767
+
768
+ error = checker .messages [0 ]
769
+ assert error .message .startswith ("'from %s import *' used; unable " )
770
+ assert error .message_args == ('.fu' , )
771
+
772
+ error = checker .messages [1 ]
773
+ assert error .message == '%r imported but unused'
774
+ assert error .message_args == ('.fu.*' , )
775
+
776
+ checker = self .flakes ('from .. import *' ,
777
+ m .ImportStarUsed , m .UnusedImport )
778
+
779
+ error = checker .messages [0 ]
780
+ assert error .message .startswith ("'from %s import *' used; unable " )
781
+ assert error .message_args == ('..' , )
782
+
783
+ error = checker .messages [1 ]
784
+ assert error .message == '%r imported but unused'
785
+ assert error .message_args == ('from .. import *' , )
786
+
690
787
@skipIf (version_info < (3 ,),
691
788
'import * below module level is a warning on Python 2' )
692
789
def test_localImportStar (self ):
@@ -700,6 +797,14 @@ class a:
700
797
from fu import *
701
798
''' , m .ImportStarNotPermitted )
702
799
800
+ checker = self .flakes ('''
801
+ class a:
802
+ from .. import *
803
+ ''' , m .ImportStarNotPermitted )
804
+ error = checker .messages [0 ]
805
+ assert error .message == "'from %s import *' only allowed at module level"
806
+ assert error .message_args == ('..' , )
807
+
703
808
@skipIf (version_info > (3 ,),
704
809
'import * below module level is an error on Python 3' )
705
810
def test_importStarNested (self ):
0 commit comments