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.
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 TimeZoneLike
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
  ]