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.
utilities/types.py CHANGED
@@ -1,16 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import datetime as dt
4
- from asyncio import Event
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 MaybeCallableBool = MaybeCallable[bool]
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 IterableHashable[T: Hashable] = tuple[T, ...] | frozenset[T]
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 MaybeList[T] = T | list[T]
131
- type MaybeSequence[T] = T | Sequence[T]
121
+ type MaybeSequence[T] = T | SequenceLT[T]
132
122
  # iterables - str
133
- type CollectionStr = (
134
- dict[str, Any] | frozenset[str] | list[str] | set[str] | tuple[str, ...]
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 LoggerOrName = MaybeStr[Logger]
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 MaybeCallableDate = MaybeCallable[Date]
255
- type MaybeCallableZonedDateTime = MaybeCallable[ZonedDateTime]
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
- "LoggerOrName",
289
+ "LoggerLike",
294
290
  "MathRoundMode",
295
291
  "MaybeCallable",
296
- "MaybeCallableBool",
297
- "MaybeCallableDate",
298
- "MaybeCallableEvent",
292
+ "MaybeCallableBoolLike",
293
+ "MaybeCallableDateLike",
299
294
  "MaybeCallablePathLike",
300
295
  "MaybeCallableStr",
301
- "MaybeCallableZonedDateTime",
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 typing import TYPE_CHECKING
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
- def get_uuid(*, seed: Seed | None = None) -> UUID:
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=seed)
26
+ state = get_state(seed)
21
27
  return UUID(int=state.getrandbits(128), version=4)
22
28
 
23
29
 
24
- __all__ = ["UUID_EXACT_PATTERN", "UUID_PATTERN", "get_uuid"]
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, 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
  ]