import os
import io
import sys
import builtins
ROOTDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.realpath(ROOTDIR))
def path(*segments):
result = os.path.join(ROOTDIR, *segments)
os.makedirs(os.path.dirname(result), exist_ok=True)
return result
def trim(path):
return path[len(ROOTDIR)+1:]
def open(path, mode="r"):
return builtins.open(path, mode, encoding="utf-8", newline="\n")
def git(command, *args):
import subprocess
return subprocess.Popen(
["git", command, *args],
stdout=subprocess.PIPE,
cwd=ROOTDIR,
).communicate()[0].strip().decode()
class lazy():
def __init__(self, path):
self.path = path
self.buffer = io.StringIO()
def __enter__(self):
return self.buffer
def __exit__(self, exc_type, exc_value, traceback):
try:
with builtins.open(self.path, encoding="utf-8", newline="") as fp:
old = fp.read()
except Exception:
old = None
new = self.buffer.getvalue()
if new != old:
with builtins.open(
self.path, "w", encoding="utf-8", newline="") as fp:
fp.write(new)
else:
os.utime(self.path)
class lines():
def __init__(self, path, lazy=True):
self.path = path
self.lazy = lazy
self.lines = ()
def __enter__(self):
with open(self.path) as fp:
self.lines = lines = fp.readlines()
return lines
def __exit__(self, exc_type, exc_value, traceback):
ctx = lazy(self.path) if self.lazy else open(self.path, "w")
with ctx as fp:
fp.writelines(self.lines)