dycw-utilities 0.166.28__py3-none-any.whl → 0.166.30__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.166.28
3
+ Version: 0.166.30
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -1,4 +1,4 @@
1
- utilities/__init__.py,sha256=mFYxtUKg-3GS-hWddHQ9eTJIsbmZslAJSALV6E4Y0KE,61
1
+ utilities/__init__.py,sha256=1ZO_cavh1o4bHb63EXlMpG07TU7njs0GEuTie2-NSEo,61
2
2
  utilities/aeventkit.py,sha256=ddoleSwW9zdc2tjX5Ge0pMKtYwV_JMxhHYOxnWX2AGM,12609
3
3
  utilities/altair.py,sha256=nHdpWt8ZwdUwRQN970MvHd5bRWokNqzHcZQEdSHKRuE,9033
4
4
  utilities/asyncio.py,sha256=60l1IwjnRGeaVphAFiwDIHyfKoZYKY-XGpptUxGiU-M,17034
@@ -56,7 +56,7 @@ utilities/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
56
  utilities/pydantic_settings.py,sha256=bFr9UDrVhdqTl7O_TPutCLdsQ5rUp--nO76-_F8z0bs,5102
57
57
  utilities/pydantic_settings_sops.py,sha256=m2uB9wDw1PU2CiSL7KwxulDXT0STjOZTu3Ctc2q7jc0,1943
58
58
  utilities/pyinstrument.py,sha256=hnXaL-4HE7wWBI5JKaPfYTpsrXe68YiuZKahHV0VJn8,841
59
- utilities/pytest.py,sha256=pl4j9-GReiYQMZkAFOGxsHIO_DcTHbJ_VaiLPFrw57g,8370
59
+ utilities/pytest.py,sha256=4KzMZYg5Zzfyjxrw8VlnZNYCD2S0Uee1JIFMIPyIkO8,10076
60
60
  utilities/pytest_regressions.py,sha256=ocjHTtfOeiGfQAKIei8pKNd61sxN9dawrJJ9gPt2wzA,4097
61
61
  utilities/random.py,sha256=hZlH4gnAtoaofWswuJYjcygejrY8db4CzP-z_adO2Mo,4165
62
62
  utilities/re.py,sha256=S4h-DLL6ScMPqjboZ_uQ1BVTJajrqV06r_81D--_HCE,4573
@@ -91,8 +91,8 @@ utilities/zoneinfo.py,sha256=tdIScrTB2-B-LH0ukb1HUXKooLknOfJNwHk10MuMYvA,3619
91
91
  utilities/pytest_plugins/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
92
92
  utilities/pytest_plugins/pytest_randomly.py,sha256=B1qYVlExGOxTywq2r1SMi5o7btHLk2PNdY_b1p98dkE,409
93
93
  utilities/pytest_plugins/pytest_regressions.py,sha256=mnHYBfdprz50UGVkVzV1bZERZN5CFfoF8YbokGxdFwU,1639
94
- dycw_utilities-0.166.28.dist-info/METADATA,sha256=Z2XfjjQWdmANA-pvGFW8ucEYbpiZN3TusCqN2bhHdx8,1700
95
- dycw_utilities-0.166.28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
96
- dycw_utilities-0.166.28.dist-info/entry_points.txt,sha256=BOD_SoDxwsfJYOLxhrSXhHP_T7iw-HXI9f2WVkzYxvQ,135
97
- dycw_utilities-0.166.28.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
98
- dycw_utilities-0.166.28.dist-info/RECORD,,
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,,
utilities/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.166.28"
3
+ __version__ = "0.166.30"
utilities/pytest.py CHANGED
@@ -28,7 +28,9 @@ from utilities.platform import (
28
28
  IS_NOT_WINDOWS,
29
29
  IS_WINDOWS,
30
30
  )
31
- from utilities.types import MaybeCoro
31
+ from utilities.random import bernoulli
32
+ from utilities.text import to_bool
33
+ from utilities.types import MaybeCallableBoolLike, MaybeCoro, Seed
32
34
  from utilities.whenever import SECOND, get_now_local
33
35
 
34
36
  if TYPE_CHECKING:
@@ -166,6 +168,66 @@ class _NodeIdToPathNotGetTailError(NodeIdToPathError):
166
168
  ##
167
169
 
168
170
 
171
+ def run_frac[F: Callable[..., MaybeCoro[None]]](
172
+ *,
173
+ predicate: MaybeCallableBoolLike | None = None,
174
+ frac: float = 0.5,
175
+ seed: Seed | None = None,
176
+ ) -> Callable[[F], F]:
177
+ """Run a test only a fraction of the time.."""
178
+ return cast(
179
+ "Any", partial(_run_frac_inner, predicate=predicate, frac=frac, seed=seed)
180
+ )
181
+
182
+
183
+ def _run_frac_inner[F: Callable[..., MaybeCoro[None]]](
184
+ func: F,
185
+ /,
186
+ *,
187
+ predicate: MaybeCallableBoolLike | None = None,
188
+ frac: float = 0.5,
189
+ seed: Seed | None = None,
190
+ ) -> F:
191
+ match bool(iscoroutinefunction(func)):
192
+ case False:
193
+
194
+ @wraps(func)
195
+ def run_frac_sync(*args: Any, **kwargs: Any) -> None:
196
+ _skipif_frac(predicate=predicate, frac=frac, seed=seed)
197
+ cast("Callable[..., None]", func)(*args, **kwargs)
198
+
199
+ return cast("Any", run_frac_sync)
200
+
201
+ case True:
202
+
203
+ @wraps(func)
204
+ async def run_frac_async(*args: Any, **kwargs: Any) -> None:
205
+ _skipif_frac(predicate=predicate, frac=frac, seed=seed)
206
+ await cast("Callable[..., Coro[None]]", func)(*args, **kwargs)
207
+
208
+ return cast("Any", run_frac_async)
209
+
210
+ case never:
211
+ assert_never(never)
212
+
213
+
214
+ def _skipif_frac(
215
+ *,
216
+ predicate: MaybeCallableBoolLike | None = None,
217
+ frac: float = 0.5,
218
+ seed: Seed | None = None,
219
+ ) -> None:
220
+ if skip is None:
221
+ return # pragma: no cover
222
+ if ((predicate is None) or to_bool(predicate)) and bernoulli(
223
+ true=1 - frac, seed=seed
224
+ ):
225
+ _ = skip(reason=f"{_get_name()} skipped (run {frac:.0%})")
226
+
227
+
228
+ ##
229
+
230
+
169
231
  def throttle[F: Callable[..., MaybeCoro[None]]](
170
232
  *, root: PathLike | None = None, delta: Delta = SECOND, on_try: bool = False
171
233
  ) -> Callable[[F], F]:
@@ -181,7 +243,6 @@ def _throttle_inner[F: Callable[..., MaybeCoro[None]]](
181
243
  delta: Delta = SECOND,
182
244
  on_try: bool = False,
183
245
  ) -> F:
184
- """Throttle a test function/method."""
185
246
  if get_env_var("THROTTLE", nullable=True) is not None:
186
247
  return func
187
248
  match bool(iscoroutinefunction(func)), on_try:
@@ -276,6 +337,7 @@ __all__ = [
276
337
  "add_pytest_collection_modifyitems",
277
338
  "add_pytest_configure",
278
339
  "node_id_path",
340
+ "run_frac",
279
341
  "skipif_linux",
280
342
  "skipif_mac",
281
343
  "skipif_not_linux",