summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Kluyver <takowl@gmail.com>2014-07-03 17:26:15 -0700
committerThomas Kluyver <takowl@gmail.com>2014-09-21 12:06:51 -0700
commit1ced5524cd740ef12c0851ac116af6568cc08aac (patch)
tree94901e5ec9ba2cd37b1b1d313669b7f507010e6e
parentd9fc2cfdcfaf13f2e8491ace60680f3c94ad5c83 (diff)
downloadpexpect-1ced5524cd740ef12c0851ac116af6568cc08aac.tar.gz
Check already read data before async reading more
-rw-r--r--pexpect/async.py16
1 files changed, 14 insertions, 2 deletions
diff --git a/pexpect/async.py b/pexpect/async.py
index 2b7c212..8ec9c3c 100644
--- a/pexpect/async.py
+++ b/pexpect/async.py
@@ -1,16 +1,24 @@
import asyncio
import errno
-from pexpect import EOF, TIMEOUT
+from pexpect import EOF
@asyncio.coroutine
def expect_async(expecter, timeout=None):
+ # First process data that was previously read - if it maches, we don't need
+ # async stuff.
+ idx = expecter.new_data(expecter.spawn.buffer)
+ expecter.spawn.buffer = expecter.spawn.string_type()
+ if idx:
+ return idx
+
transport, pw = yield from asyncio.get_event_loop()\
.connect_read_pipe(lambda: PatternWaiter(expecter), expecter.spawn)
-
+
try:
return (yield from asyncio.wait_for(pw.fut, timeout))
except asyncio.TimeoutError as e:
+ transport.pause_reading()
return expecter.timeout(e)
class PatternWaiter(asyncio.Protocol):
@@ -31,6 +39,10 @@ class PatternWaiter(asyncio.Protocol):
s = spawn._coerce_read_string(data)
spawn._log(s, 'read')
+ if self.fut.done():
+ spawn.buffer += data
+ return
+
try:
index = self.expecter.new_data(data)
if index is not None: