…cker
Raise the runtime floor to Python 3.10 (verified on 3.10 and 3.12) and
modernize the HTTP toolchain:
- python >=3.10,<4 (drop 3.9 from deps and CI matrix)
- httpx >=0.28, pytest-httpx >=0.35, inflect >=7
- dev: pytest >=8,<9, pytest-asyncio >=0.24,<2, pytest-cov <7
pytest-httpx >=0.35 (which pulls httpx 0.28) is the only path to httpx
0.28, and it forces the pytest/pytest-asyncio bumps transitively. Its
0.31+ API changes break the async mocker, so adapt it:
- HTTPXMock now requires _HTTPXMockOptions; construct it with
can_send_already_matched_responses=True so a single registered
response answers the ConnectClient's retried requests. The strict
assert_all_requests_were_expected default is kept, so an unmocked
request fails the test.
- reset() no longer performs assertions; call _assert_options()
explicitly, gated by success, to keep failing on unrequested mocks.
- match_content now serializes JSON with compact separators to match
httpx 0.28's compact request-body serialization.
Mark test_execute_error_with_reason (native httpx_mock fixture, retries
on 500) with the matching httpx_mock options. All tests pass.