@@ -1231,12 +1231,20 @@ def test_completions(self):
12311231 ("import foo, impo\t \n " , "import foo, importlib" ),
12321232 ("import foo as bar, impo\t \n " , "import foo as bar, importlib" ),
12331233 ("from impo\t \n " , "from importlib" ),
1234+ ("from impo\t \t \n " , "from importlib import " ),
1235+ ("from impo\t \t \t \n " , "from importlib import " ),
1236+ ("from impo \t \n " , "from impo import " ),
1237+ ("from importlib\t \n " , "from importlib import " ),
12341238 ("from importlib.res\t \n " , "from importlib.resources" ),
12351239 ("from importlib.\t \t res\t \n " , "from importlib.resources" ),
1240+ ("from importlib.res\t \t \n " , "from importlib.resources import " ),
1241+ ("from importlib.res \t \n " , "from importlib.res import " ),
1242+ ("from importlib.resources\t \n " , "from importlib.resources import " ),
12361243 ("from importlib.resources.ab\t \n " , "from importlib.resources.abc" ),
12371244 ("from importlib import mac\t \n " , "from importlib import machinery" ),
12381245 ("from importlib import res\t \n " , "from importlib import resources" ),
12391246 ("from importlib.res\t import a\t \n " , "from importlib.resources import abc" ),
1247+ ("from importlib.res\t \t a\t \n " , "from importlib.resources import abc" ),
12401248 ("from __phello__ import s\t \n " , "from __phello__ import spam" ), # frozen module
12411249 ("import importlib .res\t \n " , "import importlib .resources" ),
12421250 ("import importlib. res\t \n " , "import importlib. resources" ),
@@ -1616,46 +1624,48 @@ def test_get_path_and_prefix(self):
16161624
16171625 def test_parse (self ):
16181626 cases = (
1619- ('import ' , (None , '' )),
1620- ('import foo' , (None , 'foo' )),
1621- ('import foo,' , (None , '' )),
1622- ('import foo, ' , (None , '' )),
1623- ('import foo, bar' , (None , 'bar' )),
1624- ('import foo, bar, baz' , (None , 'baz' )),
1625- ('import foo as bar,' , (None , '' )),
1626- ('import foo as bar, ' , (None , '' )),
1627- ('import foo as bar, baz' , (None , 'baz' )),
1628- ('import a.' , (None , 'a.' )),
1629- ('import a.b' , (None , 'a.b' )),
1630- ('import a.b.' , (None , 'a.b.' )),
1631- ('import a.b.c' , (None , 'a.b.c' )),
1632- ('import a.b.c, foo' , (None , 'foo' )),
1633- ('import a.b.c, foo.bar' , (None , 'foo.bar' )),
1634- ('import a.b.c, foo.bar,' , (None , '' )),
1635- ('import a.b.c, foo.bar, ' , (None , '' )),
1636- ('from foo' , ('foo' , None )),
1637- ('from a.' , ('a.' , None )),
1638- ('from a .' , ('a.' , None )),
1639- ('from a .' , ('a.' , None )),
1640- ('from a .' , ('a.' , None )),
1641- ('from a.b' , ('a.b' , None )),
1642- ('from a.b.' , ('a.b.' , None )),
1643- ('from a. b.' , ('a.b.' , None )),
1644- ('from a . b .' , ('a.b.' , None )),
1645- ('from a.b.c' , ('a.b.c' , None )),
1646- ('from foo import ' , ('foo' , '' )),
1647- ('from foo import a' , ('foo' , 'a' )),
1648- ('from ' , ('' , None )),
1649- ('from . import a' , ('.' , 'a' )),
1650- ('from .foo import a' , ('.foo' , 'a' )),
1651- ('from ..foo import a' , ('..foo' , 'a' )),
1652- ('from foo import (' , ('foo' , '' )),
1653- ('from foo import ( ' , ('foo' , '' )),
1654- ('from foo import (a' , ('foo' , 'a' )),
1655- ('from foo import (a,' , ('foo' , '' )),
1656- ('from foo import (a, ' , ('foo' , '' )),
1657- ('from foo import (a, c' , ('foo' , 'c' )),
1658- ('from foo import (a as b, c' , ('foo' , 'c' )),
1627+ ('import ' , (None , '' , True )),
1628+ ('import foo' , (None , 'foo' , False )),
1629+ ('import foo,' , (None , '' , False )),
1630+ ('import foo, ' , (None , '' , True )),
1631+ ('import foo, bar' , (None , 'bar' , False )),
1632+ ('import foo, bar, baz' , (None , 'baz' , False )),
1633+ ('import foo as bar,' , (None , '' , False )),
1634+ ('import foo as bar, ' , (None , '' , True )),
1635+ ('import foo as bar, baz' , (None , 'baz' , False )),
1636+ ('import a.' , (None , 'a.' , False )),
1637+ ('import a.b' , (None , 'a.b' , False )),
1638+ ('import a.b.' , (None , 'a.b.' , False )),
1639+ ('import a.b.c' , (None , 'a.b.c' , False )),
1640+ ('import a.b.c, foo' , (None , 'foo' , False )),
1641+ ('import a.b.c, foo.bar' , (None , 'foo.bar' , False )),
1642+ ('import a.b.c, foo.bar,' , (None , '' , False )),
1643+ ('import a.b.c, foo.bar, ' , (None , '' , True )),
1644+ ('from foo' , ('foo' , None , False )),
1645+ ('from foo ' , ('foo' , None , True )),
1646+ ('from a.' , ('a.' , None , False )),
1647+ ('from a .' , ('a.' , None , False )),
1648+ ('from a .' , ('a.' , None , False )),
1649+ ('from a .' , ('a.' , None , False )),
1650+ ('from a.b' , ('a.b' , None , False )),
1651+ ('from a.b.' , ('a.b.' , None , False )),
1652+ ('from a.b ' , ('a.b' , None , True )),
1653+ ('from a. b.' , ('a.b.' , None , False )),
1654+ ('from a . b .' , ('a.b.' , None , False )),
1655+ ('from a.b.c' , ('a.b.c' , None , False )),
1656+ ('from foo import ' , ('foo' , '' , True )),
1657+ ('from foo import a' , ('foo' , 'a' , False )),
1658+ ('from ' , ('' , None , True )),
1659+ ('from . import a' , ('.' , 'a' , False )),
1660+ ('from .foo import a' , ('.foo' , 'a' , False )),
1661+ ('from ..foo import a' , ('..foo' , 'a' , False )),
1662+ ('from foo import (' , ('foo' , '' , False )),
1663+ ('from foo import ( ' , ('foo' , '' , True )),
1664+ ('from foo import (a' , ('foo' , 'a' , False )),
1665+ ('from foo import (a,' , ('foo' , '' , False )),
1666+ ('from foo import (a, ' , ('foo' , '' , True )),
1667+ ('from foo import (a, c' , ('foo' , 'c' , False )),
1668+ ('from foo import (a as b, c' , ('foo' , 'c' , False )),
16591669 )
16601670 for code , parsed in cases :
16611671 parser = ImportParser (code )
@@ -1679,12 +1689,9 @@ def test_parse_error(self):
16791689 cases = (
16801690 '' ,
16811691 'import foo ' ,
1682- 'from foo ' ,
16831692 'import foo. ' ,
16841693 'import foo.bar ' ,
1685- 'from foo ' ,
16861694 'from foo. ' ,
1687- 'from foo.bar ' ,
16881695 'from foo import bar ' ,
16891696 'from foo import (bar ' ,
16901697 'from foo import bar, baz ' ,
@@ -1723,9 +1730,9 @@ def test_parse_error(self):
17231730 'if 1:\n pass\n \t pass' , # _tokenize TabError -> tokenize TabError
17241731 )
17251732 for code in cases :
1726- parser = ImportParser (code )
1727- actual = parser .parse ()
17281733 with self .subTest (code = code ):
1734+ parser = ImportParser (code )
1735+ actual = parser .parse ()
17291736 self .assertEqual (actual , None )
17301737
17311738 @patch .dict (sys .modules )
0 commit comments