Skip to content

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

0.7.1 - 2026-06-10

No functional changes to the library — documentation and packaging only.

Added

  • Documentation site built with MkDocs Material and published to GitHub Pages at https://andy-takker.github.io/asyncly/ (versioned via mike): Overview, Installation, Quickstart, a testing-strategies page, usage guides for every subsystem, and an autogenerated API reference (mkdocstrings).
  • Google-style docstrings across the public API.
  • Documentation URL in the project metadata (shown on PyPI).

Changed

  • Rewrote README.rst as a slim, friendly README.md landing that links to the full documentation.

0.7.0 - 2026-06-10

Added

  • Proxy support in BaseHttpClient: new keyword-only proxy and proxy_auth arguments (also on InstrumentableHttpClient). Set them once on the client or override per request; both are forwarded to aiohttp.
  • Forwarding mock proxy start_proxy(*, auth=...) and MockProxyService in asyncly.srvmocker. Spins up an in-process HTTP proxy that records every request passing through it and forwards it to the real target, so tests can assert a client genuinely routes through a proxy. Supports Proxy-Authorization validation (returns 407 and does not forward on mismatch). Mirrors MockService's assertion helpers (assert_called, assert_not_called, get_calls, last_call). HTTP targets only (no CONNECT/HTTPS tunnelling).
  • mock_proxy pytest fixture exposing a ready-to-use forwarding proxy.

0.6.2 - 2026-05-11

Security

  • Re-release of 0.6.1 with the aiohttp>=3.13.3 constraint actually included in the published wheel. Version 0.6.1 was tagged before the dependency bump from #29 merged, so the uploaded artifact still allowed vulnerable aiohttp<3.13.3. Both 0.6.0 and 0.6.1 are yanked from PyPI. Install asyncly>=0.6.2 to receive the CVE-2025-69223 mitigation.

0.6.1 - 2026-05-11

Security

  • Bump minimum aiohttp to >=3.13.3 to address CVE-2025-69223: a zip-bomb DoS in aiohttp's handling of compressed request/response bodies (affects aiohttp <= 3.13.2). Thanks to @loganaden for the report and fix (#29).

0.6.0 - 2026-05-11

Added

  • Pytest plugin (asyncly.pytest_plugin) auto-registered via pytest11 entry-point. Provides mock_routes and mock_service fixtures so tests no longer need to wire their own start_service context manager.
  • Request matching via the new Match builder on MockRoute. Multiple routes can share (method, path) and be dispatched by JSON body, headers (subset), query (subset), or raw body. Routes without match= act as fallbacks within their group.
  • Assertion helpers on MockService: get_calls(name), last_call(name), assert_called(name, *, times=, json=, body=, headers=, query=), assert_not_called(name).
  • RawResponse for returning arbitrary bytes with arbitrary headers — useful for testing client behavior on malformed JSON or unexpected content types.
  • TLS support in start_service(routes, *, ssl_context=...) — pass an ssl.SSLContext to serve over HTTPS (MockService.url.scheme == "https").
  • SequenceResponse(on_exhausted=...) with three modes: "raise" (default, new behavior raises SequenceExhausted with a clear message), "cycle", "last". Now exported directly from asyncly.srvmocker.
  • New exceptions: SrvMockerError, SequenceExhausted, UnknownHandlerError.

Changed

  • MockService.register() now emits DeprecationWarning when called with a handler_name not declared in any MockRoute. Will become UnknownHandlerError in 0.7.
  • SequenceResponse on exhaustion now raises a typed SequenceExhausted instead of bubbling RuntimeError from PEP 479. Default behavior otherwise unchanged.
  • Match defensively copies headers and query dict arguments at construction time — caller-side mutation of the original dict no longer affects matcher behavior.

Fixed

  • SequenceResponse([]) now raises ValueError eagerly instead of failing on first use.