From 38c63ca2ea3b41314bfd600cc5758dbbae822e89 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Tue, 31 Mar 2015 22:12:38 +0200 Subject: [PATCH] Add a checker for words which I often misspell. --- scripts/misc_checks.py | 65 ++++++++++++++++++++++++++++++++++++------ tox.ini | 1 + 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/scripts/misc_checks.py b/scripts/misc_checks.py index 78c6d5b41..bea0a4628 100644 --- a/scripts/misc_checks.py +++ b/scripts/misc_checks.py @@ -21,18 +21,27 @@ """Various small code checkers.""" import os +import re import sys import os.path import argparse import subprocess import tokenize import traceback +import collections sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir)) from scripts import utils +def _py_files(target): + """Iterate over all python files and yield filenames.""" + for (dirpath, _dirnames, filenames) in os.walk(target): + for name in (e for e in filenames if e.endswith('.py')): + yield os.path.join(dirpath, name) + + def check_git(): """Check for uncommitted git files..""" if not os.path.isdir(".git"): @@ -55,18 +64,49 @@ def check_git(): return status +def check_spelling(target): + """Check commonly misspelled words.""" + # Words which I often misspell + words = {'behaviour', 'quitted', 'likelyhood', 'sucessfully', + 'occur[^r .]', 'seperator', 'explicitely', 'resetted', + 'auxillary', 'accidentaly', 'ambigious', 'loosly', + 'initialis', 'convienence', 'similiar', 'uncommited', + 'reproducable'} + + # Words which look better when splitted, but might need some fine tuning. + words |= {'keystrings', 'webelements', 'mouseevent', 'keysequence', + 'normalmode', 'eventloops', 'sizehint', 'statemachine', + 'metaobject', 'logrecord', 'monkeypatch', 'filetype'} + + seen = collections.defaultdict(list) + try: + ok = True + for fn in _py_files(target): + with tokenize.open(fn) as f: + if fn == os.path.join('scripts', 'misc_checks.py'): + continue + for line in f: + for w in words: + if re.search(w, line) and fn not in seen[w]: + print("Found '{}' in {}!".format(w, fn)) + seen[w].append(fn) + print() + return ok + except Exception: + traceback.print_exc() + return None + + def check_vcs_conflict(target): """Check VCS conflict markers.""" try: ok = True - for (dirpath, _dirnames, filenames) in os.walk(target): - for name in (e for e in filenames if e.endswith('.py')): - fn = os.path.join(dirpath, name) - with tokenize.open(fn) as f: - for line in f: - if any(line.startswith(c * 7) for c in '<>=|'): - print("Found conflict marker in {}".format(fn)) - ok = False + for fn in _py_files(target): + with tokenize.open(fn) as f: + for line in f: + if any(line.startswith(c * 7) for c in '<>=|'): + print("Found conflict marker in {}".format(fn)) + ok = False print() return ok except Exception: @@ -77,7 +117,7 @@ def check_vcs_conflict(target): def main(): """Main entry point.""" parser = argparse.ArgumentParser() - parser.add_argument('checker', choices=('git', 'vcs'), + parser.add_argument('checker', choices=('git', 'vcs', 'spelling'), help="Which checker to run.") parser.add_argument('target', help="What to check", nargs='*') args = parser.parse_args() @@ -91,6 +131,13 @@ def main(): if not ok: is_ok = False return 0 if is_ok else 1 + elif args.checker == 'spelling': + is_ok = True + for target in args.target: + ok = check_spelling(target) + if not ok: + is_ok = False + return 0 if is_ok else 1 if __name__ == '__main__': diff --git a/tox.ini b/tox.ini index 3743eae91..143d4f804 100644 --- a/tox.ini +++ b/tox.ini @@ -39,6 +39,7 @@ commands = commands = {envpython} scripts/misc_checks.py git {envpython} scripts/misc_checks.py vcs qutebrowser scripts + {envpython} scripts/misc_checks.py spelling qutebrowser scripts [testenv:pylint] skip_install = true