11import itertools
2+ from typing import (
3+ TYPE_CHECKING ,
4+ Any ,
5+ Callable ,
6+ Sequence ,
7+ Tuple ,
8+ )
29
310from eth_utils import (
411 to_bytes ,
1118from web3 .middleware import (
1219 combine_middlewares ,
1320)
21+ from web3 .types import (
22+ Middleware ,
23+ MiddlewareOnion ,
24+ RPCEndpoint ,
25+ RPCResponse ,
26+ )
27+
28+ if TYPE_CHECKING :
29+ from web3 import Web3 # noqa: F401
1430
1531
1632class BaseProvider :
17- _middlewares = ()
18- _request_func_cache = (None , None ) # a tuple of (all_middlewares, request_func)
33+ _middlewares : Tuple [Middleware , ...] = ()
34+ # a tuple of (all_middlewares, request_func)
35+ _request_func_cache : Tuple [Tuple [Middleware , ...], Callable [..., RPCResponse ]] = (None , None )
1936
2037 @property
21- def middlewares (self ):
38+ def middlewares (self ) -> Tuple [ Middleware , ...] :
2239 return self ._middlewares
2340
2441 @middlewares .setter
25- def middlewares (self , values ):
26- self ._middlewares = tuple (values )
27-
28- def request_func (self , web3 , outer_middlewares ):
42+ def middlewares (
43+ self , values : MiddlewareOnion
44+ ) -> None :
45+ # tuple(values) converts to MiddlewareOnion -> Tuple[Middleware, ...]
46+ self ._middlewares = tuple (values ) # type: ignore
47+
48+ def request_func (
49+ self , web3 : "Web3" , outer_middlewares : MiddlewareOnion
50+ ) -> Callable [..., RPCResponse ]:
2951 """
3052 @param outer_middlewares is an iterable of middlewares, ordered by first to execute
3153 @returns a function that calls all the middleware and eventually self.make_request()
3254 """
33- all_middlewares = tuple (outer_middlewares ) + tuple (self .middlewares )
55+ # type ignored b/c tuple(MiddlewareOnion) converts to tuple of middlewares
56+ all_middlewares : Tuple [Middleware ] = tuple (outer_middlewares ) + tuple (self .middlewares ) # type: ignore # noqa: E501
3457
3558 cache_key = self ._request_func_cache [0 ]
3659 if cache_key is None or cache_key != all_middlewares :
@@ -40,29 +63,31 @@ def request_func(self, web3, outer_middlewares):
4063 )
4164 return self ._request_func_cache [- 1 ]
4265
43- def _generate_request_func (self , web3 , middlewares ):
66+ def _generate_request_func (
67+ self , web3 : "Web3" , middlewares : Sequence [Middleware ]
68+ ) -> Callable [..., RPCResponse ]:
4469 return combine_middlewares (
4570 middlewares = middlewares ,
4671 web3 = web3 ,
4772 provider_request_fn = self .make_request ,
4873 )
4974
50- def make_request (self , method , params ) :
75+ def make_request (self , method : RPCEndpoint , params : Any ) -> RPCResponse :
5176 raise NotImplementedError ("Providers must implement this method" )
5277
53- def isConnected (self ):
78+ def isConnected (self ) -> bool :
5479 raise NotImplementedError ("Providers must implement this method" )
5580
5681
5782class JSONBaseProvider (BaseProvider ):
58- def __init__ (self ):
83+ def __init__ (self ) -> None :
5984 self .request_counter = itertools .count ()
6085
61- def decode_rpc_response (self , response ) :
62- text_response = to_text (response )
86+ def decode_rpc_response (self , raw_response : bytes ) -> RPCResponse :
87+ text_response = to_text (raw_response )
6388 return FriendlyJsonSerde ().json_decode (text_response )
6489
65- def encode_rpc_request (self , method , params ) :
90+ def encode_rpc_request (self , method : RPCEndpoint , params : Any ) -> bytes :
6691 rpc_dict = {
6792 "jsonrpc" : "2.0" ,
6893 "method" : method ,
@@ -72,9 +97,9 @@ def encode_rpc_request(self, method, params):
7297 encoded = FriendlyJsonSerde ().json_encode (rpc_dict )
7398 return to_bytes (text = encoded )
7499
75- def isConnected (self ):
100+ def isConnected (self ) -> bool :
76101 try :
77- response = self .make_request ('web3_clientVersion' , [])
102+ response = self .make_request (RPCEndpoint ( 'web3_clientVersion' ) , [])
78103 except IOError :
79104 return False
80105
0 commit comments