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)

Reply via email to