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.
Files changed (96) hide show
  1. dycw_utilities-0.185.8.dist-info/METADATA +33 -0
  2. dycw_utilities-0.185.8.dist-info/RECORD +90 -0
  3. {dycw_utilities-0.166.30.dist-info → dycw_utilities-0.185.8.dist-info}/WHEEL +1 -1
  4. {dycw_utilities-0.166.30.dist-info → dycw_utilities-0.185.8.dist-info}/entry_points.txt +1 -0
  5. utilities/__init__.py +1 -1
  6. utilities/altair.py +17 -10
  7. utilities/asyncio.py +50 -72
  8. utilities/atools.py +9 -11
  9. utilities/cachetools.py +16 -11
  10. utilities/click.py +76 -19
  11. utilities/concurrent.py +1 -1
  12. utilities/constants.py +492 -0
  13. utilities/contextlib.py +23 -30
  14. utilities/contextvars.py +1 -23
  15. utilities/core.py +2581 -0
  16. utilities/dataclasses.py +16 -119
  17. utilities/docker.py +387 -0
  18. utilities/enum.py +1 -1
  19. utilities/errors.py +2 -16
  20. utilities/fastapi.py +5 -5
  21. utilities/fpdf2.py +2 -1
  22. utilities/functions.py +34 -265
  23. utilities/http.py +2 -3
  24. utilities/hypothesis.py +84 -29
  25. utilities/importlib.py +17 -1
  26. utilities/iterables.py +39 -575
  27. utilities/jinja2.py +145 -0
  28. utilities/jupyter.py +5 -3
  29. utilities/libcst.py +1 -1
  30. utilities/lightweight_charts.py +4 -6
  31. utilities/logging.py +24 -24
  32. utilities/math.py +1 -36
  33. utilities/more_itertools.py +4 -6
  34. utilities/numpy.py +2 -1
  35. utilities/operator.py +2 -2
  36. utilities/orjson.py +42 -43
  37. utilities/os.py +4 -147
  38. utilities/packaging.py +129 -0
  39. utilities/parse.py +35 -15
  40. utilities/pathlib.py +3 -120
  41. utilities/platform.py +8 -90
  42. utilities/polars.py +38 -32
  43. utilities/postgres.py +37 -33
  44. utilities/pottery.py +20 -18
  45. utilities/pqdm.py +3 -4
  46. utilities/psutil.py +2 -3
  47. utilities/pydantic.py +25 -0
  48. utilities/pydantic_settings.py +87 -16
  49. utilities/pydantic_settings_sops.py +16 -3
  50. utilities/pyinstrument.py +4 -4
  51. utilities/pytest.py +96 -125
  52. utilities/pytest_plugins/pytest_regressions.py +2 -2
  53. utilities/pytest_regressions.py +32 -11
  54. utilities/random.py +2 -8
  55. utilities/redis.py +98 -94
  56. utilities/reprlib.py +11 -118
  57. utilities/shellingham.py +66 -0
  58. utilities/shutil.py +25 -0
  59. utilities/slack_sdk.py +13 -12
  60. utilities/sqlalchemy.py +57 -30
  61. utilities/sqlalchemy_polars.py +16 -25
  62. utilities/subprocess.py +2590 -0
  63. utilities/tabulate.py +32 -0
  64. utilities/testbook.py +8 -8
  65. utilities/text.py +24 -99
  66. utilities/throttle.py +159 -0
  67. utilities/time.py +18 -0
  68. utilities/timer.py +31 -14
  69. utilities/traceback.py +16 -23
  70. utilities/types.py +42 -2
  71. utilities/typing.py +26 -14
  72. utilities/uuid.py +1 -1
  73. utilities/version.py +202 -45
  74. utilities/whenever.py +53 -150
  75. dycw_utilities-0.166.30.dist-info/METADATA +0 -41
  76. dycw_utilities-0.166.30.dist-info/RECORD +0 -98
  77. dycw_utilities-0.166.30.dist-info/licenses/LICENSE +0 -21
  78. utilities/aeventkit.py +0 -388
  79. utilities/atomicwrites.py +0 -182
  80. utilities/cryptography.py +0 -41
  81. utilities/getpass.py +0 -8
  82. utilities/git.py +0 -19
  83. utilities/gzip.py +0 -31
  84. utilities/json.py +0 -70
  85. utilities/pickle.py +0 -25
  86. utilities/re.py +0 -156
  87. utilities/sentinel.py +0 -73
  88. utilities/socket.py +0 -8
  89. utilities/string.py +0 -20
  90. utilities/tempfile.py +0 -77
  91. utilities/typed_settings.py +0 -152
  92. utilities/tzdata.py +0 -11
  93. utilities/tzlocal.py +0 -28
  94. utilities/warnings.py +0 -65
  95. utilities/zipfile.py +0 -25
  96. 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.dataclasses import replace_non_sentinel
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 get_now(time_zone: TimeZoneLike = UTC, /) -> ZonedDateTime:
364
- """Get the current zoned date-time."""
365
- return ZonedDateTime.now(to_time_zone_name(time_zone))
366
-
367
-
368
- NOW_UTC = get_now(UTC)
369
-
370
-
371
- def get_now_local() -> ZonedDateTime:
372
- """Get the current zoned date-time in the local time-zone."""
373
- return get_now(LOCAL_TIME_ZONE)
374
-
375
-
376
- NOW_LOCAL = get_now_local()
377
-
378
-
379
- def get_now_plain(time_zone: TimeZoneLike = UTC, /) -> PlainDateTime:
380
- """Get the current plain date-time."""
381
- return get_now(time_zone).to_plain()
382
-
383
-
384
- NOW_PLAIN = get_now_plain()
385
-
386
-
387
- def get_now_local_plain() -> PlainDateTime:
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
- duration=delta, increment=hours, divisor=24
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
- duration=delta, increment=minutes, divisor=60
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
- duration=delta, increment=seconds, divisor=60
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
- duration=delta, increment=milliseconds, divisor=1000
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
- duration=delta, increment=microseconds, divisor=1000
567
+ delta=delta, increment=microseconds, divisor=1000
632
568
  )
633
569
  try:
634
570
  nanoseconds = to_nanoseconds(delta)
635
571
  except ToNanosecondsError:
636
- raise _RoundDateOrDateTimeInvalidDurationError(duration=delta) from None
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
- duration=delta, increment=nanoseconds, divisor=1000
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
- duration: Delta
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"Duration {self.duration} increment must be a proper divisor of {self.divisor}; got {self.increment}"
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 _RoundDateOrDateTimeInvalidDurationError(RoundDateOrDateTimeError):
771
- duration: Delta
706
+ class _RoundDateOrDateTimeInvalidDeltaError(RoundDateOrDateTimeError):
707
+ delta: Delta
772
708
 
773
709
  @override
774
710
  def __str__(self) -> str:
775
- return f"Duration must be valid; got {self.duration}"
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.parse_common_iso(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.parse_common_iso(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.parse_common_iso(text.replace("~", "/"))
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().format_common_iso(), f"{length}s")
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.format_common_iso())
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
- "get_now",
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
- [![PyPI version](https://badge.fury.io/py/dycw-utilities.svg)](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.