77
88from argparse import ArgumentParser
99from getpass import getpass as secure_input
10- from sys import argv
10+ from logging import INFO , basicConfig , getLogger
11+ from sys import argv , stderr
1112
12- from iota import __version__
1313from six import text_type
1414
1515# Import all IOTA symbols into module scope, so that it's more
1616# convenient for the user.
1717from iota import *
1818
19+ from iota import __version__
20+ from iota .adapter import resolve_adapter
21+ from iota .adapter .wrappers import LogWrapper , RoutingWrapper
22+
1923
20- def main (uri , testnet ):
24+ basicConfig (level = INFO , stream = stderr )
25+
26+
27+ def main (uri , testnet , pow_uri , debug_requests ):
28+ # type: (Text, bool, Text, bool) -> None
2129 seed = secure_input (
2230 'Enter seed and press return (typing will not be shown).\n '
2331 'If no seed is specified, a random one will be used instead.\n '
@@ -26,7 +34,17 @@ def main(uri, testnet):
2634 if isinstance (seed , text_type ):
2735 seed = seed .encode ('ascii' )
2836
29- iota = Iota (uri , seed = seed , testnet = testnet )
37+ # If ``pow_uri`` is specified, route POW requests to a separate node.
38+ adapter_ = create_adapter (uri , debug_requests )
39+ if pow_uri :
40+ pow_adapter = create_adapter (pow_uri , debug_requests )
41+
42+ adapter_ = \
43+ RoutingWrapper (adapter_ )\
44+ .add_route ('attachToTangle' , pow_adapter )\
45+ .add_route ('interruptAttachingToTangle' , pow_adapter )
46+
47+ iota = Iota (adapter_ , seed = seed , testnet = testnet )
3048
3149 _banner = (
3250 'IOTA API client for {uri} ({testnet}) initialized as variable `iota`.\n '
@@ -39,6 +57,26 @@ def main(uri, testnet):
3957 start_shell (iota , _banner )
4058
4159
60+ def create_adapter (uri , debug ):
61+ # type: (Text, bool) -> BaseAdapter
62+ """
63+ Creates an adapter with the specified settings.
64+
65+ :param uri:
66+ Node URI.
67+
68+ :param debug:
69+ Whether to attach a LogWrapper to the adapter.
70+ """
71+ adapter_ = resolve_adapter (uri )
72+
73+ return (
74+ LogWrapper (adapter_ , getLogger (__name__ ), INFO )
75+ if debug
76+ else adapter_
77+ )
78+
79+
4280def start_shell (iota , _banner ):
4381 """
4482 Starts the shell with limited scope.
@@ -71,11 +109,27 @@ def start_shell(iota, _banner):
71109 '(defaults to udp://localhost:14265/).' ,
72110 )
73111
112+ parser .add_argument (
113+ '--pow-uri' ,
114+ type = text_type ,
115+ default = None ,
116+ dest = 'pow_uri' ,
117+ help = 'URI of node to send POW requests to.'
118+ )
119+
74120 parser .add_argument (
75121 '--testnet' ,
76122 action = 'store_true' ,
77123 default = False ,
78- help = 'If specified, use testnet settings (e.g., for PoW).' ,
124+ help = 'If set, use testnet settings (e.g., for PoW).' ,
125+ )
126+
127+ parser .add_argument (
128+ '--debug' ,
129+ action = 'store_true' ,
130+ default = False ,
131+ dest = 'debug_requests' ,
132+ help = 'If set, log HTTP requests to stderr.'
79133 )
80134
81135 main (** vars (parser .parse_args (argv [1 :])))
0 commit comments