1*a325d9c4SApple OSS Distributions#!/usr/bin/env python 2*a325d9c4SApple OSS Distributions 3*a325d9c4SApple OSS Distributionshelpdoc = """ 4*a325d9c4SApple OSS DistributionsA simple utility that verifies the syntax for python scripts. 5*a325d9c4SApple OSS DistributionsThe checks it does are : 6*a325d9c4SApple OSS Distributions * Check for 'tab' characters in .py files 7*a325d9c4SApple OSS Distributions * Compile errors in py sources 8*a325d9c4SApple OSS DistributionsUsage: 9*a325d9c4SApple OSS Distributions python syntax_checker.py <python_source_file> [<python_source_file> ..] 10*a325d9c4SApple OSS Distributions""" 11*a325d9c4SApple OSS Distributionsimport py_compile 12*a325d9c4SApple OSS Distributionsimport sys 13*a325d9c4SApple OSS Distributionsimport os 14*a325d9c4SApple OSS Distributionsimport re 15*a325d9c4SApple OSS Distributions 16*a325d9c4SApple OSS Distributionstabs_search_rex = re.compile("^\s*\t+",re.MULTILINE|re.DOTALL) 17*a325d9c4SApple OSS Distributions 18*a325d9c4SApple OSS Distributionsdef find_non_ascii(s): 19*a325d9c4SApple OSS Distributions for c in s: 20*a325d9c4SApple OSS Distributions if ord(c) >= 0x80: return True 21*a325d9c4SApple OSS Distributions return False 22*a325d9c4SApple OSS Distributions 23*a325d9c4SApple OSS Distributionsif __name__ == "__main__": 24*a325d9c4SApple OSS Distributions if len(sys.argv) < 2: 25*a325d9c4SApple OSS Distributions print >>sys.stderr, "Error: Unknown arguments" 26*a325d9c4SApple OSS Distributions print helpdoc 27*a325d9c4SApple OSS Distributions sys.exit(1) 28*a325d9c4SApple OSS Distributions for fname in sys.argv[1:]: 29*a325d9c4SApple OSS Distributions if not os.path.exists(fname): 30*a325d9c4SApple OSS Distributions print >>sys.stderr, "Error: Cannot recognize %s as a file" % fname 31*a325d9c4SApple OSS Distributions sys.exit(1) 32*a325d9c4SApple OSS Distributions if fname.split('.')[-1] != 'py': 33*a325d9c4SApple OSS Distributions print "Note: %s is not a valid python file. Skipping." % fname 34*a325d9c4SApple OSS Distributions continue 35*a325d9c4SApple OSS Distributions fh = open(fname) 36*a325d9c4SApple OSS Distributions strdata = fh.readlines() 37*a325d9c4SApple OSS Distributions lineno = 0 38*a325d9c4SApple OSS Distributions syntax_fail = False 39*a325d9c4SApple OSS Distributions for linedata in strdata: 40*a325d9c4SApple OSS Distributions lineno += 1 41*a325d9c4SApple OSS Distributions if len(tabs_search_rex.findall(linedata)) > 0 : 42*a325d9c4SApple OSS Distributions print >>sys.stderr, "Error: Found a TAB character at %s:%d" % (fname, lineno) 43*a325d9c4SApple OSS Distributions syntax_fail = True 44*a325d9c4SApple OSS Distributions if find_non_ascii(linedata): 45*a325d9c4SApple OSS Distributions print >>sys.stderr, "Error: Found a non ascii character at %s:%d" % (fname, lineno) 46*a325d9c4SApple OSS Distributions syntax_fail = True 47*a325d9c4SApple OSS Distributions if syntax_fail: 48*a325d9c4SApple OSS Distributions print >>sys.stderr, "Error: Syntax check failed. Please fix the errors and try again." 49*a325d9c4SApple OSS Distributions sys.exit(1) 50*a325d9c4SApple OSS Distributions #now check for error in compilation 51*a325d9c4SApple OSS Distributions try: 52*a325d9c4SApple OSS Distributions compile_result = py_compile.compile(fname, cfile="/dev/null", doraise=True) 53*a325d9c4SApple OSS Distributions except py_compile.PyCompileError as exc: 54*a325d9c4SApple OSS Distributions print >>sys.stderr, str(exc) 55*a325d9c4SApple OSS Distributions print >>sys.stderr, "Error: Compilation failed. Please fix the errors and try again." 56*a325d9c4SApple OSS Distributions sys.exit(1) 57*a325d9c4SApple OSS Distributions print "Success: Checked %s. No syntax errors found." % fname 58*a325d9c4SApple OSS Distributions sys.exit(0) 59*a325d9c4SApple OSS Distributions 60