summaryrefslogtreecommitdiff
path: root/Biz/Lint.py
diff options
context:
space:
mode:
Diffstat (limited to 'Biz/Lint.py')
-rwxr-xr-xBiz/Lint.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/Biz/Lint.py b/Biz/Lint.py
new file mode 100755
index 0000000..fccda57
--- /dev/null
+++ b/Biz/Lint.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+"""
+all your lint are belong to us
+"""
+import os
+import subprocess
+import sys
+
+
+# pylint: disable=missing-class-docstring,too-few-public-methods
+class Color:
+ HEAD = "\033[95m"
+ BLUE = "\033[94m"
+ GREEN = "\033[92m"
+ WARN = "\033[93m"
+ FAIL = "\033[91m"
+ BOLD = "\033[1m"
+ UNDER = "\033[4m"
+ END = "\033[0m"
+
+
+def run(cmd, file):
+ "Exec a linter for a file."
+ global ERRORS # pylint: disable=global-statement
+ args = {
+ "ormolu": ["--mode", "check"],
+ "hlint": [],
+ "black": ["--quiet", "--check"],
+ "pylint": [],
+ }
+ # pylint: disable=subprocess-run-check
+ ret = subprocess.run([cmd, *args[cmd], file], stdout=subprocess.PIPE)
+ if ret.returncode != 0:
+ ERRORS += 1 # pylint: disable=undefined-variable
+ msg = ret.stdout.decode("utf-8").strip()
+ print(Color.WARN + f"lint error: {cmd}: {file}" + Color.END)
+ if msg:
+ for line in msg.split("\n"):
+ print(" " + line)
+
+
+def changed_files():
+ "Return a list of changed files according to git."
+ merge_base = (
+ subprocess.check_output(["git", "merge-base", "HEAD", "origin/master"])
+ .decode("utf-8")
+ .strip()
+ )
+ return (
+ subprocess.check_output(["git", "diff", "--name-only", merge_base])
+ .decode("utf-8")
+ .strip()
+ .split()
+ )
+
+
+def group_files(files, extensions):
+ """Given a list of files and list of extensions, return a dict of:
+ {ext: [files]}
+
+ """
+ root = os.getenv("BIZ_ROOT")
+ ret = {k: [] for k in extensions}
+ for ext in extensions:
+ for file in files:
+ if file.endswith(ext):
+ ret[ext].append(os.path.join(root, file))
+ return ret
+
+
+def guard_todos(files):
+ for fname in files:
+ with open(fname) as text:
+ if "TODO" in text.read():
+ ERRORS += 1
+ print("found todo:", fname)
+
+
+if __name__ == "__main__":
+ ERRORS = 0
+ if "-h" in sys.argv:
+ print(f"usage: {os.path.basename(__file__)} <files...>")
+ print("if no files given, lint changed files in this branch")
+ sys.exit(0)
+ elif len(sys.argv) == 1:
+ FILES = group_files(changed_files(), [".hs", ".py"])
+ else:
+ FILES = group_files(sys.argv[1:], [".hs", ".py"])
+ for hs in FILES[".hs"]:
+ print(f"lint: {hs}")
+ run("ormolu", hs)
+ run("hlint", hs)
+ for py in FILES[".py"]:
+ print(f"lint: {py}")
+ run("black", py)
+ run("pylint", py)
+ sys.exit(ERRORS)