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 ,
815from web3 ._utils .encoding import (
916 FriendlyJsonSerde ,
1017)
18+ from web3 .datastructures import (
19+ NamedElementOnion ,
20+ )
1121from web3 .middleware import (
1222 combine_middlewares ,
1323)
24+ from web3 .types import (
25+ Middleware ,
26+ RPCEndpoint ,
27+ RPCResponse ,
28+ )
29+
30+ if TYPE_CHECKING :
31+ from web3 import Web3 # noqa: F401
1432
1533
1634class BaseProvider :
17- _middlewares = ()
18- _request_func_cache = (None , None ) # a tuple of (all_middlewares, request_func)
35+ _middlewares : Tuple [Middleware , ...] = ()
36+ # a tuple of (all_middlewares, request_func)
37+ _request_func_cache : Tuple [Tuple [Middleware , ...], Callable [..., RPCResponse ]] = (None , None )
1938
2039 @property
21- def middlewares (self ):
40+ def middlewares (self ) -> Tuple [ Middleware , ...] :
2241 return self ._middlewares
2342
43+ # web3/manager.py:77: error: "NamedElementOnion" expects 2 type arguments, but 1 given
2444 @middlewares .setter
25- def middlewares (self , values ):
45+ def middlewares (
46+ self , values : NamedElementOnion [Sequence [Tuple [Middleware , str ]]] # type: ignore
47+ ) -> None :
2648 self ._middlewares = tuple (values )
2749
28- def request_func (self , web3 , outer_middlewares ):
50+ def request_func (
51+ self , web3 : "Web3" , outer_middlewares : Sequence [Middleware ]
52+ ) -> Callable [..., RPCResponse ]:
2953 """
3054 @param outer_middlewares is an iterable of middlewares, ordered by first to execute
3155 @returns a function that calls all the middleware and eventually self.make_request()
@@ -40,29 +64,31 @@ def request_func(self, web3, outer_middlewares):
4064 )
4165 return self ._request_func_cache [- 1 ]
4266
43- def _generate_request_func (self , web3 , middlewares ):
67+ def _generate_request_func (
68+ self , web3 : "Web3" , middlewares : Sequence [Middleware ]
69+ ) -> Callable [..., RPCResponse ]:
4470 return combine_middlewares (
4571 middlewares = middlewares ,
4672 web3 = web3 ,
4773 provider_request_fn = self .make_request ,
4874 )
4975
50- def make_request (self , method , params ) :
76+ def make_request (self , method : RPCEndpoint , params : Any ) -> RPCResponse :
5177 raise NotImplementedError ("Providers must implement this method" )
5278
53- def isConnected (self ):
79+ def isConnected (self ) -> bool :
5480 raise NotImplementedError ("Providers must implement this method" )
5581
5682
5783class JSONBaseProvider (BaseProvider ):
58- def __init__ (self ):
84+ def __init__ (self ) -> None :
5985 self .request_counter = itertools .count ()
6086
61- def decode_rpc_response (self , response ) :
62- text_response = to_text (response )
87+ def decode_rpc_response (self , raw_response : bytes ) -> RPCResponse :
88+ text_response = to_text (raw_response )
6389 return FriendlyJsonSerde ().json_decode (text_response )
6490
65- def encode_rpc_request (self , method , params ) :
91+ def encode_rpc_request (self , method : RPCEndpoint , params : Any ) -> bytes :
6692 rpc_dict = {
6793 "jsonrpc" : "2.0" ,
6894 "method" : method ,
@@ -72,9 +98,9 @@ def encode_rpc_request(self, method, params):
7298 encoded = FriendlyJsonSerde ().json_encode (rpc_dict )
7399 return to_bytes (text = encoded )
74100
75- def isConnected (self ):
101+ def isConnected (self ) -> bool :
76102 try :
77- response = self .make_request ('web3_clientVersion' , [])
103+ response = self .make_request (RPCEndpoint ( 'web3_clientVersion' ) , [])
78104 except IOError :
79105 return False
80106
0 commit comments