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.
Files changed (103) hide show
  1. dycw_utilities-0.175.17.dist-info/METADATA +34 -0
  2. dycw_utilities-0.175.17.dist-info/RECORD +103 -0
  3. dycw_utilities-0.175.17.dist-info/WHEEL +4 -0
  4. dycw_utilities-0.175.17.dist-info/entry_points.txt +4 -0
  5. utilities/__init__.py +1 -1
  6. utilities/altair.py +14 -14
  7. utilities/asyncio.py +350 -819
  8. utilities/atomicwrites.py +18 -6
  9. utilities/atools.py +77 -22
  10. utilities/cachetools.py +24 -29
  11. utilities/click.py +393 -237
  12. utilities/concurrent.py +8 -11
  13. utilities/contextlib.py +216 -17
  14. utilities/contextvars.py +20 -1
  15. utilities/cryptography.py +3 -3
  16. utilities/dataclasses.py +83 -118
  17. utilities/docker.py +293 -0
  18. utilities/enum.py +26 -23
  19. utilities/errors.py +17 -3
  20. utilities/fastapi.py +29 -65
  21. utilities/fpdf2.py +3 -3
  22. utilities/functions.py +169 -416
  23. utilities/functools.py +18 -19
  24. utilities/git.py +9 -30
  25. utilities/grp.py +28 -0
  26. utilities/gzip.py +31 -0
  27. utilities/http.py +3 -2
  28. utilities/hypothesis.py +738 -589
  29. utilities/importlib.py +17 -1
  30. utilities/inflect.py +25 -0
  31. utilities/iterables.py +194 -262
  32. utilities/jinja2.py +148 -0
  33. utilities/json.py +70 -0
  34. utilities/libcst.py +38 -17
  35. utilities/lightweight_charts.py +5 -9
  36. utilities/logging.py +345 -543
  37. utilities/math.py +18 -13
  38. utilities/memory_profiler.py +11 -15
  39. utilities/more_itertools.py +200 -131
  40. utilities/operator.py +33 -29
  41. utilities/optuna.py +6 -6
  42. utilities/orjson.py +272 -137
  43. utilities/os.py +61 -4
  44. utilities/parse.py +59 -61
  45. utilities/pathlib.py +281 -40
  46. utilities/permissions.py +298 -0
  47. utilities/pickle.py +2 -2
  48. utilities/platform.py +24 -5
  49. utilities/polars.py +1214 -430
  50. utilities/polars_ols.py +1 -1
  51. utilities/postgres.py +408 -0
  52. utilities/pottery.py +113 -26
  53. utilities/pqdm.py +10 -11
  54. utilities/psutil.py +6 -57
  55. utilities/pwd.py +28 -0
  56. utilities/pydantic.py +4 -54
  57. utilities/pydantic_settings.py +240 -0
  58. utilities/pydantic_settings_sops.py +76 -0
  59. utilities/pyinstrument.py +8 -10
  60. utilities/pytest.py +227 -121
  61. utilities/pytest_plugins/__init__.py +1 -0
  62. utilities/pytest_plugins/pytest_randomly.py +23 -0
  63. utilities/pytest_plugins/pytest_regressions.py +56 -0
  64. utilities/pytest_regressions.py +26 -46
  65. utilities/random.py +13 -9
  66. utilities/re.py +58 -28
  67. utilities/redis.py +401 -550
  68. utilities/scipy.py +1 -1
  69. utilities/sentinel.py +10 -0
  70. utilities/shelve.py +4 -1
  71. utilities/shutil.py +25 -0
  72. utilities/slack_sdk.py +36 -106
  73. utilities/sqlalchemy.py +502 -473
  74. utilities/sqlalchemy_polars.py +38 -94
  75. utilities/string.py +2 -3
  76. utilities/subprocess.py +1572 -0
  77. utilities/tempfile.py +86 -4
  78. utilities/testbook.py +50 -0
  79. utilities/text.py +165 -42
  80. utilities/timer.py +37 -65
  81. utilities/traceback.py +158 -929
  82. utilities/types.py +146 -116
  83. utilities/typing.py +531 -71
  84. utilities/tzdata.py +1 -53
  85. utilities/tzlocal.py +6 -23
  86. utilities/uuid.py +43 -5
  87. utilities/version.py +27 -26
  88. utilities/whenever.py +1776 -386
  89. utilities/zoneinfo.py +84 -22
  90. dycw_utilities-0.129.10.dist-info/METADATA +0 -241
  91. dycw_utilities-0.129.10.dist-info/RECORD +0 -96
  92. dycw_utilities-0.129.10.dist-info/WHEEL +0 -4
  93. dycw_utilities-0.129.10.dist-info/licenses/LICENSE +0 -21
  94. utilities/datetime.py +0 -1409
  95. utilities/eventkit.py +0 -402
  96. utilities/loguru.py +0 -144
  97. utilities/luigi.py +0 -228
  98. utilities/period.py +0 -324
  99. utilities/pyrsistent.py +0 -89
  100. utilities/python_dotenv.py +0 -105
  101. utilities/streamlit.py +0 -105
  102. utilities/sys.py +0 -87
  103. 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
- def get_now_hong_kong() -> dt.datetime:
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
- def get_now_local() -> dt.datetime:
24
- """Get the current local time."""
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 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
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
- def get_uuid(*, seed: Seed | None = None) -> UUID:
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=seed)
26
+ state = get_state(seed)
20
27
  return UUID(int=state.getrandbits(128), version=4)
21
28
 
22
29
 
23
- __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 _ 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
  ]