From 0c74cf838c2d3b032fb5fdf934b3cacb0947e591 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Feb 14 2017 09:27:29 +0000 Subject: Update to 4.2.1 Signed-off-by: Igor Gnatenko --- diff --git a/.gitignore b/.gitignore index 5e9be72..0b006c5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ pexpect-2.3.tar.gz /pexpect-4.0.tar.gz /pexpect-4.0.1.tar.gz /pexpect-4.1.0.tar.gz +/pexpect-4.2.1.tar.gz diff --git a/0001-Encode-command-line-args-for-unicode-mode-spawn.patch b/0001-Encode-command-line-args-for-unicode-mode-spawn.patch deleted file mode 100644 index abb3bda..0000000 --- a/0001-Encode-command-line-args-for-unicode-mode-spawn.patch +++ /dev/null @@ -1,29 +0,0 @@ -From fa5ece24786d659e0bcd8423d66cbaa51b3d8d6c Mon Sep 17 00:00:00 2001 -From: Thomas Kluyver -Date: Tue, 6 Oct 2015 11:30:10 +0100 -Subject: [PATCH] Encode command line args for unicode-mode spawn - -Attempt to address gh-272 ---- - pexpect/pty_spawn.py | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/pexpect/pty_spawn.py b/pexpect/pty_spawn.py -index 1d9554b..7fc27fe 100644 ---- a/pexpect/pty_spawn.py -+++ b/pexpect/pty_spawn.py -@@ -285,6 +285,11 @@ class spawn(SpawnBase): - if dimensions is not None: - kwargs['dimensions'] = dimensions - -+ if self.encoding is not None: -+ # Encode command line using the specified encoding -+ self.args = [a if isinstance(a, bytes) else a.encode(self.encoding) -+ for a in self.args] -+ - self.ptyproc = ptyprocess.PtyProcess.spawn(self.args, env=self.env, - cwd=self.cwd, **kwargs) - --- -2.6.0 - diff --git a/0001-Stop-asyncio-listening-to-pty-once-we-ve-found-what-.patch b/0001-Stop-asyncio-listening-to-pty-once-we-ve-found-what-.patch deleted file mode 100644 index b84b4ce..0000000 --- a/0001-Stop-asyncio-listening-to-pty-once-we-ve-found-what-.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 5e6e0ad21acfed32c57ae8ef23a8a0722869afe1 Mon Sep 17 00:00:00 2001 -From: Thomas Kluyver -Date: Tue, 13 Oct 2015 12:41:09 +0100 -Subject: [PATCH] Stop asyncio listening to pty once we've found what we need - -Closes gh-213 (fingers crossed) ---- - pexpect/async.py | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/pexpect/async.py b/pexpect/async.py -index a798457..136fc0e 100644 ---- a/pexpect/async.py -+++ b/pexpect/async.py -@@ -23,6 +23,7 @@ def expect_async(expecter, timeout=None): - return expecter.timeout(e) - - class PatternWaiter(asyncio.Protocol): -+ transport = None - def __init__(self, expecter): - self.expecter = expecter - self.fut = asyncio.Future() -@@ -30,10 +31,15 @@ class PatternWaiter(asyncio.Protocol): - def found(self, result): - if not self.fut.done(): - self.fut.set_result(result) -+ self.transport.pause_reading() - - def error(self, exc): - if not self.fut.done(): - self.fut.set_exception(exc) -+ self.transport.pause_reading() -+ -+ def connection_made(self, transport): -+ self.transport = transport - - def data_received(self, data): - spawn = self.expecter.spawn --- -2.6.1 - diff --git a/0001-disable-max-canon-tests-retain-file-contents.patch b/0001-disable-max-canon-tests-retain-file-contents.patch deleted file mode 100644 index 766f12f..0000000 --- a/0001-disable-max-canon-tests-retain-file-contents.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0b7fee3c974d89b7f7f51fef9a1893e25ed980da Mon Sep 17 00:00:00 2001 -From: Jeff Quast -Date: Tue, 6 Oct 2015 08:08:05 -0700 -Subject: [PATCH 1/2] disable max canon tests, retain file contents - ---- - tests/test_maxcanon.py | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -diff --git a/tests/test_maxcanon.py b/tests/test_maxcanon.py -index 772a3b7..cd48cbc 100644 ---- a/tests/test_maxcanon.py -+++ b/tests/test_maxcanon.py -@@ -27,6 +27,9 @@ class TestCaseCanon(PexpectTestCase.PexpectTestCase): - implement this bit, and acts as if it is always set." Although these - tests ensure it is enabled, this is a non-op for Linux. - -+ More unsettling in regards to Linux, Fedora and Debian have different -+ behaviours. For this reason, **these test has been disabled entirely**. -+ - FreeBSD supports neither, and instead uses a fraction (1/5) of the tty - speed which is always 9600. Therefor, the maximum limited input line - length is 9600 / 5 = 1920. -@@ -63,7 +66,7 @@ class TestCaseCanon(PexpectTestCase.PexpectTestCase): - sys.platform.lower().startswith('freebsd'), - reason='os.write to BLOCK indefinitely on FreeBSD in this case' - ) -- def test_under_max_canon(self): -+ def disabled_under_max_canon(self): - " BEL is not sent by terminal driver at maximum bytes - 1. " - # given, - child = pexpect.spawn('bash', echo=self.echo, timeout=5) -@@ -101,7 +104,7 @@ class TestCaseCanon(PexpectTestCase.PexpectTestCase): - sys.platform.lower().startswith('freebsd'), - reason='os.write to BLOCK indefinitely on FreeBSD in this case' - ) -- def test_beyond_max_icanon(self): -+ def disabled_beyond_max_icanon(self): - " a single BEL is sent when maximum bytes is reached. " - # given, - child = pexpect.spawn('bash', echo=self.echo, timeout=5) -@@ -140,7 +143,7 @@ class TestCaseCanon(PexpectTestCase.PexpectTestCase): - sys.platform.lower().startswith('freebsd'), - reason='os.write to BLOCK indefinitely on FreeBSD in this case' - ) -- def test_max_no_icanon(self): -+ def disabled_max_no_icanon(self): - " may exceed maximum input bytes if canonical mode is disabled. " - # given, - child = pexpect.spawn('bash', echo=self.echo, timeout=5) --- -2.6.1 - diff --git a/0002-2-new-tools-display-fpathconf.maxcanon-.py.patch b/0002-2-new-tools-display-fpathconf.maxcanon-.py.patch deleted file mode 100644 index 6eea31e..0000000 --- a/0002-2-new-tools-display-fpathconf.maxcanon-.py.patch +++ /dev/null @@ -1,371 +0,0 @@ -From ae932d179adc4c602f9a4298076cdc5a82f9351a Mon Sep 17 00:00:00 2001 -From: Jeff Quast -Date: Tue, 6 Oct 2015 10:17:50 -0700 -Subject: [PATCH 2/2] 2 new tools: display-{fpathconf.maxcanon}.py - -tests/test_maxcanon.py has been deleted and turned into -an "autodetection" tool of sorts, no longer attempting -to assert exacting values, but determine it programmatically. ---- - pexpect/pty_spawn.py | 14 ++-- - tests/test_maxcanon.py | 179 --------------------------------------------- - tools/display-fpathconf.py | 41 +++++++++++ - tools/display-maxcanon.py | 80 ++++++++++++++++++++ - 4 files changed, 128 insertions(+), 186 deletions(-) - delete mode 100644 tests/test_maxcanon.py - create mode 100644 tools/display-fpathconf.py - create mode 100644 tools/display-maxcanon.py - -diff --git a/pexpect/pty_spawn.py b/pexpect/pty_spawn.py -index 7fc27fe..299016c 100644 ---- a/pexpect/pty_spawn.py -+++ b/pexpect/pty_spawn.py -@@ -492,9 +492,9 @@ class spawn(SpawnBase): - - This value may be discovered using fpathconf(3):: - -- >>> from os import fpathconf -- >>> print(fpathconf(0, 'PC_MAX_CANON')) -- 256 -+ >>> from os import fpathconf -+ >>> print(fpathconf(0, 'PC_MAX_CANON')) -+ 256 - - On such a system, only 256 bytes may be received per line. Any - subsequent bytes received will be discarded. BEL (``'\a'``) is then -@@ -505,10 +505,10 @@ class spawn(SpawnBase): - Canonical input processing may be disabled altogether by executing - a shell, then stty(1), before executing the final program:: - -- >>> bash = pexpect.spawn('/bin/bash', echo=False) -- >>> bash.sendline('stty -icanon') -- >>> bash.sendline('base64') -- >>> bash.sendline('x' * 5000) -+ >>> bash = pexpect.spawn('/bin/bash', echo=False) -+ >>> bash.sendline('stty -icanon') -+ >>> bash.sendline('base64') -+ >>> bash.sendline('x' * 5000) - ''' - - time.sleep(self.delaybeforesend) -diff --git a/tests/test_maxcanon.py b/tests/test_maxcanon.py -deleted file mode 100644 -index cd48cbc..0000000 ---- a/tests/test_maxcanon.py -+++ /dev/null -@@ -1,179 +0,0 @@ --""" Module for canonical-mode tests. """ --# std imports --import sys --import os -- --# local --import pexpect --from . import PexpectTestCase -- --# 3rd-party --import pytest -- -- --class TestCaseCanon(PexpectTestCase.PexpectTestCase): -- """ -- Test expected Canonical mode behavior (limited input line length). -- -- All systems use the value of MAX_CANON which can be found using -- fpathconf(3) value PC_MAX_CANON -- with the exception of Linux -- and FreeBSD. -- -- Linux, though defining a value of 255, actually honors the value -- of 4096 from linux kernel include file tty.h definition -- N_TTY_BUF_SIZE. -- -- Linux also does not honor IMAXBEL. termios(3) states, "Linux does not -- implement this bit, and acts as if it is always set." Although these -- tests ensure it is enabled, this is a non-op for Linux. -- -- More unsettling in regards to Linux, Fedora and Debian have different -- behaviours. For this reason, **these test has been disabled entirely**. -- -- FreeBSD supports neither, and instead uses a fraction (1/5) of the tty -- speed which is always 9600. Therefor, the maximum limited input line -- length is 9600 / 5 = 1920. -- -- These tests only ensure the correctness of the behavior described by -- the sendline() docstring. pexpect is not particularly involved in -- these scenarios, though if we wish to expose some kind of interface -- to tty.setraw, for example, these tests may be re-purposed as such. -- -- Lastly, portions of these tests are skipped on Travis-CI. It produces -- unexpected behavior not reproduced on Debian/GNU Linux. -- """ -- -- def setUp(self): -- super(TestCaseCanon, self).setUp() -- -- self.echo = False -- if sys.platform.lower().startswith('linux'): -- # linux is 4096, N_TTY_BUF_SIZE. -- self.max_input = 4096 -- self.echo = True -- elif sys.platform.lower().startswith('sunos'): -- # SunOS allows PC_MAX_CANON + 1; see -- # https://bitbucket.org/illumos/illumos-gate/src/d07a59219ab7fd2a7f39eb47c46cf083c88e932f/usr/src/uts/common/io/ldterm.c?at=default#cl-1888 -- self.max_input = os.fpathconf(0, 'PC_MAX_CANON') + 1 -- elif sys.platform.lower().startswith('freebsd'): -- # http://lists.freebsd.org/pipermail/freebsd-stable/2009-October/052318.html -- self.max_input = 9600 / 5 -- else: -- # All others (probably) limit exactly at PC_MAX_CANON -- self.max_input = os.fpathconf(0, 'PC_MAX_CANON') -- -- @pytest.mark.skipif( -- sys.platform.lower().startswith('freebsd'), -- reason='os.write to BLOCK indefinitely on FreeBSD in this case' -- ) -- def disabled_under_max_canon(self): -- " BEL is not sent by terminal driver at maximum bytes - 1. " -- # given, -- child = pexpect.spawn('bash', echo=self.echo, timeout=5) -- child.sendline('echo READY') -- child.sendline('stty icanon imaxbel') -- child.sendline('echo BEGIN; cat') -- -- # some systems BEL on (maximum - 1), not able to receive CR, -- # even though all characters up until then were received, they -- # simply cannot be transmitted, as CR is part of the transmission. -- send_bytes = self.max_input - 1 -- -- # exercise, -- child.sendline('_' * send_bytes) -- -- # fast forward beyond 'cat' command, as ^G can be found as part of -- # set-xterm-title sequence of $PROMPT_COMMAND or $PS1. -- child.expect_exact('BEGIN') -- -- # verify, all input is found in echo output, -- child.expect_exact('_' * send_bytes) -- -- # BEL is not found, -- with self.assertRaises(pexpect.TIMEOUT): -- child.expect_exact('\a', timeout=1) -- -- # cleanup, -- child.sendeof() # exit cat(1) -- child.sendline('exit 0') # exit bash(1) -- child.expect(pexpect.EOF) -- assert not child.isalive() -- assert child.exitstatus == 0 -- -- @pytest.mark.skipif( -- sys.platform.lower().startswith('freebsd'), -- reason='os.write to BLOCK indefinitely on FreeBSD in this case' -- ) -- def disabled_beyond_max_icanon(self): -- " a single BEL is sent when maximum bytes is reached. " -- # given, -- child = pexpect.spawn('bash', echo=self.echo, timeout=5) -- child.sendline('stty icanon imaxbel erase ^H') -- child.sendline('cat') -- send_bytes = self.max_input -- -- # exercise, -- child.sendline('_' * send_bytes) -- child.expect_exact('\a') -- -- # exercise, we must now backspace to send CR. -- child.sendcontrol('h') -- child.sendline() -- -- if os.environ.get('TRAVIS', None) == 'true': -- # Travis-CI has intermittent behavior here, possibly -- # because the master process is itself, a PTY? -- return -- -- # verify the length of (maximum - 1) received by cat(1), -- # which has written it back out, -- child.expect_exact('_' * (send_bytes - 1)) -- # and not a byte more. -- with self.assertRaises(pexpect.TIMEOUT): -- child.expect_exact('_', timeout=1) -- -- # cleanup, -- child.sendeof() # exit cat(1) -- child.sendline('exit 0') # exit bash(1) -- child.expect_exact(pexpect.EOF) -- assert not child.isalive() -- assert child.exitstatus == 0 -- -- @pytest.mark.skipif( -- sys.platform.lower().startswith('freebsd'), -- reason='os.write to BLOCK indefinitely on FreeBSD in this case' -- ) -- def disabled_max_no_icanon(self): -- " may exceed maximum input bytes if canonical mode is disabled. " -- # given, -- child = pexpect.spawn('bash', echo=self.echo, timeout=5) -- child.sendline('stty -icanon imaxbel') -- child.sendline('echo BEGIN; cat') -- send_bytes = self.max_input + 11 -- -- # exercise, -- child.sendline('_' * send_bytes) -- -- # fast forward beyond 'cat' command, as ^G can be found as part of -- # set-xterm-title sequence of $PROMPT_COMMAND or $PS1. -- child.expect_exact('BEGIN') -- -- if os.environ.get('TRAVIS', None) == 'true': -- # Travis-CI has intermittent behavior here, possibly -- # because the master process is itself, a PTY? -- return -- -- # BEL is *not* found, -- with self.assertRaises(pexpect.TIMEOUT): -- child.expect_exact('\a', timeout=1) -- -- # verify, all input is found in output, -- child.expect_exact('_' * send_bytes) -- -- # cleanup, -- child.sendcontrol('c') # exit cat(1) (eof wont work in -icanon) -- child.sendcontrol('c') -- child.sendline('exit 0') # exit bash(1) -- child.expect(pexpect.EOF) -- assert not child.isalive() -- assert child.exitstatus == 0 -diff --git a/tools/display-fpathconf.py b/tools/display-fpathconf.py -new file mode 100644 -index 0000000..d40cbae ---- /dev/null -+++ b/tools/display-fpathconf.py -@@ -0,0 +1,41 @@ -+#!/usr/bin/env python -+"""Displays os.fpathconf values related to terminals. """ -+from __future__ import print_function -+import sys -+import os -+ -+ -+def display_fpathconf(): -+ DISP_VALUES = ( -+ ('PC_MAX_CANON', ('Max no. of bytes in a ' -+ 'terminal canonical input line.')), -+ ('PC_MAX_INPUT', ('Max no. of bytes for which ' -+ 'space is available in a terminal input queue.')), -+ ('PC_PIPE_BUF', ('Max no. of bytes which will ' -+ 'be written atomically to a pipe.')), -+ ('PC_VDISABLE', 'Terminal character disabling value.') -+ ) -+ FMT = '{name:<13} {value:<5} {description}' -+ -+ # column header -+ print(FMT.format(name='name', value='value', description='description')) -+ print(FMT.format(name=('-' * 13), value=('-' * 5), description=('-' * 11))) -+ -+ fd = sys.stdin.fileno() -+ for name, description in DISP_VALUES: -+ key = os.pathconf_names.get(name, None) -+ if key is None: -+ value = 'UNDEF' -+ else: -+ try: -+ value = os.fpathconf(fd, name) -+ except OSError as err: -+ value = 'OSErrno {0.errno}'.format(err) -+ if name == 'PC_VDISABLE': -+ value = hex(value) -+ print(FMT.format(name=name, value=value, description=description)) -+ print() -+ -+ -+if __name__ == '__main__': -+ display_fpathconf() -diff --git a/tools/display-maxcanon.py b/tools/display-maxcanon.py -new file mode 100644 -index 0000000..cbd664f ---- /dev/null -+++ b/tools/display-maxcanon.py -@@ -0,0 +1,80 @@ -+#!/usr/bin/env python -+""" -+This tool uses pexpect to test expected Canonical mode length. -+ -+All systems use the value of MAX_CANON which can be found using -+fpathconf(3) value PC_MAX_CANON -- with the exception of Linux -+and FreeBSD. -+ -+Linux, though defining a value of 255, actually honors the value -+of 4096 from linux kernel include file tty.h definition -+N_TTY_BUF_SIZE. -+ -+Linux also does not honor IMAXBEL. termios(3) states, "Linux does not -+implement this bit, and acts as if it is always set." Although these -+tests ensure it is enabled, this is a non-op for Linux. -+ -+FreeBSD supports neither, and instead uses a fraction (1/5) of the tty -+speed which is always 9600. Therefor, the maximum limited input line -+length is 9600 / 5 = 1920. -+ -+These tests only ensure the correctness of the behavior described by -+the sendline() docstring -- the values listed there, and above should -+be equal to the output of the given OS described, but no promises! -+""" -+# std import -+from __future__ import print_function -+import sys -+import os -+ -+ -+def detect_maxcanon(): -+ import pexpect -+ bashrc = os.path.join( -+ # re-use pexpect/replwrap.py's bashrc file, -+ os.path.dirname(__file__), os.path.pardir, 'pexpect', 'bashrc.sh') -+ -+ child = pexpect.spawn('bash', ['--rcfile', bashrc], -+ echo=True, encoding='utf8', timeout=3) -+ -+ child.sendline(u'echo -n READY_; echo GO') -+ child.expect_exact(u'READY_GO') -+ -+ child.sendline(u'stty icanon imaxbel erase ^H; echo -n retval: $?') -+ child.expect_exact(u'retval: 0') -+ -+ child.sendline(u'echo -n GO_; echo AGAIN') -+ child.expect_exact(u'GO_AGAIN') -+ child.sendline(u'cat') -+ -+ child.delaybeforesend = 0 -+ -+ column, blocksize = 0, 64 -+ ch_marker = u'_' -+ -+ print('auto-detecting MAX_CANON: ', end='') -+ sys.stdout.flush() -+ -+ while True: -+ child.send(ch_marker * blocksize) -+ result = child.expect([ch_marker * blocksize, u'\a']) -+ if result == 0: -+ # entire block fit without emitting bel -+ column += blocksize -+ elif result == 1: -+ # an '\a' was emitted, count the number of ch_markers -+ # found since last blocksize, determining our MAX_CANON -+ column += child.before.count(ch_marker) -+ break -+ print(column) -+ -+if __name__ == '__main__': -+ try: -+ detect_maxcanon() -+ except ImportError: -+ # we'd like to use this with CI -- but until we integrate -+ # with tox, we can't determine a period in testing when -+ # the pexpect module has been installed -+ print('warning: pexpect not in module path, MAX_CANON ' -+ 'could not be determined by systems test.', -+ file=sys.stderr) --- -2.6.1 - diff --git a/python-pexpect.spec b/python-pexpect.spec index 2a83c49..5ed31c1 100644 --- a/python-pexpect.spec +++ b/python-pexpect.spec @@ -2,14 +2,14 @@ Name: python-%{modname} Summary: Unicode-aware Pure Python Expect-like module -Version: 4.1.0 -Release: 4%{?dist} +Version: 4.2.1 +Release: 1%{?dist} License: MIT -URL: https://github.com/%{modname}/%{modname} +URL: https://github.com/pexpect/pexpect Source0: %{url}/archive/%{version}/%{modname}-%{version}.tar.gz -BuildRequires: /usr/bin/man +BuildRequires: %{_bindir}/man BuildRequires: coreutils BuildArch: noarch @@ -142,6 +142,9 @@ popd %{python3_sitelib}/%{modname}-*.egg-info %changelog +* Tue Feb 14 2017 Igor Gnatenko - 4.2.1-1 +- Update to 4.2.1 + * Sat Feb 11 2017 Fedora Release Engineering - 4.1.0-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild diff --git a/sources b/sources index 4e6a116..1f97ec3 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -049f3c98f4b0b7426e6b5d8a01566786 pexpect-4.1.0.tar.gz +SHA512 (pexpect-4.2.1.tar.gz) = 30da69e18690f00522bd2514248b1d5613e96c2737435f6b47d30389f6acfc580511db2f89e34c8932f3af32cc61b55fb6dc19f02330c3e1e5be5417c22ebdd1