absfuyu 5.5.0__tar.gz → 5.6.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-5.5.0 → absfuyu-5.6.0}/PKG-INFO +6 -1
- {absfuyu-5.5.0 → absfuyu-5.6.0}/pyproject.toml +6 -3
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/__init__.py +1 -1
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/__main__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/cli/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/cli/color.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/cli/config_group.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/cli/do_group.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/cli/game_group.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/cli/tool_group.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/config/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/core/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/core/baseclass.py +9 -3
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/core/baseclass2.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/core/decorator.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/core/docstring.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/core/dummy_cli.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/core/dummy_func.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/dxt/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/dxt/dictext.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/dxt/dxt_support.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/dxt/intext.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/dxt/listext.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/dxt/strext.py +3 -3
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/beautiful.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/da/__init__.py +3 -3
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/da/dadf.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/da/dadf_base.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/da/df_func.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/da/mplt.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/extra/data_analysis.py +2 -2
- absfuyu-5.6.0/src/absfuyu/extra/pdf.py +89 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/fun/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/fun/rubik.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/fun/tarot.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/game/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/game/game_stat.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/game/sudoku.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/game/tictactoe.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/game/wordle.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/general/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/general/content.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/general/human.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/general/shape.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/logger.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/pkg_data/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/pkg_data/deprecated.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/sort.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/__init__.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/checksum.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/converter.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/generator.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/inspector.py +5 -7
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/keygen.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/obfuscator.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/passwordlib.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/shutdownizer.py +2 -2
- absfuyu-5.6.0/src/absfuyu/tools/sw.py +514 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/tools/web.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/typings.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/__init__.py +14 -3
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/api.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/json_method.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/lunar.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/path.py +38 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/performance.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/shorten_number.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/text_table.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/util/zipped.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/version.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/conftest.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_api.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_beautiful.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_config.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_converter.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_core.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_data_analysis.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_dictext.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_everything.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_extra.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_fun.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_game.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_generator.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_inspector.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_intext.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_listext.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_logger.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_obfuscator.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_passwordlib.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_performance.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_pkg_data.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_shape.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_shorten_number.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_strext.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_text_table.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_tools.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_util.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/test_version.py +2 -2
- {absfuyu-5.5.0 → absfuyu-5.6.0}/.gitignore +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/LICENSE +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/README.md +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/dev_requirements.txt +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/docs/Makefile +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/docs/_template/versioning.html +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/docs/conf.py +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/docs/index.rst +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/docs/info.md +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/docs/make.bat +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/docs/modules.rst +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/images/Logo Full.png +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/images/Logo Square.png +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/images/Logo White.png +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/images/repository-image-crop.png +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/images/repository-image-white.png +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/images/repository-image.png +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/config/config.json +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/pkg_data/chemistry.pkl +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/pkg_data/passwordlib_lzma.pkl +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/pkg_data/tarot.pkl +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/src/absfuyu/py.typed +0 -0
- {absfuyu-5.5.0 → absfuyu-5.6.0}/tests/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: absfuyu
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.6.0
|
|
4
4
|
Summary: A small collection of code
|
|
5
5
|
Project-URL: Homepage, https://github.com/AbsoluteWinter/absfuyu-public
|
|
6
6
|
Project-URL: Documentation, https://absolutewinter.github.io/absfuyu-docs/
|
|
@@ -38,13 +38,18 @@ Provides-Extra: docs
|
|
|
38
38
|
Requires-Dist: numpy; extra == 'docs'
|
|
39
39
|
Requires-Dist: pandas; extra == 'docs'
|
|
40
40
|
Requires-Dist: rich; extra == 'docs'
|
|
41
|
+
Requires-Dist: spire-pdf; extra == 'docs'
|
|
41
42
|
Provides-Extra: extra
|
|
42
43
|
Requires-Dist: numpy; extra == 'extra'
|
|
44
|
+
Requires-Dist: openpyxl; extra == 'extra'
|
|
43
45
|
Requires-Dist: pandas; extra == 'extra'
|
|
46
|
+
Requires-Dist: spire-pdf; extra == 'extra'
|
|
44
47
|
Provides-Extra: full
|
|
45
48
|
Requires-Dist: numpy; extra == 'full'
|
|
49
|
+
Requires-Dist: openpyxl; extra == 'full'
|
|
46
50
|
Requires-Dist: pandas; extra == 'full'
|
|
47
51
|
Requires-Dist: rich; extra == 'full'
|
|
52
|
+
Requires-Dist: spire-pdf; extra == 'full'
|
|
48
53
|
Requires-Dist: tqdm; extra == 'full'
|
|
49
54
|
Requires-Dist: unidecode; extra == 'full'
|
|
50
55
|
Description-Content-Type: text/markdown
|
|
@@ -57,10 +57,13 @@ Repository = "https://github.com/AbsoluteWinter/absfuyu-public"
|
|
|
57
57
|
Issues = "https://github.com/AbsoluteWinter/absfuyu-public/issues"
|
|
58
58
|
|
|
59
59
|
[project.optional-dependencies]
|
|
60
|
-
full = [
|
|
61
|
-
|
|
60
|
+
full = [
|
|
61
|
+
"numpy", "pandas", "rich", "tqdm", "unidecode", "openpyxl", "spire-pdf",
|
|
62
|
+
# "jinja2"
|
|
63
|
+
]
|
|
64
|
+
docs = ["numpy", "pandas", "rich", "spire-pdf"]
|
|
62
65
|
beautiful = ["rich"]
|
|
63
|
-
extra = ["numpy", "pandas"]
|
|
66
|
+
extra = ["numpy", "pandas", "openpyxl", "spire-pdf"]
|
|
64
67
|
dev = ["hatch", "pytest"]
|
|
65
68
|
|
|
66
69
|
[project.scripts]
|
|
@@ -3,8 +3,8 @@ Absfuyu: Core
|
|
|
3
3
|
-------------
|
|
4
4
|
Bases for other features
|
|
5
5
|
|
|
6
|
-
Version: 5.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 5.6.0
|
|
7
|
+
Date updated: 12/09/2025 (dd/mm/yyyy)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
# Module Package
|
|
@@ -1041,7 +1041,13 @@ class BaseClass(GetClassMembersMixin, AutoREPRMixin):
|
|
|
1041
1041
|
# Metaclass
|
|
1042
1042
|
# ---------------------------------------------------------------------------
|
|
1043
1043
|
class PositiveInitArgsMeta(type):
|
|
1044
|
-
"""
|
|
1044
|
+
"""
|
|
1045
|
+
Make sure that every args in a class __init__ is positive
|
|
1046
|
+
|
|
1047
|
+
Usage
|
|
1048
|
+
-----
|
|
1049
|
+
>>> class Test(metaclass=PositiveInitArgsMeta): pass
|
|
1050
|
+
"""
|
|
1045
1051
|
|
|
1046
1052
|
def __call__(cls, *args, **kwargs):
|
|
1047
1053
|
# Check if all positional and keyword arguments are positive
|
|
@@ -3,8 +3,8 @@ Absfuyu: Data Extension
|
|
|
3
3
|
-----------------------
|
|
4
4
|
str extension
|
|
5
5
|
|
|
6
|
-
Version: 5.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 5.6.0
|
|
7
|
+
Date updated: 12/09/2025 (dd/mm/yyyy)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
# Module Package
|
|
@@ -69,7 +69,7 @@ def _generate_string(
|
|
|
69
69
|
count = 0
|
|
70
70
|
|
|
71
71
|
while count < times:
|
|
72
|
-
gen_string = "".join(random.choice(char_lst) for _ in range(size))
|
|
72
|
+
gen_string = "".join(random.choice(char_lst) for _ in range(size)) # type: ignore
|
|
73
73
|
if not unique:
|
|
74
74
|
unique_string.append(gen_string)
|
|
75
75
|
count += 1
|
|
@@ -3,8 +3,8 @@ Absfuyu: Data Analysis
|
|
|
3
3
|
----------------------
|
|
4
4
|
Data Analyst
|
|
5
5
|
|
|
6
|
-
Version: 5.
|
|
7
|
-
Date updated:
|
|
6
|
+
Version: 5.6.0
|
|
7
|
+
Date updated: 12/09/2025 (dd/mm/yyyy)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
# Module level
|
|
@@ -24,7 +24,7 @@ except ImportError:
|
|
|
24
24
|
|
|
25
25
|
from absfuyu.config import ABSFUYU_CONFIG
|
|
26
26
|
|
|
27
|
-
if ABSFUYU_CONFIG._get_setting("auto-install-extra").value:
|
|
27
|
+
if ABSFUYU_CONFIG._get_setting("auto-install-extra").value: # type: ignore
|
|
28
28
|
cmd = "python -m pip install -U absfuyu[full]".split()
|
|
29
29
|
run(cmd)
|
|
30
30
|
else:
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Absfuyu: PDF
|
|
3
|
+
------------
|
|
4
|
+
PDF Tool [W.I.P]
|
|
5
|
+
|
|
6
|
+
Version: 5.6.0
|
|
7
|
+
Date updated: 12/09/2025 (dd/mm/yyyy)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# Module level
|
|
11
|
+
# ---------------------------------------------------------------------------
|
|
12
|
+
__all__ = ["PDFTool"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Library
|
|
16
|
+
# ---------------------------------------------------------------------------
|
|
17
|
+
from collections.abc import Sequence
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import overload
|
|
20
|
+
|
|
21
|
+
from absfuyu.core import BaseClass
|
|
22
|
+
from absfuyu.core.dummy_func import tqdm
|
|
23
|
+
|
|
24
|
+
PDF_MODE = False
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
from spire.pdf import PdfDocument, PdfTextExtractOptions, PdfTextExtractor
|
|
28
|
+
except ImportError:
|
|
29
|
+
from subprocess import run
|
|
30
|
+
|
|
31
|
+
from absfuyu.config import ABSFUYU_CONFIG
|
|
32
|
+
|
|
33
|
+
if ABSFUYU_CONFIG._get_setting("auto-install-extra").value: # type: ignore
|
|
34
|
+
cmd = "python -m pip install -U absfuyu[full]".split()
|
|
35
|
+
run(cmd)
|
|
36
|
+
else:
|
|
37
|
+
raise SystemExit("This feature is in absfuyu[full] package") # noqa: B904
|
|
38
|
+
else:
|
|
39
|
+
PDF_MODE = True
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# Class
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class PDFTool(BaseClass):
|
|
47
|
+
def __init__(self) -> None:
|
|
48
|
+
super().__init__()
|
|
49
|
+
self.engine = PdfDocument() # type: ignore
|
|
50
|
+
|
|
51
|
+
self.files: list[Path] = []
|
|
52
|
+
|
|
53
|
+
@overload
|
|
54
|
+
def add_file(self, file: Path | str) -> None: ...
|
|
55
|
+
|
|
56
|
+
@overload
|
|
57
|
+
def add_file(self, file: Sequence[Path | str]) -> None: ...
|
|
58
|
+
|
|
59
|
+
def add_file(self, file: Path | Sequence[Path | str] | str) -> None:
|
|
60
|
+
if isinstance(file, Sequence) and not isinstance(file, str):
|
|
61
|
+
self.files.extend([Path(x) for x in file])
|
|
62
|
+
else:
|
|
63
|
+
self.files.append(Path(file))
|
|
64
|
+
|
|
65
|
+
def load_file(self) -> list[str]:
|
|
66
|
+
"""
|
|
67
|
+
Extract text from all file
|
|
68
|
+
|
|
69
|
+
Returns
|
|
70
|
+
-------
|
|
71
|
+
list[str]
|
|
72
|
+
Extracted text
|
|
73
|
+
"""
|
|
74
|
+
engine = PdfDocument() # type: ignore
|
|
75
|
+
|
|
76
|
+
extracted: list[str] = []
|
|
77
|
+
for x in tqdm(self.files, desc="Extracting", unit_scale=True):
|
|
78
|
+
engine.LoadFromFile(x.absolute().__str__())
|
|
79
|
+
|
|
80
|
+
# Get pages
|
|
81
|
+
for page in engine.Pages:
|
|
82
|
+
# Create a PdfTextExtractor for the page
|
|
83
|
+
extractor = PdfTextExtractor(page) # type: ignore
|
|
84
|
+
|
|
85
|
+
# Extract all text from the page
|
|
86
|
+
text = extractor.ExtractText(PdfTextExtractOptions()) # type: ignore
|
|
87
|
+
extracted.append(text)
|
|
88
|
+
|
|
89
|
+
return extracted
|