--- /dev/null
+#!/usr/bin/env python
+
+# Copyright (c) 2001-2004, MetaSlash Inc. All rights reserved.
+
+"""
+Copyright notice from pychecker:
+
+Copyright (c) 2000-2001, MetaSlash Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+ - Neither name of MetaSlash Inc. nor the names of contributors
+ may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+
+"""
+Check python source code files for possible errors and print warnings
+
+Contact Info:
+ http://pychecker.sourceforge.net/
+ pychecker-list@lists.sourceforge.net
+"""
+
+import string
+import types
+import sys
+import imp
+import os
+import glob
+import traceback
+import re
+import wx
+_ = wx.GetTranslation
+
+# see __init__.py for meaning, this must match the version there
+LOCAL_MAIN_VERSION = 1
+
+
+def setupNamespace(path) :
+ # remove pychecker if it's the first component, it needs to be last
+ if sys.path[0][-9:] == 'pychecker' :
+ del sys.path[0]
+
+ # make sure pychecker is last in path, so we can import
+ checker_path = os.path.dirname(os.path.dirname(path))
+ if checker_path not in sys.path :
+ sys.path.append(checker_path)
+
+if __name__ == '__main__' :
+ setupNamespace(sys.argv[0])
+
+from pychecker import utils
+from pychecker import printer
+from pychecker import warn
+from pychecker import OP
+from pychecker import Config
+from pychecker import function
+from pychecker.Warning import Warning
+
+# Globals for storing a dictionary of info about modules and classes
+_allModules = {}
+_cfg = None
+
+# Constants
+_DEFAULT_MODULE_TOKENS = ('__builtins__', '__doc__', '__file__', '__name__',
+ '__path__')
+_DEFAULT_CLASS_TOKENS = ('__doc__', '__name__', '__module__')
+
+_VERSION_MISMATCH_ERROR = '''
+There seem to be two versions of PyChecker being used.
+One is probably in python/site-packages, the other in a local directory.
+If you want to run the local version, you must remove the version
+from site-packages. Or you can install the current version
+by doing python setup.py install.
+'''
+
+def cfg() :
+ return utils.cfg()
+
+def _flattenList(list) :
+ "Returns a list which contains no lists"
+
+ new_list = []
+ for element in list :
+ if type(element) == types.ListType :
+ new_list.extend(_flattenList(element))
+ else :
+ new_list.append(element)
+
+ return new_list
+
+def getModules(arg_list) :
+ "Returns a list of module names that can be imported"
+
+ global _output
+
+ new_arguments = []
+ for arg in arg_list :
+ # is this a wildcard filespec? (necessary for windows)
+ if '*' in arg or '?' in arg or '[' in arg :
+ arg = glob.glob(arg)
+ new_arguments.append(arg)
+
+ PY_SUFFIXES = ['.py']
+ PY_SUFFIX_LENS = [3]
+ if _cfg.quixote:
+ PY_SUFFIXES.append('.ptl')
+ PY_SUFFIX_LENS.append(4)
+
+ modules = []
+ for arg in _flattenList(new_arguments) :
+ fullpath = arg
+ # is it a .py file?
+ for suf, suflen in zip(PY_SUFFIXES, PY_SUFFIX_LENS):
+ if len(arg) > suflen and arg[-suflen:] == suf:
+ arg_dir = os.path.dirname(arg)
+ if arg_dir and not os.path.exists(arg) :
+ txt = _('File or pathname element does not exist: "%s"') % arg
+ _output.AddLines(txt)
+ continue
+
+ module_name = os.path.basename(arg)[:-suflen]
+ if arg_dir not in sys.path :
+ sys.path.insert(0, arg_dir)
+ arg = module_name
+ modules.append((arg, fullpath))
+
+ return modules
+
+def _q_file(f):
+ # crude hack!!!
+ # imp.load_module requires a real file object, so we can't just
+ # fiddle def lines and yield them
+ import tempfile
+ fd, newfname = tempfile.mkstemp(suffix=".py", text=True)
+ newf = os.fdopen(fd, 'r+')
+ os.unlink(newfname)
+ for line in f:
+ mat = re.match(r'(\s*def\s+\w+\s*)\[(html|plain)\](.*)', line)
+ if mat is None:
+ newf.write(line)
+ else:
+ newf.write(mat.group(1)+mat.group(3)+'\n')
+ newf.seek(0)
+ return newf
+
+def _q_find_module(p, path):
+ if not _cfg.quixote:
+ return imp.find_module(p, path)
+ else:
+ for direc in path:
+ try:
+ return imp.find_module(p, [direc])
+ except ImportError:
+ f = os.path.join(direc, p+".ptl")
+ if os.path.exists(f):
+ return _q_file(file(f)), f, ('.ptl', 'U', 1)
+
+def _findModule(name) :
+ """Returns the result of an imp.find_module(), ie, (file, filename, smt)
+ name can be a module or a package name. It is *not* a filename."""
+
+ path = sys.path[:]
+ packages = string.split(name, '.')
+ for p in packages :
+ # smt = (suffix, mode, type)
+ file, filename, smt = _q_find_module(p, path)
+ if smt[-1] == imp.PKG_DIRECTORY :
+ try :
+ # package found - read path info from init file
+ m = imp.load_module(p, file, filename, smt)
+ finally :
+ if file is not None :
+ file.close()
+
+ # importing xml plays a trick, which replaces itself with _xmlplus
+ # both have subdirs w/same name, but different modules in them
+ # we need to choose the real (replaced) version
+ if m.__name__ != p :
+ try :
+ file, filename, smt = _q_find_module(m.__name__, path)
+ m = imp.load_module(p, file, filename, smt)
+ finally :
+ if file is not None :
+ file.close()
+
+ new_path = m.__path__
+ if type(new_path) == types.ListType :
+ new_path = filename
+ if new_path not in path :
+ path.insert(1, new_path)
+ elif smt[-1] != imp.PY_COMPILED:
+ if p is not packages[-1] :
+ if file is not None :
+ file.close()
+ raise ImportError, "No module named %s" % packages[-1]
+ return file, filename, smt
+
+ # in case we have been given a package to check
+ return file, filename, smt
+
+
+class Variable :
+ "Class to hold all information about a variable"
+
+ def __init__(self, name, type):
+ self.name = name
+ self.type = type
+ self.value = None
+
+ def __str__(self) :
+ return self.name
+
+ __repr__ = utils.std_repr
+
+
+def _filterDir(object, ignoreList) :
+ "Return a list of tokens (attributes) in a class, except for ignoreList"
+
+ tokens = dir(object)
+ for token in ignoreList :
+ if token in tokens :
+ tokens.remove(token)
+ return tokens
+
+def _getClassTokens(c) :
+ return _filterDir(c, _DEFAULT_CLASS_TOKENS)
+
+
+class Class :
+ "Class to hold all information about a class"
+
+ def __init__(self, name, module) :
+ self.name = name
+ self.classObject = getattr(module, name)
+
+ modname = getattr(self.classObject, '__module__', None)
+ if modname is None:
+ # hm, some ExtensionClasses don't have a __module__ attribute
+ # so try parsing the type output
+ typerepr = repr(type(self.classObject))
+ mo = re.match("^<type ['\"](.+)['\"]>$", typerepr)
+ if mo:
+ modname = ".".join(mo.group(1).split(".")[:-1])
+
+ self.module = sys.modules.get(modname)
+ if not self.module:
+ self.module = module
+
+ global _output
+ txt = _("warning: couldn't find real module for class %s (module name: %s)\n") % (self.classObject, modname)
+ _output.AddLines(txt)
+
+ self.ignoreAttrs = 0
+ self.methods = {}
+ self.members = { '__class__': types.ClassType,
+ '__doc__': types.StringType,
+ '__dict__': types.DictType, }
+ self.memberRefs = {}
+ self.statics = {}
+ self.lineNums = {}
+
+ def __str__(self) :
+ return self.name
+
+ __repr__ = utils.std_repr
+
+ def getFirstLine(self) :
+ "Return first line we can find in THIS class, not any base classes"
+
+ lineNums = []
+ classDir = dir(self.classObject)
+ for m in self.methods.values() :
+ if m != None and m.function.func_code.co_name in classDir:
+ lineNums.append(m.function.func_code.co_firstlineno)
+ if lineNums :
+ return min(lineNums)
+ return 0
+
+
+ def allBaseClasses(self, c = None) :
+ "Return a list of all base classes for this class and it's subclasses"
+
+ baseClasses = []
+ if c == None :
+ c = self.classObject
+ for base in c.__bases__ :
+ baseClasses = baseClasses + [ base ] + self.allBaseClasses(base)
+ return baseClasses
+
+ def __getMethodName(self, func_name, className = None) :
+ if func_name[0:2] == '__' and func_name[-2:] != '__' :
+ if className == None :
+ className = self.name
+ if className[0] != '_' :
+ className = '_' + className
+ func_name = className + func_name
+ return func_name
+
+ def addMethod(self, method, methodName = None) :
+ if type(method) == types.StringType :
+ self.methods[method] = None
+ else :
+ assert methodName is not None, "must supply methodName"
+ self.methods[methodName] = function.Function(method, 1)
+
+ def addMethods(self, classObject) :
+ for classToken in _getClassTokens(classObject) :
+ token = getattr(classObject, classToken, None)
+ if token is None:
+ continue
+
+ # Looks like a method. Need to code it this way to
+ # accommodate ExtensionClass and Python 2.2. Yecchh.
+ if (hasattr(token, "func_code") and
+ hasattr(token.func_code, "co_argcount")):
+ self.addMethod(token, token.__name__)
+
+ elif hasattr(token, '__get__') and \
+ not hasattr(token, '__set__') and \
+ type(token) is not types.ClassType :
+ self.addMethod(getattr(token, '__name__', classToken))
+ else :
+ self.members[classToken] = type(token)
+ self.memberRefs[classToken] = None
+
+ self.cleanupMemberRefs()
+ # add standard methods
+ for methodName in ('__class__',) :
+ self.addMethod(methodName, classObject.__name__)
+
+ def addMembers(self, classObject) :
+ if not cfg().onlyCheckInitForMembers :
+ for classToken in _getClassTokens(classObject) :
+ method = getattr(classObject, classToken, None)
+ if type(method) == types.MethodType :
+ self.addMembersFromMethod(method.im_func)
+ else:
+ try:
+ self.addMembersFromMethod(classObject.__init__.im_func)
+ except AttributeError:
+ pass
+
+ def addMembersFromMethod(self, method) :
+ if not hasattr(method, 'func_code') :
+ return
+
+ func_code, code, i, maxCode, extended_arg = OP.initFuncCode(method)
+ stack = []
+ while i < maxCode :
+ op, oparg, i, extended_arg = OP.getInfo(code, i, extended_arg)
+ if op >= OP.HAVE_ARGUMENT :
+ operand = OP.getOperand(op, func_code, oparg)
+ if OP.LOAD_CONST(op) or OP.LOAD_FAST(op) :
+ stack.append(operand)
+ elif OP.STORE_ATTR(op) :
+ if len(stack) > 0 :
+ if stack[-1] == cfg().methodArgName:
+ value = None
+ if len(stack) > 1 :
+ value = type(stack[-2])
+ self.members[operand] = value
+ self.memberRefs[operand] = None
+ stack = []
+
+ self.cleanupMemberRefs()
+
+ def cleanupMemberRefs(self) :
+ try :
+ del self.memberRefs[Config.CHECKER_VAR]
+ except KeyError :
+ pass
+
+ def abstractMethod(self, m):
+ """Return 1 if method is abstract, None if not
+ An abstract method always raises an exception.
+ """
+ if not self.methods.get(m, None):
+ return None
+ func_code, bytes, i, maxCode, extended_arg = \
+ OP.initFuncCode(self.methods[m].function)
+ # abstract if the first conditional is RAISE_VARARGS
+ while i < maxCode:
+ op, oparg, i, extended_arg = OP.getInfo(bytes, i, extended_arg)
+ if OP.RAISE_VARARGS(op):
+ return 1
+ if OP.conditional(op):
+ break
+ return None
+
+ def isAbstract(self):
+ """Return the method names that make a class abstract.
+ An abstract class has at least one abstract method."""
+ result = []
+ for m in self.methods.keys():
+ if self.abstractMethod(m):
+ result.append(m)
+ return result
+
+def _getLineInFile(moduleName, linenum):
+ line = ''
+ file, filename, smt = _findModule(moduleName)
+ try:
+ lines = file.readlines()
+ line = string.rstrip(lines[linenum - 1])
+ except (IOError, IndexError):
+ pass
+ file.close()
+ return line
+
+def importError(moduleName):
+ exc_type, exc_value, tb = sys.exc_info()
+
+ # First, try to get a nice-looking name for this exception type.
+ exc_name = getattr(exc_type, '__name__', None)
+ if not exc_name:
+ # either it's a string exception or a user-defined exception class
+ # show string or fully-qualified class name
+ exc_name = str(exc_type)
+
+ # Print a traceback, unless this is an ImportError. ImportError is
+ # presumably the most common import-time exception, so this saves
+ # the clutter of a traceback most of the time. Also, the locus of
+ # the error is usually irrelevant for ImportError, so the lack of
+ # traceback shouldn't be a problem.
+ if exc_type is SyntaxError:
+ # SyntaxErrors are special, we want to control how we format
+ # the output and make it consistent for all versions of Python
+ e = exc_value
+ msg = '%s (%s, line %d)' % (e.msg, e.filename, e.lineno)
+ line = _getLineInFile(moduleName, e.lineno)
+ offset = e.offset
+ if type(offset) is not types.IntType:
+ offset = 0
+ exc_value = '%s\n %s\n %s^' % (msg, line, ' ' * offset)
+ elif exc_type is not ImportError:
+ global _output
+ txt = _(" Caught exception importing module %s:\n") % moduleName
+ _output.AddLines(txt)
+
+ try:
+ tbinfo = traceback.extract_tb(tb)
+ except:
+ tbinfo = []
+ txt = _(" Unable to format traceback\n")
+ _output.AddLines(txt)
+ for filename, line, func, text in tbinfo[1:]:
+ txt = _(" File \"%s\", line %d") % (filename, line)
+ _output.AddLines(txt)
+ if func != "?":
+ txt = _(", in %s()") % func
+ _output.AddLines(txt)
+ _output.AddLines("\n")
+ if text:
+ txt = _(" %s\n") % text
+ _output.AddLines(txt)
+
+ # And finally print the exception type and value.
+ # Careful formatting exc_value -- can fail for some user exceptions
+ txt = " %s: " % exc_name
+ _output.AddLines(txt)
+ try:
+ txt = str(exc_value) + '\n'
+ _output.AddLines(txt)
+ except:
+ txt = _('**error formatting exception value**\n')
+ _output.AddLines(txt)
+
+
+def _getPyFile(filename):
+ """Return the file and '.py' filename from a filename which could
+ end with .py, .pyc, or .pyo"""
+
+ if filename[-1] in 'oc' and filename[-4:-1] == '.py':
+ return filename[:-1]
+ return filename
+
+class Module :
+ "Class to hold all information for a module"
+
+ def __init__(self, moduleName, check = 1, fullpath = None) :
+ self.moduleName = moduleName
+ self.variables = {}
+ self.functions = {}
+ self.classes = {}
+ self.modules = {}
+ self.moduleLineNums = {}
+ self.attributes = [ '__dict__' ]
+ self.main_code = None
+ self.module = None
+ self.check = check
+ self.fullpath = fullpath
+ _allModules[moduleName] = self
+
+ def __str__(self) :
+ return self.moduleName
+
+ __repr__ = utils.std_repr
+
+ def addVariable(self, var, varType) :
+ self.variables[var] = Variable(var, varType)
+
+ def addFunction(self, func) :
+ self.functions[func.__name__] = function.Function(func)
+
+ def __addAttributes(self, c, classObject) :
+ for base in classObject.__bases__ :
+ self.__addAttributes(c, base)
+ c.addMethods(classObject)
+ c.addMembers(classObject)
+
+ def addClass(self, name) :
+ self.classes[name] = c = Class(name, self.module)
+ try:
+ objName = str(c.classObject)
+ except TypeError:
+ # this can happen if there is a goofy __getattr__
+ c.ignoreAttrs = 1
+ else:
+ packages = string.split(objName, '.')
+ c.ignoreAttrs = packages[0] in cfg().blacklist
+ if not c.ignoreAttrs :
+ self.__addAttributes(c, c.classObject)
+
+ def addModule(self, name) :
+ module = _allModules.get(name, None)
+ if module is None :
+ self.modules[name] = module = Module(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 filename(self) :
+ try :
+ filename = self.module.__file__
+ except AttributeError :
+ filename = self.moduleName
+ return _getPyFile(filename)
+
+ def load(self, warnings = None):
+ try :
+ # there's no need to reload modules we already have
+ global _output, _statusDlg, _count
+ txt = _("Loading Module %s\n") % self.moduleName
+ _output.AddLines(txt)
+ _count += 1
+ if _count == 100:
+ _count = 95
+ _statusDlg.Update(_count, txt)
+
+ module = sys.modules.get(self.moduleName)
+ if module :
+ if not _allModules[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 SyntaxError, (message, (fileName, line, col, text)):
+ # ActiveGrid: added this for better feedback when module couldn't be loaded.
+ w = Warning(self.fullpath, line, _("Syntax Error: %s\n%s\n%s^error near here") % (message, text, ' '*(col-1)))
+ warnings.append(w)
+ return 0
+ except:
+ w = Warning(self.moduleName, 1, sys.exc_info()[0] + " NOT PROCESSED UNABLE TO IMPORT")
+ warnings.append(w)
+ importError(self.moduleName)
+ return 0
+
+ def initModule(self, module) :
+ if not self.module:
+ filename = _getPyFile(module.__file__)
+ if string.lower(filename[-3:]) == '.py':
+ try:
+ file = open(filename)
+ except IOError:
+ pass
+ else:
+ self._setupMainCode(file, filename, module)
+ return self._initModule(module)
+ return 1
+
+ def _initModule(self, module):
+ self.module = module
+ self.attributes = dir(self.module)
+
+ pychecker_attr = getattr(module, Config.CHECKER_VAR, None)
+ if pychecker_attr is not None :
+ utils.pushConfig()
+ utils.updateCheckerArgs(pychecker_attr, 'suppressions', 0, [])
+
+ for tokenName in _filterDir(self.module, _DEFAULT_MODULE_TOKENS) :
+ token = getattr(self.module, tokenName)
+ if isinstance(token, types.ModuleType) :
+ # get the real module name, tokenName could be an alias
+ self.addModule(token.__name__)
+ elif isinstance(token, types.FunctionType) :
+ self.addFunction(token)
+ elif isinstance(token, types.ClassType) or \
+ hasattr(token, '__bases__') :
+ self.addClass(tokenName)
+ else :
+ self.addVariable(tokenName, type(token))
+
+ if pychecker_attr is not None :
+ utils.popConfig()
+ return 1
+
+ def setupMainCode(self) :
+ file, filename, smt = _findModule(self.moduleName)
+ # FIXME: if the smt[-1] == imp.PKG_DIRECTORY : load __all__
+ module = imp.load_module(self.moduleName, file, filename, smt)
+ self._setupMainCode(file, filename, module)
+ return module
+
+ def _setupMainCode(self, file, filename, module):
+ try :
+ self.main_code = function.create_from_file(file, filename, module)
+ finally :
+ if file != None :
+ file.close()
+
+
+def getAllModules() :
+ "Returns a list of all modules that should be checked."
+ modules = []
+ for module in _allModules.values() :
+ if module.check :
+ modules.append(module)
+ return modules
+
+_BUILTIN_MODULE_ATTRS = { 'sys': [ 'ps1', 'ps2', 'tracebacklimit',
+ 'exc_type', 'exc_value', 'exc_traceback',
+ 'last_type', 'last_value', 'last_traceback',
+ ],
+ }
+
+def fixupBuiltinModules(needs_init=0):
+ for moduleName in sys.builtin_module_names :
+ if needs_init:
+ _ = Module(moduleName, 0)
+ module = _allModules.get(moduleName, None)
+ 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 _printWarnings(warnings, stream=None):
+ if stream is None:
+ stream = sys.stdout
+
+ warnings.sort()
+ lastWarning = None
+ for warning in warnings :
+ if lastWarning != None :
+ # ignore duplicate warnings
+ if cmp(lastWarning, warning) == 0 :
+ continue
+ # print blank line between files
+ if lastWarning.file != warning.file :
+ global _output
+ _output.AddLines("\n")
+
+ lastWarning = warning
+ _output.AddLines(warning.format() + "\n")
+
+
+def processFiles(files, cfg = None, pre_process_cb = None) :
+ # insert this here, so we find files in the local dir before std library
+ if sys.path[0] != '' :
+ sys.path.insert(0, '')
+
+ # ensure we have a config object, it's necessary
+ global _cfg
+ if cfg is not None :
+ _cfg = cfg
+ elif _cfg is None :
+ _cfg = Config.Config()
+
+ warnings = []
+ utils.initConfig(_cfg)
+ for moduleName, filename in getModules(files) :
+ if callable(pre_process_cb) :
+ pre_process_cb(moduleName)
+ module = Module(moduleName, fullpath = filename)
+
+ module.load(warnings)
+ utils.popConfig()
+ return warnings
+
+
+def getWarnings(files, cfg = None, suppressions = None):
+ warnings = processFiles(files, cfg)
+ fixupBuiltinModules()
+ return warnings + warn.find(getAllModules(), _cfg, suppressions)
+
+
+def _print_processing(name) :
+ if not _cfg.quiet :
+ global _output, _statusDlg, _count
+ txt = _("Processing %s...\n") % name
+ _output.AddLines(txt)
+ _count += 1
+ _statusDlg.Update(_count, txt)
+
+
+
+def checkSyntax(filename, messageView):
+ """ Massively hacked version of main for ActiveGrid IDE integration """
+ global _cfg
+ _cfg, files, suppressions = Config.setupFromArgs([filename])
+ if not files :
+ return 0
+
+ global _output, _statusDlg, _count
+ _output = messageView
+ # wxBug: Need to show progress dialog box, or message window never gets updated until the method returns
+ _statusDlg = wx.ProgressDialog(_("Check Code"), _("Checking %s") % filename, maximum = 100, style = wx.PD_AUTO_HIDE | wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME)
+ _count = 0
+
+ # insert this here, so we find files in the local dir before std library
+ sys.path.insert(0, '')
+
+ importWarnings = processFiles(files, _cfg, _print_processing)
+ fixupBuiltinModules()
+ if _cfg.printParse :
+ for module in getAllModules() :
+ printer.module(module)
+
+ warnings = warn.find(getAllModules(), _cfg, suppressions)
+
+ _statusDlg.Update(100, _("Done"))
+ _statusDlg.Destroy()
+
+ if not _cfg.quiet :
+ _output.AddLines(_("\nWarnings and Errors...\n"))
+ if warnings or importWarnings :
+ _printWarnings(importWarnings + warnings)
+ return 1
+
+ if not _cfg.quiet :
+ _output.AddLines(_("No Syntax Errors"))
+ return 0
+
+##
+##
+##def main(argv) :
+## __pychecker__ = 'no-miximport'
+## import pychecker
+## if LOCAL_MAIN_VERSION != pychecker.MAIN_MODULE_VERSION :
+## sys.stderr.write(_VERSION_MISMATCH_ERROR)
+## sys.exit(100)
+##
+## # remove empty arguments
+## argv = filter(None, argv)
+##
+## # if the first arg starts with an @, read options from the file
+## # after the @ (this is mostly for windows)
+## if len(argv) >= 2 and argv[1][0] == '@':
+## # read data from the file
+## command_file = argv[1][1:]
+## try:
+## f = open(command_file, 'r')
+## command_line = f.read()
+## f.close()
+## except IOError, err:
+## sys.stderr.write("Unable to read commands from file: %s\n %s\n" % \
+## (command_file, err))
+## sys.exit(101)
+##
+## # convert to an argv list, keeping argv[0] and the files to process
+## argv = argv[:1] + string.split(command_line) + argv[2:]
+##
+## global _cfg
+## _cfg, files, suppressions = Config.setupFromArgs(argv[1:])
+## if not files :
+## return 0
+##
+## # insert this here, so we find files in the local dir before std library
+## sys.path.insert(0, '')
+##
+## importWarnings = processFiles(files, _cfg, _print_processing)
+## fixupBuiltinModules()
+## if _cfg.printParse :
+## for module in getAllModules() :
+## printer.module(module)
+##
+## warnings = warn.find(getAllModules(), _cfg, suppressions)
+## if not _cfg.quiet :
+## print "\nWarnings...\n"
+## if warnings or importWarnings :
+## _printWarnings(importWarnings + warnings)
+## return 1
+##
+## if not _cfg.quiet :
+## print "None"
+## return 0
+##
+##
+##if __name__ == '__main__' :
+## try :
+## sys.exit(main(sys.argv))
+## except Config.UsageError :
+## sys.exit(127)
+##
+##else :
+## _orig__import__ = None
+## _suppressions = None
+## _warnings_cache = {}
+##
+## def _get_unique_warnings(warnings):
+## for i in range(len(warnings)-1, -1, -1):
+## w = warnings[i].format()
+## if _warnings_cache.has_key(w):
+## del warnings[i]
+## else:
+## _warnings_cache[w] = 1
+## return warnings
+##
+## def __import__(name, globals=None, locals=None, fromlist=None):
+## if globals is None:
+## globals = {}
+## if locals is None:
+## locals = {}
+## if fromlist is None:
+## fromlist = []
+##
+## check = not sys.modules.has_key(name) and name[:10] != 'pychecker.'
+## pymodule = _orig__import__(name, globals, locals, fromlist)
+## if check :
+## try :
+## module = Module(pymodule.__name__)
+## if module.initModule(pymodule):
+## warnings = warn.find([module], _cfg, _suppressions)
+## _printWarnings(_get_unique_warnings(warnings))
+## else :
+## print 'Unable to load module', pymodule.__name__
+## except Exception:
+## name = getattr(pymodule, '__name__', str(pymodule))
+## importError(name)
+##
+## return pymodule
+##
+## def _init() :
+## global _cfg, _suppressions, _orig__import__
+##
+## args = string.split(os.environ.get('PYCHECKER', ''))
+## _cfg, files, _suppressions = Config.setupFromArgs(args)
+## utils.initConfig(_cfg)
+## fixupBuiltinModules(1)
+##
+## # keep the orig __import__ around so we can call it
+## import __builtin__
+## _orig__import__ = __builtin__.__import__
+## __builtin__.__import__ = __import__
+##
+## if not os.environ.get('PYCHECKER_DISABLED') :
+## _init()
+##