# Changelog

## v0.2.0

(2026-05-20)

### Bug fixes

- Matched the `.local` mDNS suffix case-insensitively so hostnames such as `MyHost.LOCAL` are routed through mDNS as required by RFC 6762 – by @aiolibsbot.

  Related issues and pull requests on GitHub: #65.

- Cancelled the in-flight mDNS and DNS lookup tasks when `AsyncDualMDNSResolver.resolve()` is itself cancelled, so a cancelled lookup no longer orphans tasks that keep running against the shared `zeroconf` instance – by @bdraco.

  Related issues and pull requests on GitHub: #69.

- Made resolver `close()` idempotent – a second call on a resolver that owns its `AsyncZeroconf` no longer raises `AttributeError` – by @aiolibsbot.

  Related issues and pull requests on GitHub: #74.

- Stopped `AsyncDualMDNSResolver` from returning the same address twice when the mDNS and DNS resolvers agree on a `.local` name – by @aiolibsbot.

  Related issues and pull requests on GitHub: #87.

### Features

- Added async context manager support to `AsyncMDNSResolver` and `AsyncDualMDNSResolver`, so `async with` closes the resolver automatically – by @aiolibsbot.

  Related issues and pull requests on GitHub: #90.

### Removals and backward incompatible breaking changes

- Dropped Python 3.9 support; the minimum supported Python version is now 3.10 – by @bdraco.

  Related issues and pull requests on GitHub: #62.

### Improved documentation

- Corrected the public API module docstring (it described an unrelated project), fixed a grammar error in the package docstring, and normalized the indentation of the class directives in the API reference so the parameter lists render correctly, and added an intersphinx mapping to `python-zeroconf` so the `async_zeroconf` parameter cross-references resolve under the nitpicky docs build – by @aiolibsbot.

  Related issues and pull requests on GitHub: #67.

- Fixed the README quick-start example leaking the resolver: a resolver passed to `aiohttp.TCPConnector` is owned by the caller, so it is now closed in a `finally` block – by @aiolibsbot.

  Related issues and pull requests on GitHub: #80.

- Completed the documentation landing page: filled the empty Introduction section, added an installation snippet, and added a runnable usage example that closes the resolver in a `finally` block. Also fixed the same resolver leak in the `AsyncMDNSResolver` reference example – by @aiolibsbot.

  Related issues and pull requests on GitHub: #84.

- Documented the `resolve()` and `close()` methods of `AsyncMDNSResolver` and `AsyncDualMDNSResolver` in the API reference, including the `.local` routing behaviour and the `AsyncZeroconf` ownership semantics of `close()` – by @aiolibsbot.

  Related issues and pull requests on GitHub: #85.

- Added a usage example for `AsyncDualMDNSResolver` in the API reference and documented the `family` parameter of `resolve()` (`socket.AF_INET`, `socket.AF_INET6` and `socket.AF_UNSPEC`). Also clarified that `mdns_timeout=None` is cache-only, the same as `0` – by @aiolibsbot.

  Related issues and pull requests on GitHub: #86.

- Documented `AsyncDualMDNSResolver` in the README quick start so the landing page covers the full public API, not just `AsyncMDNSResolver` – by @aiolibsbot.

  Related issues and pull requests on GitHub: #89.

### Packaging updates and notes for downstreams

- The packaging metadata switched to including an SPDX license identifier introduced in PEP 639 – by @cdce8p.

  As a side effect, the minimum required version of `setuptools` increased to v77.

  Related issues and pull requests on GitHub: #36.

- Fixed `MANIFEST.in` to graft the `src/` tree and dropped references to the non-existent `packaging/` directory and `NOTICE` file, removing spurious build warnings. The `py.typed` marker is now shipped explicitly via `package-data`, and the distribution advertises the Python 3.10–3.13, CPython, PyPy, and `Typing :: Typed` classifiers – by @aiolibsbot.

  Related issues and pull requests on GitHub: #68.

- Added support for Python 3.14: the test matrix now runs against 3.14 and the distribution advertises the `Programming Language :: Python :: 3.14` classifier – by @aiolibsbot.

  Related issues and pull requests on GitHub: #81.

### Contributor-facing changes

- Expanded the public-API regression test to cover `AsyncDualMDNSResolver`, `api.__all__`, and the `aiohttp.resolver.AsyncResolver` drop-in subclass guarantee for both resolvers.

  Related issues and pull requests on GitHub: #71.

- Hardened the CI workflow: the default `GITHUB_TOKEN` is now restricted to `contents: read`, and a concurrency group cancels superseded in-progress pull request runs to conserve CI resources – by @aiolibsbot.

  Related issues and pull requests on GitHub: #72.

- Enabled the mypy `disallow_untyped_defs`, `disallow_incomplete_defs`, and `check_untyped_defs` checks so that newly added functions in `src/` and `tests/` must carry complete type annotations – by @aiolibsbot.

  Related issues and pull requests on GitHub: #73.

- Migrated CI runners from `actions/setup-python` to `astral-sh/setup-uv` so dependencies and Python interpreters are provisioned via `uv` instead of system `pip` – by @aiolibsbot.

  Related issues and pull requests on GitHub: #76.

- Replaced the `pyupgrade` pre-commit hook with Ruff’s `UP` rule set so a single linter handles syntax modernization, targeting Python 3.10+ – by @aiolibsbot.

  Related issues and pull requests on GitHub: #78.

## v0.1.1

(2025-02-14)

### Miscellaneous internal changes

- Improved MDNS resolver performance when the name is already in the cache – by @bdraco.

  Related issues and pull requests on GitHub: #27.

## v0.1.0

(2025-02-05)

### Features

- Created the `aiohttp_asyncmdnsresolver.api.AsyncDualMDNSResolver` class to resolve `.local` names using both mDNS and DNS – by @bdraco.

  Related issues and pull requests on GitHub: #23.

## v0.0.3

(2025-01-31)

### Bug fixes

- Fixed imports not being properly sorted – by @bdraco.

  Related issues and pull requests on GitHub: #21.

## v0.0.2

(2025-01-30)

### Miscellaneous internal changes

- Migrated to using zeroconf’s built-in resolver classes – by @bdraco.

  Related issues and pull requests on GitHub: #19.

## v0.0.1

(2025-01-05)

Initial release