""" Startup site customization for Stability Matrix. Currently this installs an audit hook to notify the parent process when input() is called, so we can prompt the user to enter something. """ import sys import json # Application Program Command escape sequence # This wraps messages sent to the parent process. esc_apc = "\x9F" esc_prefix = "[SM;" esc_st = "\x9C" def send_apc(msg: str): """Send an Application Program Command to the parent process.""" sys.stdout.flush() sys.stdout.write(esc_apc + esc_prefix + msg + esc_st) sys.stdout.flush() def send_apc_json(type: str, data: str): """Send an APC Json message.""" send_apc(json.dumps({"type": type, "data": data})) def send_apc_input(prompt: str): """Apc message for input() prompt.""" send_apc_json("input", prompt) def audit(event: str, *args): """Main audit hook function.""" # https://docs.python.org/3/library/functions.html#input # input() raises audit event `builtins.input` with args (prompt: str) *before* reading from stdin. # `builtins.input/result` raised after reading from stdin. if event == "builtins.input": try: prompts = args[0] if args else () prompt = "".join(prompts) send_apc_input(prompt) except Exception: pass # Reconfigure stdout to UTF-8 # noinspection PyUnresolvedReferences sys.stdout.reconfigure(encoding="utf-8") # Install the audit hook sys.addaudithook(audit)