absfuyu 3.2.0__py3-none-any.whl → 3.4.0__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 +98 -0
- absfuyu/cli/game_group.py +109 -0
- absfuyu/config/__init__.py +55 -94
- 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 +110 -58
- 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 +314 -109
- absfuyu/general/generator.py +67 -67
- absfuyu/general/human.py +148 -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 +38 -40
- 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 +36 -98
- absfuyu/util/pkl.py +8 -8
- absfuyu/util/zipped.py +17 -19
- absfuyu/version.py +137 -148
- absfuyu-3.4.0.dist-info/METADATA +124 -0
- absfuyu-3.4.0.dist-info/RECORD +59 -0
- {absfuyu-3.2.0.dist-info → absfuyu-3.4.0.dist-info}/WHEEL +1 -2
- {absfuyu-3.2.0.dist-info → absfuyu-3.4.0.dist-info}/entry_points.txt +1 -0
- {absfuyu-3.2.0.dist-info → absfuyu-3.4.0.dist-info/licenses}/LICENSE +1 -1
- absfuyu/extensions/dev/pkglib.py +0 -98
- absfuyu/game/tictactoe2.py +0 -318
- absfuyu-3.2.0.dist-info/METADATA +0 -216
- absfuyu-3.2.0.dist-info/RECORD +0 -55
- absfuyu-3.2.0.dist-info/top_level.txt +0 -1
absfuyu/general/generator.py
CHANGED
|
@@ -3,8 +3,8 @@ Absfuyu: Generator
|
|
|
3
3
|
------------------
|
|
4
4
|
This generate stuff (Not python's ``generator``)
|
|
5
5
|
|
|
6
|
-
Version: 1.1.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 1.1.1
|
|
7
|
+
Date updated: 05/04/2024 (dd/mm/yyyy)
|
|
8
8
|
|
|
9
9
|
Features:
|
|
10
10
|
---------
|
|
@@ -14,20 +14,17 @@ Features:
|
|
|
14
14
|
- Generate combinations of list in range
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
|
|
18
17
|
# Module level
|
|
19
18
|
###########################################################################
|
|
20
|
-
__all__ = [
|
|
21
|
-
"Charset",
|
|
22
|
-
"Generator"
|
|
23
|
-
]
|
|
19
|
+
__all__ = ["Charset", "Generator"]
|
|
24
20
|
|
|
25
21
|
|
|
26
22
|
# Library
|
|
27
23
|
###########################################################################
|
|
24
|
+
import string
|
|
28
25
|
from itertools import chain, combinations
|
|
29
26
|
from random import choice
|
|
30
|
-
|
|
27
|
+
|
|
31
28
|
# from string import (
|
|
32
29
|
# ascii_letters as _ascii_letters,
|
|
33
30
|
# ascii_uppercase as _ascii_uppercase,
|
|
@@ -48,6 +45,7 @@ class Charset:
|
|
|
48
45
|
"""
|
|
49
46
|
Character set data class
|
|
50
47
|
"""
|
|
48
|
+
|
|
51
49
|
DEFAULT = string.ascii_letters + string.digits
|
|
52
50
|
ALPHABET = string.ascii_letters
|
|
53
51
|
FULL = string.ascii_letters + string.digits + string.punctuation
|
|
@@ -56,7 +54,7 @@ class Charset:
|
|
|
56
54
|
DIGIT = string.digits
|
|
57
55
|
SPECIAL = string.punctuation
|
|
58
56
|
ALL = string.printable
|
|
59
|
-
PRODUCT_KEY = "BCDFGHJKMNPQRTVWXY2346789"
|
|
57
|
+
PRODUCT_KEY = "BCDFGHJKMNPQRTVWXY2346789" # Charset that various key makers use
|
|
60
58
|
# DEFAULT = _ascii_letters + _digits
|
|
61
59
|
# ALPHABET = _ascii_letters
|
|
62
60
|
# FULL = _ascii_letters + _digits + _punctuation
|
|
@@ -67,7 +65,7 @@ class Charset:
|
|
|
67
65
|
# ALL = _printable
|
|
68
66
|
|
|
69
67
|
def __str__(self) -> str:
|
|
70
|
-
charset = [x for x in __class__.__dict__.keys() if not x.startswith("__")]
|
|
68
|
+
charset = [x for x in self.__class__.__dict__.keys() if not x.startswith("__")]
|
|
71
69
|
return f"List of Character set: {charset}"
|
|
72
70
|
|
|
73
71
|
def __repr__(self) -> str:
|
|
@@ -78,24 +76,27 @@ class Generator:
|
|
|
78
76
|
"""
|
|
79
77
|
Generator that generate stuffs
|
|
80
78
|
"""
|
|
79
|
+
|
|
81
80
|
def __init__(self) -> None:
|
|
82
81
|
logger.debug("Class initiated!")
|
|
82
|
+
|
|
83
83
|
def __str__(self) -> str:
|
|
84
84
|
return f"{self.__class__.__name__}()"
|
|
85
|
+
|
|
85
86
|
def __repr__(self) -> str:
|
|
86
87
|
return self.__str__()
|
|
87
88
|
|
|
88
89
|
@staticmethod
|
|
89
90
|
def generate_string(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
charset: str = Charset.DEFAULT,
|
|
92
|
+
size: int = 8,
|
|
93
|
+
times: int = 1,
|
|
94
|
+
unique: bool = False,
|
|
95
|
+
string_type_if_1: bool = False,
|
|
96
|
+
):
|
|
96
97
|
"""
|
|
97
98
|
Generate a list of random string from character set (Random string generator)
|
|
98
|
-
|
|
99
|
+
|
|
99
100
|
Parameters
|
|
100
101
|
----------
|
|
101
102
|
charset : str
|
|
@@ -108,31 +109,31 @@ class Generator:
|
|
|
108
109
|
- ``Charset.DIGIT``: character in [0-9]
|
|
109
110
|
- ``Charset.SPECIAL``: character in [!@#$%^&*()_+=-]
|
|
110
111
|
- ``Charset.ALL``: character in every printable character
|
|
111
|
-
|
|
112
|
+
|
|
112
113
|
size : int
|
|
113
|
-
Length of each string in list
|
|
114
|
+
Length of each string in list
|
|
114
115
|
(Default: ``8``)
|
|
115
|
-
|
|
116
|
+
|
|
116
117
|
times : int
|
|
117
|
-
How many random string generated
|
|
118
|
+
How many random string generated
|
|
118
119
|
(Default: ``1``)
|
|
119
|
-
|
|
120
|
+
|
|
120
121
|
unique : bool
|
|
121
|
-
Each generated text is unique
|
|
122
|
+
Each generated text is unique
|
|
122
123
|
(Default: ``False``)
|
|
123
|
-
|
|
124
|
+
|
|
124
125
|
string_type_if_1 : bool
|
|
125
|
-
Return a ``str`` type result if ``times == 1``
|
|
126
|
+
Return a ``str`` type result if ``times == 1``
|
|
126
127
|
(Default: ``False``)
|
|
127
|
-
|
|
128
|
+
|
|
128
129
|
Returns
|
|
129
130
|
-------
|
|
130
131
|
list
|
|
131
132
|
List of random string generated
|
|
132
|
-
|
|
133
|
+
|
|
133
134
|
str
|
|
134
135
|
When ``string_type_if_1`` is ``True``
|
|
135
|
-
|
|
136
|
+
|
|
136
137
|
None
|
|
137
138
|
When invalid option
|
|
138
139
|
|
|
@@ -145,15 +146,15 @@ class Generator:
|
|
|
145
146
|
|
|
146
147
|
try:
|
|
147
148
|
char_lst = list(charset)
|
|
148
|
-
except:
|
|
149
|
-
char_lst = charset
|
|
149
|
+
except Exception:
|
|
150
|
+
char_lst = charset # type: ignore # ! review this sometime
|
|
150
151
|
# logger.debug(char_lst)
|
|
151
152
|
|
|
152
153
|
unique_string = []
|
|
153
154
|
count = 0
|
|
154
155
|
logger.debug(f"Unique generated text: {unique}")
|
|
155
156
|
|
|
156
|
-
while
|
|
157
|
+
while count < times:
|
|
157
158
|
s = "".join(choice(char_lst) for _ in range(size))
|
|
158
159
|
logger.debug(f"Time generated: {count+1}. Remaining: {times-count-1}. {s}")
|
|
159
160
|
if not unique:
|
|
@@ -163,39 +164,39 @@ class Generator:
|
|
|
163
164
|
if s not in unique_string:
|
|
164
165
|
unique_string.append(s)
|
|
165
166
|
count += 1
|
|
166
|
-
|
|
167
|
+
|
|
167
168
|
logger.debug(unique_string)
|
|
168
169
|
if string_type_if_1 and times == 1:
|
|
169
170
|
return unique_string[0]
|
|
170
171
|
else:
|
|
171
172
|
return unique_string
|
|
172
|
-
|
|
173
|
+
|
|
173
174
|
@staticmethod
|
|
174
175
|
def generate_key(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
176
|
+
charset: str = Charset.PRODUCT_KEY,
|
|
177
|
+
letter_per_block: int = 5,
|
|
178
|
+
number_of_block: int = 5,
|
|
179
|
+
sep: str = "-",
|
|
180
|
+
) -> str:
|
|
180
181
|
"""
|
|
181
182
|
Generate custom key
|
|
182
183
|
|
|
183
184
|
Parameters
|
|
184
185
|
----------
|
|
185
186
|
charset : str
|
|
186
|
-
Character set
|
|
187
|
+
Character set
|
|
187
188
|
(Default: ``Charset.PRODUCT_KEY``)
|
|
188
|
-
|
|
189
|
+
|
|
189
190
|
letter_per_block : int
|
|
190
|
-
Number of letter per key block
|
|
191
|
+
Number of letter per key block
|
|
191
192
|
(Default: ``5``)
|
|
192
|
-
|
|
193
|
+
|
|
193
194
|
number_of_block : int
|
|
194
|
-
Number of key block
|
|
195
|
+
Number of key block
|
|
195
196
|
(Default: ``5``)
|
|
196
|
-
|
|
197
|
+
|
|
197
198
|
sep : str
|
|
198
|
-
Key block separator
|
|
199
|
+
Key block separator
|
|
199
200
|
(Default: ``-``)
|
|
200
201
|
|
|
201
202
|
Returns
|
|
@@ -210,12 +211,12 @@ class Generator:
|
|
|
210
211
|
'VKKPJVYD2H-M7R687QCV2'
|
|
211
212
|
"""
|
|
212
213
|
out = sep.join(
|
|
213
|
-
__class__.generate_string(
|
|
214
|
+
__class__.generate_string( # type: ignore
|
|
214
215
|
charset,
|
|
215
216
|
size=letter_per_block,
|
|
216
217
|
times=number_of_block,
|
|
217
218
|
unique=False,
|
|
218
|
-
string_type_if_1=False
|
|
219
|
+
string_type_if_1=False,
|
|
219
220
|
)
|
|
220
221
|
)
|
|
221
222
|
logger.debug(out)
|
|
@@ -225,7 +226,7 @@ class Generator:
|
|
|
225
226
|
def generate_check_digit(number: int) -> int:
|
|
226
227
|
"""
|
|
227
228
|
Check digit generator
|
|
228
|
-
|
|
229
|
+
|
|
229
230
|
"A check digit is a form of redundancy check used for
|
|
230
231
|
error detection on identification numbers, such as
|
|
231
232
|
bank account numbers, which are used in an application
|
|
@@ -238,20 +239,20 @@ class Generator:
|
|
|
238
239
|
the input of a series of characters (usually digits)
|
|
239
240
|
such as a single mistyped digit or some permutations
|
|
240
241
|
of two successive digits." (Wikipedia)
|
|
241
|
-
|
|
242
|
+
|
|
242
243
|
This function use Luhn's algorithm to calculate
|
|
243
|
-
|
|
244
|
+
|
|
244
245
|
Parameters
|
|
245
246
|
----------
|
|
246
247
|
number : int
|
|
247
248
|
Number to calculate check digit
|
|
248
|
-
|
|
249
|
+
|
|
249
250
|
Returns
|
|
250
251
|
-------
|
|
251
252
|
int
|
|
252
253
|
Check digit
|
|
253
|
-
|
|
254
|
-
|
|
254
|
+
|
|
255
|
+
|
|
255
256
|
Example:
|
|
256
257
|
--------
|
|
257
258
|
>>> Generator.generate_check_digit("4129984562545")
|
|
@@ -265,22 +266,24 @@ class Generator:
|
|
|
265
266
|
logger.debug(f"Reversed: {''.join(num)}")
|
|
266
267
|
for i in range(len(num)):
|
|
267
268
|
# convert back into integer
|
|
268
|
-
num[i] = int(num[i])
|
|
269
|
-
if i%2 == 0:
|
|
269
|
+
num[i] = int(num[i]) # type: ignore
|
|
270
|
+
if i % 2 == 0:
|
|
270
271
|
# double value of the even-th digit
|
|
271
272
|
num[i] *= 2
|
|
272
273
|
# sum the character of digit if it's >= 10
|
|
273
|
-
if num[i] >= 10:
|
|
274
|
-
num[i] -= 9
|
|
275
|
-
sum += num[i]
|
|
274
|
+
if num[i] >= 10: # type: ignore
|
|
275
|
+
num[i] -= 9 # type: ignore
|
|
276
|
+
sum += num[i] # type: ignore
|
|
276
277
|
logger.debug(f"Loop {i+1}: {num[i]}, {sum}")
|
|
277
|
-
|
|
278
|
+
|
|
278
279
|
out = (10 - (sum % 10)) % 10
|
|
279
280
|
logger.debug(f"Output: {out}")
|
|
280
281
|
return out
|
|
281
282
|
|
|
282
283
|
@staticmethod
|
|
283
|
-
def combinations_range(
|
|
284
|
+
def combinations_range(
|
|
285
|
+
sequence: list, *, min_len: int = 1, max_len: int = 0
|
|
286
|
+
) -> List[tuple]:
|
|
284
287
|
"""
|
|
285
288
|
Generate all combinations of a ``sequence`` from ``min_len`` to ``max_len``
|
|
286
289
|
|
|
@@ -305,17 +308,14 @@ class Generator:
|
|
|
305
308
|
# Restrain
|
|
306
309
|
if max_len < 1:
|
|
307
310
|
max_len = len(sequence)
|
|
308
|
-
max_len = set_max(max_len, max_value=len(sequence))
|
|
309
|
-
min_len = set_min_max(min_len, min_value=1, max_value=max_len)
|
|
311
|
+
max_len = int(set_max(max_len, max_value=len(sequence)))
|
|
312
|
+
min_len = int(set_min_max(min_len, min_value=1, max_value=max_len))
|
|
310
313
|
logger.debug(f"Combination range: [{min_len}, {max_len}]")
|
|
311
314
|
|
|
312
315
|
# Return
|
|
313
316
|
return list(
|
|
314
317
|
chain.from_iterable(
|
|
315
|
-
[
|
|
316
|
-
list(combinations(sequence, i))
|
|
317
|
-
for i in range(min_len, max_len + 1)
|
|
318
|
-
]
|
|
318
|
+
[list(combinations(sequence, i)) for i in range(min_len, max_len + 1)]
|
|
319
319
|
)
|
|
320
320
|
)
|
|
321
321
|
|
|
@@ -323,4 +323,4 @@ class Generator:
|
|
|
323
323
|
# Run
|
|
324
324
|
###########################################################################
|
|
325
325
|
if __name__ == "__main__":
|
|
326
|
-
logger.setLevel(10)
|
|
326
|
+
logger.setLevel(10) # DEBUG
|