dycw-utilities 0.136.1__tar.gz → 0.136.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 (218) hide show
  1. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/PKG-INFO +1 -1
  2. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/pyproject.toml +2 -2
  3. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_functions.py +13 -1
  4. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_os.py +7 -0
  5. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/asyncio.py +6 -6
  7. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/functions.py +33 -1
  8. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/os.py +9 -0
  9. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/traceback.py +10 -18
  10. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/types.py +2 -0
  11. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/.gitignore +0 -0
  12. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/LICENSE +0 -0
  13. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/README.md +0 -0
  14. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/__init__.py +0 -0
  15. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/conftest.py +0 -0
  16. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/__init__.py +0 -0
  17. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_missing/__init__.py +0 -0
  18. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_missing/module.py +0 -0
  19. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_with/__init__.py +0 -0
  20. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_with/outer_1.py +0 -0
  21. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_with/outer_2.py +0 -0
  22. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  23. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  24. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  25. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  26. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_without/__init__.py +0 -0
  27. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_without/module_1.py +0 -0
  28. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/package_without/module_2.py +0 -0
  29. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/standalone.py +0 -0
  30. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/modules/with_imports.py +0 -0
  31. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  32. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  33. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  34. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  35. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  36. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  37. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  38. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  39. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_aiolimiter.py +0 -0
  40. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_altair.py +0 -0
  41. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_arq.py +0 -0
  42. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_asyncio.py +0 -0
  43. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_asyncio_classes/__init__.py +0 -0
  44. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_asyncio_classes/loopers.py +0 -0
  45. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_asyncio_classes/redis.py +0 -0
  46. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_atomicwrites.py +0 -0
  47. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_atools.py +0 -0
  48. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_cachetools.py +0 -0
  49. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_click.py +0 -0
  50. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_concurrent.py +0 -0
  51. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_contextlib.py +0 -0
  52. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_contextvars.py +0 -0
  53. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_cryptography.py +0 -0
  54. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_cvxpy.py +0 -0
  55. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_dataclasses.py +0 -0
  56. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_enum.py +0 -0
  57. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_errors.py +0 -0
  58. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_eventkit.py +0 -0
  59. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_fastapi.py +0 -0
  60. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_fpdf2.py +0 -0
  61. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_functools.py +0 -0
  62. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_getpass.py +0 -0
  63. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_git.py +0 -0
  64. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_hashlib.py +0 -0
  65. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_http.py +0 -0
  66. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_hypothesis.py +0 -0
  67. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_importlib.py +0 -0
  68. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_inflect.py +0 -0
  69. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_ipython.py +0 -0
  70. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_iterables.py +0 -0
  71. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_jupyter.py +0 -0
  72. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_libcst.py +0 -0
  73. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_lightweight_charts.py +0 -0
  74. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_logging.py +0 -0
  75. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_luigi.py +0 -0
  76. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_math.py +0 -0
  77. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_memory_profiler.py +0 -0
  78. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_modules.py +0 -0
  79. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_more_itertools.py +0 -0
  80. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_numpy.py +0 -0
  81. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_objects/__init__.py +0 -0
  82. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_objects/objects.py +0 -0
  83. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_operator.py +0 -0
  84. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_optuna.py +0 -0
  85. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_orjson.py +0 -0
  86. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_parse.py +0 -0
  87. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pathlib.py +0 -0
  88. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_period.py +0 -0
  89. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pickle.py +0 -0
  90. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_platform.py +0 -0
  91. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_polars.py +0 -0
  92. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_polars_ols.py +0 -0
  93. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pottery.py +0 -0
  94. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pqdm.py +0 -0
  95. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_psutil.py +0 -0
  96. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pydantic.py +0 -0
  97. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pyinstrument.py +0 -0
  98. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pytest.py +0 -0
  99. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_pytest_regressions.py +0 -0
  100. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_python_dotenv.py +0 -0
  101. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_random.py +0 -0
  102. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_re.py +0 -0
  103. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_redis.py +0 -0
  104. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_reprlib.py +0 -0
  105. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_scipy.py +0 -0
  106. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_sentinel.py +0 -0
  107. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_shelve.py +0 -0
  108. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_slack_sdk.py +0 -0
  109. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_socket.py +0 -0
  110. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_sqlalchemy.py +0 -0
  111. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  112. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_statsmodels.py +0 -0
  113. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_streamlit.py +0 -0
  114. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_string.py +0 -0
  115. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_tempfile.py +0 -0
  116. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_text.py +0 -0
  117. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_threading.py +0 -0
  118. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_timer.py +0 -0
  119. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_traceback.py +0 -0
  120. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_typed_settings.py +0 -0
  121. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_types.py +0 -0
  122. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_typing.py +0 -0
  123. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  124. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  125. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  126. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_tzdata.py +0 -0
  127. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_tzlocal.py +0 -0
  128. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_uuid.py +0 -0
  129. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_version.py +0 -0
  130. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_warnings.py +0 -0
  131. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_whenever.py +0 -0
  132. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_zipfile.py +0 -0
  133. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/tests/test_zoneinfo.py +0 -0
  134. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/aiolimiter.py +0 -0
  135. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/altair.py +0 -0
  136. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/arq.py +0 -0
  137. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/atomicwrites.py +0 -0
  138. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/atools.py +0 -0
  139. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/cachetools.py +0 -0
  140. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/click.py +0 -0
  141. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/concurrent.py +0 -0
  142. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/contextlib.py +0 -0
  143. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/contextvars.py +0 -0
  144. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/cryptography.py +0 -0
  145. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/cvxpy.py +0 -0
  146. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/dataclasses.py +0 -0
  147. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/enum.py +0 -0
  148. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/errors.py +0 -0
  149. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/eventkit.py +0 -0
  150. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/fastapi.py +0 -0
  151. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/fpdf2.py +0 -0
  152. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/functools.py +0 -0
  153. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/getpass.py +0 -0
  154. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/git.py +0 -0
  155. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/hashlib.py +0 -0
  156. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/http.py +0 -0
  157. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/hypothesis.py +0 -0
  158. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/importlib.py +0 -0
  159. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/inflect.py +0 -0
  160. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/ipython.py +0 -0
  161. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/iterables.py +0 -0
  162. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/jupyter.py +0 -0
  163. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/libcst.py +0 -0
  164. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/lightweight_charts.py +0 -0
  165. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/logging.py +0 -0
  166. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/luigi.py +0 -0
  167. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/math.py +0 -0
  168. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/memory_profiler.py +0 -0
  169. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/modules.py +0 -0
  170. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/more_itertools.py +0 -0
  171. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/numpy.py +0 -0
  172. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/operator.py +0 -0
  173. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/optuna.py +0 -0
  174. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/orjson.py +0 -0
  175. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/parse.py +0 -0
  176. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pathlib.py +0 -0
  177. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/period.py +0 -0
  178. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pickle.py +0 -0
  179. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/platform.py +0 -0
  180. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/polars.py +0 -0
  181. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/polars_ols.py +0 -0
  182. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pottery.py +0 -0
  183. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pqdm.py +0 -0
  184. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/psutil.py +0 -0
  185. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/py.typed +0 -0
  186. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pydantic.py +0 -0
  187. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pyinstrument.py +0 -0
  188. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pytest.py +0 -0
  189. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/pytest_regressions.py +0 -0
  190. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/python_dotenv.py +0 -0
  191. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/random.py +0 -0
  192. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/re.py +0 -0
  193. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/redis.py +0 -0
  194. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/reprlib.py +0 -0
  195. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/scipy.py +0 -0
  196. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/sentinel.py +0 -0
  197. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/shelve.py +0 -0
  198. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/slack_sdk.py +0 -0
  199. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/socket.py +0 -0
  200. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/sqlalchemy.py +0 -0
  201. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/sqlalchemy_polars.py +0 -0
  202. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/statsmodels.py +0 -0
  203. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/streamlit.py +0 -0
  204. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/string.py +0 -0
  205. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/tempfile.py +0 -0
  206. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/text.py +0 -0
  207. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/threading.py +0 -0
  208. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/timer.py +0 -0
  209. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/typed_settings.py +0 -0
  210. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/typing.py +0 -0
  211. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/tzdata.py +0 -0
  212. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/tzlocal.py +0 -0
  213. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/uuid.py +0 -0
  214. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/version.py +0 -0
  215. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/warnings.py +0 -0
  216. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/whenever.py +0 -0
  217. {dycw_utilities-0.136.1 → dycw_utilities-0.136.2}/src/utilities/zipfile.py +0 -0
  218. {dycw_utilities-0.136.1 → dycw_utilities-0.136.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.136.1
3
+ Version: 0.136.2
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.2"
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.2"
138
138
 
139
139
  [[tool.bumpversion.files]]
140
140
  filename = "src/utilities/__init__.py"
@@ -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.2"
@@ -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:
@@ -223,7 +223,7 @@ class EnhancedTaskGroup(TaskGroup):
223
223
  _semaphore: Semaphore | None
224
224
  _timeout: TimeDelta | None
225
225
  _error: MaybeType[BaseException]
226
- _debug: bool
226
+ _debug: MaybeCallableBool
227
227
  _stack: AsyncExitStack
228
228
  _timeout_cm: _AsyncGeneratorContextManager[None] | None
229
229
 
@@ -234,7 +234,7 @@ class EnhancedTaskGroup(TaskGroup):
234
234
  max_tasks: int | None = None,
235
235
  timeout: TimeDelta | None = None,
236
236
  error: MaybeType[BaseException] = TimeoutError,
237
- debug: bool = False,
237
+ debug: MaybeCallableBool = False,
238
238
  ) -> None:
239
239
  super().__init__()
240
240
  self._semaphore = None if max_tasks is None else Semaphore(max_tasks)
@@ -257,7 +257,7 @@ class EnhancedTaskGroup(TaskGroup):
257
257
  tb: TracebackType | None,
258
258
  ) -> None:
259
259
  _ = await self._stack.__aexit__(et, exc, tb)
260
- match self._debug:
260
+ match to_bool(bool_=self._debug):
261
261
  case True:
262
262
  with suppress(Exception):
263
263
  _ = await super().__aexit__(et, exc, tb)
@@ -293,7 +293,7 @@ class EnhancedTaskGroup(TaskGroup):
293
293
  name: str | None = None,
294
294
  context: Context | None = None,
295
295
  ) -> T | Task[T]:
296
- match self._debug:
296
+ match to_bool(bool_=self._debug):
297
297
  case True:
298
298
  return await coro
299
299
  case False:
@@ -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",