X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=input_utils.py;h=e0b457d5a0e73ffc43d3d83ff09228328e6a641e;hb=a4bf4d05230474ad14243d67ac7f8c938f670e58;hp=648ee301639ec876750ebdd2b5d98e0d01603eaf;hpb=37dea8cb5d6adc9a4251949ea78a9b14620921ff;p=python_utils.git diff --git a/input_utils.py b/input_utils.py index 648ee30..e0b457d 100644 --- a/input_utils.py +++ b/input_utils.py @@ -2,14 +2,19 @@ """Utilities related to user input.""" -import readchar # type: ignore +import logging import signal import sys from typing import List +import readchar # type: ignore + import exceptions +logger = logging.getLogger(__file__) + + def single_keystroke_response( valid_responses: List[str], *, @@ -17,6 +22,8 @@ def single_keystroke_response( default_response: str = None, timeout_seconds: int = None, ) -> str: + """Get a single keystroke response to a prompt.""" + def _handle_timeout(signum, frame) -> None: raise exceptions.TimeoutError() @@ -31,6 +38,7 @@ def single_keystroke_response( try: while True: response = readchar.readchar() + logger.debug(f'Keystroke: {ord(response)}') if response in valid_responses: break if ord(response) in os_special_keystrokes: @@ -47,6 +55,9 @@ def single_keystroke_response( response = _single_keystroke_response_internal( valid_responses, timeout_seconds ) + if ord(response) == 3: + raise KeyboardInterrupt('User pressed ^C in input_utils.') + except exceptions.TimeoutError: if default_response is not None: response = default_response @@ -56,12 +67,16 @@ def single_keystroke_response( def yn_response(prompt: str = None, *, timeout_seconds=None) -> str: + """Get a Y/N response to a prompt.""" + return single_keystroke_response( ["y", "n", "Y", "N"], prompt=prompt, timeout_seconds=timeout_seconds ).lower() def keystroke_helper() -> None: + """Misc util to watch keystrokes and report what they were.""" + print("Watching for keystrokes; ^C to quit.") while True: key = readchar.readkey()