Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pytest-httpx for
openSUSE:Factory checked in at 2023-11-20 21:19:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytest-httpx (Old)
and /work/SRC/openSUSE:Factory/.python-pytest-httpx.new.2521 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pytest-httpx"
Mon Nov 20 21:19:27 2023 rev:8 rq:1127546 version:0.27.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pytest-httpx/python-pytest-httpx.changes
2023-11-08 22:18:18.116438470 +0100
+++
/work/SRC/openSUSE:Factory/.python-pytest-httpx.new.2521/python-pytest-httpx.changes
2023-11-20 21:20:04.683974438 +0100
@@ -1,0 +2,11 @@
+Sun Nov 19 10:48:03 UTC 2023 - Dirk Müller <[email protected]>
+
+- update to 0.27.0:
+ * Explicit support for python `3.12`.
+ * Custom HTTP transport are now handled (parent call to
+ `handle_async_request` or `handle_request`).
+ * Only HTTP transport are now mocked, this should not have any
+ impact, however if it does, please feel free to open an issue
+ describing your use case.
+
+-------------------------------------------------------------------
Old:
----
pytest_httpx-0.26.0-gh.tar.gz
New:
----
pytest_httpx-0.27.0-gh.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pytest-httpx.spec ++++++
--- /var/tmp/diff_new_pack.xVURGk/_old 2023-11-20 21:20:06.052024928 +0100
+++ /var/tmp/diff_new_pack.xVURGk/_new 2023-11-20 21:20:06.052024928 +0100
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-pytest-httpx
-Version: 0.26.0
+Version: 0.27.0
Release: 0
Summary: Send responses to httpx
License: MIT
++++++ pytest_httpx-0.26.0-gh.tar.gz -> pytest_httpx-0.27.0-gh.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/.github/workflows/release.yml
new/pytest_httpx-0.27.0/.github/workflows/release.yml
--- old/pytest_httpx-0.26.0/.github/workflows/release.yml 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/.github/workflows/release.yml 2023-11-13
20:26:49.000000000 +0100
@@ -11,7 +11,7 @@
runs-on: ubuntu-latest
strategy:
matrix:
- python-version: ['3.9', '3.10', '3.11']
+ python-version: ['3.9', '3.10', '3.11', '3.12']
steps:
- uses: actions/checkout@v4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/.github/workflows/test.yml
new/pytest_httpx-0.27.0/.github/workflows/test.yml
--- old/pytest_httpx-0.26.0/.github/workflows/test.yml 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/.github/workflows/test.yml 2023-11-13
20:26:49.000000000 +0100
@@ -8,7 +8,7 @@
runs-on: ubuntu-latest
strategy:
matrix:
- python-version: ['3.9', '3.10', '3.11']
+ python-version: ['3.9', '3.10', '3.11', '3.12']
steps:
- uses: actions/checkout@v4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/.pre-commit-config.yaml
new/pytest_httpx-0.27.0/.pre-commit-config.yaml
--- old/pytest_httpx-0.26.0/.pre-commit-config.yaml 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/.pre-commit-config.yaml 2023-11-13
20:26:49.000000000 +0100
@@ -1,5 +1,5 @@
repos:
- repo: https://github.com/psf/black
- rev: 23.7.0
+ rev: 23.11.0
hooks:
- id: black
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/CHANGELOG.md
new/pytest_httpx-0.27.0/CHANGELOG.md
--- old/pytest_httpx-0.26.0/CHANGELOG.md 2023-09-18 19:23:33.000000000
+0200
+++ new/pytest_httpx-0.27.0/CHANGELOG.md 2023-11-13 20:26:49.000000000
+0100
@@ -6,6 +6,16 @@
## [Unreleased]
+## [0.27.0] - 2023-11-13
+### Added
+- Explicit support for python `3.12`.
+
+### Fixed
+- Custom HTTP transport are now handled (parent call to `handle_async_request`
or `handle_request`).
+
+### Changed
+- Only HTTP transport are now mocked, this should not have any impact, however
if it does, please feel free to open an issue describing your use case.
+
## [0.26.0] - 2023-09-18
### Added
- Added `proxy_url` parameter which allows matching on proxy URL.
@@ -287,7 +297,8 @@
### Added
- First release, should be considered as unstable for now as design might
change.
-[Unreleased]: https://github.com/Colin-b/pytest_httpx/compare/v0.26.0...HEAD
+[Unreleased]: https://github.com/Colin-b/pytest_httpx/compare/v0.27.0...HEAD
+[0.27.0]: https://github.com/Colin-b/pytest_httpx/compare/v0.26.0...v0.27.0
[0.26.0]: https://github.com/Colin-b/pytest_httpx/compare/v0.25.0...v0.26.0
[0.25.0]: https://github.com/Colin-b/pytest_httpx/compare/v0.24.0...v0.25.0
[0.24.0]: https://github.com/Colin-b/pytest_httpx/compare/v0.23.1...v0.24.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/README.md
new/pytest_httpx-0.27.0/README.md
--- old/pytest_httpx-0.26.0/README.md 2023-09-18 19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/README.md 2023-11-13 20:26:49.000000000 +0100
@@ -5,7 +5,7 @@
<a href="https://github.com/Colin-b/pytest_httpx/actions"><img alt="Build
status"
src="https://github.com/Colin-b/pytest_httpx/workflows/Release/badge.svg"></a>
<a href="https://github.com/Colin-b/pytest_httpx/actions"><img alt="Coverage"
src="https://img.shields.io/badge/coverage-100%25-brightgreen"></a>
<a href="https://github.com/psf/black"><img alt="Code style: black"
src="https://img.shields.io/badge/code%20style-black-000000.svg"></a>
-<a href="https://github.com/Colin-b/pytest_httpx/actions"><img alt="Number of
tests" src="https://img.shields.io/badge/tests-206 passed-blue"></a>
+<a href="https://github.com/Colin-b/pytest_httpx/actions"><img alt="Number of
tests" src="https://img.shields.io/badge/tests-208 passed-blue"></a>
<a href="https://pypi.org/project/pytest-httpx/"><img alt="Number of
downloads" src="https://img.shields.io/pypi/dm/pytest_httpx"></a>
</p>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/pytest_httpx/__init__.py
new/pytest_httpx-0.27.0/pytest_httpx/__init__.py
--- old/pytest_httpx-0.26.0/pytest_httpx/__init__.py 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/pytest_httpx/__init__.py 2023-11-13
20:26:49.000000000 +0100
@@ -5,11 +5,7 @@
import pytest
from pytest import MonkeyPatch
-from pytest_httpx._httpx_mock import (
- HTTPXMock,
- _PytestSyncTransport,
- _PytestAsyncTransport,
-)
+from pytest_httpx._httpx_mock import HTTPXMock
from pytest_httpx._httpx_internals import IteratorStream
from pytest_httpx.version import __version__
@@ -45,22 +41,36 @@
mock = HTTPXMock()
# Mock synchronous requests
- real_sync_transport = httpx.Client._transport_for_url
+ real_handle_request = httpx.HTTPTransport.handle_request
+
+ def mocked_handle_request(
+ transport: httpx.HTTPTransport, request: httpx.Request
+ ) -> httpx.Response:
+ if request.url.host in non_mocked_hosts:
+ return real_handle_request(transport, request)
+ return mock._handle_request(transport, request)
+
monkeypatch.setattr(
- httpx.Client,
- "_transport_for_url",
- lambda self, url: real_sync_transport(self, url)
- if url.host in non_mocked_hosts
- else _PytestSyncTransport(real_sync_transport(self, url), mock),
+ httpx.HTTPTransport,
+ "handle_request",
+ mocked_handle_request,
)
+
# Mock asynchronous requests
- real_async_transport = httpx.AsyncClient._transport_for_url
+ real_handle_async_request = httpx.AsyncHTTPTransport.handle_async_request
+
+ async def mocked_handle_async_request(
+ transport: httpx.AsyncHTTPTransport, request: httpx.Request
+ ) -> httpx.Response:
+ if request.url.host in non_mocked_hosts:
+ return await real_handle_async_request(transport, request)
+ return await mock._handle_async_request(transport, request)
+
monkeypatch.setattr(
- httpx.AsyncClient,
- "_transport_for_url",
- lambda self, url: real_async_transport(self, url)
- if url.host in non_mocked_hosts
- else _PytestAsyncTransport(real_async_transport(self, url), mock),
+ httpx.AsyncHTTPTransport,
+ "handle_async_request",
+ mocked_handle_async_request,
)
+
yield mock
mock.reset(assert_all_responses_were_requested)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/pytest_httpx/_httpx_internals.py
new/pytest_httpx-0.27.0/pytest_httpx/_httpx_internals.py
--- old/pytest_httpx-0.26.0/pytest_httpx/_httpx_internals.py 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/pytest_httpx/_httpx_internals.py 2023-11-13
20:26:49.000000000 +0100
@@ -61,12 +61,9 @@
def _proxy_url(
- real_transport: Union[httpx.BaseTransport, httpx.AsyncBaseTransport]
+ real_transport: Union[httpx.HTTPTransport, httpx.AsyncHTTPTransport]
) -> Optional[httpx.URL]:
- if isinstance(real_transport, httpx.HTTPTransport):
- if isinstance(real_pool := real_transport._pool, httpcore.HTTPProxy):
- return _to_httpx_url(real_pool._proxy_url,
real_pool._proxy_headers)
-
- if isinstance(real_transport, httpx.AsyncHTTPTransport):
- if isinstance(real_pool := real_transport._pool,
httpcore.AsyncHTTPProxy):
- return _to_httpx_url(real_pool._proxy_url,
real_pool._proxy_headers)
+ if isinstance(
+ real_pool := real_transport._pool, (httpcore.HTTPProxy,
httpcore.AsyncHTTPProxy)
+ ):
+ return _to_httpx_url(real_pool._proxy_url, real_pool._proxy_headers)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/pytest_httpx/_httpx_mock.py
new/pytest_httpx-0.27.0/pytest_httpx/_httpx_mock.py
--- old/pytest_httpx-0.26.0/pytest_httpx/_httpx_mock.py 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/pytest_httpx/_httpx_mock.py 2023-11-13
20:26:49.000000000 +0100
@@ -12,7 +12,7 @@
class HTTPXMock:
def __init__(self) -> None:
self._requests: list[
- tuple[Union[httpx.BaseTransport, httpx.AsyncBaseTransport],
httpx.Request]
+ tuple[Union[httpx.HTTPTransport, httpx.AsyncHTTPTransport],
httpx.Request]
] = []
self._callbacks: list[
tuple[
@@ -123,7 +123,7 @@
def _handle_request(
self,
- real_transport: httpx.BaseTransport,
+ real_transport: httpx.HTTPTransport,
request: httpx.Request,
) -> httpx.Response:
self._requests.append((real_transport, request))
@@ -142,7 +142,7 @@
async def _handle_async_request(
self,
- real_transport: httpx.AsyncBaseTransport,
+ real_transport: httpx.AsyncHTTPTransport,
request: httpx.Request,
) -> httpx.Response:
self._requests.append((real_transport, request))
@@ -178,7 +178,7 @@
def _get_callback(
self,
- real_transport: Union[httpx.BaseTransport, httpx.AsyncBaseTransport],
+ real_transport: Union[httpx.HTTPTransport, httpx.AsyncHTTPTransport],
request: httpx.Request,
) -> Optional[
Callable[
@@ -266,24 +266,6 @@
return callbacks_not_executed
-class _PytestSyncTransport(httpx.BaseTransport):
- def __init__(self, real_transport: httpx.BaseTransport, mock: HTTPXMock):
- self._real_transport = real_transport
- self._mock = mock
-
- def handle_request(self, request: httpx.Request) -> httpx.Response:
- return self._mock._handle_request(self._real_transport, request)
-
-
-class _PytestAsyncTransport(httpx.AsyncBaseTransport):
- def __init__(self, real_transport: httpx.AsyncBaseTransport, mock:
HTTPXMock):
- self._real_transport = real_transport
- self._mock = mock
-
- async def handle_async_request(self, request: httpx.Request) ->
httpx.Response:
- return await self._mock._handle_async_request(self._real_transport,
request)
-
-
def _unread(response: httpx.Response) -> httpx.Response:
# Allow to read the response on client side
response.is_stream_consumed = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/pytest_httpx/_request_matcher.py
new/pytest_httpx-0.27.0/pytest_httpx/_request_matcher.py
--- old/pytest_httpx-0.26.0/pytest_httpx/_request_matcher.py 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/pytest_httpx/_request_matcher.py 2023-11-13
20:26:49.000000000 +0100
@@ -52,7 +52,7 @@
def match(
self,
- real_transport: Union[httpx.BaseTransport, httpx.AsyncBaseTransport],
+ real_transport: Union[httpx.HTTPTransport, httpx.AsyncHTTPTransport],
request: httpx.Request,
) -> bool:
return (
@@ -106,7 +106,7 @@
return False
def _proxy_match(
- self, real_transport: Union[httpx.BaseTransport,
httpx.AsyncBaseTransport]
+ self, real_transport: Union[httpx.HTTPTransport,
httpx.AsyncHTTPTransport]
) -> bool:
if not self.proxy_url:
return True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/pytest_httpx/version.py
new/pytest_httpx-0.27.0/pytest_httpx/version.py
--- old/pytest_httpx-0.26.0/pytest_httpx/version.py 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/pytest_httpx/version.py 2023-11-13
20:26:49.000000000 +0100
@@ -3,4 +3,4 @@
# Major should be incremented in case there is a breaking change. (eg: 2.5.8
-> 3.0.0)
# Minor should be incremented in case there is an enhancement. (eg: 2.5.8 ->
2.6.0)
# Patch should be incremented in case there is a bug fix. (eg: 2.5.8 -> 2.5.9)
-__version__ = "0.26.0"
+__version__ = "0.27.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/setup.py
new/pytest_httpx-0.27.0/setup.py
--- old/pytest_httpx-0.26.0/setup.py 2023-09-18 19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/setup.py 2023-11-13 20:26:49.000000000 +0100
@@ -31,6 +31,7 @@
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
"Topic :: Software Development :: Build Tools",
"Topic :: Internet :: WWW/HTTP",
"Framework :: Pytest",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/tests/test_httpx_async.py
new/pytest_httpx-0.27.0/tests/test_httpx_async.py
--- old/pytest_httpx-0.26.0/tests/test_httpx_async.py 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/tests/test_httpx_async.py 2023-11-13
20:26:49.000000000 +0100
@@ -2015,3 +2015,26 @@
tasks = [client.get("https://example.com/") for _ in range(950)]
await asyncio.gather(*tasks)
# No need to assert anything, this test case ensure that no error was
raised by the gather
+
+
[email protected]
+async def test_custom_transport(httpx_mock: HTTPXMock) -> None:
+ class CustomTransport(httpx.AsyncHTTPTransport):
+ def __init__(self, prefix: str, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.prefix = prefix
+
+ async def handle_async_request(
+ self,
+ request: httpx.Request,
+ ) -> httpx.Response:
+ httpx_response = await super().handle_async_request(request)
+ httpx_response.headers["x-prefix"] = self.prefix
+ return httpx_response
+
+ httpx_mock.add_response()
+
+ async with httpx.AsyncClient(transport=CustomTransport(prefix="test")) as
client:
+ response = await client.post("https://test_url", content=b"This is the
body")
+ assert response.read() == b""
+ assert response.headers["x-prefix"] == "test"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pytest_httpx-0.26.0/tests/test_httpx_sync.py
new/pytest_httpx-0.27.0/tests/test_httpx_sync.py
--- old/pytest_httpx-0.26.0/tests/test_httpx_sync.py 2023-09-18
19:23:33.000000000 +0200
+++ new/pytest_httpx-0.27.0/tests/test_httpx_sync.py 2023-11-13
20:26:49.000000000 +0100
@@ -1,5 +1,4 @@
import re
-from typing import Any
from unittest.mock import ANY
import httpx
@@ -1706,3 +1705,25 @@
response = client.get("https://test_url")
assert response.json() == {"content": "request 2"}
+
+
+def test_custom_transport(httpx_mock: HTTPXMock) -> None:
+ class CustomTransport(httpx.HTTPTransport):
+ def __init__(self, prefix: str, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.prefix = prefix
+
+ def handle_request(
+ self,
+ request: httpx.Request,
+ ) -> httpx.Response:
+ httpx_response = super().handle_request(request)
+ httpx_response.headers["x-prefix"] = self.prefix
+ return httpx_response
+
+ httpx_mock.add_response()
+
+ with httpx.Client(transport=CustomTransport(prefix="test")) as client:
+ response = client.post("https://test_url", content=b"This is the body")
+ assert response.read() == b""
+ assert response.headers["x-prefix"] == "test"