absfuyu 5.9.0__py3-none-any.whl → 5.11.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.

Files changed (81) hide show
  1. absfuyu/__init__.py +1 -1
  2. absfuyu/__main__.py +2 -2
  3. absfuyu/cli/__init__.py +2 -2
  4. absfuyu/cli/color.py +2 -2
  5. absfuyu/cli/config_group.py +2 -2
  6. absfuyu/cli/do_group.py +2 -2
  7. absfuyu/cli/game_group.py +20 -2
  8. absfuyu/cli/tool_group.py +2 -2
  9. absfuyu/config/__init__.py +2 -2
  10. absfuyu/core/__init__.py +2 -2
  11. absfuyu/core/baseclass.py +20 -3
  12. absfuyu/core/baseclass2.py +2 -2
  13. absfuyu/core/decorator.py +2 -2
  14. absfuyu/core/docstring.py +2 -2
  15. absfuyu/core/dummy_cli.py +2 -2
  16. absfuyu/core/dummy_func.py +2 -2
  17. absfuyu/dxt/__init__.py +2 -2
  18. absfuyu/dxt/dictext.py +2 -2
  19. absfuyu/dxt/dxt_support.py +2 -2
  20. absfuyu/dxt/intext.py +2 -2
  21. absfuyu/dxt/listext.py +13 -18
  22. absfuyu/dxt/strext.py +2 -2
  23. absfuyu/extra/__init__.py +2 -2
  24. absfuyu/extra/beautiful.py +2 -2
  25. absfuyu/extra/da/__init__.py +2 -2
  26. absfuyu/extra/da/dadf.py +2 -2
  27. absfuyu/extra/da/dadf_base.py +2 -2
  28. absfuyu/extra/da/df_func.py +2 -2
  29. absfuyu/extra/da/mplt.py +2 -2
  30. absfuyu/extra/data_analysis.py +2 -2
  31. absfuyu/extra/pdf.py +2 -2
  32. absfuyu/extra/rclone.py +2 -2
  33. absfuyu/extra/xml.py +2 -2
  34. absfuyu/fun/__init__.py +2 -2
  35. absfuyu/fun/rubik.py +2 -2
  36. absfuyu/fun/tarot.py +2 -2
  37. absfuyu/game/__init__.py +2 -2
  38. absfuyu/game/game_stat.py +2 -2
  39. absfuyu/game/schulte.py +78 -0
  40. absfuyu/game/sudoku.py +2 -2
  41. absfuyu/game/tictactoe.py +2 -2
  42. absfuyu/game/wordle.py +2 -2
  43. absfuyu/general/__init__.py +2 -2
  44. absfuyu/general/content.py +2 -2
  45. absfuyu/general/human.py +2 -2
  46. absfuyu/general/shape.py +2 -2
  47. absfuyu/general/tax.py +324 -0
  48. absfuyu/logger.py +2 -2
  49. absfuyu/pkg_data/__init__.py +2 -2
  50. absfuyu/pkg_data/deprecated.py +2 -2
  51. absfuyu/pkg_data/logo.py +2 -2
  52. absfuyu/sort.py +2 -2
  53. absfuyu/tools/__init__.py +2 -2
  54. absfuyu/tools/checksum.py +2 -2
  55. absfuyu/tools/converter.py +2 -2
  56. absfuyu/tools/generator.py +2 -2
  57. absfuyu/tools/inspector.py +2 -2
  58. absfuyu/tools/keygen.py +2 -2
  59. absfuyu/tools/obfuscator.py +2 -2
  60. absfuyu/tools/passwordlib.py +2 -2
  61. absfuyu/tools/shutdownizer.py +2 -2
  62. absfuyu/tools/sw.py +138 -7
  63. absfuyu/tools/web.py +2 -2
  64. absfuyu/typings.py +2 -2
  65. absfuyu/util/__init__.py +2 -2
  66. absfuyu/util/api.py +2 -2
  67. absfuyu/util/gui.py +62 -3
  68. absfuyu/util/json_method.py +2 -2
  69. absfuyu/util/lunar.py +2 -2
  70. absfuyu/util/path.py +2 -2
  71. absfuyu/util/performance.py +2 -2
  72. absfuyu/util/shorten_number.py +2 -2
  73. absfuyu/util/text_table.py +2 -2
  74. absfuyu/util/zipped.py +2 -2
  75. absfuyu/version.py +2 -2
  76. {absfuyu-5.9.0.dist-info → absfuyu-5.11.0.dist-info}/METADATA +1 -1
  77. absfuyu-5.11.0.dist-info/RECORD +85 -0
  78. absfuyu-5.9.0.dist-info/RECORD +0 -83
  79. {absfuyu-5.9.0.dist-info → absfuyu-5.11.0.dist-info}/WHEEL +0 -0
  80. {absfuyu-5.9.0.dist-info → absfuyu-5.11.0.dist-info}/entry_points.txt +0 -0
  81. {absfuyu-5.9.0.dist-info → absfuyu-5.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,78 @@
1
+ """
2
+ Game: Schulte
3
+ -------------
4
+
5
+ Version: 5.11.0
6
+ Date updated: 30/09/2025 (dd/mm/yyyy)
7
+ """
8
+
9
+ # Module level
10
+ # ---------------------------------------------------------------------------
11
+ __all__ = ["SchulteTable"]
12
+
13
+
14
+ # Library
15
+ # ---------------------------------------------------------------------------
16
+ from absfuyu.core.baseclass import BaseClass
17
+ from absfuyu.dxt import ListExt
18
+ from absfuyu.util.text_table import BoxStyle, get_box_drawing_character
19
+
20
+
21
+ # Function
22
+ # ---------------------------------------------------------------------------
23
+ def draw_grid(data: list[list[int]], style: BoxStyle = "normal"):
24
+ chars = get_box_drawing_character(style=style)
25
+ rows = len(data)
26
+ cols = len(data[0])
27
+
28
+ # find max width for padding
29
+ cell_width = max(len(str(x)) for row in data for x in row) + 2
30
+
31
+ def horizontal_border(left: str, middle: str, right: str) -> str:
32
+ return left + (chars.HORIZONTAL * cell_width + middle) * (cols - 1) + chars.HORIZONTAL * cell_width + right
33
+
34
+ # top border
35
+ print(horizontal_border(chars.UPPER_LEFT_CORNER, chars.HORIZONTAL_DOWN, chars.UPPER_RIGHT_CORNER))
36
+
37
+ for i, row in enumerate(data):
38
+ # content line
39
+ line = chars.VERTICAL + "".join(f"{str(val):^{cell_width}}" + chars.VERTICAL for val in row)
40
+ print(line)
41
+
42
+ # middle or bottom border
43
+ if i < rows - 1:
44
+ print(horizontal_border(chars.VERTICAL_RIGHT, chars.CROSS, chars.VERTICAL_LEFT))
45
+ else:
46
+ print(horizontal_border(chars.LOWER_LEFT_CORNER, chars.HORIZONTAL_UP, chars.LOWER_RIGHT_CORNER))
47
+
48
+
49
+ # Class
50
+ # ---------------------------------------------------------------------------
51
+ class SchulteTable(BaseClass):
52
+ """
53
+ A Schulte Table is a cognitive training tool consisting of a grid filled
54
+ with randomly placed numbers. The task is to find and select all the numbers
55
+ in ascending order as quickly as possible. This exercise helps improve
56
+ visual attention, focus, processing speed, mental flexibility,
57
+ and peripheral vision.
58
+ """
59
+
60
+ def __init__(self, size: int = 5) -> None:
61
+ self.size = max(size, 1)
62
+
63
+ def make_table(self) -> None:
64
+ data = ListExt(range(1, self.size**2 + 1)).shuffle().split_chunk(self.size)
65
+ draw_grid(data)
66
+
67
+ # def play(self):
68
+ # """GUI"""
69
+ # from absfuyu.util.gui import CustomTkinterApp
70
+
71
+ # class Schulte(CustomTkinterApp):
72
+ # def __init__(self, title: str | None = None, size: tuple[int, int] | None = None) -> None:
73
+ # super().__init__(title=title, size=size)
74
+
75
+
76
+ if __name__ == "__main__":
77
+ t = SchulteTable(5)
78
+ print(t)
absfuyu/game/sudoku.py CHANGED
@@ -3,8 +3,8 @@ Game: Sudoku
3
3
  ------------
4
4
  Sudoku 9x9 Solver
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
 
9
9
  Credit:
10
10
  -------
absfuyu/game/tictactoe.py CHANGED
@@ -2,8 +2,8 @@
2
2
  Game: Tic Tac Toe
3
3
  -----------------
4
4
 
5
- Version: 5.9.0
6
- Date updated: 19/09/2025 (dd/mm/yyyy)
5
+ Version: 5.11.0
6
+ Date updated: 30/09/2025 (dd/mm/yyyy)
7
7
  """
8
8
 
9
9
  # Module level
absfuyu/game/wordle.py CHANGED
@@ -2,8 +2,8 @@
2
2
  Game: Wordle Solver
3
3
  -------------------
4
4
 
5
- Version: 5.9.0
6
- Date updated: 19/09/2025 (dd/mm/yyyy)
5
+ Version: 5.11.0
6
+ Date updated: 30/09/2025 (dd/mm/yyyy)
7
7
 
8
8
  Usage:
9
9
  ------
@@ -3,8 +3,8 @@ Absfuyu: General
3
3
  ----------------
4
4
  Collection of useful classes
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
 
9
9
  Features:
10
10
  ---------
@@ -3,8 +3,8 @@ Absfuyu: Content
3
3
  ----------------
4
4
  Handle .txt file
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
 
9
9
  Usage:
10
10
  ------
absfuyu/general/human.py CHANGED
@@ -3,8 +3,8 @@ Absfuyu: Human
3
3
  --------------
4
4
  Human related stuff
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
absfuyu/general/shape.py CHANGED
@@ -3,8 +3,8 @@ Absfuyu: Shape
3
3
  --------------
4
4
  Shapes
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
absfuyu/general/tax.py ADDED
@@ -0,0 +1,324 @@
1
+ """
2
+ Absfuyu: Tax calculator
3
+ -----------------------
4
+ Tax calculator
5
+
6
+ Version: 5.11.0
7
+ Date updated: 05/10/2025 (dd/mm/yyyy)
8
+ """
9
+
10
+ # Module level
11
+ # ---------------------------------------------------------------------------
12
+ __all__ = ["PersonalIncomeTaxCalculator"]
13
+
14
+
15
+ # Library
16
+ # ---------------------------------------------------------------------------
17
+ from dataclasses import dataclass
18
+ from typing import Literal, TypedDict, overload
19
+
20
+ from absfuyu.core.baseclass import BaseClass, BaseDataclass
21
+
22
+ # Class
23
+ # ---------------------------------------------------------------------------
24
+ TaxLevel = list[tuple[float | int | None, float]]
25
+
26
+
27
+ @dataclass
28
+ class TaxLevelResult(BaseDataclass):
29
+ """
30
+ Result for a single tax level.
31
+
32
+ Parameters
33
+ ----------
34
+ lower : float
35
+ Lower bound
36
+
37
+ upper : float | None
38
+ Upper bound. ``None`` means +infinite
39
+
40
+ rate : float
41
+ Tax percentage in decimal (0.1 for 10%)
42
+
43
+ amount_taxed : float
44
+ Amount to calculate in current tax level
45
+
46
+ tax : float
47
+ Tax amount in current tax level
48
+ """
49
+
50
+ lower: float
51
+ upper: float | None
52
+ rate: float
53
+ amount_taxed: float
54
+ tax: float
55
+
56
+
57
+ class TaxCalculationResult(TypedDict):
58
+ """
59
+ Tax calculation result.
60
+
61
+ Parameters
62
+ ----------
63
+ gross_income : float
64
+ The input gross income for the calculation.
65
+
66
+ deductions : float, optional
67
+ Amount to subtract from gross income before tax.
68
+
69
+ taxable_income : float
70
+ Gross income minus deductions.
71
+
72
+ per_tax_level : list[TaxLevelResult]
73
+ Detailed breakdown of income taxed at each tax level.
74
+
75
+ gross_tax : float
76
+ Total tax before credits.
77
+
78
+ tax_credits : float, optional
79
+ Amount subtracted from the computed tax after calculation.
80
+
81
+ net_tax : float
82
+ Total tax after applying credits.
83
+
84
+ effective_rate : float
85
+ Ratio of net tax to gross income (net_tax / gross_income).
86
+
87
+ marginal_rate : float
88
+ Tax rate applied to the last amount of money of taxable income.
89
+ """
90
+
91
+ gross_income: float
92
+ deductions: float
93
+ taxable_income: float
94
+ per_tax_level: list[TaxLevelResult]
95
+ gross_tax: float
96
+ tax_credits: float
97
+ net_tax: float
98
+ effective_rate: float
99
+ marginal_rate: float
100
+
101
+
102
+ class TaxCalculationResultRaw(TypedDict):
103
+ """
104
+ Tax calculation result.
105
+
106
+ Parameters
107
+ ----------
108
+ gross_income : float
109
+ The input gross income for the calculation.
110
+
111
+ deductions : float, optional
112
+ Amount to subtract from gross income before tax.
113
+
114
+ taxable_income : float
115
+ Gross income minus deductions.
116
+
117
+ per_tax_level : list[TaxLevelResult]
118
+ Detailed breakdown of income taxed at each tax level.
119
+
120
+ gross_tax : float
121
+ Total tax before credits.
122
+
123
+ tax_credits : float, optional
124
+ Amount subtracted from the computed tax after calculation.
125
+
126
+ net_tax : float
127
+ Total tax after applying credits.
128
+
129
+ effective_rate : float
130
+ Ratio of net tax to gross income (net_tax / gross_income).
131
+
132
+ marginal_rate : float
133
+ Tax rate applied to the last amount of money of taxable income.
134
+ """
135
+
136
+ gross_income: float
137
+ deductions: float
138
+ taxable_income: float
139
+ per_tax_level: list[dict[str, float | None]]
140
+ gross_tax: float
141
+ tax_credits: float
142
+ net_tax: float
143
+ effective_rate: float
144
+ marginal_rate: float
145
+
146
+
147
+ class PersonalIncomeTaxCalculator(BaseClass):
148
+ """
149
+ Progressive personal income tax calculator.
150
+
151
+ Parameters
152
+ ----------
153
+ tax_levels : list[tuple[float | int | None, float]], optional
154
+ Ordered list of tax levels.
155
+ Each tax level is represented as a tuple of (upper_bound, rate),
156
+ where ``upper_bound`` is the cumulative upper limit of the tax level.
157
+ Use ``None`` for the last tax level (no upper limit).
158
+ Example: ``[(10000, 0.10), (50000, 0.2), (None, 0.3)]``.
159
+ Set to ``None`` to have 0% tax rate, by default ``None``
160
+
161
+ deductions : float, optional
162
+ Amount to subtract from gross income before tax, by default 0.0
163
+
164
+ tax_credits : float, optional
165
+ Amount subtracted from the computed tax after calculation, by default 0.0
166
+
167
+ Attributes
168
+ ----------
169
+ gross_income : float
170
+ The input gross income for the calculation.
171
+
172
+ taxable_income : float
173
+ Gross income minus deductions.
174
+
175
+ per_tax_level : list[TaxLevelResult]
176
+ Detailed breakdown of income taxed at each tax level.
177
+
178
+ gross_tax : float
179
+ Total tax before credits.
180
+
181
+ net_tax : float
182
+ Total tax after applying credits.
183
+
184
+ effective_rate : float
185
+ Ratio of net tax to gross income.
186
+
187
+ marginal_rate : float
188
+ Tax rate applied to the last amount of money of taxable income.
189
+ """
190
+
191
+ def __init__(self, tax_levels: TaxLevel | None = None, deductions: float = 0.0, tax_credits: float = 0.0) -> None:
192
+ """
193
+ Progressive personal income tax calculator.
194
+
195
+ Parameters
196
+ ----------
197
+ tax_levels : list[tuple[float | int | None, float]], optional
198
+ Ordered list of tax levels.
199
+ Each tax level is represented as a tuple of (upper_bound, rate),
200
+ where ``upper_bound`` is the cumulative upper limit of the tax level.
201
+ Use ``None`` for the last tax level (no upper limit).
202
+ Example: ``[(10000, 0.10), (50000, 0.2), (None, 0.3)]``.
203
+ Set to ``None`` to have 0% tax rate, by default ``None``
204
+
205
+ deductions : float, optional
206
+ Amount to subtract from gross income before tax, by default 0.0
207
+
208
+ tax_credits : float, optional
209
+ Amount subtracted from the computed tax after calculation, by default 0.0
210
+ """
211
+ self.tax_levels = [] if tax_levels is None else tax_levels
212
+ self.deductions = deductions
213
+ self.tax_credits = tax_credits
214
+
215
+ # Results populated after calculation
216
+ self.gross_income: float = 0.0
217
+ self.taxable_income: float = 0.0
218
+ self.per_tax_level: list[TaxLevelResult] = []
219
+ self.gross_tax: float = 0.0
220
+ self.net_tax: float = 0.0
221
+ self.effective_rate: float = 0.0
222
+ self.marginal_rate: float = 0.0
223
+
224
+ def calculate(self, gross_income: float) -> None:
225
+ """
226
+ Compute tax for a given gross income.
227
+
228
+ Parameters
229
+ ----------
230
+ gross_income : float
231
+ Total gross income (unless tax levels are defined otherwise).
232
+ """
233
+ if gross_income < 0:
234
+ raise ValueError("gross_income must be non-negative")
235
+
236
+ self.gross_income = gross_income
237
+ self.taxable_income = max(0.0, gross_income - max(0.0, self.deductions))
238
+
239
+ self.per_tax_level = []
240
+ prev_upper = 0.0
241
+ remaining = self.taxable_income
242
+ self.gross_tax = 0.0
243
+ self.marginal_rate = 0.0
244
+
245
+ for upper, rate in self.tax_levels:
246
+ lower = prev_upper
247
+ if upper is None:
248
+ amount_taxed = remaining
249
+ else:
250
+ band = upper - prev_upper
251
+ amount_taxed = min(band, max(0.0, remaining))
252
+ tax = max(0.0, amount_taxed) * rate
253
+ self.per_tax_level.append(TaxLevelResult(lower, upper, rate, amount_taxed, tax))
254
+ self.gross_tax += tax
255
+ remaining -= amount_taxed
256
+ prev_upper = upper if upper is not None else prev_upper
257
+ if remaining <= 1e-9:
258
+ self.marginal_rate = rate
259
+ break
260
+ self.marginal_rate = rate
261
+
262
+ self.net_tax = max(0.0, self.gross_tax - max(0.0, self.tax_credits))
263
+ self.effective_rate = self.net_tax / gross_income if gross_income > 0 else 0.0
264
+
265
+ @overload
266
+ def to_dict(self) -> TaxCalculationResult: ... # type: ignore
267
+ @overload
268
+ def to_dict(self, *, raw: Literal[True] = ...) -> TaxCalculationResultRaw: ...
269
+ def to_dict(self, *, raw: bool = False) -> TaxCalculationResult | TaxCalculationResultRaw:
270
+ """
271
+ Returns calculation result in dict format
272
+
273
+ Parameters
274
+ ----------
275
+ raw : bool, optional
276
+ Convert every value to dict, by default ``False``
277
+
278
+ Returns
279
+ -------
280
+ TaxCalculationResult
281
+ Tax calculation result
282
+ """
283
+ result: TaxCalculationResult = {
284
+ "gross_income": self.gross_income,
285
+ "deductions": self.deductions,
286
+ "taxable_income": self.taxable_income,
287
+ "per_tax_level": self.per_tax_level,
288
+ "gross_tax": self.gross_tax,
289
+ "tax_credits": self.tax_credits,
290
+ "net_tax": self.net_tax,
291
+ "effective_rate": self.effective_rate,
292
+ "marginal_rate": self.marginal_rate,
293
+ }
294
+ if raw:
295
+ result_raw: TaxCalculationResultRaw = result # type: ignore
296
+ result_raw["per_tax_level"] = [x.to_dict() for x in result["per_tax_level"]]
297
+ return result
298
+ return result
299
+
300
+ def interpret_result(self) -> str:
301
+ result = self.to_dict()
302
+ text = ["===== Tax information ====="]
303
+
304
+ # text.append(f"Gross income: {result['gross_income']:,}")
305
+ # text.append(f"Deduction: {result['deductions']:,}")
306
+ # text.append(f"Taxable income: {result['taxable_income']:,}")
307
+ text.append(
308
+ f"Taxable income: {result['taxable_income']:,.2f} ({result['gross_income']:,.2f} - {result['deductions']:,.2f})"
309
+ )
310
+
311
+ for idx, tax_level in enumerate(result["per_tax_level"], start=1):
312
+ upper = f"{tax_level.upper:,.2f}" if tax_level.upper is not None else f"{self.gross_income:,.2f}"
313
+ text.append(
314
+ f"- Level {idx}: {tax_level.lower:,.2f} - {upper} @ {tax_level.rate*100:.1f}%: {tax_level.amount_taxed:,.2f} -> tax {tax_level.tax:,.2f}"
315
+ )
316
+
317
+ # text.append(f"Gross tax: {result['gross_tax']:,}")
318
+ # text.append(f"Tax credits: {result['tax_credits']:,}")
319
+ # text.append(f"Net tax: {result['net_tax']:,}")
320
+ text.append(f"Net tax: {result['net_tax']:,.2f} ({result['gross_tax']:,.2f} - {result['tax_credits']:,.2f})")
321
+
322
+ text.append(f"Effective rate: {result['effective_rate']*100:.2f}%")
323
+ text.append(f"Marginal rate: {result['marginal_rate']*100:.1f}%")
324
+ return "\n".join(text)
absfuyu/logger.py CHANGED
@@ -3,8 +3,8 @@ Absfuyu: Logger
3
3
  ---------------
4
4
  Custom Logger Module
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
 
9
9
  Usage:
10
10
  ------
@@ -3,8 +3,8 @@ Absfuyu: Package data
3
3
  ---------------------
4
4
  Load package data
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
@@ -3,8 +3,8 @@ Absfuyu: Package data
3
3
  ---------------------
4
4
  Deprecated (but might have some use)
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Library
absfuyu/pkg_data/logo.py CHANGED
@@ -3,8 +3,8 @@ Absfuyu: Logo
3
3
  -------------
4
4
  Absfuyu logo in base64 string for easy access
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  from enum import StrEnum
absfuyu/sort.py CHANGED
@@ -3,8 +3,8 @@ Absfuyu: Sort
3
3
  -------------
4
4
  Sort Module
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
absfuyu/tools/__init__.py CHANGED
@@ -3,8 +3,8 @@ Absfuyu: Tools
3
3
  --------------
4
4
  Some useful tools
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module Package
absfuyu/tools/checksum.py CHANGED
@@ -3,8 +3,8 @@ Absufyu: Checksum
3
3
  -----------------
4
4
  Check MD5, SHA256, ...
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
@@ -3,8 +3,8 @@ Absufyu: Converter
3
3
  ------------------
4
4
  Convert stuff
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
 
9
9
  Feature:
10
10
  --------
@@ -3,8 +3,8 @@ Absfuyu: Generator
3
3
  ------------------
4
4
  This generate stuff (Not python's ``generator``)
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
 
9
9
  Features:
10
10
  ---------
@@ -3,8 +3,8 @@ Absfuyu: Inspector
3
3
  ------------------
4
4
  Inspector
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
absfuyu/tools/keygen.py CHANGED
@@ -5,8 +5,8 @@ Mod7 product key generator (90's)
5
5
 
6
6
  This is for educational and informative purposes only.
7
7
 
8
- Version: 5.9.0
9
- Date updated: 19/09/2025 (dd/mm/yyyy)
8
+ Version: 5.11.0
9
+ Date updated: 30/09/2025 (dd/mm/yyyy)
10
10
  """
11
11
 
12
12
  # Module level
@@ -3,8 +3,8 @@ Absfuyu: Obfuscator
3
3
  -------------------
4
4
  Obfuscate code
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
@@ -3,8 +3,8 @@ Absfuyu: Passwordlib
3
3
  --------------------
4
4
  Password library
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level
@@ -3,8 +3,8 @@ Absfuyu: Shutdownizer
3
3
  ---------------------
4
4
  This shutdowns
5
5
 
6
- Version: 5.9.0
7
- Date updated: 19/09/2025 (dd/mm/yyyy)
6
+ Version: 5.11.0
7
+ Date updated: 30/09/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
10
10
  # Module level