Skip to content

Commit 4bab2a0

Browse files
Adam Dobrawyclaude
andcommitted
Add context manager support to AnticaptchaClient
Enable clean resource cleanup of the underlying requests.Session via `with` statement, `close()`, or `__exit__`. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1365e65 commit 4bab2a0

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
@@ -98,6 +98,16 @@ def __init__(
9898
)
9999
self.session = requests.Session()
100100

101+
def __enter__(self):
102+
return self
103+
104+
def __exit__(self, exc_type, exc_val, exc_tb):
105+
self.session.close()
106+
return False
107+
108+
def close(self):
109+
self.session.close()
110+
101111
@property
102112
def client_ip(self) -> str:
103113
if not hasattr(self, "_client_ip"):

tests/test_base.py

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

151151

152+
class TestContextManager:
153+
def test_enter_returns_self(self):
154+
client = AnticaptchaClient("key123")
155+
assert client.__enter__() is client
156+
157+
def test_exit_closes_session(self):
158+
client = AnticaptchaClient("key123")
159+
with patch.object(client.session, "close") as mock_close:
160+
client.__exit__(None, None, None)
161+
mock_close.assert_called_once()
162+
163+
def test_close_closes_session(self):
164+
client = AnticaptchaClient("key123")
165+
with patch.object(client.session, "close") as mock_close:
166+
client.close()
167+
mock_close.assert_called_once()
168+
169+
def test_with_statement(self):
170+
with AnticaptchaClient("key123") as client:
171+
assert isinstance(client, AnticaptchaClient)
172+
session = client.session
173+
with patch.object(session, "close") as mock_close:
174+
# Session was already closed by __exit__, verify it's callable
175+
session.close()
176+
mock_close.assert_called_once()
177+
178+
def test_exit_returns_false(self):
179+
client = AnticaptchaClient("key123")
180+
result = client.__exit__(None, None, None)
181+
assert result is False
182+
183+
152184
class TestSnakeCaseAliases:
153185
def test_create_task_alias(self):
154186
assert AnticaptchaClient.create_task is AnticaptchaClient.createTask

0 commit comments

Comments
 (0)