Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-eventlet for openSUSE:Factory
checked in at 2026-04-08 17:13:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-eventlet (Old)
and /work/SRC/openSUSE:Factory/.python-eventlet.new.21863 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-eventlet"
Wed Apr 8 17:13:20 2026 rev:67 rq:1344793 version:0.41.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-eventlet/python-eventlet.changes
2025-12-10 15:31:01.927521890 +0100
+++
/work/SRC/openSUSE:Factory/.python-eventlet.new.21863/python-eventlet.changes
2026-04-08 17:13:24.334185912 +0200
@@ -1,0 +2,9 @@
+Mon Apr 6 20:51:11 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 0.41.0:
+ * Switch to 3.14 for testing (#1086)
+ * Drop 3.9 support (#1085)
+ * More visible deprecation (#1077)
+- update BuildRequires from pyproject.toml
+
+-------------------------------------------------------------------
Old:
----
eventlet-0.40.4.tar.gz
New:
----
eventlet-0.41.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-eventlet.spec ++++++
--- /var/tmp/diff_new_pack.S8QrOW/_old 2026-04-08 17:13:25.134218804 +0200
+++ /var/tmp/diff_new_pack.S8QrOW/_new 2026-04-08 17:13:25.138218969 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-eventlet
#
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,14 +18,15 @@
%{?sle15_python_module_pythons}
Name: python-eventlet
-Version: 0.40.4
+Version: 0.41.0
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
-BuildRequires: %{python_module hatch-vcs}
+BuildRequires: %{python_module hatch-vcs >= 0.3}
+BuildRequires: %{python_module hatchling >= 1.12.2}
BuildRequires: %{python_module pip}
BuildRequires: %{python_module wheel}
BuildRequires: fdupes
++++++ eventlet-0.40.4.tar.gz -> eventlet-0.41.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/.github/workflows/test.yaml
new/eventlet-0.41.0/.github/workflows/test.yaml
--- old/eventlet-0.40.4/.github/workflows/test.yaml 2020-02-02
01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/.github/workflows/test.yaml 2020-02-02
01:00:00.000000000 +0100
@@ -30,12 +30,7 @@
fail-fast: false
matrix:
include:
- - { py: 3.9, toxenv: py39-epolls, os: ubuntu-latest }
- - { py: 3.9, toxenv: py39-openssl, os: ubuntu-latest }
- - { py: 3.9, toxenv: py39-poll, os: ubuntu-latest }
- - { py: 3.9, toxenv: py39-selects, os: ubuntu-latest }
- - { py: 3.9, toxenv: py39-dnspython1, os: ubuntu-latest }
- - { py: 3.9, toxenv: py39-asyncio, os: ubuntu-latest }
+ - { py: "3.10", toxenv: py310-openssl, os: ubuntu-latest }
- { py: "3.10", toxenv: py310-epolls, os: ubuntu-latest }
- { py: "3.10", toxenv: py310-poll, os: ubuntu-latest }
- { py: "3.10", toxenv: py310-selects, os: ubuntu-latest }
@@ -47,8 +42,8 @@
- { py: "3.12", toxenv: py312-asyncio, os: ubuntu-latest }
- { py: "3.13", toxenv: py313-epolls, os: ubuntu-latest }
- { py: "3.13", toxenv: py313-asyncio, os: ubuntu-latest }
- - { py: "3.14.0-rc.2", toxenv: py314-epolls, os: ubuntu-latest }
- - { py: "3.14.0-rc.2", toxenv: py314-asyncio, os: ubuntu-latest }
+ - { py: "3.14", toxenv: py314-epolls, os: ubuntu-latest }
+ - { py: "3.14", toxenv: py314-asyncio, os: ubuntu-latest }
steps:
- name: install system packages
@@ -97,7 +92,7 @@
include:
- { py: "3.12", toxenv: py312-asyncio, ignore-error: false, os:
macos-latest }
- { py: "3.13", toxenv: py313-asyncio, ignore-error: false, os:
macos-latest }
- - { py: "3.14.0-rc.2", toxenv: py314-asyncio, ignore-error: false,
os: macos-latest }
+ - { py: "3.14", toxenv: py314-asyncio, ignore-error: false, os:
macos-latest }
# This isn't working very well at the moment, but that might just be
# tox config? In any case main focus is on asyncio so someone can
# revisit separately.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/NEWS new/eventlet-0.41.0/NEWS
--- old/eventlet-0.40.4/NEWS 2020-02-02 01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/NEWS 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,13 @@
Unreleased
==========
+0.41.0
+======
+
+* Switch to 3.14 for testing (#1086)
+* Drop 3.9 support (#1085)
+* More visible deprecation (#1077)
+
0.40.4
======
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/PKG-INFO new/eventlet-0.41.0/PKG-INFO
--- old/eventlet-0.40.4/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: eventlet
-Version: 0.40.4
+Version: 0.41.0
Summary: Highly concurrent networking library
Project-URL: Homepage, https://github.com/eventlet/eventlet
Project-URL: History, https://github.com/eventlet/eventlet/blob/master/NEWS
@@ -19,7 +19,6 @@
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
@@ -27,7 +26,7 @@
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Internet
Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Requires-Python: >=3.9
+Requires-Python: >=3.10
Requires-Dist: dnspython>=1.15.0
Requires-Dist: greenlet>=1.0
Provides-Extra: dev
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/doc/source/index.rst
new/eventlet-0.41.0/doc/source/index.rst
--- old/eventlet-0.40.4/doc/source/index.rst 2020-02-02 01:00:00.000000000
+0100
+++ new/eventlet-0.41.0/doc/source/index.rst 2020-02-02 01:00:00.000000000
+0100
@@ -74,7 +74,7 @@
Supported Python Versions
=========================
-Currently supporting CPython 3.9+.
+Currently supporting CPython 3.10+.
Concepts & References
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/eventlet/__init__.py
new/eventlet-0.41.0/eventlet/__init__.py
--- old/eventlet-0.40.4/eventlet/__init__.py 2020-02-02 01:00:00.000000000
+0100
+++ new/eventlet-0.41.0/eventlet/__init__.py 2020-02-02 01:00:00.000000000
+0100
@@ -98,6 +98,11 @@
https://eventlet.readthedocs.io/en/latest/asyncio/migration.html
"""
+class EventletDeprecationWarning(Warning):
+ """
+ A DeprecationWarning that is more visible than the built-in one.
+ """
+
# If we're running tests this adds extra output that messes up some assertions.
if os.environ.get("EVENTLET_TESTS") is None:
- warnings.warn(_DEPRECATED, DeprecationWarning, stacklevel=2)
+ warnings.warn(_DEPRECATED, EventletDeprecationWarning, stacklevel=2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/eventlet/_version.py
new/eventlet-0.41.0/eventlet/_version.py
--- old/eventlet-0.40.4/eventlet/_version.py 2020-02-02 01:00:00.000000000
+0100
+++ new/eventlet-0.41.0/eventlet/_version.py 2020-02-02 01:00:00.000000000
+0100
@@ -1,5 +1,6 @@
-# file generated by setuptools-scm
+# file generated by vcs-versioning
# don't change, don't track in version control
+from __future__ import annotations
__all__ = [
"__version__",
@@ -10,25 +11,14 @@
"commit_id",
]
-TYPE_CHECKING = False
-if TYPE_CHECKING:
- from typing import Tuple
- from typing import Union
-
- VERSION_TUPLE = Tuple[Union[int, str], ...]
- COMMIT_ID = Union[str, None]
-else:
- VERSION_TUPLE = object
- COMMIT_ID = object
-
version: str
__version__: str
-__version_tuple__: VERSION_TUPLE
-version_tuple: VERSION_TUPLE
-commit_id: COMMIT_ID
-__commit_id__: COMMIT_ID
+__version_tuple__: tuple[int | str, ...]
+version_tuple: tuple[int | str, ...]
+commit_id: str | None
+__commit_id__: str | None
-__version__ = version = '0.40.4'
-__version_tuple__ = version_tuple = (0, 40, 4)
+__version__ = version = '0.41.0'
+__version_tuple__ = version_tuple = (0, 41, 0)
__commit_id__ = commit_id = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/eventlet/hubs/__init__.py
new/eventlet-0.41.0/eventlet/hubs/__init__.py
--- old/eventlet-0.40.4/eventlet/hubs/__init__.py 2020-02-02
01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/eventlet/hubs/__init__.py 2020-02-02
01:00:00.000000000 +0100
@@ -108,6 +108,8 @@
except AttributeError:
use_hub()
hub = _threadlocal.hub = _threadlocal.Hub()
+ if hasattr(hub, "_post_initialize"):
+ hub._post_initialize()
return hub
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/eventlet/hubs/asyncio.py
new/eventlet-0.41.0/eventlet/hubs/asyncio.py
--- old/eventlet-0.40.4/eventlet/hubs/asyncio.py 2020-02-02
01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/eventlet/hubs/asyncio.py 2020-02-02
01:00:00.000000000 +0100
@@ -33,29 +33,42 @@
def __init__(self):
super().__init__()
+ def _post_initialize(self):
+ """
+ Split off, because some of this ends up calling get_hub() again and so
+ we end up with two Hubs.
+ """
# Pre-emptively make sure we're using the right modules:
_unmonkey_patch_asyncio_all()
# The presumption is that eventlet is driving the event loop, so we
# want a new one we control.
import asyncio
-
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
self.sleep_event = asyncio.Event()
+ # Allow post-fork() child to continue using the same event loop.
+ # This is a terrible idea.
import asyncio.events
- if hasattr(asyncio.events, "on_fork"):
- # Allow post-fork() child to continue using the same event loop.
- # This is a terrible idea.
- asyncio.events.on_fork.__code__ = (lambda: None).__code__
- else:
- # On Python 3.9-3.11, there's a thread local we need to reset.
- # Also a terrible idea.
- def re_register_loop(loop=self.loop):
- asyncio.events._set_running_loop(loop)
- os.register_at_fork(after_in_child=re_register_loop)
+ def re_register_loop(loop=self.loop):
+ asyncio.events._set_running_loop(loop)
+
+ os.register_at_fork(after_in_child=re_register_loop)
+
+ import asyncio.tasks
+ if hasattr(asyncio.tasks, "_swap_current_task"):
+ task_to_restore = []
+
+ def re_register_task(task=task_to_restore, loop=self.loop):
+ if task_to_restore:
+ asyncio.tasks._swap_current_task(loop, task_to_restore[0])
+
+ def store_task():
+ task_to_restore.append(asyncio.tasks.current_task())
+
+ os.register_at_fork(after_in_child=re_register_task,
before=store_task)
def add_timer(self, timer):
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/eventlet/patcher.py
new/eventlet-0.41.0/eventlet/patcher.py
--- old/eventlet-0.40.4/eventlet/patcher.py 2020-02-02 01:00:00.000000000
+0100
+++ new/eventlet-0.41.0/eventlet/patcher.py 2020-02-02 01:00:00.000000000
+0100
@@ -4,7 +4,9 @@
import _imp as imp
except ImportError:
import imp
+import asyncio as asyncio_module
import importlib
+import pkgutil
import sys
try:
@@ -248,7 +250,7 @@
import asyncio.base_futures
if hasattr(asyncio.base_futures, "get_ident"):
- asyncio.base_futures = original_module.get_ident
+ asyncio.base_futures.get_ident = original_module.get_ident
# Asyncio uses these for its blocking thread pool:
if to_unpatch in ("threading", "queue"):
@@ -265,37 +267,9 @@
concurrent.futures.thread.queue = original_module
# Patch asyncio modules:
- for module_name in [
- "asyncio.base_events",
- "asyncio.base_futures",
- "asyncio.base_subprocess",
- "asyncio.base_tasks",
- "asyncio.constants",
- "asyncio.coroutines",
- "asyncio.events",
- "asyncio.exceptions",
- "asyncio.format_helpers",
- "asyncio.futures",
- "asyncio",
- "asyncio.locks",
- "asyncio.log",
- "asyncio.mixins",
- "asyncio.protocols",
- "asyncio.queues",
- "asyncio.runners",
- "asyncio.selector_events",
- "asyncio.sslproto",
- "asyncio.staggered",
- "asyncio.streams",
- "asyncio.subprocess",
- "asyncio.taskgroups",
- "asyncio.tasks",
- "asyncio.threads",
- "asyncio.timeouts",
- "asyncio.transports",
- "asyncio.trsock",
- "asyncio.unix_events",
- ]:
+ modules = ["asyncio.{0}".format(name) for _, name, _ in
pkgutil.walk_packages(asyncio_module.__path__)]
+ modules.append("asyncio")
+ for module_name in modules:
try:
module = importlib.import_module(module_name)
except ImportError:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/pyproject.toml
new/eventlet-0.41.0/pyproject.toml
--- old/eventlet-0.40.4/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
@@ -17,7 +17,7 @@
]
description = "Highly concurrent networking library"
readme = "README.rst"
-requires-python = ">=3.9"
+requires-python = ">=3.10"
license = {text = "MIT"}
classifiers = [
"Development Status :: 4 - Beta",
@@ -27,7 +27,6 @@
"Operating System :: Microsoft :: Windows",
"Operating System :: POSIX",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/tests/__init__.py
new/eventlet-0.41.0/tests/__init__.py
--- old/eventlet-0.40.4/tests/__init__.py 2020-02-02 01:00:00.000000000
+0100
+++ new/eventlet-0.41.0/tests/__init__.py 2020-02-02 01:00:00.000000000
+0100
@@ -257,17 +257,6 @@
raise OSError(errno.ENOENT, 'Command not found: %r' % command)
-def silence_warnings(func):
- def wrapper(*args, **kw):
- warnings.simplefilter('ignore', DeprecationWarning)
- try:
- return func(*args, **kw)
- finally:
- warnings.simplefilter('default', DeprecationWarning)
- wrapper.__name__ = func.__name__
- return wrapper
-
-
def get_database_auth():
"""Retrieves a dict of connection parameters for connecting to test
databases.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/eventlet-0.40.4/tests/isolated/fork_in_main_thread.py
new/eventlet-0.41.0/tests/isolated/fork_in_main_thread.py
--- old/eventlet-0.40.4/tests/isolated/fork_in_main_thread.py 2020-02-02
01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/tests/isolated/fork_in_main_thread.py 2020-02-02
01:00:00.000000000 +0100
@@ -1,3 +1,7 @@
+import warnings
+# Suppress all warnings for this test to ensure clean output
+warnings.filterwarnings("ignore")
+
import eventlet
eventlet.monkey_patch()
@@ -43,5 +47,13 @@
check_current()
assert results == {"background", "forker"}, results
+
+# Make sure we can launch new threadlets:
+l = []
+t = threading.Thread(target=lambda: l.append(1))
+t.start()
+t.join()
+assert l == [1]
+
if parent:
print("pass")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/tests/isolated/fork_in_thread.py
new/eventlet-0.41.0/tests/isolated/fork_in_thread.py
--- old/eventlet-0.40.4/tests/isolated/fork_in_thread.py 2020-02-02
01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/tests/isolated/fork_in_thread.py 2020-02-02
01:00:00.000000000 +0100
@@ -1,3 +1,7 @@
+import warnings
+# Suppress all warnings for this test to ensure clean output
+warnings.filterwarnings("ignore")
+
import eventlet
eventlet.monkey_patch()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/tests/socket_test.py
new/eventlet-0.41.0/tests/socket_test.py
--- old/eventlet-0.40.4/tests/socket_test.py 2020-02-02 01:00:00.000000000
+0100
+++ new/eventlet-0.41.0/tests/socket_test.py 2020-02-02 01:00:00.000000000
+0100
@@ -28,11 +28,12 @@
def server():
sock = eventlet.listen(('127.0.0.1', 0))
addr[:] = sock.getsockname()
- eventlet.sleep(0.2)
+ eventlet.sleep(1.0)
server_thread = threading.Thread(target=server)
server_thread.start()
- eventlet.sleep(0.1)
+ eventlet.sleep(0.5)
+ assert addr, f"{addr} wasn't set by server?"
sock = eventlet.connect(tuple(addr))
s = sock.recv(1)
assert isinstance(s, bytes)
@@ -48,11 +49,12 @@
def server():
sock = eventlet.listen(('127.0.0.1', 0))
addr[:] = sock.getsockname()
- eventlet.sleep(0.2)
+ eventlet.sleep(1.0)
server_thread = threading.Thread(target=server)
server_thread.start()
- eventlet.sleep(0.1)
+ eventlet.sleep(0.5)
+ assert addr, f"{addr} wasn't set by server?"
sock = eventlet.connect(tuple(addr))
buf = array.array('B', b' ')
res = sock.recv_into(buf, 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.40.4/tox.ini new/eventlet-0.41.0/tox.ini
--- old/eventlet-0.40.4/tox.ini 2020-02-02 01:00:00.000000000 +0100
+++ new/eventlet-0.41.0/tox.ini 2020-02-02 01:00:00.000000000 +0100
@@ -13,9 +13,8 @@
envlist =
ipv6
pep8
- py39-openssl
- py39-dnspython1
- py{39,310,311,312,313,314}-{selects,poll,epolls,asyncio}
+ py310-openssl
+ py{310,311,312,313,314}-{selects,poll,epolls,asyncio}
skipsdist = True
[testenv:ipv6]
@@ -68,14 +67,11 @@
coverage
pytest
pytest-cov
- py39-openssl: pyopenssl==22.1.0
+ py310-openssl: pyopenssl
pypy3: psycopg2cffi-compat==1.1
- py39-{selects,poll,epolls}: pyzmq==21.0.2
- py{39,310,311}: mysqlclient==2.0.3
- py39: psycopg2-binary==2.8.4
+ py{310,311}: mysqlclient==2.0.3
py{310,311,312,313}: psycopg2-binary==2.9.10
py{310,311,312,313,314}: pyzmq==27
- dnspython1: dnspython<2
asyncio: aiohttp
usedevelop = True
commands =