absfuyu 4.1.0__tar.gz → 4.1.1__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 (90) hide show
  1. {absfuyu-4.1.0 → absfuyu-4.1.1}/PKG-INFO +1 -1
  2. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/__init__.py +1 -1
  3. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/cli/do_group.py +27 -4
  4. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/core.py +2 -3
  5. absfuyu-4.1.1/src/absfuyu/tools/checksum.py +143 -0
  6. absfuyu-4.1.0/src/absfuyu/tools/checksum.py +0 -56
  7. {absfuyu-4.1.0 → absfuyu-4.1.1}/.gitignore +0 -0
  8. {absfuyu-4.1.0 → absfuyu-4.1.1}/LICENSE +0 -0
  9. {absfuyu-4.1.0 → absfuyu-4.1.1}/README.md +0 -0
  10. {absfuyu-4.1.0 → absfuyu-4.1.1}/dev_requirements.txt +0 -0
  11. {absfuyu-4.1.0 → absfuyu-4.1.1}/docs/Makefile +0 -0
  12. {absfuyu-4.1.0 → absfuyu-4.1.1}/docs/conf.py +0 -0
  13. {absfuyu-4.1.0 → absfuyu-4.1.1}/docs/index.rst +0 -0
  14. {absfuyu-4.1.0 → absfuyu-4.1.1}/docs/info.md +0 -0
  15. {absfuyu-4.1.0 → absfuyu-4.1.1}/docs/make.bat +0 -0
  16. {absfuyu-4.1.0 → absfuyu-4.1.1}/docs/modules.rst +0 -0
  17. {absfuyu-4.1.0 → absfuyu-4.1.1}/images/repository-image-crop.png +0 -0
  18. {absfuyu-4.1.0 → absfuyu-4.1.1}/images/repository-image-white.png +0 -0
  19. {absfuyu-4.1.0 → absfuyu-4.1.1}/images/repository-image.png +0 -0
  20. {absfuyu-4.1.0 → absfuyu-4.1.1}/pyproject.toml +0 -0
  21. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/__main__.py +0 -0
  22. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/cli/__init__.py +0 -0
  23. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/cli/color.py +0 -0
  24. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/cli/config_group.py +0 -0
  25. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/cli/game_group.py +0 -0
  26. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/config/__init__.py +0 -0
  27. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/config/config.json +0 -0
  28. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/everything.py +0 -0
  29. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/__init__.py +0 -0
  30. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/beautiful.py +0 -0
  31. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/dev/__init__.py +0 -0
  32. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/dev/password_hash.py +0 -0
  33. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/dev/passwordlib.py +0 -0
  34. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/dev/project_starter.py +0 -0
  35. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/dev/shutdownizer.py +0 -0
  36. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/extra/__init__.py +0 -0
  37. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/extensions/extra/data_analysis.py +0 -0
  38. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/fun/WGS.py +0 -0
  39. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/fun/__init__.py +0 -0
  40. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/fun/tarot.py +0 -0
  41. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/game/__init__.py +0 -0
  42. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/game/game_stat.py +0 -0
  43. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/game/sudoku.py +0 -0
  44. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/game/tictactoe.py +0 -0
  45. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/game/wordle.py +0 -0
  46. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/general/__init__.py +0 -0
  47. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/general/content.py +0 -0
  48. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/general/data_extension.py +0 -0
  49. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/general/generator.py +0 -0
  50. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/general/human.py +0 -0
  51. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/logger.py +0 -0
  52. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/pkg_data/__init__.py +0 -0
  53. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/pkg_data/chemistry.pkl +0 -0
  54. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/pkg_data/tarot.pkl +0 -0
  55. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/py.typed +0 -0
  56. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/sort.py +0 -0
  57. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/tools/__init__.py +0 -0
  58. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/tools/converter.py +0 -0
  59. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/tools/keygen.py +0 -0
  60. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/tools/obfuscator.py +0 -0
  61. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/tools/stats.py +0 -0
  62. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/tools/web.py +0 -0
  63. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/__init__.py +0 -0
  64. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/api.py +0 -0
  65. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/json_method.py +0 -0
  66. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/lunar.py +0 -0
  67. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/path.py +0 -0
  68. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/performance.py +0 -0
  69. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/pkl.py +0 -0
  70. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/shorten_number.py +0 -0
  71. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/util/zipped.py +0 -0
  72. {absfuyu-4.1.0 → absfuyu-4.1.1}/src/absfuyu/version.py +0 -0
  73. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/__init__.py +0 -0
  74. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/conftest.py +0 -0
  75. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_beautiful.py +0 -0
  76. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_config.py +0 -0
  77. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_data_analysis.py +0 -0
  78. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_data_extension.py +0 -0
  79. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_everything.py +0 -0
  80. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_extensions.py +0 -0
  81. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_fun.py +0 -0
  82. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_game.py +0 -0
  83. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_generator.py +0 -0
  84. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_logger.py +0 -0
  85. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_passwordlib.py +0 -0
  86. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_pkg_data.py +0 -0
  87. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_tarot.py +0 -0
  88. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_tools.py +0 -0
  89. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_util.py +0 -0
  90. {absfuyu-4.1.0 → absfuyu-4.1.1}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: absfuyu
3
- Version: 4.1.0
3
+ Version: 4.1.1
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/
@@ -22,7 +22,7 @@ Using in cmd (`absfuyu[cli]` required):
22
22
  __title__ = "absfuyu"
23
23
  __author__ = "AbsoluteWinter"
24
24
  __license__ = "MIT License"
25
- __version__ = "4.1.0"
25
+ __version__ = "4.1.1"
26
26
  __all__ = [
27
27
  "core",
28
28
  "config",
@@ -3,7 +3,7 @@ ABSFUYU CLI
3
3
  -----------
4
4
  Do
5
5
 
6
- Version: 1.3.0
6
+ Version: 1.3.1
7
7
  Date updated: 01/02/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
@@ -18,7 +18,7 @@ from absfuyu import __title__
18
18
  from absfuyu.cli.color import COLOR
19
19
  from absfuyu.core import __package_feature__
20
20
  from absfuyu.general.human import Human2
21
- from absfuyu.tools.checksum import checksum_operation
21
+ from absfuyu.tools.checksum import Checksum
22
22
  from absfuyu.util.zipped import Zipper
23
23
  from absfuyu.version import PkgVersion
24
24
 
@@ -109,6 +109,26 @@ def unzip_files_in_dir(dir: str) -> None:
109
109
  show_default=True,
110
110
  help="Hash mode",
111
111
  )
112
+ @click.option(
113
+ "--save-result",
114
+ "-s",
115
+ "save_result",
116
+ type=bool,
117
+ default=False,
118
+ is_flag=True,
119
+ show_default=True,
120
+ help="Save checksum result to file",
121
+ )
122
+ @click.option(
123
+ "--recursive",
124
+ "-r",
125
+ "recursive_mode",
126
+ type=bool,
127
+ default=False,
128
+ is_flag=True,
129
+ show_default=True,
130
+ help="Do checksum for every file in the folder (including child folder)",
131
+ )
112
132
  @click.option(
113
133
  "--compare",
114
134
  "-c",
@@ -121,11 +141,14 @@ def unzip_files_in_dir(dir: str) -> None:
121
141
  def file_checksum(
122
142
  file_path: str,
123
143
  hash_mode: str | Literal["md5", "sha1", "sha256", "sha512"],
144
+ save_result: bool,
145
+ recursive_mode: bool,
124
146
  hash_to_compare: str,
125
147
  ) -> None:
126
148
  """Checksum for file"""
127
-
128
- res = checksum_operation(file_path, hash_mode=hash_mode)
149
+ # print(hash_mode, save_result, recursive_mode)
150
+ instance = Checksum(file_path, hash_mode=hash_mode, save_result_to_file=save_result)
151
+ res = instance.checksum(recursive=recursive_mode)
129
152
  if hash_to_compare:
130
153
  print(res == hash_to_compare)
131
154
  else:
@@ -3,7 +3,7 @@ Absfuyu: Core
3
3
  -------------
4
4
  Contain type hints and other stuffs
5
5
 
6
- Version: 2.3.0
6
+ Version: 2.3.1
7
7
  Date updated: 01/02/2025 (dd/mm/yyyy)
8
8
  """
9
9
 
@@ -25,7 +25,6 @@ __package_feature__ = ["beautiful", "extra", "res", "full", "dev"]
25
25
  ###########################################################################
26
26
  from importlib import import_module
27
27
  from importlib.resources import files
28
- from typing import Iterable
29
28
 
30
29
 
31
30
  class CLITextColor:
@@ -54,5 +53,5 @@ try:
54
53
  tqdm = import_module("tqdm").tqdm
55
54
  except ModuleNotFoundError:
56
55
 
57
- def tqdm(iterable: Iterable, **kwargs):
56
+ def tqdm(iterable, **kwargs):
58
57
  return iterable
@@ -0,0 +1,143 @@
1
+ """
2
+ Absufyu: Checksum
3
+ -----------------
4
+ Check MD5, SHA256, ...
5
+
6
+ Version: 1.1.0
7
+ Date updated: 01/02/2025 (dd/mm/yyyy)
8
+ """
9
+
10
+ # Module level
11
+ ###########################################################################
12
+ __all__ = ["Checksum", "checksum_operation"]
13
+
14
+
15
+ # Library
16
+ ###########################################################################
17
+ import hashlib
18
+ from pathlib import Path
19
+ from typing import Literal
20
+
21
+ from absfuyu.core import tqdm
22
+
23
+ # Function
24
+ ###########################################################################
25
+
26
+
27
+ # Deprecated
28
+ def checksum_operation(
29
+ file: Path | str,
30
+ hash_mode: str | Literal["md5", "sha1", "sha256", "sha512"] = "sha256",
31
+ ) -> str:
32
+ """This performs checksum"""
33
+ if hash_mode.lower() == "md5":
34
+ hash_engine = hashlib.md5()
35
+ elif hash_mode.lower() == "sha1":
36
+ hash_engine = hashlib.sha1()
37
+ elif hash_mode.lower() == "sha256":
38
+ hash_engine = hashlib.sha256()
39
+ elif hash_mode.lower() == "sha512":
40
+ hash_engine = hashlib.sha512()
41
+ else:
42
+ hash_engine = hashlib.md5()
43
+
44
+ with open(Path(file), "rb") as f:
45
+ while True:
46
+ data = f.read(4096)
47
+ if len(data) == 0:
48
+ break
49
+ else:
50
+ hash_engine.update(data)
51
+ return hash_engine.hexdigest()
52
+
53
+
54
+ class Checksum:
55
+ def __init__(
56
+ self,
57
+ path: str | Path,
58
+ hash_mode: str | Literal["md5", "sha1", "sha256", "sha512"] = "sha256",
59
+ save_result_to_file: bool = False,
60
+ ) -> None:
61
+ self.path = Path(path)
62
+ self.hash_mode = hash_mode
63
+ self.save_result_to_file = save_result_to_file
64
+ self.checksum_result_file_name = "checksum_results.txt"
65
+
66
+ def _get_hash_engine(self):
67
+ hash_mode = self.hash_mode
68
+ if hash_mode.lower() == "md5":
69
+ hash_engine = hashlib.md5()
70
+ elif hash_mode.lower() == "sha1":
71
+ hash_engine = hashlib.sha1()
72
+ elif hash_mode.lower() == "sha256":
73
+ hash_engine = hashlib.sha256()
74
+ elif hash_mode.lower() == "sha512":
75
+ hash_engine = hashlib.sha512()
76
+ else:
77
+ hash_engine = hashlib.md5()
78
+ return hash_engine
79
+
80
+ def _checksum_operation(
81
+ self,
82
+ file: Path | str,
83
+ ) -> str:
84
+ """This performs checksum"""
85
+
86
+ hash_engine = self._get_hash_engine().copy()
87
+ with open(Path(file), "rb") as f:
88
+ # Read and hash the file in 4K chunks. Reading the whole
89
+ # file at once might consume a lot of memory if it is
90
+ # large.
91
+ while True:
92
+ data = f.read(4096)
93
+ if len(data) == 0:
94
+ break
95
+ else:
96
+ hash_engine.update(data)
97
+ return hash_engine.hexdigest() # type: ignore
98
+
99
+ def checksum(self, recursive: bool = True) -> str:
100
+ """Perform checksum
101
+
102
+ Parameters
103
+ ----------
104
+ recursive : bool, optional
105
+ Do checksum for every file in the folder (including child folder), by default True
106
+
107
+ Returns
108
+ -------
109
+ str
110
+ Checksum hash
111
+ """
112
+ if self.path.absolute().is_dir():
113
+ new_path = self.path.joinpath(self.checksum_result_file_name)
114
+ # List of files
115
+ if recursive:
116
+ file_list: list[Path] = [
117
+ x for x in self.path.glob("**/*") if x.is_file()
118
+ ]
119
+ else:
120
+ file_list = [x for x in self.path.glob("*") if x.is_file()]
121
+
122
+ # Checksum
123
+ res = []
124
+ for x in tqdm(file_list, desc="Calculating hash", unit_scale=True):
125
+ name = x.relative_to(self.path)
126
+ res.append(f"{self._checksum_operation(x)} | {name}")
127
+ output = "\n".join(res)
128
+ else:
129
+ new_path = self.path.with_name(self.checksum_result_file_name)
130
+ output = self._checksum_operation(self.path)
131
+
132
+ # Save result
133
+ if self.save_result_to_file:
134
+ with open(new_path, "w", encoding="utf-8") as f:
135
+ f.write(output)
136
+
137
+ return output
138
+
139
+
140
+ # Run
141
+ ###########################################################################
142
+ if __name__ == "__main__":
143
+ pass
@@ -1,56 +0,0 @@
1
- """
2
- Absufyu: Checksum
3
- -----------------
4
- Check MD5, SHA256, ...
5
-
6
- Version: 1.0.0
7
- Date updated: 01/02/2025 (dd/mm/yyyy)
8
- """
9
-
10
- # Module level
11
- ###########################################################################
12
- __all__ = ["checksum_operation"]
13
-
14
-
15
- # Library
16
- ###########################################################################
17
- import hashlib
18
- from pathlib import Path
19
- from typing import Literal
20
-
21
-
22
- # Function
23
- ###########################################################################
24
- def checksum_operation(
25
- file: Path | str,
26
- hash_mode: str | Literal["md5", "sha1", "sha256", "sha512"] = "sha256",
27
- ) -> str:
28
- """This performs checksum"""
29
- if hash_mode.lower() == "md5":
30
- hash_engine = hashlib.md5()
31
- elif hash_mode.lower() == "sha1":
32
- hash_engine = hashlib.sha1()
33
- elif hash_mode.lower() == "sha256":
34
- hash_engine = hashlib.sha256()
35
- elif hash_mode.lower() == "sha512":
36
- hash_engine = hashlib.sha512()
37
- else:
38
- hash_engine = hashlib.md5()
39
-
40
- with open(Path(file), "rb") as f:
41
- # Read and hash the file in 4K chunks. Reading the whole
42
- # file at once might consume a lot of memory if it is
43
- # large.
44
- while True:
45
- data = f.read(4096)
46
- if len(data) == 0:
47
- break
48
- else:
49
- hash_engine.update(data)
50
- return hash_engine.hexdigest()
51
-
52
-
53
- # Run
54
- ###########################################################################
55
- if __name__ == "__main__":
56
- pass
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes