fix(rawcli): raw byte-line autocomplete fires in hex and binary
The digit key handler applied each keystroke as `buf.document = Document(...)`. Assigning the buffer document resets prompt_toolkit's complete_state and never re-fires completion, so the live autocomplete menu never appeared during raw byte entry -- in BOTH hex and binary (only command-name completion worked, since that path already used insert_text). type_digit only ever appends the digit (optionally after an auto-space) or drops it, so the change is always a pure suffix. Apply it with buf.insert_text, which triggers completion exactly like an ordinary keystroke. Verified by driving the real key binding: the completion menu now populates on every digit in hex and binary (before: complete_state None, start_completion never called). Adds a regression test asserting the handler routes through insert_text; updates the rawcli roadmap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -908,3 +908,26 @@ class TestKeyBindings:
|
||||
for ch in "00000100":
|
||||
press(ch)
|
||||
assert buf.text == "30 00000100" and s.byte_bases == ["hex", "bin"]
|
||||
|
||||
def test_digit_binding_fires_completion_trigger_for_raw_bytes(self):
|
||||
# regression: raw byte entry must append via insert_text (which fires completion), not
|
||||
# replace buf.document (which resets complete_state and silently killed the live
|
||||
# autocomplete menu during hex/binary byte entry). on_text_insert fires from insert_text,
|
||||
# never from a document= swap, so it is a faithful proxy for "the menu would refresh".
|
||||
from types import SimpleNamespace
|
||||
from prompt_toolkit.key_binding import KeyBindings
|
||||
from prompt_toolkit.buffer import Buffer
|
||||
from pm3py.cli.rawcli.entry import install_key_bindings
|
||||
s = RawSession()
|
||||
s.toggle_entry_mode() # binary: regroups every 8 digits (worst case)
|
||||
kb = KeyBindings()
|
||||
install_key_bindings(kb, s)
|
||||
digit = {getattr(b.keys[0], "value", b.keys[0]): b for b in kb.bindings}
|
||||
buf = Buffer()
|
||||
fired = []
|
||||
buf.on_text_insert += lambda _b: fired.append(1)
|
||||
app = SimpleNamespace(invalidate=lambda: None)
|
||||
for ch in "00000100":
|
||||
digit[ch].handler(SimpleNamespace(current_buffer=buf, app=app, data=ch))
|
||||
assert buf.text == "00000100"
|
||||
assert len(fired) == 8 # one insert_text per digit (0 with document=)
|
||||
|
||||
Reference in New Issue
Block a user