• Kirill Smelkov's avatar
    pylint: Fix wendelin transform to yield module with a .name · 421d6068
    Kirill Smelkov authored
    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.
    
    Without the fix added test breaks as
    
        .../instance/slappart5/bin$ ./runUnitTest -v -v -v  testDynamicClassGeneration.TestZodbModuleComponent
        ...
        Running Unit tests of <class 'testDynamicClassGeneration.TestZodbModuleComponent'>
        ok
        testImportVersionedComponentOnly (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testInvalidId (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testInvalidSourceCode (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testModuleSecurityInfo (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testPylint (testDynamicClassGeneration.TestZodbModuleComponent) ... FAIL
        testPylintAstroidModuleGeneratedOnce (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testPylintNamedtupleUnicodeLiteralsRegression (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testReferenceWithReservedKeywords (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testValidateInvalidateDelete (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testVersionPriority (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testVersionWithReservedKeywords (testDynamicClassGeneration.TestZodbModuleComponent) ... ok
        testWorkflowErrorMessage (testDynamicClassGeneration.TestZodbModuleComponent)
        Check that validation error messages are stored in workflow ... ok
    
        ======================================================================
        FAIL: testPylint (testDynamicClassGeneration.TestZodbModuleComponent)
        ----------------------------------------------------------------------
        Traceback (most recent call last):
          File ".../parts/erp5/Products/ERP5Type/tests/testDynamicClassGeneration.py", line 2347, in testPylint
            component.checkSourceCode()
          File ".../parts/erp5/product/ERP5Type/mixin/component.py", line 329, in checkSourceCode
            return checkPythonSourceCode(self.getTextContent(), self.getPortalType())
          File ".../parts/erp5/product/ERP5Type/Utils.py", line 540, in checkPythonSourceCode
            Run(args, reporter=TextReporter(output_file), exit=False)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/lint.py", line 1332, in __init__
            linter.check(args)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/lint.py", line 747, in check
            self._do_check(files_or_modules)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/lint.py", line 869, in _do_check
            self.check_astroid_module(ast_node, walker, rawcheckers, tokencheckers)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/lint.py", line 946, in check_astroid_module
            walker.walk(ast_node)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/utils.py", line 874, in walk
            self.walk(child)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/utils.py", line 871, in walk
            cb(astroid)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/checkers/imports.py", line 253, in visit_import
            self._add_imported_module(node, importedmodnode.name)
          File ".../develop-eggs/pylint-1.4.4+slapospatched002-py2.7.egg/pylint/checkers/imports.py", line 319, in _add_imported_module
            importedmodname = get_module_part(importedmodname)
          File ".../develop-eggs/astroid-1.3.8+slapospatched001-py2.7.egg/astroid/modutils.py", line 359, in get_module_part
            'explicit relative import, but no context_file?'
        AssertionError: explicit relative import, but no context_file?
    
        ----------------------------------------------------------------------
        Ran 13 tests in 137.609s
    
        FAILED (failures=1)
    
    /helped-and-reviewed-by @jerome
    /reviewed-on !1762
    421d6068
testDynamicClassGeneration.py 138 KB