dycw-utilities 0.125.0__tar.gz → 0.125.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 (221) hide show
  1. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/PKG-INFO +4 -4
  2. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/pyproject.toml +7 -7
  3. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_asyncio.py +31 -29
  4. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_fastapi.py +2 -3
  5. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_importlib.py +4 -2
  6. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_slack_sdk.py +3 -3
  7. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/__init__.py +1 -1
  8. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/asyncio.py +3 -2
  9. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/importlib.py +3 -1
  10. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/.gitignore +0 -0
  11. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/LICENSE +0 -0
  12. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/README.md +0 -0
  13. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/__init__.py +0 -0
  14. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/conftest.py +0 -0
  15. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/__init__.py +0 -0
  16. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_missing/__init__.py +0 -0
  17. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_missing/module.py +0 -0
  18. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_with/__init__.py +0 -0
  19. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_with/outer_1.py +0 -0
  20. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_with/outer_2.py +0 -0
  21. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  22. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  23. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  24. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  25. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_without/__init__.py +0 -0
  26. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_without/module_1.py +0 -0
  27. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/package_without/module_2.py +0 -0
  28. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/standalone.py +0 -0
  29. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/modules/with_imports.py +0 -0
  30. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  31. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  32. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  33. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  34. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  35. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  36. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  37. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  38. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_altair.py +0 -0
  39. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_atomicwrites.py +0 -0
  40. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_atools.py +0 -0
  41. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_cachetools.py +0 -0
  42. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_click.py +0 -0
  43. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_concurrent.py +0 -0
  44. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_contextlib.py +0 -0
  45. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_datetime.py +0 -0
  50. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_errors.py +0 -0
  52. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_eventkit.py +0 -0
  53. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_fpdf2.py +0 -0
  54. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_functions.py +0 -0
  55. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_functools.py +0 -0
  56. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_getpass.py +0 -0
  57. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_git.py +0 -0
  58. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_hashlib.py +0 -0
  59. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_http.py +0 -0
  60. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_hypothesis.py +0 -0
  61. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_ipython.py +0 -0
  62. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_iterables.py +0 -0
  63. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_jupyter.py +0 -0
  64. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_lightweight_charts.py +0 -0
  65. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_logging.py +0 -0
  66. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_loguru.py +0 -0
  67. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_luigi.py +0 -0
  68. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_math.py +0 -0
  69. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_memory_profiler.py +0 -0
  70. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_modules.py +0 -0
  71. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_more_itertools.py +0 -0
  72. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_numpy.py +0 -0
  73. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_operator.py +0 -0
  74. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_optuna.py +0 -0
  75. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_orjson.py +0 -0
  76. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_os.py +0 -0
  77. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_parse.py +0 -0
  78. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pathlib.py +0 -0
  79. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_period.py +0 -0
  80. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pickle.py +0 -0
  81. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_platform.py +0 -0
  82. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_polars.py +0 -0
  83. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_polars_ols.py +0 -0
  84. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pqdm.py +0 -0
  85. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pydantic.py +0 -0
  86. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pyinstrument.py +0 -0
  87. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pyrsistent.py +0 -0
  88. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pytest.py +0 -0
  89. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_pytest_regressions.py +0 -0
  90. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_python_dotenv.py +0 -0
  91. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_random.py +0 -0
  92. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_re.py +0 -0
  93. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_redis.py +0 -0
  94. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_reprlib.py +0 -0
  95. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_rich.py +0 -0
  96. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_scipy.py +0 -0
  97. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_sentinel.py +0 -0
  98. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_shelve.py +0 -0
  99. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_socket.py +0 -0
  100. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_sqlalchemy.py +0 -0
  101. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  102. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_statsmodel.py +0 -0
  103. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_streamlit.py +0 -0
  104. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_sys.py +0 -0
  105. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_tempfile.py +0 -0
  106. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_tenacity.py +0 -0
  107. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_text.py +0 -0
  108. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_threading.py +0 -0
  109. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_timer.py +0 -0
  110. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback.py +0 -0
  111. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/__init__.py +0 -0
  112. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/chain.py +0 -0
  113. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  114. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  115. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  116. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/many.py +0 -0
  117. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/one.py +0 -0
  118. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/recursive.py +0 -0
  119. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  120. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  121. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/two.py +0 -0
  122. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_traceback_funcs/untraced.py +0 -0
  123. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_types.py +0 -0
  124. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_typing.py +0 -0
  125. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  126. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  127. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  128. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_tzdata.py +0 -0
  129. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_tzlocal.py +0 -0
  130. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_uuid.py +0 -0
  131. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_version.py +0 -0
  132. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_warnings.py +0 -0
  133. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_whenever.py +0 -0
  134. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_zipfile.py +0 -0
  135. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/tests/test_zoneinfo.py +0 -0
  136. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/altair.py +0 -0
  137. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/atomicwrites.py +0 -0
  138. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/atools.py +0 -0
  139. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/cachetools.py +0 -0
  140. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/click.py +0 -0
  141. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/concurrent.py +0 -0
  142. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/contextlib.py +0 -0
  143. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/contextvars.py +0 -0
  144. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/cryptography.py +0 -0
  145. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/cvxpy.py +0 -0
  146. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/dataclasses.py +0 -0
  147. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/datetime.py +0 -0
  148. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/enum.py +0 -0
  149. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/errors.py +0 -0
  150. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/eventkit.py +0 -0
  151. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/fastapi.py +0 -0
  152. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/fpdf2.py +0 -0
  153. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/functions.py +0 -0
  154. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/functools.py +0 -0
  155. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/getpass.py +0 -0
  156. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/git.py +0 -0
  157. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/hashlib.py +0 -0
  158. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/http.py +0 -0
  159. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/hypothesis.py +0 -0
  160. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/ipython.py +0 -0
  161. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/iterables.py +0 -0
  162. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/jupyter.py +0 -0
  163. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/lightweight_charts.py +0 -0
  164. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/logging.py +0 -0
  165. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/loguru.py +0 -0
  166. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/luigi.py +0 -0
  167. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/math.py +0 -0
  168. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/memory_profiler.py +0 -0
  169. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/modules.py +0 -0
  170. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/more_itertools.py +0 -0
  171. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/numpy.py +0 -0
  172. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/operator.py +0 -0
  173. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/optuna.py +0 -0
  174. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/orjson.py +0 -0
  175. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/os.py +0 -0
  176. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/parse.py +0 -0
  177. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pathlib.py +0 -0
  178. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/period.py +0 -0
  179. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pickle.py +0 -0
  180. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/platform.py +0 -0
  181. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/polars.py +0 -0
  182. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/polars_ols.py +0 -0
  183. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pqdm.py +0 -0
  184. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/py.typed +0 -0
  185. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pydantic.py +0 -0
  186. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pyinstrument.py +0 -0
  187. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pyrsistent.py +0 -0
  188. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pytest.py +0 -0
  189. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/pytest_regressions.py +0 -0
  190. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/python_dotenv.py +0 -0
  191. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/random.py +0 -0
  192. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/re.py +0 -0
  193. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/redis.py +0 -0
  194. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/reprlib.py +0 -0
  195. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/rich.py +0 -0
  196. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/scipy.py +0 -0
  197. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/sentinel.py +0 -0
  198. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/shelve.py +0 -0
  199. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/slack_sdk.py +0 -0
  200. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/socket.py +0 -0
  201. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/sqlalchemy.py +0 -0
  202. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/sqlalchemy_polars.py +0 -0
  203. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/statsmodels.py +0 -0
  204. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/streamlit.py +0 -0
  205. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/sys.py +0 -0
  206. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/tempfile.py +0 -0
  207. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/tenacity.py +0 -0
  208. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/text.py +0 -0
  209. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/threading.py +0 -0
  210. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/timer.py +0 -0
  211. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/traceback.py +0 -0
  212. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/types.py +0 -0
  213. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/typing.py +0 -0
  214. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/tzdata.py +0 -0
  215. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/tzlocal.py +0 -0
  216. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/uuid.py +0 -0
  217. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/version.py +0 -0
  218. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/warnings.py +0 -0
  219. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/whenever.py +0 -0
  220. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/zipfile.py +0 -0
  221. {dycw_utilities-0.125.0 → dycw_utilities-0.125.2}/src/utilities/zoneinfo.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.125.0
3
+ Version: 0.125.2
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
7
7
  Requires-Dist: typing-extensions<4.14,>=4.13.1
8
8
  Provides-Extra: test
9
- Requires-Dist: hypothesis<6.132,>=6.131.24; extra == 'test'
9
+ Requires-Dist: hypothesis<6.132,>=6.131.27; extra == 'test'
10
10
  Requires-Dist: pytest-asyncio<0.27,>=0.26.0; extra == 'test'
11
11
  Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
12
12
  Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
@@ -78,7 +78,7 @@ Provides-Extra: zzz-test-hypothesis
78
78
  Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-hypothesis'
79
79
  Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-hypothesis'
80
80
  Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-hypothesis'
81
- Requires-Dist: hypothesis<6.132,>=6.131.24; extra == 'zzz-test-hypothesis'
81
+ Requires-Dist: hypothesis<6.132,>=6.131.27; extra == 'zzz-test-hypothesis'
82
82
  Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-hypothesis'
83
83
  Requires-Dist: numpy<2.3,>=2.2.6; extra == 'zzz-test-hypothesis'
84
84
  Requires-Dist: pathvalidate<3.3,>=3.2.3; extra == 'zzz-test-hypothesis'
@@ -144,7 +144,7 @@ Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pydantic'
144
144
  Requires-Dist: pydantic<2.12,>=2.11.4; extra == 'zzz-test-pydantic'
145
145
  Provides-Extra: zzz-test-pyinstrument
146
146
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pyinstrument'
147
- Requires-Dist: pyinstrument<5.1,>=5.0.0; extra == 'zzz-test-pyinstrument'
147
+ Requires-Dist: pyinstrument<5.1,>=5.0.2; extra == 'zzz-test-pyinstrument'
148
148
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-pyinstrument'
149
149
  Provides-Extra: zzz-test-pyrsistent
150
150
  Requires-Dist: pyrsistent<0.21,>=0.20.0; extra == 'zzz-test-pyrsistent'
@@ -25,7 +25,7 @@ dev = [
25
25
  "fpdf2 >= 2.8.3, < 2.9",
26
26
  "greenlet >= 3.2.0, < 3.3", # for sqlalchemy async
27
27
  "httpx >= 0.28.1, < 0.29", # for fastapi
28
- "hypothesis >= 6.131.24, < 6.132",
28
+ "hypothesis >= 6.131.27, < 6.132",
29
29
  "img2pdf >= 0.6.0, < 0.7",
30
30
  "lightweight-charts >= 2.1, < 2.2",
31
31
  "loguru >= 0.7.3, < 0.8",
@@ -43,7 +43,7 @@ dev = [
43
43
  "pqdm >= 0.2.0, < 0.3",
44
44
  "psycopg2-binary >= 2.9.10, < 2.10", # for sqlalchemy
45
45
  "pydantic >= 2.11.4, < 2.12",
46
- "pyinstrument >= 5.0.0, < 5.1",
46
+ "pyinstrument >= 5.0.2, < 5.1",
47
47
  "pyrsistent >= 0.20.0, < 0.21",
48
48
  "pytest >= 8.3.5, < 8.4",
49
49
  "pytest-regressions >= 2.7.0, < 2.8",
@@ -91,11 +91,11 @@ dependencies = [
91
91
  name = "dycw-utilities"
92
92
  readme = "README.md"
93
93
  requires-python = ">= 3.12"
94
- version = "0.125.0"
94
+ version = "0.125.2"
95
95
 
96
96
  [project.optional-dependencies]
97
97
  test = [
98
- "hypothesis >= 6.131.24, < 6.132",
98
+ "hypothesis >= 6.131.27, < 6.132",
99
99
  "pytest >= 8.3.5, < 8.4",
100
100
  "pytest-asyncio >= 0.26.0, < 0.27",
101
101
  "pytest-cov >= 6.1.1, < 6.2",
@@ -172,7 +172,7 @@ zzz-test-hypothesis = [
172
172
  "aiosqlite >= 0.21.0, < 0.22",
173
173
  "asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async
174
174
  "greenlet >= 3.2.0, < 3.3", # for sqlalchemy async
175
- "hypothesis >= 6.131.24, < 6.132",
175
+ "hypothesis >= 6.131.27, < 6.132",
176
176
  "luigi >= 3.6.0, < 3.7",
177
177
  "numpy >= 2.2.6, < 2.3",
178
178
  "pathvalidate >= 3.2.3, < 3.3",
@@ -238,7 +238,7 @@ zzz-test-pydantic = [
238
238
  ]
239
239
  zzz-test-pyinstrument = [
240
240
  "atomicwrites >= 1.4.1, < 1.5",
241
- "pyinstrument >= 5.0.0, < 5.1",
241
+ "pyinstrument >= 5.0.2, < 5.1",
242
242
  "tzlocal >= 5.3.1, < 5.4",
243
243
  ]
244
244
  zzz-test-pyrsistent = ["pyrsistent >= 0.20.0, < 0.21"]
@@ -332,7 +332,7 @@ zzz-test-zoneinfo = [
332
332
  # bump-my-version
333
333
  [tool.bumpversion]
334
334
  allow_dirty = true
335
- current_version = "0.125.0"
335
+ current_version = "0.125.2"
336
336
 
337
337
  [[tool.bumpversion.files]]
338
338
  filename = "src/utilities/__init__.py"
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from asyncio import CancelledError, Event, Queue, run, sleep
3
+ from asyncio import CancelledError, Event, Queue, run, sleep, timeout
4
4
  from collections import deque
5
5
  from contextlib import asynccontextmanager
6
6
  from dataclasses import dataclass, field
@@ -288,7 +288,7 @@ class TestInfiniteLooper:
288
288
  async def _core(self) -> None:
289
289
  self.counter += 1
290
290
 
291
- async with timeout_dur(duration=1.0), Example(sleep_core=0.05) as looper:
291
+ async with timeout(1.0), Example(sleep_core=0.05) as looper:
292
292
  pass
293
293
  assert 15 <= looper.counter <= 25
294
294
 
@@ -316,10 +316,7 @@ class TestInfiniteLooper:
316
316
  async def _teardown(self) -> None:
317
317
  self.teardowns += 1
318
318
 
319
- async with (
320
- timeout_dur(duration=1.0),
321
- Example(sleep_core=0.05, sleep_restart=0.05) as looper,
322
- ):
319
+ async with timeout(1.0), Example(sleep_core=0.05, sleep_restart=0.05) as looper:
323
320
  pass
324
321
  assert 3 <= looper.initializations <= 5
325
322
  assert 0 <= looper.counter <= 5
@@ -380,9 +377,9 @@ class TestInfiniteLooper:
380
377
  looper = Example()
381
378
  for _ in range(2):
382
379
  assert not looper.running
383
- async with timeout_dur(duration=0.2), looper:
380
+ async with timeout(0.2), looper:
384
381
  assert looper.running
385
- async with timeout_dur(duration=0.1), looper:
382
+ async with timeout(0.1), looper:
386
383
  assert looper.running
387
384
  assert looper.running
388
385
  assert not looper.running
@@ -433,7 +430,7 @@ class TestInfiniteLooper:
433
430
  yield (True, TrueError)
434
431
  yield (False, FalseError)
435
432
 
436
- async with timeout_dur(duration=1.0), Example(sleep_core=0.05) as looper:
433
+ async with timeout(1.0), Example(sleep_core=0.05) as looper:
437
434
  ...
438
435
  match n % 2 == 0:
439
436
  case True:
@@ -473,10 +470,7 @@ class TestInfiniteLooper:
473
470
  def _yield_coroutines(self) -> Iterator[Callable[[], Coroutine1[None]]]:
474
471
  yield partial(inc_external, self)
475
472
 
476
- async with (
477
- timeout_dur(duration=1.0),
478
- Example(sleep_core=0.05, sleep_restart=0.05) as looper,
479
- ):
473
+ async with timeout(1.0), Example(sleep_core=0.05, sleep_restart=0.05) as looper:
480
474
  ...
481
475
  assert 3 <= looper.initializations <= 7
482
476
  assert 0 <= looper.counter <= 8
@@ -508,10 +502,7 @@ class TestInfiniteLooper:
508
502
  def _yield_coroutines(self) -> Iterator[Callable[[], Coroutine1[None]]]:
509
503
  yield dummy
510
504
 
511
- async with (
512
- timeout_dur(duration=1.0),
513
- Example(sleep_core=0.05, sleep_restart=0.05) as looper,
514
- ):
505
+ async with timeout(1.0), Example(sleep_core=0.05, sleep_restart=0.05) as looper:
515
506
  ...
516
507
  assert 3 <= looper.initializations <= 5
517
508
  assert 0 <= looper.counter <= 5
@@ -551,7 +542,7 @@ class TestInfiniteLooper:
551
542
  def _yield_loopers(self) -> Iterator[InfiniteLooper]:
552
543
  yield self.child
553
544
 
554
- async with timeout_dur(duration=1.0), Parent(sleep_core=0.05) as parent:
545
+ async with timeout(1.0), Parent(sleep_core=0.05) as parent:
555
546
  ...
556
547
  assert 15 <= parent.counter <= 25
557
548
  assert 15 <= parent.child.counter <= 25
@@ -591,7 +582,7 @@ class TestInfiniteLooper:
591
582
  raise NotImplementedError
592
583
 
593
584
  async with (
594
- timeout_dur(duration=1.0),
585
+ timeout(1.0),
595
586
  Example(sleep_core=0.1, sleep_restart=sleep_restart, logger=logger),
596
587
  ):
597
588
  ...
@@ -620,7 +611,7 @@ class TestInfiniteLooper:
620
611
  raise CustomError
621
612
 
622
613
  async with (
623
- timeout_dur(duration=1.0),
614
+ timeout(1.0),
624
615
  Example(sleep_core=0.1, sleep_restart=sleep_restart, logger=logger),
625
616
  ):
626
617
  ...
@@ -665,7 +656,7 @@ class TestInfiniteLooper:
665
656
  yield (None, Custom1Error)
666
657
 
667
658
  async with (
668
- timeout_dur(duration=1.0),
659
+ timeout(1.0),
669
660
  Example(sleep_core=0.1, sleep_restart=sleep_restart, logger=logger),
670
661
  ):
671
662
  ...
@@ -711,7 +702,7 @@ class TestInfiniteLooper:
711
702
  yield dummy
712
703
 
713
704
  async with (
714
- timeout_dur(duration=1.0),
705
+ timeout(1.0),
715
706
  Example(sleep_core=0.05, sleep_restart=sleep_restart, logger=logger),
716
707
  ):
717
708
  ...
@@ -756,7 +747,7 @@ class TestInfiniteQueueLooper:
756
747
  async def _process_queue(self) -> None:
757
748
  self.counter += len(self._queue.get_all_nowait())
758
749
 
759
- async with timeout_dur(duration=1.0), Example(sleep_core=0.05) as looper:
750
+ async with timeout(1.0), Example(sleep_core=0.05) as looper:
760
751
  await sleep(0.1)
761
752
  for i in range(10):
762
753
  looper.put_right_nowait(i)
@@ -780,7 +771,7 @@ class TestInfiniteQueueLooper:
780
771
  assert len(looper) == n
781
772
  assert not looper.empty()
782
773
 
783
- async def test_run_until_empty(self) -> None:
774
+ async def test_run_until_empty_no_stop(self) -> None:
784
775
  @dataclass(kw_only=True)
785
776
  class Example(InfiniteQueueLooper[None, int]):
786
777
  output: set[int] = field(default_factory=set)
@@ -791,8 +782,22 @@ class TestInfiniteQueueLooper:
791
782
 
792
783
  looper = Example(sleep_core=0.05)
793
784
  looper.put_right_nowait(*range(10))
794
- async with looper:
785
+ async with timeout(1.0), looper:
795
786
  await looper.run_until_empty()
787
+
788
+ async def test_run_until_empty_stop(self) -> None:
789
+ @dataclass(kw_only=True)
790
+ class Example(InfiniteQueueLooper[None, int]):
791
+ output: set[int] = field(default_factory=set)
792
+
793
+ @override
794
+ async def _process_queue(self) -> None:
795
+ self.output.update(self._queue.get_all_nowait())
796
+
797
+ looper = Example(sleep_core=0.05)
798
+ looper.put_right_nowait(*range(10))
799
+ async with looper:
800
+ await looper.run_until_empty(stop=True)
796
801
  assert looper.empty()
797
802
 
798
803
  @given(logger=just("logger") | none())
@@ -810,10 +815,7 @@ class TestInfiniteQueueLooper:
810
815
  async def _process_queue(self) -> None:
811
816
  raise CustomError
812
817
 
813
- async with (
814
- timeout_dur(duration=1.0),
815
- Example(sleep_core=0.05, logger=logger) as looper,
816
- ):
818
+ async with timeout(1.0), Example(sleep_core=0.05, logger=logger) as looper:
817
819
  looper.put_left_nowait(1)
818
820
  if logger is not None:
819
821
  message = caplog.messages[0]
@@ -1,10 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
- from asyncio import sleep
3
+ from asyncio import sleep, timeout
4
4
  from re import search
5
5
 
6
6
  from tests.conftest import SKIPIF_CI
7
- from utilities.asyncio import timeout_dur
8
7
  from utilities.fastapi import PingReceiver
9
8
 
10
9
 
@@ -14,7 +13,7 @@ class TestPingReceiver:
14
13
  port = 5465
15
14
  assert await PingReceiver.ping(port) is False
16
15
  await sleep(0.1)
17
- async with timeout_dur(duration=1.0), PingReceiver(port=port):
16
+ async with timeout(1.0), PingReceiver(port=port):
18
17
  await sleep(0.1)
19
18
  result = await PingReceiver.ping(port)
20
19
  assert isinstance(result, str)
@@ -9,12 +9,14 @@ from utilities.importlib import is_valid_import
9
9
  class TestIsValidImport:
10
10
  @given(
11
11
  case=sampled_from([
12
+ ("importlib", None, True),
13
+ ("invalid", None, False),
12
14
  ("utilities.importlib", "is_valid_import", True),
13
15
  ("utilities.importlib", "invalid", False),
14
16
  ("invalid", "invalid", False),
15
17
  ])
16
18
  )
17
- def test_main(self, *, case: tuple[str, str, bool]) -> None:
19
+ def test_main(self, *, case: tuple[str, str | None, bool]) -> None:
18
20
  module, name, expected = case
19
- result = is_valid_import(module, name)
21
+ result = is_valid_import(module, name=name)
20
22
  assert result is expected
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from asyncio import timeout
3
4
  from logging import getLogger
4
5
  from typing import TYPE_CHECKING
5
6
 
@@ -7,7 +8,6 @@ from aiohttp import InvalidUrlClientError
7
8
  from pytest import mark, raises
8
9
  from slack_sdk.webhook.async_client import AsyncWebhookClient
9
10
 
10
- from utilities.asyncio import timeout_dur
11
11
  from utilities.datetime import MINUTE
12
12
  from utilities.os import get_env_var
13
13
  from utilities.pytest import throttle
@@ -49,7 +49,7 @@ class TestSlackHandler:
49
49
  logger.addHandler(
50
50
  handler := SlackHandler("url", sleep_core=0.05, sender=sender)
51
51
  )
52
- async with timeout_dur(duration=1.0), handler:
52
+ async with timeout(1.0), handler:
53
53
  logger.warning("message")
54
54
  assert messages == ["message"]
55
55
 
@@ -59,7 +59,7 @@ class TestSlackHandler:
59
59
  url = get_env_var("SLACK")
60
60
  logger = getLogger(str(tmp_path))
61
61
  logger.addHandler(handler := SlackHandler(url, sleep_core=0.05))
62
- async with timeout_dur(duration=1.0), handler:
62
+ async with timeout(1.0), handler:
63
63
  for i in range(10):
64
64
  logger.warning(
65
65
  "message %d from %s", i, TestSlackHandler.test_real.__qualname__
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.125.0"
3
+ __version__ = "0.125.2"
@@ -624,11 +624,12 @@ class InfiniteQueueLooper(InfiniteLooper[THashable], Generic[THashable, _T]):
624
624
  """Put items into the queue at the end without blocking."""
625
625
  self._queue.put_right_nowait(*items) # pragma: no cover
626
626
 
627
- async def run_until_empty(self) -> None:
627
+ async def run_until_empty(self, *, stop: bool = False) -> None:
628
628
  """Run until the queue is empty."""
629
629
  while not self.empty():
630
630
  await self._process_queue()
631
- await self.stop()
631
+ if stop:
632
+ await self.stop()
632
633
 
633
634
 
634
635
  ##
@@ -4,11 +4,13 @@ from importlib import import_module
4
4
  from importlib.util import find_spec
5
5
 
6
6
 
7
- def is_valid_import(module: str, name: str) -> bool:
7
+ def is_valid_import(module: str, /, *, name: str | None = None) -> bool:
8
8
  """Check if an import is valid."""
9
9
  spec = find_spec(module)
10
10
  if spec is None:
11
11
  return False
12
+ if name is None:
13
+ return True
12
14
  mod = import_module(module)
13
15
  return hasattr(mod, name)
14
16