#!/usr/bin/env python # Copyright 2014 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # =*= License: GPL-3+ =*= import sys import cliapp import obnamlib class TabCharacter(obnamlib.ObnamError): msg = 'TAB character found: {line}' class LongLine(obnamlib.ObnamError): msg = 'long line ({length} chars after TAB expansion): {line}' class SourceCodeNitpicker(cliapp.Application): max_line_length = 79 def setup(self): self.errors = False def cleanup(self): if self.errors: sys.exit(1) def process_input_line(self, filename, line): line = line.rstrip('\n') self.check_for_tabs(filename, line) self.check_for_long_line (filename, line) def check_for_tabs(self, filename, line): if not filename.endswith('Makefile'): if '\t' in line: self.error(filename, self.lineno, TabCharacter(line=line)) def check_for_long_line(self, filename, line): expanded = line.expandtabs() if self.line_is_long(expanded) and self.line_can_be_broken(line): self.error( filename, self.lineno, LongLine(line=line, length=len(expanded))) def line_is_long(self, line): return len(line) > self.max_line_length def line_can_be_broken(self, line): return len(line.split()) > 1 def error(self, filename, lineno, error): self.output.write( '%s:%s: %s\n' % (filename, lineno, str(error))) self.errors = True SourceCodeNitpicker().run()