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
89import asyncio
10+ from collections.abc import Awaitable, Callable
911import functools
1012import inspect
1113import logging
1214import time
15+ from types import TracebackType
16+ from typing import Any, Optional, Type
1317import warnings
1418
1519from . import compat
2327
2428class 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