dycw-utilities 0.151.12__py3-none-any.whl → 0.153.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.151.12.dist-info → dycw_utilities-0.153.0.dist-info}/METADATA +2 -2
- {dycw_utilities-0.151.12.dist-info → dycw_utilities-0.153.0.dist-info}/RECORD +28 -29
- utilities/__init__.py +1 -1
- utilities/asyncio.py +12 -11
- utilities/cryptography.py +3 -3
- utilities/eventkit.py +8 -8
- utilities/functions.py +1 -33
- utilities/iterables.py +1 -12
- utilities/logging.py +23 -24
- utilities/pathlib.py +34 -34
- utilities/postgres.py +12 -12
- utilities/pottery.py +5 -5
- utilities/pyinstrument.py +3 -3
- utilities/pytest.py +8 -8
- utilities/pytest_plugins/pytest_randomly.py +1 -1
- utilities/pytest_plugins/pytest_regressions.py +1 -1
- utilities/random.py +8 -6
- utilities/redis.py +2 -2
- utilities/text.py +37 -2
- utilities/traceback.py +15 -18
- utilities/typed_settings.py +3 -3
- utilities/types.py +29 -35
- utilities/uuid.py +42 -5
- utilities/version.py +27 -26
- utilities/whenever.py +431 -37
- utilities/period.py +0 -370
- {dycw_utilities-0.151.12.dist-info → dycw_utilities-0.153.0.dist-info}/WHEEL +0 -0
- {dycw_utilities-0.151.12.dist-info → dycw_utilities-0.153.0.dist-info}/entry_points.txt +0 -0
- {dycw_utilities-0.151.12.dist-info → dycw_utilities-0.153.0.dist-info}/licenses/LICENSE +0 -0
utilities/types.py
CHANGED
@@ -1,16 +1,7 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import datetime as dt
|
4
|
-
from
|
5
|
-
from collections.abc import (
|
6
|
-
Callable,
|
7
|
-
Collection,
|
8
|
-
Coroutine,
|
9
|
-
Hashable,
|
10
|
-
Iterable,
|
11
|
-
Mapping,
|
12
|
-
Sequence,
|
13
|
-
)
|
4
|
+
from collections.abc import Callable, Collection, Coroutine, Iterable, Mapping
|
14
5
|
from enum import Enum
|
15
6
|
from ipaddress import IPv4Address, IPv6Address
|
16
7
|
from logging import Logger
|
@@ -27,6 +18,7 @@ from typing import (
|
|
27
18
|
overload,
|
28
19
|
runtime_checkable,
|
29
20
|
)
|
21
|
+
from uuid import UUID
|
30
22
|
from zoneinfo import ZoneInfo
|
31
23
|
|
32
24
|
from whenever import (
|
@@ -47,6 +39,7 @@ _T_contra = TypeVar("_T_contra", contravariant=True)
|
|
47
39
|
|
48
40
|
|
49
41
|
# basic
|
42
|
+
type BoolLike = MaybeStr[bool]
|
50
43
|
type OpenMode = Literal[
|
51
44
|
"r",
|
52
45
|
"w",
|
@@ -70,8 +63,7 @@ type OpenMode = Literal[
|
|
70
63
|
"a+b",
|
71
64
|
]
|
72
65
|
type MaybeCallable[T] = T | Callable[[], T]
|
73
|
-
type
|
74
|
-
type MaybeCallableStr = MaybeCallable[str]
|
66
|
+
type MaybeCallableBoolLike = MaybeCallable[BoolLike]
|
75
67
|
type MaybeStr[T] = T | str
|
76
68
|
type MaybeType[T] = T | type[T]
|
77
69
|
type StrMapping = Mapping[str, Any]
|
@@ -82,7 +74,6 @@ type TupleOrStrMapping = tuple[Any, ...] | StrMapping
|
|
82
74
|
|
83
75
|
# asyncio
|
84
76
|
type Coro[T] = Coroutine[Any, Any, T]
|
85
|
-
type MaybeCallableEvent = MaybeCallable[Event]
|
86
77
|
type MaybeCoro[T] = T | Coro[T]
|
87
78
|
|
88
79
|
|
@@ -123,25 +114,22 @@ IPv6AddressLike = MaybeStr[IPv6Address]
|
|
123
114
|
|
124
115
|
|
125
116
|
# iterables
|
126
|
-
type
|
117
|
+
type SequenceLT[T] = list[T] | tuple[T, ...]
|
118
|
+
# iterables - maybe
|
127
119
|
type MaybeCollection[T] = T | Collection[T]
|
128
|
-
type MaybeIterableHashable[T: Hashable] = T | IterableHashable[T]
|
129
120
|
type MaybeIterable[T] = T | Iterable[T]
|
130
|
-
type
|
131
|
-
type MaybeSequence[T] = T | Sequence[T]
|
121
|
+
type MaybeSequence[T] = T | SequenceLT[T]
|
132
122
|
# iterables - str
|
133
|
-
type
|
134
|
-
|
135
|
-
|
123
|
+
type SequenceStr = SequenceLT[str]
|
124
|
+
type CollectionStr = dict[str, Any] | frozenset[str] | set[str] | SequenceStr
|
125
|
+
# iterables - maybe str
|
136
126
|
type MaybeCollectionStr = str | CollectionStr
|
137
|
-
type MaybeListStr = MaybeList[str]
|
138
127
|
type MaybeSequenceStr = str | SequenceStr
|
139
|
-
type SequenceStr = list[str] | tuple[str, ...]
|
140
128
|
|
141
129
|
|
142
130
|
# logging
|
143
131
|
type LogLevel = Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
|
144
|
-
type
|
132
|
+
type LoggerLike = MaybeStr[Logger]
|
145
133
|
|
146
134
|
|
147
135
|
# math
|
@@ -225,8 +213,8 @@ type SerializeObjectExtra = Mapping[Any, Callable[[Any], str]]
|
|
225
213
|
|
226
214
|
|
227
215
|
# pathlib
|
228
|
-
type MaybeCallablePathLike = MaybeCallable[PathLike]
|
229
216
|
type PathLike = MaybeStr[Path]
|
217
|
+
type MaybeCallablePathLike = MaybeCallable[PathLike]
|
230
218
|
|
231
219
|
|
232
220
|
# random
|
@@ -237,11 +225,20 @@ type Seed = int | float | str | bytes | bytearray | Random
|
|
237
225
|
type PatternLike = MaybeStr[Pattern[str]]
|
238
226
|
|
239
227
|
|
228
|
+
# text
|
229
|
+
type MaybeCallableStr = MaybeCallable[str]
|
230
|
+
|
231
|
+
|
240
232
|
# traceback
|
241
233
|
type ExcInfo = tuple[type[BaseException], BaseException, TracebackType]
|
242
234
|
type OptExcInfo = ExcInfo | tuple[None, None, None]
|
243
235
|
|
244
236
|
|
237
|
+
# uuid
|
238
|
+
type UUIDLike = MaybeStr[UUID]
|
239
|
+
type MaybeCallableUUIDLike = MaybeCallable[UUIDLike | Seed]
|
240
|
+
|
241
|
+
|
245
242
|
# whenever
|
246
243
|
type DateDeltaLike = MaybeStr[DateDelta]
|
247
244
|
type DateLike = MaybeStr[Date]
|
@@ -251,8 +248,8 @@ type DateTimeRoundMode = Literal[
|
|
251
248
|
"ceil", "floor", "half_ceil", "half_floor", "half_even"
|
252
249
|
]
|
253
250
|
type Delta = DateDelta | TimeDelta | DateTimeDelta
|
254
|
-
type
|
255
|
-
type
|
251
|
+
type MaybeCallableDateLike = MaybeCallable[DateLike]
|
252
|
+
type MaybeCallableZonedDateTimeLike = MaybeCallable[ZonedDateTimeLike]
|
256
253
|
type MonthDayLike = MaybeStr[MonthDay]
|
257
254
|
type PlainDateTimeLike = MaybeStr[PlainDateTime]
|
258
255
|
type TimeDeltaLike = MaybeStr[TimeDelta]
|
@@ -288,24 +285,20 @@ __all__ = [
|
|
288
285
|
"ExceptionTypeLike",
|
289
286
|
"IPv4AddressLike",
|
290
287
|
"IPv6AddressLike",
|
291
|
-
"IterableHashable",
|
292
288
|
"LogLevel",
|
293
|
-
"
|
289
|
+
"LoggerLike",
|
294
290
|
"MathRoundMode",
|
295
291
|
"MaybeCallable",
|
296
|
-
"
|
297
|
-
"
|
298
|
-
"MaybeCallableEvent",
|
292
|
+
"MaybeCallableBoolLike",
|
293
|
+
"MaybeCallableDateLike",
|
299
294
|
"MaybeCallablePathLike",
|
300
295
|
"MaybeCallableStr",
|
301
|
-
"
|
296
|
+
"MaybeCallableUUIDLike",
|
297
|
+
"MaybeCallableZonedDateTimeLike",
|
302
298
|
"MaybeCollection",
|
303
299
|
"MaybeCollectionStr",
|
304
300
|
"MaybeCoro",
|
305
301
|
"MaybeIterable",
|
306
|
-
"MaybeIterableHashable",
|
307
|
-
"MaybeList",
|
308
|
-
"MaybeListStr",
|
309
302
|
"MaybeSequence",
|
310
303
|
"MaybeSequenceStr",
|
311
304
|
"MaybeStr",
|
@@ -345,6 +338,7 @@ __all__ = [
|
|
345
338
|
"TimeZoneLike",
|
346
339
|
"TupleOrStrMapping",
|
347
340
|
"TypeLike",
|
341
|
+
"UUIDLike",
|
348
342
|
"WeekDay",
|
349
343
|
"YearMonthLike",
|
350
344
|
"ZonedDateTimeLike",
|
utilities/uuid.py
CHANGED
@@ -1,24 +1,61 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
from
|
3
|
+
from collections.abc import Callable
|
4
|
+
from random import Random
|
5
|
+
from typing import TYPE_CHECKING, assert_never, overload
|
4
6
|
from uuid import UUID, uuid4
|
5
7
|
|
6
8
|
from utilities.random import get_state
|
9
|
+
from utilities.sentinel import Sentinel
|
7
10
|
|
8
11
|
if TYPE_CHECKING:
|
9
|
-
from utilities.types import Seed
|
12
|
+
from utilities.types import MaybeCallableUUIDLike, Seed
|
10
13
|
|
11
14
|
|
12
15
|
UUID_PATTERN = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
|
13
16
|
UUID_EXACT_PATTERN = f"^{UUID_PATTERN}$"
|
14
17
|
|
15
18
|
|
16
|
-
|
19
|
+
##
|
20
|
+
|
21
|
+
|
22
|
+
def get_uuid(seed: Seed | None = None, /) -> UUID:
|
17
23
|
"""Generate a UUID, possibly with a seed."""
|
18
24
|
if seed is None:
|
19
25
|
return uuid4()
|
20
|
-
state = get_state(seed
|
26
|
+
state = get_state(seed)
|
21
27
|
return UUID(int=state.getrandbits(128), version=4)
|
22
28
|
|
23
29
|
|
24
|
-
|
30
|
+
##
|
31
|
+
|
32
|
+
|
33
|
+
@overload
|
34
|
+
def to_uuid(uuid: Sentinel, /, *, seed: Seed | None = None) -> Sentinel: ...
|
35
|
+
@overload
|
36
|
+
def to_uuid(
|
37
|
+
uuid: MaybeCallableUUIDLike | None = get_uuid, /, *, seed: Seed | None = None
|
38
|
+
) -> UUID: ...
|
39
|
+
def to_uuid(
|
40
|
+
uuid: MaybeCallableUUIDLike | None | Sentinel = get_uuid,
|
41
|
+
/,
|
42
|
+
*,
|
43
|
+
seed: Seed | None = None,
|
44
|
+
) -> UUID | Sentinel:
|
45
|
+
"""Convert to a UUID."""
|
46
|
+
match uuid:
|
47
|
+
case UUID() | Sentinel():
|
48
|
+
return uuid
|
49
|
+
case None:
|
50
|
+
return get_uuid(seed)
|
51
|
+
case str():
|
52
|
+
return UUID(uuid)
|
53
|
+
case int() | float() | bytes() | bytearray() | Random() as seed:
|
54
|
+
return get_uuid(seed)
|
55
|
+
case Callable() as func:
|
56
|
+
return to_uuid(func(), seed=seed)
|
57
|
+
case never:
|
58
|
+
assert_never(never)
|
59
|
+
|
60
|
+
|
61
|
+
__all__ = ["UUID_EXACT_PATTERN", "UUID_PATTERN", "get_uuid", "to_uuid"]
|
utilities/version.py
CHANGED
@@ -6,7 +6,7 @@ from dataclasses import dataclass, field, replace
|
|
6
6
|
from functools import total_ordering
|
7
7
|
from typing import Any, Self, assert_never, overload, override
|
8
8
|
|
9
|
-
from utilities.sentinel import Sentinel
|
9
|
+
from utilities.sentinel import Sentinel
|
10
10
|
from utilities.types import MaybeCallable, MaybeStr
|
11
11
|
|
12
12
|
type VersionLike = MaybeStr[Version]
|
@@ -131,30 +131,6 @@ class _VersionEmptySuffixError(VersionError):
|
|
131
131
|
##
|
132
132
|
|
133
133
|
|
134
|
-
@overload
|
135
|
-
def get_version(*, version: MaybeCallableVersionLike) -> Version: ...
|
136
|
-
@overload
|
137
|
-
def get_version(*, version: None) -> None: ...
|
138
|
-
@overload
|
139
|
-
def get_version(*, version: Sentinel) -> Sentinel: ...
|
140
|
-
def get_version(
|
141
|
-
*, version: MaybeCallableVersionLike | None | Sentinel = sentinel
|
142
|
-
) -> Version | None | Sentinel:
|
143
|
-
"""Get the version."""
|
144
|
-
match version:
|
145
|
-
case Version() | None | Sentinel():
|
146
|
-
return version
|
147
|
-
case str():
|
148
|
-
return parse_version(version)
|
149
|
-
case Callable() as func:
|
150
|
-
return get_version(version=func())
|
151
|
-
case never:
|
152
|
-
assert_never(never)
|
153
|
-
|
154
|
-
|
155
|
-
##
|
156
|
-
|
157
|
-
|
158
134
|
def parse_version(version: str, /) -> Version:
|
159
135
|
"""Parse a string into a version object."""
|
160
136
|
try:
|
@@ -178,12 +154,37 @@ class ParseVersionError(Exception):
|
|
178
154
|
return f"Invalid version string: {self.version!r}"
|
179
155
|
|
180
156
|
|
157
|
+
##
|
158
|
+
|
159
|
+
|
160
|
+
@overload
|
161
|
+
def to_version(version: MaybeCallableVersionLike, /) -> Version: ...
|
162
|
+
@overload
|
163
|
+
def to_version(version: None, /) -> None: ...
|
164
|
+
@overload
|
165
|
+
def to_version(version: Sentinel, /) -> Sentinel: ...
|
166
|
+
def to_version(
|
167
|
+
version: MaybeCallableVersionLike | None | Sentinel, /
|
168
|
+
) -> Version | None | Sentinel:
|
169
|
+
"""Convert to a version."""
|
170
|
+
match version:
|
171
|
+
case Version() | None | Sentinel():
|
172
|
+
return version
|
173
|
+
case str():
|
174
|
+
return parse_version(version)
|
175
|
+
case Callable() as func:
|
176
|
+
return to_version(func())
|
177
|
+
case never:
|
178
|
+
assert_never(never)
|
179
|
+
|
180
|
+
|
181
|
+
##
|
181
182
|
__all__ = [
|
182
183
|
"MaybeCallableVersionLike",
|
183
184
|
"ParseVersionError",
|
184
185
|
"Version",
|
185
186
|
"VersionError",
|
186
187
|
"VersionLike",
|
187
|
-
"get_version",
|
188
188
|
"parse_version",
|
189
|
+
"to_version",
|
189
190
|
]
|