pylint: Fix wendelin transform to yield module with a .name
In 5796a17a (core_test: Add test to make sure that wendelin.core basically works) I added wendelin_transform to pylint so that the checker could recognize wendelin.core's special wendelin top-level module/package and handle ok from wendelin.bigarray.array_zodb import ZBigArray this works, but e.g. for plain import wendelin or from wendelin import bigarray pylint currenly fails with AssertionError: explicit relative import, but no context_file? To better see what is going on let's conside the following test program """ZZZ""" from wendelin.bigarray.array_zodb import ZBigArray from wendelin import bigarray def main(): """main""" _ = ZBigArray and run pylint on it. Here is what it gives: wendelin_transform Module(wendelin) -> Module() visit_from From() basename: wendelin.bigarray.array_zodb names: [('ZBigArray', None)] modnode: Module(test) get_imported_module From() wendelin.bigarray.array_zodb importedmodnode: Module(wendelin.bigarray.array_zodb) ('_add_imported_module', <From() l.3 [test] at 0x7ff214b4cb90>, 'wendelin.bigarray.array_zodb.ZBigArray') wendelin_transform Module(wendelin) -> Module() visit_from From() basename: wendelin names: [('bigarray', None)] modnode: Module(test) get_imported_module From() wendelin wendelin_transform Module(wendelin) -> Module() importedmodnode: Module() ************* Module test W: 4, 0: Relative import 'wendelin', should be '' (relative-import) ('_add_imported_module', <From() l.4 [test] at 0x7ff214b4cf50>, '.bigarray') Traceback (most recent call last): File "./x.py", line 22, in <module> Run(['test.py', '--reports=n'], exit=False) File "/home/kirr/src/tools/py/pylint/pylint/lint.py", line 1332, in __init__ linter.check(args) File "/home/kirr/src/tools/py/pylint/pylint/lint.py", line 747, in check self._do_check(files_or_modules) File "/home/kirr/src/tools/py/pylint/pylint/lint.py", line 869, in _do_check self.check_astroid_module(ast_node, walker, rawcheckers, tokencheckers) File "/home/kirr/src/tools/py/pylint/pylint/lint.py", line 946, in check_astroid_module walker.walk(ast_node) File "/home/kirr/src/tools/py/pylint/pylint/utils.py", line 874, in walk self.walk(child) File "/home/kirr/src/tools/py/pylint/pylint/utils.py", line 871, in walk cb(astroid) File "/home/kirr/src/tools/py/pylint/pylint/checkers/imports.py", line 288, in visit_from self._add_imported_module(node, '%s.%s' % (importedmodnode.name, name)) File "/home/kirr/src/tools/py/pylint/pylint/checkers/imports.py", line 328, in _add_imported_module importedmodname = get_module_part(importedmodname) File "/home/kirr/src/tools/py/astroid/astroid/modutils.py", line 359, in get_module_part 'explicit relative import, but no context_file?' AssertionError: explicit relative import, but no context_file? we see that the line from wendelin.bigarray.array_zodb import ZBigArray corresponds to ('_add_imported_module', <From() l.3 [test] at 0x7ff214b4cb90>, 'wendelin.bigarray.array_zodb.ZBigArray') and the line from wendelin import bigarray corresponds to ('_add_imported_module', <From() l.4 [test] at 0x7ff214b4cf50>, '.bigarray') notice that in the latter case there is no 'wendelin' prefix and the import goes as just '.bigarray' instead of 'wendelin.bigarray' which leads to further crash in get_module_part. -> Fix it by initializing wendelin module yielded by wendelin_transform with .name set. Not sure why it is working longer imports without that.
Showing
Please register or sign in to comment