dycw-utilities 0.126.11__py3-none-any.whl → 0.127.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.
- {dycw_utilities-0.126.11.dist-info → dycw_utilities-0.127.0.dist-info}/METADATA +1 -1
- {dycw_utilities-0.126.11.dist-info → dycw_utilities-0.127.0.dist-info}/RECORD +11 -12
- utilities/__init__.py +1 -1
- utilities/asyncio.py +4 -15
- utilities/redis.py +1 -15
- utilities/reprlib.py +85 -1
- utilities/slack_sdk.py +1 -10
- utilities/sqlalchemy.py +1 -10
- utilities/traceback.py +3 -5
- utilities/rich.py +0 -74
- {dycw_utilities-0.126.11.dist-info → dycw_utilities-0.127.0.dist-info}/WHEEL +0 -0
- {dycw_utilities-0.126.11.dist-info → dycw_utilities-0.127.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
utilities/__init__.py,sha256=
|
1
|
+
utilities/__init__.py,sha256=9_7tk0nJkuN-6qR4z_kQd3QZb3ioRi15dhZGN0m-284,60
|
2
2
|
utilities/altair.py,sha256=Gpja-flOo-Db0PIPJLJsgzAlXWoKUjPU1qY-DQ829ek,9156
|
3
|
-
utilities/asyncio.py,sha256=
|
3
|
+
utilities/asyncio.py,sha256=wKxwNnxdWxsiy5U0b1F3UgpWRHlPKM0y_OcmURzqxR8,51396
|
4
4
|
utilities/atomicwrites.py,sha256=geFjn9Pwn-tTrtoGjDDxWli9NqbYfy3gGL6ZBctiqSo,5393
|
5
5
|
utilities/atools.py,sha256=IYMuFSFGSKyuQmqD6v5IUtDlz8PPw0Sr87Cub_gRU3M,1168
|
6
6
|
utilities/cachetools.py,sha256=C1zqOg7BYz0IfQFK8e3qaDDgEZxDpo47F15RTfJM37Q,2910
|
@@ -61,15 +61,14 @@ utilities/pytest_regressions.py,sha256=-SVT9647Dg6-JcdsiaDKXe3NdOmmrvGevLKWwGjxq
|
|
61
61
|
utilities/python_dotenv.py,sha256=iWcnpXbH7S6RoXHiLlGgyuH6udCupAcPd_gQ0eAenQ0,3190
|
62
62
|
utilities/random.py,sha256=lYdjgxB7GCfU_fwFVl5U-BIM_HV3q6_urL9byjrwDM8,4157
|
63
63
|
utilities/re.py,sha256=5J4d8VwIPFVrX2Eb8zfoxImDv7IwiN_U7mJ07wR2Wvs,3958
|
64
|
-
utilities/redis.py,sha256=
|
65
|
-
utilities/reprlib.py,sha256=
|
66
|
-
utilities/rich.py,sha256=t50MwwVBsoOLxzmeVFSVpjno4OW6Ufum32skXbV8-Bs,1911
|
64
|
+
utilities/redis.py,sha256=EZgqWeoGpvN-BfCQL93F3rYlfB4U_zhzHCBuZpDmKpo,37157
|
65
|
+
utilities/reprlib.py,sha256=ssYTcBW-TeRh3fhCJv57sopTZHF5FrPyyUg9yp5XBlo,3953
|
67
66
|
utilities/scipy.py,sha256=X6ROnHwiUhAmPhM0jkfEh0-Fd9iRvwiqtCQMOLmOQF8,945
|
68
67
|
utilities/sentinel.py,sha256=3jIwgpMekWgDAxPDA_hXMP2St43cPhciKN3LWiZ7kv0,1248
|
69
68
|
utilities/shelve.py,sha256=HZsMwK4tcIfg3sh0gApx4-yjQnrY4o3V3ZRimvRhoW0,738
|
70
|
-
utilities/slack_sdk.py,sha256=
|
69
|
+
utilities/slack_sdk.py,sha256=jqQyiYSKseZNdg2lCkvPzrAows9p7kVDDjvEnatioKo,5702
|
71
70
|
utilities/socket.py,sha256=K77vfREvzoVTrpYKo6MZakol0EYu2q1sWJnnZqL0So0,118
|
72
|
-
utilities/sqlalchemy.py,sha256=
|
71
|
+
utilities/sqlalchemy.py,sha256=XTZmNKXD9SUbZ7V1xNNxok-0Ej0Cf4ya5pjuIeH-kdg,39388
|
73
72
|
utilities/sqlalchemy_polars.py,sha256=s7hQNep2O5DTgIRXyN_JRQma7a4DAtNd25tshaZW8iw,15490
|
74
73
|
utilities/statsmodels.py,sha256=koyiBHvpMcSiBfh99wFUfSggLNx7cuAw3rwyfAhoKpQ,3410
|
75
74
|
utilities/streamlit.py,sha256=U9PJBaKP1IdSykKhPZhIzSPTZsmLsnwbEPZWzNhJPKk,2955
|
@@ -80,7 +79,7 @@ utilities/tenacity.py,sha256=1PUvODiBVgeqIh7G5TRt5WWMSqjLYkEqP53itT97WQc,4914
|
|
80
79
|
utilities/text.py,sha256=ymBFlP_cA8OgNnZRVNs7FAh7OG8HxE6YkiLEMZv5g_A,11297
|
81
80
|
utilities/threading.py,sha256=GvBOp4CyhHfN90wGXZuA2VKe9fGzMaEa7oCl4f3nnPU,1009
|
82
81
|
utilities/timer.py,sha256=Rkc49KSpHuC8s7vUxGO9DU55U9I6yDKnchsQqrUCVBs,4075
|
83
|
-
utilities/traceback.py,sha256=
|
82
|
+
utilities/traceback.py,sha256=Jg7HS3AwQ-W-msdwHp22_PSHZcR54PbmsSf115B6TSM,27435
|
84
83
|
utilities/types.py,sha256=2f1DqTZTMRlpCPWPd9-rh_uwmRPv9UdBoi_Bfv7Ccmo,18374
|
85
84
|
utilities/typing.py,sha256=H6ysJkI830aRwLsMKz0SZIw4cpcsm7d6KhQOwr-SDh0,13817
|
86
85
|
utilities/tzdata.py,sha256=yCf70NICwAeazN3_JcXhWvRqCy06XJNQ42j7r6gw3HY,1217
|
@@ -91,7 +90,7 @@ utilities/warnings.py,sha256=un1LvHv70PU-LLv8RxPVmugTzDJkkGXRMZTE2-fTQHw,1771
|
|
91
90
|
utilities/whenever.py,sha256=jS31ZAY5OMxFxLja_Yo5Fidi87Pd-GoVZ7Vi_teqVDA,16743
|
92
91
|
utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
|
93
92
|
utilities/zoneinfo.py,sha256=-5j7IQ9nb7gR43rdgA7ms05im-XuqhAk9EJnQBXxCoQ,1874
|
94
|
-
dycw_utilities-0.
|
95
|
-
dycw_utilities-0.
|
96
|
-
dycw_utilities-0.
|
97
|
-
dycw_utilities-0.
|
93
|
+
dycw_utilities-0.127.0.dist-info/METADATA,sha256=bbY-L7Ck2mkOycI3XCTxhqptadPeM716AJz69ryeIXw,12803
|
94
|
+
dycw_utilities-0.127.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
95
|
+
dycw_utilities-0.127.0.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
|
96
|
+
dycw_utilities-0.127.0.dist-info/RECORD,,
|
utilities/__init__.py
CHANGED
utilities/asyncio.py
CHANGED
@@ -663,15 +663,6 @@ class InfiniteQueueLooper(InfiniteLooper[THashable], Generic[THashable, _T]):
|
|
663
663
|
class LooperError(Exception): ...
|
664
664
|
|
665
665
|
|
666
|
-
@dataclass(kw_only=True, slots=True)
|
667
|
-
class LooperTimeoutError(LooperError):
|
668
|
-
duration: Duration | None = None
|
669
|
-
|
670
|
-
@override
|
671
|
-
def __str__(self) -> str:
|
672
|
-
return "Timeout" if self.duration is None else f"Timeout after {self.duration}"
|
673
|
-
|
674
|
-
|
675
666
|
@dataclass(kw_only=True, slots=True)
|
676
667
|
class _LooperNoTaskError(LooperError):
|
677
668
|
looper: Looper
|
@@ -691,7 +682,6 @@ class Looper(Generic[_T]):
|
|
691
682
|
empty_upon_exit: bool = field(default=False, repr=False)
|
692
683
|
logger: str | None = field(default=None, repr=False)
|
693
684
|
timeout: Duration | None = field(default=None, repr=False)
|
694
|
-
timeout_error: type[Exception] = field(default=LooperTimeoutError, repr=False)
|
695
685
|
# settings
|
696
686
|
_backoff: float = field(init=False, repr=False)
|
697
687
|
_debug: bool = field(default=False, repr=False)
|
@@ -757,7 +747,7 @@ class Looper(Generic[_T]):
|
|
757
747
|
_ = await self._stack.enter_async_context(looper)
|
758
748
|
if self.auto_start:
|
759
749
|
_ = self._debug and self._logger.debug("%s: auto-starting...", self)
|
760
|
-
with suppress(
|
750
|
+
with suppress(TimeoutError):
|
761
751
|
await self._task
|
762
752
|
case _ as never:
|
763
753
|
assert_never(never)
|
@@ -893,7 +883,6 @@ class Looper(Generic[_T]):
|
|
893
883
|
backoff: Duration | Sentinel = sentinel,
|
894
884
|
logger: str | None | Sentinel = sentinel,
|
895
885
|
timeout: Duration | None | Sentinel = sentinel,
|
896
|
-
timeout_error: type[Exception] | Sentinel = sentinel,
|
897
886
|
_debug: bool | Sentinel = sentinel,
|
898
887
|
**kwargs: Any,
|
899
888
|
) -> Self:
|
@@ -906,7 +895,6 @@ class Looper(Generic[_T]):
|
|
906
895
|
backoff=backoff,
|
907
896
|
logger=logger,
|
908
897
|
timeout=timeout,
|
909
|
-
timeout_error=timeout_error,
|
910
898
|
_debug=_debug,
|
911
899
|
**kwargs,
|
912
900
|
)
|
@@ -1029,7 +1017,7 @@ class Looper(Generic[_T]):
|
|
1029
1017
|
async def run_looper(self) -> None:
|
1030
1018
|
"""Run the looper."""
|
1031
1019
|
try:
|
1032
|
-
async with timeout_dur(duration=self.timeout
|
1020
|
+
async with timeout_dur(duration=self.timeout):
|
1033
1021
|
while True:
|
1034
1022
|
if self._is_stopped.is_set():
|
1035
1023
|
_ = self._debug and self._logger.debug("%s: stopped", self)
|
@@ -1068,6 +1056,8 @@ class Looper(Generic[_T]):
|
|
1068
1056
|
if error.args[0] == "generator didn't stop after athrow()":
|
1069
1057
|
return
|
1070
1058
|
raise
|
1059
|
+
except TimeoutError:
|
1060
|
+
pass
|
1071
1061
|
|
1072
1062
|
async def run_until_empty(self) -> None:
|
1073
1063
|
"""Run until the queue is empty."""
|
@@ -1430,7 +1420,6 @@ __all__ = [
|
|
1430
1420
|
"InfiniteQueueLooper",
|
1431
1421
|
"Looper",
|
1432
1422
|
"LooperError",
|
1433
|
-
"LooperTimeoutError",
|
1434
1423
|
"StreamCommandOutput",
|
1435
1424
|
"UniquePriorityQueue",
|
1436
1425
|
"UniqueQueue",
|
utilities/redis.py
CHANGED
@@ -25,13 +25,7 @@ from typing import (
|
|
25
25
|
from redis.asyncio import Redis
|
26
26
|
from redis.typing import EncodableT
|
27
27
|
|
28
|
-
from utilities.asyncio import
|
29
|
-
EnhancedQueue,
|
30
|
-
InfiniteQueueLooper,
|
31
|
-
Looper,
|
32
|
-
LooperTimeoutError,
|
33
|
-
timeout_dur,
|
34
|
-
)
|
28
|
+
from utilities.asyncio import EnhancedQueue, InfiniteQueueLooper, Looper, timeout_dur
|
35
29
|
from utilities.contextlib import suppress_super_object_attribute_error
|
36
30
|
from utilities.datetime import (
|
37
31
|
MILLISECOND,
|
@@ -702,9 +696,6 @@ class PublishServiceMixin(Generic[_T]):
|
|
702
696
|
publish_service_empty_upon_exit: bool = field(default=False, repr=False)
|
703
697
|
publish_service_logger: str | None = field(default=None, repr=False)
|
704
698
|
publish_service_timeout: Duration | None = field(default=None, repr=False)
|
705
|
-
publish_service_timeout_error: type[Exception] = field(
|
706
|
-
default=LooperTimeoutError, repr=False
|
707
|
-
)
|
708
699
|
publish_service_debug: bool = field(default=False, repr=False)
|
709
700
|
_is_pending_restart: Event = field(default_factory=Event, init=False, repr=False)
|
710
701
|
# base - publish service
|
@@ -724,7 +715,6 @@ class PublishServiceMixin(Generic[_T]):
|
|
724
715
|
empty_upon_exit=self.publish_service_empty_upon_exit,
|
725
716
|
logger=self.publish_service_logger,
|
726
717
|
timeout=self.publish_service_timeout,
|
727
|
-
timeout_error=self.publish_service_timeout_error,
|
728
718
|
_debug=self.publish_service_debug,
|
729
719
|
# publish service
|
730
720
|
redis=self.publish_service_redis,
|
@@ -986,9 +976,6 @@ class SubscribeServiceMixin(Generic[_T]):
|
|
986
976
|
subscribe_service_empty_upon_exit: bool = field(default=False, repr=False)
|
987
977
|
subscribe_service_logger: str | None = field(default=None, repr=False)
|
988
978
|
subscribe_service_timeout: Duration | None = field(default=None, repr=False)
|
989
|
-
subscribe_service_timeout_error: type[Exception] = field(
|
990
|
-
default=LooperTimeoutError, repr=False
|
991
|
-
)
|
992
979
|
subscribe_service_debug: bool = field(default=False, repr=False)
|
993
980
|
# base - looper
|
994
981
|
subscribe_service_redis: Redis
|
@@ -1009,7 +996,6 @@ class SubscribeServiceMixin(Generic[_T]):
|
|
1009
996
|
empty_upon_exit=self.subscribe_service_empty_upon_exit,
|
1010
997
|
logger=self.subscribe_service_logger,
|
1011
998
|
timeout=self.subscribe_service_timeout,
|
1012
|
-
timeout_error=self.subscribe_service_timeout_error,
|
1013
999
|
_debug=self.subscribe_service_debug,
|
1014
1000
|
# subscribe service
|
1015
1001
|
redis=self.subscribe_service_redis,
|
utilities/reprlib.py
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import reprlib
|
4
|
-
from
|
4
|
+
from functools import partial
|
5
|
+
from typing import TYPE_CHECKING, Any
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from collections.abc import Iterator
|
9
|
+
|
10
|
+
from utilities.types import StrMapping
|
5
11
|
|
6
12
|
RICH_MAX_WIDTH: int = 80
|
7
13
|
RICH_INDENT_SIZE: int = 4
|
@@ -11,6 +17,19 @@ RICH_MAX_DEPTH: int | None = None
|
|
11
17
|
RICH_EXPAND_ALL: bool = False
|
12
18
|
|
13
19
|
|
20
|
+
##
|
21
|
+
|
22
|
+
|
23
|
+
def get_call_args_mapping(*args: Any, **kwargs: Any) -> StrMapping:
|
24
|
+
"""Get the representation of a set of call arguments."""
|
25
|
+
return {f"args[{i}]": v for i, v in enumerate(args)} | {
|
26
|
+
f"kwargs[{k}]": v for k, v in kwargs.items()
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
##
|
31
|
+
|
32
|
+
|
14
33
|
def get_repr(
|
15
34
|
obj: Any,
|
16
35
|
/,
|
@@ -38,6 +57,9 @@ def get_repr(
|
|
38
57
|
)
|
39
58
|
|
40
59
|
|
60
|
+
##
|
61
|
+
|
62
|
+
|
41
63
|
def get_repr_and_class(
|
42
64
|
obj: Any,
|
43
65
|
/,
|
@@ -62,6 +84,65 @@ def get_repr_and_class(
|
|
62
84
|
return f"Object {repr_use!r} of type {type(obj).__name__!r}"
|
63
85
|
|
64
86
|
|
87
|
+
##
|
88
|
+
|
89
|
+
|
90
|
+
def yield_call_args_repr(
|
91
|
+
*args: Any,
|
92
|
+
_max_width: int = RICH_MAX_WIDTH,
|
93
|
+
_indent_size: int = RICH_INDENT_SIZE,
|
94
|
+
_max_length: int | None = RICH_MAX_LENGTH,
|
95
|
+
_max_string: int | None = RICH_MAX_STRING,
|
96
|
+
_max_depth: int | None = RICH_MAX_DEPTH,
|
97
|
+
_expand_all: bool = RICH_EXPAND_ALL,
|
98
|
+
**kwargs: Any,
|
99
|
+
) -> Iterator[str]:
|
100
|
+
"""Pretty print of a set of positional/keyword arguments."""
|
101
|
+
mapping = get_call_args_mapping(*args, **kwargs)
|
102
|
+
return yield_mapping_repr(
|
103
|
+
mapping,
|
104
|
+
_max_width=_max_width,
|
105
|
+
_indent_size=_indent_size,
|
106
|
+
_max_length=_max_length,
|
107
|
+
_max_string=_max_string,
|
108
|
+
_max_depth=_max_depth,
|
109
|
+
_expand_all=_expand_all,
|
110
|
+
)
|
111
|
+
|
112
|
+
|
113
|
+
##
|
114
|
+
|
115
|
+
|
116
|
+
def yield_mapping_repr(
|
117
|
+
mapping: StrMapping,
|
118
|
+
/,
|
119
|
+
*,
|
120
|
+
_max_width: int = RICH_MAX_WIDTH,
|
121
|
+
_indent_size: int = RICH_INDENT_SIZE,
|
122
|
+
_max_length: int | None = RICH_MAX_LENGTH,
|
123
|
+
_max_string: int | None = RICH_MAX_STRING,
|
124
|
+
_max_depth: int | None = RICH_MAX_DEPTH,
|
125
|
+
_expand_all: bool = RICH_EXPAND_ALL,
|
126
|
+
) -> Iterator[str]:
|
127
|
+
"""Pretty print of a set of keyword arguments."""
|
128
|
+
try:
|
129
|
+
from rich.pretty import pretty_repr
|
130
|
+
except ModuleNotFoundError: # pragma: no cover
|
131
|
+
repr_use = repr
|
132
|
+
else:
|
133
|
+
repr_use = partial(
|
134
|
+
pretty_repr,
|
135
|
+
max_width=_max_width,
|
136
|
+
indent_size=_indent_size,
|
137
|
+
max_length=_max_length,
|
138
|
+
max_string=_max_string,
|
139
|
+
max_depth=_max_depth,
|
140
|
+
expand_all=_expand_all,
|
141
|
+
)
|
142
|
+
for k, v in mapping.items():
|
143
|
+
yield f"{k} = {repr_use(v)}"
|
144
|
+
|
145
|
+
|
65
146
|
__all__ = [
|
66
147
|
"RICH_EXPAND_ALL",
|
67
148
|
"RICH_INDENT_SIZE",
|
@@ -69,6 +150,9 @@ __all__ = [
|
|
69
150
|
"RICH_MAX_LENGTH",
|
70
151
|
"RICH_MAX_STRING",
|
71
152
|
"RICH_MAX_WIDTH",
|
153
|
+
"get_call_args_mapping",
|
72
154
|
"get_repr",
|
73
155
|
"get_repr_and_class",
|
156
|
+
"yield_call_args_repr",
|
157
|
+
"yield_mapping_repr",
|
74
158
|
]
|
utilities/slack_sdk.py
CHANGED
@@ -7,12 +7,7 @@ from typing import TYPE_CHECKING, Any, Self, override
|
|
7
7
|
|
8
8
|
from slack_sdk.webhook.async_client import AsyncWebhookClient
|
9
9
|
|
10
|
-
from utilities.asyncio import
|
11
|
-
InfiniteQueueLooper,
|
12
|
-
Looper,
|
13
|
-
LooperTimeoutError,
|
14
|
-
timeout_dur,
|
15
|
-
)
|
10
|
+
from utilities.asyncio import InfiniteQueueLooper, Looper, timeout_dur
|
16
11
|
from utilities.datetime import MINUTE, SECOND, datetime_duration_to_float
|
17
12
|
from utilities.functools import cache
|
18
13
|
from utilities.math import safe_round
|
@@ -94,7 +89,6 @@ class SlackHandlerService(Handler, Looper[str]):
|
|
94
89
|
backoff: Duration = SECOND,
|
95
90
|
logger: str | None = None,
|
96
91
|
timeout: Duration | None = None,
|
97
|
-
timeout_error: type[Exception] = LooperTimeoutError,
|
98
92
|
_debug: bool = False,
|
99
93
|
level: int = NOTSET,
|
100
94
|
sender: Callable[[str, str], Coroutine1[None]] = _send_adapter,
|
@@ -108,7 +102,6 @@ class SlackHandlerService(Handler, Looper[str]):
|
|
108
102
|
backoff=backoff,
|
109
103
|
logger=logger,
|
110
104
|
timeout=timeout,
|
111
|
-
timeout_error=timeout_error,
|
112
105
|
_debug=_debug,
|
113
106
|
)
|
114
107
|
Looper.__post_init__(self)
|
@@ -144,7 +137,6 @@ class SlackHandlerService(Handler, Looper[str]):
|
|
144
137
|
backoff: Duration | Sentinel = sentinel,
|
145
138
|
logger: str | None | Sentinel = sentinel,
|
146
139
|
timeout: Duration | None | Sentinel = sentinel,
|
147
|
-
timeout_error: type[Exception] | Sentinel = sentinel,
|
148
140
|
_debug: bool | Sentinel = sentinel,
|
149
141
|
**kwargs: Any,
|
150
142
|
) -> Self:
|
@@ -157,7 +149,6 @@ class SlackHandlerService(Handler, Looper[str]):
|
|
157
149
|
backoff=backoff,
|
158
150
|
logger=logger,
|
159
151
|
timeout=timeout,
|
160
|
-
timeout_error=timeout_error,
|
161
152
|
_debug=_debug,
|
162
153
|
**kwargs,
|
163
154
|
)
|
utilities/sqlalchemy.py
CHANGED
@@ -57,12 +57,7 @@ from sqlalchemy.orm import (
|
|
57
57
|
from sqlalchemy.orm.exc import UnmappedClassError
|
58
58
|
from sqlalchemy.pool import NullPool, Pool
|
59
59
|
|
60
|
-
from utilities.asyncio import
|
61
|
-
InfiniteQueueLooper,
|
62
|
-
Looper,
|
63
|
-
LooperTimeoutError,
|
64
|
-
timeout_dur,
|
65
|
-
)
|
60
|
+
from utilities.asyncio import InfiniteQueueLooper, Looper, timeout_dur
|
66
61
|
from utilities.contextlib import suppress_super_object_attribute_error
|
67
62
|
from utilities.datetime import SECOND
|
68
63
|
from utilities.functions import (
|
@@ -707,9 +702,6 @@ class UpsertServiceMixin:
|
|
707
702
|
upsert_service_empty_upon_exit: bool = field(default=False, repr=False)
|
708
703
|
upsert_service_logger: str | None = field(default=None, repr=False)
|
709
704
|
upsert_service_timeout: Duration | None = field(default=None, repr=False)
|
710
|
-
upsert_service_timeout_error: type[Exception] = field(
|
711
|
-
default=LooperTimeoutError, repr=False
|
712
|
-
)
|
713
705
|
upsert_service_debug: bool = field(default=False, repr=False)
|
714
706
|
# base - upsert service
|
715
707
|
upsert_service_database: AsyncEngine
|
@@ -734,7 +726,6 @@ class UpsertServiceMixin:
|
|
734
726
|
empty_upon_exit=self.upsert_service_empty_upon_exit,
|
735
727
|
logger=self.upsert_service_logger,
|
736
728
|
timeout=self.upsert_service_timeout,
|
737
|
-
timeout_error=self.upsert_service_timeout_error,
|
738
729
|
_debug=self.upsert_service_debug,
|
739
730
|
# upsert service
|
740
731
|
engine=self.upsert_service_database,
|
utilities/traceback.py
CHANGED
@@ -42,6 +42,8 @@ from utilities.reprlib import (
|
|
42
42
|
RICH_MAX_LENGTH,
|
43
43
|
RICH_MAX_STRING,
|
44
44
|
RICH_MAX_WIDTH,
|
45
|
+
yield_call_args_repr,
|
46
|
+
yield_mapping_repr,
|
45
47
|
)
|
46
48
|
from utilities.types import TBaseException, TCallable
|
47
49
|
from utilities.version import get_version
|
@@ -199,8 +201,6 @@ class _CallArgs:
|
|
199
201
|
@classmethod
|
200
202
|
def create(cls, func: Callable[..., Any], *args: Any, **kwargs: Any) -> Self:
|
201
203
|
"""Make the initial trace data."""
|
202
|
-
from utilities.rich import yield_call_args_repr
|
203
|
-
|
204
204
|
sig = signature(func)
|
205
205
|
try:
|
206
206
|
bound_args = sig.bind(*args, **kwargs)
|
@@ -437,8 +437,6 @@ class _Frame:
|
|
437
437
|
depth: int = 0,
|
438
438
|
) -> str:
|
439
439
|
"""Format the traceback."""
|
440
|
-
from utilities.rich import yield_call_args_repr, yield_mapping_repr
|
441
|
-
|
442
440
|
lines: list[str] = [f"Frame {index + 1}/{total}: {self.name} ({self.module})"]
|
443
441
|
if detail:
|
444
442
|
lines.append(indent("Inputs:", _INDENT))
|
@@ -459,13 +457,13 @@ class _Frame:
|
|
459
457
|
lines.extend(
|
460
458
|
indent(line, 2 * _INDENT)
|
461
459
|
for line in yield_mapping_repr(
|
460
|
+
self.locals,
|
462
461
|
_max_width=self.max_width,
|
463
462
|
_indent_size=self.indent_size,
|
464
463
|
_max_length=self.max_length,
|
465
464
|
_max_string=self.max_string,
|
466
465
|
_max_depth=self.max_depth,
|
467
466
|
_expand_all=self.expand_all,
|
468
|
-
**self.locals,
|
469
467
|
)
|
470
468
|
)
|
471
469
|
lines.extend([
|
utilities/rich.py
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from typing import TYPE_CHECKING, Any
|
4
|
-
|
5
|
-
from rich.pretty import pretty_repr
|
6
|
-
|
7
|
-
from utilities.reprlib import (
|
8
|
-
RICH_EXPAND_ALL,
|
9
|
-
RICH_INDENT_SIZE,
|
10
|
-
RICH_MAX_DEPTH,
|
11
|
-
RICH_MAX_LENGTH,
|
12
|
-
RICH_MAX_STRING,
|
13
|
-
RICH_MAX_WIDTH,
|
14
|
-
)
|
15
|
-
|
16
|
-
if TYPE_CHECKING:
|
17
|
-
from collections.abc import Iterator
|
18
|
-
|
19
|
-
|
20
|
-
##
|
21
|
-
|
22
|
-
|
23
|
-
def yield_call_args_repr(
|
24
|
-
*args: Any,
|
25
|
-
_max_width: int = RICH_MAX_WIDTH,
|
26
|
-
_indent_size: int = RICH_INDENT_SIZE,
|
27
|
-
_max_length: int | None = RICH_MAX_LENGTH,
|
28
|
-
_max_string: int | None = RICH_MAX_STRING,
|
29
|
-
_max_depth: int | None = RICH_MAX_DEPTH,
|
30
|
-
_expand_all: bool = RICH_EXPAND_ALL,
|
31
|
-
**kwargs: Any,
|
32
|
-
) -> Iterator[str]:
|
33
|
-
"""Pretty print of a set of positional/keyword arguments."""
|
34
|
-
mapping = {f"args[{i}]": v for i, v in enumerate(args)} | {
|
35
|
-
f"kwargs[{k}]": v for k, v in kwargs.items()
|
36
|
-
}
|
37
|
-
return yield_mapping_repr(
|
38
|
-
_max_width=_max_width,
|
39
|
-
_indent_size=_indent_size,
|
40
|
-
_max_length=_max_length,
|
41
|
-
_max_string=_max_string,
|
42
|
-
_max_depth=_max_depth,
|
43
|
-
_expand_all=_expand_all,
|
44
|
-
**mapping,
|
45
|
-
)
|
46
|
-
|
47
|
-
|
48
|
-
##
|
49
|
-
|
50
|
-
|
51
|
-
def yield_mapping_repr(
|
52
|
-
_max_width: int = RICH_MAX_WIDTH,
|
53
|
-
_indent_size: int = RICH_INDENT_SIZE,
|
54
|
-
_max_length: int | None = RICH_MAX_LENGTH,
|
55
|
-
_max_string: int | None = RICH_MAX_STRING,
|
56
|
-
_max_depth: int | None = RICH_MAX_DEPTH,
|
57
|
-
_expand_all: bool = RICH_EXPAND_ALL, # noqa: FBT001
|
58
|
-
**kwargs: Any,
|
59
|
-
) -> Iterator[str]:
|
60
|
-
"""Pretty print of a set of keyword arguments."""
|
61
|
-
for k, v in kwargs.items():
|
62
|
-
v_repr = pretty_repr(
|
63
|
-
v,
|
64
|
-
max_width=_max_width,
|
65
|
-
indent_size=_indent_size,
|
66
|
-
max_length=_max_length,
|
67
|
-
max_string=_max_string,
|
68
|
-
max_depth=_max_depth,
|
69
|
-
expand_all=_expand_all,
|
70
|
-
)
|
71
|
-
yield f"{k} = {v_repr}"
|
72
|
-
|
73
|
-
|
74
|
-
__all__ = ["yield_call_args_repr", "yield_mapping_repr"]
|
File without changes
|
File without changes
|