dycw-utilities 0.131.3__py3-none-any.whl → 0.131.5__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.
@@ -0,0 +1,39 @@
1
+ Metadata-Version: 2.4
2
+ Name: dycw-utilities
3
+ Version: 0.131.5
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.15,>=4.14.0
9
+ Requires-Dist: tzlocal<5.4,>=5.3.1
10
+ Requires-Dist: whenever<0.9,>=0.8.5
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.136,>=6.135.2; extra == 'test'
16
+ Requires-Dist: pytest-asyncio<1.1,>=1.0.0; extra == 'test'
17
+ Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
18
+ Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
19
+ Requires-Dist: pytest-lazy-fixtures<1.2,>=1.1.4; extra == 'test'
20
+ Requires-Dist: pytest-randomly<3.17,>=3.16.0; extra == 'test'
21
+ Requires-Dist: pytest-regressions<2.9,>=2.8.0; extra == 'test'
22
+ Requires-Dist: pytest-rerunfailures<16,>=15.1; extra == 'test'
23
+ Requires-Dist: pytest-rng<1.1,>=1.0.0; extra == 'test'
24
+ Requires-Dist: pytest-timeout<2.5,>=2.4.0; extra == 'test'
25
+ Requires-Dist: pytest-xdist<3.8,>=3.7.0; extra == 'test'
26
+ Requires-Dist: pytest<8.4,>=8.3.5; extra == 'test'
27
+ Description-Content-Type: text/markdown
28
+
29
+ [![PyPI version](https://badge.fury.io/py/dycw-utilities.svg)](https://badge.fury.io/py/dycw-utilities)
30
+
31
+ # `dycw-utilities`
32
+
33
+ [All the Python functions I don't want to write twice.](https://github.com/nvim-lua/plenary.nvim)
34
+
35
+ ## Installation
36
+
37
+ - `pip install dycw-utilities`
38
+
39
+ or with [extras](https://github.com/dycw/python-utilities/blob/master/pyproject.toml).
@@ -1,4 +1,4 @@
1
- utilities/__init__.py,sha256=V2NCsw2lQ18h6ZVmnJk8Ff3KYOijFAMl6rMmt_TUQJk,60
1
+ utilities/__init__.py,sha256=MtzNC7sc7Go6N1zP7sgvZHDH3FNWCXCzEukoDNvyfZk,60
2
2
  utilities/aiolimiter.py,sha256=mD0wEiqMgwpty4XTbawFpnkkmJS6R4JRsVXFUaoitSU,628
3
3
  utilities/altair.py,sha256=HeZBVUocjkrTNwwKrClppsIqgNFF-ykv05HfZSoHYno,9104
4
4
  utilities/asyncio.py,sha256=lvdgBhuMtxq0dpiwF9g2WMMrit3kqXibN1V5NZ4xdbo,38046
@@ -24,7 +24,7 @@ utilities/getpass.py,sha256=DfN5UgMAtFCqS3dSfFHUfqIMZX2shXvwphOz_6J6f6A,103
24
24
  utilities/git.py,sha256=oi7-_l5e9haSANSCvQw25ufYGoNahuUPHAZ6114s3JQ,1191
25
25
  utilities/hashlib.py,sha256=SVTgtguur0P4elppvzOBbLEjVM3Pea0eWB61yg2ilxo,309
26
26
  utilities/http.py,sha256=WcahTcKYRtZ04WXQoWt5EGCgFPcyHD3EJdlMfxvDt-0,946
27
- utilities/hypothesis.py,sha256=Wpw_jX9TVAXAI13JuPkYbMYlLod9_o7V51x79hhZabU,47332
27
+ utilities/hypothesis.py,sha256=kTxXlZJyBauO3jurT7nIFWXhhmlamUvsNf65OQFEpEc,48084
28
28
  utilities/importlib.py,sha256=mV1xT_O_zt_GnZZ36tl3xOmMaN_3jErDWY54fX39F6Y,429
29
29
  utilities/inflect.py,sha256=DbqB5Q9FbRGJ1NbvEiZBirRMxCxgrz91zy5jCO9ZIs0,347
30
30
  utilities/ipython.py,sha256=V2oMYHvEKvlNBzxDXdLvKi48oUq2SclRg5xasjaXStw,763
@@ -88,10 +88,10 @@ utilities/uuid.py,sha256=jJTFxz-CWgltqNuzmythB7iEQ-Q1mCwPevUfKthZT3c,611
88
88
  utilities/version.py,sha256=ufhJMmI6KPs1-3wBI71aj5wCukd3sP_m11usLe88DNA,5117
89
89
  utilities/warnings.py,sha256=un1LvHv70PU-LLv8RxPVmugTzDJkkGXRMZTE2-fTQHw,1771
90
90
  utilities/whenever.py,sha256=jS31ZAY5OMxFxLja_Yo5Fidi87Pd-GoVZ7Vi_teqVDA,16743
91
- utilities/whenever2.py,sha256=aba0RN9GX_XnRsvmZNbHwkD15NmV4l00VFZ3HTK8vT8,3511
91
+ utilities/whenever2.py,sha256=GgfMrRbjGVjQNtuYuGNnPqeGl-DF6EHIFDa2A41k5aQ,4380
92
92
  utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
93
93
  utilities/zoneinfo.py,sha256=tvcgu3QzDxe2suTexi2QzRGpin7VK1TjHa0JYYxT69I,1862
94
- dycw_utilities-0.131.3.dist-info/METADATA,sha256=HPiEoWeAQVRNdWO4SDBiTNNhYKhISMiSDIC4fxgJyOo,10222
95
- dycw_utilities-0.131.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
96
- dycw_utilities-0.131.3.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
97
- dycw_utilities-0.131.3.dist-info/RECORD,,
94
+ dycw_utilities-0.131.5.dist-info/METADATA,sha256=eVaJ0DASMuOtpOWJ1UFB5YlCame2VQKXPir1EZs9Ebw,1584
95
+ dycw_utilities-0.131.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
96
+ dycw_utilities-0.131.5.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
97
+ dycw_utilities-0.131.5.dist-info/RECORD,,
utilities/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.131.3"
3
+ __version__ = "0.131.5"
utilities/hypothesis.py CHANGED
@@ -47,7 +47,7 @@ from hypothesis.strategies import (
47
47
  uuids,
48
48
  )
49
49
  from hypothesis.utils.conventions import not_set
50
- from whenever import Date, DateDelta, PlainDateTime
50
+ from whenever import Date, DateDelta
51
51
 
52
52
  from utilities.datetime import (
53
53
  DATETIME_MAX_NAIVE,
@@ -97,7 +97,7 @@ if TYPE_CHECKING:
97
97
 
98
98
  from hypothesis.database import ExampleDatabase
99
99
  from numpy.random import RandomState
100
- from whenever import ZonedDateTime
100
+ from whenever import PlainDateTime, ZonedDateTime
101
101
 
102
102
  from utilities.numpy import NDArrayB, NDArrayF, NDArrayI, NDArrayO
103
103
  from utilities.types import Duration, Number, RoundMode, TimeZoneLike
@@ -167,9 +167,15 @@ def date_deltas_whenever(
167
167
  *,
168
168
  min_value: MaybeSearchStrategy[DateDelta | None] = None,
169
169
  max_value: MaybeSearchStrategy[DateDelta | None] = None,
170
+ parsable: MaybeSearchStrategy[bool] = False,
170
171
  ) -> DateDelta:
171
172
  """Strategy for generating date deltas."""
172
- from utilities.whenever2 import DATE_DELTA_MAX, DATE_DELTA_MIN
173
+ from utilities.whenever2 import (
174
+ DATE_DELTA_MAX,
175
+ DATE_DELTA_MIN,
176
+ DATE_DELTA_PARSABLE_MAX,
177
+ DATE_DELTA_PARSABLE_MIN,
178
+ )
173
179
 
174
180
  min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
175
181
  match min_value_:
@@ -192,6 +198,19 @@ def date_deltas_whenever(
192
198
  max_years, max_months, max_days = max_value_.in_years_months_days()
193
199
  assert max_years == 0
194
200
  assert max_months == 0
201
+ if draw2(draw, parsable):
202
+ parsable_min_years, parsable_min_months, parsable_min_days = (
203
+ DATE_DELTA_PARSABLE_MIN.in_years_months_days()
204
+ )
205
+ assert parsable_min_years == 0
206
+ assert parsable_min_months == 0
207
+ min_days = max(min_days, parsable_min_days)
208
+ parsable_max_years, parsable_max_months, parsable_max_days = (
209
+ DATE_DELTA_PARSABLE_MAX.in_years_months_days()
210
+ )
211
+ assert parsable_max_years == 0
212
+ assert parsable_max_months == 0
213
+ max_days = min(max_days, parsable_max_days)
195
214
  days = draw(integers(min_value=min_days, max_value=max_days))
196
215
  return DateDelta(days=days)
197
216
 
@@ -1050,6 +1069,8 @@ def plain_datetimes_whenever(
1050
1069
  max_value: MaybeSearchStrategy[PlainDateTime | None] = None,
1051
1070
  ) -> PlainDateTime:
1052
1071
  """Strategy for generating plain datetimes."""
1072
+ from whenever import PlainDateTime
1073
+
1053
1074
  from utilities.whenever2 import PLAIN_DATE_TIME_MAX, PLAIN_DATE_TIME_MIN
1054
1075
 
1055
1076
  min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
utilities/whenever2.py CHANGED
@@ -7,10 +7,11 @@ from typing import TYPE_CHECKING, Any, override
7
7
 
8
8
  from whenever import Date, DateTimeDelta, PlainDateTime, ZonedDateTime
9
9
 
10
- from utilities.tzlocal import LOCAL_TIME_ZONE
11
10
  from utilities.zoneinfo import UTC, get_time_zone_name
12
11
 
13
12
  if TYPE_CHECKING:
13
+ from zoneinfo import ZoneInfo
14
+
14
15
  from utilities.types import TimeZoneLike
15
16
 
16
17
 
@@ -27,6 +28,11 @@ DATE_DELTA_MAX = DATE_TIME_DELTA_MAX.date_part()
27
28
  TIME_DELTA_MIN = DATE_TIME_DELTA_MIN.time_part()
28
29
  TIME_DELTA_MAX = DATE_TIME_DELTA_MAX.time_part()
29
30
 
31
+ DATE_TIME_DELTA_PARSABLE_MIN = DateTimeDelta(days=-999999)
32
+ DATE_TIME_DELTA_PARSABLE_MAX = DateTimeDelta(days=999999)
33
+ DATE_DELTA_PARSABLE_MIN = DATE_TIME_DELTA_PARSABLE_MIN.date_part()
34
+ DATE_DELTA_PARSABLE_MAX = DATE_TIME_DELTA_PARSABLE_MAX.date_part()
35
+
30
36
 
31
37
  ##
32
38
 
@@ -88,7 +94,24 @@ class WheneverLogRecord(LogRecord):
88
94
  )
89
95
  length = self._get_length()
90
96
  plain = format(get_now_local().to_plain().format_common_iso(), f"{length}s")
91
- self.zoned_datetime = f"{plain}[{LOCAL_TIME_ZONE.key}]"
97
+ time_zone = self._get_time_zone_key()
98
+ self.zoned_datetime = f"{plain}[{time_zone}]"
99
+
100
+ @classmethod
101
+ @cache
102
+ def _get_time_zone(cls) -> ZoneInfo:
103
+ """Get the local timezone."""
104
+ try:
105
+ from utilities.tzlocal import get_local_time_zone
106
+ except ModuleNotFoundError: # pragma: no cover
107
+ return UTC
108
+ return get_local_time_zone()
109
+
110
+ @classmethod
111
+ @cache
112
+ def _get_time_zone_key(cls) -> str:
113
+ """Get the local timezone as a string."""
114
+ return cls._get_time_zone().key
92
115
 
93
116
  @classmethod
94
117
  @cache
@@ -101,10 +124,14 @@ class WheneverLogRecord(LogRecord):
101
124
  __all__ = [
102
125
  "DATE_DELTA_MAX",
103
126
  "DATE_DELTA_MIN",
127
+ "DATE_DELTA_PARSABLE_MAX",
128
+ "DATE_DELTA_PARSABLE_MIN",
104
129
  "DATE_MAX",
105
130
  "DATE_MIN",
106
131
  "DATE_TIME_DELTA_MAX",
107
132
  "DATE_TIME_DELTA_MIN",
133
+ "DATE_TIME_DELTA_PARSABLE_MAX",
134
+ "DATE_TIME_DELTA_PARSABLE_MIN",
108
135
  "PLAIN_DATE_TIME_MAX",
109
136
  "PLAIN_DATE_TIME_MIN",
110
137
  "TIME_DELTA_MAX",
@@ -1,205 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: dycw-utilities
3
- Version: 0.131.3
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.15,>=4.14.0
9
- Requires-Dist: tzlocal<5.4,>=5.3.1
10
- Requires-Dist: whenever<0.9,>=0.8.5
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.136,>=6.135.2; extra == 'test'
16
- Requires-Dist: pytest-asyncio<1.1,>=1.0.0; extra == 'test'
17
- Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
18
- Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
19
- Requires-Dist: pytest-lazy-fixtures<1.2,>=1.1.4; extra == 'test'
20
- Requires-Dist: pytest-randomly<3.17,>=3.16.0; extra == 'test'
21
- Requires-Dist: pytest-regressions<2.9,>=2.8.0; extra == 'test'
22
- Requires-Dist: pytest-rerunfailures<16,>=15.1; extra == 'test'
23
- Requires-Dist: pytest-rng<1.1,>=1.0.0; extra == 'test'
24
- Requires-Dist: pytest-timeout<2.5,>=2.4.0; extra == 'test'
25
- Requires-Dist: pytest-xdist<3.8,>=3.7.0; extra == 'test'
26
- Requires-Dist: pytest<8.4,>=8.3.5; extra == 'test'
27
- Provides-Extra: zzz-test-aiolimiter
28
- Requires-Dist: aiolimiter<1.3,>=1.2.1; extra == 'zzz-test-aiolimiter'
29
- Provides-Extra: zzz-test-altair
30
- Requires-Dist: altair<5.6,>=5.5.0; extra == 'zzz-test-altair'
31
- Requires-Dist: img2pdf<0.7,>=0.6.0; extra == 'zzz-test-altair'
32
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-altair'
33
- Requires-Dist: vl-convert-python<1.9,>=1.8.0; extra == 'zzz-test-altair'
34
- Provides-Extra: zzz-test-asyncio
35
- Provides-Extra: zzz-test-atomicwrites
36
- Provides-Extra: zzz-test-atools
37
- Requires-Dist: atools<0.15,>=0.14.2; extra == 'zzz-test-atools'
38
- Provides-Extra: zzz-test-cachetools
39
- Requires-Dist: cachetools<5.6,>=5.5.2; extra == 'zzz-test-cachetools'
40
- Provides-Extra: zzz-test-click
41
- Requires-Dist: click<8.3,>=8.2.1; extra == 'zzz-test-click'
42
- Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-click'
43
- Provides-Extra: zzz-test-contextlib
44
- Provides-Extra: zzz-test-contextvars
45
- Provides-Extra: zzz-test-cryptography
46
- Requires-Dist: cryptography<45.1,>=45.0.4; extra == 'zzz-test-cryptography'
47
- Provides-Extra: zzz-test-cvxpy
48
- Requires-Dist: cvxpy<1.7,>=1.6.5; extra == 'zzz-test-cvxpy'
49
- Provides-Extra: zzz-test-dataclasses
50
- Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-dataclasses'
51
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-dataclasses'
52
- Provides-Extra: zzz-test-datetime
53
- Provides-Extra: zzz-test-enum
54
- Provides-Extra: zzz-test-errors
55
- Provides-Extra: zzz-test-eventkit
56
- Requires-Dist: eventkit<1.1,>=1.0.3; extra == 'zzz-test-eventkit'
57
- Provides-Extra: zzz-test-fastapi
58
- Requires-Dist: fastapi<0.116,>=0.115.11; extra == 'zzz-test-fastapi'
59
- Requires-Dist: httpx<0.29,>=0.28.1; extra == 'zzz-test-fastapi'
60
- Requires-Dist: uvicorn<0.35,>=0.34.1; extra == 'zzz-test-fastapi'
61
- Provides-Extra: zzz-test-fpdf2
62
- Requires-Dist: fpdf2<2.9,>=2.8.3; extra == 'zzz-test-fpdf2'
63
- Provides-Extra: zzz-test-functions
64
- Provides-Extra: zzz-test-functools
65
- Provides-Extra: zzz-test-getpass
66
- Provides-Extra: zzz-test-git
67
- Provides-Extra: zzz-test-hashlib
68
- Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-hashlib'
69
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-hashlib'
70
- Provides-Extra: zzz-test-http
71
- Requires-Dist: orjson<3.11,>=3.10.18; extra == 'zzz-test-http'
72
- Provides-Extra: zzz-test-hypothesis
73
- Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-hypothesis'
74
- Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-hypothesis'
75
- Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-hypothesis'
76
- Requires-Dist: hypothesis<6.136,>=6.135.2; extra == 'zzz-test-hypothesis'
77
- Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-hypothesis'
78
- Requires-Dist: numpy<2.4,>=2.3.0; extra == 'zzz-test-hypothesis'
79
- Requires-Dist: pathvalidate<3.3,>=3.2.3; extra == 'zzz-test-hypothesis'
80
- Requires-Dist: redis<6.3,>=6.2.0; extra == 'zzz-test-hypothesis'
81
- Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-hypothesis'
82
- Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-hypothesis'
83
- Provides-Extra: zzz-test-ipython
84
- Requires-Dist: ipython<9.1,>=9.0.1; extra == 'zzz-test-ipython'
85
- Provides-Extra: zzz-test-iterables
86
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-iterables'
87
- Provides-Extra: zzz-test-jupyter
88
- Requires-Dist: jupyterlab<4.3,>=4.2.0; extra == 'zzz-test-jupyter'
89
- Requires-Dist: pandas<2.4,>=2.3.0; extra == 'zzz-test-jupyter'
90
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-jupyter'
91
- Provides-Extra: zzz-test-logging
92
- Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'zzz-test-logging'
93
- Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-logging'
94
- Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-logging'
95
- Provides-Extra: zzz-test-luigi
96
- Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-luigi'
97
- Provides-Extra: zzz-test-math
98
- Requires-Dist: numpy<2.4,>=2.3.0; extra == 'zzz-test-math'
99
- Provides-Extra: zzz-test-memory-profiler
100
- Requires-Dist: memory-profiler<0.62,>=0.61.0; extra == 'zzz-test-memory-profiler'
101
- Provides-Extra: zzz-test-modules
102
- Provides-Extra: zzz-test-more-itertools
103
- Requires-Dist: more-itertools<10.8,>=10.7.0; extra == 'zzz-test-more-itertools'
104
- Provides-Extra: zzz-test-numpy
105
- Requires-Dist: numpy<2.4,>=2.3.0; extra == 'zzz-test-numpy'
106
- Provides-Extra: zzz-test-operator
107
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-operator'
108
- Provides-Extra: zzz-test-optuna
109
- Requires-Dist: optuna<4.4,>=4.3.0; extra == 'zzz-test-optuna'
110
- Provides-Extra: zzz-test-orjson
111
- Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-orjson'
112
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-orjson'
113
- Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-orjson'
114
- Provides-Extra: zzz-test-os
115
- Provides-Extra: zzz-test-pathlib
116
- Provides-Extra: zzz-test-pickle
117
- Provides-Extra: zzz-test-platform
118
- Provides-Extra: zzz-test-polars
119
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-polars'
120
- Provides-Extra: zzz-test-pqdm
121
- Requires-Dist: pqdm<0.3,>=0.2.0; extra == 'zzz-test-pqdm'
122
- Provides-Extra: zzz-test-pydantic
123
- Requires-Dist: pydantic<2.12,>=2.11.4; extra == 'zzz-test-pydantic'
124
- Provides-Extra: zzz-test-pyinstrument
125
- Requires-Dist: pyinstrument<5.1,>=5.0.2; extra == 'zzz-test-pyinstrument'
126
- Provides-Extra: zzz-test-pyrsistent
127
- Requires-Dist: pyrsistent<0.21,>=0.20.0; extra == 'zzz-test-pyrsistent'
128
- Provides-Extra: zzz-test-pytest
129
- Requires-Dist: orjson<3.11,>=3.10.18; extra == 'zzz-test-pytest'
130
- Provides-Extra: zzz-test-pytest-regressions
131
- Requires-Dist: pytest-regressions<2.9,>=2.8.0; extra == 'zzz-test-pytest-regressions'
132
- Provides-Extra: zzz-test-python-dotenv
133
- Requires-Dist: python-dotenv<1.2,>=1.1.0; extra == 'zzz-test-python-dotenv'
134
- Provides-Extra: zzz-test-random
135
- Provides-Extra: zzz-test-re
136
- Provides-Extra: zzz-test-redis
137
- Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-redis'
138
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-redis'
139
- Requires-Dist: redis<6.3,>=6.2.0; extra == 'zzz-test-redis'
140
- Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-redis'
141
- Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-redis'
142
- Provides-Extra: zzz-test-rich
143
- Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-rich'
144
- Provides-Extra: zzz-test-scipy
145
- Requires-Dist: scipy<1.16,>=1.15.3; extra == 'zzz-test-scipy'
146
- Provides-Extra: zzz-test-sentinel
147
- Provides-Extra: zzz-test-shelve
148
- Provides-Extra: zzz-test-slack-sdk
149
- Requires-Dist: aiohttp<3.13,>=3.12.12; extra == 'zzz-test-slack-sdk'
150
- Requires-Dist: slack-sdk<3.36,>=3.35.0; extra == 'zzz-test-slack-sdk'
151
- Provides-Extra: zzz-test-socket
152
- Provides-Extra: zzz-test-sqlalchemy
153
- Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-sqlalchemy'
154
- Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-sqlalchemy'
155
- Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-sqlalchemy'
156
- Requires-Dist: nest-asyncio<1.7,>=1.6.0; extra == 'zzz-test-sqlalchemy'
157
- Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-sqlalchemy'
158
- Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-sqlalchemy'
159
- Provides-Extra: zzz-test-sqlalchemy-polars
160
- Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-sqlalchemy-polars'
161
- Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-sqlalchemy-polars'
162
- Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-sqlalchemy-polars'
163
- Requires-Dist: nest-asyncio<1.7,>=1.6.0; extra == 'zzz-test-sqlalchemy-polars'
164
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-sqlalchemy-polars'
165
- Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-sqlalchemy-polars'
166
- Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-sqlalchemy-polars'
167
- Provides-Extra: zzz-test-streamlit
168
- Requires-Dist: streamlit<1.46,>=1.45.0; extra == 'zzz-test-streamlit'
169
- Provides-Extra: zzz-test-sys
170
- Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-sys'
171
- Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-sys'
172
- Provides-Extra: zzz-test-tempfile
173
- Provides-Extra: zzz-test-tenacity
174
- Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-tenacity'
175
- Provides-Extra: zzz-test-text
176
- Provides-Extra: zzz-test-threading
177
- Provides-Extra: zzz-test-timer
178
- Provides-Extra: zzz-test-traceback
179
- Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-traceback'
180
- Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-traceback'
181
- Provides-Extra: zzz-test-types
182
- Provides-Extra: zzz-test-typing
183
- Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-typing'
184
- Provides-Extra: zzz-test-tzlocal
185
- Provides-Extra: zzz-test-uuid
186
- Provides-Extra: zzz-test-version
187
- Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-version'
188
- Provides-Extra: zzz-test-warnings
189
- Provides-Extra: zzz-test-whenever
190
- Provides-Extra: zzz-test-zipfile
191
- Provides-Extra: zzz-test-zoneinfo
192
- Requires-Dist: tzdata<2025.3,>=2025.2; extra == 'zzz-test-zoneinfo'
193
- Description-Content-Type: text/markdown
194
-
195
- [![PyPI version](https://badge.fury.io/py/dycw-utilities.svg)](https://badge.fury.io/py/dycw-utilities)
196
-
197
- # `dycw-utilities`
198
-
199
- [All the Python functions I don't want to write twice.](https://github.com/nvim-lua/plenary.nvim)
200
-
201
- ## Installation
202
-
203
- - `pip install dycw-utilities`
204
-
205
- or with [extras](https://github.com/dycw/python-utilities/blob/master/pyproject.toml).