dycw-utilities 0.120.0__tar.gz → 0.121.0__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 (223) hide show
  1. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/PKG-INFO +1 -1
  2. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/pyproject.toml +2 -2
  3. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_asyncio.py +33 -46
  4. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/asyncio.py +21 -13
  6. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/types.py +2 -0
  7. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/.gitignore +0 -0
  8. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/LICENSE +0 -0
  9. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/README.md +0 -0
  10. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_altair.py +0 -0
  36. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_astor.py +0 -0
  37. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_atomicwrites.py +0 -0
  38. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_atools.py +0 -0
  39. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_cachetools.py +0 -0
  40. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_click.py +0 -0
  41. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_concurrent.py +0 -0
  42. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_contextlib.py +0 -0
  43. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_contextvars.py +0 -0
  44. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_cryptography.py +0 -0
  45. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_cvxpy.py +0 -0
  46. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_dataclasses.py +0 -0
  47. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_datetime.py +0 -0
  48. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_enum.py +0 -0
  49. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_errors.py +0 -0
  50. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_eventkit.py +0 -0
  51. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_fastapi.py +0 -0
  52. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_fpdf2.py +0 -0
  53. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_functions.py +0 -0
  54. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_functools.py +0 -0
  55. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_getpass.py +0 -0
  56. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_git.py +0 -0
  57. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_hashlib.py +0 -0
  58. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_http.py +0 -0
  59. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_hypothesis.py +0 -0
  60. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_importlib.py +0 -0
  61. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_ipython.py +0 -0
  62. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_iterables.py +0 -0
  63. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_jupyter.py +0 -0
  64. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_lightweight_charts.py +0 -0
  65. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_logging.py +0 -0
  66. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_loguru.py +0 -0
  67. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_luigi.py +0 -0
  68. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_math.py +0 -0
  69. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_memory_profiler.py +0 -0
  70. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_modules.py +0 -0
  71. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_more_itertools.py +0 -0
  72. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_numpy.py +0 -0
  73. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_operator.py +0 -0
  74. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_optuna.py +0 -0
  75. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_orjson.py +0 -0
  76. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_os.py +0 -0
  77. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_parse.py +0 -0
  78. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pathlib.py +0 -0
  79. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_period.py +0 -0
  80. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pickle.py +0 -0
  81. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_platform.py +0 -0
  82. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_polars.py +0 -0
  83. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_polars_ols.py +0 -0
  84. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pqdm.py +0 -0
  85. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pydantic.py +0 -0
  86. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pyinstrument.py +0 -0
  87. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pyrsistent.py +0 -0
  88. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pytest.py +0 -0
  89. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_pytest_regressions.py +0 -0
  90. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_python_dotenv.py +0 -0
  91. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_random.py +0 -0
  92. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_re.py +0 -0
  93. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_redis.py +0 -0
  94. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_reprlib.py +0 -0
  95. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_rich.py +0 -0
  96. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_scipy.py +0 -0
  97. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_sentinel.py +0 -0
  98. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_shelve.py +0 -0
  99. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_slack_sdk.py +0 -0
  100. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_socket.py +0 -0
  101. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_sqlalchemy.py +0 -0
  102. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  103. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_statsmodel.py +0 -0
  104. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_streamlit.py +0 -0
  105. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_sys.py +0 -0
  106. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_tempfile.py +0 -0
  107. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_tenacity.py +0 -0
  108. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_text.py +0 -0
  109. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_threading.py +0 -0
  110. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_timer.py +0 -0
  111. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback.py +0 -0
  112. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
  113. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/chain.py +0 -0
  114. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  115. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  116. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  117. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/many.py +0 -0
  118. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/one.py +0 -0
  119. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
  120. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  121. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  122. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/two.py +0 -0
  123. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
  124. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_types.py +0 -0
  125. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_typing.py +0 -0
  126. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  127. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  128. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  129. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_tzdata.py +0 -0
  130. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_tzlocal.py +0 -0
  131. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_uuid.py +0 -0
  132. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_version.py +0 -0
  133. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_warnings.py +0 -0
  134. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_whenever.py +0 -0
  135. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_zipfile.py +0 -0
  136. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/tests/test_zoneinfo.py +0 -0
  137. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/altair.py +0 -0
  138. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/astor.py +0 -0
  139. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/atomicwrites.py +0 -0
  140. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/atools.py +0 -0
  141. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/cachetools.py +0 -0
  142. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/click.py +0 -0
  143. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/concurrent.py +0 -0
  144. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/contextlib.py +0 -0
  145. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/contextvars.py +0 -0
  146. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/cryptography.py +0 -0
  147. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/cvxpy.py +0 -0
  148. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/dataclasses.py +0 -0
  149. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/datetime.py +0 -0
  150. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/enum.py +0 -0
  151. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/errors.py +0 -0
  152. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/eventkit.py +0 -0
  153. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/fastapi.py +0 -0
  154. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/fpdf2.py +0 -0
  155. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/functions.py +0 -0
  156. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/functools.py +0 -0
  157. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/getpass.py +0 -0
  158. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/git.py +0 -0
  159. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/hashlib.py +0 -0
  160. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/http.py +0 -0
  161. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/hypothesis.py +0 -0
  162. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/importlib.py +0 -0
  163. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/ipython.py +0 -0
  164. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/iterables.py +0 -0
  165. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/jupyter.py +0 -0
  166. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/lightweight_charts.py +0 -0
  167. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/logging.py +0 -0
  168. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/loguru.py +0 -0
  169. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/luigi.py +0 -0
  170. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/math.py +0 -0
  171. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/memory_profiler.py +0 -0
  172. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/modules.py +0 -0
  173. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/more_itertools.py +0 -0
  174. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/numpy.py +0 -0
  175. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/operator.py +0 -0
  176. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/optuna.py +0 -0
  177. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/orjson.py +0 -0
  178. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/os.py +0 -0
  179. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/parse.py +0 -0
  180. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pathlib.py +0 -0
  181. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/period.py +0 -0
  182. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pickle.py +0 -0
  183. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/platform.py +0 -0
  184. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/polars.py +0 -0
  185. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/polars_ols.py +0 -0
  186. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pqdm.py +0 -0
  187. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/py.typed +0 -0
  188. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pydantic.py +0 -0
  189. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pyinstrument.py +0 -0
  190. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pyrsistent.py +0 -0
  191. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pytest.py +0 -0
  192. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/pytest_regressions.py +0 -0
  193. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/python_dotenv.py +0 -0
  194. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/random.py +0 -0
  195. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/re.py +0 -0
  196. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/redis.py +0 -0
  197. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/reprlib.py +0 -0
  198. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/rich.py +0 -0
  199. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/scipy.py +0 -0
  200. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/sentinel.py +0 -0
  201. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/shelve.py +0 -0
  202. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/slack_sdk.py +0 -0
  203. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/socket.py +0 -0
  204. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/sqlalchemy.py +0 -0
  205. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/sqlalchemy_polars.py +0 -0
  206. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/statsmodels.py +0 -0
  207. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/streamlit.py +0 -0
  208. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/sys.py +0 -0
  209. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/tempfile.py +0 -0
  210. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/tenacity.py +0 -0
  211. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/text.py +0 -0
  212. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/threading.py +0 -0
  213. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/timer.py +0 -0
  214. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/traceback.py +0 -0
  215. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/typing.py +0 -0
  216. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/tzdata.py +0 -0
  217. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/tzlocal.py +0 -0
  218. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/uuid.py +0 -0
  219. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/version.py +0 -0
  220. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/warnings.py +0 -0
  221. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/whenever.py +0 -0
  222. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/zipfile.py +0 -0
  223. {dycw_utilities-0.120.0 → dycw_utilities-0.121.0}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.120.0
3
+ Version: 0.121.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -92,7 +92,7 @@ dependencies = [
92
92
  name = "dycw-utilities"
93
93
  readme = "README.md"
94
94
  requires-python = ">= 3.12"
95
- version = "0.120.0"
95
+ version = "0.121.0"
96
96
 
97
97
  [project.optional-dependencies]
98
98
  test = [
@@ -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.120.0"
337
+ current_version = "0.121.0"
338
338
 
339
339
  [[tool.bumpversion.files]]
340
340
  filename = "src/utilities/__init__.py"
@@ -5,7 +5,7 @@ from dataclasses import dataclass, field
5
5
  from functools import partial
6
6
  from itertools import chain, count
7
7
  from re import search
8
- from typing import TYPE_CHECKING, Self, override
8
+ from typing import TYPE_CHECKING, Any, Self, cast, override
9
9
 
10
10
  from hypothesis import HealthCheck, Phase, given, settings
11
11
  from hypothesis.strategies import (
@@ -23,12 +23,12 @@ from pytest import LogCaptureFixture, mark, raises
23
23
  from utilities.asyncio import (
24
24
  EnhancedTaskGroup,
25
25
  InfiniteLooper,
26
- InfiniteLooperError,
27
26
  InfiniteQueueLooper,
28
27
  InfiniteQueueLooperError,
29
28
  UniquePriorityQueue,
30
29
  UniqueQueue,
31
- _DurationOrEvery,
30
+ _InfiniteLooperDefaultEventError,
31
+ _InfiniteLooperNoSuchEventError,
32
32
  get_event,
33
33
  get_items,
34
34
  get_items_nowait,
@@ -56,7 +56,13 @@ from utilities.timer import Timer
56
56
  if TYPE_CHECKING:
57
57
  from collections.abc import Callable, Iterator
58
58
 
59
- from utilities.types import Coroutine1, Duration, MaybeCallableEvent, MaybeType
59
+ from utilities.types import (
60
+ Coroutine1,
61
+ Duration,
62
+ DurationOrEveryDuration,
63
+ MaybeCallableEvent,
64
+ MaybeType,
65
+ )
60
66
 
61
67
 
62
68
  class TestEnhancedTaskGroup:
@@ -130,7 +136,7 @@ class TestGetEvent:
130
136
 
131
137
  class TestInfiniteLooper:
132
138
  @given(n=integers(10, 11), sleep_core=sampled_from([0.1, ("every", 0.1)]))
133
- async def test_main(self, *, n: int, sleep_core: _DurationOrEvery) -> None:
139
+ async def test_main(self, *, n: int, sleep_core: DurationOrEveryDuration) -> None:
134
140
  class TrueError(BaseException): ...
135
141
 
136
142
  class FalseError(BaseException): ...
@@ -147,7 +153,7 @@ class TestInfiniteLooper:
147
153
  async def _core(self) -> None:
148
154
  self.counter += 1
149
155
  if self.counter >= n:
150
- self._set_event(n % 2 == 0)
156
+ self._set_event(event=n % 2 == 0)
151
157
 
152
158
  @override
153
159
  def _yield_events_and_exceptions(
@@ -166,15 +172,8 @@ class TestInfiniteLooper:
166
172
  _ = await looper()
167
173
 
168
174
  async def test_hashable(self) -> None:
169
- class CustomError(Exception): ...
170
-
171
175
  @dataclass(kw_only=True, unsafe_hash=True)
172
- class Example(InfiniteLooper[None]):
173
- @override
174
- def _yield_events_and_exceptions(
175
- self,
176
- ) -> Iterator[tuple[None, MaybeType[Exception]]]:
177
- yield (None, CustomError)
176
+ class Example(InfiniteLooper[None]): ...
178
177
 
179
178
  looper = Example(sleep_core=0.1)
180
179
  _ = hash(looper)
@@ -189,8 +188,6 @@ class TestInfiniteLooper:
189
188
  obj.counter += 1
190
189
  await sleep(0.05)
191
190
 
192
- class CustomError(Exception): ...
193
-
194
191
  @dataclass(kw_only=True)
195
192
  class Example(InfiniteLooper[None]):
196
193
  initializations: int = 0
@@ -205,18 +202,12 @@ class TestInfiniteLooper:
205
202
  async def _core(self) -> None:
206
203
  self.counter += 1
207
204
  if self.counter >= 5:
208
- self._set_event(None)
205
+ self._set_event()
209
206
 
210
207
  @override
211
208
  def _yield_coroutines(self) -> Iterator[Callable[[], Coroutine1[None]]]:
212
209
  yield partial(inc_external, self)
213
210
 
214
- @override
215
- def _yield_events_and_exceptions(
216
- self,
217
- ) -> Iterator[tuple[None, MaybeType[BaseException]]]:
218
- yield (None, CustomError)
219
-
220
211
  looper = Example(sleep_core=0.05, sleep_restart=0.05)
221
212
  with raises(TimeoutError):
222
213
  async with timeout_dur(duration=1.0):
@@ -251,12 +242,6 @@ class TestInfiniteLooper:
251
242
  def _yield_coroutines(self) -> Iterator[Callable[[], Coroutine1[None]]]:
252
243
  yield dummy
253
244
 
254
- @override
255
- def _yield_events_and_exceptions(
256
- self,
257
- ) -> Iterator[tuple[None, MaybeType[BaseException]]]:
258
- yield (None, CustomError)
259
-
260
245
  looper = Example(sleep_core=0.05, sleep_restart=0.05)
261
246
  with raises(TimeoutError):
262
247
  async with timeout_dur(duration=1.0):
@@ -294,12 +279,6 @@ class TestInfiniteLooper:
294
279
  def _yield_coroutines(self) -> Iterator[Callable[[], Coroutine1[None]]]:
295
280
  yield dummy
296
281
 
297
- @override
298
- def _yield_events_and_exceptions(
299
- self,
300
- ) -> Iterator[tuple[None, MaybeType[BaseException]]]:
301
- yield (None, CustomError)
302
-
303
282
  looper = Example(sleep_core=0.05, sleep_restart=0.05, logger=logger)
304
283
  with raises(CancelledError):
305
284
  async with timeout_dur(duration=1.0):
@@ -307,6 +286,17 @@ class TestInfiniteLooper:
307
286
  assert 3 <= looper.initializations <= 5
308
287
  assert 1 <= looper.counter <= 6
309
288
 
289
+ async def test_error_default_event(self) -> None:
290
+ @dataclass(kw_only=True)
291
+ class Example(InfiniteLooper[None]): ...
292
+
293
+ looper = Example()
294
+
295
+ with raises(
296
+ _InfiniteLooperDefaultEventError, match=r"'Example' default event error"
297
+ ):
298
+ raise _InfiniteLooperDefaultEventError(looper=looper)
299
+
310
300
  @given(logger=just("logger") | none())
311
301
  @mark.parametrize(
312
302
  ("sleep_restart", "desc"),
@@ -321,7 +311,7 @@ class TestInfiniteLooper:
321
311
  async def test_error_upon_initialize(
322
312
  self,
323
313
  *,
324
- sleep_restart: _DurationOrEvery,
314
+ sleep_restart: DurationOrEveryDuration,
325
315
  desc: str,
326
316
  logger: str | None,
327
317
  caplog: LogCaptureFixture,
@@ -361,7 +351,7 @@ class TestInfiniteLooper:
361
351
  async def test_error_group_upon_coroutines(
362
352
  self,
363
353
  *,
364
- sleep_restart: _DurationOrEvery,
354
+ sleep_restart: DurationOrEveryDuration,
365
355
  desc: str,
366
356
  logger: str | None,
367
357
  caplog: LogCaptureFixture,
@@ -374,12 +364,6 @@ class TestInfiniteLooper:
374
364
  async def _core(self) -> None:
375
365
  raise CustomError
376
366
 
377
- @override
378
- def _yield_events_and_exceptions(
379
- self,
380
- ) -> Iterator[tuple[None, MaybeType[BaseException]]]:
381
- yield (None, CustomError)
382
-
383
367
  looper = Example(sleep_core=0.1, sleep_restart=sleep_restart, logger=logger)
384
368
  with raises(TimeoutError):
385
369
  async with timeout_dur(duration=0.5):
@@ -402,10 +386,13 @@ class TestInfiniteLooper:
402
386
  async def _core(self) -> None:
403
387
  self.counter += 1
404
388
  if self.counter >= 10:
405
- self._set_event(None)
389
+ self._set_event(event=cast("Any", "invalid"))
406
390
 
407
- looper = Example(sleep_core=0.1)
408
- with raises(InfiniteLooperError, match="'Example' does not have an event None"):
391
+ looper = Example()
392
+ with raises(
393
+ _InfiniteLooperNoSuchEventError,
394
+ match="'Example' does not have an event 'invalid'",
395
+ ):
409
396
  _ = await looper()
410
397
 
411
398
 
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.120.0"
3
+ __version__ = "0.121.0"
@@ -26,7 +26,6 @@ from typing import (
26
26
  TYPE_CHECKING,
27
27
  Any,
28
28
  Generic,
29
- Literal,
30
29
  NoReturn,
31
30
  TextIO,
32
31
  TypeVar,
@@ -49,6 +48,7 @@ from utilities.reprlib import get_repr
49
48
  from utilities.sentinel import Sentinel, sentinel
50
49
  from utilities.types import (
51
50
  Coroutine1,
51
+ DurationOrEveryDuration,
52
52
  MaybeCallableEvent,
53
53
  MaybeType,
54
54
  THashable,
@@ -121,17 +121,14 @@ class EnhancedTaskGroup(TaskGroup):
121
121
  ##
122
122
 
123
123
 
124
- type _DurationOrEvery = Duration | tuple[Literal["every"], Duration]
125
-
126
-
127
124
  @dataclass(kw_only=True, unsafe_hash=True)
128
125
  class InfiniteLooper(ABC, Generic[THashable]):
129
126
  """An infinite loop which can throw exceptions by setting events."""
130
127
 
131
- sleep_core: _DurationOrEvery = SECOND
132
- sleep_restart: _DurationOrEvery = MINUTE
128
+ sleep_core: DurationOrEveryDuration = SECOND
129
+ sleep_restart: DurationOrEveryDuration = MINUTE
133
130
  logger: str | None = None
134
- _events: Mapping[THashable, Event] = field(
131
+ _events: Mapping[THashable | None, Event] = field(
135
132
  default_factory=dict, init=False, repr=False, hash=False
136
133
  )
137
134
 
@@ -229,7 +226,7 @@ class InfiniteLooper(ABC, Generic[THashable]):
229
226
  msgs.append(f"Sleeping {self._sleep_restart_desc}...")
230
227
  getLogger(name=self.logger).error("\n".join(msgs))
231
228
 
232
- def _raise_error(self, event: THashable, /) -> NoReturn:
229
+ def _raise_error(self, event: THashable | None, /) -> NoReturn:
233
230
  """Raise the error corresponding to given event."""
234
231
  mapping = dict(self._yield_events_and_exceptions())
235
232
  error = mapping.get(event, InfiniteLooperError)
@@ -241,7 +238,7 @@ class InfiniteLooper(ABC, Generic[THashable]):
241
238
  event: Event() for event, _ in self._yield_events_and_exceptions()
242
239
  }
243
240
 
244
- async def _run_sleep(self, sleep: _DurationOrEvery, /) -> None:
241
+ async def _run_sleep(self, sleep: DurationOrEveryDuration, /) -> None:
245
242
  """Sleep until the next part of the loop."""
246
243
  match sleep:
247
244
  case int() | float() | dt.timedelta() as duration:
@@ -264,12 +261,12 @@ class InfiniteLooper(ABC, Generic[THashable]):
264
261
  case _ as never:
265
262
  assert_never(never)
266
263
 
267
- def _set_event(self, event: THashable, /) -> None:
264
+ def _set_event(self, *, event: THashable | None = None) -> None:
268
265
  """Set the given event."""
269
266
  try:
270
267
  event_obj = self._events[event]
271
268
  except KeyError:
272
- raise InfiniteLooperError(looper=self, event=event) from None
269
+ raise _InfiniteLooperNoSuchEventError(looper=self, event=event) from None
273
270
  event_obj.set()
274
271
 
275
272
  def _yield_coroutines(self) -> Iterator[Callable[[], Coroutine1[None]]]:
@@ -278,14 +275,18 @@ class InfiniteLooper(ABC, Generic[THashable]):
278
275
 
279
276
  def _yield_events_and_exceptions(
280
277
  self,
281
- ) -> Iterator[tuple[THashable, MaybeType[BaseException]]]:
278
+ ) -> Iterator[tuple[THashable | None, MaybeType[BaseException]]]:
282
279
  """Yield the events & exceptions."""
283
- yield from []
280
+ yield (None, _InfiniteLooperDefaultEventError)
284
281
 
285
282
 
286
283
  @dataclass(kw_only=True, slots=True)
287
284
  class InfiniteLooperError(Exception):
288
285
  looper: InfiniteLooper[Any]
286
+
287
+
288
+ @dataclass(kw_only=True, slots=True)
289
+ class _InfiniteLooperNoSuchEventError(InfiniteLooperError):
289
290
  event: Hashable
290
291
 
291
292
  @override
@@ -293,6 +294,13 @@ class InfiniteLooperError(Exception):
293
294
  return f"{get_class_name(self.looper)!r} does not have an event {self.event!r}"
294
295
 
295
296
 
297
+ @dataclass(kw_only=True, slots=True)
298
+ class _InfiniteLooperDefaultEventError(InfiniteLooperError):
299
+ @override
300
+ def __str__(self) -> str:
301
+ return f"{get_class_name(self.looper)!r} default event error"
302
+
303
+
296
304
  ##
297
305
 
298
306
 
@@ -92,6 +92,7 @@ type DateTimeLike = MaybeStr[dt.datetime]
92
92
  type DateOrDateTime = dt.date | dt.datetime
93
93
  type Duration = Number | dt.timedelta
94
94
  type DurationLike = MaybeStr[Duration]
95
+ type DurationOrEveryDuration = Duration | tuple[Literal["every"], Duration]
95
96
  type MaybeCallableDate = MaybeCallable[dt.date]
96
97
  type MaybeCallableDateTime = MaybeCallable[dt.datetime]
97
98
  type TimeLike = MaybeStr[dt.time]
@@ -270,6 +271,7 @@ __all__ = [
270
271
  "DateTimeLike",
271
272
  "Duration",
272
273
  "DurationLike",
274
+ "DurationOrEveryDuration",
273
275
  "EnumLike",
274
276
  "ExcInfo",
275
277
  "IterableHashable",