| #!/usr/bin/python | 
 | # | 
 | # Common lint functions applicable to multiple types of files. | 
 |  | 
 | import re | 
 |  | 
 | def VerifyLineLength(filename, lines, max_length): | 
 |   """Checks to make sure the file has no lines with lines exceeding the length | 
 |   limit. | 
 |  | 
 |   Args: | 
 |     filename: the file under consideration as string | 
 |     lines: contents of the file as string array | 
 |     max_length: maximum acceptable line length as number | 
 |  | 
 |   Returns: | 
 |     A list of tuples with format [(filename, line number, msg), ...] with any | 
 |     violations found. | 
 |   """ | 
 |   lint = [] | 
 |   line_num = 1 | 
 |   for line in lines: | 
 |     length = len(line.rstrip('\n')) | 
 |     if length > max_length: | 
 |       lint.append((filename, line_num, | 
 |                    'Line exceeds %d chars (%d)' % (max_length, length))) | 
 |     line_num += 1 | 
 |   return lint | 
 |  | 
 | def VerifyTabs(filename, lines): | 
 |   """Checks to make sure the file has no tab characters. | 
 |  | 
 |   Args: | 
 |     filename: the file under consideration as string | 
 |     lines: contents of the file as string array | 
 |  | 
 |   Returns: | 
 |     A list of tuples with format [(line_number, msg), ...] with any violations | 
 |     found. | 
 |   """ | 
 |   lint = [] | 
 |   tab_re = re.compile(r'\t') | 
 |   line_num = 1 | 
 |   for line in lines: | 
 |     if tab_re.match(line.rstrip('\n')): | 
 |       lint.append((filename, line_num, 'Tab found instead of whitespace')) | 
 |     line_num += 1 | 
 |   return lint | 
 |  | 
 |  | 
 | def VerifyTrailingWhitespace(filename, lines): | 
 |   """Checks to make sure the file has no lines with trailing whitespace. | 
 |  | 
 |   Args: | 
 |     filename: the file under consideration as string | 
 |     lines: contents of the file as string array | 
 |  | 
 |   Returns: | 
 |     A list of tuples with format [(filename, line number, msg), ...] with any | 
 |     violations found. | 
 |   """ | 
 |   lint = [] | 
 |   trailing_whitespace_re = re.compile(r'\s+$') | 
 |   line_num = 1 | 
 |   for line in lines: | 
 |     if trailing_whitespace_re.match(line.rstrip('\n')): | 
 |       lint.append((filename, line_num, 'Trailing whitespace')) | 
 |     line_num += 1 | 
 |   return lint | 
 |  | 
 |  | 
 | class BaseLint: | 
 |   def RunOnFile(filename, lines): | 
 |     raise Exception('RunOnFile() unimplemented') | 
 |  | 
 |  | 
 | def RunLintOverAllFiles(linter, filenames): | 
 |   """Runs linter over the contents of all files. | 
 |  | 
 |   Args: | 
 |     lint: subclass of BaseLint, implementing RunOnFile() | 
 |     filenames: list of all files whose contents will be linted | 
 |  | 
 |   Returns: | 
 |     A list of tuples with format [(filename, line number, msg), ...] with any | 
 |     violations found. | 
 |   """ | 
 |   lint = [] | 
 |   for filename in filenames: | 
 |     file = open(filename, 'r') | 
 |     if not file: | 
 |       print 'Cound not open %s' % filename | 
 |       continue | 
 |     lines = file.readlines() | 
 |     lint.extend(linter.RunOnFile(filename, lines)) | 
 |  | 
 |   return lint |