From 3062de696c7fe359e6f7b8fc8c405407e2f3d15b Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 24 Oct 2022 16:50:06 +0000 Subject: [PATCH] line_input(): fix inserted text handling, add `hold_protect` arg --- mmgen/ui.py | 30 +++++++++++++++--------------- test/test_py_d/ts_ethdev.py | 6 ++++-- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/mmgen/ui.py b/mmgen/ui.py index 0f65185e..8341d869 100755 --- a/mmgen/ui.py +++ b/mmgen/ui.py @@ -37,7 +37,7 @@ def get_data_from_user(desc='data'): # user input MUST be UTF-8 dmsg(f'User input: [{data}]') return data -def line_input(prompt,echo=True,insert_txt=''): +def line_input(prompt,echo=True,insert_txt='',hold_protect=True): """ multi-line prompts OK one-line prompts must begin at beginning of line @@ -45,34 +45,33 @@ def line_input(prompt,echo=True,insert_txt=''): """ assert prompt,'calling line_input() with an empty prompt forbidden' - def init_readline(): + def get_readline(): try: import readline + return readline except ImportError: return False - else: - if insert_txt: - readline.set_startup_hook(lambda: readline.insert_text(insert_txt)) - return True - else: - return False if not sys.stdout.isatty(): msg_r(prompt) prompt = '' - from .term import kb_hold_protect - kb_hold_protect() + if hold_protect: + from .term import kb_hold_protect + kb_hold_protect() + + readline = None if g.test_suite_popen_spawn: msg(prompt) sys.stderr.flush() reply = os.read(0,4096).decode().rstrip('\n') # strip NL to mimic behavior of input() elif echo or not sys.stdin.isatty(): - clear_buffer = init_readline() if sys.stdin.isatty() else False + readline = sys.stdin.isatty() and get_readline() + if readline and insert_txt: + readline.set_startup_hook(lambda: readline.insert_text(insert_txt)) reply = input(prompt) - if clear_buffer: - import readline + if readline and insert_txt: readline.set_startup_hook(lambda: readline.insert_text('')) else: from getpass import getpass @@ -84,9 +83,10 @@ def line_input(prompt,echo=True,insert_txt=''): else: reply = getpass(prompt) - kb_hold_protect() + if hold_protect: + kb_hold_protect() - return reply.strip() + return (insert_txt if insert_txt and not readline else '') + reply.strip() def keypress_confirm(prompt,default_yes=False,verbose=False,no_nl=False,complete_prompt=False): diff --git a/test/test_py_d/ts_ethdev.py b/test/test_py_d/ts_ethdev.py index 6f41ce2c..ba873246 100755 --- a/test/test_py_d/ts_ethdev.py +++ b/test/test_py_d/ts_ethdev.py @@ -1276,12 +1276,14 @@ class TestSuiteEthdev(TestSuiteBase,TestSuiteShared): return t def edit_label1(self): - return self.edit_label(out_num=del_addrs[0],label_text=tw_label_zh) + return self.edit_label(out_num=del_addrs[0],label_text=tw_label_zh[:3]) def edit_label2(self): - return self.edit_label(out_num=del_addrs[0],label_text=tw_label_zh[:-1],changed=True) + return self.edit_label(out_num=del_addrs[0],label_text=tw_label_zh[3:],changed=True) def edit_label3(self): return self.edit_label(out_num=del_addrs[1],label_text=tw_label_lat_cyr_gr) def edit_label4(self): + if not opt.pexpect_spawn: + return 'skip' return self.edit_label(out_num=del_addrs[0],label_text=self.erase_input) def token_edit_label1(self):