dycw-utilities 0.126.0__tar.gz → 0.126.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 (228) hide show
  1. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/PKG-INFO +2 -2
  2. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/pyproject.toml +4 -4
  3. dycw_utilities-0.126.2/src/tests/test_errors.py +52 -0
  4. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_redis.py +7 -12
  5. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/errors.py +4 -0
  7. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/redis.py +12 -22
  8. dycw_utilities-0.126.0/src/tests/test_errors.py +0 -28
  9. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/.gitignore +0 -0
  10. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/LICENSE +0 -0
  11. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/README.md +0 -0
  12. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/__init__.py +0 -0
  13. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/conftest.py +0 -0
  14. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/__init__.py +0 -0
  15. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_missing/__init__.py +0 -0
  16. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_missing/module.py +0 -0
  17. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/__init__.py +0 -0
  18. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/outer_1.py +0 -0
  19. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/outer_2.py +0 -0
  20. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  21. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  22. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  23. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  24. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/__init__.py +0 -0
  25. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/module_1.py +0 -0
  26. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/package_without/module_2.py +0 -0
  27. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/standalone.py +0 -0
  28. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/modules/with_imports.py +0 -0
  29. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  30. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  31. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  32. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  33. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  34. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  35. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  36. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  37. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_altair.py +0 -0
  38. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_asyncio.py +0 -0
  39. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_atomicwrites.py +0 -0
  40. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_atools.py +0 -0
  41. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_cachetools.py +0 -0
  42. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_click.py +0 -0
  43. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_concurrent.py +0 -0
  44. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_contextlib.py +0 -0
  45. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_datetime.py +0 -0
  50. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_eventkit.py +0 -0
  52. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_fastapi.py +0 -0
  53. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_fpdf2.py +0 -0
  54. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_functions.py +0 -0
  55. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_functools.py +0 -0
  56. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_getpass.py +0 -0
  57. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_git.py +0 -0
  58. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_hashlib.py +0 -0
  59. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_http.py +0 -0
  60. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_hypothesis.py +0 -0
  61. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_importlib.py +0 -0
  62. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_ipython.py +0 -0
  63. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_iterables.py +0 -0
  64. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_jupyter.py +0 -0
  65. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_libcst.py +0 -0
  66. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_lightweight_charts.py +0 -0
  67. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_logging.py +0 -0
  68. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_loguru.py +0 -0
  69. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_luigi.py +0 -0
  70. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_math.py +0 -0
  71. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_memory_profiler.py +0 -0
  72. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_modules.py +0 -0
  73. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_more_itertools.py +0 -0
  74. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_numpy.py +0 -0
  75. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_operator.py +0 -0
  76. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_optuna.py +0 -0
  77. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_orjson.py +0 -0
  78. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_os.py +0 -0
  79. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_parse.py +0 -0
  80. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pathlib.py +0 -0
  81. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_period.py +0 -0
  82. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pickle.py +0 -0
  83. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_platform.py +0 -0
  84. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_polars.py +0 -0
  85. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_polars_ols.py +0 -0
  86. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pqdm.py +0 -0
  87. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_psutil.py +0 -0
  88. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pydantic.py +0 -0
  89. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pyinstrument.py +0 -0
  90. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pyrsistent.py +0 -0
  91. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pytest.py +0 -0
  92. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_pytest_regressions.py +0 -0
  93. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_python_dotenv.py +0 -0
  94. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_random.py +0 -0
  95. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_re.py +0 -0
  96. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_reprlib.py +0 -0
  97. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_rich.py +0 -0
  98. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_scipy.py +0 -0
  99. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sentinel.py +0 -0
  100. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_shelve.py +0 -0
  101. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_slack_sdk.py +0 -0
  102. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_socket.py +0 -0
  103. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sqlalchemy.py +0 -0
  104. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  105. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_statsmodel.py +0 -0
  106. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_streamlit.py +0 -0
  107. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_string.py +0 -0
  108. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_sys.py +0 -0
  109. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tempfile.py +0 -0
  110. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tenacity.py +0 -0
  111. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_text.py +0 -0
  112. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_threading.py +0 -0
  113. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_timer.py +0 -0
  114. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback.py +0 -0
  115. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/__init__.py +0 -0
  116. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/chain.py +0 -0
  117. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  118. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  119. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  120. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/many.py +0 -0
  121. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/one.py +0 -0
  122. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/recursive.py +0 -0
  123. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  124. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  125. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/two.py +0 -0
  126. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_traceback_funcs/untraced.py +0 -0
  127. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_types.py +0 -0
  128. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing.py +0 -0
  129. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  130. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  131. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  132. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tzdata.py +0 -0
  133. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_tzlocal.py +0 -0
  134. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_uuid.py +0 -0
  135. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_version.py +0 -0
  136. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_warnings.py +0 -0
  137. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_whenever.py +0 -0
  138. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_zipfile.py +0 -0
  139. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/tests/test_zoneinfo.py +0 -0
  140. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/altair.py +0 -0
  141. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/asyncio.py +0 -0
  142. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/atomicwrites.py +0 -0
  143. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/atools.py +0 -0
  144. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/cachetools.py +0 -0
  145. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/click.py +0 -0
  146. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/concurrent.py +0 -0
  147. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/contextlib.py +0 -0
  148. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/contextvars.py +0 -0
  149. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/cryptography.py +0 -0
  150. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/cvxpy.py +0 -0
  151. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/dataclasses.py +0 -0
  152. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/datetime.py +0 -0
  153. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/enum.py +0 -0
  154. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/eventkit.py +0 -0
  155. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/fastapi.py +0 -0
  156. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/fpdf2.py +0 -0
  157. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/functions.py +0 -0
  158. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/functools.py +0 -0
  159. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/getpass.py +0 -0
  160. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/git.py +0 -0
  161. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/hashlib.py +0 -0
  162. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/http.py +0 -0
  163. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/hypothesis.py +0 -0
  164. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/importlib.py +0 -0
  165. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/ipython.py +0 -0
  166. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/iterables.py +0 -0
  167. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/jupyter.py +0 -0
  168. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/libcst.py +0 -0
  169. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/lightweight_charts.py +0 -0
  170. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/logging.py +0 -0
  171. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/loguru.py +0 -0
  172. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/luigi.py +0 -0
  173. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/math.py +0 -0
  174. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/memory_profiler.py +0 -0
  175. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/modules.py +0 -0
  176. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/more_itertools.py +0 -0
  177. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/numpy.py +0 -0
  178. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/operator.py +0 -0
  179. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/optuna.py +0 -0
  180. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/orjson.py +0 -0
  181. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/os.py +0 -0
  182. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/parse.py +0 -0
  183. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pathlib.py +0 -0
  184. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/period.py +0 -0
  185. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pickle.py +0 -0
  186. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/platform.py +0 -0
  187. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/polars.py +0 -0
  188. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/polars_ols.py +0 -0
  189. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pqdm.py +0 -0
  190. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/psutil.py +0 -0
  191. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/py.typed +0 -0
  192. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pydantic.py +0 -0
  193. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pyinstrument.py +0 -0
  194. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pyrsistent.py +0 -0
  195. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pytest.py +0 -0
  196. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/pytest_regressions.py +0 -0
  197. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/python_dotenv.py +0 -0
  198. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/random.py +0 -0
  199. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/re.py +0 -0
  200. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/reprlib.py +0 -0
  201. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/rich.py +0 -0
  202. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/scipy.py +0 -0
  203. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sentinel.py +0 -0
  204. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/shelve.py +0 -0
  205. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/slack_sdk.py +0 -0
  206. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/socket.py +0 -0
  207. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sqlalchemy.py +0 -0
  208. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sqlalchemy_polars.py +0 -0
  209. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/statsmodels.py +0 -0
  210. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/streamlit.py +0 -0
  211. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/string.py +0 -0
  212. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/sys.py +0 -0
  213. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tempfile.py +0 -0
  214. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tenacity.py +0 -0
  215. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/text.py +0 -0
  216. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/threading.py +0 -0
  217. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/timer.py +0 -0
  218. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/traceback.py +0 -0
  219. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/types.py +0 -0
  220. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/typing.py +0 -0
  221. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tzdata.py +0 -0
  222. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/tzlocal.py +0 -0
  223. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/uuid.py +0 -0
  224. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/version.py +0 -0
  225. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/warnings.py +0 -0
  226. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/whenever.py +0 -0
  227. {dycw_utilities-0.126.0 → dycw_utilities-0.126.2}/src/utilities/zipfile.py +0 -0
  228. {dycw_utilities-0.126.0 → dycw_utilities-0.126.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.126.0
3
+ Version: 0.126.2
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -174,7 +174,7 @@ Requires-Dist: scipy<1.16,>=1.15.3; extra == 'zzz-test-scipy'
174
174
  Provides-Extra: zzz-test-sentinel
175
175
  Provides-Extra: zzz-test-shelve
176
176
  Provides-Extra: zzz-test-slack-sdk
177
- Requires-Dist: aiohttp<3.12.5,>=3.12.4; extra == 'zzz-test-slack-sdk'
177
+ Requires-Dist: aiohttp<3.12.7,>=3.12.6; extra == 'zzz-test-slack-sdk'
178
178
  Requires-Dist: slack-sdk<3.36,>=3.35.0; extra == 'zzz-test-slack-sdk'
179
179
  Provides-Extra: zzz-test-socket
180
180
  Provides-Extra: zzz-test-sqlalchemy
@@ -8,7 +8,7 @@ requires = ["hatchling"]
8
8
  # dependency groups
9
9
  [dependency-groups]
10
10
  dev = [
11
- "aiohttp >= 3.12.4, < 3.12.5", # for slack
11
+ "aiohttp >= 3.12.6, < 3.12.7", # for slack
12
12
  "aiosqlite >= 0.21.0, < 0.22",
13
13
  "altair >= 5.5.0, < 5.6",
14
14
  "asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async
@@ -94,7 +94,7 @@ dependencies = [
94
94
  name = "dycw-utilities"
95
95
  readme = "README.md"
96
96
  requires-python = ">= 3.12"
97
- version = "0.126.0"
97
+ version = "0.126.2"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  test = [
@@ -271,7 +271,7 @@ zzz-test-scipy = ["scipy >= 1.15.3, < 1.16"]
271
271
  zzz-test-sentinel = []
272
272
  zzz-test-shelve = []
273
273
  zzz-test-slack-sdk = [
274
- "aiohttp >= 3.12.4, < 3.12.5", # for slack
274
+ "aiohttp >= 3.12.6, < 3.12.7", # for slack
275
275
  "slack-sdk >= 3.35.0, < 3.36",
276
276
  ]
277
277
  zzz-test-socket = []
@@ -335,7 +335,7 @@ zzz-test-zoneinfo = [
335
335
  # bump-my-version
336
336
  [tool.bumpversion]
337
337
  allow_dirty = true
338
- current_version = "0.126.0"
338
+ current_version = "0.126.2"
339
339
 
340
340
  [[tool.bumpversion.files]]
341
341
  filename = "src/utilities/__init__.py"
@@ -0,0 +1,52 @@
1
+ from __future__ import annotations
2
+
3
+ from asyncio import TaskGroup
4
+
5
+ from pytest import raises
6
+
7
+ from utilities.errors import ImpossibleCaseError, repr_error
8
+
9
+
10
+ class TestImpossibleCaseError:
11
+ def test_main(self) -> None:
12
+ x = None
13
+ with raises(ImpossibleCaseError, match=r"Case must be possible: x=None\."):
14
+ raise ImpossibleCaseError(case=[f"{x=}"])
15
+
16
+
17
+ class TestReprError:
18
+ def test_class(self) -> None:
19
+ class CustomError(Exception): ...
20
+
21
+ result = repr_error(CustomError)
22
+ expected = "CustomError"
23
+ assert result == expected
24
+
25
+ async def test_group(self) -> None:
26
+ class Custom1Error(Exception): ...
27
+
28
+ async def coroutine1() -> None:
29
+ raise Custom1Error
30
+
31
+ class Custom2Error(Exception): ...
32
+
33
+ async def coroutine2() -> None:
34
+ msg = "message2"
35
+ raise Custom2Error(msg)
36
+
37
+ with raises(ExceptionGroup) as exc_info: # noqa: PT012
38
+ async with TaskGroup() as tg:
39
+ _ = tg.create_task(coroutine1())
40
+ _ = tg.create_task(coroutine2())
41
+ error = exc_info.value
42
+ assert isinstance(error, ExceptionGroup)
43
+ result = repr_error(error)
44
+ expected = "ExceptionGroup(Custom1Error(), Custom2Error(message2))"
45
+ assert result == expected
46
+
47
+ def test_instance(self) -> None:
48
+ class CustomError(Exception): ...
49
+
50
+ result = repr_error(CustomError("message"))
51
+ expected = "CustomError(message)"
52
+ assert result == expected
@@ -42,9 +42,8 @@ from utilities.redis import (
42
42
  PublishError,
43
43
  PublishService,
44
44
  SubscribeService,
45
- _is_subscribe_message,
46
- _RedisMessageSubscribe,
47
- _RedisMessageUnsubscribe,
45
+ _is_message,
46
+ _RedisMessage,
48
47
  publish,
49
48
  redis_hash_map_key,
50
49
  redis_key,
@@ -71,7 +70,7 @@ def channels(draw: DrawFn, /) -> str:
71
70
  return f"test_{now}_{key}_{pid}"
72
71
 
73
72
 
74
- class TestIsSubscribeMessage:
73
+ class TestIsMessage:
75
74
  @mark.parametrize(
76
75
  ("message", "channels", "expected"),
77
76
  [
@@ -113,13 +112,9 @@ class TestIsSubscribeMessage:
113
112
  ],
114
113
  )
115
114
  def test_main(
116
- self,
117
- *,
118
- message: _RedisMessageSubscribe | _RedisMessageUnsubscribe | None,
119
- channels: Sequence[bytes],
120
- expected: bool,
115
+ self, *, message: Any, channels: Sequence[bytes], expected: bool
121
116
  ) -> None:
122
- result = _is_subscribe_message(message, channels=channels)
117
+ result = _is_message(message, channels=channels)
123
118
  assert result is expected
124
119
 
125
120
 
@@ -558,7 +553,7 @@ class TestSubscribe:
558
553
  @settings_with_reduced_examples(phases={Phase.generate})
559
554
  @SKIPIF_CI_AND_NOT_LINUX
560
555
  async def test_raw(self, *, channel: str, messages: Sequence[str]) -> None:
561
- queue: Queue[_RedisMessageSubscribe] = Queue()
556
+ queue: Queue[_RedisMessage] = Queue()
562
557
  async with (
563
558
  yield_redis() as redis,
564
559
  subscribe(redis, channel, queue, output="raw"),
@@ -583,7 +578,7 @@ class TestSubscribe:
583
578
  @settings_with_reduced_examples(phases={Phase.generate})
584
579
  @SKIPIF_CI_AND_NOT_LINUX
585
580
  async def test_text(self, *, channel: str, messages: Sequence[str]) -> None:
586
- queue: Queue[_RedisMessageSubscribe] = Queue()
581
+ queue: Queue[_RedisMessage] = Queue()
587
582
  async with (
588
583
  yield_redis() as redis,
589
584
  subscribe(redis, channel, queue, output="raw"),
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.126.0"
3
+ __version__ = "0.126.2"
@@ -24,6 +24,10 @@ class ImpossibleCaseError(Exception):
24
24
  def repr_error(error: MaybeType[BaseException], /) -> str:
25
25
  """Get a string representation of an error."""
26
26
  match error:
27
+ case ExceptionGroup() as group:
28
+ descs = list(map(repr_error, group.exceptions))
29
+ joined = ", ".join(descs)
30
+ return f"{group.__class__.__name__}({joined})"
27
31
  case BaseException() as error_obj:
28
32
  return f"{error_obj.__class__.__name__}({error_obj})"
29
33
  case type() as error_cls:
@@ -657,7 +657,7 @@ class PublisherError(Exception):
657
657
 
658
658
 
659
659
  @dataclass(kw_only=True)
660
- class PublishService(Looper[tuple[str, _T]]):
660
+ class PublishService(Looper[tuple[str, bytes | str | _T]]):
661
661
  """Service to publish items to Redis."""
662
662
 
663
663
  # base
@@ -677,7 +677,7 @@ class PublishService(Looper[tuple[str, _T]]):
677
677
  _ = await publish(
678
678
  self.redis,
679
679
  channel,
680
- cast("Any", data),
680
+ data,
681
681
  serializer=self.serializer,
682
682
  timeout=self.publish_timeout,
683
683
  )
@@ -695,7 +695,7 @@ _SUBSCRIBE_SLEEP: Duration = MILLISECOND
695
695
  def subscribe(
696
696
  redis: Redis,
697
697
  channels: MaybeIterable[str],
698
- queue: Queue[_RedisMessageSubscribe],
698
+ queue: Queue[_RedisMessage],
699
699
  /,
700
700
  *,
701
701
  timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
@@ -742,7 +742,7 @@ def subscribe(
742
742
  async def subscribe(
743
743
  redis: Redis,
744
744
  channels: MaybeIterable[str],
745
- queue: Queue[_RedisMessageSubscribe] | Queue[bytes] | Queue[_T],
745
+ queue: Queue[_RedisMessage] | Queue[bytes] | Queue[_T],
746
746
  /,
747
747
  *,
748
748
  timeout: Duration | None = _SUBSCRIBE_TIMEOUT,
@@ -758,12 +758,12 @@ async def subscribe(
758
758
  transform = cast("Any", itemgetter("data"))
759
759
  case "text":
760
760
 
761
- def transform(message: _RedisMessageSubscribe, /) -> str: # pyright: ignore[reportRedeclaration]
761
+ def transform(message: _RedisMessage, /) -> str: # pyright: ignore[reportRedeclaration]
762
762
  return message["data"].decode()
763
763
 
764
764
  case Callable() as deserialize:
765
765
 
766
- def transform(message: _RedisMessageSubscribe, /) -> _T:
766
+ def transform(message: _RedisMessage, /) -> _T:
767
767
  return deserialize(message["data"])
768
768
 
769
769
  case _ as never:
@@ -783,7 +783,7 @@ async def subscribe(
783
783
  async def _subscribe_core(
784
784
  redis: Redis,
785
785
  channels: MaybeIterable[str],
786
- transform: Callable[[_RedisMessageSubscribe], Any],
786
+ transform: Callable[[_RedisMessage], Any],
787
787
  queue: Queue[Any],
788
788
  /,
789
789
  *,
@@ -795,14 +795,11 @@ async def _subscribe_core(
795
795
  )
796
796
  sleep_use = datetime_duration_to_float(sleep) # skipif-ci-and-not-linux
797
797
  is_subscribe_message = partial( # skipif-ci-and-not-linux
798
- _is_subscribe_message, channels={c.encode() for c in channels}
798
+ _is_message, channels={c.encode() for c in channels}
799
799
  )
800
800
  async with yield_pubsub(redis, channels) as pubsub: # skipif-ci-and-not-linux
801
801
  while True:
802
- message = cast(
803
- "_RedisMessageSubscribe | _RedisMessageUnsubscribe | None",
804
- await pubsub.get_message(timeout=timeout_use),
805
- )
802
+ message = await pubsub.get_message(timeout=timeout_use)
806
803
  if is_subscribe_message(message):
807
804
  if isinstance(queue, EnhancedQueue):
808
805
  queue.put_right_nowait(transform(message))
@@ -812,9 +809,9 @@ async def _subscribe_core(
812
809
  await asyncio.sleep(sleep_use)
813
810
 
814
811
 
815
- def _is_subscribe_message(
812
+ def _is_message(
816
813
  message: Any, /, *, channels: Collection[bytes]
817
- ) -> TypeGuard[_RedisMessageSubscribe]:
814
+ ) -> TypeGuard[_RedisMessage]:
818
815
  return (
819
816
  isinstance(message, Mapping)
820
817
  and ("type" in message)
@@ -828,20 +825,13 @@ def _is_subscribe_message(
828
825
  )
829
826
 
830
827
 
831
- class _RedisMessageSubscribe(TypedDict):
828
+ class _RedisMessage(TypedDict):
832
829
  type: Literal["subscribe", "psubscribe", "message", "pmessage"]
833
830
  pattern: str | None
834
831
  channel: bytes
835
832
  data: bytes
836
833
 
837
834
 
838
- class _RedisMessageUnsubscribe(TypedDict):
839
- type: Literal["unsubscribe", "punsubscribe"]
840
- pattern: str | None
841
- channel: bytes
842
- data: int
843
-
844
-
845
835
  ##
846
836
 
847
837
 
@@ -1,28 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pytest import raises
4
-
5
- from utilities.errors import ImpossibleCaseError, repr_error
6
-
7
-
8
- class TestImpossibleCaseError:
9
- def test_main(self) -> None:
10
- x = None
11
- with raises(ImpossibleCaseError, match=r"Case must be possible: x=None\."):
12
- raise ImpossibleCaseError(case=[f"{x=}"])
13
-
14
-
15
- class TestReprError:
16
- def test_class(self) -> None:
17
- class CustomError(Exception): ...
18
-
19
- result = repr_error(CustomError)
20
- expected = "CustomError"
21
- assert result == expected
22
-
23
- def test_instance(self) -> None:
24
- class CustomError(Exception): ...
25
-
26
- result = repr_error(CustomError())
27
- expected = "CustomError()"
28
- assert result == expected