import re import subprocess import argparse parser = argparse.ArgumentParser() parser.add_argument('project') RULES_MAIN= [ r"\b(System\.out\.println)\b", r"^\s*var\b\s*\w*\s*=\s*[^n ][^e][^w]", r"^\s*var\b\s*\w*\s*=\s*\r", ] DUMB_WORDS = [ 'derp', 'herp', 'fjerp', 'todo', 'attempts to', 'actual', 'technically', 'so', "big integer", # Misspelled words 'concatinate', # Concatenate ] def re_select(options): return r'(?:' + r'|'.join(options) + r')' def re_delimit(rule): return r'\b' + rule + r'\b' def re_case_insensitive_sub(m): m = m.group(0) l = m.lower() u = m.upper() if l == u == m: return m else: return '['+l+u+']' def re_case_insensitive(rule): return re.sub(r'\w', re_case_insensitive_sub, rule) def re_sentence(sentence): words = sentence.split(' ') re = '\s+'.join(re_case_insensitive(w) for w in words) return re RE_DOC_COULD_BE_LINK = r'^(\s*(?:\/\*\*|\*).*)(\b[A-Z][a-z]\w*[A-Z]\w*)([ ,.])' RULES_BOTH = [ r"\.size\(\)\s*[=!<]=\s*0" , r"\b(hasSize\(0\))\b" , r"\b(\.size\(\)\)\.isEqualTo\()\b" , r"\.get\([^)(]+\)\)\.isEqualTo", r"\.isEqualTo\((List|Map|Set)\.of\(", r"\bCollectors\.toMap\b", r"\bCollectors\.toList\b", re_delimit(re_select([re_sentence(w) for w in DUMB_WORDS])), #RE_DOC_COULD_BE_LINK, ] def construct_cmd(rules, target): return ['ag', '--java', '(' + re_select(rules) + ')', target] if __name__ == '__main__': args = parser.parse_args() target = args.project result1 = subprocess.run(construct_cmd(RULES_MAIN, target + '/main')) result2 = subprocess.run(construct_cmd(RULES_BOTH, target)) if result1.returncode == 0 or result2.returncode == 0: exit(1)