From aa661bd6de770f0d8d4f118d39af09b47921a8bc Mon Sep 17 00:00:00 2001 From: disqualifier Date: Sun, 28 Jun 2026 15:50:33 -0400 Subject: [PATCH] fix: legible error on missing template placeholder (v0.2.1) next() on a template source did template.format(...) directly, so a placeholder not supplied in next(**fields) leaked a bare KeyError. catch KeyError/IndexError and raise a clear ValueError naming the missing placeholder. verified: next() without a required field -> ValueError naming it; happy path intact. Signed-off-by: disqualifier --- pyproject.toml | 2 +- src/aioproxies/__init__.py | 2 +- src/aioproxies/manager.py | 10 +++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6180af5..2730db2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "aioproxies" -version = "0.2.0" +version = "0.2.1" description = "proxy parsing, formatting, health, and pool management for aiohttp/aioweb, camoufox, and socks5" requires-python = ">=3.10" dependencies = [] diff --git a/src/aioproxies/__init__.py b/src/aioproxies/__init__.py index 9a5ea3d..8814edf 100644 --- a/src/aioproxies/__init__.py +++ b/src/aioproxies/__init__.py @@ -18,4 +18,4 @@ __all__ = [ "to_proxy", ] -__version__ = "0.2.0" +__version__ = "0.2.1" diff --git a/src/aioproxies/manager.py b/src/aioproxies/manager.py index 31a433a..7fc8319 100644 --- a/src/aioproxies/manager.py +++ b/src/aioproxies/manager.py @@ -123,7 +123,15 @@ class AioProxies: if self._static is not None: return self._static if self.template is not None: - return parse(self.template.format(session=self.session_id(), **fields)) + try: + filled = self.template.format(session=self.session_id(), **fields) + except (KeyError, IndexError) as exc: + # a template placeholder wasn't supplied in next(**fields) — fail loud + # but legible instead of leaking a bare KeyError from str.format + raise ValueError( + f"template placeholder {exc} not provided; pass it to next(**fields)" + ) from exc + return parse(filled) return self._next_from_list() def _next_from_list(self) -> Proxy: