dycw-utilities 0.135.1__tar.gz → 0.136.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/PKG-INFO +2 -1
  2. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/pyproject.toml +3 -3
  3. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/__init__.py +1 -1
  4. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/traceback.py +18 -2
  5. dycw_utilities-0.135.1/src/tests/test_pudb.py +0 -37
  6. dycw_utilities-0.135.1/src/utilities/pudb.py +0 -62
  7. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/.gitignore +0 -0
  8. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/LICENSE +0 -0
  9. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/README.md +0 -0
  10. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_aiolimiter.py +0 -0
  36. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_altair.py +0 -0
  37. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_arq.py +0 -0
  38. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_asyncio.py +0 -0
  39. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_asyncio_classes/__init__.py +0 -0
  40. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_asyncio_classes/loopers.py +0 -0
  41. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_asyncio_classes/redis.py +0 -0
  42. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_atomicwrites.py +0 -0
  43. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_atools.py +0 -0
  44. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_cachetools.py +0 -0
  45. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_click.py +0 -0
  46. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_concurrent.py +0 -0
  47. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_contextlib.py +0 -0
  48. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_contextvars.py +0 -0
  49. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_cryptography.py +0 -0
  50. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_cvxpy.py +0 -0
  51. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_dataclasses.py +0 -0
  52. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_enum.py +0 -0
  53. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_errors.py +0 -0
  54. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_eventkit.py +0 -0
  55. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_fastapi.py +0 -0
  56. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_fpdf2.py +0 -0
  57. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_functions.py +0 -0
  58. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_functools.py +0 -0
  59. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_getpass.py +0 -0
  60. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_git.py +0 -0
  61. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_hashlib.py +0 -0
  62. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_http.py +0 -0
  63. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_hypothesis.py +0 -0
  64. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_importlib.py +0 -0
  65. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_inflect.py +0 -0
  66. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_ipython.py +0 -0
  67. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_iterables.py +0 -0
  68. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_jupyter.py +0 -0
  69. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_libcst.py +0 -0
  70. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_lightweight_charts.py +0 -0
  71. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_logging.py +0 -0
  72. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_luigi.py +0 -0
  73. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_math.py +0 -0
  74. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_memory_profiler.py +0 -0
  75. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_modules.py +0 -0
  76. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_more_itertools.py +0 -0
  77. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_numpy.py +0 -0
  78. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_objects/__init__.py +0 -0
  79. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_objects/objects.py +0 -0
  80. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_operator.py +0 -0
  81. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_optuna.py +0 -0
  82. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_orjson.py +0 -0
  83. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_os.py +0 -0
  84. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_parse.py +0 -0
  85. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pathlib.py +0 -0
  86. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_period.py +0 -0
  87. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_polars.py +0 -0
  90. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_polars_ols.py +0 -0
  91. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pottery.py +0 -0
  92. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pqdm.py +0 -0
  93. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_psutil.py +0 -0
  94. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pydantic.py +0 -0
  95. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pyinstrument.py +0 -0
  96. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pytest.py +0 -0
  97. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_pytest_regressions.py +0 -0
  98. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_python_dotenv.py +0 -0
  99. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_random.py +0 -0
  100. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_re.py +0 -0
  101. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_redis.py +0 -0
  102. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_reprlib.py +0 -0
  103. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_scipy.py +0 -0
  104. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_sentinel.py +0 -0
  105. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_shelve.py +0 -0
  106. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_slack_sdk.py +0 -0
  107. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_socket.py +0 -0
  108. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_sqlalchemy.py +0 -0
  109. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  110. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_statsmodels.py +0 -0
  111. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_streamlit.py +0 -0
  112. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_string.py +0 -0
  113. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_tempfile.py +0 -0
  114. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_text.py +0 -0
  115. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_threading.py +0 -0
  116. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_timer.py +0 -0
  117. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_traceback.py +0 -0
  118. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_typed_settings.py +0 -0
  119. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_types.py +0 -0
  120. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_typing.py +0 -0
  121. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  122. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  123. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  124. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_tzdata.py +0 -0
  125. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_tzlocal.py +0 -0
  126. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_uuid.py +0 -0
  127. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_version.py +0 -0
  128. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_warnings.py +0 -0
  129. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_whenever.py +0 -0
  130. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_zipfile.py +0 -0
  131. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/tests/test_zoneinfo.py +0 -0
  132. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/aiolimiter.py +0 -0
  133. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/altair.py +0 -0
  134. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/arq.py +0 -0
  135. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/asyncio.py +0 -0
  136. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/atomicwrites.py +0 -0
  137. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/atools.py +0 -0
  138. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/cachetools.py +0 -0
  139. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/click.py +0 -0
  140. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/concurrent.py +0 -0
  141. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/contextlib.py +0 -0
  142. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/contextvars.py +0 -0
  143. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/cryptography.py +0 -0
  144. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/cvxpy.py +0 -0
  145. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/dataclasses.py +0 -0
  146. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/enum.py +0 -0
  147. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/errors.py +0 -0
  148. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/eventkit.py +0 -0
  149. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/fastapi.py +0 -0
  150. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/fpdf2.py +0 -0
  151. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/functions.py +0 -0
  152. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/functools.py +0 -0
  153. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/getpass.py +0 -0
  154. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/git.py +0 -0
  155. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/hashlib.py +0 -0
  156. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/http.py +0 -0
  157. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/hypothesis.py +0 -0
  158. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/importlib.py +0 -0
  159. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/inflect.py +0 -0
  160. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/ipython.py +0 -0
  161. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/iterables.py +0 -0
  162. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/jupyter.py +0 -0
  163. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/libcst.py +0 -0
  164. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/lightweight_charts.py +0 -0
  165. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/logging.py +0 -0
  166. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/luigi.py +0 -0
  167. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/math.py +0 -0
  168. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/memory_profiler.py +0 -0
  169. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/modules.py +0 -0
  170. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/more_itertools.py +0 -0
  171. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/numpy.py +0 -0
  172. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/operator.py +0 -0
  173. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/optuna.py +0 -0
  174. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/orjson.py +0 -0
  175. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/os.py +0 -0
  176. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/parse.py +0 -0
  177. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pathlib.py +0 -0
  178. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/period.py +0 -0
  179. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pickle.py +0 -0
  180. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/platform.py +0 -0
  181. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/polars.py +0 -0
  182. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/polars_ols.py +0 -0
  183. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pottery.py +0 -0
  184. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pqdm.py +0 -0
  185. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/psutil.py +0 -0
  186. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/py.typed +0 -0
  187. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pydantic.py +0 -0
  188. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pyinstrument.py +0 -0
  189. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pytest.py +0 -0
  190. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/pytest_regressions.py +0 -0
  191. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/python_dotenv.py +0 -0
  192. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/random.py +0 -0
  193. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/re.py +0 -0
  194. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/redis.py +0 -0
  195. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/reprlib.py +0 -0
  196. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/scipy.py +0 -0
  197. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/sentinel.py +0 -0
  198. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/shelve.py +0 -0
  199. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/slack_sdk.py +0 -0
  200. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/socket.py +0 -0
  201. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/sqlalchemy.py +0 -0
  202. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/sqlalchemy_polars.py +0 -0
  203. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/statsmodels.py +0 -0
  204. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/streamlit.py +0 -0
  205. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/string.py +0 -0
  206. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/tempfile.py +0 -0
  207. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/text.py +0 -0
  208. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/threading.py +0 -0
  209. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/timer.py +0 -0
  210. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/typed_settings.py +0 -0
  211. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/types.py +0 -0
  212. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/typing.py +0 -0
  213. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/tzdata.py +0 -0
  214. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/tzlocal.py +0 -0
  215. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/uuid.py +0 -0
  216. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/version.py +0 -0
  217. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/warnings.py +0 -0
  218. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/whenever.py +0 -0
  219. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/zipfile.py +0 -0
  220. {dycw_utilities-0.135.1 → dycw_utilities-0.136.0}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.135.1
3
+ Version: 0.136.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -13,6 +13,7 @@ Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
13
13
  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.2; extra == 'test'
16
+ Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
16
17
  Requires-Dist: pytest-asyncio<1.1,>=1.0.0; extra == 'test'
17
18
  Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
18
19
  Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
@@ -65,7 +65,6 @@ pottery = ["pottery >= 3.0.1, < 3.1"]
65
65
  pottery-test = ["orjson", "pytest-rerunfailures"]
66
66
  pqdm = ["pqdm >= 0.2.0, < 0.3"]
67
67
  psutil = ["psutil >= 7.0.0, < 7.1"]
68
- pudb = ["pudb >= 2025.1, < 2025.2"]
69
68
  pydantic = ["pydantic >= 2.11.4, < 2.12"]
70
69
  pyinstrument = ["pyinstrument >= 5.0.2, < 5.1"]
71
70
  pytest = [
@@ -107,7 +106,7 @@ dependencies = [
107
106
  name = "dycw-utilities"
108
107
  readme = "README.md"
109
108
  requires-python = ">= 3.12"
110
- version = "0.135.1"
109
+ version = "0.136.0"
111
110
 
112
111
  [project.optional-dependencies]
113
112
  logging = [
@@ -116,6 +115,7 @@ logging = [
116
115
  test = [
117
116
  "dycw-pytest-only >= 2.1.1, < 2.2",
118
117
  "hypothesis >= 6.135.2, < 6.136",
118
+ "pudb >= 2025.1, < 2025.2",
119
119
  "pytest >= 8.3.5, < 8.4",
120
120
  "pytest-asyncio >= 1.0.0, < 1.1",
121
121
  "pytest-cov >= 6.1.1, < 6.2",
@@ -134,7 +134,7 @@ test = [
134
134
  # bump-my-version
135
135
  [tool.bumpversion]
136
136
  allow_dirty = true
137
- current_version = "0.135.1"
137
+ current_version = "0.136.0"
138
138
 
139
139
  [[tool.bumpversion.files]]
140
140
  filename = "src/utilities/__init__.py"
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.135.1"
3
+ __version__ = "0.136.0"
@@ -11,11 +11,12 @@ from itertools import repeat
11
11
  from pathlib import Path
12
12
  from socket import gethostname
13
13
  from traceback import TracebackException
14
- from typing import TYPE_CHECKING, override
14
+ from typing import TYPE_CHECKING, assert_never, override
15
15
 
16
16
  from utilities.atomicwrites import writer
17
17
  from utilities.errors import repr_error
18
18
  from utilities.iterables import OneEmptyError, one
19
+ from utilities.os import get_env_var
19
20
  from utilities.pathlib import get_path
20
21
  from utilities.reprlib import (
21
22
  RICH_EXPAND_ALL,
@@ -30,7 +31,7 @@ from utilities.version import get_version
30
31
  from utilities.whenever import format_compact, get_now, to_zoned_date_time
31
32
 
32
33
  if TYPE_CHECKING:
33
- from collections.abc import Callable, Iterator, Sequence
34
+ from collections.abc import Iterator, Sequence
34
35
  from traceback import FrameSummary
35
36
  from types import TracebackType
36
37
 
@@ -202,6 +203,7 @@ def make_except_hook(
202
203
  max_depth: int | None = RICH_MAX_DEPTH,
203
204
  expand_all: bool = RICH_EXPAND_ALL,
204
205
  slack_url: str | None = None,
206
+ pudb: str | None = None,
205
207
  ) -> Callable[
206
208
  [type[BaseException] | None, BaseException | None, TracebackType | None], None
207
209
  ]:
@@ -218,6 +220,7 @@ def make_except_hook(
218
220
  max_depth=max_depth,
219
221
  expand_all=expand_all,
220
222
  slack_url=slack_url,
223
+ pudb=pudb,
221
224
  )
222
225
 
223
226
 
@@ -237,6 +240,7 @@ def _make_except_hook_inner(
237
240
  max_depth: int | None = RICH_MAX_DEPTH,
238
241
  expand_all: bool = RICH_EXPAND_ALL,
239
242
  slack_url: str | None = None,
243
+ pudb: str | Callable[[], bool] | None = None,
240
244
  ) -> None:
241
245
  """Exception hook to log the traceback."""
242
246
  _ = (exc_type, traceback)
@@ -268,6 +272,18 @@ def _make_except_hook_inner(
268
272
 
269
273
  send = f"```{slim}```"
270
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)
271
287
 
272
288
 
273
289
  @dataclass(kw_only=True, slots=True)
@@ -1,37 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from asyncio import sleep
4
-
5
- from hypothesis import given
6
- from pytest import raises
7
-
8
- from utilities.hypothesis import text_ascii
9
- from utilities.pudb import call_pudb
10
-
11
-
12
- class TestCallPUDB:
13
- def test_sync(self) -> None:
14
- @call_pudb
15
- def func(x: int, y: int, /) -> float:
16
- return x / y
17
-
18
- with raises(ZeroDivisionError):
19
- _ = func(1, 0)
20
-
21
- async def test_async(self) -> None:
22
- @call_pudb
23
- async def func(x: int, y: int, /) -> float:
24
- await sleep(0.01)
25
- return x / y
26
-
27
- with raises(ZeroDivisionError):
28
- _ = await func(1, 0)
29
-
30
- @given(env_var=text_ascii(min_size=1))
31
- def test_custom_env_var(self, *, env_var: str) -> None:
32
- @call_pudb(env_var=env_var)
33
- def func(x: int, y: int, /) -> float:
34
- return x / y
35
-
36
- with raises(ZeroDivisionError):
37
- _ = func(1, 0)
@@ -1,62 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from asyncio import iscoroutinefunction
4
- from functools import partial, wraps
5
- from typing import TYPE_CHECKING, Any, NoReturn, cast, overload
6
-
7
- from utilities.os import GetEnvVarError, get_env_var
8
-
9
- if TYPE_CHECKING:
10
- from collections.abc import Callable
11
-
12
-
13
- _ENV_VAR = "DEBUG"
14
-
15
-
16
- @overload
17
- def call_pudb[F: Callable](func: F, /, *, env_var: str = _ENV_VAR) -> F: ...
18
- @overload
19
- def call_pudb[F: Callable](
20
- func: None = None, /, *, env_var: str = _ENV_VAR
21
- ) -> Callable[[F], F]: ...
22
- def call_pudb[F: Callable](
23
- func: F | None = None, /, *, env_var: str = _ENV_VAR
24
- ) -> F | Callable[[F], F]:
25
- """Call `pudb` upon failure, if the required environment variable is set."""
26
- if func is None:
27
- result = partial(call_pudb, env_var=env_var)
28
- return cast("Callable[[F], F]", result)
29
-
30
- if not iscoroutinefunction(func):
31
-
32
- @wraps(func)
33
- def wrapped_sync(*args: Any, **kwargs: Any) -> Any:
34
- try:
35
- return func(*args, **kwargs)
36
- except Exception as error: # noqa: BLE001
37
- _call_pudb(error, env_var=env_var)
38
-
39
- return cast("F", wrapped_sync)
40
-
41
- @wraps(func)
42
- async def wrapped_async(*args: Any, **kwargs: Any) -> Any:
43
- try:
44
- return await func(*args, **kwargs)
45
- except Exception as error: # noqa: BLE001
46
- _call_pudb(error, env_var=env_var)
47
-
48
- return cast("F", wrapped_async)
49
-
50
-
51
- def _call_pudb(error: Exception, /, *, env_var: str = _ENV_VAR) -> NoReturn:
52
- try:
53
- _ = get_env_var(env_var)
54
- except GetEnvVarError:
55
- raise error from None
56
- from pudb import post_mortem # pragma: no cover
57
-
58
- post_mortem() # pragma: no cover
59
- raise error # pragma: no cover
60
-
61
-
62
- __all__ = ["call_pudb"]