Skip to content

Commit 149756f

Browse files
ad-mAdam Dobrawyclaude
authored
Add context manager support to AnticaptchaClient (#121)
Enable clean resource cleanup of the underlying requests.Session via `with` statement, `close()`, or `__exit__`. Co-authored-by: Adam Dobrawy <naczelnik@jawne.info.pl> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6597b82 commit 149756f

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

python_anticaptcha/base.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ def __init__(
105105
)
106106
self.session = requests.Session()
107107

108+
def __enter__(self):
109+
return self
110+
111+
def __exit__(self, exc_type, exc_val, exc_tb):
112+
self.session.close()
113+
return False
114+
115+
def close(self):
116+
self.session.close()
117+
108118
@property
109119
def client_ip(self) -> str:
110120
if not hasattr(self, "_client_ip"):

tests/test_base.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,38 @@ def test_timeout_raises(self, mock_sleep):
166166
assert "exceeded" in str(exc_info.value).lower()
167167

168168

169+
class TestContextManager:
170+
def test_enter_returns_self(self):
171+
client = AnticaptchaClient("key123")
172+
assert client.__enter__() is client
173+
174+
def test_exit_closes_session(self):
175+
client = AnticaptchaClient("key123")
176+
with patch.object(client.session, "close") as mock_close:
177+
client.__exit__(None, None, None)
178+
mock_close.assert_called_once()
179+
180+
def test_close_closes_session(self):
181+
client = AnticaptchaClient("key123")
182+
with patch.object(client.session, "close") as mock_close:
183+
client.close()
184+
mock_close.assert_called_once()
185+
186+
def test_with_statement(self):
187+
with AnticaptchaClient("key123") as client:
188+
assert isinstance(client, AnticaptchaClient)
189+
session = client.session
190+
with patch.object(session, "close") as mock_close:
191+
# Session was already closed by __exit__, verify it's callable
192+
session.close()
193+
mock_close.assert_called_once()
194+
195+
def test_exit_returns_false(self):
196+
client = AnticaptchaClient("key123")
197+
result = client.__exit__(None, None, None)
198+
assert result is False
199+
200+
169201
class TestSnakeCaseAliases:
170202
def test_create_task_alias(self):
171203
assert AnticaptchaClient.create_task is AnticaptchaClient.createTask

0 commit comments

Comments
 (0)