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