#!/usr/bin/env python from pyaccuwage import model as pyaccuwagemodel import argparse import sys import os import re parser = argparse.ArgumentParser(description="Check pyaccuwage record models for sequence errors.") parser.add_argument("-i", "--input", nargs=1, required=True, metavar="file", type=argparse.FileType('r'), help="Source file to be checked") args = parser.parse_args() class ClassEntry(object): re_rangecomment = re.compile('#\s+(\d+)\-?(\d*)$') def __init__(self, classname, line): self.classname = classname, self.line = line self.lines = [] def add_line(self, line): self.lines.append(line) def validate(self): i = 0 for (line_no, line) in enumerate(self.lines): match = self.re_rangecomment.search(line) if match: (a, b) = match.groups() a = int(a) if (i + 1) != a: line_number = self.line + line_no print("ERROR\tline:%d\tnear:%s\texpected:%d\tsaw:%d" % (line_number, line.split(' ')[0].strip(), i+1, a)) i = int(b) if b else a class ModelDefParser(object): re_triplequote = re.compile('"""') re_whitespace = re.compile("^(\s*)[^\s]+") re_classdef = re.compile(r"^\s*class\s(.*)\((.*)\):\s*$") def __init__(self, infile): self.infile = infile self.line = 0 def endclass(self): if self.current_class: self.current_class.validate() self.current_class = None def beginclass(self, classname, line): self.current_class = ClassEntry(classname, line) def parse(self): infile = self.infile whitespace = 0 in_block_comment = False self.current_class = None for line in infile: self.line += 1 if line.startswith('#'): continue if self.re_triplequote.search(line): in_block_comment = not in_block_comment if in_block_comment: continue match_whitespace = self.re_whitespace.match(line) if match_whitespace: match_whitespace = len(match_whitespace.groups()[0]) else: match_whitespace = 0 classmatch = self.re_classdef.match(line) if classmatch: classname, subclass = classmatch.groups() self.beginclass(classname, self.line) continue if match_whitespace < whitespace: whitespace = match_whitespace self.endclass() continue if self.current_class: whitespace = match_whitespace self.current_class.add_line(line) parser = ModelDefParser(args.input[0]) parser.parse()