dycw-utilities 0.122.0__tar.gz → 0.123.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.122.0 → dycw_utilities-0.123.0}/PKG-INFO +1 -1
  2. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/pyproject.toml +3 -2
  3. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_asyncio.py +45 -3
  4. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/asyncio.py +31 -16
  6. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/.gitignore +0 -0
  7. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/LICENSE +0 -0
  8. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/README.md +0 -0
  9. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/__init__.py +0 -0
  10. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/conftest.py +0 -0
  11. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/__init__.py +0 -0
  12. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_missing/__init__.py +0 -0
  13. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_missing/module.py +0 -0
  14. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/__init__.py +0 -0
  15. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/outer_1.py +0 -0
  16. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/outer_2.py +0 -0
  17. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  18. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  19. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  20. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  21. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/__init__.py +0 -0
  22. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/module_1.py +0 -0
  23. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/package_without/module_2.py +0 -0
  24. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/standalone.py +0 -0
  25. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/modules/with_imports.py +0 -0
  26. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  27. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  28. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  29. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  30. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  31. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  32. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  33. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  34. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_altair.py +0 -0
  35. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_astor.py +0 -0
  36. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_atomicwrites.py +0 -0
  37. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_atools.py +0 -0
  38. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_cachetools.py +0 -0
  39. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_click.py +0 -0
  40. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_concurrent.py +0 -0
  41. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_contextlib.py +0 -0
  42. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_contextvars.py +0 -0
  43. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_cryptography.py +0 -0
  44. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_cvxpy.py +0 -0
  45. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_dataclasses.py +0 -0
  46. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_datetime.py +0 -0
  47. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_enum.py +0 -0
  48. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_errors.py +0 -0
  49. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_eventkit.py +0 -0
  50. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_fastapi.py +0 -0
  51. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_fpdf2.py +0 -0
  52. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_functions.py +0 -0
  53. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_functools.py +0 -0
  54. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_getpass.py +0 -0
  55. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_git.py +0 -0
  56. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_hashlib.py +0 -0
  57. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_http.py +0 -0
  58. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_hypothesis.py +0 -0
  59. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_importlib.py +0 -0
  60. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_ipython.py +0 -0
  61. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_iterables.py +0 -0
  62. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_jupyter.py +0 -0
  63. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_lightweight_charts.py +0 -0
  64. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_logging.py +0 -0
  65. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_loguru.py +0 -0
  66. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_luigi.py +0 -0
  67. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_math.py +0 -0
  68. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_memory_profiler.py +0 -0
  69. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_modules.py +0 -0
  70. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_more_itertools.py +0 -0
  71. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_numpy.py +0 -0
  72. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_operator.py +0 -0
  73. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_optuna.py +0 -0
  74. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_orjson.py +0 -0
  75. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_os.py +0 -0
  76. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_parse.py +0 -0
  77. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pathlib.py +0 -0
  78. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_period.py +0 -0
  79. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pickle.py +0 -0
  80. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_platform.py +0 -0
  81. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_polars.py +0 -0
  82. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_polars_ols.py +0 -0
  83. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pqdm.py +0 -0
  84. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pydantic.py +0 -0
  85. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pyinstrument.py +0 -0
  86. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pyrsistent.py +0 -0
  87. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pytest.py +0 -0
  88. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_pytest_regressions.py +0 -0
  89. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_python_dotenv.py +0 -0
  90. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_random.py +0 -0
  91. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_re.py +0 -0
  92. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_redis.py +0 -0
  93. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_reprlib.py +0 -0
  94. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_rich.py +0 -0
  95. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_scipy.py +0 -0
  96. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sentinel.py +0 -0
  97. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_shelve.py +0 -0
  98. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_slack_sdk.py +0 -0
  99. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_socket.py +0 -0
  100. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sqlalchemy.py +0 -0
  101. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  102. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_statsmodel.py +0 -0
  103. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_streamlit.py +0 -0
  104. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_sys.py +0 -0
  105. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tempfile.py +0 -0
  106. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tenacity.py +0 -0
  107. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_text.py +0 -0
  108. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_threading.py +0 -0
  109. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_timer.py +0 -0
  110. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback.py +0 -0
  111. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
  112. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/chain.py +0 -0
  113. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  114. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  115. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  116. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/many.py +0 -0
  117. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/one.py +0 -0
  118. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
  119. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  120. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  121. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/two.py +0 -0
  122. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
  123. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_types.py +0 -0
  124. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing.py +0 -0
  125. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  126. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  127. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  128. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tzdata.py +0 -0
  129. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_tzlocal.py +0 -0
  130. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_uuid.py +0 -0
  131. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_version.py +0 -0
  132. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_warnings.py +0 -0
  133. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_whenever.py +0 -0
  134. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_zipfile.py +0 -0
  135. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/tests/test_zoneinfo.py +0 -0
  136. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/altair.py +0 -0
  137. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/astor.py +0 -0
  138. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/atomicwrites.py +0 -0
  139. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/atools.py +0 -0
  140. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/cachetools.py +0 -0
  141. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/click.py +0 -0
  142. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/concurrent.py +0 -0
  143. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/contextlib.py +0 -0
  144. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/contextvars.py +0 -0
  145. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/cryptography.py +0 -0
  146. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/cvxpy.py +0 -0
  147. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/dataclasses.py +0 -0
  148. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/datetime.py +0 -0
  149. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/enum.py +0 -0
  150. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/errors.py +0 -0
  151. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/eventkit.py +0 -0
  152. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/fastapi.py +0 -0
  153. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/fpdf2.py +0 -0
  154. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/functions.py +0 -0
  155. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/functools.py +0 -0
  156. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/getpass.py +0 -0
  157. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/git.py +0 -0
  158. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/hashlib.py +0 -0
  159. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/http.py +0 -0
  160. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/hypothesis.py +0 -0
  161. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/importlib.py +0 -0
  162. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/ipython.py +0 -0
  163. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/iterables.py +0 -0
  164. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/jupyter.py +0 -0
  165. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/lightweight_charts.py +0 -0
  166. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/logging.py +0 -0
  167. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/loguru.py +0 -0
  168. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/luigi.py +0 -0
  169. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/math.py +0 -0
  170. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/memory_profiler.py +0 -0
  171. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/modules.py +0 -0
  172. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/more_itertools.py +0 -0
  173. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/numpy.py +0 -0
  174. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/operator.py +0 -0
  175. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/optuna.py +0 -0
  176. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/orjson.py +0 -0
  177. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/os.py +0 -0
  178. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/parse.py +0 -0
  179. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pathlib.py +0 -0
  180. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/period.py +0 -0
  181. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pickle.py +0 -0
  182. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/platform.py +0 -0
  183. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/polars.py +0 -0
  184. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/polars_ols.py +0 -0
  185. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pqdm.py +0 -0
  186. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/py.typed +0 -0
  187. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pydantic.py +0 -0
  188. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pyinstrument.py +0 -0
  189. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pyrsistent.py +0 -0
  190. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pytest.py +0 -0
  191. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/pytest_regressions.py +0 -0
  192. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/python_dotenv.py +0 -0
  193. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/random.py +0 -0
  194. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/re.py +0 -0
  195. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/redis.py +0 -0
  196. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/reprlib.py +0 -0
  197. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/rich.py +0 -0
  198. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/scipy.py +0 -0
  199. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sentinel.py +0 -0
  200. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/shelve.py +0 -0
  201. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/slack_sdk.py +0 -0
  202. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/socket.py +0 -0
  203. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sqlalchemy.py +0 -0
  204. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sqlalchemy_polars.py +0 -0
  205. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/statsmodels.py +0 -0
  206. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/streamlit.py +0 -0
  207. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/sys.py +0 -0
  208. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tempfile.py +0 -0
  209. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tenacity.py +0 -0
  210. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/text.py +0 -0
  211. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/threading.py +0 -0
  212. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/timer.py +0 -0
  213. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/traceback.py +0 -0
  214. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/types.py +0 -0
  215. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/typing.py +0 -0
  216. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tzdata.py +0 -0
  217. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/tzlocal.py +0 -0
  218. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/uuid.py +0 -0
  219. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/version.py +0 -0
  220. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/warnings.py +0 -0
  221. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/whenever.py +0 -0
  222. {dycw_utilities-0.122.0 → dycw_utilities-0.123.0}/src/utilities/zipfile.py +0 -0
  223. {dycw_utilities-0.122.0 → dycw_utilities-0.123.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.122.0
3
+ Version: 0.123.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.122.0"
95
+ version = "0.123.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.122.0"
337
+ current_version = "0.123.0"
338
338
 
339
339
  [[tool.bumpversion.files]]
340
340
  filename = "src/utilities/__init__.py"
@@ -433,6 +433,7 @@ addopts = [
433
433
  "--durations=10",
434
434
  "--durations-min=10",
435
435
  "--strict-markers",
436
+ "--timeout=300",
436
437
  ]
437
438
  asyncio_default_fixture_loop_scope = "function"
438
439
  asyncio_mode = "auto"
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from asyncio import CancelledError, Event, Queue, TaskGroup, run, sleep, timeout
4
+ from contextlib import asynccontextmanager
4
5
  from dataclasses import dataclass, field
5
6
  from functools import partial
6
7
  from itertools import chain, count
@@ -53,7 +54,7 @@ from utilities.sentinel import Sentinel, sentinel
53
54
  from utilities.timer import Timer
54
55
 
55
56
  if TYPE_CHECKING:
56
- from collections.abc import Callable, Iterator
57
+ from collections.abc import AsyncIterator, Callable, Iterator
57
58
 
58
59
  from utilities.types import (
59
60
  Coroutine1,
@@ -65,6 +66,47 @@ if TYPE_CHECKING:
65
66
 
66
67
 
67
68
  class TestEnhancedTaskGroup:
69
+ async def test_create_task_context_coroutine(self) -> None:
70
+ flag: bool = False
71
+
72
+ @asynccontextmanager
73
+ async def yield_true() -> AsyncIterator[None]:
74
+ nonlocal flag
75
+ try:
76
+ flag = True
77
+ yield
78
+ finally:
79
+ flag = False
80
+
81
+ assert not flag
82
+ async with EnhancedTaskGroup(timeout=0.1) as tg:
83
+ _ = tg.create_task_context(yield_true())
84
+ await sleep(0.05)
85
+ assert flag
86
+ assert not flag
87
+
88
+ async def test_create_task_context_looper(self) -> None:
89
+ @dataclass(kw_only=True)
90
+ class Example(InfiniteLooper[None]):
91
+ running: bool = False
92
+
93
+ @override
94
+ async def _initialize(self) -> None:
95
+ self.running = True
96
+
97
+ @override
98
+ async def _teardown(self) -> None:
99
+ self.running = False
100
+
101
+ looper = Example(duration=0.1)
102
+ assert not looper.running
103
+ async with EnhancedTaskGroup(timeout=0.1) as tg:
104
+ assert not looper.running
105
+ _ = tg.create_task_context(looper)
106
+ await sleep(0.05)
107
+ assert looper.running
108
+ assert not looper.running
109
+
68
110
  async def test_max_tasks_disabled(self) -> None:
69
111
  with Timer() as timer:
70
112
  async with EnhancedTaskGroup() as tg:
@@ -314,7 +356,7 @@ class TestInfiniteLooper:
314
356
 
315
357
  async def inc_external(obj: Example, /) -> None:
316
358
  nonlocal external
317
- while True:
359
+ for _ in range(100): # infinite doesn't work on CI
318
360
  external += 1
319
361
  obj.counter += 1
320
362
  await sleep(0.05)
@@ -346,7 +388,7 @@ class TestInfiniteLooper:
346
388
  ...
347
389
  assert 4 <= looper.initializations <= 6
348
390
  assert 0 <= looper.counter <= 7
349
- assert 16 <= external <= 21
391
+ assert 14 <= external <= 21
350
392
 
351
393
  async def test_with_coroutine_self_error(self) -> None:
352
394
  class CustomError(Exception): ...
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.122.0"
3
+ __version__ = "0.123.0"
@@ -19,6 +19,7 @@ from asyncio import (
19
19
  )
20
20
  from collections.abc import Callable, Hashable, Iterable, Iterator, Mapping
21
21
  from contextlib import (
22
+ AbstractAsyncContextManager,
22
23
  AsyncExitStack,
23
24
  _AsyncGeneratorContextManager,
24
25
  asynccontextmanager,
@@ -85,6 +86,7 @@ class EnhancedTaskGroup(TaskGroup):
85
86
  _semaphore: Semaphore | None
86
87
  _timeout: Duration | None
87
88
  _error: type[Exception]
89
+ _stack: AsyncExitStack
88
90
  _timeout_cm: _AsyncGeneratorContextManager[None] | None
89
91
 
90
92
  @override
@@ -99,8 +101,24 @@ class EnhancedTaskGroup(TaskGroup):
99
101
  self._semaphore = None if max_tasks is None else Semaphore(max_tasks)
100
102
  self._timeout = timeout
101
103
  self._error = error
104
+ self._stack = AsyncExitStack()
102
105
  self._timeout_cm = None
103
106
 
107
+ @override
108
+ async def __aenter__(self) -> Self:
109
+ _ = await self._stack.__aenter__()
110
+ return await super().__aenter__()
111
+
112
+ @override
113
+ async def __aexit__(
114
+ self,
115
+ et: type[BaseException] | None,
116
+ exc: BaseException | None,
117
+ tb: TracebackType | None,
118
+ ) -> None:
119
+ _ = await self._stack.__aexit__(et, exc, tb)
120
+ _ = await super().__aexit__(et, exc, tb)
121
+
104
122
  @override
105
123
  def create_task(
106
124
  self,
@@ -116,6 +134,11 @@ class EnhancedTaskGroup(TaskGroup):
116
134
  coroutine = self._wrap_with_timeout(coroutine)
117
135
  return super().create_task(coroutine, name=name, context=context)
118
136
 
137
+ def create_task_context(self, cm: AbstractAsyncContextManager[_T], /) -> Task[_T]:
138
+ """Have the TaskGroup start an asynchronous context manager."""
139
+ _ = self._stack.push_async_callback(cm.__aexit__, None, None, None)
140
+ return self.create_task(cm.__aenter__())
141
+
119
142
  async def _wrap_with_semaphore(
120
143
  self, semaphore: Semaphore, coroutine: _CoroutineLike[_T], /
121
144
  ) -> _T:
@@ -155,18 +178,12 @@ class InfiniteLooper(ABC, Generic[THashable]):
155
178
 
156
179
  async def __aenter__(self) -> Self:
157
180
  """Context manager entry."""
158
- if (self._task is None) and (self._depth == 0):
159
- _ = await self._stack.__aenter__()
181
+ if self._depth == 0:
160
182
  self._task = create_task(self._run_looper())
161
183
  if self._await_upon_aenter:
162
184
  with suppress(CancelledError):
163
185
  await self._task
164
- elif (self._task is not None) and (self._depth >= 1):
165
- ...
166
- else:
167
- raise ImpossibleCaseError( # pragma: no cover
168
- case=[f"{self._task=}", f"{self._depth=}"]
169
- )
186
+ _ = await self._stack.__aenter__()
170
187
  self._depth += 1
171
188
  return self
172
189
 
@@ -178,18 +195,16 @@ class InfiniteLooper(ABC, Generic[THashable]):
178
195
  ) -> None:
179
196
  """Context manager exit."""
180
197
  _ = (exc_type, exc_value, traceback)
181
- if (self._task is None) or (self._depth == 0):
182
- raise ImpossibleCaseError( # pragma: no cover
183
- case=[f"{self._task=}", f"{self._depth=}"]
184
- )
185
- self._depth -= 1
186
- if self._depth == 0:
187
- _ = await self._stack.__aexit__(exc_type, exc_value, traceback)
198
+ self._depth = max(self._depth - 1, 0)
199
+ if (self._depth == 0) and (self._task is not None):
188
200
  with suppress(CancelledError):
189
201
  await self._task
190
202
  self._task = None
191
- with suppress(Exception):
203
+ try:
192
204
  await self._teardown()
205
+ except Exception as error: # noqa: BLE001
206
+ self._error_upon_teardown(error)
207
+ _ = await self._stack.__aexit__(exc_type, exc_value, traceback)
193
208
 
194
209
  async def stop(self) -> None:
195
210
  """Stop the service."""