dycw-utilities 0.131.10__py3-none-any.whl → 0.131.12__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.131.10.dist-info → dycw_utilities-0.131.12.dist-info}/METADATA +1 -1
- {dycw_utilities-0.131.10.dist-info → dycw_utilities-0.131.12.dist-info}/RECORD +21 -21
- utilities/__init__.py +1 -1
- utilities/click.py +6 -6
- utilities/datetime.py +11 -18
- utilities/fastapi.py +2 -4
- utilities/fpdf2.py +2 -2
- utilities/hypothesis.py +8 -11
- utilities/logging.py +54 -69
- utilities/math.py +10 -9
- utilities/orjson.py +46 -45
- utilities/pyinstrument.py +2 -3
- utilities/re.py +12 -13
- utilities/traceback.py +18 -21
- utilities/types.py +49 -10
- utilities/typing.py +25 -1
- utilities/tzlocal.py +2 -26
- utilities/whenever.py +6 -6
- utilities/whenever2.py +68 -2
- {dycw_utilities-0.131.10.dist-info → dycw_utilities-0.131.12.dist-info}/WHEEL +0 -0
- {dycw_utilities-0.131.10.dist-info → dycw_utilities-0.131.12.dist-info}/licenses/LICENSE +0 -0
utilities/whenever2.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import datetime as dt
|
4
|
+
from collections.abc import Callable
|
4
5
|
from functools import cache
|
5
6
|
from logging import LogRecord
|
6
|
-
from typing import TYPE_CHECKING, Any, override
|
7
|
+
from typing import TYPE_CHECKING, Any, assert_never, overload, override
|
7
8
|
|
8
9
|
from whenever import (
|
9
10
|
Date,
|
@@ -15,12 +16,19 @@ from whenever import (
|
|
15
16
|
ZonedDateTime,
|
16
17
|
)
|
17
18
|
|
19
|
+
from utilities.datetime import maybe_sub_pct_y
|
20
|
+
from utilities.sentinel import Sentinel, sentinel
|
21
|
+
from utilities.tzlocal import LOCAL_TIME_ZONE_NAME
|
18
22
|
from utilities.zoneinfo import UTC, get_time_zone_name
|
19
23
|
|
20
24
|
if TYPE_CHECKING:
|
21
25
|
from zoneinfo import ZoneInfo
|
22
26
|
|
23
|
-
from utilities.types import
|
27
|
+
from utilities.types import (
|
28
|
+
MaybeCallableDate,
|
29
|
+
MaybeCallableZonedDateTime,
|
30
|
+
TimeZoneLike,
|
31
|
+
)
|
24
32
|
|
25
33
|
|
26
34
|
## bounds
|
@@ -66,6 +74,15 @@ WEEK = DateDelta(weeks=1)
|
|
66
74
|
##
|
67
75
|
|
68
76
|
|
77
|
+
def format_compact(datetime: ZonedDateTime, /) -> str:
|
78
|
+
"""Convert a zoned datetime to the local time zone, then format."""
|
79
|
+
py_datetime = datetime.round().to_tz(LOCAL_TIME_ZONE_NAME).to_plain().py_datetime()
|
80
|
+
return py_datetime.strftime(maybe_sub_pct_y("%Y%m%dT%H%M%S"))
|
81
|
+
|
82
|
+
|
83
|
+
##
|
84
|
+
|
85
|
+
|
69
86
|
def from_timestamp(i: float, /, *, time_zone: TimeZoneLike = UTC) -> ZonedDateTime:
|
70
87
|
"""Get a zoned datetime from a timestamp."""
|
71
88
|
return ZonedDateTime.from_timestamp(i, tz=get_time_zone_name(time_zone))
|
@@ -118,6 +135,52 @@ def get_today_local() -> Date:
|
|
118
135
|
|
119
136
|
TODAY_LOCAL = get_today_local()
|
120
137
|
|
138
|
+
##
|
139
|
+
|
140
|
+
|
141
|
+
@overload
|
142
|
+
def to_date(*, date: MaybeCallableDate) -> Date: ...
|
143
|
+
@overload
|
144
|
+
def to_date(*, date: None) -> None: ...
|
145
|
+
@overload
|
146
|
+
def to_date(*, date: Sentinel) -> Sentinel: ...
|
147
|
+
@overload
|
148
|
+
def to_date(*, date: MaybeCallableDate | Sentinel) -> Date | Sentinel: ...
|
149
|
+
@overload
|
150
|
+
def to_date(
|
151
|
+
*, date: MaybeCallableDate | None | Sentinel = sentinel
|
152
|
+
) -> Date | None | Sentinel: ...
|
153
|
+
def to_date(
|
154
|
+
*, date: MaybeCallableDate | None | Sentinel = sentinel
|
155
|
+
) -> Date | None | Sentinel:
|
156
|
+
"""Get the date."""
|
157
|
+
match date:
|
158
|
+
case Date() | None | Sentinel():
|
159
|
+
return date
|
160
|
+
case Callable() as func:
|
161
|
+
return to_date(date=func())
|
162
|
+
case _ as never:
|
163
|
+
assert_never(never)
|
164
|
+
|
165
|
+
|
166
|
+
@overload
|
167
|
+
def to_zoned_date_time(*, date_time: MaybeCallableZonedDateTime) -> ZonedDateTime: ...
|
168
|
+
@overload
|
169
|
+
def to_zoned_date_time(*, date_time: None) -> None: ...
|
170
|
+
@overload
|
171
|
+
def to_zoned_date_time(*, date_time: Sentinel) -> Sentinel: ...
|
172
|
+
def to_zoned_date_time(
|
173
|
+
*, date_time: MaybeCallableZonedDateTime | None | Sentinel = sentinel
|
174
|
+
) -> ZonedDateTime | None | Sentinel:
|
175
|
+
"""Resolve into a zoned date_time."""
|
176
|
+
match date_time:
|
177
|
+
case ZonedDateTime() | None | Sentinel():
|
178
|
+
return date_time
|
179
|
+
case Callable() as func:
|
180
|
+
return to_zoned_date_time(date_time=func())
|
181
|
+
case _ as never:
|
182
|
+
assert_never(never)
|
183
|
+
|
121
184
|
|
122
185
|
##
|
123
186
|
|
@@ -203,6 +266,7 @@ __all__ = [
|
|
203
266
|
"ZONED_DATE_TIME_MAX",
|
204
267
|
"ZONED_DATE_TIME_MIN",
|
205
268
|
"WheneverLogRecord",
|
269
|
+
"format_compact",
|
206
270
|
"from_timestamp",
|
207
271
|
"from_timestamp_millis",
|
208
272
|
"from_timestamp_nanos",
|
@@ -210,4 +274,6 @@ __all__ = [
|
|
210
274
|
"get_now_local",
|
211
275
|
"get_today",
|
212
276
|
"get_today_local",
|
277
|
+
"to_date",
|
278
|
+
"to_zoned_date_time",
|
213
279
|
]
|
File without changes
|
File without changes
|