dycw-utilities 0.166.30__py3-none-any.whl → 0.185.8__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.185.8.dist-info/METADATA +33 -0
- dycw_utilities-0.185.8.dist-info/RECORD +90 -0
- {dycw_utilities-0.166.30.dist-info → dycw_utilities-0.185.8.dist-info}/WHEEL +1 -1
- {dycw_utilities-0.166.30.dist-info → dycw_utilities-0.185.8.dist-info}/entry_points.txt +1 -0
- utilities/__init__.py +1 -1
- utilities/altair.py +17 -10
- utilities/asyncio.py +50 -72
- utilities/atools.py +9 -11
- utilities/cachetools.py +16 -11
- utilities/click.py +76 -19
- utilities/concurrent.py +1 -1
- utilities/constants.py +492 -0
- utilities/contextlib.py +23 -30
- utilities/contextvars.py +1 -23
- utilities/core.py +2581 -0
- utilities/dataclasses.py +16 -119
- utilities/docker.py +387 -0
- utilities/enum.py +1 -1
- utilities/errors.py +2 -16
- utilities/fastapi.py +5 -5
- utilities/fpdf2.py +2 -1
- utilities/functions.py +34 -265
- utilities/http.py +2 -3
- utilities/hypothesis.py +84 -29
- utilities/importlib.py +17 -1
- utilities/iterables.py +39 -575
- utilities/jinja2.py +145 -0
- utilities/jupyter.py +5 -3
- utilities/libcst.py +1 -1
- utilities/lightweight_charts.py +4 -6
- utilities/logging.py +24 -24
- utilities/math.py +1 -36
- utilities/more_itertools.py +4 -6
- utilities/numpy.py +2 -1
- utilities/operator.py +2 -2
- utilities/orjson.py +42 -43
- utilities/os.py +4 -147
- utilities/packaging.py +129 -0
- utilities/parse.py +35 -15
- utilities/pathlib.py +3 -120
- utilities/platform.py +8 -90
- utilities/polars.py +38 -32
- utilities/postgres.py +37 -33
- utilities/pottery.py +20 -18
- utilities/pqdm.py +3 -4
- utilities/psutil.py +2 -3
- utilities/pydantic.py +25 -0
- utilities/pydantic_settings.py +87 -16
- utilities/pydantic_settings_sops.py +16 -3
- utilities/pyinstrument.py +4 -4
- utilities/pytest.py +96 -125
- utilities/pytest_plugins/pytest_regressions.py +2 -2
- utilities/pytest_regressions.py +32 -11
- utilities/random.py +2 -8
- utilities/redis.py +98 -94
- utilities/reprlib.py +11 -118
- utilities/shellingham.py +66 -0
- utilities/shutil.py +25 -0
- utilities/slack_sdk.py +13 -12
- utilities/sqlalchemy.py +57 -30
- utilities/sqlalchemy_polars.py +16 -25
- utilities/subprocess.py +2590 -0
- utilities/tabulate.py +32 -0
- utilities/testbook.py +8 -8
- utilities/text.py +24 -99
- utilities/throttle.py +159 -0
- utilities/time.py +18 -0
- utilities/timer.py +31 -14
- utilities/traceback.py +16 -23
- utilities/types.py +42 -2
- utilities/typing.py +26 -14
- utilities/uuid.py +1 -1
- utilities/version.py +202 -45
- utilities/whenever.py +53 -150
- dycw_utilities-0.166.30.dist-info/METADATA +0 -41
- dycw_utilities-0.166.30.dist-info/RECORD +0 -98
- dycw_utilities-0.166.30.dist-info/licenses/LICENSE +0 -21
- utilities/aeventkit.py +0 -388
- utilities/atomicwrites.py +0 -182
- utilities/cryptography.py +0 -41
- utilities/getpass.py +0 -8
- utilities/git.py +0 -19
- utilities/gzip.py +0 -31
- utilities/json.py +0 -70
- utilities/pickle.py +0 -25
- utilities/re.py +0 -156
- utilities/sentinel.py +0 -73
- utilities/socket.py +0 -8
- utilities/string.py +0 -20
- utilities/tempfile.py +0 -77
- utilities/typed_settings.py +0 -152
- utilities/tzdata.py +0 -11
- utilities/tzlocal.py +0 -28
- utilities/warnings.py +0 -65
- utilities/zipfile.py +0 -25
- utilities/zoneinfo.py +0 -133
utilities/whenever.py
CHANGED
|
@@ -32,13 +32,18 @@ from whenever import (
|
|
|
32
32
|
ZonedDateTime,
|
|
33
33
|
)
|
|
34
34
|
|
|
35
|
-
from utilities.
|
|
35
|
+
from utilities.constants import LOCAL_TIME_ZONE_NAME, UTC, Sentinel, sentinel
|
|
36
|
+
from utilities.core import (
|
|
37
|
+
get_now,
|
|
38
|
+
get_now_local,
|
|
39
|
+
get_time,
|
|
40
|
+
get_today,
|
|
41
|
+
replace_non_sentinel,
|
|
42
|
+
to_time_zone_name,
|
|
43
|
+
)
|
|
36
44
|
from utilities.functions import get_class_name
|
|
37
45
|
from utilities.math import sign
|
|
38
46
|
from utilities.platform import get_strftime
|
|
39
|
-
from utilities.sentinel import Sentinel, sentinel
|
|
40
|
-
from utilities.tzlocal import LOCAL_TIME_ZONE, LOCAL_TIME_ZONE_NAME
|
|
41
|
-
from utilities.zoneinfo import UTC, to_time_zone_name
|
|
42
47
|
|
|
43
48
|
if TYPE_CHECKING:
|
|
44
49
|
from utilities.types import (
|
|
@@ -53,13 +58,6 @@ if TYPE_CHECKING:
|
|
|
53
58
|
)
|
|
54
59
|
|
|
55
60
|
|
|
56
|
-
# bounds
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
ZONED_DATE_TIME_MIN = PlainDateTime.MIN.assume_tz(UTC.key)
|
|
60
|
-
ZONED_DATE_TIME_MAX = PlainDateTime.MAX.assume_tz(UTC.key)
|
|
61
|
-
|
|
62
|
-
|
|
63
61
|
DATE_TIME_DELTA_MIN = DateTimeDelta(
|
|
64
62
|
weeks=-521722,
|
|
65
63
|
days=-5,
|
|
@@ -80,10 +78,6 @@ DATE_TIME_DELTA_MAX = DateTimeDelta(
|
|
|
80
78
|
microseconds=999,
|
|
81
79
|
nanoseconds=999,
|
|
82
80
|
)
|
|
83
|
-
DATE_DELTA_MIN = DATE_TIME_DELTA_MIN.date_part()
|
|
84
|
-
DATE_DELTA_MAX = DATE_TIME_DELTA_MAX.date_part()
|
|
85
|
-
TIME_DELTA_MIN = TimeDelta(hours=-87831216)
|
|
86
|
-
TIME_DELTA_MAX = TimeDelta(hours=87831216)
|
|
87
81
|
|
|
88
82
|
|
|
89
83
|
DATE_TIME_DELTA_PARSABLE_MIN = DateTimeDelta(
|
|
@@ -115,22 +109,6 @@ DATE_TWO_DIGIT_YEAR_MAX = Date(DATE_TWO_DIGIT_YEAR_MIN.year + 99, 12, 31)
|
|
|
115
109
|
## common constants
|
|
116
110
|
|
|
117
111
|
|
|
118
|
-
ZERO_DAYS = DateDelta()
|
|
119
|
-
ZERO_TIME = TimeDelta()
|
|
120
|
-
MICROSECOND = TimeDelta(microseconds=1)
|
|
121
|
-
MILLISECOND = TimeDelta(milliseconds=1)
|
|
122
|
-
SECOND = TimeDelta(seconds=1)
|
|
123
|
-
MINUTE = TimeDelta(minutes=1)
|
|
124
|
-
HOUR = TimeDelta(hours=1)
|
|
125
|
-
DAY = DateDelta(days=1)
|
|
126
|
-
WEEK = DateDelta(weeks=1)
|
|
127
|
-
MONTH = DateDelta(months=1)
|
|
128
|
-
YEAR = DateDelta(years=1)
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
##
|
|
132
|
-
|
|
133
|
-
|
|
134
112
|
def add_year_month(x: YearMonth, /, *, years: int = 0, months: int = 0) -> YearMonth:
|
|
135
113
|
"""Add to a year-month."""
|
|
136
114
|
y = x.on_day(1) + DateDelta(years=years, months=months)
|
|
@@ -258,6 +236,7 @@ def datetime_utc(
|
|
|
258
236
|
month: int,
|
|
259
237
|
day: int,
|
|
260
238
|
/,
|
|
239
|
+
*,
|
|
261
240
|
hour: int = 0,
|
|
262
241
|
minute: int = 0,
|
|
263
242
|
second: int = 0,
|
|
@@ -360,74 +339,31 @@ def from_timestamp_nanos(i: int, /, *, time_zone: TimeZoneLike = UTC) -> ZonedDa
|
|
|
360
339
|
##
|
|
361
340
|
|
|
362
341
|
|
|
363
|
-
def
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
"""Get the current plain date-time in the local time-zone."""
|
|
389
|
-
return get_now_local().to_plain()
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
NOW_LOCAL_PLAIN = get_now_local_plain()
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
##
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
def get_time(time_zone: TimeZoneLike = UTC, /) -> Time:
|
|
399
|
-
"""Get the current time."""
|
|
400
|
-
return get_now(time_zone).time()
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
TIME_UTC = get_time(UTC)
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
def get_time_local() -> Time:
|
|
407
|
-
"""Get the current time in the local time-zone."""
|
|
408
|
-
return get_time(LOCAL_TIME_ZONE)
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
TIME_LOCAL = get_time_local()
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
##
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
def get_today(time_zone: TimeZoneLike = UTC, /) -> Date:
|
|
418
|
-
"""Get the current, timezone-aware local date."""
|
|
419
|
-
return get_now(time_zone).date()
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
TODAY_UTC = get_today(UTC)
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
def get_today_local() -> Date:
|
|
426
|
-
"""Get the current, timezone-aware local date."""
|
|
427
|
-
return get_today(LOCAL_TIME_ZONE)
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
TODAY_LOCAL = get_today_local()
|
|
342
|
+
def is_weekend(
|
|
343
|
+
date_time: ZonedDateTime,
|
|
344
|
+
/,
|
|
345
|
+
*,
|
|
346
|
+
start: tuple[Weekday, Time] = (Weekday.SATURDAY, Time.MIN),
|
|
347
|
+
end: tuple[Weekday, Time] = (Weekday.SUNDAY, Time.MAX),
|
|
348
|
+
) -> bool:
|
|
349
|
+
"""Check if a datetime is in the weekend."""
|
|
350
|
+
weekday, time = date_time.date().day_of_week(), date_time.time()
|
|
351
|
+
start_weekday, start_time = start
|
|
352
|
+
end_weekday, end_time = end
|
|
353
|
+
if start_weekday.value == end_weekday.value:
|
|
354
|
+
return start_time <= time <= end_time
|
|
355
|
+
if start_weekday.value < end_weekday.value:
|
|
356
|
+
return (
|
|
357
|
+
((weekday == start_weekday) and (time >= start_time))
|
|
358
|
+
or (start_weekday.value < weekday.value < end_weekday.value)
|
|
359
|
+
or ((weekday == end_weekday) and (time <= end_time))
|
|
360
|
+
)
|
|
361
|
+
return (
|
|
362
|
+
((weekday == start_weekday) and (time >= start_time))
|
|
363
|
+
or (weekday.value > start_weekday.value)
|
|
364
|
+
or (weekday.value < end_weekday.value)
|
|
365
|
+
or ((weekday == end_weekday) and (time <= end_time))
|
|
366
|
+
)
|
|
431
367
|
|
|
432
368
|
|
|
433
369
|
##
|
|
@@ -588,7 +524,7 @@ def _round_datetime_decompose(delta: Delta, /) -> tuple[int, _RoundDateOrDateTim
|
|
|
588
524
|
if (0 < hours < 24) and (24 % hours == 0):
|
|
589
525
|
return hours, "H"
|
|
590
526
|
raise _RoundDateOrDateTimeIncrementError(
|
|
591
|
-
|
|
527
|
+
delta=delta, increment=hours, divisor=24
|
|
592
528
|
)
|
|
593
529
|
try:
|
|
594
530
|
minutes = to_minutes(delta)
|
|
@@ -598,7 +534,7 @@ def _round_datetime_decompose(delta: Delta, /) -> tuple[int, _RoundDateOrDateTim
|
|
|
598
534
|
if (0 < minutes < 60) and (60 % minutes == 0):
|
|
599
535
|
return minutes, "M"
|
|
600
536
|
raise _RoundDateOrDateTimeIncrementError(
|
|
601
|
-
|
|
537
|
+
delta=delta, increment=minutes, divisor=60
|
|
602
538
|
)
|
|
603
539
|
try:
|
|
604
540
|
seconds = to_seconds(delta)
|
|
@@ -608,7 +544,7 @@ def _round_datetime_decompose(delta: Delta, /) -> tuple[int, _RoundDateOrDateTim
|
|
|
608
544
|
if (0 < seconds < 60) and (60 % seconds == 0):
|
|
609
545
|
return seconds, "S"
|
|
610
546
|
raise _RoundDateOrDateTimeIncrementError(
|
|
611
|
-
|
|
547
|
+
delta=delta, increment=seconds, divisor=60
|
|
612
548
|
)
|
|
613
549
|
try:
|
|
614
550
|
milliseconds = to_milliseconds(delta)
|
|
@@ -618,7 +554,7 @@ def _round_datetime_decompose(delta: Delta, /) -> tuple[int, _RoundDateOrDateTim
|
|
|
618
554
|
if (0 < milliseconds < 1000) and (1000 % milliseconds == 0):
|
|
619
555
|
return milliseconds, "ms"
|
|
620
556
|
raise _RoundDateOrDateTimeIncrementError(
|
|
621
|
-
|
|
557
|
+
delta=delta, increment=milliseconds, divisor=1000
|
|
622
558
|
)
|
|
623
559
|
try:
|
|
624
560
|
microseconds = to_microseconds(delta)
|
|
@@ -628,16 +564,16 @@ def _round_datetime_decompose(delta: Delta, /) -> tuple[int, _RoundDateOrDateTim
|
|
|
628
564
|
if (0 < microseconds < 1000) and (1000 % microseconds == 0):
|
|
629
565
|
return microseconds, "us"
|
|
630
566
|
raise _RoundDateOrDateTimeIncrementError(
|
|
631
|
-
|
|
567
|
+
delta=delta, increment=microseconds, divisor=1000
|
|
632
568
|
)
|
|
633
569
|
try:
|
|
634
570
|
nanoseconds = to_nanoseconds(delta)
|
|
635
571
|
except ToNanosecondsError:
|
|
636
|
-
raise
|
|
572
|
+
raise _RoundDateOrDateTimeInvalidDeltaError(delta=delta) from None
|
|
637
573
|
if (0 < nanoseconds < 1000) and (1000 % nanoseconds == 0):
|
|
638
574
|
return nanoseconds, "ns"
|
|
639
575
|
raise _RoundDateOrDateTimeIncrementError(
|
|
640
|
-
|
|
576
|
+
delta=delta, increment=nanoseconds, divisor=1000
|
|
641
577
|
)
|
|
642
578
|
|
|
643
579
|
|
|
@@ -757,22 +693,22 @@ class RoundDateOrDateTimeError(Exception): ...
|
|
|
757
693
|
|
|
758
694
|
@dataclass(kw_only=True, slots=True)
|
|
759
695
|
class _RoundDateOrDateTimeIncrementError(RoundDateOrDateTimeError):
|
|
760
|
-
|
|
696
|
+
delta: Delta
|
|
761
697
|
increment: int
|
|
762
698
|
divisor: int
|
|
763
699
|
|
|
764
700
|
@override
|
|
765
701
|
def __str__(self) -> str:
|
|
766
|
-
return f"
|
|
702
|
+
return f"Delta {self.delta} increment must be a proper divisor of {self.divisor}; got {self.increment}"
|
|
767
703
|
|
|
768
704
|
|
|
769
705
|
@dataclass(kw_only=True, slots=True)
|
|
770
|
-
class
|
|
771
|
-
|
|
706
|
+
class _RoundDateOrDateTimeInvalidDeltaError(RoundDateOrDateTimeError):
|
|
707
|
+
delta: Delta
|
|
772
708
|
|
|
773
709
|
@override
|
|
774
710
|
def __str__(self) -> str:
|
|
775
|
-
return f"
|
|
711
|
+
return f"Delta must be valid; got {self.delta}"
|
|
776
712
|
|
|
777
713
|
|
|
778
714
|
@dataclass(kw_only=True, slots=True)
|
|
@@ -892,7 +828,7 @@ def to_date(
|
|
|
892
828
|
case None:
|
|
893
829
|
return get_today(time_zone)
|
|
894
830
|
case str():
|
|
895
|
-
return Date.
|
|
831
|
+
return Date.parse_iso(date)
|
|
896
832
|
case dt.date():
|
|
897
833
|
return Date.from_py_date(date)
|
|
898
834
|
case Callable() as func:
|
|
@@ -1475,7 +1411,7 @@ def to_time(
|
|
|
1475
1411
|
case None:
|
|
1476
1412
|
return get_time(time_zone)
|
|
1477
1413
|
case str():
|
|
1478
|
-
return Time.
|
|
1414
|
+
return Time.parse_iso(time)
|
|
1479
1415
|
case dt.time():
|
|
1480
1416
|
return Time.from_py_time(time)
|
|
1481
1417
|
case Callable() as func:
|
|
@@ -1703,7 +1639,7 @@ def to_zoned_date_time(
|
|
|
1703
1639
|
case None:
|
|
1704
1640
|
return get_now(UTC if time_zone is None else time_zone)
|
|
1705
1641
|
case str() as text:
|
|
1706
|
-
date_time_use = ZonedDateTime.
|
|
1642
|
+
date_time_use = ZonedDateTime.parse_iso(text.replace("~", "/"))
|
|
1707
1643
|
case dt.datetime() as py_date_time:
|
|
1708
1644
|
if isinstance(date_time.tzinfo, ZoneInfo):
|
|
1709
1645
|
py_date_time_use = py_date_time
|
|
@@ -1767,7 +1703,7 @@ class WheneverLogRecord(LogRecord):
|
|
|
1767
1703
|
name, level, pathname, lineno, msg, args, exc_info, func, sinfo
|
|
1768
1704
|
)
|
|
1769
1705
|
length = self._get_length()
|
|
1770
|
-
plain = format(get_now_local().to_plain().
|
|
1706
|
+
plain = format(get_now_local().to_plain().format_iso(), f"{length}s")
|
|
1771
1707
|
self.zoned_datetime = f"{plain}[{LOCAL_TIME_ZONE_NAME}]"
|
|
1772
1708
|
|
|
1773
1709
|
@classmethod
|
|
@@ -1775,7 +1711,7 @@ class WheneverLogRecord(LogRecord):
|
|
|
1775
1711
|
def _get_length(cls) -> int:
|
|
1776
1712
|
"""Get maximum length of a formatted string."""
|
|
1777
1713
|
now = get_now_local().replace(nanosecond=1000).to_plain()
|
|
1778
|
-
return len(now.
|
|
1714
|
+
return len(now.format_iso())
|
|
1779
1715
|
|
|
1780
1716
|
|
|
1781
1717
|
##
|
|
@@ -1967,38 +1903,12 @@ class _ZonedDateTimePeriodExactEqError(ZonedDateTimePeriodError):
|
|
|
1967
1903
|
|
|
1968
1904
|
|
|
1969
1905
|
__all__ = [
|
|
1970
|
-
"DATE_DELTA_MAX",
|
|
1971
|
-
"DATE_DELTA_MIN",
|
|
1972
1906
|
"DATE_DELTA_PARSABLE_MAX",
|
|
1973
1907
|
"DATE_DELTA_PARSABLE_MIN",
|
|
1974
|
-
"DATE_TIME_DELTA_MAX",
|
|
1975
|
-
"DATE_TIME_DELTA_MIN",
|
|
1976
1908
|
"DATE_TIME_DELTA_PARSABLE_MAX",
|
|
1977
1909
|
"DATE_TIME_DELTA_PARSABLE_MIN",
|
|
1978
1910
|
"DATE_TWO_DIGIT_YEAR_MAX",
|
|
1979
1911
|
"DATE_TWO_DIGIT_YEAR_MIN",
|
|
1980
|
-
"DAY",
|
|
1981
|
-
"HOUR",
|
|
1982
|
-
"MICROSECOND",
|
|
1983
|
-
"MILLISECOND",
|
|
1984
|
-
"MINUTE",
|
|
1985
|
-
"MONTH",
|
|
1986
|
-
"NOW_LOCAL",
|
|
1987
|
-
"NOW_LOCAL_PLAIN",
|
|
1988
|
-
"NOW_PLAIN",
|
|
1989
|
-
"SECOND",
|
|
1990
|
-
"TIME_DELTA_MAX",
|
|
1991
|
-
"TIME_DELTA_MIN",
|
|
1992
|
-
"TIME_LOCAL",
|
|
1993
|
-
"TIME_UTC",
|
|
1994
|
-
"TODAY_LOCAL",
|
|
1995
|
-
"TODAY_UTC",
|
|
1996
|
-
"WEEK",
|
|
1997
|
-
"YEAR",
|
|
1998
|
-
"ZERO_DAYS",
|
|
1999
|
-
"ZERO_TIME",
|
|
2000
|
-
"ZONED_DATE_TIME_MAX",
|
|
2001
|
-
"ZONED_DATE_TIME_MIN",
|
|
2002
1912
|
"DatePeriod",
|
|
2003
1913
|
"DatePeriodError",
|
|
2004
1914
|
"MeanDateTimeError",
|
|
@@ -2025,14 +1935,7 @@ __all__ = [
|
|
|
2025
1935
|
"from_timestamp",
|
|
2026
1936
|
"from_timestamp_millis",
|
|
2027
1937
|
"from_timestamp_nanos",
|
|
2028
|
-
"
|
|
2029
|
-
"get_now_local",
|
|
2030
|
-
"get_now_local_plain",
|
|
2031
|
-
"get_now_plain",
|
|
2032
|
-
"get_time",
|
|
2033
|
-
"get_time_local",
|
|
2034
|
-
"get_today",
|
|
2035
|
-
"get_today_local",
|
|
1938
|
+
"is_weekend",
|
|
2036
1939
|
"mean_datetime",
|
|
2037
1940
|
"min_max_date",
|
|
2038
1941
|
"round_date_or_date_time",
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: dycw-utilities
|
|
3
|
-
Version: 0.166.30
|
|
4
|
-
Author-email: Derek Wan <d.wan@icloud.com>
|
|
5
|
-
License-File: LICENSE
|
|
6
|
-
Requires-Python: >=3.12
|
|
7
|
-
Requires-Dist: atomicwrites<1.5,>=1.4.1
|
|
8
|
-
Requires-Dist: typing-extensions<4.16,>=4.15.0
|
|
9
|
-
Requires-Dist: tzlocal<5.4,>=5.3.1
|
|
10
|
-
Requires-Dist: whenever<0.9,>=0.8.8
|
|
11
|
-
Provides-Extra: logging
|
|
12
|
-
Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
|
|
13
|
-
Provides-Extra: test
|
|
14
|
-
Requires-Dist: dycw-pytest-only<2.2,>=2.1.1; extra == 'test'
|
|
15
|
-
Requires-Dist: hypothesis<6.139,>=6.138.16; extra == 'test'
|
|
16
|
-
Requires-Dist: pytest-asyncio<1.3,>=1.2.0; extra == 'test'
|
|
17
|
-
Requires-Dist: pytest-cov<7.1,>=7.0.0; extra == 'test'
|
|
18
|
-
Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
|
|
19
|
-
Requires-Dist: pytest-lazy-fixtures<1.4,>=1.3.4; extra == 'test'
|
|
20
|
-
Requires-Dist: pytest-randomly<4.1,>=4.0.1; extra == 'test'
|
|
21
|
-
Requires-Dist: pytest-regressions<2.9,>=2.8.3; extra == 'test'
|
|
22
|
-
Requires-Dist: pytest-repeat<0.10,>=0.9.4; extra == 'test'
|
|
23
|
-
Requires-Dist: pytest-rerunfailures<16.1,>=16.0.1; extra == 'test'
|
|
24
|
-
Requires-Dist: pytest-rng<1.1,>=1.0.0; extra == 'test'
|
|
25
|
-
Requires-Dist: pytest-timeout<2.5,>=2.4.0; extra == 'test'
|
|
26
|
-
Requires-Dist: pytest-xdist<3.9,>=3.8.0; extra == 'test'
|
|
27
|
-
Requires-Dist: pytest<8.5,>=8.4.2; extra == 'test'
|
|
28
|
-
Requires-Dist: testbook<0.5,>=0.4.2; extra == 'test'
|
|
29
|
-
Description-Content-Type: text/markdown
|
|
30
|
-
|
|
31
|
-
[](https://badge.fury.io/py/dycw-utilities)
|
|
32
|
-
|
|
33
|
-
# `dycw-utilities`
|
|
34
|
-
|
|
35
|
-
[All the Python functions I don't want to write twice.](https://github.com/nvim-lua/plenary.nvim)
|
|
36
|
-
|
|
37
|
-
## Installation
|
|
38
|
-
|
|
39
|
-
- `pip install dycw-utilities`
|
|
40
|
-
|
|
41
|
-
or with [extras](https://github.com/dycw/python-utilities/blob/master/pyproject.toml).
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
utilities/__init__.py,sha256=1ZO_cavh1o4bHb63EXlMpG07TU7njs0GEuTie2-NSEo,61
|
|
2
|
-
utilities/aeventkit.py,sha256=ddoleSwW9zdc2tjX5Ge0pMKtYwV_JMxhHYOxnWX2AGM,12609
|
|
3
|
-
utilities/altair.py,sha256=nHdpWt8ZwdUwRQN970MvHd5bRWokNqzHcZQEdSHKRuE,9033
|
|
4
|
-
utilities/asyncio.py,sha256=60l1IwjnRGeaVphAFiwDIHyfKoZYKY-XGpptUxGiU-M,17034
|
|
5
|
-
utilities/atomicwrites.py,sha256=tPo6r-Rypd9u99u66B9z86YBPpnLrlHtwox_8Z7T34Y,5790
|
|
6
|
-
utilities/atools.py,sha256=6neeCcgXxK2dlsc0xp15Za7nSucbCgFtAJepGI_-WXU,2549
|
|
7
|
-
utilities/cachetools.py,sha256=v1-9sXHLdOLiwmkq6NB0OUbxeKBuVVN6wmAWefWoaHI,2744
|
|
8
|
-
utilities/click.py,sha256=RPdpxVt3cE2Ahbw0-ziMhvnsR05YSKNJxnmmjRD2zWQ,17449
|
|
9
|
-
utilities/concurrent.py,sha256=fHeW2SZ_TEMfFY0C8pyQI6aPlnecvx9x6SuUwBWj_JY,2853
|
|
10
|
-
utilities/contextlib.py,sha256=iP7R2tIm6ZsbfLD5ks6UKBYwj50e9gBI8AkpLN-chro,7476
|
|
11
|
-
utilities/contextvars.py,sha256=J8OhC7jqozAGYOCe2KUWysbPXNGe5JYz3HfaY_mIs08,883
|
|
12
|
-
utilities/cryptography.py,sha256=5PFrzsNUGHay91dFgYnDKwYprXxahrBqztmUqViRzBk,956
|
|
13
|
-
utilities/cvxpy.py,sha256=Rv1-fD-XYerosCavRF8Pohop2DBkU3AlFaGTfD8AEAA,13776
|
|
14
|
-
utilities/dataclasses.py,sha256=xbU3QN1GFy7RC6hIJRZIeUZm7YRlodrgEWmahWG6k2g,32465
|
|
15
|
-
utilities/enum.py,sha256=5l6pwZD1cjSlVW4ss-zBPspWvrbrYrdtJWcg6f5_J5w,5781
|
|
16
|
-
utilities/errors.py,sha256=mFlDGSM0LI1jZ1pbqwLAH3ttLZ2JVIxyZLojw8tGVZU,1479
|
|
17
|
-
utilities/fastapi.py,sha256=TqyKvBjiMS594sXPjrz-KRTLMb3l3D3rZ1zAYV7GfOk,1454
|
|
18
|
-
utilities/fpdf2.py,sha256=dSiYz0FJTD2sQuxpxqFWwwIe2-p6Y7oTB9Tv0Jajit0,1866
|
|
19
|
-
utilities/functions.py,sha256=82qCAaPIB0JmZ5wsQurA3MTYl7fh8LHcoBFkxPs7Zeg,21478
|
|
20
|
-
utilities/functools.py,sha256=I00ru2gQPakZw2SHVeKIKXfTv741655s6HI0lUoE0D4,1552
|
|
21
|
-
utilities/getpass.py,sha256=DfN5UgMAtFCqS3dSfFHUfqIMZX2shXvwphOz_6J6f6A,103
|
|
22
|
-
utilities/git.py,sha256=U1RFvCTANGENgx9wVBDvllioqBQZM2ns12ivKhOsaO4,414
|
|
23
|
-
utilities/gzip.py,sha256=fkGP3KdsBfXlstodT4wtlp-PwNyUsogpbDCVVVGdsm4,781
|
|
24
|
-
utilities/hashlib.py,sha256=SVTgtguur0P4elppvzOBbLEjVM3Pea0eWB61yg2ilxo,309
|
|
25
|
-
utilities/http.py,sha256=TsavEfHlRtlLaeV21Z6KZh0qbPw-kvD1zsQdZ7Kep5Q,977
|
|
26
|
-
utilities/hypothesis.py,sha256=CSCJFek07g71iSND7PCty7gyaOT_49QSbnTHn1wWidQ,45535
|
|
27
|
-
utilities/importlib.py,sha256=mV1xT_O_zt_GnZZ36tl3xOmMaN_3jErDWY54fX39F6Y,429
|
|
28
|
-
utilities/inflect.py,sha256=v7YkOWSu8NAmVghPcf4F3YBZQoJCS47_DLf9jbfWIs0,581
|
|
29
|
-
utilities/ipython.py,sha256=V2oMYHvEKvlNBzxDXdLvKi48oUq2SclRg5xasjaXStw,763
|
|
30
|
-
utilities/iterables.py,sha256=t2TsW-K3rVlS6y4_tqcc1fk9RwJV-bi7G_VwduMABK0,42558
|
|
31
|
-
utilities/json.py,sha256=-WcGtSsCr9Y42wHZzAMnfvU6ihAfVftylFfRUORaDFo,2102
|
|
32
|
-
utilities/jupyter.py,sha256=ft5JA7fBxXKzP-L9W8f2-wbF0QeYc_2uLQNFDVk4Z-M,2917
|
|
33
|
-
utilities/libcst.py,sha256=ngD4wxnR3Kh-RBVmU5l5ST7cuZLhMZwyMDjHZe5mhTs,5581
|
|
34
|
-
utilities/lightweight_charts.py,sha256=YM3ojBvJxuCSUBu_KrhFBmaMCvRPvupKC3qkm-UVZq4,2751
|
|
35
|
-
utilities/logging.py,sha256=W3d8Vby0mmqGWvTNlGtcfrmORDTt7abCuqjkIyCPIg8,18914
|
|
36
|
-
utilities/math.py,sha256=cevB-YyEYAzJTWtkAr7qeeu-hbxorDI3gMznXlmNQkw,26897
|
|
37
|
-
utilities/memory_profiler.py,sha256=XzN56jDCa5aqXS_DxEjb_K4L6aIWh_5zyKi6OhcIxw0,853
|
|
38
|
-
utilities/modules.py,sha256=iuvLluJya-hvl1Q25-Jk3dLgx2Es3ck4SjJiEkAlVTs,3195
|
|
39
|
-
utilities/more_itertools.py,sha256=syfIPhQF_WS-YiicdGe2h5F1G-Ld12Q2XsVduL2hA40,10908
|
|
40
|
-
utilities/numpy.py,sha256=Xn23sA2ZbVNqwUYEgNJD3XBYH6IbCri_WkHSNhg3NkY,26122
|
|
41
|
-
utilities/operator.py,sha256=C3NylZWGTVWRpwYHOPVhaLgRhw0DfpS4_XQ8KfPhBLQ,3613
|
|
42
|
-
utilities/optuna.py,sha256=C-fhWYiXHVPo1l8QctYkFJ4DyhbSrGorzP1dJb_qvd8,1933
|
|
43
|
-
utilities/orjson.py,sha256=rII_rINPcH9X0CfL_WeFjwHgKNkKAF-TVS5rnpLHjzc,41998
|
|
44
|
-
utilities/os.py,sha256=MQxP4yVsV0sg8nPQyC8rctnimJdys_PvzxqDZfVzMMs,3935
|
|
45
|
-
utilities/parse.py,sha256=JcJn5yXKhIWXBCwgBdPsyu7Hvcuw6kyEdqvaebCaI9k,17951
|
|
46
|
-
utilities/pathlib.py,sha256=X6pHmfT3hnBGysdTr73uHsNaBEgKviZhk7aGWvEXDXo,8912
|
|
47
|
-
utilities/pickle.py,sha256=MBT2xZCsv0pH868IXLGKnlcqNx2IRVKYNpRcqiQQqxw,653
|
|
48
|
-
utilities/platform.py,sha256=pTn7gw6N4T6LdKrf0virwarof_mze9WtoQlrGMzhGVI,2798
|
|
49
|
-
utilities/polars.py,sha256=qsiYY9p_41fORGnc7HNkA4zhlsycK7sgD74xuigMDAc,87466
|
|
50
|
-
utilities/polars_ols.py,sha256=LNTFNLPuYW7fcAHymlbnams_DhitToblYvib3mhKbwI,5615
|
|
51
|
-
utilities/postgres.py,sha256=ynCTTaF-bVEOSW-KEAR-dlLh_hYjeVVjm__-4pEU8Zk,12269
|
|
52
|
-
utilities/pottery.py,sha256=nA0SsF9irvfC0tk68YAr08tuL9lGRSlBKihSx7Ibk84,3963
|
|
53
|
-
utilities/pqdm.py,sha256=idv2seRVP2f6NeSfpeEnT5A-tQezaHZKDyeu16g2-0E,3091
|
|
54
|
-
utilities/psutil.py,sha256=KUlu4lrUw9Zg1V7ZGetpWpGb9DB8l_SSDWGbANFNCPU,2104
|
|
55
|
-
utilities/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
-
utilities/pydantic_settings.py,sha256=bFr9UDrVhdqTl7O_TPutCLdsQ5rUp--nO76-_F8z0bs,5102
|
|
57
|
-
utilities/pydantic_settings_sops.py,sha256=m2uB9wDw1PU2CiSL7KwxulDXT0STjOZTu3Ctc2q7jc0,1943
|
|
58
|
-
utilities/pyinstrument.py,sha256=hnXaL-4HE7wWBI5JKaPfYTpsrXe68YiuZKahHV0VJn8,841
|
|
59
|
-
utilities/pytest.py,sha256=4KzMZYg5Zzfyjxrw8VlnZNYCD2S0Uee1JIFMIPyIkO8,10076
|
|
60
|
-
utilities/pytest_regressions.py,sha256=ocjHTtfOeiGfQAKIei8pKNd61sxN9dawrJJ9gPt2wzA,4097
|
|
61
|
-
utilities/random.py,sha256=hZlH4gnAtoaofWswuJYjcygejrY8db4CzP-z_adO2Mo,4165
|
|
62
|
-
utilities/re.py,sha256=S4h-DLL6ScMPqjboZ_uQ1BVTJajrqV06r_81D--_HCE,4573
|
|
63
|
-
utilities/redis.py,sha256=gybjqKea33Jy50n4dHTS14JdquqHaJqHF2dixQljYWQ,30172
|
|
64
|
-
utilities/reprlib.py,sha256=ssYTcBW-TeRh3fhCJv57sopTZHF5FrPyyUg9yp5XBlo,3953
|
|
65
|
-
utilities/scipy.py,sha256=wZJM7fEgBAkLSYYvSmsg5ac-QuwAI0BGqHVetw1_Hb0,947
|
|
66
|
-
utilities/sentinel.py,sha256=A_p5jX2K0Yc5XBfoYHyBLqHsEWzE1ByOdDuzzA2pZnE,1434
|
|
67
|
-
utilities/shelve.py,sha256=4OzjQI6kGuUbJciqf535rwnao-_IBv66gsT6tRGiUt0,759
|
|
68
|
-
utilities/slack_sdk.py,sha256=76-DYtcGiUhEvl-voMamc5OjfF7Y7nCq54Bys1arqzw,2233
|
|
69
|
-
utilities/socket.py,sha256=K77vfREvzoVTrpYKo6MZakol0EYu2q1sWJnnZqL0So0,118
|
|
70
|
-
utilities/sqlalchemy.py,sha256=X_F4Vq3t0ftgmhYdrs1DOMrI4ls5Tw_ddcW7dmhQaPY,36407
|
|
71
|
-
utilities/sqlalchemy_polars.py,sha256=JCGhB37raSR7fqeWV5dTsciRTMVzIdVT9YSqKT0piT0,13370
|
|
72
|
-
utilities/statsmodels.py,sha256=koyiBHvpMcSiBfh99wFUfSggLNx7cuAw3rwyfAhoKpQ,3410
|
|
73
|
-
utilities/string.py,sha256=shmBK87zZwzGyixuNuXCiUbqzfeZ9xlrFwz6JTaRvDk,582
|
|
74
|
-
utilities/tempfile.py,sha256=HxB2BF28CcecDJLQ3Bx2Ej-Pb6RJc6W9ngSpB9CnP4k,2018
|
|
75
|
-
utilities/testbook.py,sha256=j1KmaVbrX9VrbeMgtPh5gk55myAsn3dyRUn7jGbPbRk,1294
|
|
76
|
-
utilities/text.py,sha256=GkjXhJk1UbKEoh2VnMR6UfmunuCwCL4pa-2AmgKE2pU,13666
|
|
77
|
-
utilities/threading.py,sha256=GvBOp4CyhHfN90wGXZuA2VKe9fGzMaEa7oCl4f3nnPU,1009
|
|
78
|
-
utilities/timer.py,sha256=oXfTii6ymu57niP0BDGZjFD55LEHi2a19kqZKiTgaFQ,2588
|
|
79
|
-
utilities/traceback.py,sha256=-tgTUnryG7Bu2tOXjURIIpC4ohIVBzVAxIj6Kf3xxCM,9615
|
|
80
|
-
utilities/typed_settings.py,sha256=bCGybctbjNDEbUBCvQFhKitRFrk9ixImpvbIpshgbtA,4644
|
|
81
|
-
utilities/types.py,sha256=IlRrCtPdLkGYVfpe-QIg2qNUgBr8OJNN7BhTKxnhh-M,18817
|
|
82
|
-
utilities/typing.py,sha256=QYoCIc71e_u5W-kBeiNzrD-GXxpLtMOGc9PqgZjMXeE,25274
|
|
83
|
-
utilities/tzdata.py,sha256=fgNVj66yUbCSI_-vrRVzSD3gtf-L_8IEJEPjP_Jel5Y,266
|
|
84
|
-
utilities/tzlocal.py,sha256=KyCXEgCTjqGFx-389JdTuhMRUaT06U1RCMdWoED-qro,728
|
|
85
|
-
utilities/uuid.py,sha256=nQZs6tFX4mqtc2Ku3KqjloYCqwpTKeTj8eKwQwh3FQI,1572
|
|
86
|
-
utilities/version.py,sha256=ipBj5-WYY_nelp2uwFlApfWWCzTLzPwpovUi9x_OBMs,5085
|
|
87
|
-
utilities/warnings.py,sha256=un1LvHv70PU-LLv8RxPVmugTzDJkkGXRMZTE2-fTQHw,1771
|
|
88
|
-
utilities/whenever.py,sha256=0N5JcZU9cPyIrkTN3wqdcR86PsmIKVlLI1yU1aEbIgk,59198
|
|
89
|
-
utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
|
|
90
|
-
utilities/zoneinfo.py,sha256=tdIScrTB2-B-LH0ukb1HUXKooLknOfJNwHk10MuMYvA,3619
|
|
91
|
-
utilities/pytest_plugins/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
|
|
92
|
-
utilities/pytest_plugins/pytest_randomly.py,sha256=B1qYVlExGOxTywq2r1SMi5o7btHLk2PNdY_b1p98dkE,409
|
|
93
|
-
utilities/pytest_plugins/pytest_regressions.py,sha256=mnHYBfdprz50UGVkVzV1bZERZN5CFfoF8YbokGxdFwU,1639
|
|
94
|
-
dycw_utilities-0.166.30.dist-info/METADATA,sha256=lYac7uqJTy4ACG9-MmZeajuG8tiZBsBMh5kU0irWduQ,1700
|
|
95
|
-
dycw_utilities-0.166.30.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
96
|
-
dycw_utilities-0.166.30.dist-info/entry_points.txt,sha256=BOD_SoDxwsfJYOLxhrSXhHP_T7iw-HXI9f2WVkzYxvQ,135
|
|
97
|
-
dycw_utilities-0.166.30.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
|
|
98
|
-
dycw_utilities-0.166.30.dist-info/RECORD,,
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 Derek Wan
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|