Skip to content

Commit e9bb695

Browse files
authored
Add typing to auxiliary classes around Pool (#1197)
1 parent a273e0e commit e9bb695

File tree

1 file changed

+55
-29
lines changed

1 file changed

+55
-29
lines changed

asyncpg/pool.py

+55-29
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
# This module is part of asyncpg and is released under
55
# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
66

7+
from __future__ import annotations
78

89
import asyncio
10+
from collections.abc import Awaitable, Callable
911
import functools
1012
import inspect
1113
import logging
1214
import time
15+
from types import TracebackType
16+
from typing import Any, Optional, Type
1317
import warnings
1418

1519
from . import compat
@@ -23,7 +27,14 @@
2327

2428
class PoolConnectionProxyMeta(type):
2529

26-
def __new__(mcls, name, bases, dct, *, wrap=False):
30+
def __new__(
31+
mcls,
32+
name: str,
33+
bases: tuple[Type[Any], ...],
34+
dct: dict[str, Any],
35+
*,
36+
wrap: bool = False,
37+
) -> PoolConnectionProxyMeta:
2738
if wrap:
2839
for attrname in dir(connection.Connection):
2940
if attrname.startswith('_') or attrname in dct:
@@ -44,8 +55,10 @@ def __new__(mcls, name, bases, dct, *, wrap=False):
4455
return super().__new__(mcls, name, bases, dct)
4556

4657
@staticmethod
47-
def _wrap_connection_method(meth_name, iscoroutine):
48-
def call_con_method(self, *args, **kwargs):
58+
def _wrap_connection_method(
59+
meth_name: str, iscoroutine: bool
60+
) -> Callable[..., Any]:
61+
def call_con_method(self: Any, *args: Any, **kwargs: Any) -> Any:
4962
# This method will be owned by PoolConnectionProxy class.
5063
if self._con is None:
5164
raise exceptions.InterfaceError(
@@ -68,25 +81,26 @@ class PoolConnectionProxy(connection._ConnectionProxy,
6881

6982
__slots__ = ('_con', '_holder')
7083

71-
def __init__(self, holder: 'PoolConnectionHolder',
72-
con: connection.Connection):
84+
def __init__(
85+
self, holder: PoolConnectionHolder, con: connection.Connection
86+
) -> None:
7387
self._con = con
7488
self._holder = holder
7589
con._set_proxy(self)
7690

77-
def __getattr__(self, attr):
91+
def __getattr__(self, attr: str) -> Any:
7892
# Proxy all unresolved attributes to the wrapped Connection object.
7993
return getattr(self._con, attr)
8094

81-
def _detach(self) -> connection.Connection:
95+
def _detach(self) -> Optional[connection.Connection]:
8296
if self._con is None:
8397
return
8498

8599
con, self._con = self._con, None
86100
con._set_proxy(None)
87101
return con
88102

89-
def __repr__(self):
103+
def __repr__(self) -> str:
90104
if self._con is None:
91105
return '<{classname} [released] {id:#x}>'.format(
92106
classname=self.__class__.__name__, id=id(self))
@@ -103,27 +117,34 @@ class PoolConnectionHolder:
103117
'_inactive_callback', '_timeout',
104118
'_generation')
105119

106-
def __init__(self, pool, *, max_queries, setup, max_inactive_time):
120+
def __init__(
121+
self,
122+
pool: "Pool",
123+
*,
124+
max_queries: float,
125+
setup: Optional[Callable[[PoolConnectionProxy], Awaitable[None]]],
126+
max_inactive_time: float,
127+
) -> None:
107128

108129
self._pool = pool
109-
self._con = None
110-
self._proxy = None
130+
self._con: Optional[connection.Connection] = None
131+
self._proxy: Optional[PoolConnectionProxy] = None
111132

112133
self._max_queries = max_queries
113134
self._max_inactive_time = max_inactive_time
114135
self._setup = setup
115-
self._inactive_callback = None
116-
self._in_use = None # type: asyncio.Future
117-
self._timeout = None
118-
self._generation = None
136+
self._inactive_callback: Optional[Callable] = None
137+
self._in_use: Optional[asyncio.Future] = None
138+
self._timeout: Optional[float] = None
139+
self._generation: Optional[int] = None
119140

120-
def is_connected(self):
141+
def is_connected(self) -> bool:
121142
return self._con is not None and not self._con.is_closed()
122143

123-
def is_idle(self):
144+
def is_idle(self) -> bool:
124145
return not self._in_use
125146

126-
async def connect(self):
147+
async def connect(self) -> None:
127148
if self._con is not None:
128149
raise exceptions.InternalClientError(
129150
'PoolConnectionHolder.connect() called while another '
@@ -171,7 +192,7 @@ async def acquire(self) -> PoolConnectionProxy:
171192

172193
return proxy
173194

174-
async def release(self, timeout):
195+
async def release(self, timeout: Optional[float]) -> None:
175196
if self._in_use is None:
176197
raise exceptions.InternalClientError(
177198
'PoolConnectionHolder.release() called on '
@@ -234,25 +255,25 @@ async def release(self, timeout):
234255
# Rearm the connection inactivity timer.
235256
self._setup_inactive_callback()
236257

237-
async def wait_until_released(self):
258+
async def wait_until_released(self) -> None:
238259
if self._in_use is None:
239260
return
240261
else:
241262
await self._in_use
242263

243-
async def close(self):
264+
async def close(self) -> None:
244265
if self._con is not None:
245266
# Connection.close() will call _release_on_close() to
246267
# finish holder cleanup.
247268
await self._con.close()
248269

249-
def terminate(self):
270+
def terminate(self) -> None:
250271
if self._con is not None:
251272
# Connection.terminate() will call _release_on_close() to
252273
# finish holder cleanup.
253274
self._con.terminate()
254275

255-
def _setup_inactive_callback(self):
276+
def _setup_inactive_callback(self) -> None:
256277
if self._inactive_callback is not None:
257278
raise exceptions.InternalClientError(
258279
'pool connection inactivity timer already exists')
@@ -261,12 +282,12 @@ def _setup_inactive_callback(self):
261282
self._inactive_callback = self._pool._loop.call_later(
262283
self._max_inactive_time, self._deactivate_inactive_connection)
263284

264-
def _maybe_cancel_inactive_callback(self):
285+
def _maybe_cancel_inactive_callback(self) -> None:
265286
if self._inactive_callback is not None:
266287
self._inactive_callback.cancel()
267288
self._inactive_callback = None
268289

269-
def _deactivate_inactive_connection(self):
290+
def _deactivate_inactive_connection(self) -> None:
270291
if self._in_use is not None:
271292
raise exceptions.InternalClientError(
272293
'attempting to deactivate an acquired connection')
@@ -280,12 +301,12 @@ def _deactivate_inactive_connection(self):
280301
# so terminate() above will not call the below.
281302
self._release_on_close()
282303

283-
def _release_on_close(self):
304+
def _release_on_close(self) -> None:
284305
self._maybe_cancel_inactive_callback()
285306
self._release()
286307
self._con = None
287308

288-
def _release(self):
309+
def _release(self) -> None:
289310
"""Release this connection holder."""
290311
if self._in_use is None:
291312
# The holder is not checked out.
@@ -1012,7 +1033,7 @@ class PoolAcquireContext:
10121033

10131034
__slots__ = ('timeout', 'connection', 'done', 'pool')
10141035

1015-
def __init__(self, pool, timeout):
1036+
def __init__(self, pool: Pool, timeout: Optional[float]) -> None:
10161037
self.pool = pool
10171038
self.timeout = timeout
10181039
self.connection = None
@@ -1024,7 +1045,12 @@ async def __aenter__(self):
10241045
self.connection = await self.pool._acquire(self.timeout)
10251046
return self.connection
10261047

1027-
async def __aexit__(self, *exc):
1048+
async def __aexit__(
1049+
self,
1050+
exc_type: Optional[Type[BaseException]] = None,
1051+
exc_val: Optional[BaseException] = None,
1052+
exc_tb: Optional[TracebackType] = None,
1053+
) -> None:
10281054
self.done = True
10291055
con = self.connection
10301056
self.connection = None

0 commit comments

Comments
 (0)