| #!/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 |