absfuyu 3.1.1__py3-none-any.whl → 3.3.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of absfuyu might be problematic. Click here for more details.
- absfuyu/__init__.py +3 -10
- absfuyu/__main__.py +5 -250
- absfuyu/cli/__init__.py +51 -0
- absfuyu/cli/color.py +24 -0
- absfuyu/cli/config_group.py +56 -0
- absfuyu/cli/do_group.py +76 -0
- absfuyu/cli/game_group.py +109 -0
- absfuyu/config/__init__.py +117 -100
- absfuyu/config/config.json +0 -7
- absfuyu/core.py +5 -66
- absfuyu/everything.py +7 -9
- absfuyu/extensions/beautiful.py +30 -23
- absfuyu/extensions/dev/__init__.py +11 -8
- absfuyu/extensions/dev/password_hash.py +4 -2
- absfuyu/extensions/dev/passwordlib.py +7 -5
- absfuyu/extensions/dev/project_starter.py +4 -2
- absfuyu/extensions/dev/shutdownizer.py +148 -0
- absfuyu/extensions/extra/__init__.py +1 -2
- absfuyu/extensions/extra/data_analysis.py +182 -107
- absfuyu/fun/WGS.py +50 -26
- absfuyu/fun/__init__.py +6 -7
- absfuyu/fun/tarot.py +1 -1
- absfuyu/game/__init__.py +75 -81
- absfuyu/game/game_stat.py +36 -0
- absfuyu/game/sudoku.py +41 -48
- absfuyu/game/tictactoe.py +303 -548
- absfuyu/game/wordle.py +56 -47
- absfuyu/general/__init__.py +17 -7
- absfuyu/general/content.py +16 -15
- absfuyu/general/data_extension.py +282 -90
- absfuyu/general/generator.py +67 -67
- absfuyu/general/human.py +74 -78
- absfuyu/logger.py +94 -68
- absfuyu/pkg_data/__init__.py +29 -25
- absfuyu/py.typed +0 -0
- absfuyu/sort.py +61 -47
- absfuyu/tools/__init__.py +0 -1
- absfuyu/tools/converter.py +80 -62
- absfuyu/tools/keygen.py +62 -67
- absfuyu/tools/obfuscator.py +57 -53
- absfuyu/tools/stats.py +24 -24
- absfuyu/tools/web.py +10 -9
- absfuyu/util/__init__.py +71 -33
- absfuyu/util/api.py +53 -43
- absfuyu/util/json_method.py +25 -27
- absfuyu/util/lunar.py +20 -24
- absfuyu/util/path.py +362 -241
- absfuyu/util/performance.py +217 -135
- absfuyu/util/pkl.py +8 -8
- absfuyu/util/zipped.py +17 -19
- absfuyu/version.py +160 -147
- absfuyu-3.3.3.dist-info/METADATA +124 -0
- absfuyu-3.3.3.dist-info/RECORD +59 -0
- {absfuyu-3.1.1.dist-info → absfuyu-3.3.3.dist-info}/WHEEL +1 -2
- {absfuyu-3.1.1.dist-info → absfuyu-3.3.3.dist-info}/entry_points.txt +1 -0
- {absfuyu-3.1.1.dist-info → absfuyu-3.3.3.dist-info/licenses}/LICENSE +1 -1
- absfuyu/extensions/dev/pkglib.py +0 -98
- absfuyu/game/tictactoe2.py +0 -318
- absfuyu-3.1.1.dist-info/METADATA +0 -215
- absfuyu-3.1.1.dist-info/RECORD +0 -55
- absfuyu-3.1.1.dist-info/top_level.txt +0 -1
absfuyu/config/__init__.py
CHANGED
|
@@ -3,11 +3,10 @@ Absfuyu: Configuration
|
|
|
3
3
|
----------------------
|
|
4
4
|
Package configuration module
|
|
5
5
|
|
|
6
|
-
Version: 2.0.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 2.0.4
|
|
7
|
+
Date updated: 06/04/2024 (dd/mm/yyyy)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
# Module level
|
|
12
11
|
###########################################################################
|
|
13
12
|
__all__ = [
|
|
@@ -20,28 +19,51 @@ __all__ = [
|
|
|
20
19
|
# Library
|
|
21
20
|
###########################################################################
|
|
22
21
|
from pathlib import Path
|
|
23
|
-
from typing import Any, Dict, List, Optional,
|
|
22
|
+
from typing import Any, Dict, List, Optional, TypedDict
|
|
24
23
|
|
|
25
24
|
from absfuyu.core import CONFIG_PATH
|
|
26
25
|
from absfuyu.util.json_method import JsonFile
|
|
27
26
|
|
|
28
|
-
|
|
29
27
|
# Setting
|
|
30
28
|
###########################################################################
|
|
31
|
-
_SPACE_REPLACE = "-"
|
|
29
|
+
_SPACE_REPLACE = "-" # Replace " " character in setting name
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Type hint
|
|
33
|
+
###########################################################################
|
|
34
|
+
class SettingDictFormat(TypedDict):
|
|
35
|
+
"""
|
|
36
|
+
Format for the ``setting`` section in ``config``
|
|
37
|
+
|
|
38
|
+
:param default: Default value for the setting
|
|
39
|
+
:param help: Description for the setting
|
|
40
|
+
:param value: Current value of the setting
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
default: Any
|
|
44
|
+
help: str
|
|
45
|
+
value: Any
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class ConfigFormat(TypedDict):
|
|
49
|
+
"""
|
|
50
|
+
Config file format
|
|
51
|
+
|
|
52
|
+
:param setting: setting section
|
|
53
|
+
:type setting: dict[str, SettingDictFormat]
|
|
54
|
+
:param version: version section
|
|
55
|
+
:type version: VersionDictFormat
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
setting: Dict[str, SettingDictFormat]
|
|
32
59
|
|
|
33
60
|
|
|
34
61
|
# Class
|
|
35
62
|
###########################################################################
|
|
36
63
|
class Setting:
|
|
37
64
|
"""Setting"""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
name: str,
|
|
41
|
-
value: Any,
|
|
42
|
-
default: Any,
|
|
43
|
-
help_: str = ""
|
|
44
|
-
) -> None:
|
|
65
|
+
|
|
66
|
+
def __init__(self, name: str, value: Any, default: Any, help_: str = "") -> None:
|
|
45
67
|
"""
|
|
46
68
|
:param name: Name of the setting
|
|
47
69
|
:param value: Value of the setting
|
|
@@ -52,40 +74,42 @@ class Setting:
|
|
|
52
74
|
self.value = value
|
|
53
75
|
self.default = default
|
|
54
76
|
self.help = help_
|
|
77
|
+
|
|
55
78
|
def __str__(self) -> str:
|
|
56
79
|
return f"{self.__class__.__name__}({self.name}: {self.value})"
|
|
80
|
+
|
|
57
81
|
def __repr__(self) -> str:
|
|
58
82
|
return self.__str__()
|
|
59
|
-
|
|
83
|
+
|
|
60
84
|
@classmethod
|
|
61
|
-
def from_dict(cls, dict_data: Dict[str,
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
85
|
+
def from_dict(cls, dict_data: Dict[str, SettingDictFormat]):
|
|
86
|
+
"""
|
|
87
|
+
Convert ``dict`` into ``Setting`` (``len==1`` only)
|
|
88
|
+
"""
|
|
89
|
+
name: str = list(dict_data.keys())[0]
|
|
90
|
+
_val: SettingDictFormat = list(dict_data.values())[0]
|
|
91
|
+
value: Any = _val["value"]
|
|
92
|
+
default: Any = _val["default"]
|
|
93
|
+
help_: str = _val["help"]
|
|
68
94
|
return cls(name, value, default, help_)
|
|
69
|
-
|
|
95
|
+
|
|
70
96
|
def reset(self) -> None:
|
|
71
97
|
"""
|
|
72
|
-
Reset setting to default value
|
|
98
|
+
Reset setting to default value
|
|
73
99
|
(``Setting.value = Setting.default``)
|
|
74
100
|
"""
|
|
75
101
|
self.value = self.default
|
|
76
|
-
|
|
102
|
+
|
|
77
103
|
def update_value(self, value: Any) -> None:
|
|
78
104
|
"""Update current value"""
|
|
79
105
|
self.value = value
|
|
80
106
|
|
|
81
|
-
def to_dict(self) -> Dict[str,
|
|
82
|
-
"""
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
"value": self.value
|
|
88
|
-
}
|
|
107
|
+
def to_dict(self) -> Dict[str, SettingDictFormat]:
|
|
108
|
+
"""
|
|
109
|
+
Convert ``Setting`` into ``dict``
|
|
110
|
+
"""
|
|
111
|
+
output: Dict[str, SettingDictFormat] = {
|
|
112
|
+
self.name: {"default": self.default, "help": self.help, "value": self.value}
|
|
89
113
|
}
|
|
90
114
|
return output
|
|
91
115
|
|
|
@@ -94,12 +118,13 @@ class Config:
|
|
|
94
118
|
"""
|
|
95
119
|
Config handling
|
|
96
120
|
"""
|
|
121
|
+
|
|
97
122
|
def __init__(self, config_file: Path, name: Optional[str] = None) -> None:
|
|
98
123
|
"""
|
|
99
124
|
config_file: Path to `.json` config file
|
|
100
125
|
"""
|
|
101
|
-
self.config_path = config_file
|
|
102
|
-
self.json_engine = JsonFile(self.config_path)
|
|
126
|
+
self.config_path: Path = config_file
|
|
127
|
+
self.json_engine: JsonFile = JsonFile(self.config_path)
|
|
103
128
|
|
|
104
129
|
if name:
|
|
105
130
|
self.name = name
|
|
@@ -107,62 +132,60 @@ class Config:
|
|
|
107
132
|
self.name = self.config_path.name
|
|
108
133
|
|
|
109
134
|
# Data
|
|
110
|
-
self.settings: List[Setting] = None
|
|
111
|
-
self.
|
|
112
|
-
self._fetch_data() # Load data
|
|
135
|
+
self.settings: List[Setting] = None # type: ignore
|
|
136
|
+
self._fetch_data() # Load data
|
|
113
137
|
|
|
114
138
|
def __str__(self) -> str:
|
|
115
139
|
return f"{self.__class__.__name__}({self.config_path.name})"
|
|
140
|
+
|
|
116
141
|
def __repr__(self) -> str:
|
|
117
142
|
return self.__str__()
|
|
118
|
-
|
|
143
|
+
|
|
119
144
|
# Data prepare and export
|
|
120
145
|
def _fetch_data(self) -> None:
|
|
121
146
|
"""Load data from ``self.config_file`` file"""
|
|
122
|
-
data = self.json_engine.load_json()
|
|
123
|
-
settings:
|
|
147
|
+
data: dict = self.json_engine.load_json()
|
|
148
|
+
settings: Dict[str, SettingDictFormat] = data.get("setting") # type: ignore
|
|
124
149
|
self.settings = [Setting.from_dict({k: v}) for k, v in settings.items()]
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def _prepare_data(self) -> Dict[str, dict]:
|
|
150
|
+
|
|
151
|
+
def _prepare_data(self) -> ConfigFormat:
|
|
128
152
|
"""Prepare data to save config"""
|
|
129
153
|
settings = dict()
|
|
130
|
-
for
|
|
131
|
-
settings.update(
|
|
154
|
+
for setting in self.settings:
|
|
155
|
+
settings.update(setting.to_dict())
|
|
132
156
|
|
|
133
|
-
out = {
|
|
134
|
-
"setting": settings,
|
|
135
|
-
"version": self.version
|
|
136
|
-
}
|
|
157
|
+
out: ConfigFormat = {"setting": settings}
|
|
137
158
|
return out
|
|
138
|
-
|
|
159
|
+
|
|
139
160
|
def save(self) -> None:
|
|
140
161
|
"""Save config to ``.json`` file"""
|
|
141
|
-
self.json_engine.update_data(
|
|
142
|
-
self._prepare_data()
|
|
143
|
-
)
|
|
162
|
+
self.json_engine.update_data(self._prepare_data()) # type: ignore
|
|
144
163
|
self.json_engine.save_json()
|
|
145
164
|
|
|
146
165
|
# Setting method
|
|
166
|
+
@property
|
|
167
|
+
def setting_list(self) -> List[str]:
|
|
168
|
+
"""List of name of available settings"""
|
|
169
|
+
return [setting.name for setting in self.settings]
|
|
170
|
+
|
|
147
171
|
def _get_setting(self, name: str):
|
|
148
172
|
"""Get setting"""
|
|
149
173
|
name = name.strip().lower().replace(" ", _SPACE_REPLACE)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return x
|
|
174
|
+
if name in self.setting_list:
|
|
175
|
+
for setting in self.settings:
|
|
176
|
+
if setting.name.startswith(name):
|
|
177
|
+
return setting
|
|
155
178
|
else:
|
|
156
|
-
raise ValueError(f"Setting list: {setting_list}")
|
|
157
|
-
|
|
179
|
+
raise ValueError(f"Setting list: {self.setting_list}")
|
|
180
|
+
|
|
158
181
|
def reset_config(self) -> None:
|
|
159
182
|
"""Reset all settings to default value"""
|
|
160
|
-
[
|
|
183
|
+
[setting.reset() for setting in self.settings] # type: ignore
|
|
161
184
|
self.save()
|
|
162
|
-
|
|
163
|
-
def show_settings(self) ->
|
|
185
|
+
|
|
186
|
+
def show_settings(self) -> List[Setting]:
|
|
164
187
|
"""
|
|
165
|
-
|
|
188
|
+
Returns a list of available settings
|
|
166
189
|
(wrapper for ``Config.settings``)
|
|
167
190
|
"""
|
|
168
191
|
return self.settings
|
|
@@ -170,29 +193,28 @@ class Config:
|
|
|
170
193
|
def change_setting(self, name: str, value: Any) -> None:
|
|
171
194
|
"""
|
|
172
195
|
Change ``Setting`` (if available)
|
|
173
|
-
|
|
196
|
+
|
|
174
197
|
Parameters
|
|
175
198
|
----------
|
|
176
199
|
name : str
|
|
177
200
|
Name of the setting
|
|
178
|
-
|
|
201
|
+
|
|
179
202
|
value : Any
|
|
180
203
|
Value of the setting
|
|
181
204
|
"""
|
|
182
205
|
name = name.strip().lower().replace(" ", _SPACE_REPLACE)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
x.update_value(value)
|
|
206
|
+
if name in self.setting_list:
|
|
207
|
+
for setting in self.settings:
|
|
208
|
+
if setting.name.startswith(name):
|
|
209
|
+
setting.update_value(value)
|
|
188
210
|
break
|
|
189
211
|
else:
|
|
190
|
-
raise ValueError(f"Setting list: {setting_list}")
|
|
212
|
+
raise ValueError(f"Setting list: {self.setting_list}")
|
|
191
213
|
self.save()
|
|
192
|
-
|
|
214
|
+
|
|
193
215
|
def toggle_setting(self, name: str) -> None:
|
|
194
216
|
"""
|
|
195
|
-
Special ``change_setting()`` method.
|
|
217
|
+
Special ``change_setting()`` method.
|
|
196
218
|
Turn on/off if ``type(<setting>) is bool``
|
|
197
219
|
|
|
198
220
|
Parameters
|
|
@@ -207,13 +229,13 @@ class Config:
|
|
|
207
229
|
# Change value
|
|
208
230
|
try:
|
|
209
231
|
self.change_setting(name, not setting_value)
|
|
210
|
-
except:
|
|
211
|
-
raise SystemExit("This setting is not type: bool")
|
|
212
|
-
|
|
232
|
+
except Exception:
|
|
233
|
+
raise SystemExit("This setting is not type: bool") # noqa: B904
|
|
234
|
+
|
|
213
235
|
def add_setting(self, name: str, value: Any, default: Any, help_: str = "") -> None:
|
|
214
236
|
"""
|
|
215
237
|
Add ``Setting`` if not exist
|
|
216
|
-
|
|
238
|
+
|
|
217
239
|
Parameters
|
|
218
240
|
----------
|
|
219
241
|
name : str
|
|
@@ -226,51 +248,46 @@ class Config:
|
|
|
226
248
|
Default value of the setting
|
|
227
249
|
|
|
228
250
|
help_ : str
|
|
229
|
-
Description of the setting (Default: None)
|
|
251
|
+
Description of the setting (Default: ``None``)
|
|
230
252
|
"""
|
|
231
253
|
name = name.strip().lower().replace(" ", _SPACE_REPLACE)
|
|
232
254
|
new_setting = Setting(name, value, default, help_)
|
|
233
255
|
if new_setting not in self.settings:
|
|
234
256
|
self.settings.append(new_setting)
|
|
235
257
|
self.save()
|
|
236
|
-
|
|
258
|
+
|
|
237
259
|
def del_setting(self, name: str) -> None:
|
|
238
260
|
"""
|
|
239
261
|
Delete ``Setting``
|
|
240
|
-
|
|
262
|
+
|
|
241
263
|
Parameters
|
|
242
264
|
----------
|
|
243
265
|
name : str
|
|
244
266
|
Name of the setting
|
|
245
267
|
"""
|
|
246
268
|
name = name.strip().lower().replace(" ", _SPACE_REPLACE)
|
|
247
|
-
self.settings = [x for x in self.settings if
|
|
269
|
+
self.settings = [x for x in self.settings if x.name != name]
|
|
248
270
|
self.save()
|
|
249
271
|
|
|
250
272
|
def welcome(self) -> None:
|
|
251
273
|
"""Run first-run script (if any)"""
|
|
252
274
|
self.change_setting("first-run", False)
|
|
253
275
|
|
|
254
|
-
# Version
|
|
255
|
-
def update_version(self, version_data: Dict[str, Union[str, int]]):
|
|
256
|
-
"""
|
|
257
|
-
Update version
|
|
258
|
-
|
|
259
|
-
Parameters
|
|
260
|
-
----------
|
|
261
|
-
version_data : dict[str, str | int]
|
|
262
|
-
Version data
|
|
263
|
-
"""
|
|
264
|
-
self.version = version_data
|
|
265
|
-
self.save()
|
|
266
|
-
|
|
267
276
|
|
|
268
277
|
# Init
|
|
269
278
|
###########################################################################
|
|
270
279
|
ABSFUYU_CONFIG = Config(CONFIG_PATH)
|
|
271
280
|
|
|
272
|
-
|
|
273
|
-
#
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
281
|
+
# TODO: Create a config file when not available [W.I.P]
|
|
282
|
+
# _settings = [
|
|
283
|
+
# Setting(
|
|
284
|
+
# "auto-install-extra", False, False, "Automatically install required packages"
|
|
285
|
+
# ),
|
|
286
|
+
# Setting("first-run", True, True, "Check if this package has ever been run"),
|
|
287
|
+
# Setting(
|
|
288
|
+
# "luckgod-mode",
|
|
289
|
+
# False,
|
|
290
|
+
# False,
|
|
291
|
+
# "A chance that the machine will be randomly shutdown",
|
|
292
|
+
# ),
|
|
293
|
+
# ]
|
absfuyu/config/config.json
CHANGED
absfuyu/core.py
CHANGED
|
@@ -3,19 +3,14 @@ Absfuyu: Core
|
|
|
3
3
|
-------------
|
|
4
4
|
Contain type hints and other stuffs
|
|
5
5
|
|
|
6
|
-
Version: 2.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 2.2.0
|
|
7
|
+
Date updated: 14/04/2024 (dd/mm/yyyy)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
# Module Package
|
|
12
11
|
###########################################################################
|
|
13
12
|
__all__ = [
|
|
14
|
-
# module
|
|
15
|
-
"ModulePackage",
|
|
16
|
-
"ModuleList",
|
|
17
13
|
# color
|
|
18
|
-
"Color",
|
|
19
14
|
"CLITextColor",
|
|
20
15
|
# path
|
|
21
16
|
"CORE_PATH",
|
|
@@ -23,25 +18,13 @@ __all__ = [
|
|
|
23
18
|
"DATA_PATH",
|
|
24
19
|
]
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
ModuleList = [
|
|
28
|
-
"config",
|
|
29
|
-
"extensions",
|
|
30
|
-
"fun",
|
|
31
|
-
"game",
|
|
32
|
-
"general",
|
|
33
|
-
"pkg_data",
|
|
34
|
-
"sort",
|
|
35
|
-
"tools",
|
|
36
|
-
"util",
|
|
37
|
-
"version",
|
|
38
|
-
]
|
|
21
|
+
__package_feature__ = ["beautiful", "extra", "res", "full", "dev"]
|
|
39
22
|
|
|
40
23
|
|
|
41
|
-
# Library
|
|
42
|
-
###########################################################################
|
|
43
24
|
from pathlib import Path
|
|
25
|
+
|
|
44
26
|
# import sys
|
|
27
|
+
# from sys import version_info as _python_version
|
|
45
28
|
|
|
46
29
|
# if sys.version_info.minor >= 10:
|
|
47
30
|
# from importlib.resources import files
|
|
@@ -52,41 +35,6 @@ from pathlib import Path
|
|
|
52
35
|
# raise ImportError("Please install importlib-resources")
|
|
53
36
|
|
|
54
37
|
|
|
55
|
-
try:
|
|
56
|
-
import colorama as __colorama
|
|
57
|
-
except ImportError:
|
|
58
|
-
__colorama = None
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# Color - colorama
|
|
62
|
-
###########################################################################
|
|
63
|
-
if __colorama is not None:
|
|
64
|
-
# __colorama.init(autoreset=True)
|
|
65
|
-
Color = {
|
|
66
|
-
"green": __colorama.Fore.LIGHTGREEN_EX,
|
|
67
|
-
"GREEN": __colorama.Fore.GREEN,
|
|
68
|
-
"blue": __colorama.Fore.LIGHTCYAN_EX,
|
|
69
|
-
"BLUE": __colorama.Fore.CYAN,
|
|
70
|
-
"red": __colorama.Fore.LIGHTRED_EX,
|
|
71
|
-
"RED": __colorama.Fore.RED,
|
|
72
|
-
"yellow": __colorama.Fore.LIGHTYELLOW_EX,
|
|
73
|
-
"YELLOW": __colorama.Fore.YELLOW,
|
|
74
|
-
"reset": __colorama.Fore.RESET,
|
|
75
|
-
}
|
|
76
|
-
else:
|
|
77
|
-
Color = {
|
|
78
|
-
"green": "",
|
|
79
|
-
"GREEN": "",
|
|
80
|
-
"blue": "",
|
|
81
|
-
"BLUE": "",
|
|
82
|
-
"red": "",
|
|
83
|
-
"RED": "",
|
|
84
|
-
"yellow": "",
|
|
85
|
-
"YELLOW": "",
|
|
86
|
-
"reset": "",
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
38
|
class CLITextColor:
|
|
91
39
|
"""Color code for text in terminal"""
|
|
92
40
|
|
|
@@ -102,16 +50,7 @@ class CLITextColor:
|
|
|
102
50
|
RESET = "\x1b[39m"
|
|
103
51
|
|
|
104
52
|
|
|
105
|
-
# Path
|
|
106
|
-
###########################################################################
|
|
107
|
-
# CORE_PATH = Path(os.path.abspath(os.path.dirname(__file__)))
|
|
108
53
|
CORE_PATH = Path(__file__).parent.absolute()
|
|
109
54
|
# CORE_PATH = files("absfuyu")
|
|
110
55
|
CONFIG_PATH = CORE_PATH.joinpath("config", "config.json")
|
|
111
56
|
DATA_PATH = CORE_PATH.joinpath("pkg_data")
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
# Run
|
|
115
|
-
###########################################################################
|
|
116
|
-
if __name__ == "__main__":
|
|
117
|
-
print(CORE_PATH)
|
absfuyu/everything.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# flake8: noqa
|
|
1
2
|
"""
|
|
2
3
|
Absfuyu: Everything
|
|
3
4
|
-------------------
|
|
@@ -11,23 +12,20 @@ Usage:
|
|
|
11
12
|
>>> from absfuyu import everything as ab
|
|
12
13
|
"""
|
|
13
14
|
|
|
14
|
-
|
|
15
15
|
# Library
|
|
16
16
|
###########################################################################
|
|
17
|
-
from absfuyu.core import *
|
|
18
17
|
from absfuyu.config import *
|
|
18
|
+
from absfuyu.core import *
|
|
19
|
+
from absfuyu.extensions import *
|
|
19
20
|
from absfuyu.fun import *
|
|
20
|
-
from absfuyu.
|
|
21
|
+
from absfuyu.game import *
|
|
22
|
+
from absfuyu.general import *
|
|
21
23
|
from absfuyu.logger import *
|
|
24
|
+
from absfuyu.pkg_data import *
|
|
22
25
|
from absfuyu.sort import *
|
|
23
|
-
from absfuyu.version import *
|
|
24
|
-
|
|
25
|
-
from absfuyu.general import *
|
|
26
|
-
from absfuyu.extensions import *
|
|
27
|
-
from absfuyu.game import *
|
|
28
26
|
from absfuyu.tools import *
|
|
29
27
|
from absfuyu.util import *
|
|
30
|
-
|
|
28
|
+
from absfuyu.version import *
|
|
31
29
|
|
|
32
30
|
# Is loaded
|
|
33
31
|
###########################################################################
|
absfuyu/extensions/beautiful.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# type: ignore
|
|
1
2
|
"""
|
|
2
3
|
Absfuyu: Beautiful
|
|
3
4
|
------------------
|
|
@@ -7,15 +8,15 @@ Version: 1.0.2
|
|
|
7
8
|
Date updated: 24/11/2023 (dd/mm/yyyy)
|
|
8
9
|
"""
|
|
9
10
|
|
|
10
|
-
|
|
11
11
|
# Module level
|
|
12
12
|
###########################################################################
|
|
13
13
|
__all__ = [
|
|
14
|
-
"beautiful_output",
|
|
14
|
+
"beautiful_output",
|
|
15
|
+
"print",
|
|
16
|
+
"demo",
|
|
15
17
|
]
|
|
16
18
|
|
|
17
19
|
|
|
18
|
-
|
|
19
20
|
# Library
|
|
20
21
|
###########################################################################
|
|
21
22
|
from functools import wraps as __wraps
|
|
@@ -33,24 +34,25 @@ try:
|
|
|
33
34
|
from rich.text import Text as __Text
|
|
34
35
|
except ImportError:
|
|
35
36
|
from absfuyu.config import ABSFUYU_CONFIG
|
|
37
|
+
|
|
36
38
|
if ABSFUYU_CONFIG._get_setting("auto-install-extra").value:
|
|
37
39
|
__cmd: str = "python -m pip install -U absfuyu[beautiful]".split()
|
|
38
40
|
from subprocess import run as __run
|
|
41
|
+
|
|
39
42
|
__run(__cmd)
|
|
40
43
|
else:
|
|
41
|
-
raise SystemExit("This feature is in absfuyu[beautiful] package")
|
|
44
|
+
raise SystemExit("This feature is in absfuyu[beautiful] package") # noqa: B904
|
|
42
45
|
else:
|
|
43
46
|
BEAUTIFUL_MODE = True
|
|
44
47
|
|
|
45
48
|
|
|
46
|
-
|
|
47
49
|
# Function
|
|
48
50
|
###########################################################################
|
|
49
51
|
def beautiful_output(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
layout_option: int = 2,
|
|
53
|
+
header_visible: __Optional[bool] = True,
|
|
54
|
+
footer_visible: __Optional[bool] = False,
|
|
55
|
+
):
|
|
54
56
|
"""
|
|
55
57
|
Beautify function output
|
|
56
58
|
|
|
@@ -62,21 +64,19 @@ def beautiful_output(
|
|
|
62
64
|
footer_visible : True | False | None
|
|
63
65
|
Show footer
|
|
64
66
|
"""
|
|
65
|
-
|
|
67
|
+
|
|
66
68
|
if not BEAUTIFUL_MODE:
|
|
67
69
|
raise SystemExit("This feature is in absfuyu[beautiful] package")
|
|
68
70
|
|
|
69
71
|
def decorator(func):
|
|
70
|
-
|
|
71
72
|
@__wraps(func)
|
|
72
73
|
def wrapper(*args, **kwargs):
|
|
73
|
-
|
|
74
74
|
# Measure performance
|
|
75
75
|
start_time = __perf()
|
|
76
76
|
f = func(*args, **kwargs)
|
|
77
77
|
finished_time = __perf()
|
|
78
78
|
elapsed = f"Time elapsed: {finished_time - start_time:,.6f} s"
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
# Make header
|
|
81
81
|
header_table = __Table.grid(expand=True)
|
|
82
82
|
header_table.add_row(
|
|
@@ -94,11 +94,11 @@ def beautiful_output(
|
|
|
94
94
|
style="white on blue",
|
|
95
95
|
),
|
|
96
96
|
)
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
# Make output table
|
|
99
99
|
out_table = __Table.grid(expand=True)
|
|
100
|
-
out_table.add_column(ratio=2)
|
|
101
|
-
out_table.add_column()
|
|
100
|
+
out_table.add_column(ratio=2) # result
|
|
101
|
+
out_table.add_column() # performance
|
|
102
102
|
r_txt = __Text(
|
|
103
103
|
str(f),
|
|
104
104
|
overflow="fold",
|
|
@@ -132,16 +132,21 @@ def beautiful_output(
|
|
|
132
132
|
True: header_table,
|
|
133
133
|
False: line,
|
|
134
134
|
None: __Text(),
|
|
135
|
-
}
|
|
135
|
+
} # header[header_visible]
|
|
136
136
|
footer = {
|
|
137
137
|
True: footer_table,
|
|
138
138
|
False: line,
|
|
139
139
|
None: __Text(),
|
|
140
|
-
}
|
|
140
|
+
} # footer[footer_visible]
|
|
141
141
|
layout = {
|
|
142
142
|
1: __Group(header[header_visible], out_table, footer[footer_visible]),
|
|
143
|
-
2: __Group(
|
|
144
|
-
|
|
143
|
+
2: __Group(
|
|
144
|
+
header[header_visible],
|
|
145
|
+
result_panel,
|
|
146
|
+
performance_panel,
|
|
147
|
+
footer[footer_visible],
|
|
148
|
+
),
|
|
149
|
+
3: __Group(result_panel),
|
|
145
150
|
}
|
|
146
151
|
if layout_option in layout:
|
|
147
152
|
return layout[layout_option]
|
|
@@ -150,7 +155,7 @@ def beautiful_output(
|
|
|
150
155
|
# return layout[3]
|
|
151
156
|
|
|
152
157
|
return wrapper
|
|
153
|
-
|
|
158
|
+
|
|
154
159
|
return decorator
|
|
155
160
|
|
|
156
161
|
|
|
@@ -162,7 +167,7 @@ if BEAUTIFUL_MODE:
|
|
|
162
167
|
# demo
|
|
163
168
|
@beautiful_output()
|
|
164
169
|
def __demo_decorator(x: any = None):
|
|
165
|
-
code="""\
|
|
170
|
+
code = """\
|
|
166
171
|
# demo
|
|
167
172
|
from absfuyu.extensions import beautiful as bu
|
|
168
173
|
@bu.beautiful_output()
|
|
@@ -174,8 +179,10 @@ bu.print(testcode())"""
|
|
|
174
179
|
x = code
|
|
175
180
|
return x
|
|
176
181
|
|
|
182
|
+
|
|
177
183
|
def demo(x: any = None):
|
|
178
184
|
print(__demo_decorator(x))
|
|
179
185
|
|
|
186
|
+
|
|
180
187
|
if __name__ == "__main__":
|
|
181
|
-
demo()
|
|
188
|
+
demo()
|