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