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.
- {absfuyu-3.0.0/src/absfuyu.egg-info → absfuyu-3.1.0}/PKG-INFO +28 -28
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/config/config.json +1 -1
- absfuyu-3.1.0/src/absfuyu/extensions/dev/__init__.py +241 -0
- absfuyu-3.1.0/src/absfuyu/extensions/extra/data_analysis.py +919 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/fun/tarot.py +9 -7
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/tictactoe2.py +90 -78
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/data_extension.py +147 -11
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/generator.py +65 -4
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/human.py +27 -2
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/performance.py +101 -14
- {absfuyu-3.0.0 → absfuyu-3.1.0/src/absfuyu.egg-info}/PKG-INFO +28 -28
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/SOURCES.txt +1 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_ListExt.py +9 -3
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_Text.py +16 -3
- absfuyu-3.1.0/tests/test_data_analysis.py +123 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_everything.py +4 -5
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_generator.py +21 -2
- absfuyu-3.0.0/src/absfuyu/extensions/dev/__init__.py +0 -101
- absfuyu-3.0.0/src/absfuyu/extensions/extra/data_analysis.py +0 -351
- {absfuyu-3.0.0 → absfuyu-3.1.0}/LICENSE +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/MANIFEST.in +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/README.md +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/extra_requirements.txt +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/images/repository-image-crop.png +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/pyproject.toml +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/requirements.txt +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/setup.cfg +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/setup.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/__main__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/config/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/core.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/everything.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/beautiful.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/password_hash.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/passwordlib.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/pkglib.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/project_starter.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/dev/shutdownizer.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/extensions/extra/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/fun/WGS.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/fun/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/sudoku.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/tictactoe.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/game/wordle.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/general/content.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/logger.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/pkg_data/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/pkg_data/chemistry.pkl +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/pkg_data/tarot.pkl +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/sort.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/converter.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/keygen.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/obfuscator.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/stats.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/tools/web.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/__init__.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/api.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/json_method.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/lunar.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/path.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/pkl.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/util/zipped.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu/version.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/dependency_links.txt +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/entry_points.txt +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/requires.txt +21 -21
- {absfuyu-3.0.0 → absfuyu-3.1.0}/src/absfuyu.egg-info/top_level.txt +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_DictExt.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_IntNumber.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_api.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_beautiful.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_config.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_converter.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_extensions.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_fun.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_json_method.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_logger.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_obfuscator.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_passwordlib.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_path.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_pkg_data.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_tarot.py +0 -0
- {absfuyu-3.0.0 → absfuyu-3.1.0}/tests/test_util.py +0 -0
- {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.
|
|
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:
|
|
74
|
-
Requires-Dist:
|
|
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:
|
|
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">
|
|
@@ -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/"))
|