Hello community,
here is the log from the commit of package python-eventlet for openSUSE:Factory
checked in at 2020-08-25 12:38:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-eventlet (Old)
and /work/SRC/openSUSE:Factory/.python-eventlet.new.3399 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-eventlet"
Tue Aug 25 12:38:26 2020 rev:35 rq:828006 version:0.26.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-eventlet/python-eventlet.changes
2020-05-01 11:06:54.179005795 +0200
+++
/work/SRC/openSUSE:Factory/.python-eventlet.new.3399/python-eventlet.changes
2020-08-25 12:38:29.925411431 +0200
@@ -1,0 +2,43 @@
+Wed Aug 19 15:28:03 UTC 2020 - Benjamin Greiner <[email protected]>
+
+- do not run test on python 2 (sadly no real macro expansion
+ possible to allow run but failok with ||:)
+- disable test discovery dir recursion gh#eventlet/eventlet#638
+- simplify the pytest call, no test file deletions
+
+-------------------------------------------------------------------
+Mon Aug 17 09:38:44 UTC 2020 - John Vandenberg <[email protected]>
+
+- Add pr_639.patch which fixes eventlet using dnspython 2.0.0
+- Add remove_nose_part_2.patch to complete the removal of nose
+- Activate test suite with 958 test cases passing on Tumbleweed
+
+-------------------------------------------------------------------
+Mon Aug 17 07:49:25 UTC 2020 - Matej Cepl <[email protected]>
+
+- Don't limit the upper version of dnspython.
+
+-------------------------------------------------------------------
+Fri Aug 14 21:30:16 UTC 2020 - Matej Cepl <[email protected]>
+
+- Add newdnspython.patch which makes eventlet work with new
+ dnspython 2.0.0.
+
+-------------------------------------------------------------------
+Thu Aug 13 16:07:08 UTC 2020 - Matej Cepl <[email protected]>
+
+- Add remove_nose.patch to remove dependency on nose
(gh#eventlet/eventlet#638).
+
+-------------------------------------------------------------------
+Thu Aug 13 14:07:43 UTC 2020 - Dirk Mueller <[email protected]>
+
+- update to 0.26.1:
+ * pin dnspython <2.0.0 https://github.com/eventlet/eventlet/issues/619
+ * Fix compatibility with SSLContext usage >= Python 3.7
+ * wsgi: Fix header capitalization on py3
+ * Fix #508: Py37 Deadlock ThreadPoolExecutor (#598)
+ * drop Python 3.4 support
+ * Fix misc SyntaxWarning's under Python 3.8
+ * Remove unnecessary assignment in _recv_loop (#601)
+
+-------------------------------------------------------------------
Old:
----
eventlet-0.25.2.tar.gz
New:
----
eventlet-0.26.1.tar.gz
newdnspython.patch
pr_639.patch
remove_nose.patch
remove_nose_part_2.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-eventlet.spec ++++++
--- /var/tmp/diff_new_pack.of679J/_old 2020-08-25 12:38:31.309411692 +0200
+++ /var/tmp/diff_new_pack.of679J/_new 2020-08-25 12:38:31.313411693 +0200
@@ -18,33 +18,44 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-eventlet
-Version: 0.25.2
+Version: 0.26.1
Release: 0
Summary: Concurrent networking library for Python
License: MIT
Group: Development/Languages/Python
URL: http://eventlet.net
Source:
https://files.pythonhosted.org/packages/source/e/eventlet/eventlet-%{version}.tar.gz
+# PATCH-FEATURE-UPSTREAM remove_nose.patch gh#eventlet/eventlet#638
[email protected]
+# Removes dependency on nose
+Patch0: remove_nose.patch
+# PATCH-FIX-UPSTREAM newdnspython.patch gh#eventlet/eventlet#638 [email protected]
+# patch is from gh#rthalley/dnspython#519
+Patch1: newdnspython.patch
+# PATCH-FEATURE-UPSTREAM pr_639.patch gh#eventlet/eventlet#639 [email protected]
+Patch2: pr_639.patch
+# Really remove the dependency on nose
+Patch3: remove_nose_part_2.patch
BuildRequires: %{python_module dnspython >= 1.15.0}
BuildRequires: %{python_module greenlet >= 0.3}
BuildRequires: %{python_module monotonic >= 1.4}
-BuildRequires: %{python_module nose}
BuildRequires: %{python_module pyOpenSSL}
+BuildRequires: %{python_module pytest}
+BuildRequires: %{python_module pyzmq}
BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module six >= 1.10.0}
+BuildRequires: %{python_module testsuite}
BuildRequires: fdupes
BuildRequires: netcfg
BuildRequires: python-rpm-macros
# eventlet parses /etc/protocols which is not available in normal build envs
+# Tests
+BuildRequires: sysconfig-netconfig
Requires: netcfg
Requires: python-dnspython >= 1.15.0
Requires: python-greenlet >= 0.3
Requires: python-monotonic >= 1.4
Requires: python-six >= 1.10.0
BuildArch: noarch
-%if %{python_version_nodots} < 34
-Requires: python-enum34
-%endif
%python_subpackages
%description
@@ -59,7 +70,11 @@
%prep
%setup -q -n eventlet-%{version}
+%autopatch -p1
+
sed -i "s|^#!.*||" eventlet/support/greendns.py # Fix non-executable script
+# https://github.com/eventlet/eventlet/issues/638
+sed -i "/assert num_readers/ i \ return" tests/__init__.py
%build
%python_build
@@ -69,8 +84,22 @@
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
-# 400 out of 600 tests either fail or error out
-#%%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib}
nosetests-%{$python_bin_suffix} -v
+# python2 is required to build for Leap, but tests fail (even upstream)
+python2_skipall='--collect-only'
+# dnspython 1 and 2: backdoor tests fail with "take too long"
+skiptests="(BackdoorTest and test_server)"
+# fail only with dnspython 2:
+skiptests+=" or test_dns_methods_are_green or test_noraise_dns_tcp"
+
+# Unknown openSUSE 15.x specific errors
+# TypeError: _wrap_socket() argument 1 must be _socket.socket, not SSLSocket
+# https://github.com/rthalley/dnspython/issues/559#issuecomment-675274960
+%if %python3_version_nodots == 36
+ skiptests+=" or test_connect_ssl or test_ssl_sending_messages or
test_wrap_ssl"
+ skiptests+=" or ssl_test or wsgi_test"
+%endif
+# no subdir recursion
https://github.com/eventlet/eventlet/issues/638#issuecomment-676085599
+%pytest -o norecursedirs="tests/*" -k "not ($skiptests)" ${$python_skipall}
%files %{python_files}
%license LICENSE
++++++ eventlet-0.25.2.tar.gz -> eventlet-0.26.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/NEWS new/eventlet-0.26.1/NEWS
--- old/eventlet-0.25.2/NEWS 2020-04-09 14:43:16.000000000 +0200
+++ new/eventlet-0.26.1/NEWS 2020-07-30 23:48:00.000000000 +0200
@@ -1,3 +1,16 @@
+0.26.1
+======
+* pin dnspython <2.0.0 https://github.com/eventlet/eventlet/issues/619
+
+0.26.0
+======
+* Fix compatibility with SSLContext usage >= Python 3.7
+* wsgi: Fix header capitalization on py3
+* Fix #508: Py37 Deadlock ThreadPoolExecutor (#598)
+* drop Python 3.4 support
+* Fix misc SyntaxWarning's under Python 3.8
+* Remove unnecessary assignment in _recv_loop (#601)
+
0.25.2
======
* green.ssl: redundant set_nonblocking() caused SSLWantReadError
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/PKG-INFO new/eventlet-0.26.1/PKG-INFO
--- old/eventlet-0.25.2/PKG-INFO 2020-04-09 14:44:00.000000000 +0200
+++ new/eventlet-0.26.1/PKG-INFO 2020-07-30 23:48:27.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: eventlet
-Version: 0.25.2
+Version: 0.26.1
Summary: Highly concurrent networking library
Home-page: http://eventlet.net
Author: Linden Lab
@@ -90,7 +90,6 @@
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet/__init__.py
new/eventlet-0.26.1/eventlet/__init__.py
--- old/eventlet-0.25.2/eventlet/__init__.py 2020-04-09 14:42:39.000000000
+0200
+++ new/eventlet-0.26.1/eventlet/__init__.py 2020-07-30 23:46:33.000000000
+0200
@@ -1,7 +1,7 @@
import os
-version_info = (0, 25, 2)
+version_info = (0, 26, 1)
__version__ = '.'.join(map(str, version_info))
# This is to make Debian packaging easier, it ignores import
# errors of greenlet so that the packager can still at least
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet/db_pool.py
new/eventlet-0.26.1/eventlet/db_pool.py
--- old/eventlet-0.25.2/eventlet/db_pool.py 2018-08-06 18:17:47.000000000
+0200
+++ new/eventlet-0.26.1/eventlet/db_pool.py 2020-07-30 18:25:18.000000000
+0200
@@ -75,7 +75,7 @@
If max_age or max_idle is 0, _schedule_expiration likewise does
nothing.
"""
- if self.max_age is 0 or self.max_idle is 0:
+ if self.max_age == 0 or self.max_idle == 0:
# expiration is unnecessary because all connections will be expired
# on put
return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet/green/ssl.py
new/eventlet-0.26.1/eventlet/green/ssl.py
--- old/eventlet-0.25.2/eventlet/green/ssl.py 2020-03-02 13:04:48.000000000
+0100
+++ new/eventlet-0.26.1/eventlet/green/ssl.py 2020-07-30 18:25:18.000000000
+0200
@@ -64,17 +64,28 @@
if not isinstance(sock, GreenSocket):
sock = GreenSocket(sock)
with _original_ssl_context():
- ret = _original_wrap_socket(
- sock=sock.fd,
- keyfile=keyfile,
- certfile=certfile,
- server_side=server_side,
- cert_reqs=cert_reqs,
- ssl_version=ssl_version,
- ca_certs=ca_certs,
- do_handshake_on_connect=False,
- *args, **kw
- )
+ context = kw.get('_context')
+ if context:
+ ret = _original_sslsocket._create(
+ sock=sock.fd,
+ server_side=server_side,
+ do_handshake_on_connect=False,
+ suppress_ragged_eofs=kw.get('suppress_ragged_eofs'),
+ server_hostname=kw.get('server_hostname'),
+ context=context,
+ session=kw.get('session'),
+ )
+ else:
+ ret = _original_wrap_socket(
+ sock=sock.fd,
+ keyfile=keyfile,
+ certfile=certfile,
+ server_side=server_side,
+ cert_reqs=cert_reqs,
+ ssl_version=ssl_version,
+ ca_certs=ca_certs,
+ do_handshake_on_connect=False,
+ )
ret.keyfile = keyfile
ret.certfile = certfile
ret.cert_reqs = cert_reqs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet/greenio/base.py
new/eventlet-0.26.1/eventlet/greenio/base.py
--- old/eventlet-0.25.2/eventlet/greenio/base.py 2020-03-02
12:07:13.000000000 +0100
+++ new/eventlet-0.26.1/eventlet/greenio/base.py 2020-07-30
18:25:18.000000000 +0200
@@ -331,7 +331,6 @@
timeout_exc=socket_timeout('timed out'))
def _recv_loop(self, recv_meth, empty_val, *args):
- fd = self.fd
if self.act_non_blocking:
return recv_meth(*args)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet/patcher.py
new/eventlet-0.26.1/eventlet/patcher.py
--- old/eventlet-0.25.2/eventlet/patcher.py 2020-03-02 12:07:13.000000000
+0100
+++ new/eventlet-0.26.1/eventlet/patcher.py 2020-07-30 18:25:18.000000000
+0200
@@ -328,6 +328,12 @@
import threading
threading.RLock = threading._PyRLock
+ # Issue #508: Since Python 3.7 queue.SimpleQueue is implemented in C,
+ # causing a deadlock. Replace the C implementation with the Python one.
+ if sys.version_info >= (3, 7):
+ import queue
+ queue.SimpleQueue = queue._PySimpleQueue
+
def is_monkey_patched(module):
"""Returns True if the given module is monkeypatched currently, False if
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet/wsgi.py
new/eventlet-0.26.1/eventlet/wsgi.py
--- old/eventlet-0.25.2/eventlet/wsgi.py 2020-03-02 12:07:13.000000000
+0100
+++ new/eventlet-0.26.1/eventlet/wsgi.py 2020-07-30 18:25:18.000000000
+0200
@@ -554,8 +554,15 @@
# Per HTTP RFC standard, header name is case-insensitive.
# Please, fix your client to ignore header case if possible.
if self.capitalize_response_headers:
+ if six.PY2:
+ def cap(x):
+ return x.capitalize()
+ else:
+ def cap(x):
+ return x.encode('latin1').capitalize().decode('latin1')
+
response_headers = [
- ('-'.join([x.capitalize() for x in key.split('-')]), value)
+ ('-'.join([cap(x) for x in key.split('-')]), value)
for key, value in response_headers]
headers_set[:] = [status, response_headers]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet.egg-info/PKG-INFO
new/eventlet-0.26.1/eventlet.egg-info/PKG-INFO
--- old/eventlet-0.25.2/eventlet.egg-info/PKG-INFO 2020-04-09
14:43:59.000000000 +0200
+++ new/eventlet-0.26.1/eventlet.egg-info/PKG-INFO 2020-07-30
23:48:26.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: eventlet
-Version: 0.25.2
+Version: 0.26.1
Summary: Highly concurrent networking library
Home-page: http://eventlet.net
Author: Linden Lab
@@ -90,7 +90,6 @@
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet.egg-info/SOURCES.txt
new/eventlet-0.26.1/eventlet.egg-info/SOURCES.txt
--- old/eventlet-0.25.2/eventlet.egg-info/SOURCES.txt 2020-04-09
14:44:00.000000000 +0200
+++ new/eventlet-0.26.1/eventlet.egg-info/SOURCES.txt 2020-07-30
23:48:26.000000000 +0200
@@ -227,6 +227,7 @@
tests/isolated/patcher_threading_condition.py
tests/isolated/patcher_threading_current.py
tests/isolated/patcher_threading_join.py
+tests/isolated/patcher_threadpoolexecutor.py
tests/isolated/regular_file_readall.py
tests/isolated/socket_resolve_green.py
tests/isolated/subprocess_exception_identity.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/eventlet.egg-info/requires.txt
new/eventlet-0.26.1/eventlet.egg-info/requires.txt
--- old/eventlet-0.25.2/eventlet.egg-info/requires.txt 2020-04-09
14:43:59.000000000 +0200
+++ new/eventlet-0.26.1/eventlet.egg-info/requires.txt 2020-07-30
23:48:26.000000000 +0200
@@ -1,7 +1,4 @@
-dnspython>=1.15.0
+dnspython<2.0.0,>=1.15.0
greenlet>=0.3
monotonic>=1.4
six>=1.10.0
-
-[:python_version < "3.4"]
-enum34
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/setup.py new/eventlet-0.26.1/setup.py
--- old/eventlet-0.25.2/setup.py 2020-03-02 12:07:13.000000000 +0100
+++ new/eventlet-0.26.1/setup.py 2020-07-30 23:42:21.000000000 +0200
@@ -15,8 +15,7 @@
url='http://eventlet.net',
packages=setuptools.find_packages(exclude=['benchmarks', 'tests',
'tests.*']),
install_requires=(
- 'dnspython >= 1.15.0',
- 'enum34;python_version<"3.4"',
+ 'dnspython >= 1.15.0, < 2.0.0',
'greenlet >= 0.3',
'monotonic >= 1.4',
'six >= 1.10.0',
@@ -39,7 +38,6 @@
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/tests/__init__.py
new/eventlet-0.26.1/tests/__init__.py
--- old/eventlet-0.25.2/tests/__init__.py 2020-03-02 12:07:13.000000000
+0100
+++ new/eventlet-0.26.1/tests/__init__.py 2020-07-30 18:25:18.000000000
+0200
@@ -356,6 +356,9 @@
except subprocess.TimeoutExpired:
p.kill()
output, _ = p.communicate(timeout=timeout)
+ if expect_pass:
+ sys.stderr.write('Program {0}
output:\n---\n{1}\n---\n'.format(path, output.decode()))
+ assert False, 'timed out'
return '{0}\nFAIL - timed out'.format(output).encode()
if expect_pass:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/tests/greenio_test.py
new/eventlet-0.26.1/tests/greenio_test.py
--- old/eventlet-0.25.2/tests/greenio_test.py 2018-08-06 18:17:47.000000000
+0200
+++ new/eventlet-0.26.1/tests/greenio_test.py 2020-07-30 18:25:18.000000000
+0200
@@ -634,12 +634,15 @@
sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
fd = sock1.fd.fileno()
flags = fcntl.fcntl(fd, fcntl.F_GETFL)
- flags = fcntl.fcntl(fd, fcntl.F_SETFL, flags & ~os.O_NONBLOCK)
- assert flags & os.O_NONBLOCK == 0
+ # on SPARC, nonblocking mode sets O_NDELAY as well
+ fcntl.fcntl(fd, fcntl.F_SETFL, flags & ~(os.O_NONBLOCK
+ | os.O_NDELAY))
+ flags = fcntl.fcntl(fd, fcntl.F_GETFL)
+ assert flags & (os.O_NONBLOCK | os.O_NDELAY) == 0
sock2 = socket.socket(sock1.fd, set_nonblocking=False)
flags = fcntl.fcntl(sock2.fd.fileno(), fcntl.F_GETFL)
- assert flags & os.O_NONBLOCK == 0
+ assert flags & (os.O_NONBLOCK | os.O_NDELAY) == 0
def test_sockopt_interface(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
@@ -922,7 +925,10 @@
assert orig_flags & os.O_NONBLOCK == 0
greenio.set_nonblocking(sock)
new_flags = fcntl.fcntl(fileno, fcntl.F_GETFL)
- assert new_flags == (orig_flags | os.O_NONBLOCK)
+ # on SPARC, O_NDELAY is set as well, and it might be a superset
+ # of O_NONBLOCK
+ assert (new_flags == (orig_flags | os.O_NONBLOCK)
+ or new_flags == (orig_flags | os.O_NONBLOCK | os.O_NDELAY))
def test_socket_del_fails_gracefully_when_not_fully_initialized():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/eventlet-0.25.2/tests/isolated/patcher_threadpoolexecutor.py
new/eventlet-0.26.1/tests/isolated/patcher_threadpoolexecutor.py
--- old/eventlet-0.25.2/tests/isolated/patcher_threadpoolexecutor.py
1970-01-01 01:00:00.000000000 +0100
+++ new/eventlet-0.26.1/tests/isolated/patcher_threadpoolexecutor.py
2020-07-30 18:25:18.000000000 +0200
@@ -0,0 +1,18 @@
+# Issue #508: test ThreadPoolExecutor with monkey-patching
+__test__ = False
+
+if __name__ == '__main__':
+ import eventlet
+ eventlet.monkey_patch()
+
+ import sys
+
+ # Futures is only included in 3.2 or later
+ if sys.version_info >= (3, 2):
+ from concurrent import futures
+
+ with futures.ThreadPoolExecutor(max_workers=1) as executor:
+ future = executor.submit(pow, 2, 3)
+ res = future.result()
+ assert res == 8, '2^3 should be 8, not %s' % res
+ print('pass')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/tests/patcher_test.py
new/eventlet-0.26.1/tests/patcher_test.py
--- old/eventlet-0.25.2/tests/patcher_test.py 2020-03-02 12:07:13.000000000
+0100
+++ new/eventlet-0.26.1/tests/patcher_test.py 2020-07-30 18:25:18.000000000
+0200
@@ -511,3 +511,7 @@
def test_threading_current():
tests.run_isolated('patcher_threading_current.py')
+
+
+def test_threadpoolexecutor():
+ tests.run_isolated('patcher_threadpoolexecutor.py')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/tests/ssl_test.py
new/eventlet-0.26.1/tests/ssl_test.py
--- old/eventlet-0.25.2/tests/ssl_test.py 2018-08-06 18:17:47.000000000
+0200
+++ new/eventlet-0.26.1/tests/ssl_test.py 2020-07-30 18:25:18.000000000
+0200
@@ -51,6 +51,28 @@
self.assertEqual(client.recv(8192), b'response')
server_coro.wait()
+ def test_ssl_context(self):
+ def serve(listener):
+ sock, addr = listener.accept()
+ sock.recv(8192)
+ sock.sendall(b'response')
+
+ sock = listen_ssl_socket()
+
+ server_coro = eventlet.spawn(serve, sock)
+
+ context = ssl.create_default_context()
+ context.verify_mode = ssl.CERT_REQUIRED
+ context.check_hostname = True
+ context.load_verify_locations(tests.certificate_file)
+
+ client = context.wrap_socket(
+ eventlet.connect(sock.getsockname()),
+ server_hostname='Test')
+ client.sendall(b'line 1\r\nline 2\r\n\r\n')
+ self.assertEqual(client.recv(8192), b'response')
+ server_coro.wait()
+
def test_ssl_close(self):
def serve(listener):
sock, addr = listener.accept()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/tests/tpool_test.py
new/eventlet-0.26.1/tests/tpool_test.py
--- old/eventlet-0.25.2/tests/tpool_test.py 2018-08-06 18:17:47.000000000
+0200
+++ new/eventlet-0.26.1/tests/tpool_test.py 2020-07-30 18:25:18.000000000
+0200
@@ -366,7 +366,7 @@
def test_isolate_from_socket_default_timeout():
- tests.run_isolated('tpool_isolate_socket_default_timeout.py', timeout=1)
+ tests.run_isolated('tpool_isolate_socket_default_timeout.py', timeout=5)
def test_exception_leak():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.25.2/tests/wsgi_test.py
new/eventlet-0.26.1/tests/wsgi_test.py
--- old/eventlet-0.25.2/tests/wsgi_test.py 2020-03-02 12:07:13.000000000
+0100
+++ new/eventlet-0.26.1/tests/wsgi_test.py 2020-07-30 18:25:18.000000000
+0200
@@ -190,7 +190,7 @@
x = x.strip()
if not x:
continue
- key, value = bytes_to_str(x).split(':', 1)
+ key, value = bytes_to_str(x, encoding='latin1').split(':', 1)
key = key.rstrip()
value = value.lstrip()
key_lower = key.lower()
@@ -1629,6 +1629,26 @@
except ConnectionClosed:
pass
+ def test_header_name_capitalization(self):
+ def wsgi_app(environ, start_response):
+ start_response('200 oK', [
+ ('sOMe-WEirD', 'cAsE'),
+ ('wiTH-\xdf-LATIN1-\xff', 'chars'),
+ ])
+ return [b'']
+
+ self.spawn_server(site=wsgi_app)
+
+ sock = eventlet.connect(self.server_addr)
+ sock.sendall(b'GET / HTTP/1.1\r\nHost: localhost\r\n\r\n')
+ result = read_http(sock)
+ sock.close()
+ self.assertEqual(result.status, 'HTTP/1.1 200 oK')
+ self.assertIn('Some-Weird', result.headers_original)
+ self.assertEqual(result.headers_original['Some-Weird'], 'cAsE')
+ self.assertIn('With-\xdf-Latin1-\xff', result.headers_original)
+ self.assertEqual(result.headers_original['With-\xdf-Latin1-\xff'],
'chars')
+
def test_disable_header_name_capitalization(self):
# Disable HTTP header name capitalization
#
++++++ newdnspython.patch ++++++
--- a/eventlet/support/greendns.py
+++ b/eventlet/support/greendns.py
@@ -313,7 +313,7 @@ class ResolverProxy(object):
self.clear()
def clear(self):
- self._resolver = dns.resolver.Resolver(filename=self._filename)
+ self._resolver = dns.resolver.Resolver(filename=self._filename,
configure=False)
self._resolver.cache = dns.resolver.LRUCache()
def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
--- a/tests/greendns_test.py
+++ b/tests/greendns_test.py
@@ -885,7 +885,7 @@ class TinyDNSTests(tests.LimitedTestCase
# https://github.com/eventlet/eventlet/issues/499
# None means we don't want the server to find the IP
with tests.dns_tcp_server(None) as dnsaddr:
- resolver = Resolver()
+ resolver = Resolver(configure=False)
resolver.nameservers = [dnsaddr[0]]
resolver.nameserver_ports[dnsaddr[0]] = dnsaddr[1]
@@ -896,7 +896,7 @@ class TinyDNSTests(tests.LimitedTestCase
# https://github.com/eventlet/eventlet/issues/499
expected_ip = "192.168.1.1"
with tests.dns_tcp_server(expected_ip) as dnsaddr:
- resolver = Resolver()
+ resolver = Resolver(configure=False)
resolver.nameservers = [dnsaddr[0]]
resolver.nameserver_ports[dnsaddr[0]] = dnsaddr[1]
response = resolver.query('host.example.com', 'a', tcp=True)
--- a/setup.py
+++ b/setup.py
@@ -15,7 +15,7 @@ setuptools.setup(
url='http://eventlet.net',
packages=setuptools.find_packages(exclude=['benchmarks', 'tests',
'tests.*']),
install_requires=(
- 'dnspython >= 1.15.0, < 2.0.0',
+ 'dnspython >= 1.15.0',
'greenlet >= 0.3',
'monotonic >= 1.4',
'six >= 1.10.0',
++++++ pr_639.patch ++++++
commit 46fc185c8f92008c65aef2713fc1445bfc5f6fec
Author: Rodolfo Alonso Hernandez <[email protected]>
Date: Mon Jul 20 17:21:30 2020 +0000
Replace dnspython "_compute_expiration" by "_compute_times".
In dnspython v2.0.0, "_compute_expiration" was replaced by
"_compute_times". Once the minimum version of dnspython is
v2.0.0, we can remove this wrapping method.
Closes-Bug: #1888258
Fixes: #629
diff --git a/eventlet/support/greendns.py b/eventlet/support/greendns.py
index 13968c2..19b83c9 100644
--- a/eventlet/support/greendns.py
+++ b/eventlet/support/greendns.py
@@ -118,6 +118,15 @@ def is_ip_addr(host):
return is_ipv4_addr(host) or is_ipv6_addr(host)
+def compute_expiration(query, timeout):
+ # NOTE(ralonsoh): in dnspython v2.0.0, "_compute_expiration" was replaced
+ # by "_compute_times".
+ if hasattr(query, '_compute_expiration'):
+ return query._compute_expiration(timeout)
+ else:
+ return query._compute_times(timeout)[1]
+
+
class HostsAnswer(dns.resolver.Answer):
"""Answer class for HostsResolver object"""
@@ -709,7 +718,7 @@ def udp(q, where, timeout=DNS_QUERY_TIMEOUT, port=53,
s = socket.socket(af, socket.SOCK_DGRAM)
s.settimeout(timeout)
try:
- expiration = dns.query._compute_expiration(timeout)
+ expiration = compute_expiration(dns.query, timeout)
if source is not None:
s.bind(source)
while True:
@@ -802,7 +811,7 @@ def tcp(q, where, timeout=DNS_QUERY_TIMEOUT, port=53,
s = socket.socket(af, socket.SOCK_STREAM)
s.settimeout(timeout)
try:
- expiration = dns.query._compute_expiration(timeout)
+ expiration = compute_expiration(dns.query, timeout)
if source is not None:
s.bind(source)
while True:
++++++ remove_nose.patch ++++++
--- a/setup.py
+++ b/setup.py
@@ -27,7 +27,7 @@ setuptools.setup(
'README.rst'
)
).read(),
- test_suite='nose.collector',
+ test_suite='tests',
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
--- a/eventlet.egg-info/SOURCES.txt
+++ b/eventlet.egg-info/SOURCES.txt
@@ -174,7 +174,6 @@ tests/greenthread_test.py
tests/hub_test.py
tests/mock.py
tests/mysqldb_test.py
-tests/nosewrapper.py
tests/openssl_test.py
tests/os_test.py
tests/parse_results.py
@@ -270,4 +269,4 @@ tests/stdlib/test_threading_local.py
tests/stdlib/test_timeout.py
tests/stdlib/test_urllib.py
tests/stdlib/test_urllib2.py
-tests/stdlib/test_urllib2_localnet.py
\ No newline at end of file
+tests/stdlib/test_urllib2_localnet.py
--- a/tests/greenio_test.py
+++ b/tests/greenio_test.py
@@ -9,8 +9,6 @@ import socket as _orig_sock
import sys
import tempfile
-from nose.tools import eq_
-
import eventlet
from eventlet import event, greenio, debug
from eventlet.hubs import get_hub
@@ -39,7 +37,7 @@ def expect_socket_timeout(function, *arg
raise AssertionError("socket.timeout not raised")
except socket.timeout as e:
assert hasattr(e, 'args')
- eq_(e.args[0], 'timed out')
+ assert e.args[0] == 'timed out'
def min_buf_size():
@@ -674,8 +672,8 @@ class TestGreenSocket(tests.LimitedTestC
sender.sendto(b'second', 0, address)
sender_address = ('127.0.0.1', sender.getsockname()[1])
- eq_(receiver.recvfrom(1024), (b'first', sender_address))
- eq_(receiver.recvfrom(1024), (b'second', sender_address))
+ assert receiver.recvfrom(1024) == (b'first', sender_address)
+ assert receiver.recvfrom(1024) == (b'second', sender_address)
def test_get_fileno_of_a_socket_works():
--- a/tests/nosewrapper.py
+++ b/tests/nosewrapper.py
@@ -1,20 +1,13 @@
""" This script simply gets the paths correct for testing eventlet with the
hub extension for Nose."""
-import nose
from os.path import dirname, realpath, abspath
import sys
+import unittest
parent_dir = dirname(dirname(realpath(abspath(__file__))))
if parent_dir not in sys.path:
sys.path.insert(0, parent_dir)
-# hudson does a better job printing the test results if the exit value is 0
-zero_status = '--force-zero-status'
-if zero_status in sys.argv:
- sys.argv.remove(zero_status)
- launch = nose.run
-else:
- launch = nose.main
-
-launch(argv=sys.argv)
+if __name__ == '__main__':
+ unittest.main()
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -20,7 +20,7 @@ import sys
import unittest
import warnings
-from nose.plugins.skip import SkipTest
+from unittest import SkipTest
import eventlet
from eventlet import tpool
@@ -223,7 +223,6 @@ class LimitedTestCase(unittest.TestCase)
def check_idle_cpu_usage(duration, allowed_part):
if resource is None:
# TODO: use https://code.google.com/p/psutil/
- from nose.plugins.skip import SkipTest
raise SkipTest('CPU usage testing not supported (`import resource`
failed)')
r1 = resource.getrusage(resource.RUSAGE_SELF)
--- a/tests/dagpool_test.py
+++ b/tests/dagpool_test.py
@@ -5,7 +5,6 @@
@brief Test DAGPool class
"""
-from nose.tools import *
import eventlet
from eventlet.dagpool import DAGPool, Collision, PropagateError
import six
@@ -13,8 +12,8 @@ from contextlib import contextmanager
import itertools
-# Not all versions of nose.tools.assert_raises() support the usage in this
-# module, but it's straightforward enough to code that explicitly.
+# Not all versions of assert_raises() support the usage in this module,
+# but it's straightforward enough to code that explicitly.
@contextmanager
def assert_raises(exc):
"""exc is an exception class"""
++++++ remove_nose_part_2.patch ++++++
diff -ur eventlet-0.26.1-orig/tests/dagpool_test.py
eventlet-0.26.1/tests/dagpool_test.py
--- eventlet-0.26.1-orig/tests/dagpool_test.py 2020-08-17 16:48:04.393065291
+0700
+++ eventlet-0.26.1/tests/dagpool_test.py 2020-08-17 16:48:42.049502450
+0700
@@ -162,7 +162,7 @@
# a set. Make a set containing its elements.
setlist.append(set(subseq))
# Now that we've massaged 'sequence' into 'setlist', compare.
- assert_equal(self.sequence, setlist)
+ assert self.sequence == setlist
# ****************************************************************************
@@ -190,14 +190,14 @@
with check_no_suspend():
results = pool.waitall()
# with no spawn() or post(), waitall() returns preload data
- assert_equals(results, dict(a=1, b=2, c=3))
+ assert results == dict(a=1, b=2, c=3)
# preload sequence of pairs
pool = DAGPool([("d", 4), ("e", 5), ("f", 6)])
# this must not hang
with check_no_suspend():
results = pool.waitall()
- assert_equals(results, dict(d=4, e=5, f=6))
+ assert results == dict(d=4, e=5, f=6)
def test_wait_each_empty():
@@ -215,10 +215,10 @@
with check_no_suspend():
# wait_each() may deliver in arbitrary order; collect into a dict
# for comparison
- assert_equals(dict(pool.wait_each("abc")), dict(a=1, b=2, c=3))
+ assert dict(pool.wait_each("abc")) == dict(a=1, b=2, c=3)
# while we're at it, test wait() for preloaded keys
- assert_equals(pool.wait("bc"), dict(b=2, c=3))
+ assert pool.wait("bc") == dict(b=2, c=3)
def post_each(pool, capture):
@@ -256,7 +256,7 @@
eventlet.spawn(post_each, pool, capture)
gotten = pool.wait("bcdefg")
capture.add("got all")
- assert_equals(gotten,
+ assert (gotten ==
dict(b=2, c=3,
d="dval", e="eval",
f="fval", g="gval"))
@@ -284,7 +284,7 @@
pool = DAGPool()
pool.spawn("a", (), lambda key, results: "aval")
# hasn't yet even started
- assert_equals(pool.get("a"), None)
+ assert pool.get("a") == None
with assert_raises(Collision):
# Attempting to spawn again with same key should collide even if the
# first spawned greenthread hasn't yet had a chance to run.
@@ -292,7 +292,7 @@
# now let the spawned eventlet run
eventlet.sleep(0)
# should have finished
- assert_equals(pool.get("a"), "aval")
+ assert pool.get("a") == "aval"
with assert_raises(Collision):
# Attempting to spawn with same key collides even when the greenthread
# has completed.
@@ -323,60 +323,60 @@
capture.step()
# but none of them has yet produced a result
for k in "defgh":
- assert_equals(pool.get(k), None)
- assert_equals(set(pool.keys()), set("abc"))
- assert_equals(dict(pool.items()), dict(a=1, b=2, c=3))
- assert_equals(pool.running(), 5)
- assert_equals(set(pool.running_keys()), set("defgh"))
- assert_equals(pool.waiting(), 1)
- assert_equals(pool.waiting_for(), dict(h=set("defg")))
- assert_equals(pool.waiting_for("d"), set())
- assert_equals(pool.waiting_for("c"), set())
+ assert pool.get(k) == None
+ assert set(pool.keys()) == set("abc")
+ assert dict(pool.items()) == dict(a=1, b=2, c=3)
+ assert pool.running() == 5
+ assert set(pool.running_keys()) == set("defgh")
+ assert pool.waiting() == 1
+ assert pool.waiting_for() == dict(h=set("defg"))
+ assert pool.waiting_for("d") == set()
+ assert pool.waiting_for("c") == set()
with assert_raises(KeyError):
pool.waiting_for("j")
- assert_equals(pool.waiting_for("h"), set("defg"))
+ assert pool.waiting_for("h") == set("defg")
# let one of the upstream greenthreads complete
events["f"].send("fval")
spin()
capture.step()
- assert_equals(pool.get("f"), "fval")
- assert_equals(set(pool.keys()), set("abcf"))
- assert_equals(dict(pool.items()), dict(a=1, b=2, c=3, f="fval"))
- assert_equals(pool.running(), 4)
- assert_equals(set(pool.running_keys()), set("degh"))
- assert_equals(pool.waiting(), 1)
- assert_equals(pool.waiting_for("h"), set("deg"))
+ assert pool.get("f") == "fval"
+ assert set(pool.keys()) == set("abcf")
+ assert dict(pool.items()) == dict(a=1, b=2, c=3, f="fval")
+ assert pool.running() == 4
+ assert set(pool.running_keys()) == set("degh")
+ assert pool.waiting() == 1
+ assert pool.waiting_for("h") == set("deg")
# now two others
events["e"].send("eval")
events["g"].send("gval")
spin()
capture.step()
- assert_equals(pool.get("e"), "eval")
- assert_equals(pool.get("g"), "gval")
- assert_equals(set(pool.keys()), set("abcefg"))
- assert_equals(dict(pool.items()),
+ assert pool.get("e") == "eval"
+ assert pool.get("g") == "gval"
+ assert set(pool.keys()) == set("abcefg")
+ assert (dict(pool.items()) ==
dict(a=1, b=2, c=3, e="eval", f="fval", g="gval"))
- assert_equals(pool.running(), 2)
- assert_equals(set(pool.running_keys()), set("dh"))
- assert_equals(pool.waiting(), 1)
- assert_equals(pool.waiting_for("h"), set("d"))
+ assert pool.running() == 2
+ assert set(pool.running_keys()) == set("dh")
+ assert pool.waiting() == 1
+ assert pool.waiting_for("h") == set("d")
# last one
events["d"].send("dval")
# make sure both pool greenthreads get a chance to run
spin()
capture.step()
- assert_equals(pool.get("d"), "dval")
- assert_equals(set(pool.keys()), set("abcdefgh"))
- assert_equals(dict(pool.items()),
+ assert pool.get("d") == "dval"
+ assert set(pool.keys()) == set("abcdefgh")
+ assert (dict(pool.items()) ==
dict(a=1, b=2, c=3,
d="dval", e="eval", f="fval", g="gval", h="hval"))
- assert_equals(pool.running(), 0)
- assert_false(pool.running_keys())
- assert_equals(pool.waiting(), 0)
- assert_equals(pool.waiting_for("h"), set())
+ assert pool.running() == 0
+ assert not pool.running_keys()
+ assert pool.waiting() == 0
+ assert pool.waiting_for("h") == set()
capture.validate([
["h got b", "h got c"],
@@ -431,13 +431,13 @@
spin()
# verify that e completed (also that post(key) within greenthread
# overrides implicit post of return value, which would be None)
- assert_equals(pool.get("e"), "e")
+ assert pool.get("e") == "e"
# With the dependency graph shown above, it is not guaranteed whether b or
# c will complete first. Handle either case.
sequence = capture.sequence[:]
sequence[1:3] = [set([sequence[1].pop(), sequence[2].pop()])]
- assert_equals(sequence,
+ assert (sequence ==
[set(["a done"]),
set(["b done", "c done"]),
set(["d done"]),
@@ -465,7 +465,7 @@
for pos in range(len(keys)):
# next value from wait_each()
k, v = next(each)
- assert_equals(k, keys[pos])
+ assert k == keys[pos]
# advance every pool greenlet as far as it can go
spin()
# everything from keys[:pos+1] should have a value by now
@@ -493,7 +493,7 @@
pool.kill("a")
# didn't run
spin()
- assert_equals(pool.get("a"), None)
+ assert pool.get("a") == None
# killing it forgets about it
with assert_raises(KeyError):
pool.kill("a")
@@ -504,7 +504,7 @@
with assert_raises(KeyError):
pool.kill("a")
# verify it ran to completion
- assert_equals(pool.get("a"), 2)
+ assert pool.get("a") == 2
def test_post_collision_preload():
@@ -532,7 +532,7 @@
pool.kill("a")
# now we can post
pool.post("a", 3)
- assert_equals(pool.get("a"), 3)
+ assert pool.get("a") == 3
pool = DAGPool()
pool.spawn("a", (), lambda key, result: 4)
@@ -552,10 +552,10 @@
pool = DAGPool()
pool.post("a", 1)
pool.post("a", 2, replace=True)
- assert_equals(pool.get("a"), 2)
- assert_equals(dict(pool.wait_each("a")), dict(a=2))
- assert_equals(pool.wait("a"), dict(a=2))
- assert_equals(pool["a"], 2)
+ assert pool.get("a") == 2
+ assert dict(pool.wait_each("a")) == dict(a=2)
+ assert pool.wait("a") == dict(a=2)
+ assert pool["a"] == 2
def waitfor(capture, pool, key):
@@ -597,14 +597,14 @@
try:
pool.waitall()
except PropagateError as err:
- assert_equals(err.key, "a")
+ assert err.key == "a"
assert isinstance(err.exc, BogusError), \
"exc attribute is {0}, not BogusError".format(err.exc)
- assert_equals(str(err.exc), "bogus")
+ assert str(err.exc) == "bogus"
msg = str(err)
- assert_in("PropagateError(a)", msg)
- assert_in("BogusError", msg)
- assert_in("bogus", msg)
+ assert "PropagateError(a)" in msg
+ assert "BogusError" in msg
+ assert "bogus" in msg
def test_propagate_exc():
@@ -615,20 +615,20 @@
try:
pool["c"]
except PropagateError as errc:
- assert_equals(errc.key, "c")
+ assert errc.key == "c"
errb = errc.exc
- assert_equals(errb.key, "b")
+ assert errb.key == "b"
erra = errb.exc
- assert_equals(erra.key, "a")
+ assert erra.key == "a"
assert isinstance(erra.exc, BogusError), \
"exc attribute is {0}, not BogusError".format(erra.exc)
- assert_equals(str(erra.exc), "bogus")
+ assert str(erra.exc) == "bogus"
msg = str(errc)
- assert_in("PropagateError(a)", msg)
- assert_in("PropagateError(b)", msg)
- assert_in("PropagateError(c)", msg)
- assert_in("BogusError", msg)
- assert_in("bogus", msg)
+ assert "PropagateError(a)" in msg
+ assert "PropagateError(b)" in msg
+ assert "PropagateError(c)" in msg
+ assert "BogusError" in msg
+ assert "bogus" in msg
def test_wait_each_exc():
@@ -680,13 +680,13 @@
pass
# wait_each_success() filters
- assert_equals(dict(pool.wait_each_success()), dict(a=bogua))
- assert_equals(dict(pool.wait_each_success("ab")), dict(a=bogua))
- assert_equals(dict(pool.wait_each_success("a")), dict(a=bogua))
- assert_equals(dict(pool.wait_each_success("b")), {})
+ assert dict(pool.wait_each_success()) == dict(a=bogua)
+ assert dict(pool.wait_each_success("ab")) == dict(a=bogua)
+ assert dict(pool.wait_each_success("a")) == dict(a=bogua)
+ assert dict(pool.wait_each_success("b")) == {}
# wait_each_exception() filters the other way
- assert_equals(dict(pool.wait_each_exception()), dict(b=bogub))
- assert_equals(dict(pool.wait_each_exception("ab")), dict(b=bogub))
- assert_equals(dict(pool.wait_each_exception("a")), {})
- assert_equals(dict(pool.wait_each_exception("b")), dict(b=bogub))
+ assert dict(pool.wait_each_exception()) == dict(b=bogub)
+ assert dict(pool.wait_each_exception("ab")) == dict(b=bogub)
+ assert dict(pool.wait_each_exception("a")) == {}
+ assert dict(pool.wait_each_exception("b")) == dict(b=bogub)