reykit 1.1.27__py3-none-any.whl → 1.1.29__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.
- reykit/__init__.py +1 -1
- reykit/rbase.py +68 -76
- reykit/rdata.py +12 -38
- reykit/rmonkey.py +1 -1
- reykit/ros.py +1 -1
- reykit/rstdout.py +124 -139
- reykit/rsys.py +3 -3
- reykit/rtext.py +309 -200
- {reykit-1.1.27.dist-info → reykit-1.1.29.dist-info}/METADATA +2 -2
- {reykit-1.1.27.dist-info → reykit-1.1.29.dist-info}/RECORD +12 -12
- {reykit-1.1.27.dist-info → reykit-1.1.29.dist-info}/WHEEL +0 -0
- {reykit-1.1.27.dist-info → reykit-1.1.29.dist-info}/licenses/LICENSE +0 -0
reykit/__init__.py
CHANGED
reykit/rbase.py
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
from typing import Any, Literal, Self, TypeVar, NoReturn, overload
|
13
13
|
from types import TracebackType
|
14
|
-
from collections.abc import Callable, Iterable, Mapping
|
14
|
+
from collections.abc import Callable, Iterable, Container, Mapping
|
15
15
|
from sys import exc_info as sys_exc_info
|
16
16
|
from os.path import exists as os_exists
|
17
17
|
from traceback import format_exc
|
@@ -20,7 +20,8 @@ from traceback import format_stack, extract_stack
|
|
20
20
|
from atexit import register as atexit_register
|
21
21
|
from time import sleep as time_sleep
|
22
22
|
from inspect import signature as inspect_signature, _ParameterKind, _empty
|
23
|
-
from
|
23
|
+
from ast import Starred
|
24
|
+
from varname import VarnameException, argname as varname_argname
|
24
25
|
|
25
26
|
|
26
27
|
__all__ = (
|
@@ -55,7 +56,7 @@ __all__ = (
|
|
55
56
|
'get_stack_text',
|
56
57
|
'get_stack_param',
|
57
58
|
'get_arg_info',
|
58
|
-
'
|
59
|
+
'get_varname',
|
59
60
|
'block',
|
60
61
|
'at_exit'
|
61
62
|
)
|
@@ -231,11 +232,9 @@ class Error(BaseError):
|
|
231
232
|
|
232
233
|
|
233
234
|
def throw(
|
234
|
-
exception: type[BaseException]
|
235
|
-
value: Any = null,
|
235
|
+
exception: type[BaseException],
|
236
236
|
*values: Any,
|
237
|
-
text: str | None = None
|
238
|
-
frame: int = 2
|
237
|
+
text: str | None = None
|
239
238
|
) -> NoReturn:
|
240
239
|
"""
|
241
240
|
Throw exception.
|
@@ -243,10 +242,8 @@ def throw(
|
|
243
242
|
Parameters
|
244
243
|
----------
|
245
244
|
exception : Exception Type.
|
246
|
-
value : Exception value.
|
247
245
|
values : Exception values.
|
248
246
|
text : Exception text.
|
249
|
-
frame : Number of code to upper level.
|
250
247
|
"""
|
251
248
|
|
252
249
|
# Text.
|
@@ -262,33 +259,27 @@ def throw(
|
|
262
259
|
text = text[0].lower() + text[1:]
|
263
260
|
|
264
261
|
## Value.
|
265
|
-
if
|
266
|
-
values = (value,) + values
|
262
|
+
if values != ():
|
267
263
|
|
268
264
|
### Name.
|
269
|
-
|
270
|
-
names = (name,)
|
271
|
-
if values != ():
|
272
|
-
names_values = get_name(values)
|
273
|
-
if names_values is not None:
|
274
|
-
names += names_values
|
265
|
+
names = get_varname('values')
|
275
266
|
|
276
267
|
### Convert.
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
268
|
+
if exception == TypeError:
|
269
|
+
print(11111)
|
270
|
+
values = [
|
271
|
+
type(value)
|
272
|
+
for value in values
|
273
|
+
if value is not None
|
274
|
+
]
|
275
|
+
elif exception == TimeoutError:
|
276
|
+
values = [
|
277
|
+
int(value)
|
278
|
+
if value % 1 == 0
|
279
|
+
else round(value, 3)
|
280
|
+
for value in values
|
281
|
+
if type(value) == float
|
282
|
+
]
|
292
283
|
values = [
|
293
284
|
repr(value)
|
294
285
|
for value in values
|
@@ -406,7 +397,7 @@ def check_least_one(*values: Any) -> None:
|
|
406
397
|
return
|
407
398
|
|
408
399
|
# Throw exception.
|
409
|
-
vars_name =
|
400
|
+
vars_name: list[str] = get_varname('values')
|
410
401
|
if vars_name is not None:
|
411
402
|
vars_name_de_dup = list(set(vars_name))
|
412
403
|
vars_name_de_dup.sort(key=vars_name.index)
|
@@ -432,7 +423,7 @@ def check_most_one(*values: Any) -> None:
|
|
432
423
|
if exist is True:
|
433
424
|
|
434
425
|
# Throw exception.
|
435
|
-
vars_name =
|
426
|
+
vars_name: list[str] = get_varname('values')
|
436
427
|
if vars_name is not None:
|
437
428
|
vars_name_de_dup = list(set(vars_name))
|
438
429
|
vars_name_de_dup.sort(key=vars_name.index)
|
@@ -511,7 +502,7 @@ def check_response_code(
|
|
511
502
|
|
512
503
|
# Throw exception.
|
513
504
|
if not result:
|
514
|
-
throw(
|
505
|
+
throw(AssertionError, code)
|
515
506
|
|
516
507
|
return result
|
517
508
|
|
@@ -556,7 +547,7 @@ def is_instance(obj: Any) -> bool:
|
|
556
547
|
|
557
548
|
def is_iterable(
|
558
549
|
obj: Any,
|
559
|
-
exclude_types:
|
550
|
+
exclude_types: Container[type] | None = None
|
560
551
|
) -> bool:
|
561
552
|
"""
|
562
553
|
Judge whether it is iterable.
|
@@ -564,7 +555,7 @@ def is_iterable(
|
|
564
555
|
Parameters
|
565
556
|
----------
|
566
557
|
obj : Judge object.
|
567
|
-
exclude_types :
|
558
|
+
exclude_types : Exclude types.
|
568
559
|
|
569
560
|
Returns
|
570
561
|
-------
|
@@ -604,15 +595,15 @@ def is_table(
|
|
604
595
|
# Judge.
|
605
596
|
if type(obj) != list:
|
606
597
|
return False
|
607
|
-
for
|
608
|
-
if type(
|
598
|
+
for elem in obj:
|
599
|
+
if type(elem) != dict:
|
609
600
|
return False
|
610
601
|
|
611
602
|
## Check fields of table.
|
612
603
|
if check_fields:
|
613
604
|
keys_strs = [
|
614
|
-
':'.join([str(key) for key in
|
615
|
-
for
|
605
|
+
':'.join([str(key) for key in elem.keys()])
|
606
|
+
for elem in obj
|
616
607
|
]
|
617
608
|
keys_strs_only = set(keys_strs)
|
618
609
|
if len(keys_strs_only) != 1:
|
@@ -677,7 +668,7 @@ def get_first_notnone(*values: T, default: U = null) -> T | U:
|
|
677
668
|
|
678
669
|
# Throw exception.
|
679
670
|
if default == null:
|
680
|
-
vars_name =
|
671
|
+
vars_name: list[str] = get_varname('values')
|
681
672
|
if vars_name is not None:
|
682
673
|
vars_name_de_dup = list(set(vars_name))
|
683
674
|
vars_name_de_dup.sort(key=vars_name.index)
|
@@ -716,7 +707,7 @@ def get_stack_text(format_: Literal['plain', 'full'] = 'plain', limit: int = 2)
|
|
716
707
|
|
717
708
|
### Check.
|
718
709
|
if len(stacks) != limit:
|
719
|
-
throw(
|
710
|
+
throw(AssertionError, limit)
|
720
711
|
|
721
712
|
### Convert.
|
722
713
|
text = stacks[0]
|
@@ -731,7 +722,7 @@ def get_stack_text(format_: Literal['plain', 'full'] = 'plain', limit: int = 2)
|
|
731
722
|
|
732
723
|
### Check.
|
733
724
|
if len(stacks) == 0:
|
734
|
-
throw(
|
725
|
+
throw(AssertionError, limit)
|
735
726
|
|
736
727
|
### Convert.
|
737
728
|
stacks = [
|
@@ -777,7 +768,7 @@ def get_stack_param(format_: Literal['floor', 'full'] = 'floor', limit: int = 2)
|
|
777
768
|
|
778
769
|
# Check.
|
779
770
|
if len(stacks) == 0:
|
780
|
-
throw(
|
771
|
+
throw(AssertionError, limit)
|
781
772
|
|
782
773
|
# Convert.
|
783
774
|
match format_:
|
@@ -869,48 +860,49 @@ def get_arg_info(func: Callable) -> list[
|
|
869
860
|
return info
|
870
861
|
|
871
862
|
|
872
|
-
|
873
|
-
def get_name(obj: tuple, frame: int = 2) -> tuple[str, ...] | None: ...
|
874
|
-
|
875
|
-
@overload
|
876
|
-
def get_name(obj: Any, frame: int = 2) -> str | None: ...
|
877
|
-
|
878
|
-
def get_name(obj: Any, frame: int = 2) -> str | tuple[str, ...] | None:
|
863
|
+
def get_varname(argname: str, level: int = 1) -> str | list[str] | None:
|
879
864
|
"""
|
880
|
-
Get name of
|
865
|
+
Get variable name of function input argument, can backtrack.
|
881
866
|
|
882
867
|
Parameters
|
883
868
|
----------
|
884
|
-
|
885
|
-
|
886
|
-
- `
|
887
|
-
frame : Number of code to upper level.
|
869
|
+
argname : Function argument name, the `*` symbol can be omitted.
|
870
|
+
level : Backtrack level count.
|
871
|
+
- `Literal[1]`: In the function that calls function `get_varname`.
|
888
872
|
|
889
873
|
Returns
|
890
874
|
-------
|
891
|
-
|
875
|
+
Variable name.
|
876
|
+
- `General argument`: Return `str`.
|
877
|
+
- `Variable length argument`: Return `list[str]`.
|
878
|
+
- `Throw VarnameException`: Return `None`.
|
892
879
|
"""
|
893
880
|
|
894
|
-
#
|
895
|
-
|
896
|
-
|
897
|
-
|
881
|
+
# Handle parameter.
|
882
|
+
level += 1
|
883
|
+
|
884
|
+
# Get.
|
885
|
+
try:
|
886
|
+
result = varname_argname(argname, frame=level)
|
887
|
+
except VarnameException:
|
888
|
+
return
|
898
889
|
|
899
|
-
#
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
890
|
+
# Convert.
|
891
|
+
if type(result) != tuple:
|
892
|
+
result = (result,)
|
893
|
+
varnames: list[str] = [
|
894
|
+
name
|
895
|
+
for elem in result
|
896
|
+
for name in (
|
897
|
+
(elem.value.id,)
|
898
|
+
if type(elem) == Starred
|
899
|
+
else tuple(elem.values())
|
900
|
+
if type(elem) == dict
|
901
|
+
else (elem,)
|
902
|
+
)
|
903
|
+
]
|
912
904
|
|
913
|
-
return
|
905
|
+
return varnames
|
914
906
|
|
915
907
|
|
916
908
|
def block() -> None:
|
reykit/rdata.py
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
from typing import Any, TypedDict, Literal, overload
|
13
|
-
from collections import defaultdict as Defaultdict, ChainMap
|
13
|
+
from collections import Counter, defaultdict as Defaultdict, ChainMap
|
14
14
|
from collections.abc import Callable, Iterable, Generator
|
15
15
|
from itertools import chain as IChain
|
16
16
|
|
@@ -30,20 +30,16 @@ __all__ = (
|
|
30
30
|
)
|
31
31
|
|
32
32
|
|
33
|
-
CountResult = TypedDict('CountResult', {'
|
33
|
+
CountResult = TypedDict('CountResult', {'element': Any, 'number': int})
|
34
34
|
|
35
35
|
|
36
|
-
def count(
|
37
|
-
data: Iterable,
|
38
|
-
ascend: bool = False
|
39
|
-
) -> list[CountResult]:
|
36
|
+
def count(data: Iterable) -> list[CountResult]:
|
40
37
|
"""
|
41
38
|
Group count data element value.
|
42
39
|
|
43
40
|
Parameters
|
44
41
|
----------
|
45
42
|
data : Data.
|
46
|
-
ascend : Whether ascending by count, otherwise descending order.
|
47
43
|
|
48
44
|
Returns
|
49
45
|
-------
|
@@ -51,41 +47,19 @@ def count(
|
|
51
47
|
|
52
48
|
Examples
|
53
49
|
--------
|
54
|
-
>>> count([1, True,
|
55
|
-
[{'
|
50
|
+
>>> count([1, True, False, 0, (2, 3)])
|
51
|
+
[{'element': 1, 'number': 2}, {'element': False, 'number': 2}, {'element': (2, 3), 'number': 1}]
|
56
52
|
"""
|
57
53
|
|
58
|
-
# Set parameter.
|
59
|
-
value_list = []
|
60
|
-
count_list = []
|
61
|
-
|
62
54
|
# Count.
|
63
|
-
|
64
|
-
for index, value in enumerate(value_list):
|
65
|
-
element_str = str(element)
|
66
|
-
value_str = str(value)
|
67
|
-
if element_str == value_str:
|
68
|
-
count_list[index] += 1
|
69
|
-
break
|
70
|
-
else:
|
71
|
-
value_list.append(element)
|
72
|
-
count_list.append(1)
|
55
|
+
counter = Counter(data)
|
73
56
|
|
74
57
|
# Convert.
|
75
58
|
result = [
|
76
|
-
{
|
77
|
-
|
78
|
-
'count': count
|
79
|
-
}
|
80
|
-
for value, count in zip(value_list, count_list)
|
59
|
+
{'element': elem, 'number': num}
|
60
|
+
for elem, num in counter.items()
|
81
61
|
]
|
82
62
|
|
83
|
-
# Sort.
|
84
|
-
result.sort(
|
85
|
-
key=lambda info: info['count'],
|
86
|
-
reverse=not ascend
|
87
|
-
)
|
88
|
-
|
89
63
|
return result
|
90
64
|
|
91
65
|
|
@@ -110,17 +84,17 @@ def flatten(data: Any, *, _flattern_data: list | None = None) -> list:
|
|
110
84
|
|
111
85
|
## Recursion dict object.
|
112
86
|
if type(data) == dict:
|
113
|
-
for
|
87
|
+
for elem in data.values():
|
114
88
|
_flattern_data = flatten(
|
115
|
-
|
89
|
+
elem,
|
116
90
|
_flattern_data = _flattern_data
|
117
91
|
)
|
118
92
|
|
119
93
|
## Recursion iterator.
|
120
94
|
elif is_iterable(data, (str, bytes)):
|
121
|
-
for
|
95
|
+
for elem in data:
|
122
96
|
_flattern_data = flatten(
|
123
|
-
|
97
|
+
elem,
|
124
98
|
_flattern_data = _flattern_data
|
125
99
|
)
|
126
100
|
|
reykit/rmonkey.py
CHANGED