absfuyu 3.0.0__tar.gz → 3.1.0__tar.gz

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 (89) hide show
  1. {absfuyu-3.0.0/src/absfuyu.egg-info → absfuyu-3.1.0}/PKG-INFO +28 -28
  2. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/config/config.json +1 -1
  3. absfuyu-3.1.0/src/absfuyu/extensions/dev/__init__.py +241 -0
  4. absfuyu-3.1.0/src/absfuyu/extensions/extra/data_analysis.py +919 -0
  5. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/fun/tarot.py +9 -7
  6. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/tictactoe2.py +90 -78
  7. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/data_extension.py +147 -11
  8. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/generator.py +65 -4
  9. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/human.py +27 -2
  10. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/performance.py +101 -14
  11. {absfuyu-3.0.0 → absfuyu-3.1.0/src/absfuyu.egg-info}/PKG-INFO +28 -28
  12. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/SOURCES.txt +1 -0
  13. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_ListExt.py +9 -3
  14. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_Text.py +16 -3
  15. absfuyu-3.1.0/tests/test_data_analysis.py +123 -0
  16. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_everything.py +4 -5
  17. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_generator.py +21 -2
  18. absfuyu-3.0.0/src/absfuyu/extensions/dev/__init__.py +0 -101
  19. absfuyu-3.0.0/src/absfuyu/extensions/extra/data_analysis.py +0 -351
  20. {absfuyu-3.0.0 → absfuyu-3.1.0}/LICENSE +0 -0
  21. {absfuyu-3.0.0 → absfuyu-3.1.0}/MANIFEST.in +0 -0
  22. {absfuyu-3.0.0 → absfuyu-3.1.0}/README.md +0 -0
  23. {absfuyu-3.0.0 → absfuyu-3.1.0}/extra_requirements.txt +0 -0
  24. {absfuyu-3.0.0 → absfuyu-3.1.0}/images/repository-image-crop.png +0 -0
  25. {absfuyu-3.0.0 → absfuyu-3.1.0}/pyproject.toml +0 -0
  26. {absfuyu-3.0.0 → absfuyu-3.1.0}/requirements.txt +0 -0
  27. {absfuyu-3.0.0 → absfuyu-3.1.0}/setup.cfg +0 -0
  28. {absfuyu-3.0.0 → absfuyu-3.1.0}/setup.py +0 -0
  29. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/__init__.py +0 -0
  30. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/__main__.py +0 -0
  31. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/config/__init__.py +0 -0
  32. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/core.py +0 -0
  33. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/everything.py +0 -0
  34. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/__init__.py +0 -0
  35. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/beautiful.py +0 -0
  36. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/password_hash.py +0 -0
  37. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/passwordlib.py +0 -0
  38. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/pkglib.py +0 -0
  39. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/project_starter.py +0 -0
  40. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/shutdownizer.py +0 -0
  41. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/extra/__init__.py +0 -0
  42. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/fun/WGS.py +0 -0
  43. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/fun/__init__.py +0 -0
  44. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/__init__.py +0 -0
  45. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/sudoku.py +0 -0
  46. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/tictactoe.py +0 -0
  47. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/wordle.py +0 -0
  48. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/__init__.py +0 -0
  49. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/content.py +0 -0
  50. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/logger.py +0 -0
  51. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/pkg_data/__init__.py +0 -0
  52. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/pkg_data/chemistry.pkl +0 -0
  53. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/pkg_data/tarot.pkl +0 -0
  54. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/sort.py +0 -0
  55. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/__init__.py +0 -0
  56. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/converter.py +0 -0
  57. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/keygen.py +0 -0
  58. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/obfuscator.py +0 -0
  59. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/stats.py +0 -0
  60. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/web.py +0 -0
  61. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/__init__.py +0 -0
  62. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/api.py +0 -0
  63. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/json_method.py +0 -0
  64. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/lunar.py +0 -0
  65. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/path.py +0 -0
  66. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/pkl.py +0 -0
  67. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/zipped.py +0 -0
  68. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/version.py +0 -0
  69. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/dependency_links.txt +0 -0
  70. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/entry_points.txt +0 -0
  71. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/requires.txt +21 -21
  72. {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/top_level.txt +0 -0
  73. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_DictExt.py +0 -0
  74. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_IntNumber.py +0 -0
  75. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_api.py +0 -0
  76. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_beautiful.py +0 -0
  77. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_config.py +0 -0
  78. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_converter.py +0 -0
  79. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_extensions.py +0 -0
  80. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_fun.py +0 -0
  81. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_json_method.py +0 -0
  82. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_logger.py +0 -0
  83. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_obfuscator.py +0 -0
  84. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_passwordlib.py +0 -0
  85. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_path.py +0 -0
  86. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_pkg_data.py +0 -0
  87. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_tarot.py +0 -0
  88. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_util.py +0 -0
  89. {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: absfuyu
3
- Version: 3.0.0
3
+ Version: 3.1.0
4
4
  Summary: A small collection of code
5
5
  Author: somewhatcold (AbsoluteWinter)
6
6
  License: MIT License
@@ -56,42 +56,42 @@ Requires-Dist: unidecode
56
56
  Requires-Dist: tomli>=1.1.0; python_version < "3.11"
57
57
  Requires-Dist: typing_extensions>=4.0.1; python_version < "3.11"
58
58
  Requires-Dist: importlib_resources; python_version < "3.10"
59
- Provides-Extra: absfuyu-res
60
- Requires-Dist: absfuyu-res; extra == "absfuyu-res"
61
- Provides-Extra: res
62
- Requires-Dist: absfuyu-res; extra == "res"
63
59
  Provides-Extra: full
64
- Requires-Dist: absfuyu-res; extra == "full"
65
- Requires-Dist: rich; extra == "full"
66
- Requires-Dist: colorama>=0.4; extra == "full"
67
60
  Requires-Dist: pandas; extra == "full"
68
- Requires-Dist: click>=8.0.0; extra == "full"
69
61
  Requires-Dist: numpy; extra == "full"
62
+ Requires-Dist: rich; extra == "full"
63
+ Requires-Dist: click>=8.0.0; extra == "full"
64
+ Requires-Dist: colorama>=0.4; extra == "full"
65
+ Requires-Dist: absfuyu-res; extra == "full"
66
+ Provides-Extra: res
67
+ Requires-Dist: absfuyu-res; extra == "res"
68
+ Provides-Extra: absfuyu-res
69
+ Requires-Dist: absfuyu-res; extra == "absfuyu-res"
70
+ Provides-Extra: rich
71
+ Requires-Dist: rich; extra == "rich"
70
72
  Provides-Extra: beautiful
71
73
  Requires-Dist: rich; extra == "beautiful"
72
74
  Provides-Extra: dev
73
- Requires-Dist: black; extra == "dev"
74
- Requires-Dist: sphinx_rtd_theme; extra == "dev"
75
+ Requires-Dist: twine>=3.7.1; extra == "dev"
76
+ Requires-Dist: pytest>=6.2.5; extra == "dev"
75
77
  Requires-Dist: rich; extra == "dev"
78
+ Requires-Dist: sphinx_rtd_theme; extra == "dev"
79
+ Requires-Dist: click>=8.0.0; extra == "dev"
80
+ Requires-Dist: build; extra == "dev"
76
81
  Requires-Dist: coverage; extra == "dev"
77
- Requires-Dist: pytest>=6.2.5; extra == "dev"
78
82
  Requires-Dist: colorama>=0.4; extra == "dev"
79
- Requires-Dist: twine>=3.7.1; extra == "dev"
80
- Requires-Dist: click>=8.0.0; extra == "dev"
81
83
  Requires-Dist: sphinx>=7.0.0; extra == "dev"
82
- Requires-Dist: build; extra == "dev"
83
- Provides-Extra: rich
84
- Requires-Dist: rich; extra == "rich"
84
+ Requires-Dist: black; extra == "dev"
85
85
  Provides-Extra: cli
86
86
  Requires-Dist: click>=8.0.0; extra == "cli"
87
87
  Requires-Dist: colorama>=0.4; extra == "cli"
88
88
  Provides-Extra: click
89
89
  Requires-Dist: click>=8.0.0; extra == "click"
90
90
  Provides-Extra: extra
91
- Requires-Dist: pandas; extra == "extra"
92
91
  Requires-Dist: click>=8.0.0; extra == "extra"
93
- Requires-Dist: colorama>=0.4; extra == "extra"
94
92
  Requires-Dist: numpy; extra == "extra"
93
+ Requires-Dist: colorama>=0.4; extra == "extra"
94
+ Requires-Dist: pandas; extra == "extra"
95
95
  Provides-Extra: colorama
96
96
  Requires-Dist: colorama>=0.4; extra == "colorama"
97
97
  Provides-Extra: numpy
@@ -113,19 +113,19 @@ Requires-Dist: sphinx>=7.0.0; extra == "sphinx"
113
113
  Provides-Extra: sphinx-rtd-theme
114
114
  Requires-Dist: sphinx_rtd_theme; extra == "sphinx-rtd-theme"
115
115
  Provides-Extra: all
116
- Requires-Dist: absfuyu-res; extra == "all"
117
- Requires-Dist: black; extra == "all"
118
- Requires-Dist: sphinx_rtd_theme; extra == "all"
119
- Requires-Dist: rich; extra == "all"
120
- Requires-Dist: coverage; extra == "all"
121
- Requires-Dist: pytest>=6.2.5; extra == "all"
122
- Requires-Dist: colorama>=0.4; extra == "all"
123
116
  Requires-Dist: twine>=3.7.1; extra == "all"
124
117
  Requires-Dist: pandas; extra == "all"
125
- Requires-Dist: click>=8.0.0; extra == "all"
126
- Requires-Dist: sphinx>=7.0.0; extra == "all"
127
118
  Requires-Dist: numpy; extra == "all"
119
+ Requires-Dist: pytest>=6.2.5; extra == "all"
120
+ Requires-Dist: rich; extra == "all"
121
+ Requires-Dist: sphinx_rtd_theme; extra == "all"
122
+ Requires-Dist: click>=8.0.0; extra == "all"
128
123
  Requires-Dist: build; extra == "all"
124
+ Requires-Dist: coverage; extra == "all"
125
+ Requires-Dist: colorama>=0.4; extra == "all"
126
+ Requires-Dist: sphinx>=7.0.0; extra == "all"
127
+ Requires-Dist: black; extra == "all"
128
+ Requires-Dist: absfuyu-res; extra == "all"
129
129
 
130
130
  <div align="center">
131
131
  <h1 align="center">
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "version": {
25
25
  "major": 3,
26
- "minor": 0,
26
+ "minor": 1,
27
27
  "patch": 0,
28
28
  "release_level": "final",
29
29
  "serial": 0
@@ -0,0 +1,241 @@
1
+ """
2
+ Absfuyu: Development
3
+ ---
4
+ Some stuffs that are not ready to use yet
5
+
6
+ Version: 2.0.0
7
+ Date updated: 23/11/2023 (dd/mm/yyyy)
8
+ """
9
+
10
+
11
+ # Module level
12
+ ###########################################################################
13
+ __all__ = [
14
+ "password_check",
15
+ "fib",
16
+ ]
17
+
18
+
19
+ # Library
20
+ ###########################################################################
21
+ import base64
22
+ from collections import deque
23
+ from functools import lru_cache
24
+ import re
25
+ from typing import Dict, TypedDict, Final, List, NamedTuple
26
+
27
+
28
+ # PASSWORD CHECKER
29
+ def password_check(password: str) -> bool:
30
+ """
31
+ Verify the strength of 'password'.
32
+ Returns a dict indicating the wrong criteria.
33
+ A password is considered strong if:
34
+ - 8 characters length or more
35
+ - 1 digit or more
36
+ - 1 symbol or more
37
+ - 1 uppercase letter or more
38
+ - 1 lowercase letter or more
39
+ """
40
+
41
+ # calculating the length
42
+ length_error = len(password) < 8
43
+
44
+ # searching for digits
45
+ digit_error = re.search(r"\d", password) is None
46
+
47
+ # searching for uppercase
48
+ uppercase_error = re.search(r"[A-Z]", password) is None
49
+
50
+ # searching for lowercase
51
+ lowercase_error = re.search(r"[a-z]", password) is None
52
+
53
+ # searching for symbols
54
+ symbols = re.compile(r"[ !#$%&'()*+,-./[\\\]^_`{|}~" + r'"]')
55
+ symbol_error = symbols.search(password) is None
56
+
57
+ detail = {
58
+ "password_ok": not any(
59
+ [ # overall result
60
+ length_error,
61
+ digit_error,
62
+ uppercase_error,
63
+ lowercase_error,
64
+ symbol_error,
65
+ ]
66
+ ),
67
+ "length_error": length_error,
68
+ "digit_error": digit_error,
69
+ "uppercase_error": uppercase_error,
70
+ "lowercase_error": lowercase_error,
71
+ "symbol_error": symbol_error,
72
+ }
73
+
74
+ return detail["password_ok"]
75
+
76
+
77
+ # FIBONACCI WITH CACHE
78
+ @lru_cache(maxsize=5)
79
+ def fib(n: int) -> int:
80
+ """Fibonacci (recursive)"""
81
+ # max recursion is 484
82
+ if n < 2:
83
+ return n
84
+ return fib(n - 1) + fib(n - 2)
85
+
86
+
87
+ # https://stackoverflow.com/questions/563022/whats-python-good-practice-for-importing-and-offering-optional-features
88
+ def optional_import(module: str, name: str = None, package: str = None):
89
+ import importlib
90
+
91
+ try:
92
+ module = importlib.import_module(module)
93
+ return module if name is None else getattr(module, name)
94
+ except ImportError as e:
95
+ if package is None:
96
+ package = module
97
+ msg = f"install the '{package}' package to make use of this feature"
98
+ import_error = e
99
+
100
+ def _failed_import(*args):
101
+ raise ValueError(msg) from import_error
102
+
103
+ return _failed_import
104
+
105
+
106
+ def load_toml_file(toml_file: str):
107
+ """
108
+ Load ``.toml`` file
109
+
110
+ :param toml_file: Path to ``.toml`` file
111
+ """
112
+ from sys import version_info as _python_version
113
+
114
+ if _python_version.minor < 11:
115
+ try:
116
+ import tomli as tomllib
117
+ except ImportError:
118
+ raise ImportError("Please install tomli python package")
119
+ except:
120
+ raise SystemExit
121
+ else:
122
+ import tomllib
123
+
124
+ with open(toml_file, "rb") as file:
125
+ toml_data = tomllib.load(file)
126
+ return toml_data
127
+
128
+
129
+ def get_sitemap(url: str):
130
+ import re
131
+ import requests
132
+
133
+ class Url(NamedTuple):
134
+ base: str
135
+ extra: str
136
+
137
+ def __str__(self) -> str:
138
+ return f"{self.base}{self.extra}"
139
+
140
+ def __repr__(self) -> str:
141
+ return f"{self.__class__.__name__}({self.base}{self.extra})"
142
+
143
+ # robots.txt
144
+ # sitemap.xml
145
+ if not url.endswith("/"):
146
+ url += "/"
147
+ pattern = re.compile(
148
+ r"([(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b)([-a-zA-Z0-9@:%_\+.~#?&//=]*)",
149
+ re.IGNORECASE,
150
+ )
151
+ try:
152
+ url += "sitemap.xml"
153
+ res = requests.get(url).text
154
+ except:
155
+ # W.I.P
156
+ url += "robots.txt"
157
+ res = requests.get(url).text
158
+ regex = re.findall(pattern, res)
159
+ return list(map(Url._make, regex))
160
+
161
+
162
+ from absfuyu.general import ClassBase
163
+
164
+ class SimpleStrEncrypt(ClassBase):
165
+ """
166
+ Simple Encryption
167
+
168
+ Logic:
169
+ - Base64
170
+ - Shift characters
171
+ """
172
+
173
+ def __init__(self, times_to_base64_encode: int = 10, shift: int = 13) -> None:
174
+ """
175
+ :param times_to_base64_encode: How many time to base64 encode
176
+ :type times_to_base64_encode: int
177
+ :param shift: Shift characters to the right for how many position
178
+ :type shift: int
179
+ """
180
+ self.times_to_base64_encode = times_to_base64_encode
181
+ self.shift = shift
182
+
183
+ # Support
184
+ def _convert_table(self, text: str, shift: int) -> Dict[str, str]:
185
+ data = text
186
+
187
+ data = deque(sorted(list(set(data))))
188
+ translate = data.copy()
189
+ translate.rotate(shift)
190
+ convert_table = dict(zip(data, translate))
191
+
192
+ return convert_table
193
+
194
+ @staticmethod
195
+ def _use_convert_table(text: str, convert_table: Dict[str, str]) -> str:
196
+ """Use convert table"""
197
+ data = list(text)
198
+ for i, x in enumerate(data):
199
+ data[i] = convert_table[x]
200
+ return "".join(data)
201
+
202
+ @staticmethod
203
+ def _b64encode(text: str) -> str:
204
+ return base64.b64encode(text.encode()).decode()
205
+
206
+ @staticmethod
207
+ def _b64decode(text: str) -> str:
208
+ return base64.b64decode(text).decode()
209
+
210
+ # Main
211
+ def encode(self, text: str) -> str:
212
+ # Base64
213
+ data = text
214
+ for _ in range(self.times_to_base64_encode):
215
+ data = self._b64encode(data)
216
+
217
+ # Shift
218
+ convert_table = self._convert_table(data, self.shift)
219
+ return self._use_convert_table(data, convert_table)
220
+
221
+ def decode(self, text: str) -> str:
222
+ # Shift back
223
+ data = text
224
+ convert_table = self._convert_table(data, -self.shift)
225
+ data = self._use_convert_table(data, convert_table)
226
+
227
+ # Base64
228
+ for _ in range(self.times_to_base64_encode):
229
+ data = self._b64decode(data)
230
+
231
+ return data
232
+
233
+
234
+
235
+
236
+ # testing
237
+ CON_VAR: Final[List[str]] = ["a", "b"] # Declare as final
238
+
239
+
240
+ if __name__ == "__main__":
241
+ print(get_sitemap("https://kingdomality.com/"))