commit 59f9fde162782a85efa7a719ef375fbc37538028 Author: Adrian Schröter Date: Tue Jun 6 15:09:19 2023 +0200 Sync from SUSE:ALP:Source:Standard:1.0 python-eventlet revision 71bf11cbf6641840256ac9b36addbb4d diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fecc750 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/denose-eventlet.patch b/denose-eventlet.patch new file mode 100644 index 0000000..1c125ba --- /dev/null +++ b/denose-eventlet.patch @@ -0,0 +1,435 @@ +Index: eventlet-0.33.0/setup.py +=================================================================== +--- eventlet-0.33.0.orig/setup.py ++++ eventlet-0.33.0/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", +Index: eventlet-0.33.0/eventlet.egg-info/SOURCES.txt +=================================================================== +--- eventlet-0.33.0.orig/eventlet.egg-info/SOURCES.txt ++++ eventlet-0.33.0/eventlet.egg-info/SOURCES.txt +@@ -175,7 +175,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 +@@ -275,4 +274,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 +Index: eventlet-0.33.0/tests/greenio_test.py +=================================================================== +--- eventlet-0.33.0.orig/tests/greenio_test.py ++++ eventlet-0.33.0/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(): +Index: eventlet-0.33.0/tests/nosewrapper.py +=================================================================== +--- eventlet-0.33.0.orig/tests/nosewrapper.py ++++ eventlet-0.33.0/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() +Index: eventlet-0.33.0/tests/__init__.py +=================================================================== +--- eventlet-0.33.0.orig/tests/__init__.py ++++ eventlet-0.33.0/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) +Index: eventlet-0.33.0/tests/dagpool_test.py +=================================================================== +--- eventlet-0.33.0.orig/tests/dagpool_test.py ++++ eventlet-0.33.0/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""" +@@ -163,7 +162,7 @@ class Capture(object): + # 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 + + + # **************************************************************************** +@@ -191,14 +190,14 @@ def test_init(): + 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(): +@@ -216,10 +215,10 @@ def test_wait_each_preload(): + 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): +@@ -257,7 +256,7 @@ def test_wait_posted(): + 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")) +@@ -285,7 +284,7 @@ def test_spawn_collision_spawn(): + 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. +@@ -293,7 +292,7 @@ def test_spawn_collision_spawn(): + # 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. +@@ -324,60 +323,60 @@ def test_spawn_multiple(): + 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"], +@@ -432,13 +431,13 @@ def test_spawn_many(): + 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"]), +@@ -466,7 +465,7 @@ def test_wait_each_all(): + 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 +@@ -494,7 +493,7 @@ def test_kill(): + 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") +@@ -505,7 +504,7 @@ def test_kill(): + 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(): +@@ -533,7 +532,7 @@ def test_post_collision_spawn(): + 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) +@@ -553,10 +552,10 @@ def test_post_replace(): + 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): +@@ -598,14 +597,14 @@ def test_waitall_exc(): + 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(): +@@ -616,20 +615,20 @@ def test_propagate_exc(): + 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(): +@@ -681,13 +680,13 @@ def test_post_get_exc(): + 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) diff --git a/eventlet-0.33.3.tar.gz b/eventlet-0.33.3.tar.gz new file mode 100644 index 0000000..4b51860 --- /dev/null +++ b/eventlet-0.33.3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:722803e7eadff295347539da363d68ae155b8b26ae6a634474d0a920be73cfda +size 416190 diff --git a/fix-py3-rlock.patch b/fix-py3-rlock.patch new file mode 100644 index 0000000..ca87f75 --- /dev/null +++ b/fix-py3-rlock.patch @@ -0,0 +1,119 @@ +diff --git a/eventlet/patcher.py b/eventlet/patcher.py +index b249d6f19..4eeb93439 100644 +--- a/eventlet/patcher.py ++++ b/eventlet/patcher.py +@@ -412,6 +412,23 @@ def _green_existing_locks(): + elif py3_style and not isinstance(obj, pyrlock_type): + _fix_py3_rlock(obj) + ++ if (3, 0) <= sys.version_info <= (3, 10): ++ # Older py3 won't have RLocks show up in gc.get_objects() -- see ++ # https://github.com/eventlet/eventlet/issues/546 -- so green a handful ++ # that we know are significant ++ import logging ++ if isinstance(logging._lock, rlock_type): ++ _fix_py3_rlock(logging._lock) ++ logging._acquireLock() ++ try: ++ for ref in logging._handlerList: ++ handler = ref() ++ if handler and isinstance(handler.lock, rlock_type): ++ _fix_py3_rlock(handler.lock) ++ del handler ++ finally: ++ logging._releaseLock() ++ + + def _fix_py2_rlock(rlock, tid): + import eventlet.green.threading +@@ -425,7 +442,7 @@ def _fix_py2_rlock(rlock, tid): + + def _fix_py3_rlock(old): + import gc +- import threading ++ from eventlet.green import threading + new = threading._PyRLock() + while old._is_owned(): + old.release() +@@ -434,14 +451,23 @@ def _fix_py3_rlock(old): + new.acquire() + gc.collect() + for ref in gc.get_referrers(old): +- try: +- ref_vars = vars(ref) +- except TypeError: +- pass ++ if isinstance(ref, dict): ++ for k, v in ref.items(): ++ if v is old: ++ ref[k] = new ++ elif isinstance(ref, list): ++ for k, v in enumerate(ref): ++ if v is old: ++ ref[k] = new + else: +- for k, v in ref_vars.items(): +- if v == old: +- setattr(ref, k, new) ++ try: ++ ref_vars = vars(ref) ++ except TypeError: ++ pass ++ else: ++ for k, v in ref_vars.items(): ++ if v is old: ++ setattr(ref, k, new) + + + def _green_os_modules(): +diff --git a/tests/isolated/patcher_existing_logging_module_lock.py b/tests/isolated/patcher_existing_logging_module_lock.py +new file mode 100644 +index 000000000..2acad62ee +--- /dev/null ++++ b/tests/isolated/patcher_existing_logging_module_lock.py +@@ -0,0 +1,30 @@ ++# https://github.com/eventlet/eventlet/issues/730 ++# https://github.com/eventlet/eventlet/pull/754 ++__test__ = False ++ ++ ++if __name__ == "__main__": ++ import logging ++ import eventlet.patcher ++ eventlet.patcher.monkey_patch(thread=True) ++ import threading ++ ++ def take_and_release(): ++ try: ++ logging._lock.acquire() ++ finally: ++ logging._lock.release() ++ ++ assert logging._lock.acquire() ++ t = threading.Thread(target=take_and_release) ++ t.daemon = True ++ t.start() ++ ++ t.join(timeout=0.1) ++ # we should timeout, and the thread is still blocked waiting on the lock ++ assert t.is_alive() ++ ++ logging._lock.release() ++ t.join(timeout=0.1) ++ assert not t.is_alive() ++ print("pass") +diff --git a/tests/patcher_test.py b/tests/patcher_test.py +index dbf6e1c71..e8d6f3300 100644 +--- a/tests/patcher_test.py ++++ b/tests/patcher_test.py +@@ -485,6 +485,10 @@ def test_patcher_existing_locks_unlocked(): + tests.run_isolated('patcher_existing_locks_unlocked.py') + + ++def test_patcher_existing_logging_module_lock(): ++ tests.run_isolated('patcher_existing_logging_module_lock.py') ++ ++ + def test_importlib_lock(): + tests.run_isolated('patcher_importlib_lock.py') + diff --git a/newdnspython.patch b/newdnspython.patch new file mode 100644 index 0000000..10087c4 --- /dev/null +++ b/newdnspython.patch @@ -0,0 +1,20 @@ +--- eventlet-0.33.0.orig/tests/greendns_test.py ++++ eventlet-0.33.0/tests/greendns_test.py +@@ -888,7 +888,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] + +@@ -899,7 +899,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) diff --git a/python-eventlet-FTBFS2028.patch b/python-eventlet-FTBFS2028.patch new file mode 100644 index 0000000..15aee5b --- /dev/null +++ b/python-eventlet-FTBFS2028.patch @@ -0,0 +1,50 @@ +https://github.com/eventlet/eventlet/pull/643 + +From df6b965c1b03a688c643dc7f5845cb88287027d1 Mon Sep 17 00:00:00 2001 +From: "Bernhard M. Wiedemann" +Date: Fri, 28 Aug 2020 20:24:42 +0200 +Subject: [PATCH] Extend test cert to 2049 + +This change makes tests pass after 2028 +Background: +As part of my work on reproducible builds for openSUSE, I check that software still gives identical build results in the future. +The usual offset is +15 years, because that is how long I expect some software will be used in some places. +This showed up failing tests in our package build. + +See https://reproducible-builds.org/ for why this matters. +--- + tests/test_server.crt | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/tests/test_server.crt b/tests/test_server.crt +index 67c9adc8b..78759e810 100644 +--- a/tests/test_server.crt ++++ b/tests/test_server.crt +@@ -2,7 +2,7 @@ + MIIDwjCCAqqgAwIBAgIJAN19NW1oDKKtMA0GCSqGSIb3DQEBCwUAMHYxCzAJBgNV + BAYTAlRTMQ0wCwYDVQQIDARUZXN0MQ0wCwYDVQQHDARUZXN0MRYwFAYDVQQKDA1U + ZXN0IEV2ZW50bGV0MQ0wCwYDVQQLDARUZXN0MQ0wCwYDVQQDDARUZXN0MRMwEQYJ +-KoZIhvcNAQkBFgRUZXN0MB4XDTE4MDgyMjEzNDIxMVoXDTI4MDgxOTEzNDIxMVow ++KoZIhvcNAQkBFgRUZXN0MB4XDTIwMDgyODEzMTUxNloXDTQ5MTIzMTEzMTUxN1ow + djELMAkGA1UEBhMCVFMxDTALBgNVBAgMBFRlc3QxDTALBgNVBAcMBFRlc3QxFjAU + BgNVBAoMDVRlc3QgRXZlbnRsZXQxDTALBgNVBAsMBFRlc3QxDTALBgNVBAMMBFRl + c3QxEzARBgkqhkiG9w0BCQEWBFRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +@@ -13,11 +13,11 @@ Lvc6cJHMKaxHCeIBOL+z/9kJqhh30eqsmNB5AXSoV8b2B3MV3glW2vd5WJVYEWxl + 3+GNgzZJ3KGape7pcBYER7zg/yZLZxgNFlTCOZiysjNxC0liJA9tgUQhRc1gsqA8 + dQxzvqW8kuZedmatjyM58WixvjymobC3AgMBAAGjUzBRMB0GA1UdDgQWBBQT3V3f + 8vCoqGXe6zySSjVP+J/P7zAfBgNVHSMEGDAWgBQT3V3f8vCoqGXe6zySSjVP+J/P +-7zAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAws7zXsftw5s/P +-dnyFAf8q0WoVtWi9ljshWfJvTFMfuCqdSoNT+kIeQq071/RFW9YLqDZGXI4fyfzW +-50A7xFm+Syy7wPOmfLJdPx5HRJ5jgIDlij9vL45W3mXEohkkzMCdjwXfOIQPOEEx +-ZQHF57RaHlKEGexc/yvOLlOgKP23BOgB7pZjCC9divyDJ3ETlzgE+UTymHxmFM0i +-TCAM9dGEl1QPr7zA08rNgVae+/uQksdM55QmQFkTAXisFPcxNgHSKOSHsDiUJvWG +-7bJrwO6+T2wjRxWRD7anQV3DqBG1WteXA/dfYqjUi0QPqreWqNb+3OM60UwPJsvl +-ZDfUrsbY ++7zAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAowDu7bu/6DuLH ++yNv8Q27vhsHS2IbguGSTlpSObUqvIF1fv2UzjSl1jjmkN7IQqEjV7ql7NpmVGv5u ++4s5uKGID9q0Eq1wNKpqps16ABOb6I415j3NMq7r9bSNrlgPHrSYnySSyN2JyiXyR ++Q9wxY6YBQMHchFytYui9/A3WwmzfZkzZpN2AWlC/emiDlfbWT9bFO6tgImrD3BIi ++PJoTsc5SBmevUvOC6LPPIKq3/SdywgAi3AGKcyMlLhEjFX5lRA3GK3pDudRqKY2+ ++3n6WcOut0RytatsNYqIMVakIGC4ZCLi69xSLlRVVvxnfGgJxw+mHLtlQxDz2GoQ+ ++XAW8Yf8H + -----END CERTIFICATE----- diff --git a/python-eventlet.changes b/python-eventlet.changes new file mode 100644 index 0000000..3158cc5 --- /dev/null +++ b/python-eventlet.changes @@ -0,0 +1,632 @@ +------------------------------------------------------------------- +Fri Apr 21 12:24:43 UTC 2023 - Dirk Müller + +- add sle15_python_module_pythons (jsc#PED-68) + +------------------------------------------------------------------- +Thu Apr 13 22:41:06 UTC 2023 - Matej Cepl + +- Make calling of %{sle15modernpython} optional. + +------------------------------------------------------------------- +Thu Feb 16 22:15:50 UTC 2023 - Dirk Müller + +- update newdnspython.patch to not patch non-testsuite as + it breaks the functionality (bsc#1208126) + +------------------------------------------------------------------- +Tue Feb 14 11:33:57 UTC 2023 - Matej Cepl + +- Remove unnecessary obsolete dependency on pyzmq. +- Clean up the SPEC file. + +------------------------------------------------------------------- +Sat Jan 28 12:30:48 UTC 2023 - Dirk Müller + +- update to 0.33.3: + * dnspython 2.3.0 raised AttributeError: module 'dns.rdtypes' has no + attribute 'ANY' https://github.com/eventlet/eventlet/issues/781 + +------------------------------------------------------------------- +Tue Jan 17 16:55:46 UTC 2023 - Daniel Garcia + +- Add fix-py3-rlock.patch to make the code compatible with python 3.11, + gh#eventlet/eventlet#754 + +------------------------------------------------------------------- +Fri Dec 9 10:16:59 UTC 2022 - Thorsten Kukuk + +- Reove unecessary sysconfig-netconfig BuildRequires + +------------------------------------------------------------------- +Sat Dec 3 05:14:32 UTC 2022 - Yogalakshmi Arunachalam + +- Update to v0.33.2 + * Stop using deprecated threading APIs + Way back in py26, snake_case alternatives were added for the old + camelCase APIs. py310 started emitting DeprecationWarnings about them; + presumably they'll look to remove the old APIs eventually. See + +------------------------------------------------------------------- +Wed Nov 9 10:52:49 UTC 2022 - Pedro Monreal + +- Fix build with OpenSSL 3.0 [bsc#1205042] + * Temporarily disable test_017_ssl_zeroreturnerror + +------------------------------------------------------------------- +Wed Aug 17 06:46:05 UTC 2022 - Jiri Slaby + +- disable test_018b_http_10_keepalive_framing (bsc#1202188) + +------------------------------------------------------------------- +Sat Jun 4 15:20:56 UTC 2022 - Dirk Müller + +- update to 0.33.1: + * Prevent deadlock on logging._lock + +------------------------------------------------------------------- +Sun Dec 26 14:03:52 UTC 2021 - Bernhard Wiedemann + +- Add python-eventlet-FTBFS2028.patch to fix build in 2028 (boo#1102840) + +------------------------------------------------------------------- +Thu Dec 16 20:11:12 UTC 2021 - Ben Greiner + +- update to 0.33.0 + * green.thread: unlocked Lock().release() should raise exception, + returned True + * wsgi: Don’t break HTTP framing during 100-continue handling + * Python 3.10 partial support + * greendns: Create a DNS resolver lazily rather than on import + * ssl: GreenSSLContext minimum_version and maximum_version + setters +- Refresh denosing patches: merge remove_nose.patch and + remove_nose_part_2.patch into denose-eventlet.patch +- Refresh newdnspython.patch + +------------------------------------------------------------------- +Sun Nov 7 21:12:37 UTC 2021 - Dirk Müller + +- update to 0.32.0: + * greendns: compatibility with dnspython v2 + * green.ssl: wrap_socket now accepts argument `ciphers` + * websocket: control frames are now always uncompressed per RFC 7692 + * ssl: py3.6 using client certificates raised ValueError: check_hostname needs server_hostname argument + * IMPORTANT: websocket: Limit maximum uncompressed frame length to 8MiB + * wsgi: websocket ALREADY_HANDLED flag on corolocal + * green.ssl: Set suppress_ragged_eofs default based on SSLSocket defaults + * greenio: socket.connect_ex returned None instead of 0 on success + * Use _imp instead of deprecated imp +- drop pr_639.patch, merged upstream + +------------------------------------------------------------------- +Sun Mar 21 21:19:52 UTC 2021 - Ben Greiner + +- Update to 0.30.2 + * greendns: patch ssl to fix RecursionError on + SSLContext.options.__set__ #677 +- Release 0.30.1 + * patcher: built-in open() did not accept kwargs #683 +- Release 0.30.0 + * pyopenssl tsafe module was deprecated and removed in v20.0.0 + * deprecate pyevent hub + * Deprecate CPython 2.7 and 3.4 support + * py39: Add _at_fork_reinit method to Semaphores +- Drop pr_672-remove-OpenSSL-tsafe.patch merged upstream + +------------------------------------------------------------------- +Thu Dec 10 22:43:44 UTC 2020 - Benjamin Greiner + +- Add pr_672-remove-OpenSSL-tsafe.patch to support pyopenssl 20 +- skip some tests which are flaky inside OBS environment +- fix python2 build requirement for Leap + +------------------------------------------------------------------- +Mon Dec 7 00:14:23 UTC 2020 - Benjamin Greiner + +- Update to 0.29.1 + * patcher: [py27] recursion error in pytest/python2.7 installing + register_at_fork + * patcher: monkey_patch(builtins=True) failed on py3 because + `file` class is gone + * don't crash on PyPy 7.0.0 + * Only install monotonic on python2 +- Changes for 0.29.0 + * ssl: context wrapped listener fails accept() +- Changes for 0.28.1 + * Clean up TypeError in __del__ +- Changes for 0.28.0 + * Always remove the right listener from the hub + gh#enventlet/eventlet#645 +- Changes for 0.27.0 + * patcher: Clean up threading book-keeping at fork when + monkey-patched + * backdoor: handle disconnects better +- Fix test skips for non-default python 3.6 flavor + gh#openSUSE/python-rpm-macros#66 +- refresh newdnspython.patch + +------------------------------------------------------------------- +Wed Aug 19 15:28:03 UTC 2020 - Benjamin Greiner + +- 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 + +- 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 + +- Don't limit the upper version of dnspython. + +------------------------------------------------------------------- +Fri Aug 14 21:30:16 UTC 2020 - Matej Cepl + +- Add newdnspython.patch which makes eventlet work with new + dnspython 2.0.0. + +------------------------------------------------------------------- +Thu Aug 13 16:07:08 UTC 2020 - Matej Cepl + +- Add remove_nose.patch to remove dependency on nose (gh#eventlet/eventlet#638). + +------------------------------------------------------------------- +Thu Aug 13 14:07:43 UTC 2020 - Dirk Mueller + +- 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) + +------------------------------------------------------------------- +Wed Apr 29 10:49:14 UTC 2020 - Dirk Mueller + +- update to 0.25.2: + * green.ssl: redundant set_nonblocking() caused SSLWantReadError + +------------------------------------------------------------------- +Tue Sep 10 10:40:09 UTC 2019 - Ralf Haferkamp + +- Update to 0.25.1: + * wsgi (tests): Stop using deprecated cgi.parse_qs() to support Python 3.8; Thanks to Miro Hrončok + * os: Add workaround to `open` for pathlib on py 3.7; Thanks to David Szotten + +------------------------------------------------------------------- +Fri Jun 21 12:35:13 UTC 2019 - Hans-Peter Jansen + +- we don't want to obsolete python-doc: rather python-eventlet-doc, + which depends on python-eventlet, should get removed on update, + anyway. + +------------------------------------------------------------------- +Fri Jun 7 12:14:00 UTC 2019 - Tomáš Chvátal + +- Do not generate sphinx docu, it is online and now we have only + python3 Sphinx anyway +- Update to 0.25.0: + * Support for new python and ssl +- Remove patches that are in upstream release: + * 0001-IMPORTANT-late-import-in-use_hub-thread-race-caused-.patch + * 0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch + * 0002-Fix-for-Python-3.7-506.patch + * 0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch + +------------------------------------------------------------------- +Mon Apr 29 06:00:44 UTC 2019 - Thomas Bechtold + +- add 0001-ssl-connect-used-non-monotonic-time.time-for-timeout.patch +- add 0002-Fix-for-Python-3.7-506.patch and + add 0003-Fix-compatibility-with-Python-3.7-ssl.SSLSocket-531.patch + Both needed for python 3.7 compatibility + +------------------------------------------------------------------- +Mon Apr 29 04:30:11 UTC 2019 - Thomas Bechtold + +- add 0001-IMPORTANT-late-import-in-use_hub-thread-race-caused-.patch + Fixes a problem during tests runs with python 2.7: + RuntimeError: no suitable implementation for this system: \ + AttributeError("'module' object has no attribute 'epolls'",) + +------------------------------------------------------------------- +Thu Dec 6 15:31:02 UTC 2018 - Thomas Bechtold + +- update to 0.24.1: + * greendns: don't contact nameservers if one entry is returned from hosts file; Thanks to Daniel Alvarez + * greendns: Fix infinite loop when UDP source address mismatch; Thanks to Lon Hohberger + * greendns: Fix bad ipv6 comparison; Thanks to Lon Hohberger + * wsgi: Use byte strings on py2 and unicode strings on py3; Thanks to Tim Burke + * pools: put to empty pool would block sometimes; Thanks to Sam Merritt + * greendns: resolving over TCP produced ValueError; Thanks to Jaume Marhuenda + * support.greendns: ImportError when dns.rdtypes was imported before eventlet; Thanks to Jaume Marhuenda + * greendns: full comment lines were not skipped; Thanks to nat-goodspeed + * Drop support for Python3.3; Python2.6 and python-epoll package + * external dependencies for six, monotonic, dnspython; Thanks to nat-goodspeed + * wsgi: Don't strip all Unicode whitespace from headers on py3; Thanks to Tim Burke + * green.threading: current_thread() did not see new monkey-patched threads; Thanks to Jake Tesler + * tpool: exception in tpool-ed call leaked memory via backtrace + * wsgi: latin-1 encoding dance for environ[PATH_INFO] + * Fixed issue installing excess enum34 on Python3.4+ (rebuild with updated setuptools) + * event: Event.wait() timeout=None argument to be compatible with upstream CPython + * greendns: Treat /etc/hosts entries case-insensitive; Thanks to Ralf Haferkamp + * convenience: (SO_REUSEPORT) socket.error is not OSError on Python 2; Thanks to JacoFourie@github + * convenience: SO_REUSEPORT is not available on WSL platform (Linux on Windows) + * convenience: skip SO_REUSEPORT for bind on random port (0) + * dns: reading /etc/hosts raised DeprecationWarning for universal lines on Python 3.4+; Thanks to Chris Kerr + * green.openssl: Drop OpenSSL.rand support; Thanks to Haikel Guemar + * green.subprocess: keep CalledProcessError identity; Thanks to Linbing@github + * greendns: be explicit about expecting bytes from sock.recv; Thanks to Matt Bennett + * greendns: early socket.timeout was breaking IO retry loops + * GreenSocket.accept does not notify_open; Thanks to orishoshan + * patcher: set locked RLocks' owner only when patching existing locks; Thanks to Quan Tian + * patcher: workaround for monotonic "no suitable implementation"; Thanks to Geoffrey Thomas + * queue: empty except was catching too much + * socket: context manager support; Thanks to Miguel Grinberg + * support: update monotonic 1.3 (5c0322dc559bf) + * support: upgrade bundled dnspython to 1.16.0 (22e9de1d7957e) https://github.com/eventlet/eventlet/issues/427 + * websocket: fd leak when client did not close connection properly; Thanks to Konstantin Enchant + * websocket: support permessage-deflate extension; Thanks to Costas Christofi and Peter Kovary + * wsgi: close idle connections (also applies to websockets) + * wsgi: deprecated options are one step closer to removal + * wsgi: handle remote connection resets; Thanks to Stefan Nica + * New timeout error API: .is_timeout=True on exception object + It's now easy to test if network error is transient and retry is appropriate. + Please spread the word and invite other libraries to support this interface. + * hubs: use monotonic clock by default (bundled package); Thanks to Roman Podoliaka and Victor Stinner + * dns: EVENTLET_NO_GREENDNS option is back, green is still default + * dns: hosts file was consulted after nameservers + * ssl: RecursionError on Python3.6+; Thanks to justdoit0823@github and Gevent developers + * wsgi: log_output=False was not disabling startup and accepted messages + * greenio: Fixed OSError: [WinError 10038] Socket operation on nonsocket + * dns: EAI_NODATA was removed from RFC3493 and FreeBSD + * green.select: fix mark_as_closed() wrong number of args + * green.zmq: socket.{recv,send}_* signatures did not match recent upstream pyzmq + * New feature: Add zipkin tracing to eventlet + * db_pool: proxy Connection.set_isolation_level() + * green.zmq: support RCVTIMEO (receive timeout) + * green.profile: Python3 compatibility; Thanks to Artur Stawiarski + * support: upgrade bundled six to 1.10 (dbfbfc818e3d) + * python3.6: http.client.request support chunked_encoding + * dns: try unqualified queries as top level + * test_import_patched_defaults bended to play with pyopenssl>=16.1.0 + * Explicit environ flag for importing eventlet.__version__ without ignoring import errors + * Type check Semaphore, GreenPool arguments; Thanks to Matthew D. Pagel +- Drop 0001-Fix-SSL-connection-reset-errors.patch . Merged upstream +- Drop PR-459.patch . Merged upstream + +------------------------------------------------------------------- +Thu Dec 6 13:26:44 UTC 2018 - Tomáš Chvátal + +- Fix fdupes call + +------------------------------------------------------------------- +Tue Dec 4 12:47:46 UTC 2018 - Matej Cepl + +- Remove superfluous devel dependency for noarch package + +------------------------------------------------------------------- +Fri Jan 12 12:57:09 UTC 2018 - tbechtold@suse.com + +- Add PR-459.patch. + Hostname in /etc/hosts are not case-sensitive, this fixes + HostsResolver() accordingly. + +------------------------------------------------------------------- +Sun Dec 10 20:33:20 UTC 2017 - dmueller@suse.com + +- fix enum-compat removal + +------------------------------------------------------------------- +Sun Nov 26 16:02:38 UTC 2017 - dmueller@suse.com + +- go back to a working version: downgrade to 0.20.0 +- add 0001-Fix-SSL-connection-reset-errors.patch to fix + hangs on SSL connections + +------------------------------------------------------------------- +Tue Oct 17 09:05:52 UTC 2017 - snica@suse.com + +- add netcfg package to list of requirements + +------------------------------------------------------------------- +Fri Oct 6 07:35:07 UTC 2017 - tbechtold@suse.com + +- update to 0.21.0: + * New timeout error API: .is_timeout=True on exception object + It's now easy to test if network error is transient and retry is + appropriate. + Please spread the word and invite other libraries to support this interface. + * hubs: use monotonic clock by default (bundled package); + * dns: EVENTLET_NO_GREENDNS option is back, green is still default + * dns: hosts file was consulted after nameservers + * ssl: RecursionError on Python3.6+; + * wsgi: log_output=False was not disabling startup and accepted messages + * greenio: Fixed OSError: [WinError 10038] Socket operation on nonsocket + * dns: EAI_NODATA was removed from RFC3493 and FreeBSD + * green.select: fix mark_as_closed() wrong number of args + * green.zmq: socket.{recv,send}_* signatures did not match recent + upstream pyzmq + * New feature: Add zipkin tracing to eventlet + * db_pool: proxy Connection.set_isolation_level() + * green.zmq: support RCVTIMEO (receive timeout) + * green.profile: Python3 compatibility; Thanks to Artur Stawiarski + * support: upgrade bundled six to 1.10 (dbfbfc818e3d) + * python3.6: http.client.request support chunked_encoding +- Use fdupes + +------------------------------------------------------------------- +Tue Sep 5 21:50:25 UTC 2017 - jengelh@inai.de + +- Ensure neutrality of description. + +------------------------------------------------------------------- +Tue Sep 5 09:30:33 UTC 2017 - jmatejek@suse.com + +- remove dependency on metapackage "enum-compat" in favor of + specifying this requirement the usual way via RPM requirement + conditional on version + +------------------------------------------------------------------- +Thu Aug 24 13:38:29 UTC 2017 - jmatejek@suse.com + +- singlespec auto-conversion + +------------------------------------------------------------------- +Wed Jan 11 18:10:38 UTC 2017 - dmueller@suse.com + +- update to 0.20.1: + * dns: try unqualified queries as top level + * test_import_patched_defaults bended to play with pyopenssl>=16.1.0 + * Explicit environ flag for importing eventlet.__version__ without ignoring import errors + * Type check Semaphore, GreenPool arguments; Thanks to Matthew D. Pagel + * IMPORTANT: removed select.poll() function + * DNS resolving is always green with dnspython bundled in + * greenio: only trampoline when we block + * convenience: listen() sets SO_REUSEPORT when available; Thanks to Zhengwei Gao + * ssl: Fix "TypeError: read() argument 2 must be read-write bytes-like object, not None" + * greenio: _recv_loop behaviour with recv_into on closed sock + * ipv6: getaddrinfo would fail with scope index + * green.zmq: Support {send,recv}_{string,json,pyobj} wrappers + * greendns: Return answers from /etc/hosts despite nameserver errors + * patcher: fixed green existing locks fail (Python3) + * Add DAGPool, a dependency-driven greenthread pool + * wsgi: Unix socket address representation; Thanks to Samuel Merritt + * tpool: isolate internal socket from default timeout; Thanks to Alex Villacís Lasso + * wsgi: only skip Content-Type and Content-Length headers (GH-327) + * wsgi: 400 on blank Content-Length headers (GH-334) + * greenio: makefile related pypy socket ref counting + * ssl: Fix recv_into blocking when reading chunks of data + * websocket: support Gunicorn environ['gunicorn.socket'] + +------------------------------------------------------------------- +Sat Dec 3 18:15:53 UTC 2016 - dmueller@suse.com + +- update to 0.19.0: + * ssl: IMPORTANT DoS FIX do_handshake_connect=False in server accept(); + * green.urllib2: missing patched ssl module; + * wsgi: environ[headers_raw] tuple of unmodified name: value pairs + * test against modern pyopenssl 16.0.0 for Python 2.7+; + * wsgi: document compatibility with python `logging` + * Minor grammatical improvements and typo fixes to the docs + +------------------------------------------------------------------- +Fri Feb 26 19:02:50 UTC 2016 - dmueller@suse.com + +- update to 0.18.4: + * wsgi: change TCP_NODELAY to TCP_QUICKACK, ignore socket error when not available + * wsgi: Use buffered writes - fixes partial socket.send without custom + writelines(); Github issue #295 + * wsgi: TCP_NODELAY enabled by default + * wsgi: Fix data loss on partial writes (socket.send); Thanks to Jakub Stasiak + * IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1 + * patcher: Fix AttributeError in subprocess communicate() + * greenio: Fix "TypeError: an integer is required" in sendto() + * IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1 + * greenio: Fixed a bug that could cause send() to start an endless loop on + ENOTCONN; Thanks to Seyeong Kim + * wsgi: Fixed UNIX socket address being trimmed in "wsgi starting" log; Thanks + to Ihar Hrachyshka + * ssl: Ported eventlet.green.OpenSSL to Python 3; Thanks to Victor Stinner + * greenio: Made read() support buflen=-1 and added readall() (Python 3); + Thanks to David Szotten + * wsgi: Made the error raised in case of chunk read failures more precise (this + should be backwards compatible as the new exception class, + wsgi.ChunkReadError, is a subclass of ValueError which was being used there + before); Thanks to Samuel Merritt + * greenio: Fixed socket.recv() sometimes returning str instead of bytes on + Python 3; Thanks to Janusz Harkot + * wsgi: Improved request body discarding + * websocket: Fixed TypeError on empty websocket message (Python 3); Thanks to + Fukuchi Daisuke + * subprocess: Fixed universal_newlines support + * wsgi: Output of 0-byte chunks is now suppressed; Thanks to Samuel Merritt + * Improved the documentation; Thanks to Ramakrishnan G, ashutosh-mishra and + Azhar Hussain + * greenio: Changed GreenFileIO.write() (Python 3) to always write all data to + match the behavior on Python 2; Thanks to Victor Stinner + * subprocess: Fixed missing subprocess.mswindows attribute on Python 3.5; + Thanks to Josh VanderLinden + * ssl/monkey patching: Fixed a bug that would cause merely importing eventlet + to monkey patch the ssl module; Thanks to David Szotten + * documentation: Added support for building plain text documentation; thanks + to Levente Polyak + +------------------------------------------------------------------- +Mon Jun 22 14:29:32 UTC 2015 - tbechtold@suse.com + +- update to 0.17.4: + * ssl: incorrect initalization of default context; Thanks to stuart-mclaren + +------------------------------------------------------------------- +Wed Apr 22 13:11:05 UTC 2015 - tbechtold@suse.com + +- update to 0.17.3: + * green.thread: Python3.3+ fixes; Thanks to Victor Stinner + * Semaphore.acquire() accepts timeout=-1; Thanks to Victor Stinner + * wsgi: Provide python logging compatibility; Thanks to Sean Dague + * greendns: fix premature connection closing in DNS proxy; Thanks to + Tim Simmons + * greenio: correct fd close; Thanks to Antonio Cuni and Victor Sergeyev + * green.ssl: HTTPS client Python 2.7.9+ compatibility + * setup: tests.{isolated,manual} polluted top-level packages + * greendns: fix dns.name import and Python3 compatibility + +------------------------------------------------------------------- +Tue Feb 24 11:12:59 UTC 2015 - tbechtold@suse.com + +- update to version 0.17.0 + * Full Python3 compatibility + * greendns: IPv6 support, improved handling of /etc/hosts + * tpool: make sure we return results during killall + * semaphore: Don't hog a semaphore if someone else is waiting for it + * green.socket: create_connection() was wrapping all exceptions + in socket.error + * Make sure SSL retries are done using the exact same data buffer + * greenio: shutdown already closed sockets without error + +------------------------------------------------------------------- +Mon Feb 2 08:47:34 UTC 2015 - tbechtold@suse.com + +- update to version 0.16.1: + * Wheel build 0.16.0 incorrectly shipped removed module eventlet.util. + +------------------------------------------------------------------- +Thu Jan 8 13:56:43 UTC 2015 - tbechtold@suse.com + +- update to 0.16.0: + * Fix SSL socket wrapping and Python 2.7.9 compatibility; Thanks to Jakub Stasiak + * Fix monkey_patch() on Python 3; Thanks to Victor Stinner + * Fix "maximum recursion depth exceeded in GreenSocket.__del__"; Thanks to Jakub Stasiak + * db_pool: BaseConnectionPool.clear updates .current_size #139; Thanks to Andrey Gubarev + * Fix __str__ method on the TimeoutExpired exception class.; Thanks to Tomaz Muraus + * hubs: drop Twisted support + * Removed deprecated modules: api, most of coros, pool, proc, processes and util + * Improved Python 3 compatibility (including patch by raylu); Thanks to Jakub Stasiak + * Allow more graceful shutdown of wsgi server; Thanks to Stuart McLaren + * wsgi.input: Make send_hundred_continue_headers() a public API; Thanks to Tushar Gohad + * tpool: Windows compatibility, fix ResourceWarning. Thanks to Victor Stinner + * tests: Fix timers not cleaned up on MySQL test skips; Thanks to Corey Wright +- Remove README.twisted from docs (removed upstream) + +------------------------------------------------------------------- +Tue Sep 2 08:00:50 UTC 2014 - dmueller@suse.com + +- update to 0.15.2: + * greenio: fixed memory leak, introduced in 0.15.1; Thanks to Michael Kerrin, Tushar Gohad + * wsgi: Support optional headers w/ "100 Continue" responses; Thanks to Tushar Gohad + * greenio: Fix second simultaneous read (parallel paramiko issue); Thanks to Jan Grant, Michael Kerrin + * db_pool: customizable connection cleanup function; Thanks to Avery Fay + * Python3 compatibility -- **not ready yet**; Thanks to Astrum Kuo, Davanum Srinivas, Jakub Stasiak, Victor Sergeyev + * coros: remove Actor which was deprecated in 2010-01 + * saranwrap: remove saranwrap which was deprecated in 2010-02 + * PyPy compatibility fixes; Thanks to Dmitriy Kruglyak, Jakub Stasiak + * green.profile: accumulate results between runs; Thanks to Zhang Hua + * greenthread: add .unlink() method; Thanks to Astrum Kuo + * packaging: Generate universal wheels; Thanks to Jakub Stasiak + * queue: Make join not wait if there are no unfinished tasks; Thanks to Jakub Stasiak + * tpool: proxy __enter__, __exit__ fixes Bitbucket-158; Thanks to Eric Urban + * websockets: Add websockets13 support; handle lack of Upgrade header; Thanks to Edward George + * wsgi: capitalize_response_headers option + +------------------------------------------------------------------- +Thu Oct 24 11:05:29 UTC 2013 - speilicke@suse.com + +- Require python-setuptools instead of distribute (upstreams merged) + +------------------------------------------------------------------- +Tue Sep 17 08:56:56 UTC 2013 - dmueller@suse.com + +- update to 0.14.0: + * wsgi: handle connection socket timeouts; Thanks to Paul Oppenheim + * wsgi: close timed out client connections + * greenio: socket pypy compatibility; Thanks to Alex Gaynor + * wsgi: env['wsgi.input'] was returning 1 byte strings; Thanks to Eric Urban + * green.ssl: fix NameError; Github #17; Thanks to Jakub Stasiak + * websocket: allow "websocket" in lowercase in Upgrade header; Compatibility with current Google Chrome; Thanks to Dmitry Orlov + * wsgi: allow minimum_chunk_size to be overriden on a per request basis; Thanks to David Goetz + * wsgi: configurable socket_timeout + +------------------------------------------------------------------- +Wed Jul 3 15:42:06 UTC 2013 - dmueller@suse.com + +- update to 0.13.1: + * hubs: kqueue support! Thanks to YAMAMOTO Takashi, Edward George + * greenio: Fix AttributeError on MacOSX; Bitbucket #136; Thanks to Derk Tegeler + * green: subprocess: Fix subprocess.communicate() block on Python 2.7; Thanks to Edward George + * green: select: ensure that hub can .wait() at least once before timeout; Thanks to YAMAMOTO Takashi + * tpool: single request queue to avoid deadlocks; Bitbucket pull request 31,32; Thanks to Edward George + * zmq: pyzmq 13.x compatibility; Thanks to Edward George + * green: subprocess: Popen.wait() accepts new `timeout` kwarg; Python 3.3 and RHEL 6.1 compatibility + * hubs: EVENTLET_HUB can point to external modules; Thanks to Edward George + * semaphore: support timeout for acquire(); Thanks to Justin Patrin + * support: do not clear sys.exc_info if can be preserved (greenlet >= 0.3.2); Thanks to Edward George + * Travis continous integration; Thanks to Thomas Grainger, Jakub Stasiak + * wsgi: minimum_chunk_size of last Server altered all previous (global variable); Thanks to Jakub Stasiak + * doc: hubs: Point to the correct function in exception message; Thanks to Floris Bruynooghe + +------------------------------------------------------------------- +Fri Feb 8 11:19:25 UTC 2013 - p.drouand@gmail.com + +- Update to version 0.12.1: + * zmq: Fix 100% busy CPU in idle after .bind(PUB) + * greenio: Fix socket.settimeout() did not switch back to blocking mode + * greenio: socket.dup() made excess fcntl syscalls + * setup: Remove legacy --without-greenlet option and unused httplib2 dependency + * wsgi: environ[REMOTE_PORT], also available in log_format, log accept event + * tests: Support libzmq 3.0 SNDHWM option + +------------------------------------------------------------------- +Tue Jan 15 19:53:02 UTC 2013 - p.drouand@gmail.com + +- Update to version 0.11.0: + * ssl: Fix 100% busy CPU in socket.sendall() (thanks to Raymon Lu) + * zmq: Return linger argument to Socket.close() (thanks to Eric Windisch) + * tests: SSL tests were always skipped due to bug in skip_if_no_ssl decorator + +------------------------------------------------------------------- +Fri Nov 23 10:57:40 UTC 2012 - saschpe@suse.de + +- Update to version 0.9.17: + + ZeroMQ support calling send and recv from multiple greenthreads + + SSL: unwrap() sends data, and so it needs trampolining + + hubs.epolls: Fix imports for exception handler + + db_pool: Fix .clear() when min_size > 0 + + db_pool: Add MySQL's insert_id() method + + db_pool: Close connections after timeout, fix get-after-close race + condition with using TpooledConnectionPool + + threading monkey patch fixes + + pools: Better accounting of current_size in pools.Pool + + wsgi: environ['RAW_PATH_INFO'] with request path as received from client + + wsgi: log_output flag + + wsgi: Limit HTTP header size + + wsgi: Configurable maximum URL length + +------------------------------------------------------------------- +Fri Sep 2 11:36:04 UTC 2011 - saschpe@suse.de + +- Update to version 0.9.16: + + SO_REUSEADDR now correctly set. +- Don't package unittests +- Fix non-executable script rpmlint warning + +------------------------------------------------------------------- +Wed Feb 2 14:13:32 CET 2011 - berendt@b1-systems.de + +- bumped version to 0.9.14 + +------------------------------------------------------------------- +Fri Nov 26 14:44:42 UTC 2010 - seife+obs@b1-systems.com + +- initial package (version 0.9.9) + + diff --git a/python-eventlet.spec b/python-eventlet.spec new file mode 100644 index 0000000..3cb7517 --- /dev/null +++ b/python-eventlet.spec @@ -0,0 +1,119 @@ +# +# spec file for package python-eventlet +# +# Copyright (c) 2023 SUSE LLC +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +%define skip_python2 1 +%{?sle15_python_module_pythons} +Name: python-eventlet +Version: 0.33.3 +Release: 0 +Summary: Concurrent networking library for Python +License: MIT +Group: Development/Languages/Python +URL: https://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 mcepl@suse.com +# Removes dependency on nose +Patch0: denose-eventlet.patch +# PATCH-FIX-UPSTREAM newdnspython.patch mcepl@suse.com -- patch is from gh#rthalley/dnspython#519, discussion in gh#eventlet/eventlet#638 +Patch1: newdnspython.patch +# PATCH-FIX-UPSTREAM https://github.com/eventlet/eventlet/pull/643 +Patch2: python-eventlet-FTBFS2028.patch +# PATCH-FIX-UPSTREAM fix-py3-rlock.patch gh#eventlet/eventlet#754 +Patch3: fix-py3-rlock.patch +BuildRequires: %{python_module setuptools} +BuildRequires: fdupes +BuildRequires: python-rpm-macros +Requires: netcfg +Requires: python-dnspython >= 1.15.0 +Requires: python-greenlet >= 0.3 +Requires: python-six >= 1.10.0 +BuildArch: noarch +# SECTION TEST requirements +BuildRequires: %{python_module dnspython >= 1.15.0} +BuildRequires: %{python_module greenlet >= 0.3} +BuildRequires: %{python_module pytest} +BuildRequires: %{python_module six >= 1.10.0} +BuildRequires: %{python_module testsuite} +# eventlet parses /etc/protocols which is not available in normal build envs +BuildRequires: netcfg +%if 0%{?suse_version} >= 1550 +BuildRequires: %{python_module pyOpenSSL} +%endif +# /SECTION +%python_subpackages + +%description +Eventlet is a concurrent networking library for Python that allows +changing how code is run. + +It uses epoll or libevent for scalable non-blocking I/O. Coroutines +ensure that the developer uses a blocking style of programming that is similar +to threading, but provide the benefits of non-blocking I/O. The event dispatch +is implicit, which means Eventlet can be used from the Python +interpreter, or as part of a larger application. + +%prep +%setup -q -n eventlet-%{version} +%autopatch -p1 + +# Fix non-executable script +sed -i '1{/^#!/ d}' eventlet/support/greendns.py + +%build +%python_build + +%install +%python_install +%python_expand %fdupes %{buildroot}%{$python_sitelib} + +%check +# python2 is required to build for Leap, but tests fail (even upstream) +python2_pytest_param='--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 or test_clear" +# These are flaky inside the OBS environment +skiptests+=" or test_fork_after_monkey_patch or test_send_1k_req_rep or test_cpu_usage_after_bind" +# tracebacks in denosed suite with pytest inside obs presumably work different than when upstream is running nose? +skiptests+=" or test_leakage_from_tracebacks" +# temporarily disable to build with OpenSSL 3.0 bsc#1205042 +skiptests+=" or test_017_ssl_zeroreturnerror" +# it is racy, see: https://lore.kernel.org/all/CADVnQy=AnJY9NZ3w_xNghEG80-DhsXL0r_vEtkr=dmz0ugcoVw@mail.gmail.com/ (bsc#1202188) +skiptests+=" or test_018b_http_10_keepalive_framing" + +# Unknown Python 3.6 specific errors +# TypeError: _wrap_socket() argument 1 must be _socket.socket, not SSLSocket +# https://github.com/rthalley/dnspython/issues/559#issuecomment-675274960 +python36_skiptests+=" or test_connect_ssl or test_ssl_sending_messages or test_wrap_ssl" +python36_skiptests+=" or ssl_test or wsgi_test" +python3_skiptests+="$python36_skiptests" +# https://github.com/eventlet/eventlet/issues/730 +python310_skiptests+=" or test_patcher_existing_locks_locked" +# https://github.com/eventlet/eventlet/issues/739 +python310_skiptests+=" or test_017_ssl_zeroreturnerror" +# no subdir recursion https://github.com/eventlet/eventlet/issues/638#issuecomment-676085599 +%pytest -o norecursedirs="tests/*" -k "not ($skiptests ${$python_skiptests})" ${$python_pytest_param} + +%files %{python_files} +%license LICENSE +%doc AUTHORS NEWS README.rst +%{python_sitelib}/eventlet +%{python_sitelib}/eventlet-%{version}*-info + +%changelog