dycw-utilities 0.125.19__tar.gz → 0.125.21__tar.gz

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 (227) hide show
  1. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/PKG-INFO +3 -3
  2. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/pyproject.toml +5 -5
  3. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_asyncio.py +16 -1
  4. dycw_utilities-0.125.21/src/tests/test_contextlib.py +75 -0
  5. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/asyncio.py +15 -0
  7. dycw_utilities-0.125.21/src/utilities/contextlib.py +44 -0
  8. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/errors.py +1 -0
  9. dycw_utilities-0.125.19/src/tests/test_contextlib.py +0 -15
  10. dycw_utilities-0.125.19/src/utilities/contextlib.py +0 -23
  11. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/.gitignore +0 -0
  12. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/LICENSE +0 -0
  13. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/README.md +0 -0
  14. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/__init__.py +0 -0
  15. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/conftest.py +0 -0
  16. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/__init__.py +0 -0
  17. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_missing/__init__.py +0 -0
  18. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_missing/module.py +0 -0
  19. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_with/__init__.py +0 -0
  20. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_with/outer_1.py +0 -0
  21. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_with/outer_2.py +0 -0
  22. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  23. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  24. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  25. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  26. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_without/__init__.py +0 -0
  27. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_without/module_1.py +0 -0
  28. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/package_without/module_2.py +0 -0
  29. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/standalone.py +0 -0
  30. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/modules/with_imports.py +0 -0
  31. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  32. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  33. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  34. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  35. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  36. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  37. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  38. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  39. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_altair.py +0 -0
  40. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_atomicwrites.py +0 -0
  41. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_atools.py +0 -0
  42. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_cachetools.py +0 -0
  43. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_click.py +0 -0
  44. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_concurrent.py +0 -0
  45. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_datetime.py +0 -0
  50. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_errors.py +0 -0
  52. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_eventkit.py +0 -0
  53. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_fastapi.py +0 -0
  54. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_fpdf2.py +0 -0
  55. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_functions.py +0 -0
  56. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_functools.py +0 -0
  57. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_getpass.py +0 -0
  58. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_git.py +0 -0
  59. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_hashlib.py +0 -0
  60. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_http.py +0 -0
  61. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_hypothesis.py +0 -0
  62. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_importlib.py +0 -0
  63. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_ipython.py +0 -0
  64. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_iterables.py +0 -0
  65. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_jupyter.py +0 -0
  66. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_libcst.py +0 -0
  67. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_lightweight_charts.py +0 -0
  68. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_logging.py +0 -0
  69. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_loguru.py +0 -0
  70. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_luigi.py +0 -0
  71. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_operator.py +0 -0
  77. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_optuna.py +0 -0
  78. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_orjson.py +0 -0
  79. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_os.py +0 -0
  80. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_parse.py +0 -0
  81. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pathlib.py +0 -0
  82. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_period.py +0 -0
  83. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pickle.py +0 -0
  84. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_platform.py +0 -0
  85. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_polars.py +0 -0
  86. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_polars_ols.py +0 -0
  87. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pqdm.py +0 -0
  88. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pydantic.py +0 -0
  89. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pyinstrument.py +0 -0
  90. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pyrsistent.py +0 -0
  91. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pytest.py +0 -0
  92. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_pytest_regressions.py +0 -0
  93. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_python_dotenv.py +0 -0
  94. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_random.py +0 -0
  95. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_re.py +0 -0
  96. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_redis.py +0 -0
  97. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_reprlib.py +0 -0
  98. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_rich.py +0 -0
  99. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_scipy.py +0 -0
  100. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_sentinel.py +0 -0
  101. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_shelve.py +0 -0
  102. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_slack_sdk.py +0 -0
  103. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_socket.py +0 -0
  104. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_sqlalchemy.py +0 -0
  105. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_sqlalchemy_polars.py +0 -0
  106. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_statsmodel.py +0 -0
  107. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_streamlit.py +0 -0
  108. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_string.py +0 -0
  109. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_sys.py +0 -0
  110. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_tempfile.py +0 -0
  111. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_tenacity.py +0 -0
  112. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_text.py +0 -0
  113. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_threading.py +0 -0
  114. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_timer.py +0 -0
  115. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback.py +0 -0
  116. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/__init__.py +0 -0
  117. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/chain.py +0 -0
  118. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  119. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  120. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  121. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/many.py +0 -0
  122. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/one.py +0 -0
  123. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/recursive.py +0 -0
  124. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  125. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  126. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/two.py +0 -0
  127. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_traceback_funcs/untraced.py +0 -0
  128. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_types.py +0 -0
  129. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_typing.py +0 -0
  130. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_typing_funcs/__init__.py +0 -0
  131. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_typing_funcs/no_future.py +0 -0
  132. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_typing_funcs/with_future.py +0 -0
  133. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_tzdata.py +0 -0
  134. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_tzlocal.py +0 -0
  135. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_uuid.py +0 -0
  136. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_version.py +0 -0
  137. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_warnings.py +0 -0
  138. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_whenever.py +0 -0
  139. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_zipfile.py +0 -0
  140. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/tests/test_zoneinfo.py +0 -0
  141. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/altair.py +0 -0
  142. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/atomicwrites.py +0 -0
  143. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/atools.py +0 -0
  144. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/cachetools.py +0 -0
  145. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/click.py +0 -0
  146. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/concurrent.py +0 -0
  147. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/contextvars.py +0 -0
  148. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/cryptography.py +0 -0
  149. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/cvxpy.py +0 -0
  150. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/dataclasses.py +0 -0
  151. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/datetime.py +0 -0
  152. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/enum.py +0 -0
  153. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/eventkit.py +0 -0
  154. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/fastapi.py +0 -0
  155. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/fpdf2.py +0 -0
  156. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/functions.py +0 -0
  157. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/functools.py +0 -0
  158. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/getpass.py +0 -0
  159. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/git.py +0 -0
  160. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/hashlib.py +0 -0
  161. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/http.py +0 -0
  162. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/hypothesis.py +0 -0
  163. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/importlib.py +0 -0
  164. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/ipython.py +0 -0
  165. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/iterables.py +0 -0
  166. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/jupyter.py +0 -0
  167. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/libcst.py +0 -0
  168. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/lightweight_charts.py +0 -0
  169. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/logging.py +0 -0
  170. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/loguru.py +0 -0
  171. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/luigi.py +0 -0
  172. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/math.py +0 -0
  173. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/memory_profiler.py +0 -0
  174. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/modules.py +0 -0
  175. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/more_itertools.py +0 -0
  176. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/numpy.py +0 -0
  177. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/operator.py +0 -0
  178. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/optuna.py +0 -0
  179. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/orjson.py +0 -0
  180. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/os.py +0 -0
  181. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/parse.py +0 -0
  182. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pathlib.py +0 -0
  183. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/period.py +0 -0
  184. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pickle.py +0 -0
  185. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/platform.py +0 -0
  186. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/polars.py +0 -0
  187. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/polars_ols.py +0 -0
  188. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pqdm.py +0 -0
  189. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/py.typed +0 -0
  190. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pydantic.py +0 -0
  191. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pyinstrument.py +0 -0
  192. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pyrsistent.py +0 -0
  193. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pytest.py +0 -0
  194. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/pytest_regressions.py +0 -0
  195. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/python_dotenv.py +0 -0
  196. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/random.py +0 -0
  197. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/re.py +0 -0
  198. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/redis.py +0 -0
  199. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/reprlib.py +0 -0
  200. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/rich.py +0 -0
  201. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/scipy.py +0 -0
  202. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/sentinel.py +0 -0
  203. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/shelve.py +0 -0
  204. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/slack_sdk.py +0 -0
  205. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/socket.py +0 -0
  206. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/sqlalchemy.py +0 -0
  207. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/sqlalchemy_polars.py +0 -0
  208. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/statsmodels.py +0 -0
  209. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/streamlit.py +0 -0
  210. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/string.py +0 -0
  211. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/sys.py +0 -0
  212. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/tempfile.py +0 -0
  213. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/tenacity.py +0 -0
  214. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/text.py +0 -0
  215. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/threading.py +0 -0
  216. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/timer.py +0 -0
  217. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/traceback.py +0 -0
  218. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/types.py +0 -0
  219. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/typing.py +0 -0
  220. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/tzdata.py +0 -0
  221. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/tzlocal.py +0 -0
  222. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/uuid.py +0 -0
  223. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/version.py +0 -0
  224. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/warnings.py +0 -0
  225. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/whenever.py +0 -0
  226. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/zipfile.py +0 -0
  227. {dycw_utilities-0.125.19 → dycw_utilities-0.125.21}/src/utilities/zoneinfo.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.125.19
3
+ Version: 0.125.21
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
7
7
  Requires-Dist: typing-extensions<4.14,>=4.13.1
8
8
  Provides-Extra: test
9
- Requires-Dist: hypothesis<6.132,>=6.131.30; extra == 'test'
9
+ Requires-Dist: hypothesis<6.132,>=6.131.32; extra == 'test'
10
10
  Requires-Dist: pytest-asyncio<1.1,>=1.0.0; extra == 'test'
11
11
  Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
12
12
  Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
@@ -78,7 +78,7 @@ Provides-Extra: zzz-test-hypothesis
78
78
  Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-hypothesis'
79
79
  Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-hypothesis'
80
80
  Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-hypothesis'
81
- Requires-Dist: hypothesis<6.132,>=6.131.30; extra == 'zzz-test-hypothesis'
81
+ Requires-Dist: hypothesis<6.132,>=6.131.32; extra == 'zzz-test-hypothesis'
82
82
  Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-hypothesis'
83
83
  Requires-Dist: numpy<2.3,>=2.2.6; extra == 'zzz-test-hypothesis'
84
84
  Requires-Dist: pathvalidate<3.3,>=3.2.3; extra == 'zzz-test-hypothesis'
@@ -25,7 +25,7 @@ dev = [
25
25
  "fpdf2 >= 2.8.3, < 2.9",
26
26
  "greenlet >= 3.2.0, < 3.3", # for sqlalchemy async
27
27
  "httpx >= 0.28.1, < 0.29", # for fastapi
28
- "hypothesis >= 6.131.30, < 6.132",
28
+ "hypothesis >= 6.131.32, < 6.132",
29
29
  "img2pdf >= 0.6.0, < 0.7",
30
30
  "lightweight-charts >= 2.1, < 2.2",
31
31
  "loguru >= 0.7.3, < 0.8",
@@ -93,11 +93,11 @@ dependencies = [
93
93
  name = "dycw-utilities"
94
94
  readme = "README.md"
95
95
  requires-python = ">= 3.12"
96
- version = "0.125.19"
96
+ version = "0.125.21"
97
97
 
98
98
  [project.optional-dependencies]
99
99
  test = [
100
- "hypothesis >= 6.131.30, < 6.132",
100
+ "hypothesis >= 6.131.32, < 6.132",
101
101
  "pytest >= 8.3.5, < 8.4",
102
102
  "pytest-asyncio >= 1.0.0, < 1.1",
103
103
  "pytest-cov >= 6.1.1, < 6.2",
@@ -174,7 +174,7 @@ zzz-test-hypothesis = [
174
174
  "aiosqlite >= 0.21.0, < 0.22",
175
175
  "asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async
176
176
  "greenlet >= 3.2.0, < 3.3", # for sqlalchemy async
177
- "hypothesis >= 6.131.30, < 6.132",
177
+ "hypothesis >= 6.131.32, < 6.132",
178
178
  "luigi >= 3.6.0, < 3.7",
179
179
  "numpy >= 2.2.6, < 2.3",
180
180
  "pathvalidate >= 3.2.3, < 3.3",
@@ -334,7 +334,7 @@ zzz-test-zoneinfo = [
334
334
  # bump-my-version
335
335
  [tool.bumpversion]
336
336
  allow_dirty = true
337
- current_version = "0.125.19"
337
+ current_version = "0.125.21"
338
338
 
339
339
  [[tool.bumpversion.files]]
340
340
  filename = "src/utilities/__init__.py"
@@ -42,6 +42,7 @@ from utilities.asyncio import (
42
42
  put_items,
43
43
  put_items_nowait,
44
44
  sleep_dur,
45
+ sleep_max_dur,
45
46
  sleep_until,
46
47
  sleep_until_rounded,
47
48
  stream_command,
@@ -1428,7 +1429,7 @@ class TestSleepDur:
1428
1429
  async def test_main(self, *, duration: Duration) -> None:
1429
1430
  with Timer() as timer:
1430
1431
  await sleep_dur(duration=duration)
1431
- assert timer >= datetime_duration_to_timedelta(duration / 2)
1432
+ assert timer <= datetime_duration_to_timedelta(2 * duration)
1432
1433
 
1433
1434
  async def test_none(self) -> None:
1434
1435
  with Timer() as timer:
@@ -1436,6 +1437,20 @@ class TestSleepDur:
1436
1437
  assert timer <= 0.01
1437
1438
 
1438
1439
 
1440
+ class TestSleepMaxDur:
1441
+ @given(duration=sampled_from([0.1, 10 * MILLISECOND]))
1442
+ @settings(phases={Phase.generate})
1443
+ async def test_main(self, *, duration: Duration) -> None:
1444
+ with Timer() as timer:
1445
+ await sleep_max_dur(duration=duration)
1446
+ assert timer <= datetime_duration_to_timedelta(2 * duration)
1447
+
1448
+ async def test_none(self) -> None:
1449
+ with Timer() as timer:
1450
+ await sleep_max_dur()
1451
+ assert timer <= 0.01
1452
+
1453
+
1439
1454
  class TestSleepUntil:
1440
1455
  async def test_main(self) -> None:
1441
1456
  await sleep_until(get_now() + 10 * MILLISECOND)
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import override
5
+
6
+ from pytest import raises
7
+
8
+ from utilities.contextlib import (
9
+ NoOpContextManager,
10
+ suppress_super_object_attribute_error,
11
+ )
12
+
13
+
14
+ class TestNoOpContextManager:
15
+ def test_main(self) -> None:
16
+ with NoOpContextManager():
17
+ pass
18
+
19
+ def test_error(self) -> None:
20
+ with raises(RuntimeError), NoOpContextManager():
21
+ raise RuntimeError
22
+
23
+
24
+ class TestSuppressSuperObjectAttributeError:
25
+ def test_main(self) -> None:
26
+ inits: list[str] = []
27
+
28
+ @dataclass(kw_only=True)
29
+ class A:
30
+ def __post_init__(self) -> None:
31
+ with suppress_super_object_attribute_error():
32
+ super().__post_init__() # pyright:ignore [reportAttributeAccessIssue]
33
+ nonlocal inits
34
+ inits.append("A")
35
+
36
+ @dataclass(kw_only=True)
37
+ class B: ...
38
+
39
+ @dataclass(kw_only=True)
40
+ class C:
41
+ def __post_init__(self) -> None:
42
+ with suppress_super_object_attribute_error():
43
+ super().__post_init__() # pyright:ignore [reportAttributeAccessIssue]
44
+ nonlocal inits
45
+ inits.append("C")
46
+
47
+ @dataclass(kw_only=True)
48
+ class D: ...
49
+
50
+ @dataclass(kw_only=True)
51
+ class E(A, B, C, D):
52
+ @override
53
+ def __post_init__(self) -> None:
54
+ super().__post_init__()
55
+ nonlocal inits
56
+ inits.append("E")
57
+
58
+ _ = E()
59
+ assert inits == ["C", "A", "E"]
60
+
61
+ def test_error(self) -> None:
62
+ @dataclass(kw_only=True)
63
+ class Parent:
64
+ def __post_init__(self) -> None:
65
+ with suppress_super_object_attribute_error():
66
+ _ = self.error # pyright:ignore [reportAttributeAccessIssue]
67
+
68
+ @dataclass(kw_only=True)
69
+ class Child(Parent):
70
+ @override
71
+ def __post_init__(self) -> None:
72
+ super().__post_init__()
73
+
74
+ with raises(AttributeError, match="'Child' object has no attribute 'error'"):
75
+ _ = Child()
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.125.19"
3
+ __version__ = "0.125.21"
@@ -59,6 +59,7 @@ from utilities.datetime import (
59
59
  )
60
60
  from utilities.errors import ImpossibleCaseError, repr_error
61
61
  from utilities.functions import ensure_int, ensure_not_none, get_class_name
62
+ from utilities.random import SYSTEM_RANDOM
62
63
  from utilities.sentinel import Sentinel, sentinel
63
64
  from utilities.types import (
64
65
  Coroutine1,
@@ -75,6 +76,7 @@ if TYPE_CHECKING:
75
76
  from collections import deque
76
77
  from collections.abc import AsyncIterator, Sequence
77
78
  from contextvars import Context
79
+ from random import Random
78
80
  from types import TracebackType
79
81
 
80
82
  from utilities.types import Duration
@@ -1305,6 +1307,18 @@ async def sleep_dur(*, duration: Duration | None = None) -> None:
1305
1307
  ##
1306
1308
 
1307
1309
 
1310
+ async def sleep_max_dur(
1311
+ *, duration: Duration | None = None, random: Random = SYSTEM_RANDOM
1312
+ ) -> None:
1313
+ """Sleep which accepts max durations."""
1314
+ if duration is None:
1315
+ return
1316
+ await sleep(random.uniform(0.0, datetime_duration_to_float(duration)))
1317
+
1318
+
1319
+ ##
1320
+
1321
+
1308
1322
  async def sleep_until(datetime: dt.datetime, /) -> None:
1309
1323
  """Sleep until a given time."""
1310
1324
  await sleep_dur(duration=datetime - get_now())
@@ -1407,6 +1421,7 @@ __all__ = [
1407
1421
  "put_items",
1408
1422
  "put_items_nowait",
1409
1423
  "sleep_dur",
1424
+ "sleep_max_dur",
1410
1425
  "sleep_until",
1411
1426
  "sleep_until_rounded",
1412
1427
  "stream_command",
@@ -0,0 +1,44 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from contextlib import contextmanager
5
+ from typing import TYPE_CHECKING
6
+
7
+ if TYPE_CHECKING:
8
+ from collections.abc import Iterator
9
+ from types import TracebackType
10
+
11
+
12
+ class NoOpContextManager:
13
+ """Context-manager for no-op."""
14
+
15
+ def __enter__(self) -> None:
16
+ return None
17
+
18
+ def __exit__(
19
+ self,
20
+ exc_type: type[BaseException] | None,
21
+ exc_val: BaseException | None,
22
+ traceback: TracebackType | None,
23
+ ) -> bool:
24
+ _ = (exc_type, exc_val, traceback)
25
+ return False
26
+
27
+
28
+ ##
29
+
30
+
31
+ _SUPER_OBJECT_HAS_NO_ATTRIBUTE = re.compile(r"'super' object has no attribute '\w+'")
32
+
33
+
34
+ @contextmanager
35
+ def suppress_super_object_attribute_error() -> Iterator[None]:
36
+ """Suppress the super() attribute error, for mix-ins."""
37
+ try:
38
+ yield
39
+ except AttributeError as error:
40
+ if not _SUPER_OBJECT_HAS_NO_ATTRIBUTE.search(error.args[0]):
41
+ raise
42
+
43
+
44
+ __all__ = ["NoOpContextManager", "suppress_super_object_attribute_error"]
@@ -15,6 +15,7 @@ class ImpossibleCaseError(Exception):
15
15
  def __str__(self) -> str:
16
16
  desc = ", ".join(self.case)
17
17
  return f"Case must be possible: {desc}."
18
+ ##
18
19
 
19
20
 
20
21
  ##
@@ -1,15 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pytest import raises
4
-
5
- from utilities.contextlib import NoOpContextManager
6
-
7
-
8
- class TestNoOpContextManager:
9
- def test_main(self) -> None:
10
- with NoOpContextManager():
11
- pass
12
-
13
- def test_error(self) -> None:
14
- with raises(RuntimeError), NoOpContextManager():
15
- raise RuntimeError
@@ -1,23 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- if TYPE_CHECKING:
6
- from types import TracebackType
7
-
8
-
9
- class NoOpContextManager:
10
- def __enter__(self) -> None:
11
- return None
12
-
13
- def __exit__(
14
- self,
15
- exc_type: type[BaseException] | None,
16
- exc_val: BaseException | None,
17
- traceback: TracebackType | None,
18
- ) -> bool:
19
- _ = (exc_type, exc_val, traceback)
20
- return False
21
-
22
-
23
- __all__ = ["NoOpContextManager"]