def test_star_import(self):
        warnings = self.check(['input/starimport.py', ])

        self.assertEquals(len(warnings), 0, self.formatWarnings(warnings))

        # check the module doing the star import
        pcmodule = pcmodules.getPCModule("starimport", moduleDir="input")
        self.assertEquals(pcmodule.moduleName, "starimport")
        self.assertEquals(pcmodule.moduleDir, "input")

        if utils.pythonVersion() >= utils.PYTHON_2_6:
            self.assertEquals(pcmodule.variables.keys(), ["__package__"])
        else:
            self.assertEquals(pcmodule.variables.keys(), [])
        self.assertEquals(pcmodule.classes.keys(), [])
        self.assertEquals(pcmodule.functions.keys(), [])
        self.assertEquals(pcmodule.modules.keys(), ["gettext", ])

        # check the code
        self.assertEquals(len(pcmodule.codes), 1)
        self.assertEquals(pcmodule.codes[0].func.function.func_name, '__main__')

        # FIXME: why do we have a non-empty stack here ?
        # self.assertEquals(pcmodule.codes[0].stack, [])

        modules = pcmodules._getPCModulesDict()
        for (name, moduleDir) in modules.keys():
            self.failIf(name.find('*') > -1,
                'Invalid loaded module name %s' % (name, ))

        # check the module from which we are starimporting;
        # it should have been loaded as a side effect
        pcmodule = pcmodules.getPCModule("starimportfrom", moduleDir="input")
        self.failUnless(pcmodule, pcmodules._getPCModulesDict())
        self.assertEquals(pcmodule.moduleName, "starimportfrom")
        self.assertEquals(pcmodule.moduleDir, "input")

        variables = [v for v in pcmodule.variables.keys()
            if v not in Config._DEFAULT_VARIABLE_IGNORE_LIST]
        if utils.pythonVersion() >= utils.PYTHON_2_6:
            self.assertEquals(pcmodule.variables.keys(), ["__package__"])
        else:
            self.assertEquals(pcmodule.variables.keys(), [])
        self.assertEquals(pcmodule.classes.keys(), [])
        self.assertEquals(pcmodule.functions.keys(), ["_", ])
        self.assertEquals(pcmodule.modules.keys(), ["gettext", ])

        # check the code
        self.assertEquals(len(pcmodule.codes), 0)
    def test_nested(self):
        warnings = self.check(['input/nested.py', ])

        self.assertEquals(len(warnings), 1, self.formatWarnings(warnings))
        self.assertWarnings(warnings, ['input/nested.py'])

        # check the module and the code
        pcmodule = pcmodules.getPCModule("nested", moduleDir="input")
        self.assertEquals(pcmodule.moduleName, "nested")
        self.assertEquals(pcmodule.moduleDir, "input")

        if utils.pythonVersion() >= utils.PYTHON_2_6:
            self.assertEquals(pcmodule.variables.keys(), ["__package__"])
        else:
            self.assertEquals(pcmodule.variables.keys(), [])
        self.assertEquals(pcmodule.classes.keys(), ["Result"])
        self.assertEquals(pcmodule.functions.keys(), ["outside"])

        # check the code
        self.assertEquals(len(pcmodule.codes), 4)
        self.assertEquals(pcmodule.codes[0].func.function.func_name, '__main__')
        # FIXME: this assert is wrong; the code should be named outside,
        # but since the code object got re-used for nested code, it's called
        # second
        self.assertEquals(pcmodule.codes[1].func.function.func_name, 'outside')
        self.assertEquals(pcmodule.codes[2].func.function.func_name, 'Result')
        self.assertEquals(pcmodule.codes[3].func.function.func_name, '__init__')

        self.failIf(pcmodule.codes[0].stack)
        # FIXME: why do we have a non-empty stack here ?
        # self.failIf(pcmodule.codes[1].stack, pcmodule.codes[1].stack)
        self.failIf(pcmodule.codes[2].stack)
        self.failIf(pcmodule.codes[3].stack)
    def test_star_import_from(self):
        # First make sure that gettext only exists as a module, not as
        # a function
        warnings = self.check(['input/starimportfrom.py', ])

        self.assertEquals(len(warnings), 0, self.formatWarnings(warnings))

        pcmodule = pcmodules.getPCModule("starimportfrom", moduleDir="input")
        self.assertEquals(pcmodule.moduleName, "starimportfrom")
        self.assertEquals(pcmodule.moduleDir, "input")

        variables = [v for v in pcmodule.variables.keys()
            if v not in Config._DEFAULT_VARIABLE_IGNORE_LIST]
        if utils.pythonVersion() >= utils.PYTHON_2_6:
            self.assertEquals(variables, ["__package__"])
        else:
            self.assertEquals(variables, [])
        self.assertEquals(pcmodule.classes.keys(), [])
        self.assertEquals(pcmodule.functions.keys(), ['_'])
        self.assertEquals(pcmodule.modules.keys(), ["gettext", ])

        # check the code
        self.assertEquals(len(pcmodule.codes), 2,
            [c.func.function.func_name for c in pcmodule.codes])
        self.assertEquals(pcmodule.codes[0].func.function.func_name, '__main__')
        self.assertEquals(pcmodule.codes[1].func.function.func_name, 'gettext')

        # FIXME: why do we have a non-empty stack here ?
        # self.assertEquals(pcmodule.codes[0].stack, [])
        self.assertEquals(pcmodule.codes[1].stack, [])
Exemple #4
0
def _baseInitCalled(classInitInfo, base, functionsCalled) :
    baseInit = getattr(base, utils.INIT, None)
    if baseInit is None or _get_func_info(baseInit) == classInitInfo :
        return 1

    initName = utils.safestr(base) + _DOT_INIT
    if functionsCalled.has_key(initName) :
        return 1

    # ok, do this the hard way, there may be aliases, so check here
    names = string.split(initName, '.')

    # first look in our list of PyCheckerModules
    moduleName = names[0]
    moduleDir = os.path.dirname(classInitInfo[0])
    pcmodule = pcmodules.getPCModule(moduleName, moduleDir)
    if pcmodule:
        obj = pcmodule.module
    else:
        # fall back to looking in sys.modules
        try:
            # i think this can raise an exception if the module is a library
            # (.so)
            obj = sys.modules[names[0]]
        except KeyError:
            return 1
    for i in range(1, len(names)) :
        obj = getattr(obj, names[i], None)
        if obj is None:
            return 0
        if functionsCalled.has_key(string.join(names[i:], '.')) :
            return 1

    return 0
Exemple #5
0
def _baseInitCalled(classInitInfo, base, functionsCalled) :
    baseInit = getattr(base, utils.INIT, None)
    if baseInit is None or _get_func_info(baseInit) == classInitInfo :
        return 1

    initName = utils.safestr(base) + _DOT_INIT
    if functionsCalled.has_key(initName) :
        return 1

    # ok, do this the hard way, there may be aliases, so check here
    names = string.split(initName, '.')

    # first look in our list of PyCheckerModules
    moduleName = names[0]
    moduleDir = os.path.dirname(classInitInfo[0])
    pcmodule = pcmodules.getPCModule(moduleName, moduleDir)
    if pcmodule:
        obj = pcmodule.module
    else:
        # fall back to looking in sys.modules
        try:
            # i think this can raise an exception if the module is a library
            # (.so)
            obj = sys.modules[names[0]]
        except KeyError:
            return 1
    for i in range(1, len(names)) :
        obj = getattr(obj, names[i], None)
        if obj is None:
            return 0
        if functionsCalled.has_key(string.join(names[i:], '.')) :
            return 1

    return 0
Exemple #6
0
 def addModule(self, name, moduleDir=None):
     module = pcmodules.getPCModule(name, moduleDir)
     if module is None:
         self.modules[name] = module = PyCheckerModule(name, 0)
         if imp.is_builtin(name) == 0:
             module.load()
         else:
             globalModule = globals().get(name)
             if globalModule:
                 module.attributes.extend(dir(globalModule))
     else:
         self.modules[name] = module
Exemple #7
0
 def addModule(self, name, moduleDir=None) :
     module = pcmodules.getPCModule(name, moduleDir)
     if module is None :
         self.modules[name] = module = PyCheckerModule(name, 0)
         if imp.is_builtin(name) == 0:
             module.load()
         else :
             globalModule = globals().get(name)
             if globalModule :
                 module.attributes.extend(dir(globalModule))
     else :
         self.modules[name] = module
Exemple #8
0
    def load(self):
        try:
            # there's no need to reload modules we already have if no moduleDir
            # is specified for this module
            # NOTE: self.moduleDir can be '' if the module tested lives in
            # the current working directory
            if self.moduleDir is None:
                module = sys.modules.get(self.moduleName)
                if module:
                    pcmodule = pcmodules.getPCModule(self.moduleName)
                    if not pcmodules.getPCModule(self.moduleName).module:
                        return self._initModule(module)
                    return 1

            return self._initModule(self.setupMainCode())
        except (SystemExit, KeyboardInterrupt):
            exc_type, exc_value, exc_tb = sys.exc_info()
            raise exc_type, exc_value
        except:
            importError(self.moduleName, self.moduleDir)
            return cfg().ignoreImportErrors
Exemple #9
0
    def load(self):
        try:
            # there's no need to reload modules we already have if no moduleDir
            # is specified for this module
            # NOTE: self.moduleDir can be '' if the module tested lives in
            # the current working directory
            if self.moduleDir is None:
                module = sys.modules.get(self.moduleName)
                if module:
                    pcmodule = pcmodules.getPCModule(self.moduleName)
                    if not pcmodules.getPCModule(self.moduleName).module:
                        return self._initModule(module)
                    return 1

            return self._initModule(self.setupMainCode())
        except (SystemExit, KeyboardInterrupt):
            exc_type, exc_value, exc_tb = sys.exc_info()
            raise exc_type, exc_value
        except:
            importError(self.moduleName, self.moduleDir)
            return cfg().ignoreImportErrors
Exemple #10
0
    def load(self):
        try:
            # there's no need to reload modules we already have if no moduleDir
            # is specified for this module
            if not self.moduleDir:
                module = sys.modules.get(self.moduleName)
                if module:
                    if not pcmodules.getPCModule(self.moduleName).module:
                        return self._initModule(module)
                    return 1

            return self._initModule(self.setupMainCode())
        except (SystemExit, KeyboardInterrupt):
            exc_type, exc_value, exc_tb = sys.exc_info()
            raise exc_type, exc_value
        except:
            importError(self.moduleName, self.moduleDir)
            return cfg().ignoreImportErrors
Exemple #11
0
    def load(self):
        try :
            # there's no need to reload modules we already have if no moduleDir
            # is specified for this module
            if not self.moduleDir:
                module = sys.modules.get(self.moduleName)
                if module :
                    if not pcmodules.getPCModule(self.moduleName).module :
                        return self._initModule(module)
                    return 1

            return self._initModule(self.setupMainCode())
        except (SystemExit, KeyboardInterrupt) :
            exc_type, exc_value, exc_tb = sys.exc_info()
            raise exc_type, exc_value
        except :
            importError(self.moduleName, self.moduleDir)
            return cfg().ignoreImportErrors
    def test_unused_import(self):
        warnings = self.check(['input/unused_import.py', ])

        self.assertEquals(len(warnings), 4, self.formatWarnings(warnings))
        self.assertWarnings(warnings, ['input/unused_import.py'])

        # check the module and the code
        pcmodule = pcmodules.getPCModule("unused_import", moduleDir="input")
        self.assertEquals(pcmodule.moduleName, "unused_import")
        self.assertEquals(pcmodule.moduleDir, "input")

        if utils.pythonVersion() >= utils.PYTHON_2_6:
            self.assertEquals(pcmodule.variables.keys(), ["__package__"])
        else:
            self.assertEquals(pcmodule.variables.keys(), [])
        self.assertEquals(pcmodule.classes, {})
        self.assertEquals(pcmodule.functions.keys(), ["do"])

        # check the code
        self.assertEquals(len(pcmodule.codes), 2)
        main = pcmodule.codes[0]

        # all triggered warnings were import warnings
        self.failIf(main.warnings)

        # FIXME: should the stack not be empty after processing it all ?
        # self.failIf(main.stack)

        modules = pcmodule.modules.keys()
        modules.sort()
        self.assertEquals(modules, ["dom", "path", "sax", "sys"])
        self.assertEquals(pcmodule.moduleLineNums,
            {
                'dom':                  ('input/unused_import.py', 10),
                'do':                   ('input/unused_import.py', 12),
                'sys':                  ('input/unused_import.py', 4),
                'path':                 ('input/unused_import.py', 6),
                ('os', 'path'):         ('input/unused_import.py', 6),
                ('os',):                ('input/unused_import.py', 6),
                'sax':                  ('input/unused_import.py', 8),
                'xml.sax':              ('input/unused_import.py', 8),
                ('xml', ):              ('input/unused_import.py', 10),
                ('xml', 'dom'):         ('input/unused_import.py', 10),
            })
Exemple #13
0
def fixupBuiltinModules(needs_init=0):
    for moduleName in sys.builtin_module_names:
        # Skip sys since it will reset sys.stdout in IDLE and cause
        # stdout to go to the real console rather than the IDLE console.
        # FIXME: this breaks test42
        # if moduleName == 'sys':
        #     continue

        if needs_init:
            _ = PyCheckerModule(moduleName, 0)
        # builtin modules don't have a moduleDir
        module = pcmodules.getPCModule(moduleName)
        if module is not None:
            try:
                m = imp.init_builtin(moduleName)
            except ImportError:
                pass
            else:
                extra_attrs = _BUILTIN_MODULE_ATTRS.get(moduleName, [])
                module.attributes = ['__dict__'] + dir(m) + extra_attrs
Exemple #14
0
def fixupBuiltinModules(needs_init=0):
    for moduleName in sys.builtin_module_names :
        # Skip sys since it will reset sys.stdout in IDLE and cause
        # stdout to go to the real console rather than the IDLE console.
        # FIXME: this breaks test42
        # if moduleName == 'sys':
        #     continue

        if needs_init:
            _ = PyCheckerModule(moduleName, 0)
        # builtin modules don't have a moduleDir
        module = pcmodules.getPCModule(moduleName)
        if module is not None :
            try :
                m = imp.init_builtin(moduleName)
            except ImportError :
                pass
            else :
                extra_attrs = _BUILTIN_MODULE_ATTRS.get(moduleName, [])
                module.attributes = [ '__dict__' ] + dir(m) + extra_attrs