absfuyu 5.2.0__py3-none-any.whl → 5.3.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.
- absfuyu/__init__.py +1 -1
- absfuyu/cli/do_group.py +10 -0
- absfuyu/core/baseclass.py +30 -0
- absfuyu/dxt/listext.py +124 -8
- absfuyu/extra/da/dadf.py +13 -0
- absfuyu/tools/__init__.py +2 -2
- absfuyu/tools/inspector.py +17 -3
- absfuyu/util/path.py +156 -2
- absfuyu/util/text_table.py +218 -62
- {absfuyu-5.2.0.dist-info → absfuyu-5.3.0.dist-info}/METADATA +1 -1
- {absfuyu-5.2.0.dist-info → absfuyu-5.3.0.dist-info}/RECORD +14 -14
- {absfuyu-5.2.0.dist-info → absfuyu-5.3.0.dist-info}/WHEEL +0 -0
- {absfuyu-5.2.0.dist-info → absfuyu-5.3.0.dist-info}/entry_points.txt +0 -0
- {absfuyu-5.2.0.dist-info → absfuyu-5.3.0.dist-info}/licenses/LICENSE +0 -0
absfuyu/__init__.py
CHANGED
absfuyu/cli/do_group.py
CHANGED
|
@@ -83,6 +83,15 @@ def os_shutdown() -> None:
|
|
|
83
83
|
engine.shutdown()
|
|
84
84
|
|
|
85
85
|
|
|
86
|
+
@click.command(name="organize")
|
|
87
|
+
@click.argument("dir", type=str)
|
|
88
|
+
def organize_directory(dir: str) -> None:
|
|
89
|
+
"""Organize a directory"""
|
|
90
|
+
engine = Directory(dir)
|
|
91
|
+
engine.organize()
|
|
92
|
+
click.echo(f"{COLOR['green']}Done!")
|
|
93
|
+
|
|
94
|
+
|
|
86
95
|
@click.group(name="do")
|
|
87
96
|
def do_group() -> None:
|
|
88
97
|
"""Perform functionalities"""
|
|
@@ -93,3 +102,4 @@ do_group.add_command(update)
|
|
|
93
102
|
do_group.add_command(install)
|
|
94
103
|
do_group.add_command(unzip_files_in_dir)
|
|
95
104
|
do_group.add_command(os_shutdown)
|
|
105
|
+
do_group.add_command(organize_directory)
|
absfuyu/core/baseclass.py
CHANGED
|
@@ -162,6 +162,36 @@ class MethodNPropertyList(NamedTuple):
|
|
|
162
162
|
|
|
163
163
|
return self.__class__(new_methods_list, [], [], self.properties)
|
|
164
164
|
|
|
165
|
+
def sort(self, reverse: bool = False) -> Self:
|
|
166
|
+
"""
|
|
167
|
+
Sorts every element in each method list.
|
|
168
|
+
|
|
169
|
+
Parameters
|
|
170
|
+
----------
|
|
171
|
+
reverse : bool, optional
|
|
172
|
+
Descending order, by default ``False``
|
|
173
|
+
|
|
174
|
+
Returns
|
|
175
|
+
-------
|
|
176
|
+
Self
|
|
177
|
+
Sorted.
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
Example:
|
|
181
|
+
--------
|
|
182
|
+
>>> test = MethodNPropertyList(["b", "a"], ["d", "c"], ["f", "e"], ["h", "g"])
|
|
183
|
+
>>> test.sort()
|
|
184
|
+
MethodNPropertyList(methods=['a', 'b'], classmethods=['c', 'd'], staticmethods=['e', 'f'], properties=['g', 'h'])
|
|
185
|
+
|
|
186
|
+
>>> test.pack().sort()
|
|
187
|
+
MethodNPropertyList(methods=['a', 'b', 'c <classmethod>', 'd <classmethod>', 'e <staticmethod>', 'f <staticmethod>'], properties=['g', 'h'])
|
|
188
|
+
"""
|
|
189
|
+
sorted_vals = [
|
|
190
|
+
sorted(getattr(self, field), reverse=reverse) for field in self._fields
|
|
191
|
+
]
|
|
192
|
+
# return self._make(sorted_vals)
|
|
193
|
+
return self.__class__(*sorted_vals)
|
|
194
|
+
|
|
165
195
|
|
|
166
196
|
# @versionadded("5.1.0")
|
|
167
197
|
class MethodNPropertyResult(dict[str, MethodNPropertyList]):
|
absfuyu/dxt/listext.py
CHANGED
|
@@ -18,11 +18,12 @@ import operator
|
|
|
18
18
|
import random
|
|
19
19
|
from collections import Counter
|
|
20
20
|
from collections.abc import Callable, Iterable
|
|
21
|
-
from itertools import accumulate, chain, groupby
|
|
21
|
+
from itertools import accumulate, chain, groupby, zip_longest
|
|
22
22
|
from typing import Any, Literal, Self, cast, overload
|
|
23
23
|
|
|
24
24
|
from absfuyu.core.baseclass import ShowAllMethodsMixin
|
|
25
25
|
from absfuyu.core.docstring import deprecated, versionadded, versionchanged
|
|
26
|
+
from absfuyu.typings import T as _T
|
|
26
27
|
from absfuyu.util import set_min_max
|
|
27
28
|
|
|
28
29
|
|
|
@@ -354,6 +355,40 @@ class ListExt(ShowAllMethodsMixin, list):
|
|
|
354
355
|
start = max(start, 0)
|
|
355
356
|
return self.__class__(enumerate(self, start=start))
|
|
356
357
|
|
|
358
|
+
@versionadded("5.3.0") # no test case yet
|
|
359
|
+
def transpose(self, fillvalue: _T | None = None, /) -> Self:
|
|
360
|
+
"""
|
|
361
|
+
Transpose a list of iterable.
|
|
362
|
+
|
|
363
|
+
Parameters
|
|
364
|
+
----------
|
|
365
|
+
fillvalue : Any, optional
|
|
366
|
+
A fill value, by default ``None``
|
|
367
|
+
|
|
368
|
+
Returns
|
|
369
|
+
-------
|
|
370
|
+
Self | list[list[T]]
|
|
371
|
+
Transposed list.
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
Example:
|
|
375
|
+
--------
|
|
376
|
+
>>> ListExt([1, 1, 1, 1]).transpose()
|
|
377
|
+
[(1, 1, 1, 1)]
|
|
378
|
+
|
|
379
|
+
>>> ListExt([[1, 1, 1, 1], [1, 1, 1, 1]]).transpose()
|
|
380
|
+
[(1, 1), (1, 1), (1, 1), (1, 1)]
|
|
381
|
+
|
|
382
|
+
>>> ListExt([[1, 1, 1, 1], [1, 1, 1, 1], [1]]).transpose()
|
|
383
|
+
[(1, 1, 1), (1, 1, None), (1, 1, None), (1, 1, None)]
|
|
384
|
+
"""
|
|
385
|
+
try:
|
|
386
|
+
return self.__class__(zip_longest(*self, fillvalue=fillvalue)).apply(list)
|
|
387
|
+
except TypeError: # Dimension of 1
|
|
388
|
+
mod_dat = self.apply(lambda x: [x])
|
|
389
|
+
# return self.__class__(zip_longest(*mod_dat, fillvalue=fillvalue)).apply(list)
|
|
390
|
+
return mod_dat
|
|
391
|
+
|
|
357
392
|
# Random
|
|
358
393
|
def pick_one(self) -> Any:
|
|
359
394
|
"""
|
|
@@ -620,7 +655,7 @@ class ListExt(ShowAllMethodsMixin, list):
|
|
|
620
655
|
return self.__class__(data[i1:i2] for i1, i2 in zip([0] + points[:-1], points))
|
|
621
656
|
|
|
622
657
|
@versionadded("5.1.0")
|
|
623
|
-
def split_chunk(self, chunk_size: int) -> Self:
|
|
658
|
+
def split_chunk(self, chunk_size: int, /) -> Self:
|
|
624
659
|
"""
|
|
625
660
|
Split list into smaller chunks
|
|
626
661
|
|
|
@@ -643,8 +678,75 @@ class ListExt(ShowAllMethodsMixin, list):
|
|
|
643
678
|
slice_points = list(range(0, len(self), max(chunk_size, 1)))[1:]
|
|
644
679
|
return self.slice_points(slice_points)
|
|
645
680
|
|
|
681
|
+
@versionadded("5.3.0") # no test case yet
|
|
682
|
+
def to_column(self, ncols: int, fillvalue: _T | None = None) -> Self:
|
|
683
|
+
"""
|
|
684
|
+
Smart convert 1 dimension list to 2 dimension list,
|
|
685
|
+
in which, number of columns = ``ncols``.
|
|
686
|
+
|
|
687
|
+
Parameters
|
|
688
|
+
----------
|
|
689
|
+
ncols : int
|
|
690
|
+
Number of columns
|
|
691
|
+
|
|
692
|
+
fillvalue : T | None, optional
|
|
693
|
+
Fill value, by default ``None``
|
|
694
|
+
|
|
695
|
+
Returns
|
|
696
|
+
-------
|
|
697
|
+
Self
|
|
698
|
+
Coulumned list.
|
|
699
|
+
|
|
700
|
+
|
|
701
|
+
Example:
|
|
702
|
+
--------
|
|
703
|
+
>>> ins = ListExt(range(1,20))
|
|
704
|
+
|
|
705
|
+
>>> # Normal split chunk
|
|
706
|
+
>>> ins.split_chunk(10)
|
|
707
|
+
[
|
|
708
|
+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
|
709
|
+
[11, 12, 13, 14, 15, 16, 17, 18, 19]
|
|
710
|
+
]
|
|
711
|
+
|
|
712
|
+
>>> # Column split chunk
|
|
713
|
+
>>> ins.to_column(10)
|
|
714
|
+
[
|
|
715
|
+
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
|
|
716
|
+
[2, 4, 6, 8, 10, 12, 14, 16, 18, None]
|
|
717
|
+
]
|
|
718
|
+
"""
|
|
719
|
+
num_of_col = max(ncols, 1)
|
|
720
|
+
len_cols = len(self.split_chunk(num_of_col))
|
|
721
|
+
return self.split_chunk(len_cols).transpose(fillvalue)
|
|
722
|
+
|
|
723
|
+
@overload
|
|
724
|
+
def wrap_to_column(self, width: int, /) -> Self: ...
|
|
725
|
+
|
|
726
|
+
@overload
|
|
727
|
+
def wrap_to_column(
|
|
728
|
+
self,
|
|
729
|
+
width: int,
|
|
730
|
+
/,
|
|
731
|
+
*,
|
|
732
|
+
margin: int = 4,
|
|
733
|
+
sep: str = "",
|
|
734
|
+
fill: str = " ",
|
|
735
|
+
transpose: bool = False,
|
|
736
|
+
) -> Self: ...
|
|
737
|
+
|
|
738
|
+
@versionchanged("5.3.0", reason="New `sep`, `fill`, `transpose` parameters")
|
|
646
739
|
@versionadded("5.2.0") # no test case yet
|
|
647
|
-
def wrap_to_column(
|
|
740
|
+
def wrap_to_column(
|
|
741
|
+
self,
|
|
742
|
+
width: int,
|
|
743
|
+
/,
|
|
744
|
+
*,
|
|
745
|
+
margin: int = 4,
|
|
746
|
+
sep: str = "",
|
|
747
|
+
fill: str = " ",
|
|
748
|
+
transpose: bool = False,
|
|
749
|
+
) -> Self:
|
|
648
750
|
"""
|
|
649
751
|
Arrange list[str] items into aligned text columns (for printing)
|
|
650
752
|
with automatic column count calculation.
|
|
@@ -655,7 +757,16 @@ class ListExt(ShowAllMethodsMixin, list):
|
|
|
655
757
|
Total available display width (must be >= ``margin``)
|
|
656
758
|
|
|
657
759
|
margin : int, optional
|
|
658
|
-
Reserved space for borders/padding, by default ``4``
|
|
760
|
+
Reserved space for borders/padding, should be an even number, by default ``4``
|
|
761
|
+
|
|
762
|
+
sep : str, optional
|
|
763
|
+
Separator between each element, by default ``""``
|
|
764
|
+
|
|
765
|
+
fill : str, optional
|
|
766
|
+
Fill character for spacing, must have the length of 1, by default ``" "``
|
|
767
|
+
|
|
768
|
+
transpose : bool, optional
|
|
769
|
+
Smart transpose the columns, by default ``False``
|
|
659
770
|
|
|
660
771
|
Returns
|
|
661
772
|
-------
|
|
@@ -673,8 +784,10 @@ class ListExt(ShowAllMethodsMixin, list):
|
|
|
673
784
|
['apple ', 'banana ', 'cherry ', 'date ']
|
|
674
785
|
"""
|
|
675
786
|
|
|
676
|
-
max_item_length = self.max_item_len() +
|
|
677
|
-
available_width = max(width, 4) - max(margin,
|
|
787
|
+
max_item_length = self.max_item_len() + max(len(sep), 1)
|
|
788
|
+
available_width = max(width, 4) - max(margin, 0) # Set boundary
|
|
789
|
+
if len(fill) != 1:
|
|
790
|
+
fill = " "
|
|
678
791
|
|
|
679
792
|
# Calculate how many columns of text
|
|
680
793
|
column_count = (
|
|
@@ -688,8 +801,11 @@ class ListExt(ShowAllMethodsMixin, list):
|
|
|
688
801
|
|
|
689
802
|
def mod_item(item: list[str]) -> str:
|
|
690
803
|
# Set width for str item and join them together
|
|
691
|
-
return
|
|
804
|
+
return sep.join(x.ljust(max_item_length, fill) for x in item)
|
|
692
805
|
|
|
693
|
-
|
|
806
|
+
if transpose:
|
|
807
|
+
mod_chunk = self.to_column(column_count, fillvalue="").apply(mod_item)
|
|
808
|
+
else:
|
|
809
|
+
mod_chunk = self.split_chunk(column_count).apply(mod_item)
|
|
694
810
|
|
|
695
811
|
return mod_chunk
|
absfuyu/extra/da/dadf.py
CHANGED
|
@@ -1136,6 +1136,7 @@ class DADF_WIP(DADF):
|
|
|
1136
1136
|
W.I.P - No test cases written
|
|
1137
1137
|
"""
|
|
1138
1138
|
|
|
1139
|
+
@versionadded("5.2.0")
|
|
1139
1140
|
def split_str_column(
|
|
1140
1141
|
self,
|
|
1141
1142
|
col: str,
|
|
@@ -1165,6 +1166,18 @@ class DADF_WIP(DADF):
|
|
|
1165
1166
|
-------
|
|
1166
1167
|
Self
|
|
1167
1168
|
DataFrame
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
Example:
|
|
1172
|
+
--------
|
|
1173
|
+
>>> df = DADF(DADF.sample_df(5)[["text"]])
|
|
1174
|
+
>>> df.split_str_column("text", "s"))
|
|
1175
|
+
text text_0 text_1
|
|
1176
|
+
0 uwfzbsgj uwfzb gj
|
|
1177
|
+
1 lxlskayx lxl kayx
|
|
1178
|
+
2 fzgpzjtp fzgpzjtp None
|
|
1179
|
+
3 lxnytktz lxnytktz None
|
|
1180
|
+
4 onryaxtt onryaxtt None
|
|
1168
1181
|
"""
|
|
1169
1182
|
if n is None:
|
|
1170
1183
|
pass
|
absfuyu/tools/__init__.py
CHANGED
|
@@ -12,7 +12,7 @@ Date updated: 16/03/2025 (dd/mm/yyyy)
|
|
|
12
12
|
__all__ = [
|
|
13
13
|
# # Main
|
|
14
14
|
"Checksum",
|
|
15
|
-
"
|
|
15
|
+
"B64",
|
|
16
16
|
"T2C",
|
|
17
17
|
# "Charset",
|
|
18
18
|
# "Generator",
|
|
@@ -26,7 +26,7 @@ __all__ = [
|
|
|
26
26
|
# Library
|
|
27
27
|
# ---------------------------------------------------------------------------
|
|
28
28
|
from absfuyu.tools.checksum import Checksum
|
|
29
|
-
from absfuyu.tools.converter import Base64EncodeDecode as
|
|
29
|
+
from absfuyu.tools.converter import Base64EncodeDecode as B64
|
|
30
30
|
from absfuyu.tools.converter import Text2Chemistry as T2C
|
|
31
31
|
from absfuyu.tools.inspector import Inspector, inspect_all
|
|
32
32
|
|
absfuyu/tools/inspector.py
CHANGED
|
@@ -71,6 +71,9 @@ class Inspector(AutoREPRMixin):
|
|
|
71
71
|
Maximum lines for the output's header (class, signature, repr).
|
|
72
72
|
Must be >= 1, by default ``8``
|
|
73
73
|
|
|
74
|
+
style : Literal["normal", "bold", "dashed", "double", "rounded"], optional
|
|
75
|
+
Style for the table, by default ``"normal"``
|
|
76
|
+
|
|
74
77
|
|
|
75
78
|
Example:
|
|
76
79
|
--------
|
|
@@ -96,6 +99,7 @@ class Inspector(AutoREPRMixin):
|
|
|
96
99
|
include_attribute: bool = True,
|
|
97
100
|
include_private: bool = False,
|
|
98
101
|
max_textwrap_lines: int = 8,
|
|
102
|
+
style: Literal["normal", "bold", "dashed", "double", "rounded"] = "normal",
|
|
99
103
|
) -> None: ...
|
|
100
104
|
|
|
101
105
|
def __init__(
|
|
@@ -114,6 +118,8 @@ class Inspector(AutoREPRMixin):
|
|
|
114
118
|
include_attribute: bool = True,
|
|
115
119
|
include_private: bool = False,
|
|
116
120
|
include_all: bool = False,
|
|
121
|
+
# Style
|
|
122
|
+
style: Literal["normal", "bold", "dashed", "double", "rounded"] = "normal",
|
|
117
123
|
) -> None:
|
|
118
124
|
"""
|
|
119
125
|
Inspect an object.
|
|
@@ -153,6 +159,9 @@ class Inspector(AutoREPRMixin):
|
|
|
153
159
|
Maximum lines for the output's header (class, signature, repr).
|
|
154
160
|
Must be >= 1, by default ``8``
|
|
155
161
|
|
|
162
|
+
style : Literal["normal", "bold", "dashed", "double", "rounded"], optional
|
|
163
|
+
Style for the table, by default ``"normal"``
|
|
164
|
+
|
|
156
165
|
|
|
157
166
|
Example:
|
|
158
167
|
--------
|
|
@@ -165,6 +174,7 @@ class Inspector(AutoREPRMixin):
|
|
|
165
174
|
self.include_property = include_property
|
|
166
175
|
self.include_attribute = include_attribute
|
|
167
176
|
self.include_private = include_private
|
|
177
|
+
self._style = style
|
|
168
178
|
|
|
169
179
|
if include_all:
|
|
170
180
|
self.include_docs = True
|
|
@@ -203,7 +213,9 @@ class Inspector(AutoREPRMixin):
|
|
|
203
213
|
|
|
204
214
|
# Support
|
|
205
215
|
def _long_list_terminal_size(self, long_list: list) -> list:
|
|
206
|
-
ll = ListExt(long_list).wrap_to_column(
|
|
216
|
+
ll = ListExt(long_list).wrap_to_column(
|
|
217
|
+
self._linelength, margin=4, transpose=True
|
|
218
|
+
)
|
|
207
219
|
return list(ll)
|
|
208
220
|
|
|
209
221
|
# Signature
|
|
@@ -392,7 +404,7 @@ class Inspector(AutoREPRMixin):
|
|
|
392
404
|
|
|
393
405
|
# Output
|
|
394
406
|
def _make_output(self) -> OneColumnTableMaker:
|
|
395
|
-
table = OneColumnTableMaker(self._linelength)
|
|
407
|
+
table = OneColumnTableMaker(self._linelength, style=self._style)
|
|
396
408
|
body: list[str] = []
|
|
397
409
|
|
|
398
410
|
# Signature
|
|
@@ -419,7 +431,9 @@ class Inspector(AutoREPRMixin):
|
|
|
419
431
|
|
|
420
432
|
# Method & Property
|
|
421
433
|
try:
|
|
422
|
-
method_n_properties =
|
|
434
|
+
method_n_properties = (
|
|
435
|
+
self._get_method_property().flatten_value().pack().sort()
|
|
436
|
+
)
|
|
423
437
|
if self.include_method:
|
|
424
438
|
ml = [
|
|
425
439
|
text_shorten(f"- {x}", self._linelength - 4)
|
absfuyu/util/path.py
CHANGED
|
@@ -46,6 +46,128 @@ from absfuyu.core.decorator import add_subclass_methods_decorator
|
|
|
46
46
|
from absfuyu.core.docstring import deprecated, versionadded, versionchanged
|
|
47
47
|
from absfuyu.logger import logger
|
|
48
48
|
|
|
49
|
+
# Template
|
|
50
|
+
# ---------------------------------------------------------------------------
|
|
51
|
+
ORGANIZE_TEMPLATE: dict[str, list[str]] = {
|
|
52
|
+
"Code": [".ps1", ".py", ".rs", ".js", ".c", ".h", ".cpp", ".r", ".cmd", ".bat"],
|
|
53
|
+
"Comic": [".cbz", ".cbr", ".cb7", ".cbt", ".cba"],
|
|
54
|
+
"Compressed": [
|
|
55
|
+
".7z",
|
|
56
|
+
".zip",
|
|
57
|
+
".rar",
|
|
58
|
+
".apk",
|
|
59
|
+
".cab",
|
|
60
|
+
".tar",
|
|
61
|
+
".tgz",
|
|
62
|
+
".txz",
|
|
63
|
+
".bz2",
|
|
64
|
+
".gz",
|
|
65
|
+
".lz",
|
|
66
|
+
".lz4",
|
|
67
|
+
".lzma",
|
|
68
|
+
".xz",
|
|
69
|
+
".zipx",
|
|
70
|
+
".zst",
|
|
71
|
+
],
|
|
72
|
+
"Documents": [".docx", ".doc", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt"],
|
|
73
|
+
"Ebook": [
|
|
74
|
+
".epub",
|
|
75
|
+
".mobi",
|
|
76
|
+
".prc",
|
|
77
|
+
".lrf",
|
|
78
|
+
".lrx",
|
|
79
|
+
".pdb",
|
|
80
|
+
".azw",
|
|
81
|
+
".azw3",
|
|
82
|
+
".kf8",
|
|
83
|
+
".kfx",
|
|
84
|
+
".opf",
|
|
85
|
+
],
|
|
86
|
+
"Music": [".mp3", ".flac", ".wav", ".m4a", ".wma", ".aac", ".alac", ".aiff"],
|
|
87
|
+
"OS": [".iso", ".dmg", ".wim"],
|
|
88
|
+
"Pictures": [
|
|
89
|
+
".jpg",
|
|
90
|
+
".jpeg",
|
|
91
|
+
".png",
|
|
92
|
+
".apng",
|
|
93
|
+
".avif",
|
|
94
|
+
".bmp",
|
|
95
|
+
".gif",
|
|
96
|
+
".jfif",
|
|
97
|
+
".pjpeg",
|
|
98
|
+
".pjp",
|
|
99
|
+
".svg",
|
|
100
|
+
".ico",
|
|
101
|
+
".cur",
|
|
102
|
+
".tif",
|
|
103
|
+
".tiff",
|
|
104
|
+
".webp",
|
|
105
|
+
],
|
|
106
|
+
"Programs": [".exe", ".msi"],
|
|
107
|
+
"Video": [
|
|
108
|
+
".3g2",
|
|
109
|
+
".3gp",
|
|
110
|
+
".avi",
|
|
111
|
+
".flv",
|
|
112
|
+
".m2ts",
|
|
113
|
+
".m4v",
|
|
114
|
+
".mkv",
|
|
115
|
+
".mov",
|
|
116
|
+
".mp4",
|
|
117
|
+
".mpeg",
|
|
118
|
+
".mpv",
|
|
119
|
+
".mts",
|
|
120
|
+
".ts",
|
|
121
|
+
".vob",
|
|
122
|
+
".webm",
|
|
123
|
+
],
|
|
124
|
+
"Raw pictures": [
|
|
125
|
+
".3fr",
|
|
126
|
+
".ari",
|
|
127
|
+
".arw",
|
|
128
|
+
".bay",
|
|
129
|
+
".braw",
|
|
130
|
+
".crw",
|
|
131
|
+
".cr2",
|
|
132
|
+
".cr3",
|
|
133
|
+
".cap",
|
|
134
|
+
".data",
|
|
135
|
+
".dcs",
|
|
136
|
+
".dcr",
|
|
137
|
+
".dng",
|
|
138
|
+
".drf",
|
|
139
|
+
".eip",
|
|
140
|
+
".erf",
|
|
141
|
+
".fff",
|
|
142
|
+
".gpr",
|
|
143
|
+
".iiq",
|
|
144
|
+
".k25",
|
|
145
|
+
".kdc",
|
|
146
|
+
".mdc",
|
|
147
|
+
".mef",
|
|
148
|
+
".mos",
|
|
149
|
+
".mrw",
|
|
150
|
+
".nef",
|
|
151
|
+
".nrw",
|
|
152
|
+
".obm",
|
|
153
|
+
".orf",
|
|
154
|
+
".pef",
|
|
155
|
+
".ptx",
|
|
156
|
+
".pxn",
|
|
157
|
+
".r3d",
|
|
158
|
+
".raf",
|
|
159
|
+
".raw",
|
|
160
|
+
".rwl",
|
|
161
|
+
".rw2",
|
|
162
|
+
".rwz",
|
|
163
|
+
".sr2",
|
|
164
|
+
".srf",
|
|
165
|
+
".srw",
|
|
166
|
+
".tif",
|
|
167
|
+
".x3f",
|
|
168
|
+
],
|
|
169
|
+
}
|
|
170
|
+
|
|
49
171
|
|
|
50
172
|
# Support Class
|
|
51
173
|
# ---------------------------------------------------------------------------
|
|
@@ -444,10 +566,42 @@ class DirectoryArchiverMixin(DirectoryBase):
|
|
|
444
566
|
|
|
445
567
|
class DirectoryOrganizerMixin(DirectoryBase):
|
|
446
568
|
"""
|
|
447
|
-
Directory - File organizer
|
|
569
|
+
Directory - File organizer
|
|
570
|
+
|
|
571
|
+
- Organize
|
|
448
572
|
"""
|
|
449
573
|
|
|
450
|
-
|
|
574
|
+
@versionadded("5.3.0")
|
|
575
|
+
def organize(self, dirtemplate: dict[str, list[str]] | None = None) -> None:
|
|
576
|
+
"""
|
|
577
|
+
Organize a directory.
|
|
578
|
+
|
|
579
|
+
Parameters
|
|
580
|
+
----------
|
|
581
|
+
dirtemplate : dict[str, Collection[str]] | None, optional
|
|
582
|
+
| Template to move file to, by default ``None``.
|
|
583
|
+
| Example: {"Documents": [".txt", ".pdf", ...]}
|
|
584
|
+
"""
|
|
585
|
+
if dirtemplate is None:
|
|
586
|
+
template = ORGANIZE_TEMPLATE
|
|
587
|
+
else:
|
|
588
|
+
template = dirtemplate
|
|
589
|
+
|
|
590
|
+
other_dir = self.source_path.joinpath("Others")
|
|
591
|
+
other_dir.mkdir(parents=True, exist_ok=True)
|
|
592
|
+
|
|
593
|
+
for path in self.source_path.iterdir():
|
|
594
|
+
if path.is_dir():
|
|
595
|
+
continue
|
|
596
|
+
|
|
597
|
+
for dir_name, suffixes in template.items():
|
|
598
|
+
if path.suffix.lower() in suffixes:
|
|
599
|
+
move_path = self.source_path.joinpath(dir_name)
|
|
600
|
+
move_path.mkdir(parents=True, exist_ok=True)
|
|
601
|
+
path.rename(move_path.joinpath(path.name))
|
|
602
|
+
break
|
|
603
|
+
else:
|
|
604
|
+
path.rename(other_dir.joinpath(path.name))
|
|
451
605
|
|
|
452
606
|
|
|
453
607
|
class DirectoryTreeMixin(DirectoryBase):
|
absfuyu/util/text_table.py
CHANGED
|
@@ -16,32 +16,17 @@ __all__ = ["OneColumnTableMaker"]
|
|
|
16
16
|
# ---------------------------------------------------------------------------
|
|
17
17
|
import os
|
|
18
18
|
from collections.abc import Sequence
|
|
19
|
-
from enum import StrEnum
|
|
20
19
|
from textwrap import TextWrapper
|
|
21
|
-
from typing import Literal
|
|
20
|
+
from typing import Literal
|
|
22
21
|
|
|
23
22
|
from absfuyu.core import BaseClass
|
|
24
23
|
|
|
25
24
|
|
|
26
25
|
# Style
|
|
27
26
|
# ---------------------------------------------------------------------------
|
|
28
|
-
class
|
|
29
|
-
UPPER_LEFT_CORNER: str = ""
|
|
30
|
-
UPPER_RIGHT_CORNER: str = ""
|
|
31
|
-
HORIZONTAL: str = ""
|
|
32
|
-
VERTICAL: str = ""
|
|
33
|
-
LOWER_LEFT_CORNER: str = ""
|
|
34
|
-
LOWER_RIGHT_CORNER: str = ""
|
|
35
|
-
VERTICAL_RIGHT: str = ""
|
|
36
|
-
VERTICAL_LEFT: str = ""
|
|
37
|
-
CROSS: str = ""
|
|
38
|
-
HORIZONTAL_UP: str = ""
|
|
39
|
-
HORIZONTAL_DOWN: str = ""
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class BoxDrawingCharacterNormal(StrEnum):
|
|
27
|
+
class BoxDrawingCharacterBase:
|
|
43
28
|
"""
|
|
44
|
-
Box drawing characters - Normal
|
|
29
|
+
Box drawing characters - Base/Normal characters
|
|
45
30
|
|
|
46
31
|
Characters reference: https://en.wikipedia.org/wiki/Box-drawing_characters
|
|
47
32
|
"""
|
|
@@ -59,12 +44,61 @@ class BoxDrawingCharacterNormal(StrEnum):
|
|
|
59
44
|
HORIZONTAL_DOWN = "\u252c"
|
|
60
45
|
|
|
61
46
|
|
|
62
|
-
class
|
|
63
|
-
"""
|
|
64
|
-
|
|
47
|
+
class BoxDrawingCharacterNormal(BoxDrawingCharacterBase):
|
|
48
|
+
"""Normal"""
|
|
49
|
+
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class BoxDrawingCharacterDashed(BoxDrawingCharacterNormal):
|
|
54
|
+
"""Dashed"""
|
|
55
|
+
|
|
56
|
+
HORIZONTAL = "\u254c"
|
|
57
|
+
VERTICAL = "\u254e"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class BoxDrawingCharacterDashed3(BoxDrawingCharacterNormal):
|
|
61
|
+
"""Triple dashed"""
|
|
62
|
+
|
|
63
|
+
HORIZONTAL = "\u2504"
|
|
64
|
+
VERTICAL = "\u2506"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class BoxDrawingCharacterDashed4(BoxDrawingCharacterNormal):
|
|
68
|
+
"""Quadruple dashed"""
|
|
69
|
+
|
|
70
|
+
HORIZONTAL = "\u2508"
|
|
71
|
+
VERTICAL = "\u250a"
|
|
65
72
|
|
|
66
|
-
|
|
67
|
-
|
|
73
|
+
|
|
74
|
+
class BoxDrawingCharacterRounded(BoxDrawingCharacterNormal):
|
|
75
|
+
"""Rounded"""
|
|
76
|
+
|
|
77
|
+
UPPER_LEFT_CORNER = "\u256d"
|
|
78
|
+
UPPER_RIGHT_CORNER = "\u256e"
|
|
79
|
+
LOWER_LEFT_CORNER = "\u2570"
|
|
80
|
+
LOWER_RIGHT_CORNER = "\u256f"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class BoxDrawingCharacterDiamond(BoxDrawingCharacterNormal):
|
|
84
|
+
"""Diamond"""
|
|
85
|
+
|
|
86
|
+
UPPER_LEFT_CORNER = "\u2571"
|
|
87
|
+
UPPER_RIGHT_CORNER = "\u2572"
|
|
88
|
+
LOWER_LEFT_CORNER = "\u2572"
|
|
89
|
+
LOWER_RIGHT_CORNER = "\u2571"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class BoxDrawingCharacterDashedRound(
|
|
93
|
+
BoxDrawingCharacterDashed, BoxDrawingCharacterRounded
|
|
94
|
+
):
|
|
95
|
+
"""Dashed rounded"""
|
|
96
|
+
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class BoxDrawingCharacterBold(BoxDrawingCharacterBase):
|
|
101
|
+
"""Bold"""
|
|
68
102
|
|
|
69
103
|
UPPER_LEFT_CORNER = "\u250f"
|
|
70
104
|
UPPER_RIGHT_CORNER = "\u2513"
|
|
@@ -79,32 +113,15 @@ class BoxDrawingCharacterBold(StrEnum):
|
|
|
79
113
|
HORIZONTAL_DOWN = "\u2533"
|
|
80
114
|
|
|
81
115
|
|
|
82
|
-
class
|
|
83
|
-
"""
|
|
84
|
-
Box drawing characters - Dashed
|
|
85
|
-
|
|
86
|
-
Characters reference: https://en.wikipedia.org/wiki/Box-drawing_characters
|
|
87
|
-
"""
|
|
88
|
-
|
|
89
|
-
UPPER_LEFT_CORNER = "\u250c"
|
|
90
|
-
UPPER_RIGHT_CORNER = "\u2510"
|
|
91
|
-
HORIZONTAL = "\u254c"
|
|
92
|
-
VERTICAL = "\u254e"
|
|
93
|
-
LOWER_LEFT_CORNER = "\u2514"
|
|
94
|
-
LOWER_RIGHT_CORNER = "\u2518"
|
|
95
|
-
VERTICAL_RIGHT = "\u251c"
|
|
96
|
-
VERTICAL_LEFT = "\u2524"
|
|
97
|
-
CROSS = "\u253c"
|
|
98
|
-
HORIZONTAL_UP = "\u2534"
|
|
99
|
-
HORIZONTAL_DOWN = "\u252c"
|
|
116
|
+
class BoxDrawingCharacterDashedBold(BoxDrawingCharacterBold):
|
|
117
|
+
"""Dashed bold"""
|
|
100
118
|
|
|
119
|
+
HORIZONTAL = "\u254d"
|
|
120
|
+
VERTICAL = "\u254f"
|
|
101
121
|
|
|
102
|
-
class BoxDrawingCharacterDouble(StrEnum):
|
|
103
|
-
"""
|
|
104
|
-
Box drawing characters - Double
|
|
105
122
|
|
|
106
|
-
|
|
107
|
-
"""
|
|
123
|
+
class BoxDrawingCharacterDouble(BoxDrawingCharacterBase):
|
|
124
|
+
"""Double"""
|
|
108
125
|
|
|
109
126
|
UPPER_LEFT_CORNER = "\u2554"
|
|
110
127
|
UPPER_RIGHT_CORNER = "\u2557"
|
|
@@ -120,15 +137,16 @@ class BoxDrawingCharacterDouble(StrEnum):
|
|
|
120
137
|
|
|
121
138
|
|
|
122
139
|
def get_box_drawing_character(
|
|
123
|
-
style: Literal["normal", "bold", "dashed", "double"] = "normal",
|
|
124
|
-
) ->
|
|
140
|
+
style: Literal["normal", "bold", "dashed", "double", "rounded"] | str = "normal",
|
|
141
|
+
) -> type[BoxDrawingCharacterBase]:
|
|
125
142
|
"""
|
|
126
143
|
Choose style for Box drawing characters.
|
|
127
144
|
|
|
128
145
|
Parameters
|
|
129
146
|
----------
|
|
130
|
-
style : Literal["normal", "bold", "dashed", "double"], optional
|
|
131
|
-
Style for the table, by default ``"normal"
|
|
147
|
+
style : Literal["normal", "bold", "dashed", "double", "rounded"] | str, optional
|
|
148
|
+
Style for the table, by default ``"normal"``.
|
|
149
|
+
Extra style: ``drounded``, ``diamond``, ``dbold``, ``dashed3``, ``dashed4``
|
|
132
150
|
|
|
133
151
|
Returns
|
|
134
152
|
-------
|
|
@@ -136,16 +154,29 @@ def get_box_drawing_character(
|
|
|
136
154
|
Box drawing characters in specified style.
|
|
137
155
|
"""
|
|
138
156
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
157
|
+
match style.lower().strip():
|
|
158
|
+
case "normal":
|
|
159
|
+
return BoxDrawingCharacterNormal
|
|
160
|
+
case "bold":
|
|
161
|
+
return BoxDrawingCharacterBold
|
|
162
|
+
case "dashed":
|
|
163
|
+
return BoxDrawingCharacterDashed
|
|
164
|
+
case "dashed3":
|
|
165
|
+
return BoxDrawingCharacterDashed3
|
|
166
|
+
case "dashed4":
|
|
167
|
+
return BoxDrawingCharacterDashed4
|
|
168
|
+
case "double":
|
|
169
|
+
return BoxDrawingCharacterDouble
|
|
170
|
+
case "rounded":
|
|
171
|
+
return BoxDrawingCharacterRounded
|
|
172
|
+
case "drounded":
|
|
173
|
+
return BoxDrawingCharacterDashedRound
|
|
174
|
+
case "diamond":
|
|
175
|
+
return BoxDrawingCharacterDiamond
|
|
176
|
+
case "dbold":
|
|
177
|
+
return BoxDrawingCharacterDashedBold
|
|
178
|
+
case _:
|
|
179
|
+
return BoxDrawingCharacterNormal
|
|
149
180
|
|
|
150
181
|
|
|
151
182
|
# Class
|
|
@@ -171,7 +202,7 @@ class OneColumnTableMaker(BaseClass):
|
|
|
171
202
|
def __init__(
|
|
172
203
|
self,
|
|
173
204
|
ncols: int | None = None,
|
|
174
|
-
style: Literal["normal", "bold", "dashed", "double"] = "normal",
|
|
205
|
+
style: Literal["normal", "bold", "dashed", "double", "rounded"] = "normal",
|
|
175
206
|
) -> None:
|
|
176
207
|
"""
|
|
177
208
|
Table Maker instance
|
|
@@ -184,7 +215,7 @@ class OneColumnTableMaker(BaseClass):
|
|
|
184
215
|
defaults to ``88`` when failed to use ``os.get_terminal_size()``.
|
|
185
216
|
By default ``None``
|
|
186
217
|
|
|
187
|
-
style : Literal["normal", "bold", "dashed", "double"], optional
|
|
218
|
+
style : Literal["normal", "bold", "dashed", "double", "rounded"], optional
|
|
188
219
|
Style for the table, by default ``"normal"``
|
|
189
220
|
"""
|
|
190
221
|
|
|
@@ -304,3 +335,128 @@ class OneColumnTableMaker(BaseClass):
|
|
|
304
335
|
if table is None:
|
|
305
336
|
return ""
|
|
306
337
|
return "\n".join(table)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
# W.I.P
|
|
341
|
+
# ---------------------------------------------------------------------------
|
|
342
|
+
class _BoxDrawingCharacterFactory:
|
|
343
|
+
_TRANSLATE: dict[str, str] = {
|
|
344
|
+
"n": "normal",
|
|
345
|
+
"d": "dashed",
|
|
346
|
+
"b": "bold",
|
|
347
|
+
"r": "rounded",
|
|
348
|
+
"x": "double",
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
UPPER_LEFT_CORNER: list[tuple[str, str]] = [
|
|
352
|
+
("\u250c", "n,d"),
|
|
353
|
+
("\u256d", "r"),
|
|
354
|
+
("\u250f", "b"),
|
|
355
|
+
("\u2554", "x"),
|
|
356
|
+
]
|
|
357
|
+
UPPER_RIGHT_CORNER: list[tuple[str, str]] = [
|
|
358
|
+
("\u2510", "n,d"),
|
|
359
|
+
("\u256e", "r"),
|
|
360
|
+
("\u2513", "b"),
|
|
361
|
+
("\u2557", "x"),
|
|
362
|
+
]
|
|
363
|
+
HORIZONTAL: list[tuple[str, str]] = [
|
|
364
|
+
("\u2500", "n,r"),
|
|
365
|
+
("\u254c", "d"),
|
|
366
|
+
("\u2501", "b"),
|
|
367
|
+
("\u2550", "x"),
|
|
368
|
+
]
|
|
369
|
+
VERTICAL: list[tuple[str, str]] = [
|
|
370
|
+
("\u2502", "n,r"),
|
|
371
|
+
("\u254e", "d"),
|
|
372
|
+
("\u2503", "b"),
|
|
373
|
+
("\u2551", "x"),
|
|
374
|
+
]
|
|
375
|
+
LOWER_LEFT_CORNER: list[tuple[str, str]] = [
|
|
376
|
+
("\u2514", "n,d"),
|
|
377
|
+
("\u2570", "r"),
|
|
378
|
+
("\u2517", "b"),
|
|
379
|
+
("\u255a", "x"),
|
|
380
|
+
]
|
|
381
|
+
LOWER_RIGHT_CORNER: list[tuple[str, str]] = [
|
|
382
|
+
("\u2518", "n,d"),
|
|
383
|
+
("\u256f", "r"),
|
|
384
|
+
("\u251b", "b"),
|
|
385
|
+
("\u255d", "x"),
|
|
386
|
+
]
|
|
387
|
+
VERTICAL_RIGHT: list[tuple[str, str]] = [
|
|
388
|
+
("\u251c", "n,d,r"),
|
|
389
|
+
("\u2523", "b"),
|
|
390
|
+
("\u2560", "x"),
|
|
391
|
+
]
|
|
392
|
+
VERTICAL_LEFT: list[tuple[str, str]] = [
|
|
393
|
+
("\u2524", "n,d,r"),
|
|
394
|
+
("\u252b", "b"),
|
|
395
|
+
("\u2563", "x"),
|
|
396
|
+
]
|
|
397
|
+
CROSS: list[tuple[str, str]] = [
|
|
398
|
+
("\u253c", "n,d,r"),
|
|
399
|
+
("\u254b", "b"),
|
|
400
|
+
("\u256c", "x"),
|
|
401
|
+
]
|
|
402
|
+
HORIZONTAL_UP: list[tuple[str, str]] = [
|
|
403
|
+
("\u2534", "n,d,r"),
|
|
404
|
+
("\u253b", "b"),
|
|
405
|
+
("\u2569", "x"),
|
|
406
|
+
]
|
|
407
|
+
HORIZONTAL_DOWN: list[tuple[str, str]] = [
|
|
408
|
+
("\u252c", "n,d,r"),
|
|
409
|
+
("\u2533", "b"),
|
|
410
|
+
("\u2566", "x"),
|
|
411
|
+
]
|
|
412
|
+
|
|
413
|
+
_FIELDS: tuple[str, ...] = (
|
|
414
|
+
"UPPER_LEFT_CORNER",
|
|
415
|
+
"UPPER_RIGHT_CORNER",
|
|
416
|
+
"HORIZONTAL",
|
|
417
|
+
"VERTICAL",
|
|
418
|
+
"LOWER_LEFT_CORNER",
|
|
419
|
+
"LOWER_RIGHT_CORNER",
|
|
420
|
+
"VERTICAL_RIGHT",
|
|
421
|
+
"VERTICAL_LEFT",
|
|
422
|
+
"CROSS",
|
|
423
|
+
"HORIZONTAL_UP",
|
|
424
|
+
"HORIZONTAL_DOWN",
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
def __init__(self, style: str | None = None):
|
|
428
|
+
self.style = style
|
|
429
|
+
|
|
430
|
+
@classmethod
|
|
431
|
+
def _make_style(cls) -> dict[str, dict[str, str]]:
|
|
432
|
+
"""
|
|
433
|
+
Creates a style dictionary based on the class attributes.
|
|
434
|
+
|
|
435
|
+
Returns
|
|
436
|
+
-------
|
|
437
|
+
dict[str, dict[str, str]]
|
|
438
|
+
A dictionary mapping group names to style configurations.
|
|
439
|
+
"""
|
|
440
|
+
|
|
441
|
+
# Initialize an empty style dictionary
|
|
442
|
+
style: dict[str, dict[str, str]] = {}
|
|
443
|
+
|
|
444
|
+
# Create a dictionary mapping field names to themselves
|
|
445
|
+
field_map = {field: "" for field in cls._FIELDS}
|
|
446
|
+
|
|
447
|
+
# Initialize style entries for each translation key
|
|
448
|
+
for x in cls._TRANSLATE.keys():
|
|
449
|
+
style[x] = field_map
|
|
450
|
+
|
|
451
|
+
# Extract character data from class fields
|
|
452
|
+
char_data: list[tuple[str, list[tuple[str, str]]]] = [
|
|
453
|
+
(field, getattr(cls, field)) for field in cls._FIELDS
|
|
454
|
+
]
|
|
455
|
+
|
|
456
|
+
# Populate the style dictionary with character mappings
|
|
457
|
+
for name, chars in char_data:
|
|
458
|
+
for char, groups in chars:
|
|
459
|
+
for group in map(str.strip, groups.split(",")):
|
|
460
|
+
style[group][name] = char
|
|
461
|
+
|
|
462
|
+
return style
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
absfuyu/__init__.py,sha256=
|
|
1
|
+
absfuyu/__init__.py,sha256=ZWPuZGswjKjM1ioYK2Mxrf7QY6uzmOScgr3WjqEYzMI,600
|
|
2
2
|
absfuyu/__main__.py,sha256=j6vPe7oFtED_nC__UeSsmoNiE474ErYW-gVpQmRKQ0c,595
|
|
3
3
|
absfuyu/logger.py,sha256=J-O12HYtQzP8Zm_4NtpzBQruAbqxSgsOtH4MKGJJAs8,13043
|
|
4
4
|
absfuyu/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -8,13 +8,13 @@ absfuyu/version.py,sha256=HxRg7XUVfBKVgAebxK9YrPbys_sVTEKqHD1QW4VdEOM,14489
|
|
|
8
8
|
absfuyu/cli/__init__.py,sha256=81GpY_LfmtMBdFdBbkti-YUAdBgzVxRXiXCdM7PgJKM,1181
|
|
9
9
|
absfuyu/cli/color.py,sha256=s64Sq7O_2ICJgWle8msh3tpoirlG8wEVsm7w7tba3eM,1139
|
|
10
10
|
absfuyu/cli/config_group.py,sha256=Y4M7FlXUJcLhTC_Vzul-xW7VQ-CGGi2SiYJiY2NK3DI,1505
|
|
11
|
-
absfuyu/cli/do_group.py,sha256=
|
|
11
|
+
absfuyu/cli/do_group.py,sha256=72Xp6NF-ms5O3BcCmhyOp-ueeVj-gWi8KDRPwwA_qpc,2720
|
|
12
12
|
absfuyu/cli/game_group.py,sha256=L621kuN4ncpFakxB2sofuByivA-ySr1ZFZrur8uXnCA,2623
|
|
13
13
|
absfuyu/cli/tool_group.py,sha256=RV_Fnap66KGm33DgvTZsPHenhbMx9IwYZgvNzVA7cj0,3416
|
|
14
14
|
absfuyu/config/__init__.py,sha256=ZpWb3yuO_9UgmZiDzuvwMXyeJMMMLP8xRrw25fjLpHY,8238
|
|
15
15
|
absfuyu/config/config.json,sha256=-ZQnmDuLq0aAFfsrQbSNR3tq5k9Eu9IVUQgYD9htIQM,646
|
|
16
16
|
absfuyu/core/__init__.py,sha256=PQf_DHqI5zU-TIQbiARfF5mQG4R77FiX-5ySOZfJ9wY,1186
|
|
17
|
-
absfuyu/core/baseclass.py,sha256=
|
|
17
|
+
absfuyu/core/baseclass.py,sha256=r1mf4MdxNnVKQd72LNWCerNGjhDBhJQjv3DoKIeaZVM,23588
|
|
18
18
|
absfuyu/core/baseclass2.py,sha256=NWCeAmS5-coLlq1Q9Y9ouFe1mefA0Q9YRKnhCeBx6yA,5366
|
|
19
19
|
absfuyu/core/decorator.py,sha256=xnzIFMcVfxfm7Den4QnZ4AEaHSdszcHSpWyPABm4YPY,4176
|
|
20
20
|
absfuyu/core/docstring.py,sha256=gAVovS1zVn_H9e-xkNY4xQtEQMf_p3PRpdTfpGqA5_A,5791
|
|
@@ -24,13 +24,13 @@ absfuyu/dxt/__init__.py,sha256=c-KOWD7LNwV6cBRv9RjEP2D6C8lBhx8Q0CtdcXFA0_Q,986
|
|
|
24
24
|
absfuyu/dxt/dictext.py,sha256=Sp4jMPvKLb61nU6g4JJ86dsxIhlc3eZXTsys1oXy41M,6073
|
|
25
25
|
absfuyu/dxt/dxt_support.py,sha256=dB313kVTWRVHGhsA2daNBjmU3xNz6_B72Cn6JbgvvpE,2109
|
|
26
26
|
absfuyu/dxt/intext.py,sha256=9fV9-CsY1mbaH6k3BkLo1nSn99JN1M0m2ES2zQpuXDE,17454
|
|
27
|
-
absfuyu/dxt/listext.py,sha256=
|
|
27
|
+
absfuyu/dxt/listext.py,sha256=fJ8vB6xMYx01ecKS8M7foAKrpoVbrPtmCWGrqSCBUVw,22633
|
|
28
28
|
absfuyu/dxt/strext.py,sha256=ILOtcbF23qWX_relkW8HWNnJCGouIDEh2X5OAXDHNWk,16257
|
|
29
29
|
absfuyu/extra/__init__.py,sha256=w47uEx0KkUfSVuX9_WYM2xVBcfHd93b9YzTlWs8dkwc,182
|
|
30
30
|
absfuyu/extra/beautiful.py,sha256=OjaNY457I7eePklQ8sN6I1b11QrkmIzra8IW-Aj3NlM,8137
|
|
31
31
|
absfuyu/extra/data_analysis.py,sha256=AZA4V-c-ZBe7Zkv1_P6exSyWr5UjHmH5Dv0P1MxVXw8,499
|
|
32
32
|
absfuyu/extra/da/__init__.py,sha256=S-jDX96fQ7s6mFxCNFrkqM4ckQGuEAHdCMN4TgzASkw,913
|
|
33
|
-
absfuyu/extra/da/dadf.py,sha256=
|
|
33
|
+
absfuyu/extra/da/dadf.py,sha256=3p5qUl1VFuhp_KJ1ORLU0EORcPteZE_VbsbCWkmH_n0,39083
|
|
34
34
|
absfuyu/extra/da/dadf_base.py,sha256=IhJiYu4whWjkV6hUBrvHF9kRdXyCO2swwt2_GfvNAu8,5167
|
|
35
35
|
absfuyu/extra/da/df_func.py,sha256=IWVIjQdKc7TGfVK8qmhsikoyWhHhrvd9aM2JH7J6giM,2524
|
|
36
36
|
absfuyu/extra/da/mplt.py,sha256=POoD7a7iUmivzcVUtbhZgFhSFkEMoLgPDhE6Wxn5HWE,6305
|
|
@@ -50,11 +50,11 @@ absfuyu/pkg_data/chemistry.pkl,sha256=kYWNa_PVffoDnzT8b9Jvimmf_GZshPe1D-SnEKERsL
|
|
|
50
50
|
absfuyu/pkg_data/deprecated.py,sha256=FhUFNgjjeaneBU66ImZuzJRKNZJ7OA_qLz2QoDbUn8M,4349
|
|
51
51
|
absfuyu/pkg_data/passwordlib_lzma.pkl,sha256=rT5lJT8t42BATU5Cp2qFwbnZkbx-QlUgodSvR0wFY6I,891877
|
|
52
52
|
absfuyu/pkg_data/tarot.pkl,sha256=ssXTCC_BQgslO5F-3a9HivbxFQ6BioIe2E1frPVi2m0,56195
|
|
53
|
-
absfuyu/tools/__init__.py,sha256=
|
|
53
|
+
absfuyu/tools/__init__.py,sha256=txSLDE9FSXggNEPkW-NA_UIyTRDFTTjLSLiBcJznIWg,916
|
|
54
54
|
absfuyu/tools/checksum.py,sha256=OaMkEyHawqZpVwrYaSLgv7ErKDtQb1Wk10u0pKQbkMs,5666
|
|
55
55
|
absfuyu/tools/converter.py,sha256=sXHtKl5QyLDv8pjz-msq5ZXgGjMbQplKaGivMnyiAm8,13566
|
|
56
56
|
absfuyu/tools/generator.py,sha256=o6RT3h8oSiLibubdBQTptKQUUHb5YBcGUR0-imVwKhk,13473
|
|
57
|
-
absfuyu/tools/inspector.py,sha256=
|
|
57
|
+
absfuyu/tools/inspector.py,sha256=6vNaLx2sEE-6r88I18aKGMBhQyiGjY9SLtLnwjaFjoU,15703
|
|
58
58
|
absfuyu/tools/keygen.py,sha256=Ic_Vsk_QHqJ7331CyDcPm59csLB0ar_Vka9NMs07dO0,7115
|
|
59
59
|
absfuyu/tools/obfuscator.py,sha256=mViEFLHjyic2Zlr8Q7v3S8xmpTUexLA2RvDfqUngrpE,13669
|
|
60
60
|
absfuyu/tools/passwordlib.py,sha256=vxN6mwZAvHiUppSVv5yS_djkVLeutgrR3exXaj2AZo8,11080
|
|
@@ -64,13 +64,13 @@ absfuyu/util/__init__.py,sha256=MrHykiPbfR-r_U3Rf1l4_ZGPfHQgGL7AWUU0WrzBvfc,4187
|
|
|
64
64
|
absfuyu/util/api.py,sha256=zB2XxI2fzYAmX-fpPHFXTWizKixHDf3fTsZkDUcvZv4,4463
|
|
65
65
|
absfuyu/util/json_method.py,sha256=rHJ_omzJ9lwEacnTLprLVJmbZrRXepCbBYb57ElGW7M,2847
|
|
66
66
|
absfuyu/util/lunar.py,sha256=5zVsCl1UdsFW8sR7BHquF0VGyVNpJdyJcdZGkcDyuh0,13630
|
|
67
|
-
absfuyu/util/path.py,sha256=
|
|
67
|
+
absfuyu/util/path.py,sha256=Jj_GrsuxvtAaaXjIrbwsz96cSnktR8SXewpBtU7WGDE,22998
|
|
68
68
|
absfuyu/util/performance.py,sha256=TzsubH_1qrSNPSk42R5WthY6WlGD9EC5Gm9XpMLZU7M,12094
|
|
69
69
|
absfuyu/util/shorten_number.py,sha256=B7VDIlS3IYutlFkktv1pedEOGViC6P6BpeAOJn2BYWQ,8312
|
|
70
|
-
absfuyu/util/text_table.py,sha256=
|
|
70
|
+
absfuyu/util/text_table.py,sha256=w6CebQFfQtXc2NPkPwyo_IbQPbDyMdaDVZnl_joA2rk,13198
|
|
71
71
|
absfuyu/util/zipped.py,sha256=8I6vW2hTNQtogzT7nKOMhSJrsQup7uRK0nu5JOsikO0,3042
|
|
72
|
-
absfuyu-5.
|
|
73
|
-
absfuyu-5.
|
|
74
|
-
absfuyu-5.
|
|
75
|
-
absfuyu-5.
|
|
76
|
-
absfuyu-5.
|
|
72
|
+
absfuyu-5.3.0.dist-info/METADATA,sha256=aqBwqlDhpAGaxoGUgCLqwjDkgFJkk-LwVK2FhLyjc5s,4965
|
|
73
|
+
absfuyu-5.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
74
|
+
absfuyu-5.3.0.dist-info/entry_points.txt,sha256=bW5CgJRTTWJ2Pywojo07sf-YucRPcnHzMmETh5avbX0,79
|
|
75
|
+
absfuyu-5.3.0.dist-info/licenses/LICENSE,sha256=pFCHBSNSzdXwYG1AHpq7VcofI1NMQ1Fc77RzZ4Ln2O4,1097
|
|
76
|
+
absfuyu-5.3.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|