Hello community,
here is the log from the commit of package python-aexpect for
openSUSE:Leap:15.2 checked in at 2020-02-19 18:48:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-aexpect (Old)
and /work/SRC/openSUSE:Leap:15.2/.python-aexpect.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-aexpect"
Wed Feb 19 18:48:22 2020 rev:11 rq:776389 version:1.5.1
Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-aexpect/python-aexpect.changes
2020-01-15 15:46:31.439360385 +0100
+++
/work/SRC/openSUSE:Leap:15.2/.python-aexpect.new.26092/python-aexpect.changes
2020-02-19 18:48:25.727013154 +0100
@@ -1,0 +2,8 @@
+Fri Jul 27 11:07:10 UTC 2018 - [email protected]
+
+- Update to version 1.5.1:
+ * No changelog available
+- Correct dependencies
+- Run tests
+
+-------------------------------------------------------------------
Old:
----
aexpect-1.4.0.tar.gz
New:
----
aexpect-1.5.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-aexpect.spec ++++++
--- /var/tmp/diff_new_pack.8mjI30/_old 2020-02-19 18:48:25.991013436 +0100
+++ /var/tmp/diff_new_pack.8mjI30/_new 2020-02-19 18:48:25.995013440 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-aexpect
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,21 +19,24 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%global pkgname aexpect
Name: python-%{pkgname}
-Version: 1.4.0
+Version: 1.5.1
Release: 0
Summary: Python library to control interactive applications
-License: GPL-2.0
+License: GPL-2.0-only
Group: Development/Languages/Python
-Url: http://avocado-framework.readthedocs.org/
+URL: http://avocado-framework.readthedocs.org/
Source:
https://github.com/avocado-framework/aexpect/archive/%{version}.tar.gz#/%{pkgname}-%{version}.tar.gz
-BuildRequires: %{python_module base}
BuildRequires: %{python_module devel}
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
+BuildRequires: python2-subprocess32 >= 3.2.6
Requires(post): update-alternatives
Requires(postun): update-alternatives
BuildArch: noarch
+%ifpython2
+Requires: python2-subprocess32 >= 3.2.6
+%endif
%python_subpackages
%description
@@ -52,6 +55,10 @@
%python_clone -a %{buildroot}%{_bindir}/aexpect-helper
%fdupes %{buildroot}
+%check
+export PATH=$PATH:%{buildroot}%{_bindir}
+%python_exec setup.py test
+
%post
%python_install_alternative aexpect-helper
@@ -59,7 +66,8 @@
%python_uninstall_alternative aexpect-helper
%files %{python_files}
-%doc LICENSE README.rst
+%license LICENSE
+%doc README.rst
%python_alternative %{_bindir}/aexpect-helper
%{python_sitelib}/*
++++++ aexpect-1.4.0.tar.gz -> aexpect-1.5.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/.travis.yml
new/aexpect-1.5.1/.travis.yml
--- old/aexpect-1.4.0/.travis.yml 2017-04-03 16:26:42.000000000 +0200
+++ new/aexpect-1.5.1/.travis.yml 2018-06-13 17:19:29.000000000 +0200
@@ -2,7 +2,7 @@
python:
- "2.7"
- - "2.6"
+ - "3.4"
sudo: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/Makefile new/aexpect-1.5.1/Makefile
--- old/aexpect-1.4.0/Makefile 2017-04-03 16:26:42.000000000 +0200
+++ new/aexpect-1.5.1/Makefile 2018-06-13 17:19:29.000000000 +0200
@@ -1,23 +1,38 @@
-PYTHON=`which python`
+PYTHON=$(shell which python 2>/dev/null || which python3 2>/dev/null)
+PYTHON_DEVELOP_ARGS=$(shell if ($(PYTHON) setup.py develop --help 2>/dev/null
| grep -q '\-\-user'); then echo "--user"; else echo ""; fi)
DESTDIR=/
BUILDIR=$(CURDIR)/debian/aexpect
PROJECT=aexpect
-VERSION="1.4.0"
+VERSION="1.5.1"
+COMMIT=$(shell git log --pretty=format:'%H' -n 1)
+SHORT_COMMIT=$(shell git log --pretty=format:'%h' -n 1)
+COMMIT_DATE=$(shell git log --pretty='format:%cd' --date='format:%Y%m%d' -n 1)
+MOCK_CONFIG=default
all:
+ @echo "make check - Runs tree static check, unittests and functional
tests"
+ @echo "make clean - Get rid of scratch and byte files"
@echo "make source - Create source package"
@echo "make install - Install on local system"
@echo "make build-deb-src - Generate a source debian package"
@echo "make build-deb-bin - Generate a binary debian package"
@echo "make build-deb-all - Generate both source and binary debian
packages"
- @echo "make build-rpm-src - Generate a source RPM package (.srpm)"
- @echo "make build-rpm-all - Generate both source and binary RPMs"
- @echo "make man - Generate the avocado man page"
- @echo "make check - Runs tree static check, unittests and functional
tests"
- @echo "make clean - Get rid of scratch and byte files"
-
-source:
- $(PYTHON) setup.py sdist $(COMPILE) --dist-dir=SOURCES
+ @echo "RPM related targets:"
+ @echo "make srpm: Generate a source RPM package (.srpm)"
+ @echo "make rpm: Generate binary RPMs"
+ @echo
+ @echo "Release related targets:"
+ @echo "source-release: Create source package for the latest tagged
release"
+ @echo "srpm-release: Generate a source RPM package (.srpm) for
the latest tagged release"
+ @echo "rpm-release: Generate binary RPMs for the latest tagged
release"
+
+source: clean
+ if test ! -d SOURCES; then mkdir SOURCES; fi
+ git archive --prefix="aexpect-$(COMMIT)/" -o
"SOURCES/aexpect-$(SHORT_COMMIT).tar.gz" HEAD
+
+source-release: clean
+ if test ! -d SOURCES; then mkdir SOURCES; fi
+ git archive --prefix="aexpect-$(VERSION)/" -o
"SOURCES/aexpect-$(VERSION).tar.gz" $(VERSION)
install:
$(PYTHON) setup.py install --root $(DESTDIR) $(COMPILE)
@@ -41,16 +56,26 @@
# build both source and binary packages
dpkg-buildpackage -i -I -rfakeroot
-build-rpm-src: source
- rpmbuild --define '_topdir %{getenv:PWD}' \
- -bs python-aexpect.spec
-
-build-rpm-all: source
- rpmbuild --define '_topdir %{getenv:PWD}' \
- -ba python-aexpect.spec
-
-check:
- selftests/checkall
+srpm: source
+ if test ! -d BUILD/SRPM; then mkdir -p BUILD/SRPM; fi
+ mock -r $(MOCK_CONFIG) --resultdir BUILD/SRPM -D "rel_build 0" -D
"commit $(COMMIT)" -D "commit_date $(COMMIT_DATE)" --buildsrpm --spec
python-aexpect.spec --sources SOURCES
+
+rpm: srpm
+ if test ! -d BUILD/RPM; then mkdir -p BUILD/RPM; fi
+ mock -r $(MOCK_CONFIG) --resultdir BUILD/RPM -D "rel_build 0" -D
"commit $(COMMIT)" -D "commit_date $(COMMIT_DATE)" --rebuild
BUILD/SRPM/python-aexpect-$(VERSION)-*.src.rpm
+
+srpm-release: source-release
+ if test ! -d BUILD/SRPM; then mkdir -p BUILD/SRPM; fi
+ mock -r $(MOCK_CONFIG) --resultdir BUILD/SRPM -D "rel_build 1"
--buildsrpm --spec python-aexpect.spec --sources SOURCES
+
+rpm-release: srpm-release
+ if test ! -d BUILD/RPM; then mkdir -p BUILD/RPM; fi
+ mock -r $(MOCK_CONFIG) --resultdir BUILD/RPM -D "rel_build 1" --rebuild
BUILD/SRPM/python-aexpect-$(VERSION)-*.src.rpm
+
+check: clean
+ inspekt checkall
+ $(PYTHON) setup.py develop $(PYTHON_DEVELOP_ARGS)
+ $(PYTHON) setup.py test
clean:
$(PYTHON) setup.py clean
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/__init__.py
new/aexpect-1.5.1/aexpect/__init__.py
--- old/aexpect-1.4.0/aexpect/__init__.py 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/aexpect/__init__.py 2018-06-13 17:19:29.000000000
+0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
from .exceptions import ExpectError
from .exceptions import ExpectProcessTerminatedError
from .exceptions import ExpectTimeoutError
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/client.py
new/aexpect-1.5.1/aexpect/client.py
--- old/aexpect-1.4.0/aexpect/client.py 2017-04-03 16:26:42.000000000 +0200
+++ new/aexpect-1.5.1/aexpect/client.py 2018-06-13 17:19:29.000000000 +0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
"""
API used to run/control interactive processes.
@@ -6,12 +17,17 @@
import time
import signal
import os
+import sys
import re
import threading
import shutil
import select
+import locale
import logging
-import subprocess
+if sys.version_info[0] < 3:
+ import subprocess32 as subprocess
+else:
+ import subprocess
from aexpect.exceptions import ExpectError
from aexpect.exceptions import ExpectProcessTerminatedError
@@ -92,7 +108,7 @@
"""
def __init__(self, command=None, a_id=None, auto_close=False, echo=False,
- linesep="\n"):
+ linesep="\n", pass_fds=(), encoding=None):
"""
Initialize the class and run command as a child process.
@@ -107,13 +123,20 @@
parameter has an effect only when starting a new server.
:param linesep: Line separator to be appended to strings sent to the
child process by sendline().
+ :param pass_fds: Optional sequence of file descriptors to keep open
+ between the parent and child.
+ :param encoding: Override text encoding (by default: autodetect by
+ locale.getpreferredencoding())
"""
self.a_id = a_id or data_factory.generate_random_string(8)
self.log_file = None
self.closed = False
- # Use PYTHONENCODINGS or utf-8 (instead of ascii)
- self.encoding = os.environ.get("PYTHONENCODING", "utf-8")
-
+ if encoding is None:
+ self.encoding = locale.getpreferredencoding()
+ if self.encoding is None:
+ self.encoding = "UTF-8"
+ else:
+ self.encoding = encoding
base_dir = os.path.join(BASE_DIR, 'aexpect_%s' % self.a_id)
# Define filenames for communication with server
@@ -155,12 +178,22 @@
# Start the server (which runs the command)
if command:
- helper_cmd = utils_path.find_command('aexpect-helper')
+ # try to find python specific version of aexpect-helper first, then
+ # try unversioned
+ helper_noversion = 'aexpect-helper'
+ helper_versioned = '{0}-{1}.{2}'.format(helper_noversion,
+ sys.version_info[0],
+ sys.version_info[1])
+ try:
+ helper_cmd = utils_path.find_command(helper_versioned)
+ except utils_path.CmdNotFoundError:
+ helper_cmd = utils_path.find_command(helper_noversion)
sub = subprocess.Popen([helper_cmd],
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
+ stderr=subprocess.STDOUT,
+ pass_fds=pass_fds)
# Send parameters to the server
sub.stdin.write(("%s\n" % self.a_id).encode(self.encoding))
sub.stdin.write(("%s\n" % echo).encode(self.encoding))
@@ -432,7 +465,7 @@
def __init__(self, command=None, a_id=None, auto_close=False, echo=False,
linesep="\n", termination_func=None, termination_params=(),
output_func=None, output_params=(), output_prefix="",
- thread_name=None):
+ thread_name=None, pass_fds=(), encoding=None):
"""
Initialize the class and run command as a child process.
@@ -459,6 +492,10 @@
output line.
:param output_prefix: String to prepend to lines sent to output_func.
:param thread_name: Name of thread to better identify hanging threads.
+ :param pass_fds: Optional sequence of file descriptors to keep open
+ between the parent and child.
+ :param encoding: Override text encoding (by default: autodetect by
+ locale.getpreferredencoding())
"""
# Add a reader and a close hook
self._add_reader("tail")
@@ -466,7 +503,8 @@
self._add_close_hook(Tail._close_log_file)
# Init the superclass
- Spawn.__init__(self, command, a_id, auto_close, echo, linesep)
+ Spawn.__init__(self, command, a_id, auto_close, echo, linesep,
+ pass_fds, encoding)
if thread_name is None:
self.thread_name = "tail_thread_%s_%s" % (self.a_id,
str(command)[:10])
@@ -649,7 +687,7 @@
def __init__(self, command=None, a_id=None, auto_close=True, echo=False,
linesep="\n", termination_func=None, termination_params=(),
output_func=None, output_params=(), output_prefix="",
- thread_name=None):
+ thread_name=None, pass_fds=(), encoding=None):
"""
Initialize the class and run command as a child process.
@@ -675,6 +713,10 @@
:param output_params: Parameters to send to output_func before the
output line.
:param output_prefix: String to prepend to lines sent to output_func.
+ :param pass_fds: Optional sequence of file descriptors to keep open
+ between the parent and child.
+ :param encoding: Override text encoding (by default: autodetect by
+ locale.getpreferredencoding())
"""
# Add a reader
self._add_reader("expect")
@@ -682,7 +724,8 @@
# Init the superclass
Tail.__init__(self, command, a_id, auto_close, echo, linesep,
termination_func, termination_params,
- output_func, output_params, output_prefix, thread_name)
+ output_func, output_params, output_prefix, thread_name,
+ pass_fds, encoding)
def __reduce__(self):
return self.__class__, (self.__getinitargs__())
@@ -925,7 +968,7 @@
linesep="\n", termination_func=None, termination_params=(),
output_func=None, output_params=(), output_prefix="",
thread_name=None, prompt=r"[\#\$]\s*$",
- status_test_command="echo $?"):
+ status_test_command="echo $?", pass_fds=(), encoding=None):
"""
Initialize the class and run command as a child process.
@@ -955,11 +998,16 @@
:param status_test_command: Command to be used for getting the last
exit status of commands run inside the shell (used by
cmd_status_output() and friends).
+ :param pass_fds: Optional sequence of file descriptors to keep open
+ between the parent and child.
+ :param encoding: Override text encoding (by default: autodetect by
+ locale.getpreferredencoding())
"""
# Init the superclass
Expect.__init__(self, command, a_id, auto_close, echo, linesep,
termination_func, termination_params,
- output_func, output_params, output_prefix, thread_name)
+ output_func, output_params, output_prefix, thread_name,
+ pass_fds, encoding)
# Remember some attributes
self.prompt = prompt
@@ -1269,7 +1317,7 @@
def run_tail(command, termination_func=None, output_func=None,
output_prefix="",
- timeout=1.0, auto_close=True):
+ timeout=1.0, auto_close=True, pass_fds=(), encoding=None):
"""
Run a subprocess in the background and collect its output and exit status.
@@ -1288,7 +1336,11 @@
:param timeout: Time duration (in seconds) to wait for the subprocess to
terminate before returning
:param auto_close: If True, close() the instance automatically when its
- reference count drops to zero (default False).
+ reference count drops to zero (default False).
+ :param pass_fds: Optional sequence of file descriptors to keep open
+ between the parent and child.
+ :param encoding: Override text encoding (by default: autodetect by
+ locale.getpreferredencoding())
:return: A Expect object.
"""
@@ -1296,7 +1348,9 @@
termination_func=termination_func,
output_func=output_func,
output_prefix=output_prefix,
- auto_close=auto_close)
+ auto_close=auto_close,
+ pass_fds=pass_fds,
+ encoding=encoding)
end_time = time.time() + timeout
while time.time() < end_time and bg_process.is_alive():
@@ -1306,7 +1360,7 @@
def run_bg(command, termination_func=None, output_func=None, output_prefix="",
- timeout=1.0, auto_close=True):
+ timeout=1.0, auto_close=True, pass_fds=(), encoding=None):
"""
Run a subprocess in the background and collect its output and exit status.
@@ -1325,7 +1379,11 @@
:param timeout: Time duration (in seconds) to wait for the subprocess to
terminate before returning
:param auto_close: If True, close() the instance automatically when its
- reference count drops to zero (default False).
+ reference count drops to zero (default False).
+ :param pass_fds: Optional sequence of file descriptors to keep open
+ between the parent and child.
+ :param encoding: Override text encoding (by default: autodetect by
+ locale.getpreferredencoding())
:return: A Expect object.
"""
@@ -1333,7 +1391,9 @@
termination_func=termination_func,
output_func=output_func,
output_prefix=output_prefix,
- auto_close=auto_close)
+ auto_close=auto_close,
+ pass_fds=pass_fds,
+ encoding=encoding)
end_time = time.time() + timeout
while time.time() < end_time and bg_process.is_alive():
@@ -1342,7 +1402,8 @@
return bg_process
-def run_fg(command, output_func=None, output_prefix="", timeout=1.0):
+def run_fg(command, output_func=None, output_prefix="", timeout=1.0,
+ pass_fds=(), encoding=None):
"""
Run a subprocess in the foreground and collect its output and exit status.
@@ -1358,12 +1419,17 @@
before passing it to stdout_func
:param timeout: Time duration (in seconds) to wait for the subprocess to
terminate before killing it and returning
+ :param pass_fds: Optional sequence of file descriptors to keep open
+ between the parent and child.
+ :param encoding: Override text encoding (by default: autodetect by
+ locale.getpreferredencoding())
:return: A 2-tuple containing the exit status of the process and its
STDOUT/STDERR output. If timeout expires before the process
terminates, the returned status is None.
"""
- bg_process = run_bg(command, None, output_func, output_prefix, timeout)
+ bg_process = run_bg(command, None, output_func, output_prefix, timeout,
+ pass_fds=pass_fds, encoding=encoding)
output = bg_process.get_output()
if bg_process.is_alive():
status = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/exceptions.py
new/aexpect-1.5.1/aexpect/exceptions.py
--- old/aexpect-1.4.0/aexpect/exceptions.py 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/aexpect/exceptions.py 2018-06-13 17:19:29.000000000
+0200
@@ -1,3 +1,15 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
+
class ExpectError(Exception):
def __init__(self, patterns, output):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/shared.py
new/aexpect-1.5.1/aexpect/shared.py
--- old/aexpect-1.4.0/aexpect/shared.py 2017-04-03 16:26:42.000000000 +0200
+++ new/aexpect-1.5.1/aexpect/shared.py 2018-06-13 17:19:29.000000000 +0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import os
import fcntl
import termios
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/utils/astring.py
new/aexpect-1.5.1/aexpect/utils/astring.py
--- old/aexpect-1.4.0/aexpect/utils/astring.py 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/aexpect/utils/astring.py 2018-06-13 17:19:29.000000000
+0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import re
@@ -22,8 +33,8 @@
return_str = ""
index = 0
output = "\x1b[m%s" % output
- console_codes = "%[G@8]|\[[@A-HJ-MPXa-hl-nqrsu\`]"
- console_codes += "|\[[\d;]+[HJKgqnrm]|#8|\([B0UK]|\)"
+ console_codes = "%[G@8]|\\[[@A-HJ-MPXa-hl-nqrsu\\`]"
+ console_codes += "|\\[[\\d;]+[HJKgqnrm]|#8|\\([B0UK]|\\)"
if custom_codes is not None and custom_codes not in console_codes:
console_codes += "|%s" % custom_codes
while index < len(output):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/utils/data_factory.py
new/aexpect-1.5.1/aexpect/utils/data_factory.py
--- old/aexpect-1.4.0/aexpect/utils/data_factory.py 2017-04-03
16:26:42.000000000 +0200
+++ new/aexpect-1.5.1/aexpect/utils/data_factory.py 2018-06-13
17:19:29.000000000 +0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import random
import string
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/utils/genio.py
new/aexpect-1.5.1/aexpect/utils/genio.py
--- old/aexpect-1.4.0/aexpect/utils/genio.py 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/aexpect/utils/genio.py 2018-06-13 17:19:29.000000000
+0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import os
_open_log_files = {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/utils/path.py
new/aexpect-1.5.1/aexpect/utils/path.py
--- old/aexpect-1.4.0/aexpect/utils/path.py 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/aexpect/utils/path.py 2018-06-13 17:19:29.000000000
+0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import os
@@ -30,13 +41,15 @@
:raise: :class:`aexpect.utils.path.CmdNotFoundError` in case the
command was not found and no default was given.
"""
- common_bin_paths = ["/usr/libexec", "/usr/local/sbin", "/usr/local/bin",
- "/usr/sbin", "/usr/bin", "/sbin", "/bin"]
try:
path_paths = os.environ['PATH'].split(":")
except IndexError:
path_paths = []
- path_paths = list(set(common_bin_paths + path_paths))
+
+ for common_path in ["/usr/libexec", "/usr/local/sbin", "/usr/local/bin",
+ "/usr/sbin", "/usr/bin", "/sbin", "/bin"]:
+ if common_path not in path_paths:
+ path_paths.append(common_path)
for dir_path in path_paths:
cmd_path = os.path.join(dir_path, cmd)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/utils/process.py
new/aexpect-1.5.1/aexpect/utils/process.py
--- old/aexpect-1.4.0/aexpect/utils/process.py 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/aexpect/utils/process.py 2018-06-13 17:19:29.000000000
+0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import subprocess
import signal
import os
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/aexpect/utils/wait.py
new/aexpect-1.5.1/aexpect/utils/wait.py
--- old/aexpect-1.4.0/aexpect/utils/wait.py 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/aexpect/utils/wait.py 2018-06-13 17:19:29.000000000
+0200
@@ -1,3 +1,14 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import time
import logging
log = logging.getLogger(__file__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/python-aexpect.spec
new/aexpect-1.5.1/python-aexpect.spec
--- old/aexpect-1.4.0/python-aexpect.spec 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/python-aexpect.spec 2018-06-13 17:19:29.000000000
+0200
@@ -1,46 +1,154 @@
%global srcname aexpect
-Summary: Aexpect is a python library to control interactive applications
+# Conditional for release vs. snapshot builds. Set to 1 for release build.
+%if ! 0%{?rel_build:1}
+ %global rel_build 1
+%endif
+
+# Settings used for build from snapshots.
+%if 0%{?rel_build}
+%global gittar %{srcname}-%{version}.tar.gz
+%else
+%if ! 0%{?commit:1}
+%global commit 012bc0e57fc9d05d2ee4ca2425dc27b07b745a32
+%endif
+%if ! 0%{?commit_date:1}
+%global commit_date 20180613
+%endif
+%global shortcommit %(c=%{commit};echo ${c:0:7})
+%global gitrel .%{commit_date}git%{shortcommit}
+%global gittar %{srcname}-%{shortcommit}.tar.gz
+%endif
+
+# Selftests are provided but skipped because they use unsupported tooling.
+%global with_tests 0
+
+%if 0%{?rhel}
+%global with_python3 0
+%else
+%global with_python3 1
+%endif
+
Name: python-%{srcname}
-Version: 1.4.0
-Release: 1%{?dist}
-License: GPLv2
+Version: 1.5.1
+Release: 0%{?gitrel}%{?dist}
+Summary: Aexpect is a python library to control interactive applications
Group: Development/Tools
-URL: http://avocado-framework.readthedocs.org/
-Source: %{srcname}-%{version}.tar.gz
+
+License: GPLv2
+URL: https://github.com/avocado-framework/aexpect
+
+%if 0%{?rel_build}
+Source0:
https://github.com/avocado-framework/%{srcname}/archive/%{version}.tar.gz#/%{gittar}
+%else
+Source0:
https://github.com/avocado-framework/%{srcname}/archive/%{commit}.tar.gz#/%{gittar}
+%endif
+
BuildArch: noarch
Requires: python
-BuildRequires: python, python-setuptools
+BuildRequires: python2-devel
+BuildRequires: python-subprocess32
-# For compatibility reasons, let's mark this package as one that
-# provides the same functionality as the old package name and also
-# one that obsoletes the old package name, so that the new name is
-# favored. These could (and should) be removed in the future.
-# These changes are backed by the following guidelines:
-#
https://fedoraproject.org/wiki/Upgrade_paths_%E2%80%94_renaming_or_splitting_packages
-Obsoletes: %{srcname} < 1.3.1-1
-Provides: %{srcname} = %{version}-%{release}
+%if %{with_python3}
+Requires: python3
+BuildRequires: python3-devel
+%endif
+
+%if 0%{?rhel}
+BuildRequires: python-setuptools
+%endif
%description
Aexpect is a python library used to control interactive applications, very
similar to pexpect. You can use it to control applications such as ssh, scp
sftp, telnet, among others.
+%package -n python2-%{srcname}
+Summary: %{summary}
+Requires: python-subprocess32
+%{?python_provide:%python_provide python2-%{srcname}}
+
+%description -n python2-%{srcname}
+Aexpect is a python library used to control interactive applications, very
+similar to pexpect. You can use it to control applications such as ssh, scp
+sftp, telnet, among others.
+
+%if %{with_python3}
+%package -n python%{python3_pkgversion}-%{srcname}
+Summary: %{summary}
+%{?python_provide:%python_provide python%{python3_pkgversion}-%{srcname}}
+
+%description -n python%{python3_pkgversion}-%{srcname}
+Aexpect is a python library used to control interactive applications, very
+similar to pexpect. You can use it to control applications such as ssh, scp
+sftp, telnet, among others.
+PYTHON 3 SUPPORT IS CURRENTLY EXPERIMENTAL
+%endif
+
%prep
-%setup -q -n %{srcname}-%{version}
+%if 0%{?rel_build}
+%autosetup -n %{srcname}-%{version}
+%else
+%autosetup -n %{srcname}-%{commit}
+%endif
%build
-%{__python} setup.py build
+%py2_build
-%install
-%{__python} setup.py install --root %{buildroot} --skip-build
+%if %{with_python3}
+%py3_build
+%endif
-%files
-%defattr(-,root,root,-)
-%{python_sitelib}/aexpect*
-%{_bindir}/aexpect-helper
+%install
+%py2_install
+# move and symlink python2 version-specific executables
+mv %{buildroot}%{_bindir}/aexpect-helper
%{buildroot}%{_bindir}/aexpect-helper-%{python2_version}
+ln -s aexpect-helper-%{python2_version} %{buildroot}%{_bindir}/aexpect-helper-2
+
+%if %{with_python3}
+%py3_install
+mv %{buildroot}%{_bindir}/aexpect-helper
%{buildroot}%{_bindir}/aexpect-helper-%{python3_version}
+ln -s aexpect-helper-%{python3_version} %{buildroot}%{_bindir}/aexpect-helper-3
+%endif
+
+%check
+%if %{with_tests}
+selftests/checkall
+%endif
+
+%files -n python2-%{srcname}
+%license LICENSE
+%doc README.rst
+%{python2_sitelib}/aexpect/
+%{python2_sitelib}/aexpect-%{version}-py%{python2_version}.egg-info
+%{_bindir}/aexpect-helper-2*
+
+%if %{with_python3}
+%files -n python%{python3_pkgversion}-%{srcname}
+%license LICENSE
+%doc README.rst
+%{python3_sitelib}/aexpect/
+%{python3_sitelib}/aexpect-%{version}-py%{python3_version}.egg-info
+%{_bindir}/aexpect-helper-3*
+%endif
%changelog
+* Wed Jun 13 2018 Cleber Rosa <[email protected]> - 1.5.1-0
+- Upgrade to upstream version 1.5.1
+
+* Mon Jun 4 2018 Lucas Meneghel Rodrigues <[email protected]> - 1.5.0-1
+- Upgrade to upstream version 1.5.0
+
+* Wed Mar 14 2018 Cleber Rosa <[email protected]> - 1.4.0-2
+- Changed URL to aexpect repo
+- Changed build to use a git archived based source
+- Added released version builds
+- Remove compatiblity with older package name
+- Reordered tags
+- Added conditional for check target
+- Only require python-setuptools on RHEL
+- Added rules for also building Python 3 packages
+
* Mon Apr 3 2017 Lucas Meneghel Rodrigues <[email protected]> - 1.4.0-1
- Upgrade to upstream version 1.4.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/requirements-travis.txt
new/aexpect-1.5.1/requirements-travis.txt
--- old/aexpect-1.4.0/requirements-travis.txt 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/requirements-travis.txt 2018-06-13 17:19:29.000000000
+0200
@@ -1 +1,2 @@
-inspektor==0.2.2
+pycodestyle==2.4.0
+inspektor==0.4.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/scripts/aexpect-helper
new/aexpect-1.5.1/scripts/aexpect-helper
--- old/aexpect-1.4.0/scripts/aexpect-helper 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/scripts/aexpect-helper 2018-06-13 17:19:29.000000000
+0200
@@ -1,4 +1,16 @@
-#!/usr/bin/python
+#!/usr/bin/env python
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+
import os
import sys
@@ -87,7 +99,7 @@
makestandard(shell_fd, echo)
server_log.info('Opening output file %s' % output_filename)
- output_file = open(output_filename, "w")
+ output_file = open(output_filename, "wb")
server_log.info('Opening input pipe %s' % inpipe_filename)
os.mkfifo(inpipe_filename)
inpipe_fd = os.open(inpipe_filename, os.O_RDWR)
@@ -112,7 +124,7 @@
sys.stdout.flush()
# Initialize buffers
- buffers = ["" for reader in readers]
+ buffers = [b"" for reader in readers]
# Read from child and write to files/pipes
server_log.info('Entering main read loop')
@@ -141,12 +153,12 @@
try:
data = os.read(shell_fd, 16384)
except OSError:
- data = ""
+ data = b""
if not data:
check_termination = True
# Remove carriage returns from the data -- they often cause
# trouble and are normally not needed
- data = data.replace("\r", "")
+ data = data.replace(b"\r", b"")
output_file.write(data)
output_file.flush()
for i in range(len(readers)):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/selftests/checkall
new/aexpect-1.5.1/selftests/checkall
--- old/aexpect-1.4.0/selftests/checkall 2017-04-03 16:26:42.000000000
+0200
+++ new/aexpect-1.5.1/selftests/checkall 1970-01-01 01:00:00.000000000
+0100
@@ -1,15 +0,0 @@
-#!/bin/bash
-GR=0
-run_rc() {
- echo "Running '$1'"
- $1
- if [ $? != 0 ]; then
- GR=1
- fi
- echo ""
-}
-run_rc 'inspekt lint'
-run_rc 'inspekt indent'
-run_rc 'inspekt style'
-exit ${GR}
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/setup.py new/aexpect-1.5.1/setup.py
--- old/aexpect-1.4.0/setup.py 2017-04-03 16:26:42.000000000 +0200
+++ new/aexpect-1.5.1/setup.py 2018-06-13 17:19:29.000000000 +0200
@@ -13,45 +13,19 @@
# Copyright: Red Hat Inc. 2013-2015
# Author: Lucas Meneghel Rodrigues <[email protected]>
-import os
+import sys
# pylint: disable=E0611
from setuptools import setup
-VIRTUAL_ENV = 'VIRTUAL_ENV' in os.environ
-
-
-def get_dir(system_path=None, virtual_path=None):
- """
- Retrieve VIRTUAL_ENV friendly path
- :param system_path: Relative system path
- :param virtual_path: Overrides system_path for virtual_env only
- :return: VIRTUAL_ENV friendly path
- """
- if virtual_path is None:
- virtual_path = system_path
- if VIRTUAL_ENV:
- if virtual_path is None:
- virtual_path = []
- return os.path.join(*virtual_path)
- else:
- if system_path is None:
- system_path = []
- return os.path.join(*(['/'] + system_path))
-
-
-def get_avocado_libexec_dir():
- if VIRTUAL_ENV:
- return get_dir(['libexec'])
- elif os.path.exists('/usr/libexec'): # RHEL-like distro
- return get_dir(['usr', 'libexec', 'avocado'])
- else: # Debian-like distro
- return get_dir(['usr', 'lib', 'avocado'])
-
if __name__ == '__main__':
+ if sys.version_info[0] == 2:
+ REQUIREMENTS = ['subprocess32>=3.2.6']
+ else:
+ REQUIREMENTS = []
setup(name='aexpect',
- version='1.4.0',
+ version='1.5.1',
description='Aexpect',
author='Aexpect developers',
author_email='[email protected]',
@@ -59,4 +33,6 @@
packages=['aexpect',
'aexpect.utils'],
scripts=['scripts/aexpect-helper'],
- use_2to3=True)
+ use_2to3=True,
+ install_requires=REQUIREMENTS,
+ test_suite='tests')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/tests/test_client.py
new/aexpect-1.5.1/tests/test_client.py
--- old/aexpect-1.4.0/tests/test_client.py 1970-01-01 01:00:00.000000000
+0100
+++ new/aexpect-1.5.1/tests/test_client.py 2018-06-13 17:19:29.000000000
+0200
@@ -0,0 +1,37 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+#
+# Copyright: Red Hat Inc. 2018
+# Author: Cleber Rosa <[email protected]>
+
+import random
+import string
+import sys
+import unittest
+
+from aexpect import client
+
+
+class ClientTest(unittest.TestCase):
+
+ def test_client_spawn(self):
+ """
+ Tests the basic spawning of an interactive process
+ """
+ key = "".join([random.choice(string.ascii_uppercase)
+ for _ in range(10)])
+ python = client.Spawn(sys.executable)
+ self.assertTrue(python.is_alive())
+ python.sendline("print('%s')" % key)
+ python.sendline("quit()")
+ self.assertEqual(python.get_status(), 0)
+ self.assertIn(key, python.get_output())
+ self.assertFalse(python.is_alive())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aexpect-1.4.0/tests/test_pass_fds.py
new/aexpect-1.5.1/tests/test_pass_fds.py
--- old/aexpect-1.4.0/tests/test_pass_fds.py 1970-01-01 01:00:00.000000000
+0100
+++ new/aexpect-1.5.1/tests/test_pass_fds.py 2018-06-13 17:19:29.000000000
+0200
@@ -0,0 +1,49 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# See LICENSE for more details.
+#
+# Copyright: Red Hat Inc. 2018
+# Author: Xu Han <[email protected]>
+
+import os
+import unittest
+
+from aexpect import client
+
+
+LIST_FD_CMD = ('''python -c "import os; os.system('ls -l /proc/%d/fd' % '''
+ '''os.getpid())"''')
+
+
+class PassfdsTest(unittest.TestCase):
+
+ @unittest.skipUnless(os.path.exists('/proc/1/fd'), "requires Linux")
+ def test_pass_fds_spawn(self):
+ """
+ Tests fd passing for `client.Spawn`
+ """
+ with open(os.devnull, "r") as devnull:
+ fd = devnull.fileno()
+
+ child = client.Spawn(LIST_FD_CMD)
+ self.assertFalse(bool(child.get_status()),
+ "child terminated abnormally")
+ self.assertFalse(os.devnull in child.get_output())
+ child.close()
+
+ child = client.Spawn(LIST_FD_CMD, pass_fds=[fd])
+ self.assertFalse(bool(child.get_status()),
+ "child terminated abnormally")
+ self.assertTrue(os.devnull in child.get_output())
+ child.close()
+
+
+if __name__ == '__main__':
+ unittest.main()