dycw-utilities 0.125.17__tar.gz → 0.125.18__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 (225) hide show
  1. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/PKG-INFO +1 -1
  2. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/pyproject.toml +2 -2
  3. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_asyncio.py +121 -74
  4. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/.gitignore +0 -0
  6. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/LICENSE +0 -0
  7. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/README.md +0 -0
  8. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/__init__.py +0 -0
  9. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/conftest.py +0 -0
  10. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/__init__.py +0 -0
  11. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_missing/__init__.py +0 -0
  12. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_missing/module.py +0 -0
  13. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_with/__init__.py +0 -0
  14. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_with/outer_1.py +0 -0
  15. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_with/outer_2.py +0 -0
  16. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  17. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  18. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  19. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  20. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_without/__init__.py +0 -0
  21. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_without/module_1.py +0 -0
  22. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/package_without/module_2.py +0 -0
  23. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/standalone.py +0 -0
  24. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/modules/with_imports.py +0 -0
  25. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  26. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  27. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  28. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  29. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  30. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  31. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  32. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  33. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_altair.py +0 -0
  34. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_atomicwrites.py +0 -0
  35. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_atools.py +0 -0
  36. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_cachetools.py +0 -0
  37. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_click.py +0 -0
  38. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_concurrent.py +0 -0
  39. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_contextlib.py +0 -0
  40. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_contextvars.py +0 -0
  41. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_cryptography.py +0 -0
  42. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_cvxpy.py +0 -0
  43. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_dataclasses.py +0 -0
  44. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_datetime.py +0 -0
  45. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_enum.py +0 -0
  46. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_errors.py +0 -0
  47. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_eventkit.py +0 -0
  48. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_fastapi.py +0 -0
  49. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_fpdf2.py +0 -0
  50. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_functions.py +0 -0
  51. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_functools.py +0 -0
  52. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_getpass.py +0 -0
  53. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_git.py +0 -0
  54. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_hashlib.py +0 -0
  55. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_http.py +0 -0
  56. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_hypothesis.py +0 -0
  57. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_importlib.py +0 -0
  58. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_ipython.py +0 -0
  59. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_iterables.py +0 -0
  60. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_jupyter.py +0 -0
  61. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_libcst.py +0 -0
  62. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_lightweight_charts.py +0 -0
  63. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_logging.py +0 -0
  64. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_loguru.py +0 -0
  65. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_luigi.py +0 -0
  66. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_math.py +0 -0
  67. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_memory_profiler.py +0 -0
  68. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_modules.py +0 -0
  69. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_more_itertools.py +0 -0
  70. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_numpy.py +0 -0
  71. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_operator.py +0 -0
  72. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_optuna.py +0 -0
  73. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_orjson.py +0 -0
  74. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_os.py +0 -0
  75. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_parse.py +0 -0
  76. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pathlib.py +0 -0
  77. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_period.py +0 -0
  78. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pickle.py +0 -0
  79. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_platform.py +0 -0
  80. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_polars.py +0 -0
  81. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_polars_ols.py +0 -0
  82. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pqdm.py +0 -0
  83. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pydantic.py +0 -0
  84. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pyinstrument.py +0 -0
  85. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pyrsistent.py +0 -0
  86. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pytest.py +0 -0
  87. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_pytest_regressions.py +0 -0
  88. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_python_dotenv.py +0 -0
  89. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_random.py +0 -0
  90. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_re.py +0 -0
  91. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_redis.py +0 -0
  92. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_reprlib.py +0 -0
  93. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_rich.py +0 -0
  94. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_scipy.py +0 -0
  95. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_sentinel.py +0 -0
  96. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_shelve.py +0 -0
  97. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_slack_sdk.py +0 -0
  98. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_socket.py +0 -0
  99. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_sqlalchemy.py +0 -0
  100. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_sqlalchemy_polars.py +0 -0
  101. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_statsmodel.py +0 -0
  102. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_streamlit.py +0 -0
  103. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_string.py +0 -0
  104. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_sys.py +0 -0
  105. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_tempfile.py +0 -0
  106. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_tenacity.py +0 -0
  107. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_text.py +0 -0
  108. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_threading.py +0 -0
  109. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_timer.py +0 -0
  110. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback.py +0 -0
  111. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/__init__.py +0 -0
  112. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/chain.py +0 -0
  113. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  114. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  115. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  116. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/many.py +0 -0
  117. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/one.py +0 -0
  118. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/recursive.py +0 -0
  119. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  120. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  121. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/two.py +0 -0
  122. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_traceback_funcs/untraced.py +0 -0
  123. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_types.py +0 -0
  124. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_typing.py +0 -0
  125. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_typing_funcs/__init__.py +0 -0
  126. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_typing_funcs/no_future.py +0 -0
  127. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_typing_funcs/with_future.py +0 -0
  128. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_tzdata.py +0 -0
  129. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_tzlocal.py +0 -0
  130. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_uuid.py +0 -0
  131. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_version.py +0 -0
  132. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_warnings.py +0 -0
  133. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_whenever.py +0 -0
  134. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_zipfile.py +0 -0
  135. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/tests/test_zoneinfo.py +0 -0
  136. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/altair.py +0 -0
  137. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/asyncio.py +0 -0
  138. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/atomicwrites.py +0 -0
  139. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/atools.py +0 -0
  140. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/cachetools.py +0 -0
  141. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/click.py +0 -0
  142. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/concurrent.py +0 -0
  143. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/contextlib.py +0 -0
  144. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/contextvars.py +0 -0
  145. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/cryptography.py +0 -0
  146. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/cvxpy.py +0 -0
  147. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/dataclasses.py +0 -0
  148. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/datetime.py +0 -0
  149. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/enum.py +0 -0
  150. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/errors.py +0 -0
  151. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/eventkit.py +0 -0
  152. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/fastapi.py +0 -0
  153. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/fpdf2.py +0 -0
  154. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/functions.py +0 -0
  155. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/functools.py +0 -0
  156. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/getpass.py +0 -0
  157. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/git.py +0 -0
  158. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/hashlib.py +0 -0
  159. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/http.py +0 -0
  160. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/hypothesis.py +0 -0
  161. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/importlib.py +0 -0
  162. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/ipython.py +0 -0
  163. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/iterables.py +0 -0
  164. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/jupyter.py +0 -0
  165. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/libcst.py +0 -0
  166. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/lightweight_charts.py +0 -0
  167. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/logging.py +0 -0
  168. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/loguru.py +0 -0
  169. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/luigi.py +0 -0
  170. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/math.py +0 -0
  171. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/memory_profiler.py +0 -0
  172. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/modules.py +0 -0
  173. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/more_itertools.py +0 -0
  174. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/numpy.py +0 -0
  175. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/operator.py +0 -0
  176. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/optuna.py +0 -0
  177. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/orjson.py +0 -0
  178. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/os.py +0 -0
  179. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/parse.py +0 -0
  180. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pathlib.py +0 -0
  181. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/period.py +0 -0
  182. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pickle.py +0 -0
  183. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/platform.py +0 -0
  184. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/polars.py +0 -0
  185. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/polars_ols.py +0 -0
  186. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pqdm.py +0 -0
  187. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/py.typed +0 -0
  188. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pydantic.py +0 -0
  189. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pyinstrument.py +0 -0
  190. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pyrsistent.py +0 -0
  191. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pytest.py +0 -0
  192. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/pytest_regressions.py +0 -0
  193. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/python_dotenv.py +0 -0
  194. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/random.py +0 -0
  195. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/re.py +0 -0
  196. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/redis.py +0 -0
  197. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/reprlib.py +0 -0
  198. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/rich.py +0 -0
  199. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/scipy.py +0 -0
  200. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/sentinel.py +0 -0
  201. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/shelve.py +0 -0
  202. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/slack_sdk.py +0 -0
  203. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/socket.py +0 -0
  204. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/sqlalchemy.py +0 -0
  205. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/sqlalchemy_polars.py +0 -0
  206. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/statsmodels.py +0 -0
  207. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/streamlit.py +0 -0
  208. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/string.py +0 -0
  209. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/sys.py +0 -0
  210. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/tempfile.py +0 -0
  211. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/tenacity.py +0 -0
  212. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/text.py +0 -0
  213. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/threading.py +0 -0
  214. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/timer.py +0 -0
  215. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/traceback.py +0 -0
  216. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/types.py +0 -0
  217. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/typing.py +0 -0
  218. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/tzdata.py +0 -0
  219. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/tzlocal.py +0 -0
  220. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/uuid.py +0 -0
  221. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/version.py +0 -0
  222. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/warnings.py +0 -0
  223. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/whenever.py +0 -0
  224. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/zipfile.py +0 -0
  225. {dycw_utilities-0.125.17 → dycw_utilities-0.125.18}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.125.17
3
+ Version: 0.125.18
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -93,7 +93,7 @@ dependencies = [
93
93
  name = "dycw-utilities"
94
94
  readme = "README.md"
95
95
  requires-python = ">= 3.12"
96
- version = "0.125.17"
96
+ version = "0.125.18"
97
97
 
98
98
  [project.optional-dependencies]
99
99
  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.125.17"
337
+ current_version = "0.125.18"
338
338
 
339
339
  [[tool.bumpversion.files]]
340
340
  filename = "src/utilities/__init__.py"
@@ -921,6 +921,11 @@ class _ExampleOuterLooper(_ExampleLooper):
921
921
 
922
922
 
923
923
  class TestLooper:
924
+ sleep_if_failure_cases: ClassVar[list[Any]] = [
925
+ param(True, "; sleeping for .*"),
926
+ param(False, ""),
927
+ ]
928
+
924
929
  async def test_main_with_nothing(self) -> None:
925
930
  looper = _ExampleLooper()
926
931
  async with looper:
@@ -995,13 +1000,10 @@ class TestLooper:
995
1000
  _ = await looper.initialize(sleep_if_failure=False)
996
1001
  _ = one(m for m in caplog.messages if search(": already initializing$", m))
997
1002
 
998
- @given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
999
- @settings(suppress_health_check={HealthCheck.function_scoped_fixture})
1003
+ @mark.parametrize(("sleep_if_failure", "extra"), sleep_if_failure_cases)
1000
1004
  async def test_initialize_failure(
1001
- self, *, case: tuple[bool, str], caplog: LogCaptureFixture
1005
+ self, *, sleep_if_failure: bool, extra: str, caplog: LogCaptureFixture
1002
1006
  ) -> None:
1003
- sleep_if_failure, extra = case
1004
-
1005
1007
  class Example(_ExampleLooper):
1006
1008
  @override
1007
1009
  async def _initialize_core(self) -> None:
@@ -1011,13 +1013,8 @@ class TestLooper:
1011
1013
 
1012
1014
  looper = Example()
1013
1015
  _ = await looper.initialize(sleep_if_failure=sleep_if_failure)
1014
- _ = one(
1015
- m
1016
- for m in caplog.messages
1017
- if search(
1018
- rf": encountered _ExampleLooperError\(\) whilst initializing{extra}$", m
1019
- )
1020
- )
1016
+ pattern = rf": encountered _ExampleLooperError\(\) whilst initializing{extra}$"
1017
+ _ = one(m for m in caplog.messages if search(pattern, m))
1021
1018
 
1022
1019
  def test_len_and_qsize(self) -> None:
1023
1020
  looper = _ExampleLooper()
@@ -1136,13 +1133,10 @@ class TestLooper:
1136
1133
  if search(r": already requested stop when empty$", m)
1137
1134
  )
1138
1135
 
1139
- @given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
1140
- @settings(suppress_health_check={HealthCheck.function_scoped_fixture})
1136
+ @mark.parametrize(("sleep_if_failure", "extra"), sleep_if_failure_cases)
1141
1137
  async def test_restart_failure_during_initialization(
1142
- self, *, case: tuple[bool, str], caplog: LogCaptureFixture
1138
+ self, *, sleep_if_failure: bool, extra: str, caplog: LogCaptureFixture
1143
1139
  ) -> None:
1144
- sleep_if_failure, extra = case
1145
-
1146
1140
  class Example(_ExampleLooper):
1147
1141
  @override
1148
1142
  async def _initialize_core(self) -> None:
@@ -1152,22 +1146,13 @@ class TestLooper:
1152
1146
 
1153
1147
  looper = Example()
1154
1148
  await looper.restart(sleep_if_failure=sleep_if_failure)
1155
- _ = one(
1156
- m
1157
- for m in caplog.messages
1158
- if search(
1159
- rf": encountered _ExampleLooperError\(\) whilst restarting \(initialize\){extra}$",
1160
- m,
1161
- )
1162
- )
1149
+ pattern = rf": encountered _ExampleLooperError\(\) whilst restarting \(initialize\){extra}$"
1150
+ _ = one(m for m in caplog.messages if search(pattern, m))
1163
1151
 
1164
- @given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
1165
- @settings(suppress_health_check={HealthCheck.function_scoped_fixture})
1152
+ @mark.parametrize(("sleep_if_failure", "extra"), sleep_if_failure_cases)
1166
1153
  async def test_restart_failure_during_tear_down(
1167
- self, *, case: tuple[bool, str], caplog: LogCaptureFixture
1154
+ self, *, sleep_if_failure: bool, extra: str, caplog: LogCaptureFixture
1168
1155
  ) -> None:
1169
- sleep_if_failure, extra = case
1170
-
1171
1156
  class Example(_ExampleLooper):
1172
1157
  @override
1173
1158
  async def _tear_down_core(self) -> None:
@@ -1177,22 +1162,13 @@ class TestLooper:
1177
1162
 
1178
1163
  looper = Example()
1179
1164
  await looper.restart(sleep_if_failure=sleep_if_failure)
1180
- _ = one(
1181
- m
1182
- for m in caplog.messages
1183
- if search(
1184
- rf": encountered _ExampleLooperError\(\) whilst restarting \(tear down\){extra}$",
1185
- m,
1186
- )
1187
- )
1165
+ pattern = rf": encountered _ExampleLooperError\(\) whilst restarting \(tear down\){extra}$"
1166
+ _ = one(m for m in caplog.messages if search(pattern, m))
1188
1167
 
1189
- @given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
1190
- @settings(suppress_health_check={HealthCheck.function_scoped_fixture})
1168
+ @mark.parametrize(("sleep_if_failure", "extra"), sleep_if_failure_cases)
1191
1169
  async def test_restart_failure_during_tear_down_and_initialization(
1192
- self, *, case: tuple[bool, str], caplog: LogCaptureFixture
1170
+ self, *, sleep_if_failure: bool, extra: str, caplog: LogCaptureFixture
1193
1171
  ) -> None:
1194
- sleep_if_failure, extra = case
1195
-
1196
1172
  class Example(_ExampleLooper):
1197
1173
  @override
1198
1174
  async def _initialize_core(self) -> None:
@@ -1208,18 +1184,15 @@ class TestLooper:
1208
1184
 
1209
1185
  looper = Example()
1210
1186
  await looper.restart(sleep_if_failure=sleep_if_failure)
1211
- _ = one(
1212
- m
1213
- for m in caplog.messages
1214
- if search(
1215
- rf": encountered _ExampleLooperError\(\) \(tear down\) and then _ExampleLooperError\(\) \(initialization\) whilst restarting{extra}$",
1216
- m,
1217
- )
1218
- )
1187
+ pattern = rf": encountered _ExampleLooperError\(\) \(tear down\) and then _ExampleLooperError\(\) \(initialization\) whilst restarting{extra}$"
1188
+ _ = one(m for m in caplog.messages if search(pattern, m))
1219
1189
 
1220
- async def test_sub_looper(self) -> None:
1190
+ @mark.parametrize("auto_start", [param(True), param(False)])
1191
+ async def test_sub_looper_one(
1192
+ self, *, auto_start: bool, caplog: LogCaptureFixture
1193
+ ) -> None:
1221
1194
  looper = _ExampleOuterLooper(auto_start=True, timeout=SECOND)
1222
- looper.inner.auto_start = True
1195
+ looper.inner.auto_start = auto_start
1223
1196
  async with looper:
1224
1197
  ...
1225
1198
  self._assert_stats(looper, stops=1)
@@ -1232,19 +1205,101 @@ class TestLooper:
1232
1205
  restart_successes=13,
1233
1206
  stops=1,
1234
1207
  )
1208
+ pattern = r": changing sub-looper _ExampleLooper\(.*?\) to auto-start\.\.\.$"
1209
+ matches = [m for m in caplog.messages if bool(search(pattern, m))]
1210
+ if auto_start:
1211
+ assert len(matches) == 0
1212
+ else:
1213
+ _ = one(matches)
1235
1214
 
1236
- async def test_sub_looper_changing_to_auto_start(
1237
- self, *, caplog: LogCaptureFixture
1238
- ) -> None:
1239
- looper = _ExampleOuterLooper(auto_start=True, timeout=SECOND)
1215
+ async def test_sub_loopers_multiple(self) -> None:
1216
+ @dataclass(kw_only=True)
1217
+ class Example(_ExampleLooper):
1218
+ inner1: _ExampleLooper = field(init=False, repr=False)
1219
+ inner2: _ExampleLooper = field(init=False, repr=False)
1220
+
1221
+ @override
1222
+ def __post_init__(self) -> None:
1223
+ super().__post_init__()
1224
+ self.inner1 = _ExampleLooper(
1225
+ freq=self.freq / 2,
1226
+ backoff=self.backoff / 2,
1227
+ logger=self.logger,
1228
+ timeout=self.timeout,
1229
+ timeout_error=self.timeout_error,
1230
+ max_count=round(self.max_count / 2),
1231
+ )
1232
+ self.inner2 = _ExampleLooper(
1233
+ freq=self.freq / 2,
1234
+ backoff=self.backoff / 2,
1235
+ logger=self.logger,
1236
+ timeout=self.timeout,
1237
+ timeout_error=self.timeout_error,
1238
+ max_count=round(self.max_count / 2),
1239
+ )
1240
+
1241
+ @override
1242
+ def _yield_sub_loopers(self) -> Iterator[Looper]:
1243
+ yield self.inner1
1244
+ yield self.inner2
1245
+
1246
+ looper = Example(auto_start=True, timeout=SECOND)
1240
1247
  async with looper:
1241
1248
  ...
1242
- _ = one(
1243
- m
1244
- for m in caplog.messages
1245
- if search(
1246
- r": changing sub-looper _ExampleLooper\(.*?\) to auto-start...$", m
1249
+ self._assert_stats(looper, stops=1)
1250
+ for inner in [looper.inner1, looper.inner2]:
1251
+ self._assert_stats(
1252
+ inner,
1253
+ core_successes=56,
1254
+ core_failures=13,
1255
+ initialization_successes=14,
1256
+ tear_down_successes=13,
1257
+ restart_successes=13,
1258
+ stops=1,
1247
1259
  )
1260
+
1261
+ async def test_sub_loopers_nested(self) -> None:
1262
+ @dataclass(kw_only=True)
1263
+ class Example(_ExampleLooper):
1264
+ middle: _ExampleOuterLooper = field(init=False, repr=False)
1265
+
1266
+ @override
1267
+ def __post_init__(self) -> None:
1268
+ super().__post_init__()
1269
+ self.middle = _ExampleOuterLooper(
1270
+ freq=self.freq / 2,
1271
+ backoff=self.backoff / 2,
1272
+ logger=self.logger,
1273
+ timeout=self.timeout,
1274
+ timeout_error=self.timeout_error,
1275
+ max_count=round(self.max_count / 2),
1276
+ )
1277
+
1278
+ @override
1279
+ def _yield_sub_loopers(self) -> Iterator[Looper]:
1280
+ yield self.middle
1281
+
1282
+ looper = Example(auto_start=True, timeout=SECOND)
1283
+ async with looper:
1284
+ ...
1285
+ self._assert_stats(looper, stops=1)
1286
+ self._assert_stats(
1287
+ looper.middle,
1288
+ core_successes=56,
1289
+ core_failures=13,
1290
+ initialization_successes=14,
1291
+ tear_down_successes=13,
1292
+ restart_successes=13,
1293
+ stops=1,
1294
+ )
1295
+ self._assert_stats(
1296
+ looper.middle.inner,
1297
+ core_successes=34,
1298
+ core_failures=34,
1299
+ initialization_successes=34,
1300
+ tear_down_successes=33,
1301
+ restart_successes=33,
1302
+ stops=1,
1248
1303
  )
1249
1304
 
1250
1305
  async def test_tear_down_already_tearing_down(
@@ -1261,13 +1316,10 @@ class TestLooper:
1261
1316
  _ = await looper.tear_down(sleep_if_failure=False)
1262
1317
  _ = one(m for m in caplog.messages if search(": already tearing down$", m))
1263
1318
 
1264
- @given(case=sampled_from([(True, "; sleeping for .*"), (False, "")]))
1265
- @settings(suppress_health_check={HealthCheck.function_scoped_fixture})
1319
+ @mark.parametrize(("sleep_if_failure", "extra"), sleep_if_failure_cases)
1266
1320
  async def test_tear_down_failure(
1267
- self, *, case: tuple[bool, str], caplog: LogCaptureFixture
1321
+ self, *, sleep_if_failure: bool, extra: str, caplog: LogCaptureFixture
1268
1322
  ) -> None:
1269
- sleep_if_failure, extra = case
1270
-
1271
1323
  class Example(_ExampleLooper):
1272
1324
  @override
1273
1325
  async def _tear_down_core(self) -> None:
@@ -1277,13 +1329,8 @@ class TestLooper:
1277
1329
 
1278
1330
  looper = Example()
1279
1331
  _ = await looper.tear_down(sleep_if_failure=sleep_if_failure)
1280
- _ = one(
1281
- m
1282
- for m in caplog.messages
1283
- if search(
1284
- rf": encountered _ExampleLooperError\(\) whilst tearing down{extra}$", m
1285
- )
1286
- )
1332
+ pattern = rf": encountered _ExampleLooperError\(\) whilst tearing down{extra}$"
1333
+ _ = one(m for m in caplog.messages if search(pattern, m))
1287
1334
 
1288
1335
  def test_with_auto_start(self) -> None:
1289
1336
  looper = _ExampleLooper()
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.125.17"
3
+ __version__ = "0.125.18"