diff options
author | Thomas Kluyver <takowl@gmail.com> | 2014-07-03 17:26:15 -0700 |
---|---|---|
committer | Thomas Kluyver <takowl@gmail.com> | 2014-09-21 12:06:51 -0700 |
commit | 1ced5524cd740ef12c0851ac116af6568cc08aac (patch) | |
tree | 94901e5ec9ba2cd37b1b1d313669b7f507010e6e | |
parent | d9fc2cfdcfaf13f2e8491ace60680f3c94ad5c83 (diff) | |
download | pexpect-1ced5524cd740ef12c0851ac116af6568cc08aac.tar.gz |
Check already read data before async reading more
-rw-r--r-- | pexpect/async.py | 16 |
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: |