4
4
# This module is part of asyncpg and is released under
5
5
# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
6
6
7
+ from __future__ import annotations
7
8
8
9
import asyncio
10
+ from collections .abc import Awaitable , Callable
9
11
import functools
10
12
import inspect
11
13
import logging
12
14
import time
15
+ from types import TracebackType
16
+ from typing import Any , Optional , Type
13
17
import warnings
14
18
15
19
from . import compat
23
27
24
28
class PoolConnectionProxyMeta (type ):
25
29
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 :
27
38
if wrap :
28
39
for attrname in dir (connection .Connection ):
29
40
if attrname .startswith ('_' ) or attrname in dct :
@@ -44,8 +55,10 @@ def __new__(mcls, name, bases, dct, *, wrap=False):
44
55
return super ().__new__ (mcls , name , bases , dct )
45
56
46
57
@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 :
49
62
# This method will be owned by PoolConnectionProxy class.
50
63
if self ._con is None :
51
64
raise exceptions .InterfaceError (
@@ -68,25 +81,26 @@ class PoolConnectionProxy(connection._ConnectionProxy,
68
81
69
82
__slots__ = ('_con' , '_holder' )
70
83
71
- def __init__ (self , holder : 'PoolConnectionHolder' ,
72
- con : connection .Connection ):
84
+ def __init__ (
85
+ self , holder : PoolConnectionHolder , con : connection .Connection
86
+ ) -> None :
73
87
self ._con = con
74
88
self ._holder = holder
75
89
con ._set_proxy (self )
76
90
77
- def __getattr__ (self , attr ) :
91
+ def __getattr__ (self , attr : str ) -> Any :
78
92
# Proxy all unresolved attributes to the wrapped Connection object.
79
93
return getattr (self ._con , attr )
80
94
81
- def _detach (self ) -> connection .Connection :
95
+ def _detach (self ) -> Optional [ connection .Connection ] :
82
96
if self ._con is None :
83
97
return
84
98
85
99
con , self ._con = self ._con , None
86
100
con ._set_proxy (None )
87
101
return con
88
102
89
- def __repr__ (self ):
103
+ def __repr__ (self ) -> str :
90
104
if self ._con is None :
91
105
return '<{classname} [released] {id:#x}>' .format (
92
106
classname = self .__class__ .__name__ , id = id (self ))
@@ -103,27 +117,34 @@ class PoolConnectionHolder:
103
117
'_inactive_callback' , '_timeout' ,
104
118
'_generation' )
105
119
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 :
107
128
108
129
self ._pool = pool
109
- self ._con = None
110
- self ._proxy = None
130
+ self ._con : Optional [ connection . Connection ] = None
131
+ self ._proxy : Optional [ PoolConnectionProxy ] = None
111
132
112
133
self ._max_queries = max_queries
113
134
self ._max_inactive_time = max_inactive_time
114
135
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
119
140
120
- def is_connected (self ):
141
+ def is_connected (self ) -> bool :
121
142
return self ._con is not None and not self ._con .is_closed ()
122
143
123
- def is_idle (self ):
144
+ def is_idle (self ) -> bool :
124
145
return not self ._in_use
125
146
126
- async def connect (self ):
147
+ async def connect (self ) -> None :
127
148
if self ._con is not None :
128
149
raise exceptions .InternalClientError (
129
150
'PoolConnectionHolder.connect() called while another '
@@ -171,7 +192,7 @@ async def acquire(self) -> PoolConnectionProxy:
171
192
172
193
return proxy
173
194
174
- async def release (self , timeout ) :
195
+ async def release (self , timeout : Optional [ float ]) -> None :
175
196
if self ._in_use is None :
176
197
raise exceptions .InternalClientError (
177
198
'PoolConnectionHolder.release() called on '
@@ -234,25 +255,25 @@ async def release(self, timeout):
234
255
# Rearm the connection inactivity timer.
235
256
self ._setup_inactive_callback ()
236
257
237
- async def wait_until_released (self ):
258
+ async def wait_until_released (self ) -> None :
238
259
if self ._in_use is None :
239
260
return
240
261
else :
241
262
await self ._in_use
242
263
243
- async def close (self ):
264
+ async def close (self ) -> None :
244
265
if self ._con is not None :
245
266
# Connection.close() will call _release_on_close() to
246
267
# finish holder cleanup.
247
268
await self ._con .close ()
248
269
249
- def terminate (self ):
270
+ def terminate (self ) -> None :
250
271
if self ._con is not None :
251
272
# Connection.terminate() will call _release_on_close() to
252
273
# finish holder cleanup.
253
274
self ._con .terminate ()
254
275
255
- def _setup_inactive_callback (self ):
276
+ def _setup_inactive_callback (self ) -> None :
256
277
if self ._inactive_callback is not None :
257
278
raise exceptions .InternalClientError (
258
279
'pool connection inactivity timer already exists' )
@@ -261,12 +282,12 @@ def _setup_inactive_callback(self):
261
282
self ._inactive_callback = self ._pool ._loop .call_later (
262
283
self ._max_inactive_time , self ._deactivate_inactive_connection )
263
284
264
- def _maybe_cancel_inactive_callback (self ):
285
+ def _maybe_cancel_inactive_callback (self ) -> None :
265
286
if self ._inactive_callback is not None :
266
287
self ._inactive_callback .cancel ()
267
288
self ._inactive_callback = None
268
289
269
- def _deactivate_inactive_connection (self ):
290
+ def _deactivate_inactive_connection (self ) -> None :
270
291
if self ._in_use is not None :
271
292
raise exceptions .InternalClientError (
272
293
'attempting to deactivate an acquired connection' )
@@ -280,12 +301,12 @@ def _deactivate_inactive_connection(self):
280
301
# so terminate() above will not call the below.
281
302
self ._release_on_close ()
282
303
283
- def _release_on_close (self ):
304
+ def _release_on_close (self ) -> None :
284
305
self ._maybe_cancel_inactive_callback ()
285
306
self ._release ()
286
307
self ._con = None
287
308
288
- def _release (self ):
309
+ def _release (self ) -> None :
289
310
"""Release this connection holder."""
290
311
if self ._in_use is None :
291
312
# The holder is not checked out.
@@ -1012,7 +1033,7 @@ class PoolAcquireContext:
1012
1033
1013
1034
__slots__ = ('timeout' , 'connection' , 'done' , 'pool' )
1014
1035
1015
- def __init__ (self , pool , timeout ) :
1036
+ def __init__ (self , pool : Pool , timeout : Optional [ float ]) -> None :
1016
1037
self .pool = pool
1017
1038
self .timeout = timeout
1018
1039
self .connection = None
@@ -1024,7 +1045,12 @@ async def __aenter__(self):
1024
1045
self .connection = await self .pool ._acquire (self .timeout )
1025
1046
return self .connection
1026
1047
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 :
1028
1054
self .done = True
1029
1055
con = self .connection
1030
1056
self .connection = None
0 commit comments