dycw-utilities 0.136.1__tar.gz → 0.136.3__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 (218) hide show
  1. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/PKG-INFO +1 -1
  2. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/pyproject.toml +2 -2
  3. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_asyncio.py +33 -24
  4. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_functions.py +13 -1
  5. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_os.py +7 -0
  6. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/__init__.py +1 -1
  7. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/asyncio.py +17 -7
  8. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/functions.py +33 -1
  9. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/os.py +9 -0
  10. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/traceback.py +10 -18
  11. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/types.py +2 -0
  12. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/.gitignore +0 -0
  13. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/LICENSE +0 -0
  14. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/README.md +0 -0
  15. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/__init__.py +0 -0
  16. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/conftest.py +0 -0
  17. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/__init__.py +0 -0
  18. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_missing/__init__.py +0 -0
  19. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_missing/module.py +0 -0
  20. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_with/__init__.py +0 -0
  21. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_with/outer_1.py +0 -0
  22. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_with/outer_2.py +0 -0
  23. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  24. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  25. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  26. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  27. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_without/__init__.py +0 -0
  28. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_without/module_1.py +0 -0
  29. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/package_without/module_2.py +0 -0
  30. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/standalone.py +0 -0
  31. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/modules/with_imports.py +0 -0
  32. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  33. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  34. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  35. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  36. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  37. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  38. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  39. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  40. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_aiolimiter.py +0 -0
  41. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_altair.py +0 -0
  42. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_arq.py +0 -0
  43. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_asyncio_classes/__init__.py +0 -0
  44. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_asyncio_classes/loopers.py +0 -0
  45. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_asyncio_classes/redis.py +0 -0
  46. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_atomicwrites.py +0 -0
  47. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_atools.py +0 -0
  48. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_cachetools.py +0 -0
  49. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_click.py +0 -0
  50. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_concurrent.py +0 -0
  51. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_contextlib.py +0 -0
  52. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_contextvars.py +0 -0
  53. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_cryptography.py +0 -0
  54. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_cvxpy.py +0 -0
  55. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_dataclasses.py +0 -0
  56. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_enum.py +0 -0
  57. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_errors.py +0 -0
  58. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_eventkit.py +0 -0
  59. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_fastapi.py +0 -0
  60. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_fpdf2.py +0 -0
  61. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_functools.py +0 -0
  62. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_getpass.py +0 -0
  63. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_git.py +0 -0
  64. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_hashlib.py +0 -0
  65. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_http.py +0 -0
  66. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_hypothesis.py +0 -0
  67. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_importlib.py +0 -0
  68. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_inflect.py +0 -0
  69. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_ipython.py +0 -0
  70. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_iterables.py +0 -0
  71. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_jupyter.py +0 -0
  72. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_libcst.py +0 -0
  73. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_lightweight_charts.py +0 -0
  74. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_logging.py +0 -0
  75. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_luigi.py +0 -0
  76. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_math.py +0 -0
  77. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_memory_profiler.py +0 -0
  78. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_modules.py +0 -0
  79. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_more_itertools.py +0 -0
  80. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_numpy.py +0 -0
  81. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_objects/__init__.py +0 -0
  82. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_objects/objects.py +0 -0
  83. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_operator.py +0 -0
  84. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_optuna.py +0 -0
  85. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_orjson.py +0 -0
  86. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_parse.py +0 -0
  87. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pathlib.py +0 -0
  88. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_period.py +0 -0
  89. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pickle.py +0 -0
  90. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_platform.py +0 -0
  91. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_polars.py +0 -0
  92. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_polars_ols.py +0 -0
  93. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pottery.py +0 -0
  94. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pqdm.py +0 -0
  95. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_psutil.py +0 -0
  96. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pydantic.py +0 -0
  97. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pyinstrument.py +0 -0
  98. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pytest.py +0 -0
  99. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_pytest_regressions.py +0 -0
  100. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_python_dotenv.py +0 -0
  101. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_random.py +0 -0
  102. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_re.py +0 -0
  103. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_redis.py +0 -0
  104. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_reprlib.py +0 -0
  105. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_scipy.py +0 -0
  106. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_sentinel.py +0 -0
  107. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_shelve.py +0 -0
  108. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_slack_sdk.py +0 -0
  109. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_socket.py +0 -0
  110. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_sqlalchemy.py +0 -0
  111. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_sqlalchemy_polars.py +0 -0
  112. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_statsmodels.py +0 -0
  113. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_streamlit.py +0 -0
  114. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_string.py +0 -0
  115. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_tempfile.py +0 -0
  116. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_text.py +0 -0
  117. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_threading.py +0 -0
  118. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_timer.py +0 -0
  119. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_traceback.py +0 -0
  120. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_typed_settings.py +0 -0
  121. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_types.py +0 -0
  122. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_typing.py +0 -0
  123. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_typing_funcs/__init__.py +0 -0
  124. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_typing_funcs/no_future.py +0 -0
  125. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_typing_funcs/with_future.py +0 -0
  126. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_tzdata.py +0 -0
  127. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_tzlocal.py +0 -0
  128. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_uuid.py +0 -0
  129. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_version.py +0 -0
  130. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_warnings.py +0 -0
  131. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_whenever.py +0 -0
  132. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_zipfile.py +0 -0
  133. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/tests/test_zoneinfo.py +0 -0
  134. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/aiolimiter.py +0 -0
  135. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/altair.py +0 -0
  136. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/arq.py +0 -0
  137. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/atomicwrites.py +0 -0
  138. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/atools.py +0 -0
  139. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/cachetools.py +0 -0
  140. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/click.py +0 -0
  141. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/concurrent.py +0 -0
  142. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/contextlib.py +0 -0
  143. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/contextvars.py +0 -0
  144. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/cryptography.py +0 -0
  145. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/cvxpy.py +0 -0
  146. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/dataclasses.py +0 -0
  147. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/enum.py +0 -0
  148. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/errors.py +0 -0
  149. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/eventkit.py +0 -0
  150. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/fastapi.py +0 -0
  151. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/fpdf2.py +0 -0
  152. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/functools.py +0 -0
  153. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/getpass.py +0 -0
  154. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/git.py +0 -0
  155. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/hashlib.py +0 -0
  156. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/http.py +0 -0
  157. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/hypothesis.py +0 -0
  158. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/importlib.py +0 -0
  159. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/inflect.py +0 -0
  160. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/ipython.py +0 -0
  161. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/iterables.py +0 -0
  162. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/jupyter.py +0 -0
  163. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/libcst.py +0 -0
  164. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/lightweight_charts.py +0 -0
  165. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/logging.py +0 -0
  166. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/luigi.py +0 -0
  167. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/math.py +0 -0
  168. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/memory_profiler.py +0 -0
  169. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/modules.py +0 -0
  170. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/more_itertools.py +0 -0
  171. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/numpy.py +0 -0
  172. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/operator.py +0 -0
  173. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/optuna.py +0 -0
  174. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/orjson.py +0 -0
  175. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/parse.py +0 -0
  176. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pathlib.py +0 -0
  177. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/period.py +0 -0
  178. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pickle.py +0 -0
  179. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/platform.py +0 -0
  180. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/polars.py +0 -0
  181. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/polars_ols.py +0 -0
  182. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pottery.py +0 -0
  183. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pqdm.py +0 -0
  184. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/psutil.py +0 -0
  185. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/py.typed +0 -0
  186. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pydantic.py +0 -0
  187. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pyinstrument.py +0 -0
  188. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pytest.py +0 -0
  189. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/pytest_regressions.py +0 -0
  190. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/python_dotenv.py +0 -0
  191. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/random.py +0 -0
  192. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/re.py +0 -0
  193. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/redis.py +0 -0
  194. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/reprlib.py +0 -0
  195. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/scipy.py +0 -0
  196. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/sentinel.py +0 -0
  197. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/shelve.py +0 -0
  198. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/slack_sdk.py +0 -0
  199. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/socket.py +0 -0
  200. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/sqlalchemy.py +0 -0
  201. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/sqlalchemy_polars.py +0 -0
  202. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/statsmodels.py +0 -0
  203. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/streamlit.py +0 -0
  204. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/string.py +0 -0
  205. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/tempfile.py +0 -0
  206. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/text.py +0 -0
  207. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/threading.py +0 -0
  208. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/timer.py +0 -0
  209. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/typed_settings.py +0 -0
  210. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/typing.py +0 -0
  211. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/tzdata.py +0 -0
  212. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/tzlocal.py +0 -0
  213. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/uuid.py +0 -0
  214. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/version.py +0 -0
  215. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/warnings.py +0 -0
  216. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/whenever.py +0 -0
  217. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/zipfile.py +0 -0
  218. {dycw_utilities-0.136.1 → dycw_utilities-0.136.3}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.136.1
3
+ Version: 0.136.3
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -106,7 +106,7 @@ dependencies = [
106
106
  name = "dycw-utilities"
107
107
  readme = "README.md"
108
108
  requires-python = ">= 3.12"
109
- version = "0.136.1"
109
+ version = "0.136.3"
110
110
 
111
111
  [project.optional-dependencies]
112
112
  logging = [
@@ -134,7 +134,7 @@ test = [
134
134
  # bump-my-version
135
135
  [tool.bumpversion]
136
136
  allow_dirty = true
137
- current_version = "0.136.1"
137
+ current_version = "0.136.3"
138
138
 
139
139
  [[tool.bumpversion.files]]
140
140
  filename = "src/utilities/__init__.py"
@@ -175,29 +175,6 @@ class TestEnhancedTaskGroup:
175
175
  await sleep_td(self.delta)
176
176
  assert looper._core_attempts >= 1
177
177
 
178
- async def test_debug_true(self) -> None:
179
- class CustomError(Exception): ...
180
-
181
- async def func() -> None:
182
- await sleep_td(self.delta)
183
- raise CustomError
184
-
185
- with raises(CustomError):
186
- async with EnhancedTaskGroup(debug=True) as tg:
187
- _ = await tg.run_or_create_task(func())
188
-
189
- async def test_debug_false(self) -> None:
190
- class CustomError(Exception): ...
191
-
192
- async def func() -> None:
193
- await sleep_td(self.delta)
194
- raise CustomError
195
-
196
- with raises(ExceptionGroup) as exc_info:
197
- async with EnhancedTaskGroup(debug=False) as tg:
198
- _ = await tg.run_or_create_task(func())
199
- assert isinstance(one(exc_info.value.exceptions), CustomError)
200
-
201
178
  async def test_max_tasks_disabled(self) -> None:
202
179
  with Timer() as timer:
203
180
  async with EnhancedTaskGroup() as tg:
@@ -210,7 +187,39 @@ class TestEnhancedTaskGroup:
210
187
  async with EnhancedTaskGroup(max_tasks=2) as tg:
211
188
  for _ in range(10):
212
189
  _ = tg.create_task(sleep_td(self.delta))
213
- assert timer >= self.delta
190
+ assert timer >= 5 * self.delta
191
+
192
+ async def test_run_or_create_task_parallel_with_max_tasks_none(self) -> None:
193
+ with Timer() as timer:
194
+ async with EnhancedTaskGroup() as tg:
195
+ assert not tg._is_debug()
196
+ for _ in range(10):
197
+ _ = await tg.run_or_create_task(sleep_td(self.delta))
198
+ assert timer <= 2 * self.delta
199
+
200
+ async def test_run_or_create_task_parallel_with_max_tasks_two(self) -> None:
201
+ with Timer() as timer:
202
+ async with EnhancedTaskGroup(max_tasks=2) as tg:
203
+ assert not tg._is_debug()
204
+ for _ in range(10):
205
+ _ = await tg.run_or_create_task(sleep_td(self.delta))
206
+ assert timer >= 5 * self.delta
207
+
208
+ async def test_run_or_create_task_serial_with_max_tasks_negative(self) -> None:
209
+ with Timer() as timer:
210
+ async with EnhancedTaskGroup(max_tasks=-1) as tg:
211
+ assert tg._is_debug()
212
+ for _ in range(10):
213
+ _ = await tg.run_or_create_task(sleep_td(self.delta))
214
+ assert timer >= 10 * self.delta
215
+
216
+ async def test_run_or_create_task_serial_with_debug(self) -> None:
217
+ with Timer() as timer:
218
+ async with EnhancedTaskGroup(debug=True) as tg:
219
+ assert tg._is_debug()
220
+ for _ in range(10):
221
+ _ = await tg.run_or_create_task(sleep_td(self.delta))
222
+ assert timer >= 10 * self.delta
214
223
 
215
224
  async def test_timeout_pass(self) -> None:
216
225
  async with EnhancedTaskGroup(timeout=2 * self.delta) as tg:
@@ -90,11 +90,13 @@ from utilities.functions import (
90
90
  min_nullable,
91
91
  not_func,
92
92
  second,
93
+ to_bool,
93
94
  yield_object_attributes,
94
95
  yield_object_cached_properties,
95
96
  yield_object_properties,
96
97
  )
97
- from utilities.sentinel import sentinel
98
+ from utilities.hypothesis import sentinels
99
+ from utilities.sentinel import Sentinel, sentinel
98
100
  from utilities.whenever import NOW_UTC, ZERO_TIME, get_now, get_today
99
101
 
100
102
  if TYPE_CHECKING:
@@ -915,6 +917,16 @@ class TestSecond:
915
917
  assert second(pair) == y
916
918
 
917
919
 
920
+ class TestToBool:
921
+ @given(bool_=booleans() | none() | sentinels())
922
+ def test_bool_none_or_sentinel(self, *, bool_: bool | None | Sentinel) -> None:
923
+ assert to_bool(bool_=bool_) is bool_
924
+
925
+ @given(bool_=booleans())
926
+ def test_callable(self, *, bool_: bool) -> None:
927
+ assert to_bool(bool_=lambda: bool_) is bool_
928
+
929
+
918
930
  class TestYieldObjectAttributes:
919
931
  @given(n=integers())
920
932
  def test_main(self, *, n: int) -> None:
@@ -21,6 +21,7 @@ from utilities.os import (
21
21
  get_cpu_count,
22
22
  get_cpu_use,
23
23
  get_env_var,
24
+ is_debug,
24
25
  temp_environ,
25
26
  )
26
27
  from utilities.pytest import skipif_windows
@@ -117,6 +118,12 @@ class TestGetEnvVar:
117
118
  _ = get_env_var(key, case_sensitive=case_sensitive)
118
119
 
119
120
 
121
+ class TestIsDebug:
122
+ def test_main(self) -> None:
123
+ result = is_debug()
124
+ assert isinstance(result, bool)
125
+
126
+
120
127
  class TestTempEnviron:
121
128
  @given(key=text.map(_prefix), value=text)
122
129
  def test_set(self, *, key: str, value: str) -> None:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.136.1"
3
+ __version__ = "0.136.3"
@@ -36,10 +36,10 @@ from typing_extensions import deprecated
36
36
 
37
37
  from utilities.dataclasses import replace_non_sentinel
38
38
  from utilities.errors import repr_error
39
- from utilities.functions import ensure_int, ensure_not_none
39
+ from utilities.functions import ensure_int, ensure_not_none, to_bool
40
40
  from utilities.random import SYSTEM_RANDOM
41
41
  from utilities.sentinel import Sentinel, sentinel
42
- from utilities.types import SupportsRichComparison
42
+ from utilities.types import MaybeCallableBool, SupportsRichComparison
43
43
  from utilities.whenever import SECOND, get_now
44
44
 
45
45
  if TYPE_CHECKING:
@@ -220,10 +220,11 @@ class EnhancedQueue[T](Queue[T]):
220
220
  class EnhancedTaskGroup(TaskGroup):
221
221
  """Task group with enhanced features."""
222
222
 
223
+ _max_tasks: int | None
223
224
  _semaphore: Semaphore | None
224
225
  _timeout: TimeDelta | None
225
226
  _error: MaybeType[BaseException]
226
- _debug: bool
227
+ _debug: MaybeCallableBool
227
228
  _stack: AsyncExitStack
228
229
  _timeout_cm: _AsyncGeneratorContextManager[None] | None
229
230
 
@@ -234,10 +235,14 @@ class EnhancedTaskGroup(TaskGroup):
234
235
  max_tasks: int | None = None,
235
236
  timeout: TimeDelta | None = None,
236
237
  error: MaybeType[BaseException] = TimeoutError,
237
- debug: bool = False,
238
+ debug: MaybeCallableBool = False,
238
239
  ) -> None:
239
240
  super().__init__()
240
- self._semaphore = None if max_tasks is None else Semaphore(max_tasks)
241
+ self._max_tasks = max_tasks
242
+ if (max_tasks is None) or (max_tasks <= 0):
243
+ self._semaphore = None
244
+ else:
245
+ self._semaphore = Semaphore(max_tasks)
241
246
  self._timeout = timeout
242
247
  self._error = error
243
248
  self._debug = debug
@@ -257,7 +262,7 @@ class EnhancedTaskGroup(TaskGroup):
257
262
  tb: TracebackType | None,
258
263
  ) -> None:
259
264
  _ = await self._stack.__aexit__(et, exc, tb)
260
- match self._debug:
265
+ match self._is_debug():
261
266
  case True:
262
267
  with suppress(Exception):
263
268
  _ = await super().__aexit__(et, exc, tb)
@@ -293,7 +298,7 @@ class EnhancedTaskGroup(TaskGroup):
293
298
  name: str | None = None,
294
299
  context: Context | None = None,
295
300
  ) -> T | Task[T]:
296
- match self._debug:
301
+ match self._is_debug():
297
302
  case True:
298
303
  return await coro
299
304
  case False:
@@ -301,6 +306,11 @@ class EnhancedTaskGroup(TaskGroup):
301
306
  case _ as never:
302
307
  assert_never(never)
303
308
 
309
+ def _is_debug(self) -> bool:
310
+ return to_bool(bool_=self._debug) or (
311
+ (self._max_tasks is not None) and (self._max_tasks <= 0)
312
+ )
313
+
304
314
  async def _wrap_with_semaphore[T](
305
315
  self, semaphore: Semaphore, coroutine: _CoroutineLike[T], /
306
316
  ) -> T:
@@ -14,7 +14,16 @@ from types import (
14
14
  MethodWrapperType,
15
15
  WrapperDescriptorType,
16
16
  )
17
- from typing import TYPE_CHECKING, Any, Literal, TypeGuard, cast, overload, override
17
+ from typing import (
18
+ TYPE_CHECKING,
19
+ Any,
20
+ Literal,
21
+ TypeGuard,
22
+ assert_never,
23
+ cast,
24
+ overload,
25
+ override,
26
+ )
18
27
 
19
28
  from whenever import Date, PlainDateTime, Time, TimeDelta, ZonedDateTime
20
29
 
@@ -22,6 +31,7 @@ from utilities.reprlib import get_repr, get_repr_and_class
22
31
  from utilities.sentinel import Sentinel, sentinel
23
32
  from utilities.types import (
24
33
  Dataclass,
34
+ MaybeCallableBool,
25
35
  Number,
26
36
  StrMapping,
27
37
  SupportsRichComparison,
@@ -935,6 +945,28 @@ def second[U](pair: tuple[Any, U], /) -> U:
935
945
  ##
936
946
 
937
947
 
948
+ @overload
949
+ def to_bool(*, bool_: MaybeCallableBool) -> bool: ...
950
+ @overload
951
+ def to_bool(*, bool_: None) -> None: ...
952
+ @overload
953
+ def to_bool(*, bool_: Sentinel) -> Sentinel: ...
954
+ def to_bool(
955
+ *, bool_: MaybeCallableBool | None | Sentinel = sentinel
956
+ ) -> bool | None | Sentinel:
957
+ """Get the bool."""
958
+ match bool_:
959
+ case bool() | None | Sentinel():
960
+ return bool_
961
+ case Callable() as func:
962
+ return to_bool(bool_=func())
963
+ case _ as never:
964
+ assert_never(never)
965
+
966
+
967
+ ##
968
+
969
+
938
970
  def yield_object_attributes(
939
971
  obj: Any,
940
972
  /,
@@ -123,6 +123,14 @@ class GetEnvVarError(Exception):
123
123
  ##
124
124
 
125
125
 
126
+ def is_debug() -> bool:
127
+ """Check if we are in `DEBUG` mode."""
128
+ return get_env_var("DEBUG", nullable=True) is not None
129
+
130
+
131
+ ##
132
+
133
+
126
134
  @contextmanager
127
135
  def temp_environ(
128
136
  env: Mapping[str, str | None] | None = None, **env_kwargs: str | None
@@ -154,5 +162,6 @@ __all__ = [
154
162
  "get_cpu_count",
155
163
  "get_cpu_use",
156
164
  "get_env_var",
165
+ "is_debug",
157
166
  "temp_environ",
158
167
  ]
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  import re
4
4
  import sys
5
5
  from asyncio import run
6
- from collections.abc import Callable
7
6
  from dataclasses import dataclass
8
7
  from functools import partial
9
8
  from getpass import getuser
@@ -11,12 +10,12 @@ from itertools import repeat
11
10
  from pathlib import Path
12
11
  from socket import gethostname
13
12
  from traceback import TracebackException
14
- from typing import TYPE_CHECKING, assert_never, override
13
+ from typing import TYPE_CHECKING, override
15
14
 
16
15
  from utilities.atomicwrites import writer
17
16
  from utilities.errors import repr_error
17
+ from utilities.functions import to_bool
18
18
  from utilities.iterables import OneEmptyError, one
19
- from utilities.os import get_env_var
20
19
  from utilities.pathlib import get_path
21
20
  from utilities.reprlib import (
22
21
  RICH_EXPAND_ALL,
@@ -31,11 +30,12 @@ from utilities.version import get_version
31
30
  from utilities.whenever import format_compact, get_now, to_zoned_date_time
32
31
 
33
32
  if TYPE_CHECKING:
34
- from collections.abc import Iterator, Sequence
33
+ from collections.abc import Callable, Iterator, Sequence
35
34
  from traceback import FrameSummary
36
35
  from types import TracebackType
37
36
 
38
37
  from utilities.types import (
38
+ MaybeCallableBool,
39
39
  MaybeCallablePathLike,
40
40
  MaybeCallableZonedDateTime,
41
41
  PathLike,
@@ -203,7 +203,7 @@ def make_except_hook(
203
203
  max_depth: int | None = RICH_MAX_DEPTH,
204
204
  expand_all: bool = RICH_EXPAND_ALL,
205
205
  slack_url: str | None = None,
206
- pudb: str | None = None,
206
+ pudb: MaybeCallableBool = False,
207
207
  ) -> Callable[
208
208
  [type[BaseException] | None, BaseException | None, TracebackType | None], None
209
209
  ]:
@@ -240,7 +240,7 @@ def _make_except_hook_inner(
240
240
  max_depth: int | None = RICH_MAX_DEPTH,
241
241
  expand_all: bool = RICH_EXPAND_ALL,
242
242
  slack_url: str | None = None,
243
- pudb: str | Callable[[], bool] | None = None,
243
+ pudb: MaybeCallableBool = False,
244
244
  ) -> None:
245
245
  """Exception hook to log the traceback."""
246
246
  _ = (exc_type, traceback)
@@ -272,18 +272,10 @@ def _make_except_hook_inner(
272
272
 
273
273
  send = f"```{slim}```"
274
274
  run(send_to_slack(slack_url, send))
275
- if pudb is not None: # pragma: no cover
276
- match pudb:
277
- case str() as env_var:
278
- call_pudb = get_env_var(env_var, nullable=True) is not None
279
- case Callable() as func:
280
- call_pudb = func()
281
- case _ as never:
282
- assert_never(never)
283
- if call_pudb:
284
- from pudb import post_mortem
285
-
286
- post_mortem(tb=traceback, e_type=exc_type, e_value=exc_val)
275
+ if to_bool(bool_=pudb): # pragma: no cover
276
+ from pudb import post_mortem
277
+
278
+ post_mortem(tb=traceback, e_type=exc_type, e_value=exc_val)
287
279
 
288
280
 
289
281
  @dataclass(kw_only=True, slots=True)
@@ -59,6 +59,7 @@ type OpenMode = Literal[
59
59
  "a+b",
60
60
  ]
61
61
  type MaybeCallable[T] = T | Callable[[], T]
62
+ type MaybeCallableBool = MaybeCallable[bool]
62
63
  type MaybeStr[T] = T | str
63
64
  type MaybeType[T] = T | type[T]
64
65
  type StrMapping = Mapping[str, Any]
@@ -254,6 +255,7 @@ __all__ = [
254
255
  "LoggerOrName",
255
256
  "MathRoundMode",
256
257
  "MaybeCallable",
258
+ "MaybeCallableBool",
257
259
  "MaybeCallableDate",
258
260
  "MaybeCallableEvent",
259
261
  "MaybeCallablePathLike",