class Log: def __init__(self, path): dirname = os.path.dirname(path) os.makedirs(dirname, exist_ok=True) f = open(path, "a+") # Check that the file is newline-terminated size = os.path.getsize(path) if size > 0: f.seek(size - 1) end = f.read(1) if end != "\n": f.write("\n") self.f = f self.path = path def log(self, event): event["_event_id"] = str(uuid.uuid4()) json.dump(event, self.f) self.f.write("\n") def state(self): state = {"complete": set(), "last": None} for line in open(self.path): event = json.loads(line) if event["type"] == "submit" and event["success"]: state["complete"].add(event["id"]) state["last"] = event return state