mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
Issue #26870: Add readline.set_auto_history(), originally by Tyler Crompton
This commit is contained in:
parent
4dd27f0adc
commit
f0dbf7a6ab
6 changed files with 96 additions and 1 deletions
|
@ -1,7 +1,11 @@
|
|||
"""
|
||||
Very minimal unittests for parts of the readline module.
|
||||
"""
|
||||
from errno import EIO
|
||||
import os
|
||||
import selectors
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from test.support import import_module, unlink
|
||||
|
@ -96,6 +100,51 @@ class TestReadline(unittest.TestCase):
|
|||
TERM='xterm-256color')
|
||||
self.assertEqual(stdout, b'')
|
||||
|
||||
auto_history_script = """\
|
||||
import readline
|
||||
readline.set_auto_history({})
|
||||
input()
|
||||
print("History length:", readline.get_current_history_length())
|
||||
"""
|
||||
|
||||
def test_auto_history_enabled(self):
|
||||
output = run_pty(self.auto_history_script.format(True))
|
||||
self.assertIn(b"History length: 1\r\n", output)
|
||||
|
||||
def test_auto_history_disabled(self):
|
||||
output = run_pty(self.auto_history_script.format(False))
|
||||
self.assertIn(b"History length: 0\r\n", output)
|
||||
|
||||
|
||||
def run_pty(script, input=b"dummy input\r"):
|
||||
pty = import_module('pty')
|
||||
output = bytearray()
|
||||
[master, slave] = pty.openpty()
|
||||
args = (sys.executable, '-c', script)
|
||||
proc = subprocess.Popen(args, stdin=slave, stdout=slave, stderr=slave)
|
||||
os.close(slave)
|
||||
with proc, selectors.DefaultSelector() as sel:
|
||||
sel.register(master, selectors.EVENT_READ | selectors.EVENT_WRITE)
|
||||
os.set_blocking(master, False)
|
||||
while True:
|
||||
for [_, events] in sel.select():
|
||||
if events & selectors.EVENT_READ:
|
||||
try:
|
||||
chunk = os.read(master, 0x10000)
|
||||
except OSError as err:
|
||||
# Linux raises EIO when the slave is closed
|
||||
if err.errno != EIO:
|
||||
raise
|
||||
chunk = b""
|
||||
if not chunk:
|
||||
os.close(master)
|
||||
return output
|
||||
output.extend(chunk)
|
||||
if events & selectors.EVENT_WRITE:
|
||||
input = input[os.write(master, input):]
|
||||
if not input:
|
||||
sel.modify(master, selectors.EVENT_READ)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue