Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-uvicorn for openSUSE:Factory checked in at 2025-09-25 18:44:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-uvicorn (Old) and /work/SRC/openSUSE:Factory/.python-uvicorn.new.11973 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-uvicorn" Thu Sep 25 18:44:09 2025 rev:22 rq:1306745 version:0.36.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-uvicorn/python-uvicorn.changes 2025-08-26 14:56:53.750135458 +0200 +++ /work/SRC/openSUSE:Factory/.python-uvicorn.new.11973/python-uvicorn.changes 2025-09-25 18:44:42.828710774 +0200 @@ -1,0 +2,13 @@ +Mon Sep 22 13:01:16 UTC 2025 - Markéta Machová <[email protected]> + +- Update to 0.36.0 + * Don't include cwd() when non-empty --reload-dirs is passed + * Apply get_client_addr formatting to WebSocket logging + * Add WebSocketsSansIOProtocol + * Refine help message for option --proxy-headers + * Support custom IOLOOPs + * Allow to provide importable string in --http, --ws and --loop +- support-websockets-14+.patch was almost fixed upstream, apply the rest +- Add upstream patch py314.patch to fix build with Python 3.14 + +------------------------------------------------------------------- Old: ---- uvicorn-0.34.2.tar.gz New: ---- py314.patch uvicorn-0.36.0.tar.gz ----------(New B)---------- New:- support-websockets-14+.patch was almost fixed upstream, apply the rest - Add upstream patch py314.patch to fix build with Python 3.14 ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-uvicorn.spec ++++++ --- /var/tmp/diff_new_pack.B4GIo7/_old 2025-09-25 18:44:43.464737395 +0200 +++ /var/tmp/diff_new_pack.B4GIo7/_new 2025-09-25 18:44:43.464737395 +0200 @@ -23,7 +23,7 @@ %endif %{?sle15_python_module_pythons} Name: python-uvicorn -Version: 0.34.2 +Version: 0.36.0 Release: 0 Summary: An Asynchronous Server Gateway Interface server License: BSD-3-Clause @@ -31,6 +31,8 @@ Source: https://github.com/encode/uvicorn/archive/%{version}.tar.gz#/uvicorn-%{version}.tar.gz # PATCH-FIX-OPENSUSE Ignore the large amount of DeprecationWarnings that websockets 14 gave us Patch0: support-websockets-14+.patch +# PATCH-FIX-UPSTREAM small part of https://github.com/Kludex/uvicorn/pull/2548 test on 3.14 +Patch1: py314.patch BuildRequires: %{python_module base >= 3.8} BuildRequires: %{python_module hatchling} BuildRequires: %{python_module pip} ++++++ py314.patch ++++++ >From 208a37a4de8f2fd6697dc3eaf076bac7442f5628 Mon Sep 17 00:00:00 2001 From: Thomas Grainger <[email protected]> Date: Sat, 14 Oct 2023 11:48:19 +0100 Subject: [PATCH 01/19] use asyncio.run(..., loop_factory) to avoid asyncio.set_event_loop_policy --- tests/test_auto_detection.py | 11 ++--- uvicorn/_compat.py | 86 ++++++++++++++++++++++++++++++++++++ uvicorn/config.py | 17 +++---- uvicorn/loops/asyncio.py | 13 ++++-- uvicorn/loops/auto.py | 18 +++++--- uvicorn/loops/uvloop.py | 9 +++- uvicorn/main.py | 4 +- uvicorn/server.py | 4 +- uvicorn/workers.py | 6 +-- 9 files changed, 138 insertions(+), 30 deletions(-) create mode 100644 uvicorn/_compat.py Index: uvicorn-0.36.0/tests/test_auto_detection.py =================================================================== --- uvicorn-0.36.0.orig/tests/test_auto_detection.py +++ uvicorn-0.36.0/tests/test_auto_detection.py @@ -1,6 +1,7 @@ import asyncio import contextlib import importlib +import sys import pytest @@ -12,9 +13,14 @@ from uvicorn.server import ServerState try: importlib.import_module("uvloop") - expected_loop = "uvloop" # pragma: py-win32 except ImportError: # pragma: py-not-win32 expected_loop = "asyncio" +except AttributeError: # pragma: py-lt-314 # pragma: py-win32 + if sys.version_info < (3, 14): # pragma: no cover + raise + expected_loop = "asyncio" +else: # pragma: py-win32 # pragma: py-gte-314 + expected_loop = "uvloop" try: importlib.import_module("httptools") Index: uvicorn-0.36.0/uvicorn/_compat.py =================================================================== --- uvicorn-0.36.0.orig/uvicorn/_compat.py +++ uvicorn-0.36.0/uvicorn/_compat.py @@ -5,6 +5,13 @@ import sys from collections.abc import Callable, Coroutine from typing import Any, TypeVar +__all__ = ["asyncio_run", "iscoroutinefunction"] + +if sys.version_info >= (3, 14): + from inspect import iscoroutinefunction +else: + from asyncio import iscoroutinefunction + _T = TypeVar("_T") if sys.version_info >= (3, 12): Index: uvicorn-0.36.0/uvicorn/config.py =================================================================== --- uvicorn-0.36.0.orig/uvicorn/config.py +++ uvicorn-0.36.0/uvicorn/config.py @@ -16,6 +16,7 @@ from typing import IO, Any, Callable, Li import click +from uvicorn._compat import iscoroutinefunction from uvicorn._types import ASGIApplication from uvicorn.importer import ImportFromStringError, import_from_string from uvicorn.logging import TRACE_LOG_LEVEL Index: uvicorn-0.36.0/uvicorn/loops/auto.py =================================================================== --- uvicorn-0.36.0.orig/uvicorn/loops/auto.py +++ uvicorn-0.36.0/uvicorn/loops/auto.py @@ -1,17 +1,23 @@ from __future__ import annotations import asyncio +import sys from collections.abc import Callable -def auto_loop_factory(use_subprocess: bool = False) -> Callable[[], asyncio.AbstractEventLoop]: +def auto_loop_factory(use_subprocess: bool = False) -> Callable[[], asyncio.AbstractEventLoop]: # pragma: no cover try: import uvloop # noqa except ImportError: # pragma: no cover - from uvicorn.loops.asyncio import asyncio_loop_factory as loop_factory - - return loop_factory(use_subprocess=use_subprocess) + pass + except AttributeError: # pragma: no cover + if sys.version_info < (3, 14): + raise else: # pragma: no cover from uvicorn.loops.uvloop import uvloop_loop_factory return uvloop_loop_factory(use_subprocess=use_subprocess) + + from uvicorn.loops.asyncio import asyncio_loop_factory as loop_factory + + return loop_factory(use_subprocess=use_subprocess) Index: uvicorn-0.36.0/pyproject.toml =================================================================== --- uvicorn-0.36.0.orig/pyproject.toml +++ uvicorn-0.36.0/pyproject.toml @@ -25,6 +25,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP", @@ -160,6 +161,7 @@ exclude_lines = [ "tests/supervisors/test_multiprocess.py", ] "sys_platform != 'win32'" = ["uvicorn/loops/asyncio.py"] +"sys_version_info >= (3, 14)" = ["uvicorn/loops/uvloop.py"] [tool.coverage.coverage_conditional_plugin.rules] py-win32 = "sys_platform == 'win32'" @@ -173,3 +175,5 @@ py-gte-310 = "sys_version_info >= (3, 10 py-lt-310 = "sys_version_info < (3, 10)" py-gte-311 = "sys_version_info >= (3, 11)" py-lt-311 = "sys_version_info < (3, 11)" +py-gte-314 = "sys_version_info >= (3, 14)" +py-lt-314 = "sys_version_info < (3, 14)" Index: uvicorn-0.36.0/tests/test_compat.py =================================================================== --- uvicorn-0.36.0.orig/tests/test_compat.py +++ uvicorn-0.36.0/tests/test_compat.py @@ -1,6 +1,7 @@ from __future__ import annotations import asyncio +import sys from asyncio import AbstractEventLoop import pytest @@ -23,7 +24,7 @@ def test_asyncio_run__custom_loop_factor def test_asyncio_run__passing_a_non_awaitable_callback_should_throw_error() -> None: - with pytest.raises(ValueError): + with pytest.raises(TypeError if sys.version_info >= (3, 14) else ValueError): asyncio_run( lambda: None, # type: ignore loop_factory=CustomLoop, ++++++ support-websockets-14+.patch ++++++ --- /var/tmp/diff_new_pack.B4GIo7/_old 2025-09-25 18:44:43.532740241 +0200 +++ /var/tmp/diff_new_pack.B4GIo7/_new 2025-09-25 18:44:43.544740744 +0200 @@ -1,15 +1,11 @@ -Index: uvicorn-0.34.2/pyproject.toml +Index: uvicorn-0.36.0/pyproject.toml =================================================================== ---- uvicorn-0.34.2.orig/pyproject.toml -+++ uvicorn-0.34.2/pyproject.toml -@@ -92,6 +92,11 @@ filterwarnings = [ - "ignore:Uvicorn's native WSGI implementation is deprecated.*:DeprecationWarning", - "ignore: 'cgi' is deprecated and slated for removal in Python 3.13:DeprecationWarning", - "ignore: remove second argument of ws_handler:DeprecationWarning:websockets", -+ # Websockets 14+ -+ "ignore: websockets.server.WebSocketServerProtocol is deprecated:DeprecationWarning", -+ "ignore: websockets.legacy is deprecated.*:DeprecationWarning", -+ "ignore: websockets.client.connect is deprecated:DeprecationWarning", +--- uvicorn-0.36.0.orig/pyproject.toml ++++ uvicorn-0.36.0/pyproject.toml +@@ -130,6 +130,7 @@ filterwarnings = [ + "ignore: websockets.legacy is deprecated.*:DeprecationWarning", + "ignore: websockets.server.WebSocketServerProtocol is deprecated.*:DeprecationWarning", + "ignore: websockets.client.connect is deprecated.*:DeprecationWarning", + "ignore: websockets.exceptions.InvalidStatusCode is deprecated:DeprecationWarning", ] ++++++ uvicorn-0.34.2.tar.gz -> uvicorn-0.36.0.tar.gz ++++++ ++++ 5441 lines of diff (skipped)
