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, [])
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
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
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
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
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 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), })
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
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