diff --git a/aiohttp-3.10.5.tar.gz b/aiohttp-3.10.5.tar.gz deleted file mode 100644 index bad3bb9..0000000 --- a/aiohttp-3.10.5.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691 -size 7524360 diff --git a/aiohttp-3.9.5.tar.gz b/aiohttp-3.9.5.tar.gz new file mode 100644 index 0000000..8489f7c --- /dev/null +++ b/aiohttp-3.9.5.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551 +size 7504841 diff --git a/python-aiohttp.changes b/python-aiohttp.changes index e814f3d..d51aa31 100644 --- a/python-aiohttp.changes +++ b/python-aiohttp.changes @@ -1,56 +1,3 @@ -------------------------------------------------------------------- -Tue Aug 20 06:48:08 UTC 2024 - Steve Kowalik - -e Update to 3.10.5: - * Fixed aiohttp.ClientResponse.json() not setting status when - aiohttp.ContentTypeError is raised - * Improved performance of the WebSocket reader - * Fixed decoding base64 chunk in BodyPartReader - * Fixed a race closing the server-side WebSocket where the close code would - not reach the client - * Fixed unconsumed exceptions raised by the WebSocket heartbeat - * Fixed an edge case in the Python parser when chunk separators happen to - align with network chunks - * Fixed multipart reading when stream buffer splits the boundary over - several read() calls - * Fixed aiohttp.TCPConnector doing blocking I/O in the event loop to create - the SSLContext - * Improved performance of aiohttp.ClientWebSocketResponse.receive and - aiohttp.web.WebSocketResponse.receive when there is no timeout. - * Improved performance of starting request handlers with Python 3.12+ - * Improved performance of HTTP keep-alive checks - * Fixed server checks for circular symbolic links to be compatible with - Python 3.13 - * Fixed request body not being read when ignoring an Upgrade request - * Fixed an edge case where shutdown would wait for timeout when the handler - was already completed - * Fixed connecting to npipe://, tcp://, and unix:// urls - * Fixed WebSocket ping tasks being prematurely garbage collected - * Fixed incorrectly following symlinks for compressed file variants - (bsc#1229226, CVE-2024-42367) - * Fixed monkey patches for Path.stat() and Path.is_dir() for Python 3.13 - compatibility - * Fixed url dispatcher index not matching when a variable is preceded by a - fixed string after a slash - * Fixed server response headers for Content-Type and Content-Encoding for - static compressed files - * Fixed duplicate cookie expiration calls in the CookieJar implementation - * Adjusted FileResponse to check file existence and access when preparing - the response - * Fixed AsyncResolver to match ThreadedResolver behavior - * Fixed ws_connect not respecting receive_timeout on WS(S) connection. - * Removed blocking I/O in the event loop for static resources and refactored - exception handling - * Added a Request.wait_for_disconnection() method, as means of allowing - request handlers to be notified of premature client disconnections. - * Separated connection and socket timeout errors, from ServerTimeoutError. - * The shutdown logic in 3.9 waited on all tasks, which caused issues with - some libraries. - * When using Python 3.12 or later, the writer is no longer scheduled on the - event loop if it can finish synchronously. - * Restored aiohttp.resolver.AsyncResolver to be the default resolver. -- Drop patch remove-re-assert.patch, add BuildRequires on it. - ------------------------------------------------------------------- Wed May 29 13:46:54 UTC 2024 - Markéta Machová diff --git a/python-aiohttp.spec b/python-aiohttp.spec index f942d4e..69b0b6f 100644 --- a/python-aiohttp.spec +++ b/python-aiohttp.spec @@ -19,13 +19,15 @@ %bcond_with docs %{?sle15_python_module_pythons} Name: python-aiohttp -Version: 3.10.5 +Version: 3.9.5 Release: 0 Summary: Asynchronous HTTP client/server framework License: Apache-2.0 URL: https://github.com/aio-libs/aiohttp Source: https://files.pythonhosted.org/packages/source/a/aiohttp/aiohttp-%{version}.tar.gz -Requires: python-aiohappyeyeballs >= 2.3.0 +# PATCH-FIX-OPENSUSE remove-re-assert.patch mcepl@suse.com +# We really don’t need beautifuly presented exceptions for our testing +Patch1: remove-re-assert.patch Requires: python-aiosignal >= 1.1.2 Requires: python-attrs >= 17.3.0 Requires: python-frozenlist >= 1.1.1 @@ -49,7 +51,6 @@ BuildRequires: fdupes BuildRequires: python-rpm-macros # /SECTION # SECTION install requirements -BuildRequires: %{python_module aiohappyeyeballs >= 2.3.0} BuildRequires: %{python_module aiosignal >= 1.1.2} BuildRequires: %{python_module async_timeout >= 4.0 with %python-async_timeout < 5} BuildRequires: %{python_module attrs >= 17.3.0} @@ -68,7 +69,6 @@ BuildRequires: %{python_module pytest >= 6.2.0} BuildRequires: %{python_module pytest-mock} BuildRequires: %{python_module pytest-timeout} BuildRequires: %{python_module pytest-xdist} -BuildRequires: %{python_module re-assert} BuildRequires: %{python_module time-machine} BuildRequires: %{python_module trustme} # /SECTION @@ -128,7 +128,6 @@ donttest="test_aiohttp_request_coroutine or test_mark_formdata_as_processed or t donttest+=" or test_client_session_timeout_zero" # flaky donttest+=" or test_https_proxy_unsupported_tls_in_tls" -donttest+=" or test_shutdown_handler_cancellation_suppressed" # raises not expected "ConnectionResetError" with openssl 3.2 and python < 3.11 donttest+=" or test_tcp_connector_raise_connector_ssl_error[pyloop]" # fails with pytest 8 https://github.com/aio-libs/aiohttp/issues/8234 @@ -139,9 +138,7 @@ rm -v tests/autobahn/test_autobahn.py # uses proxy.py which is not maintained anymore rm -v tests/test_proxy_functional.py # randomly fails on xdist splits -single_runs="(test_run_app or test_web_runner)" -# breaks without threading -single_runs+=" and not test_shutdown_handler_cancellation_suppressed" +single_runs="test_run_app or test_web_runner" test -d aiohttp && mv aiohttp aiohttp.bkp %pytest_arch %{?jobs: -n %jobs} tests -k "not ($donttest or ${single_runs})" %pytest_arch tests -k "${single_runs}" @@ -150,7 +147,7 @@ test -d aiohttp && mv aiohttp aiohttp.bkp %license LICENSE.txt %doc CHANGES.rst CONTRIBUTORS.txt README.rst %{python_sitearch}/aiohttp -%{python_sitearch}/aiohttp-%{version}.dist-info +%{python_sitearch}/aiohttp-%{version}*-info %if %{with docs} %if 0%{?suse_version} > 1500 diff --git a/remove-re-assert.patch b/remove-re-assert.patch new file mode 100644 index 0000000..9f089be --- /dev/null +++ b/remove-re-assert.patch @@ -0,0 +1,195 @@ +diff -Nru aiohttp-3.9.3.orig/tests/test_client_session.py aiohttp-3.9.3/tests/test_client_session.py +--- aiohttp-3.9.3.orig/tests/test_client_session.py 2024-01-29 20:32:25.000000000 +0100 ++++ aiohttp-3.9.3/tests/test_client_session.py 2024-01-30 11:20:09.652810999 +0100 +@@ -2,6 +2,7 @@ + import contextlib + import gc + import io ++import re + import json + from http.cookies import SimpleCookie + from typing import Any, List +@@ -9,7 +10,6 @@ + + import pytest + from multidict import CIMultiDict, MultiDict +-from re_assert import Matches + from yarl import URL + + import aiohttp +@@ -320,8 +320,8 @@ + + loop.run_until_complete(make_sess()) + assert ( +- Matches("Session and connector has to use same event loop") +- == str(ctx.value).strip() ++ re.match("Session and connector has to use same event loop", ++ str(ctx.value).strip()) + ) + another_loop.run_until_complete(connector.close()) + +diff -Nru aiohttp-3.9.3.orig/tests/test_streams.py aiohttp-3.9.3/tests/test_streams.py +--- aiohttp-3.9.3.orig/tests/test_streams.py 2024-01-29 20:32:25.000000000 +0100 ++++ aiohttp-3.9.3/tests/test_streams.py 2024-01-30 11:20:09.652810999 +0100 +@@ -3,13 +3,13 @@ + import abc + import asyncio + import gc ++import re + import types + from collections import defaultdict + from itertools import groupby + from unittest import mock + + import pytest +-from re_assert import Matches + + from aiohttp import streams + +@@ -1102,7 +1102,7 @@ + loop = asyncio.get_event_loop() + stream = self._make_one() + stream._waiter = loop.create_future() +- assert Matches(r">") == repr(stream) ++ assert re.match(r">", repr(stream)) + stream._waiter.set_result(None) + await stream._waiter + stream._waiter = None +diff -Nru aiohttp-3.9.3.orig/tests/test_urldispatch.py aiohttp-3.9.3/tests/test_urldispatch.py +--- aiohttp-3.9.3.orig/tests/test_urldispatch.py 2024-01-29 20:32:25.000000000 +0100 ++++ aiohttp-3.9.3/tests/test_urldispatch.py 2024-01-30 11:21:46.656743543 +0100 +@@ -4,7 +4,6 @@ + from urllib.parse import unquote + + import pytest +-from re_assert import Matches + from yarl import URL + + import aiohttp +@@ -312,7 +311,7 @@ + regexp = "Duplicate 'name', already handled by" + with pytest.raises(ValueError) as ctx: + router.add_route("GET", "/get_other", handler2, name="name") +- assert Matches(regexp) == str(ctx.value) ++ assert re.match(regexp, str(ctx.value)) + + + def test_route_plain(router) -> None: +@@ -502,7 +501,7 @@ + + def test_static_repr(router) -> None: + router.add_static("/get", pathlib.Path(aiohttp.__file__).parent, name="name") +- assert Matches(r" None: +@@ -624,7 +623,7 @@ + req = make_mocked_request("GET", "/get/john") + match_info = await router.resolve(req) + assert {"name": "john"} == match_info +- assert Matches(">") == repr(match_info) ++ assert re.match(">", repr(match_info)) + + + async def test_match_info_with_plus(router) -> None: +diff -Nru aiohttp-3.9.3.orig/tests/test_web_response.py aiohttp-3.9.3/tests/test_web_response.py +--- aiohttp-3.9.3.orig/tests/test_web_response.py 2024-01-29 20:32:25.000000000 +0100 ++++ aiohttp-3.9.3/tests/test_web_response.py 2024-01-30 11:20:09.656144352 +0100 +@@ -2,13 +2,13 @@ + import datetime + import gzip + import json ++import re + from concurrent.futures import ThreadPoolExecutor + from unittest import mock + + import aiosignal + import pytest + from multidict import CIMultiDict, CIMultiDictProxy +-from re_assert import Matches + + from aiohttp import HttpVersion, HttpVersion10, HttpVersion11, hdrs + from aiohttp.helpers import ETag +@@ -401,7 +401,9 @@ + + with pytest.raises(RuntimeError) as ctx: + await resp.prepare(req) +- assert Matches("Using chunked encoding is forbidden for HTTP/1.0") == str(ctx.value) ++ assert re.match( ++ "Using chunked encoding is forbidden for HTTP/1.0", str(ctx.value) ++ ) + + + async def test_compression_no_accept() -> None: +@@ -843,7 +845,7 @@ + 'Set-Cookie: name=("")?; ' + "expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/" + ) +- assert Matches(expected) == str(resp.cookies) ++ assert re.match(expected, str(resp.cookies)) + + resp.set_cookie("name", "value", domain="local.host") + expected = "Set-Cookie: name=value; Domain=local.host; Path=/" +@@ -895,7 +897,7 @@ + 'Set-Cookie: name=("")?; ' + "expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/" + ) +- assert Matches(expected) == str(resp.cookies) ++ assert re.match(expected, str(resp.cookies)) + + + def test_cookie_set_after_del() -> None: +@@ -1136,14 +1138,13 @@ + await resp.write_eof() + txt = buf.decode("utf8") + assert ( +- Matches( ++ re.match( + "HTTP/1.1 200 OK\r\n" + "Content-Length: 0\r\n" + "Content-Type: application/octet-stream\r\n" + "Date: .+\r\n" + "Server: .+\r\n\r\n" +- ) +- == txt ++ , txt) + ) + + +@@ -1156,15 +1157,13 @@ + + txt = buf.decode("utf8") + assert ( +- Matches( ++ re.match( + "HTTP/1.1 200 OK\r\n" + "Content-Length: 4\r\n" + "Content-Type: application/octet-stream\r\n" + "Date: .+\r\n" + "Server: .+\r\n\r\n" +- "data" +- ) +- == txt ++ "data", txt) + ) + + +@@ -1178,15 +1177,13 @@ + + txt = buf.decode("utf8") + assert ( +- Matches( ++ re.match( + "HTTP/1.1 200 OK\r\n" + "Content-Length: 0\r\n" + "Set-Cookie: name=value\r\n" + "Content-Type: application/octet-stream\r\n" + "Date: .+\r\n" +- "Server: .+\r\n\r\n" +- ) +- == txt ++ "Server: .+\r\n\r\n", txt) + ) + +