dycw-utilities 0.148.0__tar.gz → 0.148.2__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 (214) hide show
  1. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/PKG-INFO +2 -2
  2. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/pyproject.toml +6 -6
  3. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_asyncio.py +27 -5
  4. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_errors.py +33 -1
  5. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/asyncio.py +4 -3
  7. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/errors.py +16 -2
  8. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/traceback.py +2 -3
  9. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/types.py +5 -0
  10. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/.gitignore +0 -0
  11. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/LICENSE +0 -0
  12. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/README.md +0 -0
  13. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/__init__.py +0 -0
  14. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/conftest.py +0 -0
  15. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/__init__.py +0 -0
  16. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_missing/__init__.py +0 -0
  17. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_missing/module.py +0 -0
  18. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_with/__init__.py +0 -0
  19. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_with/outer_1.py +0 -0
  20. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_with/outer_2.py +0 -0
  21. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  22. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  23. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  24. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  25. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_without/__init__.py +0 -0
  26. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_without/module_1.py +0 -0
  27. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/package_without/module_2.py +0 -0
  28. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/standalone.py +0 -0
  29. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/modules/with_imports.py +0 -0
  30. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  31. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  32. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  33. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  34. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  35. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  36. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  37. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  38. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_altair.py +0 -0
  39. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_atomicwrites.py +0 -0
  40. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_atools.py +0 -0
  41. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_cachetools.py +0 -0
  42. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_click.py +0 -0
  43. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_concurrent.py +0 -0
  44. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_contextlib.py +0 -0
  45. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_enum.py +0 -0
  50. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_eventkit.py +0 -0
  51. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_fastapi.py +0 -0
  52. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_fpdf2.py +0 -0
  53. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_functions.py +0 -0
  54. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_functools.py +0 -0
  55. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_getpass.py +0 -0
  56. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_gzip.py +0 -0
  57. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_hashlib.py +0 -0
  58. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_http.py +0 -0
  59. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_hypothesis.py +0 -0
  60. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_importlib.py +0 -0
  61. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_inflect.py +0 -0
  62. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_ipython.py +0 -0
  63. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_iterables.py +0 -0
  64. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_json.py +0 -0
  65. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_jupyter.py +0 -0
  66. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_libcst.py +0 -0
  67. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_lightweight_charts.py +0 -0
  68. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_logging.py +0 -0
  69. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_math.py +0 -0
  70. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_memory_profiler.py +0 -0
  71. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_modules.py +0 -0
  72. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_more_itertools.py +0 -0
  73. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_numpy.py +0 -0
  74. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_objects/__init__.py +0 -0
  75. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_objects/objects.py +0 -0
  76. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_operator.py +0 -0
  77. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_optuna.py +0 -0
  78. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_orjson.py +0 -0
  79. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_os.py +0 -0
  80. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_parse.py +0 -0
  81. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pathlib.py +0 -0
  82. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_period.py +0 -0
  83. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pickle.py +0 -0
  84. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_platform.py +0 -0
  85. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_polars.py +0 -0
  86. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_polars_ols.py +0 -0
  87. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_postgres.py +0 -0
  88. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pottery.py +0 -0
  89. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pqdm.py +0 -0
  90. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_psutil.py +0 -0
  91. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pyinstrument.py +0 -0
  92. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pytest.py +0 -0
  93. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pytest_randomly.py +0 -0
  94. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_pytest_regressions.py +0 -0
  95. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_random.py +0 -0
  96. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_re.py +0 -0
  97. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_redis.py +0 -0
  98. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_reprlib.py +0 -0
  99. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_scipy.py +0 -0
  100. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_sentinel.py +0 -0
  101. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_shelve.py +0 -0
  102. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_slack_sdk.py +0 -0
  103. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_socket.py +0 -0
  104. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_sqlalchemy.py +0 -0
  105. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  106. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_statsmodels.py +0 -0
  107. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_string.py +0 -0
  108. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_tempfile.py +0 -0
  109. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_text.py +0 -0
  110. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_threading.py +0 -0
  111. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_timer.py +0 -0
  112. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_traceback.py +0 -0
  113. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_typed_settings.py +0 -0
  114. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_types.py +0 -0
  115. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_typing.py +0 -0
  116. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  117. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  118. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  119. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_tzdata.py +0 -0
  120. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_tzlocal.py +0 -0
  121. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_uuid.py +0 -0
  122. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_version.py +0 -0
  123. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_warnings.py +0 -0
  124. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_whenever.py +0 -0
  125. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_yield_access/__init__.py +0 -0
  126. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_yield_access/script.py +0 -0
  127. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_yield_access/script.sh +0 -0
  128. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_zipfile.py +0 -0
  129. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/tests/test_zoneinfo.py +0 -0
  130. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/altair.py +0 -0
  131. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/atomicwrites.py +0 -0
  132. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/atools.py +0 -0
  133. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/cachetools.py +0 -0
  134. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/click.py +0 -0
  135. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/concurrent.py +0 -0
  136. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/contextlib.py +0 -0
  137. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/contextvars.py +0 -0
  138. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/cryptography.py +0 -0
  139. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/cvxpy.py +0 -0
  140. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/dataclasses.py +0 -0
  141. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/enum.py +0 -0
  142. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/eventkit.py +0 -0
  143. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/fastapi.py +0 -0
  144. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/fpdf2.py +0 -0
  145. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/functions.py +0 -0
  146. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/functools.py +0 -0
  147. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/getpass.py +0 -0
  148. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/gzip.py +0 -0
  149. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/hashlib.py +0 -0
  150. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/http.py +0 -0
  151. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/hypothesis.py +0 -0
  152. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/importlib.py +0 -0
  153. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/inflect.py +0 -0
  154. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/ipython.py +0 -0
  155. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/iterables.py +0 -0
  156. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/json.py +0 -0
  157. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/jupyter.py +0 -0
  158. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/libcst.py +0 -0
  159. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/lightweight_charts.py +0 -0
  160. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/logging.py +0 -0
  161. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/math.py +0 -0
  162. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/memory_profiler.py +0 -0
  163. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/modules.py +0 -0
  164. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/more_itertools.py +0 -0
  165. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/numpy.py +0 -0
  166. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/operator.py +0 -0
  167. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/optuna.py +0 -0
  168. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/orjson.py +0 -0
  169. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/os.py +0 -0
  170. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/parse.py +0 -0
  171. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pathlib.py +0 -0
  172. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/period.py +0 -0
  173. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pickle.py +0 -0
  174. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/platform.py +0 -0
  175. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/polars.py +0 -0
  176. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/postgres.py +0 -0
  178. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pottery.py +0 -0
  179. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pqdm.py +0 -0
  180. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/psutil.py +0 -0
  181. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/py.typed +0 -0
  182. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pyinstrument.py +0 -0
  183. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pytest.py +0 -0
  184. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pytest_plugins/__init__.py +0 -0
  185. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  186. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  187. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/random.py +0 -0
  189. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/re.py +0 -0
  190. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/redis.py +0 -0
  191. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/reprlib.py +0 -0
  192. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/scipy.py +0 -0
  193. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/sentinel.py +0 -0
  194. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/shelve.py +0 -0
  195. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/slack_sdk.py +0 -0
  196. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/socket.py +0 -0
  197. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/sqlalchemy.py +0 -0
  198. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/sqlalchemy_polars.py +0 -0
  199. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/statsmodels.py +0 -0
  200. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/text.py +0 -0
  203. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/threading.py +0 -0
  204. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/timer.py +0 -0
  205. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/typed_settings.py +0 -0
  206. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/typing.py +0 -0
  207. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/tzdata.py +0 -0
  208. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/tzlocal.py +0 -0
  209. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/uuid.py +0 -0
  210. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/version.py +0 -0
  211. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/warnings.py +0 -0
  212. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/whenever.py +0 -0
  213. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/zipfile.py +0 -0
  214. {dycw_utilities-0.148.0 → dycw_utilities-0.148.2}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.148.0
3
+ Version: 0.148.2
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -14,7 +14,7 @@ Provides-Extra: test
14
14
  Requires-Dist: dycw-pytest-only<2.2,>=2.1.1; extra == 'test'
15
15
  Requires-Dist: hypothesis<6.136,>=6.135.24; extra == 'test'
16
16
  Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
17
- Requires-Dist: pytest-asyncio<1.1,>=1.0.0; extra == 'test'
17
+ Requires-Dist: pytest-asyncio<1.2,>=1.1.0; extra == 'test'
18
18
  Requires-Dist: pytest-cov<6.3,>=6.2.1; extra == 'test'
19
19
  Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
20
20
  Requires-Dist: pytest-lazy-fixtures<1.2,>=1.1.4; extra == 'test'
@@ -23,7 +23,7 @@ core = [
23
23
  "whenever >= 0.8.6, < 0.9",
24
24
  ]
25
25
  cryptography = ["cryptography >= 45.0.4, < 45.1"]
26
- cvxpy = ["cvxpy >= 1.6.5, < 1.7"]
26
+ cvxpy = ["cvxpy >= 1.7.0, < 1.8"]
27
27
  dataclasses-test = ["orjson", "polars"]
28
28
  dev = [
29
29
  "coloredlogs >= 15.0.1, < 15.1",
@@ -53,7 +53,7 @@ more-itertools = ["more-itertools >= 10.7.0, < 10.8"]
53
53
  numpy = ["numpy >= 2.3.1, < 2.4"]
54
54
  operator = ["polars"]
55
55
  optuna = ["optuna >= 4.4.0, < 4.5"]
56
- orjson = ["orjson >= 3.10.18, < 3.11"]
56
+ orjson = ["orjson >= 3.11.0, < 3.12"]
57
57
  orjson-test = ["polars"]
58
58
  polars = ["polars >= 1.31.0, < 1.32"]
59
59
  polars-ols = ["polars-ols >= 0.3.5, < 0.4"]
@@ -67,7 +67,7 @@ pyinstrument = ["pyinstrument >= 5.0.3, < 5.1"]
67
67
  pytest = [
68
68
  "pudb >= 2025.1, < 2025.2",
69
69
  "pytest >= 8.4.1, < 8.5",
70
- "pytest-asyncio >= 1.0.0, < 1.1",
70
+ "pytest-asyncio >= 1.1.0, < 1.2",
71
71
  "pytest-randomly >= 3.16.0, < 3.17",
72
72
  "pytest-timeout >= 2.4.0, < 2.5",
73
73
  "pytest-xdist >= 3.8.0, < 3.9",
@@ -102,7 +102,7 @@ dependencies = [
102
102
  name = "dycw-utilities"
103
103
  readme = "README.md"
104
104
  requires-python = ">= 3.12"
105
- version = "0.148.0"
105
+ version = "0.148.2"
106
106
 
107
107
  [project.entry-points.pytest11]
108
108
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -117,7 +117,7 @@ test = [
117
117
  "hypothesis >= 6.135.24, < 6.136",
118
118
  "pudb >= 2025.1, < 2025.2",
119
119
  "pytest >= 8.4.1, < 8.5",
120
- "pytest-asyncio >= 1.0.0, < 1.1",
120
+ "pytest-asyncio >= 1.1.0, < 1.2",
121
121
  "pytest-cov >= 6.2.1, < 6.3",
122
122
  "pytest-instafail >= 0.5.0, < 0.6",
123
123
  "pytest-lazy-fixtures >= 1.1.4, < 1.2",
@@ -135,7 +135,7 @@ test = [
135
135
  # bump-my-version
136
136
  [tool.bumpversion]
137
137
  allow_dirty = true
138
- current_version = "0.148.0"
138
+ current_version = "0.148.2"
139
139
 
140
140
  [[tool.bumpversion.files]]
141
141
  filename = "src/utilities/__init__.py"
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from asyncio import Queue, run
3
+ from asyncio import Queue, TaskGroup, run
4
4
  from collections.abc import ItemsView, KeysView, ValuesView
5
5
  from contextlib import asynccontextmanager
6
6
  from re import search
@@ -323,6 +323,8 @@ class TestLoopUntilSucceed:
323
323
  async def test_main(
324
324
  self, *, caplog: LogCaptureFixture, sleep: TimeDelta | None, use_logger: bool
325
325
  ) -> None:
326
+ class CustomError(Exception): ...
327
+
326
328
  caplog.set_level("DEBUG", logger=(name := unique_str()))
327
329
  counter = 0
328
330
 
@@ -330,7 +332,7 @@ class TestLoopUntilSucceed:
330
332
  nonlocal counter
331
333
  counter += 1
332
334
  if counter <= 3:
333
- raise ValueError
335
+ raise CustomError
334
336
 
335
337
  assert await loop_until_succeed(
336
338
  lambda: func(), logger=name if use_logger else None, sleep=sleep
@@ -346,16 +348,36 @@ class TestLoopUntilSucceed:
346
348
  )
347
349
  assert messages == expected
348
350
 
349
- async def test_error(self) -> None:
351
+ async def test_error_flat(self) -> None:
352
+ class CustomError(Exception): ...
353
+
350
354
  counter = 0
351
355
 
352
356
  async def func() -> None:
353
357
  nonlocal counter
354
358
  counter += 1
355
359
  if counter <= 3:
356
- raise ValueError
360
+ raise CustomError
361
+
362
+ assert not await loop_until_succeed(lambda: func(), errors=CustomError)
363
+ assert counter == 1
364
+
365
+ async def test_error_nested(self) -> None:
366
+ class CustomError(Exception): ...
367
+
368
+ counter = 0
369
+
370
+ async def func() -> None:
371
+ async with TaskGroup() as tg:
372
+ _ = tg.create_task(inner())
373
+
374
+ async def inner() -> None:
375
+ nonlocal counter
376
+ counter += 1
377
+ if counter <= 3:
378
+ raise CustomError
357
379
 
358
- assert not await loop_until_succeed(lambda: func(), errors=ValueError)
380
+ assert not await loop_until_succeed(lambda: func(), errors=CustomError)
359
381
  assert counter == 1
360
382
 
361
383
 
@@ -4,7 +4,7 @@ from asyncio import TaskGroup
4
4
 
5
5
  from pytest import RaisesGroup, raises
6
6
 
7
- from utilities.errors import ImpossibleCaseError, repr_error
7
+ from utilities.errors import ImpossibleCaseError, is_instance_error, repr_error
8
8
 
9
9
 
10
10
  class TestImpossibleCaseError:
@@ -14,6 +14,38 @@ class TestImpossibleCaseError:
14
14
  raise ImpossibleCaseError(case=[f"{x=}"])
15
15
 
16
16
 
17
+ class TestIsInstanceError:
18
+ def test_flat(self) -> None:
19
+ class CustomError(Exception): ...
20
+
21
+ with raises(CustomError) as exc_info:
22
+ raise CustomError
23
+
24
+ assert is_instance_error(exc_info.value, CustomError)
25
+
26
+ async def test_group(self) -> None:
27
+ class CustomError(Exception): ...
28
+
29
+ async def coroutine() -> None:
30
+ raise CustomError
31
+
32
+ with RaisesGroup(CustomError) as exc_info:
33
+ async with TaskGroup() as tg:
34
+ _ = tg.create_task(coroutine())
35
+
36
+ assert is_instance_error(exc_info.value, CustomError)
37
+
38
+ def test_false(self) -> None:
39
+ class Custom1Error(Exception): ...
40
+
41
+ class Custom2Error(Exception): ...
42
+
43
+ with raises(Custom1Error) as exc_info:
44
+ raise Custom1Error
45
+
46
+ assert not is_instance_error(exc_info.value, Custom2Error)
47
+
48
+
17
49
  class TestReprError:
18
50
  def test_class(self) -> None:
19
51
  class CustomError(Exception): ...
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.148.0"
3
+ __version__ = "0.148.2"
@@ -35,7 +35,7 @@ from typing import (
35
35
  override,
36
36
  )
37
37
 
38
- from utilities.errors import ImpossibleCaseError
38
+ from utilities.errors import ImpossibleCaseError, is_instance_error
39
39
  from utilities.functions import ensure_int, ensure_not_none, to_bool
40
40
  from utilities.logging import get_logger
41
41
  from utilities.random import SYSTEM_RANDOM
@@ -65,6 +65,7 @@ if TYPE_CHECKING:
65
65
  from utilities.types import (
66
66
  Coro,
67
67
  Delta,
68
+ ExceptionTypeLike,
68
69
  LoggerOrName,
69
70
  MaybeCallableBool,
70
71
  MaybeType,
@@ -398,7 +399,7 @@ async def loop_until_succeed(
398
399
  /,
399
400
  *,
400
401
  logger: LoggerOrName | None = None,
401
- errors: type[Exception] | tuple[type[Exception], ...] | None = None,
402
+ errors: ExceptionTypeLike[Exception] | None = None,
402
403
  sleep: Delta | None = None,
403
404
  ) -> bool:
404
405
  """Repeatedly call a coroutine until it succeeds."""
@@ -415,7 +416,7 @@ async def loop_until_succeed(
415
416
  case=[f"{exc_type=}", f"{exc_value=}"]
416
417
  ) from None
417
418
  sys.excepthook(exc_type, exc_value, traceback)
418
- if (errors is not None) and isinstance(error, errors):
419
+ if (errors is not None) and is_instance_error(error, errors):
419
420
  return False
420
421
  if sleep is not None:
421
422
  if logger is not None:
@@ -4,7 +4,7 @@ from dataclasses import dataclass
4
4
  from typing import TYPE_CHECKING, assert_never, override
5
5
 
6
6
  if TYPE_CHECKING:
7
- from utilities.types import MaybeType
7
+ from utilities.types import ExceptionTypeLike, MaybeType
8
8
 
9
9
 
10
10
  @dataclass(kw_only=True, slots=True)
@@ -21,6 +21,20 @@ class ImpossibleCaseError(Exception):
21
21
  ##
22
22
 
23
23
 
24
+ def is_instance_error(
25
+ error: BaseException, class_or_tuple: ExceptionTypeLike[Exception], /
26
+ ) -> bool:
27
+ """Check if an instance relationship holds, allowing for groups."""
28
+ if isinstance(error, class_or_tuple):
29
+ return True
30
+ if not isinstance(error, BaseExceptionGroup):
31
+ return False
32
+ return any(is_instance_error(e, class_or_tuple) for e in error.exceptions)
33
+
34
+
35
+ ##
36
+
37
+
24
38
  def repr_error(error: MaybeType[BaseException], /) -> str:
25
39
  """Get a string representation of an error."""
26
40
  match error:
@@ -36,4 +50,4 @@ def repr_error(error: MaybeType[BaseException], /) -> str:
36
50
  assert_never(never)
37
51
 
38
52
 
39
- __all__ = ["ImpossibleCaseError", "repr_error"]
53
+ __all__ = ["ImpossibleCaseError", "is_instance_error", "repr_error"]
@@ -6,10 +6,10 @@ from dataclasses import dataclass
6
6
  from functools import partial
7
7
  from getpass import getuser
8
8
  from itertools import repeat
9
- from logging import exception
10
9
  from os import getpid
11
10
  from pathlib import Path
12
11
  from socket import gethostname
12
+ from sys import stderr
13
13
  from traceback import TracebackException
14
14
  from typing import TYPE_CHECKING, override
15
15
 
@@ -287,8 +287,7 @@ def _make_except_hook_inner(
287
287
  try:
288
288
  send_to_slack(slack_url, f"```{slim}```")
289
289
  except SendToSlackError as error:
290
- msg = str(error)
291
- exception(msg) # noqa: LOG015
290
+ _ = stderr.write(f"{error}\n")
292
291
 
293
292
  if to_bool(bool_=pudb): # pragma: no cover
294
293
  from pudb import post_mortem
@@ -105,6 +105,10 @@ type MonthInt = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
105
105
  type EnumLike[E: Enum] = MaybeStr[E]
106
106
 
107
107
 
108
+ # errors
109
+ type ExceptionTypeLike[T: Exception] = type[T] | tuple[type[T], ...]
110
+
111
+
108
112
  # ipaddress
109
113
  IPv4AddressLike = MaybeStr[IPv4Address]
110
114
  IPv6AddressLike = MaybeStr[IPv6Address]
@@ -265,6 +269,7 @@ __all__ = [
265
269
  "Delta",
266
270
  "EnumLike",
267
271
  "ExcInfo",
272
+ "ExceptionTypeLike",
268
273
  "IPv4AddressLike",
269
274
  "IPv6AddressLike",
270
275
  "IterableHashable",