dycw-utilities 0.129.10__py3-none-any.whl → 0.175.17__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.175.17.dist-info/METADATA +34 -0
- dycw_utilities-0.175.17.dist-info/RECORD +103 -0
- dycw_utilities-0.175.17.dist-info/WHEEL +4 -0
- dycw_utilities-0.175.17.dist-info/entry_points.txt +4 -0
- utilities/__init__.py +1 -1
- utilities/altair.py +14 -14
- utilities/asyncio.py +350 -819
- utilities/atomicwrites.py +18 -6
- utilities/atools.py +77 -22
- utilities/cachetools.py +24 -29
- utilities/click.py +393 -237
- utilities/concurrent.py +8 -11
- utilities/contextlib.py +216 -17
- utilities/contextvars.py +20 -1
- utilities/cryptography.py +3 -3
- utilities/dataclasses.py +83 -118
- utilities/docker.py +293 -0
- utilities/enum.py +26 -23
- utilities/errors.py +17 -3
- utilities/fastapi.py +29 -65
- utilities/fpdf2.py +3 -3
- utilities/functions.py +169 -416
- utilities/functools.py +18 -19
- utilities/git.py +9 -30
- utilities/grp.py +28 -0
- utilities/gzip.py +31 -0
- utilities/http.py +3 -2
- utilities/hypothesis.py +738 -589
- utilities/importlib.py +17 -1
- utilities/inflect.py +25 -0
- utilities/iterables.py +194 -262
- utilities/jinja2.py +148 -0
- utilities/json.py +70 -0
- utilities/libcst.py +38 -17
- utilities/lightweight_charts.py +5 -9
- utilities/logging.py +345 -543
- utilities/math.py +18 -13
- utilities/memory_profiler.py +11 -15
- utilities/more_itertools.py +200 -131
- utilities/operator.py +33 -29
- utilities/optuna.py +6 -6
- utilities/orjson.py +272 -137
- utilities/os.py +61 -4
- utilities/parse.py +59 -61
- utilities/pathlib.py +281 -40
- utilities/permissions.py +298 -0
- utilities/pickle.py +2 -2
- utilities/platform.py +24 -5
- utilities/polars.py +1214 -430
- utilities/polars_ols.py +1 -1
- utilities/postgres.py +408 -0
- utilities/pottery.py +113 -26
- utilities/pqdm.py +10 -11
- utilities/psutil.py +6 -57
- utilities/pwd.py +28 -0
- utilities/pydantic.py +4 -54
- utilities/pydantic_settings.py +240 -0
- utilities/pydantic_settings_sops.py +76 -0
- utilities/pyinstrument.py +8 -10
- utilities/pytest.py +227 -121
- utilities/pytest_plugins/__init__.py +1 -0
- utilities/pytest_plugins/pytest_randomly.py +23 -0
- utilities/pytest_plugins/pytest_regressions.py +56 -0
- utilities/pytest_regressions.py +26 -46
- utilities/random.py +13 -9
- utilities/re.py +58 -28
- utilities/redis.py +401 -550
- utilities/scipy.py +1 -1
- utilities/sentinel.py +10 -0
- utilities/shelve.py +4 -1
- utilities/shutil.py +25 -0
- utilities/slack_sdk.py +36 -106
- utilities/sqlalchemy.py +502 -473
- utilities/sqlalchemy_polars.py +38 -94
- utilities/string.py +2 -3
- utilities/subprocess.py +1572 -0
- utilities/tempfile.py +86 -4
- utilities/testbook.py +50 -0
- utilities/text.py +165 -42
- utilities/timer.py +37 -65
- utilities/traceback.py +158 -929
- utilities/types.py +146 -116
- utilities/typing.py +531 -71
- utilities/tzdata.py +1 -53
- utilities/tzlocal.py +6 -23
- utilities/uuid.py +43 -5
- utilities/version.py +27 -26
- utilities/whenever.py +1776 -386
- utilities/zoneinfo.py +84 -22
- dycw_utilities-0.129.10.dist-info/METADATA +0 -241
- dycw_utilities-0.129.10.dist-info/RECORD +0 -96
- dycw_utilities-0.129.10.dist-info/WHEEL +0 -4
- dycw_utilities-0.129.10.dist-info/licenses/LICENSE +0 -21
- utilities/datetime.py +0 -1409
- utilities/eventkit.py +0 -402
- utilities/loguru.py +0 -144
- utilities/luigi.py +0 -228
- utilities/period.py +0 -324
- utilities/pyrsistent.py +0 -89
- utilities/python_dotenv.py +0 -105
- utilities/streamlit.py +0 -105
- utilities/sys.py +0 -87
- utilities/tenacity.py +0 -145
utilities/tzdata.py
CHANGED
|
@@ -1,63 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
4
3
|
from zoneinfo import ZoneInfo
|
|
5
4
|
|
|
6
|
-
from utilities.datetime import get_now, get_today
|
|
7
|
-
|
|
8
|
-
if TYPE_CHECKING:
|
|
9
|
-
import datetime as dt
|
|
10
|
-
|
|
11
|
-
|
|
12
5
|
HongKong = ZoneInfo("Asia/Hong_Kong")
|
|
13
6
|
Tokyo = ZoneInfo("Asia/Tokyo")
|
|
14
7
|
USCentral = ZoneInfo("US/Central")
|
|
15
8
|
USEastern = ZoneInfo("US/Eastern")
|
|
16
9
|
|
|
17
10
|
|
|
18
|
-
|
|
19
|
-
"""Get the current time in Hong Kong."""
|
|
20
|
-
return get_now(time_zone=HongKong)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
NOW_HONG_KONG = get_now_hong_kong()
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def get_now_tokyo() -> dt.datetime:
|
|
27
|
-
"""Get the current time in Tokyo."""
|
|
28
|
-
return get_now(time_zone=Tokyo)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
NOW_TOKYO = get_now_tokyo()
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def get_today_hong_kong() -> dt.date:
|
|
35
|
-
"""Get the current date in Hong Kong."""
|
|
36
|
-
return get_today(time_zone=HongKong)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
TODAY_HONG_KONG = get_today_hong_kong()
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def get_today_tokyo() -> dt.date:
|
|
43
|
-
"""Get the current date in Tokyo."""
|
|
44
|
-
return get_today(time_zone=Tokyo)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
TODAY_TOKYO = get_today_tokyo()
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
__all__ = [
|
|
51
|
-
"NOW_HONG_KONG",
|
|
52
|
-
"NOW_TOKYO",
|
|
53
|
-
"TODAY_HONG_KONG",
|
|
54
|
-
"TODAY_TOKYO",
|
|
55
|
-
"HongKong",
|
|
56
|
-
"Tokyo",
|
|
57
|
-
"USCentral",
|
|
58
|
-
"USEastern",
|
|
59
|
-
"get_now_hong_kong",
|
|
60
|
-
"get_now_tokyo",
|
|
61
|
-
"get_today_hong_kong",
|
|
62
|
-
"get_today_tokyo",
|
|
63
|
-
]
|
|
11
|
+
__all__ = ["HongKong", "Tokyo", "USCentral", "USEastern"]
|
utilities/tzlocal.py
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import datetime as dt
|
|
4
3
|
from logging import getLogger
|
|
5
|
-
from typing import TYPE_CHECKING
|
|
4
|
+
from typing import TYPE_CHECKING, cast
|
|
6
5
|
|
|
7
6
|
from tzlocal import get_localzone
|
|
8
7
|
|
|
9
8
|
if TYPE_CHECKING:
|
|
10
9
|
from zoneinfo import ZoneInfo
|
|
11
10
|
|
|
11
|
+
from utilities.types import TimeZone
|
|
12
|
+
|
|
12
13
|
|
|
13
14
|
def get_local_time_zone() -> ZoneInfo:
|
|
14
15
|
"""Get the local time zone, with the logging disabled."""
|
|
@@ -20,26 +21,8 @@ def get_local_time_zone() -> ZoneInfo:
|
|
|
20
21
|
return time_zone
|
|
21
22
|
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return dt.datetime.now(tz=get_local_time_zone())
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
NOW_LOCAL = get_now_local()
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def get_today_local() -> dt.date:
|
|
32
|
-
"""Get the current, timezone-aware local date."""
|
|
33
|
-
return get_now_local().date()
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
TODAY_LOCAL = get_today_local()
|
|
24
|
+
LOCAL_TIME_ZONE = get_local_time_zone()
|
|
25
|
+
LOCAL_TIME_ZONE_NAME = cast("TimeZone", LOCAL_TIME_ZONE.key)
|
|
37
26
|
|
|
38
27
|
|
|
39
|
-
__all__ = [
|
|
40
|
-
"NOW_LOCAL",
|
|
41
|
-
"TODAY_LOCAL",
|
|
42
|
-
"get_local_time_zone",
|
|
43
|
-
"get_now_local",
|
|
44
|
-
"get_today_local",
|
|
45
|
-
]
|
|
28
|
+
__all__ = ["LOCAL_TIME_ZONE", "LOCAL_TIME_ZONE_NAME", "get_local_time_zone"]
|
utilities/uuid.py
CHANGED
|
@@ -1,23 +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
|
|
13
|
+
|
|
10
14
|
|
|
11
15
|
UUID_PATTERN = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
|
|
12
16
|
UUID_EXACT_PATTERN = f"^{UUID_PATTERN}$"
|
|
13
17
|
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
##
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_uuid(seed: Seed | None = None, /) -> UUID:
|
|
16
23
|
"""Generate a UUID, possibly with a seed."""
|
|
17
24
|
if seed is None:
|
|
18
25
|
return uuid4()
|
|
19
|
-
state = get_state(seed
|
|
26
|
+
state = get_state(seed)
|
|
20
27
|
return UUID(int=state.getrandbits(128), version=4)
|
|
21
28
|
|
|
22
29
|
|
|
23
|
-
|
|
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 _ as 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
|
]
|