import sys
from os.path import dirname,realpath
sys.path.append(dirname(dirname(realpath(sys.argv[0]))))
from pychecker2.Check import CheckList
from pychecker2 import Options
from pychecker2 import ParseChecks
from pychecker2 import OpChecks
from pychecker2 import VariableChecks
from pychecker2 import ScopeChecks
from pychecker2 import ImportChecks
from pychecker2 import ClassChecks
from pychecker2 import ReachableChecks
from pychecker2 import ReturnChecks
from pychecker2 import ConditionalChecks
from pychecker2 import FormatStringChecks
CACHE_FILE = '/tmp/t'
def print_warnings(f, out):
if not f.warnings:
return 0
f.warnings.sort()
last_line = -1
last_msg = None
for line, warning, args in f.warnings:
if warning.value:
msg = warning.message % args
if msg != last_msg or line != last_line:
print >>out, \
'%s:%s %s' % (f.name, line or '[unknown line]', msg)
last_msg, last_line = msg, line
if last_msg:
print >>out
return 1
def create_checklist(options):
checks = [ ParseChecks.ParseCheck(),
OpChecks.OpCheck(),
OpChecks.ExceptCheck(),
OpChecks.CompareCheck(),
ReachableChecks.ReachableCheck(),
ConditionalChecks.ConstantCheck(),
ClassChecks.ReprCheck(),
ImportChecks.ImportCheck(),
FormatStringChecks.FormatStringCheck(),
VariableChecks.ShadowCheck(),
VariableChecks.UnpackCheck(),
VariableChecks.UnusedCheck(),
VariableChecks.UnknownCheck(),
VariableChecks.SelfCheck(),
VariableChecks.UsedBeforeSetCheck(),
ReturnChecks.MixedReturnCheck(),
ClassChecks.AttributeCheck(),
ClassChecks.SpecialCheck(),
ClassChecks.InitCheck(),
ScopeChecks.RedefineCheck(),
]
for checker in checks:
checker.get_warnings(options)
checker.get_options(options)
return CheckList(checks)
def main():
import cPickle
options = Options.Options()
try:
checker = cPickle.load(open(CACHE_FILE, 'rb'))
except (EOFError, IOError):
checker = create_checklist(options)
try:
files = options.process_options(sys.argv[1:])
except Options.Error, detail:
print >> sys.stderr, "Error: %s" % detail
options.usage(sys.argv[0], sys.stderr)
return 1
for f in files:
checker.check_file(f)
if options.incremental and not options.profile:
print_warnings(f, sys.stdout)
result = 0
if not options.incremental and not options.profile:
files.sort()
for f in files:
result |= print_warnings(f, sys.stdout)
if not result and options.verbose:
print >>sys.stdout, None
fp = open(CACHE_FILE, 'wb')
cPickle.dump(checker, fp, 1)
fp.close()
return result
if __name__ == "__main__":
if '--profile' in sys.argv:
print 'profiling'
import hotshot.stats
import time
hs = hotshot.Profile('logfile.dat')
now = time.time()
hs.run('main()')
print 'total run time', time.time() - now
hs.close()
stats = hotshot.stats.load('logfile.dat')
stats.sort_stats('time', 'cum').print_stats(50)
else:
sys.exit(main())
|