summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordluyer <53582923+dluyer@users.noreply.github.com>2020-01-09 14:42:30 -0800
committerGitHub <noreply@github.com>2020-01-09 14:42:30 -0800
commit5f98ced27fcd4477776c2793e033794955b25bcd (patch)
tree0445ba776bfe904201db5fc593203f6bb1ce8f99
parentb5d6e6d56ff24027a98b2ed901e40dc69aa6761d (diff)
downloadpexpect-git-5f98ced27fcd4477776c2793e033794955b25bcd.tar.gz
Split new_data initial and subsequent calls
expect_{loop,async} call new_data at start, when there isn't really new data. Reviewer requested a split of functionality here into two routines.
-rw-r--r--pexpect/expect.py112
1 files changed, 59 insertions, 53 deletions
diff --git a/pexpect/expect.py b/pexpect/expect.py
index d6600a9..7d0c7ab 100644
--- a/pexpect/expect.py
+++ b/pexpect/expect.py
@@ -15,61 +15,9 @@ class Expecter(object):
if hasattr(searcher, 'longest_string'):
self.lookback = searcher.longest_string
- def new_data(self, data):
+ def do_search(self, window, freshlen):
spawn = self.spawn
searcher = self.searcher
-
- if data is None:
- # First call from a new call to expect_loop.
- # self.searchwindowsize may have changed.
- before_len = spawn._before.tell()
- buf_len = spawn._buffer.tell()
- freshlen = before_len
- if before_len > buf_len:
- if not self.searchwindowsize:
- spawn._buffer = spawn.buffer_type()
- window = spawn._before.getvalue()
- spawn._buffer.write(spawn._before.getvalue())
- elif buf_len < self.searchwindowsize:
- spawn._buffer = spawn.buffer_type()
- spawn._before.seek(
- max(0, before_len - self.searchwindowsize))
- window = spawn._before.read()
- spawn._buffer.write(window)
- else:
- spawn._buffer.seek(max(0, buf_len - self.searchwindowsize))
- window = spawn._buffer.read()
- else:
- if self.searchwindowsize:
- spawn._buffer.seek(max(0, buf_len - self.searchwindowsize))
- window = spawn._buffer.read()
- else:
- window = spawn._buffer.getvalue()
- else:
- freshlen = len(data)
- spawn._before.write(data)
- if not self.searchwindowsize:
- if self.lookback:
- # search lookback + new data.
- old_len = spawn._buffer.tell()
- spawn._buffer.write(data)
- spawn._buffer.seek(max(0, old_len - self.lookback))
- window = spawn._buffer.read()
- else:
- # copy the whole buffer (really slow for large datasets).
- spawn._buffer.write(data)
- window = spawn.buffer
- else:
- if len(data) >= self.searchwindowsize or not spawn._buffer.tell():
- window = data[-self.searchwindowsize:]
- spawn._buffer = spawn.buffer_type()
- spawn._buffer.write(window[-self.searchwindowsize:])
- else:
- spawn._buffer.write(data)
- new_len = spawn._buffer.tell()
- spawn._buffer.seek(max(0, new_len - self.searchwindowsize))
- window = spawn._buffer.read()
-
if freshlen > len(window):
freshlen = len(window)
index = searcher.search(window, freshlen, self.searchwindowsize)
@@ -91,6 +39,64 @@ class Expecter(object):
spawn._buffer = spawn.buffer_type()
spawn._buffer.write(window[-maintain:])
+ def existing_data(self):
+ # First call from a new call to expect_loop or expect_async.
+ # self.searchwindowsize may have changed.
+ # Treat all data as fresh.
+ spawn = self.spawn
+ before_len = spawn._before.tell()
+ buf_len = spawn._buffer.tell()
+ freshlen = before_len
+ if before_len > buf_len:
+ if not self.searchwindowsize:
+ spawn._buffer = spawn.buffer_type()
+ window = spawn._before.getvalue()
+ spawn._buffer.write(spawn._before.getvalue())
+ elif buf_len < self.searchwindowsize:
+ spawn._buffer = spawn.buffer_type()
+ spawn._before.seek(
+ max(0, before_len - self.searchwindowsize))
+ window = spawn._before.read()
+ spawn._buffer.write(window)
+ else:
+ spawn._buffer.seek(max(0, buf_len - self.searchwindowsize))
+ window = spawn._buffer.read()
+ else:
+ if self.searchwindowsize:
+ spawn._buffer.seek(max(0, buf_len - self.searchwindowsize))
+ window = spawn._buffer.read()
+ else:
+ window = spawn._buffer.getvalue()
+ return self.do_search(window, freshlen)
+
+ def new_data(self, data):
+ # A subsequent call, after a call to existing_data.
+ spawn = self.spawn
+ freshlen = len(data)
+ spawn._before.write(data)
+ if not self.searchwindowsize:
+ if self.lookback:
+ # search lookback + new data.
+ old_len = spawn._buffer.tell()
+ spawn._buffer.write(data)
+ spawn._buffer.seek(max(0, old_len - self.lookback))
+ window = spawn._buffer.read()
+ else:
+ # copy the whole buffer (really slow for large datasets).
+ spawn._buffer.write(data)
+ window = spawn.buffer
+ else:
+ if len(data) >= self.searchwindowsize or not spawn._buffer.tell():
+ window = data[-self.searchwindowsize:]
+ spawn._buffer = spawn.buffer_type()
+ spawn._buffer.write(window[-self.searchwindowsize:])
+ else:
+ spawn._buffer.write(data)
+ new_len = spawn._buffer.tell()
+ spawn._buffer.seek(max(0, new_len - self.searchwindowsize))
+ window = spawn._buffer.read()
+ return self.do_search(window, freshlen)
+
def eof(self, err=None):
spawn = self.spawn