commit 71cf1facdae07d343d373bfaebcaa738e2c41e2334a73c712b3192db9c1d8827 Author: Dirk Mueller Date: Sun Mar 30 08:16:23 2025 +0000 - update to 0.22.0: * Support HTTPX 0.28.0, thanks @ndhansen * Drop support for Python 3.7, to align with HTTPX 0.25.0 * Update CI test to not fail fast and cancel workflows * Add dependabot to check GitHub actions packages * Add Python 3.13 to test suite - drop respx-pr267-httpx0.28.patch, respx-pr278-httpx0.28.patch: upstream OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-respx?expand=0&rev=23 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/python-respx.changes b/python-respx.changes new file mode 100644 index 0000000..786dcee --- /dev/null +++ b/python-respx.changes @@ -0,0 +1,97 @@ +------------------------------------------------------------------- +Sun Mar 30 08:14:05 UTC 2025 - Dirk Müller + +- update to 0.22.0: + * Support HTTPX 0.28.0, thanks @ndhansen + * Drop support for Python 3.7, to align with HTTPX 0.25.0 + * Update CI test to not fail fast and cancel workflows + * Add dependabot to check GitHub actions packages + * Add Python 3.13 to test suite +- drop respx-pr267-httpx0.28.patch, + respx-pr278-httpx0.28.patch: upstream + +------------------------------------------------------------------- +Thu Dec 12 15:14:25 UTC 2024 - Ben Greiner + +- Add patches for httpx 0.28 + * respx-pr267-httpx0.28.patch gh#lundberg/respx#267 + * respx-pr278-httpx0.28.patch gh#lundberg/respx#278 + +------------------------------------------------------------------- +Wed May 22 17:02:32 UTC 2024 - Johannes Kastl + +- add sle15_python_module_pythons + +------------------------------------------------------------------- +Sat Apr 20 07:48:17 UTC 2024 - Dirk Müller + +- update to 0.21.1: + * Fix `files` pattern not handling `str` and `BytesIO` + * Add support for `None` values in `data` pattern + +------------------------------------------------------------------- +Thu Mar 21 17:03:25 UTC 2024 - Dirk Müller + +- update to 0.21.0: + * Fix matching request data when files are provided + * Add support for data\_\_contains lookup + * Add `files` pattern to support matching on uploads + * Add `SetCookie` utility for easier mocking of response cookie + headers + * Enhance documentation on iterable side effects + * Enhance documentation on named routes and add tip about a + catch-all route + +------------------------------------------------------------------- +Tue Jan 9 22:11:30 UTC 2024 - Dirk Müller + +- update to 0.20.2: + * Better assertion output for `assert_all_called` + * Support for quoted path pattern matching + * Enable content\_\_contains pattern, thanks @rjprins + * Added initial `CONTRIBUTING.md`, thanks @morenoh149 + * Docs about retrieving mocked calls, thanks + * Docs about `Router.assert_all_called()`, thanks @BeyondEvil + for input +- drop use-real-ipv6-address.patch (upstream) + +------------------------------------------------------------------- +Fri Jun 16 06:03:28 UTC 2023 - Steve Kowalik + +- Add patch use-real-ipv6-address.patch: + * Use a real IPv6 address to avoid an address parsing exception + +------------------------------------------------------------------- +Mon Jan 16 11:33:19 UTC 2023 - Daniel Garcia + +- Update to 0.20.1 + * Support HTTPX 0.23.1, thanks @g-as for input (#223) + +------------------------------------------------------------------- +Wed Oct 12 15:57:25 UTC 2022 - Yogalakshmi Arunachalam + +- Update to version 0.20.0 + Changed + * Type Router.__getitem__ to not return optional routes, thanks @flaeppe (#216) + * Change Call.response to raise instead of returning optional response (#217) + * Change CallList.last to raise instead of return optional call (#217) + * Type M() to not return optional pattern, by introducing a Noop pattern (#217) + * Type Route.pattern to not be optional (#217) + Fixed + * Correct type hints for side effects (#217) + Added + * Runs mypy on both tests and respx (#217) + * Added nox test session for python 3.11 (#217) + * Added Call.has_response helper, now that .response raises (#217) + +------------------------------------------------------------------- +Mon Aug 22 07:35:00 UTC 2022 - Steve Kowalik + +- Run pytest with --asyncio-mode=auto due to new release of + pytest-asyncio. + +------------------------------------------------------------------- +Tue Aug 2 04:13:14 UTC 2022 - Steve Kowalik + +- Initial package for 0.19.2 + diff --git a/python-respx.spec b/python-respx.spec new file mode 100644 index 0000000..f28e8dc --- /dev/null +++ b/python-respx.spec @@ -0,0 +1,67 @@ +# +# spec file for package python-respx +# +# Copyright (c) 2025 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/ +# + + +%{?sle15_python_module_pythons} +Name: python-respx +Version: 0.22.0 +Release: 0 +Summary: Mock HTTPX with request patterns and response side effects +License: BSD-3-Clause +URL: https://github.com/lundberg/respx +Source0: https://github.com/lundberg/respx/archive/refs/tags/%{version}.tar.gz#/respx-%{version}.tar.gz +BuildRequires: %{python_module Flask} +# >= 0.28 for tests because of the Patches +BuildRequires: %{python_module httpx >= 0.28} +BuildRequires: %{python_module pip} +BuildRequires: %{python_module pytest-asyncio} +BuildRequires: %{python_module pytest} +BuildRequires: %{python_module setuptools} +BuildRequires: %{python_module starlette} +BuildRequires: %{python_module trio} +BuildRequires: %{python_module typing_extensions} +BuildRequires: %{python_module wheel} +BuildRequires: fdupes +BuildRequires: python-rpm-macros +Requires: python-httpx >= 0.21 +BuildArch: noarch +%python_subpackages + +%description +Python library to mock httpx with request patterns and responses + +%prep +%autosetup -p1 -n respx-%{version} +sed -i '/--cov/d' setup.cfg + +%build +%pyproject_wheel + +%install +%pyproject_install +%python_expand %fdupes %{buildroot}%{$python_sitelib} + +%check +%pytest -rfE + +%files %{python_files} +%license LICENSE.md +%doc README.md +%{python_sitelib}/respx-%{version}.dist-info +%{python_sitelib}/respx + +%changelog diff --git a/respx-0.21.1.tar.gz b/respx-0.21.1.tar.gz new file mode 100644 index 0000000..2c1bac5 --- /dev/null +++ b/respx-0.21.1.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:965acc56112007665e1cbcba64e99505bd10e8aba2f41dddb51e7c909e618ea6 +size 432341 diff --git a/respx-0.22.0.tar.gz b/respx-0.22.0.tar.gz new file mode 100644 index 0000000..c4ffbba --- /dev/null +++ b/respx-0.22.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7dd79401855ad952920c49dde0febc396da6619b67ec6a3f4f36d665a9a0d12 +size 432547 diff --git a/respx-pr267-httpx0.28.patch b/respx-pr267-httpx0.28.patch new file mode 100644 index 0000000..4cd2cfb --- /dev/null +++ b/respx-pr267-httpx0.28.patch @@ -0,0 +1,67 @@ +From 4abc14b995d5d7e3b1a593927ff9a95f9da4d097 Mon Sep 17 00:00:00 2001 +From: Jonas Lundberg +Date: Tue, 2 Apr 2024 20:14:16 +0200 +Subject: [PATCH] Fix test warnings + +--- + tests/conftest.py | 6 +++--- + tests/test_mock.py | 8 +++----- + 2 files changed, 6 insertions(+), 8 deletions(-) + +diff --git a/tests/conftest.py b/tests/conftest.py +index 47b3fcb..02b7edf 100644 +--- a/tests/conftest.py ++++ b/tests/conftest.py +@@ -2,7 +2,7 @@ + import pytest + + import respx +-from respx.fixtures import session_event_loop as event_loop # noqa: F401 ++from respx.fixtures import session_event_loop # noqa: F401 + + pytest_plugins = ["pytester"] + +@@ -23,7 +23,7 @@ async def my_mock(): + + + @pytest.fixture(scope="session") +-async def mocked_foo(event_loop): # noqa: F811 ++async def mocked_foo(session_event_loop): # noqa: F811 + async with respx.mock( + base_url="https://foo.api/api/", using="httpcore" + ) as respx_mock: +@@ -33,7 +33,7 @@ async def mocked_foo(event_loop): # noqa: F811 + + + @pytest.fixture(scope="session") +-async def mocked_ham(event_loop): # noqa: F811 ++async def mocked_ham(session_event_loop): # noqa: F811 + async with respx.mock(base_url="https://ham.api", using="httpcore") as respx_mock: + respx_mock.get("/", name="index").respond(200) + yield respx_mock +diff --git a/tests/test_mock.py b/tests/test_mock.py +index 76631b5..12b2d23 100644 +--- a/tests/test_mock.py ++++ b/tests/test_mock.py +@@ -473,18 +473,16 @@ def test_add_remove_targets(): + assert len(HTTPCoreMocker.targets) == pre_add_count + + +-async def test_proxies(): ++async def test_proxy(): + with respx.mock: + respx.get("https://foo.bar/") % dict(json={"foo": "bar"}) +- with httpx.Client(proxies={"https://": "https://1.1.1.1:1"}) as client: ++ with httpx.Client(proxy="https://1.1.1.1:1") as client: + response = client.get("https://foo.bar/") + assert response.json() == {"foo": "bar"} + + async with respx.mock: + respx.get("https://foo.bar/") % dict(json={"foo": "bar"}) +- async with httpx.AsyncClient( +- proxies={"https://": "https://1.1.1.1:1"} +- ) as client: ++ async with httpx.AsyncClient(proxy="https://1.1.1.1:1") as client: + response = await client.get("https://foo.bar/") + assert response.json() == {"foo": "bar"} + diff --git a/respx-pr278-httpx0.28.patch b/respx-pr278-httpx0.28.patch new file mode 100644 index 0000000..b01a76a --- /dev/null +++ b/respx-pr278-httpx0.28.patch @@ -0,0 +1,79 @@ +From a9f81cb8dcfe5cd97f51e1a375c8406d484f31c9 Mon Sep 17 00:00:00 2001 +From: Nicholas Hansen +Date: Fri, 29 Nov 2024 14:08:23 +0000 +Subject: [PATCH] Fix compatibility with httpx 0.28.0 + +--- + respx/mocks.py | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +Index: respx-0.21.1/respx/mocks.py +=================================================================== +--- respx-0.21.1.orig/respx/mocks.py ++++ respx-0.21.1/respx/mocks.py +@@ -297,6 +297,11 @@ class HTTPCoreMocker(AbstractRequestMock + Create a `HTTPX` request from transport request arg. + """ + request = kwargs["request"] ++ method = ( ++ request.method.decode("ascii").upper() ++ if isinstance(request.method, bytes) ++ else request.method.upper() ++ ) + raw_url = ( + request.url.scheme, + request.url.host, +@@ -304,7 +309,7 @@ class HTTPCoreMocker(AbstractRequestMock + request.url.target, + ) + return httpx.Request( +- request.method, ++ method, + parse_url(raw_url), + headers=request.headers, + stream=request.stream, +Index: respx-0.21.1/tests/test_api.py +=================================================================== +--- respx-0.21.1.orig/tests/test_api.py ++++ respx-0.21.1/tests/test_api.py +@@ -214,7 +214,7 @@ async def test_content_variants(client, + {"X-Foo": "bar"}, + { + "Content-Type": "application/json", +- "Content-Length": "14", ++ "Content-Length": "13", + "X-Foo": "bar", + }, + ), +@@ -223,7 +223,7 @@ async def test_content_variants(client, + {"Content-Type": "application/json; charset=utf-8", "X-Foo": "bar"}, + { + "Content-Type": "application/json; charset=utf-8", +- "Content-Length": "14", ++ "Content-Length": "13", + "X-Foo": "bar", + }, + ), +@@ -322,19 +322,19 @@ async def test_callable_content(client): + assert request.called is True + assert async_response.status_code == 200 + assert async_response.text == "hello world." +- assert request.calls[-1][0].content == b'{"x": "."}' ++ assert request.calls[-1][0].content == b'{"x":"."}' + + respx_mock.reset() + sync_response = httpx.post("https://foo.bar/jonas/", json={"x": "!"}) + assert request.called is True + assert sync_response.status_code == 200 + assert sync_response.text == "hello jonas!" +- assert request.calls[-1][0].content == b'{"x": "!"}' ++ assert request.calls[-1][0].content == b'{"x":"!"}' + + + async def test_request_callback(client): + def callback(request, name): +- if request.url.host == "foo.bar" and request.content == b'{"foo": "bar"}': ++ if request.url.host == "foo.bar" and request.content == b'{"foo":"bar"}': + return respx.MockResponse( + 202, + headers={"X-Foo": "bar"},