-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathconfig.py
More file actions
205 lines (145 loc) · 6.14 KB
/
config.py
File metadata and controls
205 lines (145 loc) · 6.14 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
196
197
198
199
200
201
202
203
204
205
import os
from functools import cache
from pathlib import Path
from typing import Any, Optional
from multiversx_sdk import NetworkProviderConfig
from multiversx_sdk_cli import errors, utils
from multiversx_sdk_cli.constants import LOG_LEVELS, SDK_PATH
from multiversx_sdk_cli.ux import show_warning
LOCAL_CONFIG_PATH = Path("mxpy.json").resolve()
GLOBAL_CONFIG_PATH = SDK_PATH / "mxpy.json"
def get_dependency_resolution(key: str) -> str:
try:
return get_value(f"dependencies.{key}.resolution")
except Exception:
return ""
def get_dependency_tag(key: str) -> str:
return get_value(f"dependencies.{key}.tag")
def set_dependency_tag(key: str, tag: str):
set_value(f"dependencies.{key}.tag", tag)
def get_dependency_url(key: str, tag: str, platform: str) -> str:
url_template = get_value(f"dependencies.{key}.urlTemplate.{platform}")
return url_template.replace("{TAG}", tag)
@cache
def get_value(name: str) -> str:
_guard_valid_name(name)
data = get_active()
default_value = get_defaults()[name]
value = data.get(name, default_value)
assert isinstance(value, str)
return value
def set_value(name: str, value: Any):
_guard_valid_name(name)
data = read_file()
active_config = data.get("active", "default")
data.setdefault("configurations", {})
data["configurations"].setdefault(active_config, {})
data["configurations"][active_config][name] = value
write_file(data)
def delete_value(name: str):
_guard_valid_config_deletion(name)
data = read_file()
active_config = data.get("active", "default")
data.setdefault("configurations", {})
data["configurations"].setdefault(active_config, {})
del data["configurations"][active_config][name]
write_file(data)
def get_active() -> dict[str, Any]:
data = read_file()
configs = data.get("configurations", {})
active_config_name: str = data.get("active", "default")
empty_config: dict[str, Any] = dict()
result: dict[str, Any] = configs.get(active_config_name, empty_config)
return result
def set_active(name: str):
data = read_file()
_guard_valid_config_name(data, name)
data["active"] = name
write_file(data)
def create_new_config(name: str, template: str):
data = read_file()
_guard_config_unique(data, name)
new_config = {}
if template:
_guard_valid_config_name(data, template)
new_config = data["configurations"][template]
data["active"] = name
data.setdefault("configurations", {})
data["configurations"][name] = new_config
write_file(data)
def delete_config(name: str):
_guard_valid_config_deletion(name)
data = read_file()
data["configurations"].pop(name, None)
if data["active"] == name:
data["active"] = "default"
write_file(data)
def _guard_valid_name(name: str):
if name not in get_defaults().keys():
raise errors.UnknownConfigurationError(name)
def _guard_valid_config_name(config: Any, name: str):
configurations = config.get("configurations", {})
if name not in configurations:
raise errors.UnknownConfigurationError(name)
def _guard_config_unique(config: Any, name: str):
configurations = config.get("configurations", {})
if name in configurations:
raise errors.ConfigurationShouldBeUniqueError(name)
def _guard_valid_config_deletion(name: str):
if name == "default":
raise errors.ConfigurationProtectedError(name)
def get_defaults() -> dict[str, Any]:
return {
"dependencies.golang.resolution": "SDK",
"dependencies.golang.tag": "go1.23.10",
"dependencies.golang.urlTemplate.linux": "https://golang.org/dl/{TAG}.linux-{ARCH}.tar.gz",
"dependencies.golang.urlTemplate.osx": "https://golang.org/dl/{TAG}.darwin-amd64.tar.gz",
"dependencies.golang.urlTemplate.windows": "https://golang.org/dl/{TAG}.windows-amd64.zip",
"dependencies.testwallets.tag": "v1.0.0",
"dependencies.testwallets.urlTemplate.linux": "https://github.com/multiversx/mx-sdk-testwallets/archive/{TAG}.tar.gz",
"dependencies.testwallets.urlTemplate.osx": "https://github.com/multiversx/mx-sdk-testwallets/archive/{TAG}.tar.gz",
"dependencies.testwallets.urlTemplate.windows": "https://github.com/multiversx/mx-sdk-testwallets/archive/{TAG}.tar.gz",
"github_api_token": "",
"log_level": "info",
"gas_limit_multiplier": "1.0",
}
def get_gas_limit_multiplier_from_config() -> float:
value = get_value("gas_limit_multiplier")
return float(value)
def get_log_level_from_config() -> str:
log_level = get_value("log_level")
if log_level not in LOG_LEVELS:
default_log_level: str = get_defaults()["log_level"]
show_warning(f"Invalid log level set in config: [{log_level}]. Defaulting to [{default_log_level}].")
return default_log_level
return log_level
def get_deprecated_entries_in_config_file():
default_config_keys = set(get_defaults().keys())
current_config_keys = set(get_active().keys())
return current_config_keys - default_config_keys
def resolve_config_path() -> Path:
if os.path.isfile(LOCAL_CONFIG_PATH):
return LOCAL_CONFIG_PATH
return GLOBAL_CONFIG_PATH
@cache
def read_file() -> dict[str, Any]:
config_path = resolve_config_path()
if config_path.exists():
data: dict[str, Any] = utils.read_json_file(config_path)
return data
return dict()
def write_file(data: dict[str, Any]):
config_path = resolve_config_path()
utils.write_json_file(str(config_path), data)
def get_dependency_directory(key: str, tag: str) -> Path:
parent_directory = get_dependency_parent_directory(key)
return parent_directory / tag
def get_dependency_parent_directory(key: str) -> Path:
return SDK_PATH / key
_proxy_headers: dict[str, str] = {}
def set_proxy_headers(headers: dict[str, str]) -> None:
global _proxy_headers
_proxy_headers = headers
def get_config_for_network_providers() -> NetworkProviderConfig:
requests_options: Optional[dict[str, Any]] = {"headers": _proxy_headers} if _proxy_headers else None
return NetworkProviderConfig(client_name="mxpy", requests_options=requests_options)