From 50289d2a3f7178e622c05b50c4c6b7874455f790a55032f0a96fbc8bea150057 Mon Sep 17 00:00:00 2001 From: Nico Krapp Date: Tue, 23 Sep 2025 13:22:51 +0000 Subject: [PATCH] - 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 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-uvicorn?expand=0&rev=44 --- .gitattributes | 23 ++ .gitignore | 1 + py314.patch | 156 ++++++++++++ python-uvicorn.changes | 444 +++++++++++++++++++++++++++++++++++ python-uvicorn.spec | 122 ++++++++++ support-websockets-14+.patch | 12 + uvicorn-0.36.0.tar.gz | 3 + 7 files changed, 761 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 py314.patch create mode 100644 python-uvicorn.changes create mode 100644 python-uvicorn.spec create mode 100644 support-websockets-14+.patch create mode 100644 uvicorn-0.36.0.tar.gz diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /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/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/py314.patch b/py314.patch new file mode 100644 index 0000000..e33f167 --- /dev/null +++ b/py314.patch @@ -0,0 +1,156 @@ +From 208a37a4de8f2fd6697dc3eaf076bac7442f5628 Mon Sep 17 00:00:00 2001 +From: Thomas Grainger +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, diff --git a/python-uvicorn.changes b/python-uvicorn.changes new file mode 100644 index 0000000..3cf26e8 --- /dev/null +++ b/python-uvicorn.changes @@ -0,0 +1,444 @@ +------------------------------------------------------------------- +Mon Sep 22 13:01:16 UTC 2025 - Markéta Machová + +- 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 + +------------------------------------------------------------------- +Mon Aug 25 14:27:42 UTC 2025 - Markéta Machová + +- Convert to libalternatives on SLE-16-based and newer systems + +------------------------------------------------------------------- +Thu May 1 06:28:46 UTC 2025 - Steve Kowalik + +- Update to 0.34.2: + * Added + + Add content-length to 500 response in wsproto implementation + * Fixed + + Flush stdout buffer on Windows to trigger reload + + Drop ASGI spec version to 2.3 on HTTP scope + + Enable httptools lenient data on httptools >= 0.6.3 + * Deprecated + + Deprecate ServerState in the main module + * Removed + + Drop support for Python 3.8 + + Remove WatchGod support for --reload +- Add patch support-websockets-14+.patch: + * Ignore multiple classes of DeprecationWarnings. + +------------------------------------------------------------------- +Wed Oct 30 10:37:07 UTC 2024 - Dirk Müller + +- update to 0.32.0: + * Officially support Python 3.13 + * Warn when `max_request_limit` is exceeded + * Support WebSockets 0.13.1 + * Restore support for `[*]` in trusted hosts + * Add `PathLike[str]` type hint for `ssl_keyfile` + * Improve `ProxyHeadersMiddleware` (#2468) and (#2231): + * Fix the host for requests from clients running on the proxy + server itself. + * Fallback to host that was already set for empty x-forwarded- + for headers. + * Also allow to specify IP Networks as trusted hosts. This + greatly simplifies deployments + * on docker swarm/kubernetes, where the reverse proxy might + have a dynamic IP. + * This includes support for IPv6 Address/Networks. + * Don't warn when upgrade is not WebSocket and depedencies are + installed + * Don't close connection before receiving body on H11 + * Close connection when `h11` sets client state to `MUST_CLOSE` + * Suppress `KeyboardInterrupt` from CLI and programmatic usage + * `ClientDisconnect` inherits from `OSError` instead of + `IOError` + * Add `reason` support to `websocket.disconnect` event + * Iterate subprocesses in-place on the process manager + * Allow horizontal tabs ` ` in response header values + * New multiprocess manager + * Allow `ConfigParser` or a `io.IO[Any]` on `log_config` + * Suppress side-effects of signal propagation + * Send `content-length` header on 5xx + * Deprecate the `uvicorn.workers` module +- drop fix-websocket-tests.patch, + 0001-Stop-using-deprecated-app-shortcut-in-httpx.AsyncCli.patch: + upstream + +------------------------------------------------------------------- +Mon Mar 25 20:19:46 UTC 2024 - Dan Čermák + +- New upstream release 0.29.0 + + * Cooperative signal handling (#1600) 19/03/24 + * Revert raise `ClientDisconnected` on HTTP (#2276) 19/03/24 + +- Add patch: + * 0001-Stop-using-deprecated-app-shortcut-in-httpx.AsyncCli.patch + upstream fix for the testsuite with httpx 0.27 + +- Remove pointless Suggests: + +------------------------------------------------------------------- +Sun Mar 17 10:11:10 UTC 2024 - Dirk Müller + +- update to 0.28.0: + * Raise `ClientDisconnected` on `send()` when client + disconnected (#2220) 12/02/24 + * Except `AttributeError` on `sys.stdin.fileno()` for Windows + IIS10 (#1947) 29/02/24 + * Use `X-Forwarded-Proto` for WebSockets scheme when the proxy + provides it (#2258) 01/03/24 + * Fix spurious LocalProtocolError errors when processing + pipelined requests (#2243) 10/02/24 + * Fix nav overrides for newer version of Mkdocs Material + (#2233) 26/01/24 + * Raise `ClientDisconnect(IOError)` on `send()` when client + disconnected (#2218) 19/01/24 + * Bump ASGI WebSocket spec version to 2.4 (#2221) 20/01/24 + * Update `--root-path` to include the root path prefix in the + full ASGI `path` as per the ASGI spec (#2213) 16/01/24 + * Use `__future__.annotations` on some internal modules (#2199) + 16/01/24 + +------------------------------------------------------------------- +Tue Jan 30 12:43:20 UTC 2024 - Daniel Garcia + +- Disable flacky test in s390x with current python-websockets, + bsc#1217022 + +------------------------------------------------------------------- +Sun Jan 14 10:55:54 UTC 2024 - Dirk Müller + +- update to 0.25.0: + * Support the WebSocket Denial Response ASGI extension (#1916) + * Allow explicit hidden file paths on `--reload-include` + * Properly annotate `uvicorn.run()` + +------------------------------------------------------------------- +Sun Nov 26 10:43:29 UTC 2023 - Dirk Müller + +- update to 0.24.0.post1: + * Revert mkdocs-material from 9.1.21 to 9.2.6 (#2148) 05/11/23 + * Support Python 3.12 (#2145) 04/11/23 + * Allow setting `app` via environment variable `UVICORN_APP` + (#2106) 21/09/23 + +------------------------------------------------------------------- +Tue Sep 26 14:13:34 UTC 2023 - Dirk Müller + +- update to 0.23.2: + * Maintain the same behavior of `websockets` from 10.4 on 11.0 + * Add `typing_extensions` for Python 3.10 and lower (#2053) + * Add `--ws-max-queue` parameter WebSockets (#2033) 10/07/23 + * Drop support for Python 3.7 (#1996) 19/06/23 + * Remove `asgiref` as typing dependency (#1999) 08/06/23 + * Set `scope["scheme"]` to `ws` or `wss` instead of `http` or + `https` on `ProxyHeadersMiddleware` for WebSockets (#2043) + 12/07/23 + * Raise `ImportError` on circular import (#2040) 09/07/23 + * Use `logger.getEffectiveLevel()` instead of `logger.level` to + check if log level is `TRACE` (#1966) 01/06/23 + +------------------------------------------------------------------- +Thu Jun 22 15:25:56 UTC 2023 - Dirk Müller + +- limit to newer python versions, older are no longer needed + +------------------------------------------------------------------- +Fri May 12 08:24:05 UTC 2023 - daniel.garcia@suse.com + +- Add fix-websocket-tests.patch gh#encode/uvicorn#1929 +- Update to version 0.22.0: + * Version 0.22.0 (#1957) + * Remove unused events (#1956) + * remove a few mypy excludes (#1954) + * Add `--timeout-graceful-shutdown` parameter (#1950) + * Fix typo in setup.cfg (#1953) + * Update `scripts/check` (#1952) + * Add `WatchFilesReload` pause method (#1930) + * Create PULL_REQUEST_TEMPLATE.md (#1946) + * Handle `SIGBREAK` for Windows (#1909) + * Fix shutdown event on Windows in reloader (#1584) + * Handle missing trustme/cryptography gracefully in the test suite (#1940) + * Add type hints to test_auto_detection.py (#1937) + * Fix watchgod deprecation warning (#1938) + * Upgrade and fix Black (#1926) + * Use ruff instead of flake8, autoflake and isort (#1925) + * Upgrade MyPy and fix issues (#1931) + * Pin websockets to <11.0 (#1928) + * Bump coverage from 7.1.0 to 7.2.2 (#1920) + * Fix instructions so they work in zsh as well as Bash (#1915) + * [`Docs`] : Hypercorn supports HTTP/3 (#1913) + * Version 0.21.1 (#1904) + * Reset lifespan state on each request (#1903) + * Version 0.21.0 (#1892) + * Improve discoverability when `--port=0` is used (#1890) + * Fix mypy on test_websockets (#1889) + * Add type annotation on `test_websockets.py` (#1880) + * Introduce lifespan state (#1818) + * Bump build from 0.9.0 to 0.10.0 (#1882) + * Bump pytest from 7.2.0 to 7.2.1 (#1883) + * Bump a2wsgi from 1.6.0 to 1.7.0 (#1886) + * Add type annotation on `test_logging.py` (#1881) + * fix: typo (#1871) + * Bump cryptography from 38.0.3 to 39.0.1 (#1865) + * Improve import time (#1846) + * Bump coverage from 6.5.0 to 7.1.0 (#1856) + * Bump twine from 4.0.1 to 4.0.2 (#1857) + * Bump types-pyyaml from 6.0.12.2 to 6.0.12.3 (#1858) + * Move a2wsgi to the explicit optionals section in the requirements (#1849) + * Replace current WSGIMiddleware implementation by a2wsgi one (#1825) + * Send code 1012 on shutdown for websockets (#1816) + * Change default `--app-dir` from from "." (dot) to "" (empty string). (#1835) + * Bump types-pyyaml from 6.0.12.1 to 6.0.12.2 (#1827) + * Bump pytest from 7.1.3 to 7.2.0 (#1830) + * Fix cli_usage tool on systems without an activated virtualenv (#1823) + * Fix ASGI application on the documentation (#1821) + * Delete setup.py (#1822) + * tests: test to start server with invalid host (#1813) + * Use unused TCP ports on the test suite (#1804) + * Use `surrogateescape` to encode headers on `websockets` implementation (#1005) + * Update hypercorn link on the README (#1800) + * Fix one example in REAME (#1794) + * Replace `files` by `exclude` on mypy configuration (#1793) + * Bump mypy from 0.982 to 0.991 (#1789) + * Bump mkdocs from 1.4.0 to 1.4.2 (#1787) + * Bump build from 0.8.0 to 0.9.0 (#1791) + * Fix warning on reload failure (#1784) + * Allow headers to be sent as iterables (#1782) + * Add test to make sure we send connection close when client sends it (#1776) + * Replace `AF_UNIX` by `AF_INET` on subprocess test (#1775) + * Replace uvicorn files by uvicorn folder on mypy settings (#1771) + * Add type annotation to `wsproto_impl.py` (#1754) + +------------------------------------------------------------------- +Fri Apr 21 12:38:24 UTC 2023 - Dirk Müller + +- add sle15_python_module_pythons (jsc#PED-68) + +------------------------------------------------------------------- +Thu Apr 13 22:45:45 UTC 2023 - Matej Cepl + +- Make calling of %{sle15modernpython} optional. + +------------------------------------------------------------------- +Thu Mar 16 08:13:19 UTC 2023 - Dirk Müller + +- skip optional uvloop test dependency for SLE15 + +------------------------------------------------------------------- +Thu Feb 16 15:27:53 UTC 2023 - Torsten Gruner + +- Update to version 0.20.0: + * Check if handshake is completed before sending frame on `wsproto` shutdown (#1737) + * Add default headers to WebSockets implementations (#1606 & #1747) 28/10/22 + * Warn user when `reload` and `workers` flag are used together (#1731) 31/10/22 + * Use correct `WebSocket` error codes on `close` (#1753) 20/11/22 + * Send disconnect event on connection lost for `wsproto` (#996) 29/10/22 + * Add `SIGQUIT` handler to `UvicornWorker` (#1710) 01/11/22 + * Fix crash on exist with "--uds" if socket doesn't exist (#1725) 27/10/22 + * Annotate `CONFIG_KWARGS` in `UvicornWorker` class (#1746) 31/10/22 + * Remove conditional on `RemoteProtocolError.event_hint` on `wsproto` (#1486) 31/10/22 + * Remove unused `handle_no_connect` on `wsproto` implementation (#1759) 17/11/22 +- version 0.19.0 + * Support Python 3.11 (#1652) 16/09/22 + * Bump minimal `httptools` version to `0.5.0` (#1645) 13/09/22 + * Ignore HTTP/2 upgrade and optionally ignore WebSocket upgrade (#1661) 19/10/22 + * Add `py.typed` to comply with PEP 561 (#1687) 07/10/22 + * Set `propagate` to `False` on "uvicorn" logger (#1288) 08/10/22 + * USR1 signal is now handled correctly on `UvicornWorker`. (#1565) 26/08/22 + * Use path with query string on `WebSockets` logs (#1385) 11/09/22 + * Fix behavior on which "Date" headers were not updated on the same connection (#1706) 19/10/22 + * Remove the `--debug` flag (#1640) 14/09/22 + * Remove the `DebugMiddleware` (#1697) 07/10/22 +- version 0.18.3 + * Remove cyclic references on HTTP implementations. (#1604) 24/08/22 + * `reload_delay` default changed from `None` to `0.25` on `uvicorn.run()` and `Config`. + `None` is not an acceptable value anymore. (#1545) 02/07/22 +- Remove upstreamed patch uvicorn-pr1537-no-watchgod-tests.patch + +------------------------------------------------------------------- +Fri Aug 5 09:51:32 UTC 2022 - Dominique Leuenberger + +- Fix URL to 1537.patch: add ".patch" to the gh Pr to reference the + raw patch, not the gh webui. + +------------------------------------------------------------------- +Tue Jul 19 20:59:25 UTC 2022 - Ben Greiner + +- Disable testing with watchfiles + * We don't want it in Ring1-MinimalX + +------------------------------------------------------------------- +Mon Jul 18 20:17:15 UTC 2022 - Ben Greiner + +- Update to version 0.18.2 + * Add default `log_config` on `uvicorn.run()` (#1541) + * Revert `logging` file name modification (#1543) +- Release 0.18.1 + * Use `DEFAULT_MAX_INCOMPLETE_EVENT_SIZE` as default to + `h11_max_incomplete_event_size` on the CLI (#1534) +- Release 0.18.0 + * The `reload` flag prioritizes `watchfiles` instead of the + deprecated `watchgod` (#1437) + * Annotate `uvicorn.run()` function (#1423) + * Allow configuring `max_incomplete_event_size` for `h11` + implementation (#1514) + * Remove `asgiref` dependency (#1532) + * Turn `raw_path` into bytes on both websockets implementations + (#1487) + * Revert log exception traceback in case of invalid HTTP request + (#1518) + * Set `asyncio.WindowsSelectorEventLoopPolicy()` when using + multiple workers to avoid "WinError 87" (#1454) +- Release 0.17.5 + * Fix case where url is fragmented in httptools protocol (#1263) + 2/16/22 + * Fix WSGI middleware not to explode quadratically in the case of + a larger body (#1329) + * Send HTTP 400 response for invalid request (#1352) +- Release 0.17.4 + * Replace `create_server` by `create_unix_server` (#1362) +- Release 0.17.3 + * Drop wsproto version checking. (#1359) +- Release 0.17.2 + * Revert #1332. While trying to solve the memory leak, it + introduced an issue (#1345) when the server receives big chunks + of data using the `httptools` implementation. (#1354) + * Revert stream interface changes. This was introduced on 0.14.0, + and caused an issue (#1226), which caused a memory leak when + sending TCP pings. (#1355) + * Fix wsproto version check expression (#1342) +- Release 0.17.1 + * Move all data handling logic to protocol and ensure connection + is closed. (#1332) + * Change `spec_version` field from "2.1" to "2.3", as Uvicorn is + compliant with that version of the ASGI specifications. (#1337) +- Add uvicorn-pr1537-no-watchgod-tests.patch gh#encode/uvicorn#1537 + +------------------------------------------------------------------- +Tue Feb 1 05:38:09 UTC 2022 - Steve Kowalik + +- Add missing Requires on python-asgiref. + +------------------------------------------------------------------- +Mon Jan 24 09:51:06 UTC 2022 - kkaempf@suse.com + +- Update to version 0.17.0: + * Release 0.17.0 (#1322) + * Fix reload process behavior when exception is raised (#1313) + * Fix version that supports Python 3.6 on the README (#1316) + * Add missing http version on websockets scope (#1309) + * Remove Python 3.6 (#1261) + * Support `extra_headers` for WS `accept` message (#1293) + * Allow configurable websocket per-message-deflate setting (#1300) + * Remove root_path from logs (#1294) + +- Update to version 0.16.0: + * Version 0.16.0 (#1270) + * Allow app-dir parameter on the run() function (#1271) + +- Update to version 0.15.0: + * Added + - Change reload to be configurable with glob patterns. Currently + only .py files are watched, which is different from the previous + default behavior. (#820) 08/08/21 + - Add Python 3.10-rc.1 support. Now the server uses asyncio.run + which will: start a fresh asyncio event loop, on shutdown cancel any + background tasks rather than aborting them, aexit any remaining async + generators, and shutdown the default ThreadPoolExecutor. (#1070) 30/07/21 + - Exit with status 3 when worker starts failed (#1077) 22/06/21 + - Add option to set websocket ping interval and timeout (#1048) 09/06/21 + - Adapt bind_socket to make it usable with multiple processes (#1009) 21/06/21 + - Add existence check to the reload directory(ies) (#1089) 21/06/21 + - Add missing trace log for websocket protocols (#1083) 19/06/21 + - Support disabling default Server and Date headers (#818) 11/06/21 + * Changed + - Add PEP440 compliant version of click (#1099) 29/06/21 + - Bump asgiref to 3.4.0 (#1100) 29/06/21 + * Fixed + - When receiving a SIGTERM supervisors now terminate their + processes before joining them (#1069) 30/07/21 + - Fix the need of httptools on minimal installation (#1135) 30/07/21 + - Fix ping parameters annotation in Config class (#1127) 19/07/21 + +- Update to version 0.14.0: + * Added + - Defaults ws max_size on server to 16MB (#995) 5/29/21 + - Improve user feedback if no ws library installed (#926 and + #1023) 2/27/21 + - Support 'reason' field in 'websocket.close' messages (#957) 2/24/21 + - Implemented lifespan.shutdown.failed (#755) 2/25/21 + * Changed + - Upgraded websockets requirements (#1065) 6/1/21 + - Switch to asyncio streams API (#869) 5/29/21 + - Update httptools from 0.1.* to 0.2.* (#1024) 5/28/21 + - Allow Click 8.0, refs #1016 (#1042) 5/23/21 + - Add search for a trusted host in ProxyHeadersMiddleware (#591) 3/13/21 + - Up wsproto to 1.0.0 (#892) 2/25/21 + * Fixed + - Force reload_dirs to be a list (#978) 6/1/21 + - Fix gunicorn worker not running if extras not installed (#901) 5/28/21 + - Fix socket port 0 (#975) 3/5/21 + - Prevent garbage collection of main lifespan task (#972) 3/4/21 + +- Update to version 0.13.0: + * Add --factory flag to support factory-style application imports. + (#875) 2020-12-07 50fc0d1 + * Skip installation of signal handlers when not in the main thread. + Allows using Server in multithreaded contexts without having to + override .install_signal_handlers(). (#871) 2020-12-07 ce2ef45 + +------------------------------------------------------------------- +Fri Sep 17 07:04:38 UTC 2021 - Dominique Leuenberger + +- Do not build for python 3.6: the required dependency uvloop does + no longer support Python 3.6 since version 0.16. + +------------------------------------------------------------------- +Sun Nov 29 09:56:12 UTC 2020 - John Vandenberg + +- Skip three tests due to minor change introduced in wsproto 1.0.0 +- Add some missing minimum versions to Requires and BuildRequires +- Update to v0.12.3 + * Fix race condition that leads Quart to hang + * Use latin1 when decoding X-Forwarded-* headers + * Rework IPv6 support + * Cancel old keepalive-trigger before setting new one +- from v0.12.2 + * Adding ability to decrypt ssl key file + * Support .yml log config files + * Added python 3.9 support + * Fixes watchgod with common prefixes + * Fix reload with ipv6 host + * Added cli support for headers containing colon + * Sharing socket across workers on windows + * Note the need to configure trusted "ips" when using unix sockets + +------------------------------------------------------------------- +Tue Oct 13 09:42:02 UTC 2020 - Jan Engelhardt + +- Trim marketing wording from descriptions. + +------------------------------------------------------------------- +Sun Oct 11 14:58:51 UTC 2020 - John Vandenberg + +- Update to v0.12.1 + +------------------------------------------------------------------- +Sat Jul 25 18:38:16 UTC 2020 - John Vandenberg + +- Update to v0.11.6 + +------------------------------------------------------------------- +Tue Oct 8 09:08:25 AM UTC 2019 - John Vandenberg + +- Initial spec for v0.9.0 diff --git a/python-uvicorn.spec b/python-uvicorn.spec new file mode 100644 index 0000000..bca6784 --- /dev/null +++ b/python-uvicorn.spec @@ -0,0 +1,122 @@ +# +# spec file for package python-uvicorn +# +# Copyright (c) 2025 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 +# 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/ +# + + +%if 0%{?suse_version} > 1500 +%bcond_without libalternatives +%else +%bcond_with libalternatives +%endif +%{?sle15_python_module_pythons} +Name: python-uvicorn +Version: 0.36.0 +Release: 0 +Summary: An Asynchronous Server Gateway Interface server +License: BSD-3-Clause +URL: https://github.com/encode/uvicorn +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} +BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module wheel} +BuildRequires: fdupes +BuildRequires: python-rpm-macros +Requires: python-click >= 7.0 +Requires: python-h11 >= 0.8.0 +Recommends: python-PyYAML >= 5.1 +Recommends: python-httptools >= 0.4.0 +Recommends: python-websockets >= 8.0 +BuildArch: noarch +%if %{with libalternatives} +BuildRequires: alts +Requires: alts +%else +Requires(post): update-alternatives +Requires(postun): update-alternatives +%endif +# SECTION test requirements +BuildRequires: %{python_module PyYAML >= 5.1} +BuildRequires: %{python_module click >= 7.0} +BuildRequires: %{python_module h11 >= 0.8.0} +BuildRequires: %{python_module httptools >= 0.4.0} +BuildRequires: %{python_module httpx >= 0.27} +BuildRequires: %{python_module pytest-asyncio} +BuildRequires: %{python_module pytest-mock} +BuildRequires: %{python_module pytest-xdist} +BuildRequires: %{python_module pytest} +BuildRequires: %{python_module python-dotenv} +BuildRequires: %{python_module requests} +BuildRequires: %{python_module trustme} +BuildRequires: %{python_module websockets >= 10.4} +BuildRequires: %{python_module wsproto >= 1.2.0} +%if 0%{?suse_version} > 1500 +BuildRequires: %{python_module uvloop >= 0.14.0} +%endif +# We don't want watchfiles in Ring1 +#BuildRequires: #{python_module watchfiles >= 0.13} +# /SECTION +%python_subpackages + +%description +Uvicorn is an ASGI server implementation, using uvloop and httptools. +It supports HTTP/1.1 and WebSockets only. + +%prep +%autosetup -p1 -n uvicorn-%{version} + +%build +%pyproject_wheel + +%install +%pyproject_install +%python_clone -a %{buildroot}%{_bindir}/uvicorn +%python_expand %fdupes %{buildroot}%{$python_sitelib} + +%post +%python_install_alternative uvicorn + +%postun +%python_uninstall_alternative uvicorn + +%pre +%python_libalternatives_reset_alternative uvicorn + +%check +# Required for reporting bugs +%python_exec -m uvicorn --version +# No module python-a2wsgi +ignore="--ignore tests/middleware/test_wsgi.py" +# Disable flacky test in s390x with current python-websockets +%if "%{_arch}" == "s390x" +ignore+=" --ignore tests/protocols/test_websocket.py" +%endif +# no longer raises an exception with Websockets 14+ +%pytest $ignore -k 'not test_send_binary_data_to_server_bigger_than_default_on_websockets' + +%files %{python_files} +%doc README.md +%license LICENSE.md +%python_alternative %{_bindir}/uvicorn +%{python_sitelib}/uvicorn +%{python_sitelib}/uvicorn-%{version}.dist-info + +%changelog diff --git a/support-websockets-14+.patch b/support-websockets-14+.patch new file mode 100644 index 0000000..606f623 --- /dev/null +++ b/support-websockets-14+.patch @@ -0,0 +1,12 @@ +Index: uvicorn-0.36.0/pyproject.toml +=================================================================== +--- 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", + ] + + [tool.coverage.run] diff --git a/uvicorn-0.36.0.tar.gz b/uvicorn-0.36.0.tar.gz new file mode 100644 index 0000000..1cbff89 --- /dev/null +++ b/uvicorn-0.36.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcff1c0826862d125b5b5bf45fe1d03241346e631802d29454792c6c5107ca8d +size 815375