summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Gnatenko <ignatenkobrain@fedoraproject.org>2015-10-06 10:16:35 +0200
committerIgor Gnatenko <ignatenkobrain@fedoraproject.org>2015-10-06 10:16:35 +0200
commit3c7f8c5955bfd8407674283ab3332c1f95063db4 (patch)
tree97dccc3888c52407f46e9efd1c355cd5b68a6b9d
parent3794f67a397d8df921c5dae4e79229aa22ad4e06 (diff)
downloadpython-pexpect-3c7f8c5955bfd8407674283ab3332c1f95063db4.zip
python-pexpect-3c7f8c5955bfd8407674283ab3332c1f95063db4.tar.gz
python-pexpect-3c7f8c5955bfd8407674283ab3332c1f95063db4.tar.xz
add upstream tools to display some info
Signed-off-by: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
-rwxr-xr-xdisplay-sighandlers.py24
-rwxr-xr-xdisplay-terminalinfo.py209
-rw-r--r--python-pexpect.spec8
3 files changed, 241 insertions, 0 deletions
diff --git a/display-sighandlers.py b/display-sighandlers.py
new file mode 100755
index 0000000..f3559f7
--- /dev/null
+++ b/display-sighandlers.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+# Displays all signals, their values, and their handlers.
+from __future__ import print_function
+import signal
+FMT = '{name:<10} {value:<5} {description}'
+
+# header
+print(FMT.format(name='name', value='value', description='description'))
+print('-' * (33))
+
+for name, value in [(signal_name, getattr(signal, signal_name))
+ for signal_name in dir(signal)
+ if signal_name.startswith('SIG')
+ and not signal_name.startswith('SIG_')]:
+ try:
+ handler = signal.getsignal(value)
+ except ValueError:
+ # FreeBSD: signal number out of range
+ handler = 'out of range'
+ description = {
+ signal.SIG_IGN: "ignored(SIG_IGN)",
+ signal.SIG_DFL: "default(SIG_DFL)"
+ }.get(handler, handler)
+ print(FMT.format(name=name, value=value, description=description))
diff --git a/display-terminalinfo.py b/display-terminalinfo.py
new file mode 100755
index 0000000..15911d4
--- /dev/null
+++ b/display-terminalinfo.py
@@ -0,0 +1,209 @@
+#!/usr/bin/env python
+""" Display known information about our terminal. """
+from __future__ import print_function
+import termios
+import locale
+import sys
+import os
+
+BITMAP_IFLAG = {
+ 'IGNBRK': 'ignore BREAK condition',
+ 'BRKINT': 'map BREAK to SIGINTR',
+ 'IGNPAR': 'ignore (discard) parity errors',
+ 'PARMRK': 'mark parity and framing errors',
+ 'INPCK': 'enable checking of parity errors',
+ 'ISTRIP': 'strip 8th bit off chars',
+ 'INLCR': 'map NL into CR',
+ 'IGNCR': 'ignore CR',
+ 'ICRNL': 'map CR to NL (ala CRMOD)',
+ 'IXON': 'enable output flow control',
+ 'IXOFF': 'enable input flow control',
+ 'IXANY': 'any char will restart after stop',
+ 'IMAXBEL': 'ring bell on input queue full',
+ 'IUCLC': 'translate upper case to lower case',
+}
+
+BITMAP_OFLAG = {
+ 'OPOST': 'enable following output processing',
+ 'ONLCR': 'map NL to CR-NL (ala CRMOD)',
+ 'OXTABS': 'expand tabs to spaces',
+ 'ONOEOT': 'discard EOT\'s `^D\' on output)',
+ 'OCRNL': 'map CR to NL',
+ 'OLCUC': 'translate lower case to upper case',
+ 'ONOCR': 'No CR output at column 0',
+ 'ONLRET': 'NL performs CR function',
+}
+
+BITMAP_CFLAG = {
+ 'CSIZE': 'character size mask',
+ 'CS5': '5 bits (pseudo)',
+ 'CS6': '6 bits',
+ 'CS7': '7 bits',
+ 'CS8': '8 bits',
+ 'CSTOPB': 'send 2 stop bits',
+ 'CREAD': 'enable receiver',
+ 'PARENB': 'parity enable',
+ 'PARODD': 'odd parity, else even',
+ 'HUPCL': 'hang up on last close',
+ 'CLOCAL': 'ignore modem status lines',
+ 'CCTS_OFLOW': 'CTS flow control of output',
+ 'CRTSCTS': 'same as CCTS_OFLOW',
+ 'CRTS_IFLOW': 'RTS flow control of input',
+ 'MDMBUF': 'flow control output via Carrier',
+}
+
+BITMAP_LFLAG = {
+ 'ECHOKE': 'visual erase for line kill',
+ 'ECHOE': 'visually erase chars',
+ 'ECHO': 'enable echoing',
+ 'ECHONL': 'echo NL even if ECHO is off',
+ 'ECHOPRT': 'visual erase mode for hardcopy',
+ 'ECHOCTL': 'echo control chars as ^(Char)',
+ 'ISIG': 'enable signals INTR, QUIT, [D]SUSP',
+ 'ICANON': 'canonicalize input lines',
+ 'ALTWERASE': 'use alternate WERASE algorithm',
+ 'IEXTEN': 'enable DISCARD and LNEXT',
+ 'EXTPROC': 'external processing',
+ 'TOSTOP': 'stop background jobs from output',
+ 'FLUSHO': 'output being flushed (state)',
+ 'NOKERNINFO': 'no kernel output from VSTATUS',
+ 'PENDIN': 'XXX retype pending input (state)',
+ 'NOFLSH': 'don\'t flush after interrupt',
+}
+
+CTLCHAR_INDEX = {
+ 'VEOF': 'EOF',
+ 'VEOL': 'EOL',
+ 'VEOL2': 'EOL2',
+ 'VERASE': 'ERASE',
+ 'VWERASE': 'WERASE',
+ 'VKILL': 'KILL',
+ 'VREPRINT': 'REPRINT',
+ 'VINTR': 'INTR',
+ 'VQUIT': 'QUIT',
+ 'VSUSP': 'SUSP',
+ 'VDSUSP': 'DSUSP',
+ 'VSTART': 'START',
+ 'VSTOP': 'STOP',
+ 'VLNEXT': 'LNEXT',
+ 'VDISCARD': 'DISCARD',
+ 'VMIN': '---',
+ 'VTIME': '---',
+ 'VSTATUS': 'STATUS',
+}
+
+
+def display_bitmask(kind, bitmap, value):
+ """ Display all matching bitmask values for ``value`` given ``bitmap``. """
+ col1_width = max(map(len, list(bitmap.keys()) + [kind]))
+ col2_width = 7
+ FMT = '{name:>{col1_width}} {value:>{col2_width}} {description}'
+ print(FMT.format(name=kind,
+ value='Value',
+ description='Description',
+ col1_width=col1_width,
+ col2_width=col2_width))
+ print('{0} {1} {2}'.format('-' * col1_width,
+ '-' * col2_width,
+ '-' * max(map(len, bitmap.values()))))
+ for flag_name, description in bitmap.items():
+ try:
+ bitmask = getattr(termios, flag_name)
+ bit_val = 'on' if bool(value & bitmask) else 'off'
+ except AttributeError:
+ bit_val = 'undef'
+ print(FMT.format(name=flag_name,
+ value=bit_val,
+ description=description,
+ col1_width=col1_width,
+ col2_width=col2_width))
+ print()
+
+
+def display_ctl_chars(index, cc):
+ """ Display all control character indicies, names, and values. """
+ title = 'Special Character'
+ col1_width = len(title)
+ col2_width = max(map(len, index.values()))
+ FMT = '{idx:<{col1_width}} {name:<{col2_width}} {value}'
+ print('Special line Characters'.center(40).rstrip())
+ print(FMT.format(idx='Index',
+ name='Name',
+ value='Value',
+ col1_width=col1_width,
+ col2_width=col2_width))
+ print('{0} {1} {2}'.format('-' * col1_width,
+ '-' * col2_width,
+ '-' * 10))
+ for index_name, name in index.items():
+ try:
+ index = getattr(termios, index_name)
+ value = cc[index]
+ if value == b'\xff':
+ value = '_POSIX_VDISABLE'
+ else:
+ value = repr(value)
+ except AttributeError:
+ value = 'undef'
+ print(FMT.format(idx=index_name,
+ name=name,
+ value=value,
+ col1_width=col1_width,
+ col2_width=col2_width))
+ print()
+
+
+def display_conf(kind, names, getter):
+ col1_width = max(map(len, names))
+ FMT = '{name:>{col1_width}} {value}'
+ print(FMT.format(name=kind,
+ value='value',
+ col1_width=col1_width))
+ print('{0} {1}'.format('-' * col1_width, '-' * 27))
+ for name in names:
+ try:
+ value = getter(name)
+ except OSError as err:
+ value = err
+ print(FMT.format(name=name, value=value, col1_width=col1_width))
+ print()
+
+
+def main():
+ fd = sys.stdin.fileno()
+ locale.setlocale(locale.LC_ALL, '')
+ encoding = locale.getpreferredencoding()
+
+ print('os.isatty({0}) => {1}'.format(fd, os.isatty(fd)))
+ print('locale.getpreferredencoding() => {0}'.format(encoding))
+
+ display_conf(kind='pathconf',
+ names=os.pathconf_names,
+ getter=lambda name: os.fpathconf(fd, name))
+
+ try:
+ (iflag, oflag, cflag, lflag, ispeed, ospeed, cc
+ ) = termios.tcgetattr(fd)
+ except termios.error as err:
+ print('stdin is not a typewriter: {0}'.format(err))
+ else:
+ display_bitmask(kind='Input Mode',
+ bitmap=BITMAP_IFLAG,
+ value=iflag)
+ display_bitmask(kind='Output Mode',
+ bitmap=BITMAP_OFLAG,
+ value=oflag)
+ display_bitmask(kind='Control Mode',
+ bitmap=BITMAP_CFLAG,
+ value=cflag)
+ display_bitmask(kind='Local Mode',
+ bitmap=BITMAP_LFLAG,
+ value=lflag)
+ display_ctl_chars(index=CTLCHAR_INDEX,
+ cc=cc)
+ print('os.ttyname({0}) => {1}'.format(fd, os.ttyname(fd)))
+ print('os.ctermid() => {0}'.format(os.ttyname(fd)))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/python-pexpect.spec b/python-pexpect.spec
index e5e5558..841c2bb 100644
--- a/python-pexpect.spec
+++ b/python-pexpect.spec
@@ -8,6 +8,8 @@ License: MIT
URL: https://github.com/%{modname}/%{modname}
Source0: https://pypi.python.org/packages/source/p/%{modname}/%{modname}-%{version}.tar.gz
Source1: coveragerc
+Source2: https://raw.githubusercontent.com/pexpect/pexpect/master/tools/display-sighandlers.py
+Source3: https://raw.githubusercontent.com/pexpect/pexpect/master/tools/display-terminalinfo.py
BuildArch: noarch
Provides: pexpect = %{version}-%{release}
@@ -76,6 +78,9 @@ pty module.
%autosetup -n %{modname}-%{version}
sed -i -e 1i"# -*- encoding: utf-8 -*-" setup.py
cp -p %{SOURCE1} .coveragerc
+rm -rf tools/
+mkdir tools/
+cp -p %{SOURCE2} %{SOURCE3} tools/
#sed -i "s/0.1/10.0/g" tests/test_misc.py
rm -rf %{py3dir}
@@ -104,6 +109,9 @@ pushd %{py3dir}
popd
%check
+./tools/display-sighandlers.py
+./tools/display-terminalinfo.py
+
py.test-2 --verbose
pushd %{py3dir}