-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathcli.py
More file actions
195 lines (165 loc) · 6.75 KB
/
cli.py
File metadata and controls
195 lines (165 loc) · 6.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# PYTHON_ARGCOMPLETE_OK
import argparse
import logging
import sys
from argparse import ArgumentParser
from typing import Any
import argcomplete
from multiversx_sdk import LibraryConfig
from rich.logging import RichHandler
import multiversx_sdk_cli.cli_config
import multiversx_sdk_cli.cli_config_env
import multiversx_sdk_cli.cli_config_wallet
import multiversx_sdk_cli.cli_contracts
import multiversx_sdk_cli.cli_data
import multiversx_sdk_cli.cli_delegation
import multiversx_sdk_cli.cli_deps
import multiversx_sdk_cli.cli_dns
import multiversx_sdk_cli.cli_faucet
import multiversx_sdk_cli.cli_get
import multiversx_sdk_cli.cli_governance
import multiversx_sdk_cli.cli_ledger
import multiversx_sdk_cli.cli_localnet
import multiversx_sdk_cli.cli_multisig
import multiversx_sdk_cli.cli_tokens
import multiversx_sdk_cli.cli_transactions
import multiversx_sdk_cli.cli_validator_wallet
import multiversx_sdk_cli.cli_validators
import multiversx_sdk_cli.cli_wallet
import multiversx_sdk_cli.version
from multiversx_sdk_cli import config, errors, utils, ux
from multiversx_sdk_cli.cli_shared import parse_proxy_headers, set_proxy_from_config_if_not_provided
from multiversx_sdk_cli.config_env import get_address_hrp
from multiversx_sdk_cli.constants import LOG_LEVELS, SDK_PATH
logger = logging.getLogger("cli")
def main(cli_args: list[str] = sys.argv[1:]):
try:
_do_main(cli_args)
except errors.KnownError as err:
logger.critical(err.get_pretty())
ux.show_critical_error(err.get_pretty())
return 1
except KeyboardInterrupt:
print("process killed by user.")
return 1
return 0
def _do_main(cli_args: list[str]):
utils.ensure_folder(SDK_PATH)
parser = setup_parser(cli_args)
argcomplete.autocomplete(parser)
_handle_global_arguments(cli_args)
args = parser.parse_args(cli_args)
if args.verbose:
logging.basicConfig(
level="DEBUG",
force=True,
format="%(name)s: %(message)s",
handlers=[RichHandler(show_time=False, rich_tracebacks=True)],
)
else:
level: str = args.log_level
logging.basicConfig(
level=level.upper(),
format="%(name)s: %(message)s",
handlers=[RichHandler(show_time=False, rich_tracebacks=True)],
)
verify_deprecated_entries_in_config_file()
default_hrp = get_address_hrp()
LibraryConfig.default_address_hrp = default_hrp
if not hasattr(args, "func"):
parser.print_help()
else:
set_proxy_from_config_if_not_provided(args)
config.set_proxy_headers(parse_proxy_headers(getattr(args, "proxy_headers", None)))
args.func(args)
def setup_parser(args: list[str]):
parser = ArgumentParser(
prog="mxpy",
usage="mxpy [-h] [-v] [--verbose] COMMAND-GROUP [-h] COMMAND ...",
description="""
-----------
DESCRIPTION
-----------
mxpy is part of the multiversx-sdk and consists of Command Line Tools and Python SDK
for interacting with the Blockchain (in general) and with Smart Contracts (in particular).
mxpy targets a broad audience of users and developers.
See:
- https://docs.multiversx.com/sdk-and-tools/sdk-py
- https://docs.multiversx.com/sdk-and-tools/sdk-py/mxpy-cli
""",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser._positionals.title = "COMMAND GROUPS"
parser._optionals.title = "TOP-LEVEL OPTIONS"
version = multiversx_sdk_cli.version.get_version()
parser.add_argument(
"-v",
"--version",
action="version",
version=f"MultiversX Python CLI (mxpy) {version}",
)
parser.add_argument("--verbose", action="store_true", default=False)
parser.add_argument(
"--log-level",
type=str,
default=config.get_log_level_from_config(),
choices=LOG_LEVELS,
help="default: %(default)s",
)
subparsers = parser.add_subparsers()
commands: list[Any] = []
commands.append(multiversx_sdk_cli.cli_config_wallet.setup_parser(subparsers))
commands.append(multiversx_sdk_cli.cli_contracts.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_transactions.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_validators.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_ledger.setup_parser(subparsers))
commands.append(multiversx_sdk_cli.cli_wallet.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_validator_wallet.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_deps.setup_parser(subparsers))
commands.append(multiversx_sdk_cli.cli_config.setup_parser(subparsers))
commands.append(multiversx_sdk_cli.cli_localnet.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_data.setup_parser(subparsers))
commands.append(multiversx_sdk_cli.cli_delegation.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_dns.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_faucet.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_multisig.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_governance.setup_parser(args, subparsers))
commands.append(multiversx_sdk_cli.cli_config_env.setup_parser(subparsers))
commands.append(multiversx_sdk_cli.cli_get.setup_parser(subparsers))
commands.append(multiversx_sdk_cli.cli_tokens.setup_parser(args, subparsers))
parser.epilog = """
----------------------
COMMAND GROUPS summary
----------------------
"""
for choice, sub in subparsers.choices.items():
parser.epilog += f"{choice.ljust(30)} {sub.description}\n"
return parser
def verify_deprecated_entries_in_config_file():
deprecated_keys = config.get_deprecated_entries_in_config_file()
if len(deprecated_keys) == 0:
return
config_path = config.resolve_config_path()
message = f"The following config entries are deprecated. Please access `{str(config_path)}` and remove them. \n"
for entry in deprecated_keys:
message += f"-> {entry} \n"
ux.show_warning(message.rstrip("\n"))
def _handle_global_arguments(args: list[str]):
"""
Handle global arguments like --verbose and --log-level.
"""
log_level_arg = "--log-level"
if log_level_arg in args:
index = args.index(log_level_arg)
if index + 1 >= len(args):
raise ValueError(f"Argument {log_level_arg} must be followed by a log level value.")
log_arg = args.pop(index)
log_value = args.pop(index)
args.insert(0, log_value)
args.insert(0, log_arg)
if "--verbose" in args:
args.remove("--verbose")
args.insert(0, "--verbose")
if __name__ == "__main__":
ret = main(sys.argv[1:])
sys.exit(ret)