dycw-utilities 0.131.10__tar.gz → 0.131.11__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.131.10 → dycw_utilities-0.131.11}/PKG-INFO +1 -1
  2. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/pyproject.toml +2 -2
  3. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_datetime.py +6 -4
  4. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_math.py +2 -2
  5. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_whenever2.py +77 -2
  6. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/__init__.py +1 -1
  7. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/click.py +6 -6
  8. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/datetime.py +12 -12
  9. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/hypothesis.py +8 -11
  10. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/logging.py +1 -18
  11. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/math.py +10 -9
  12. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/re.py +12 -13
  13. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/traceback.py +5 -5
  14. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/types.py +49 -10
  15. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/whenever.py +6 -6
  16. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/whenever2.py +56 -2
  17. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/.gitignore +0 -0
  18. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/LICENSE +0 -0
  19. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/README.md +0 -0
  20. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/__init__.py +0 -0
  21. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/conftest.py +0 -0
  22. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/__init__.py +0 -0
  23. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_missing/__init__.py +0 -0
  24. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_missing/module.py +0 -0
  25. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/__init__.py +0 -0
  26. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/outer_1.py +0 -0
  27. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/outer_2.py +0 -0
  28. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  29. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  30. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  31. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  32. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_without/__init__.py +0 -0
  33. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_without/module_1.py +0 -0
  34. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/package_without/module_2.py +0 -0
  35. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/standalone.py +0 -0
  36. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/modules/with_imports.py +0 -0
  37. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  38. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  39. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  40. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  41. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  42. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  43. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  44. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  45. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_aiolimiter.py +0 -0
  46. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_altair.py +0 -0
  47. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio.py +0 -0
  48. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio_classes/__init__.py +0 -0
  49. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio_classes/loopers.py +0 -0
  50. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_asyncio_classes/redis.py +0 -0
  51. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_atomicwrites.py +0 -0
  52. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_atools.py +0 -0
  53. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_cachetools.py +0 -0
  54. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_click.py +0 -0
  55. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_concurrent.py +0 -0
  56. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_contextlib.py +0 -0
  57. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_contextvars.py +0 -0
  58. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_cryptography.py +0 -0
  59. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_cvxpy.py +0 -0
  60. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_dataclasses.py +0 -0
  61. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_enum.py +0 -0
  62. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_errors.py +0 -0
  63. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_eventkit.py +0 -0
  64. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_fastapi.py +0 -0
  65. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_fpdf2.py +0 -0
  66. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_functions.py +0 -0
  67. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_functools.py +0 -0
  68. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_getpass.py +0 -0
  69. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_git.py +0 -0
  70. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_hashlib.py +0 -0
  71. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_http.py +0 -0
  72. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_hypothesis.py +0 -0
  73. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_importlib.py +0 -0
  74. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_inflect.py +0 -0
  75. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_ipython.py +0 -0
  76. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_iterables.py +0 -0
  77. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_jupyter.py +0 -0
  78. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_libcst.py +0 -0
  79. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_lightweight_charts.py +0 -0
  80. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_logging.py +0 -0
  81. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_luigi.py +0 -0
  82. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_memory_profiler.py +0 -0
  83. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_modules.py +0 -0
  84. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_more_itertools.py +0 -0
  85. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_numpy.py +0 -0
  86. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_operator.py +0 -0
  87. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_optuna.py +0 -0
  88. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_orjson.py +0 -0
  89. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_os.py +0 -0
  90. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_parse.py +0 -0
  91. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pathlib.py +0 -0
  92. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_period.py +0 -0
  93. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pickle.py +0 -0
  94. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_platform.py +0 -0
  95. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_polars.py +0 -0
  96. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_polars_ols.py +0 -0
  97. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pottery.py +0 -0
  98. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pqdm.py +0 -0
  99. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_psutil.py +0 -0
  100. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pydantic.py +0 -0
  101. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pyinstrument.py +0 -0
  102. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pyrsistent.py +0 -0
  103. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pytest.py +0 -0
  104. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_pytest_regressions.py +0 -0
  105. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_python_dotenv.py +0 -0
  106. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_random.py +0 -0
  107. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_re.py +0 -0
  108. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_redis.py +0 -0
  109. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_reprlib.py +0 -0
  110. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_scipy.py +0 -0
  111. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_sentinel.py +0 -0
  112. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_shelve.py +0 -0
  113. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_slack_sdk.py +0 -0
  114. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_socket.py +0 -0
  115. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_sqlalchemy.py +0 -0
  116. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_sqlalchemy_polars.py +0 -0
  117. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_statsmodel.py +0 -0
  118. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_streamlit.py +0 -0
  119. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_string.py +0 -0
  120. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tempfile.py +0 -0
  121. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tenacity.py +0 -0
  122. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_text.py +0 -0
  123. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_threading.py +0 -0
  124. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_timer.py +0 -0
  125. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_traceback.py +0 -0
  126. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_types.py +0 -0
  127. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing.py +0 -0
  128. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing_funcs/__init__.py +0 -0
  129. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing_funcs/no_future.py +0 -0
  130. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_typing_funcs/with_future.py +0 -0
  131. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tzdata.py +0 -0
  132. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_tzlocal.py +0 -0
  133. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_uuid.py +0 -0
  134. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_version.py +0 -0
  135. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_warnings.py +0 -0
  136. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_whenever.py +0 -0
  137. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_zipfile.py +0 -0
  138. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/tests/test_zoneinfo.py +0 -0
  139. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/aiolimiter.py +0 -0
  140. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/altair.py +0 -0
  141. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/asyncio.py +0 -0
  142. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/atomicwrites.py +0 -0
  143. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/atools.py +0 -0
  144. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/cachetools.py +0 -0
  145. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/concurrent.py +0 -0
  146. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/contextlib.py +0 -0
  147. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/contextvars.py +0 -0
  148. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/cryptography.py +0 -0
  149. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/cvxpy.py +0 -0
  150. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/dataclasses.py +0 -0
  151. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/enum.py +0 -0
  152. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/errors.py +0 -0
  153. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/eventkit.py +0 -0
  154. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/fastapi.py +0 -0
  155. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/fpdf2.py +0 -0
  156. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/functions.py +0 -0
  157. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/functools.py +0 -0
  158. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/getpass.py +0 -0
  159. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/git.py +0 -0
  160. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/hashlib.py +0 -0
  161. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/http.py +0 -0
  162. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/importlib.py +0 -0
  163. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/inflect.py +0 -0
  164. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/ipython.py +0 -0
  165. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/iterables.py +0 -0
  166. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/jupyter.py +0 -0
  167. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/libcst.py +0 -0
  168. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/lightweight_charts.py +0 -0
  169. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/luigi.py +0 -0
  170. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/memory_profiler.py +0 -0
  171. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/modules.py +0 -0
  172. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/more_itertools.py +0 -0
  173. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/numpy.py +0 -0
  174. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/operator.py +0 -0
  175. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/optuna.py +0 -0
  176. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/orjson.py +0 -0
  177. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/os.py +0 -0
  178. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/parse.py +0 -0
  179. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pathlib.py +0 -0
  180. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/period.py +0 -0
  181. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pickle.py +0 -0
  182. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/platform.py +0 -0
  183. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/polars.py +0 -0
  184. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/polars_ols.py +0 -0
  185. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pottery.py +0 -0
  186. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pqdm.py +0 -0
  187. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/psutil.py +0 -0
  188. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/py.typed +0 -0
  189. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pydantic.py +0 -0
  190. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pyinstrument.py +0 -0
  191. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pyrsistent.py +0 -0
  192. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pytest.py +0 -0
  193. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/pytest_regressions.py +0 -0
  194. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/python_dotenv.py +0 -0
  195. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/random.py +0 -0
  196. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/redis.py +0 -0
  197. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/reprlib.py +0 -0
  198. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/scipy.py +0 -0
  199. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/sentinel.py +0 -0
  200. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/shelve.py +0 -0
  201. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/slack_sdk.py +0 -0
  202. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/socket.py +0 -0
  203. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/sqlalchemy.py +0 -0
  204. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/sqlalchemy_polars.py +0 -0
  205. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/statsmodels.py +0 -0
  206. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/streamlit.py +0 -0
  207. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/string.py +0 -0
  208. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tempfile.py +0 -0
  209. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tenacity.py +0 -0
  210. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/text.py +0 -0
  211. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/threading.py +0 -0
  212. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/timer.py +0 -0
  213. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/typing.py +0 -0
  214. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tzdata.py +0 -0
  215. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/tzlocal.py +0 -0
  216. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/uuid.py +0 -0
  217. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/version.py +0 -0
  218. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/warnings.py +0 -0
  219. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/zipfile.py +0 -0
  220. {dycw_utilities-0.131.10 → dycw_utilities-0.131.11}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.131.10
3
+ Version: 0.131.11
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -94,7 +94,7 @@ dependencies = [
94
94
  name = "dycw-utilities"
95
95
  readme = "README.md"
96
96
  requires-python = ">= 3.12"
97
- version = "0.131.10"
97
+ version = "0.131.11"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  logging = [
@@ -121,7 +121,7 @@ test = [
121
121
  # bump-my-version
122
122
  [tool.bumpversion]
123
123
  allow_dirty = true
124
- current_version = "0.131.10"
124
+ current_version = "0.131.11"
125
125
 
126
126
  [[tool.bumpversion.files]]
127
127
  filename = "src/utilities/__init__.py"
@@ -157,8 +157,8 @@ if TYPE_CHECKING:
157
157
  from utilities.types import (
158
158
  DateOrDateTime,
159
159
  Duration,
160
- MaybeCallableDate,
161
- MaybeCallableDateTime,
160
+ MaybeCallablePyDate,
161
+ MaybeCallablePyDateTime,
162
162
  Number,
163
163
  )
164
164
 
@@ -689,7 +689,9 @@ class TestGetDate:
689
689
  class Example:
690
690
  date: dt.date = field(default_factory=get_today)
691
691
 
692
- def replace(self, *, date: MaybeCallableDate | Sentinel = sentinel) -> Self:
692
+ def replace(
693
+ self, *, date: MaybeCallablePyDate | Sentinel = sentinel
694
+ ) -> Self:
693
695
  return replace_non_sentinel(self, date=get_date(date=date))
694
696
 
695
697
  obj = Example(date=date1)
@@ -721,7 +723,7 @@ class TestGetDateTime:
721
723
  datetime: dt.datetime = field(default_factory=get_now)
722
724
 
723
725
  def replace(
724
- self, *, datetime: MaybeCallableDateTime | Sentinel = sentinel
726
+ self, *, datetime: MaybeCallablePyDateTime | Sentinel = sentinel
725
727
  ) -> Self:
726
728
  return replace_non_sentinel(
727
729
  self, datetime=get_datetime(datetime=datetime)
@@ -102,7 +102,7 @@ from utilities.math import (
102
102
  )
103
103
 
104
104
  if TYPE_CHECKING:
105
- from utilities.types import Number, RoundMode
105
+ from utilities.types import MathRoundMode, Number
106
106
 
107
107
 
108
108
  class TestCheckInteger:
@@ -1068,7 +1068,7 @@ class TestRound:
1068
1068
  ])
1069
1069
  )
1070
1070
  @settings(max_examples=1000)
1071
- def test_main(self, *, case: tuple[RoundMode, float, int]) -> None:
1071
+ def test_main(self, *, case: tuple[MathRoundMode, float, int]) -> None:
1072
1072
  mode, x, expected = case
1073
1073
  result = round_(x, mode=mode)
1074
1074
  assert isinstance(result, int)
@@ -1,15 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from dataclasses import dataclass, field
3
4
  from logging import DEBUG
5
+ from typing import TYPE_CHECKING, Self
4
6
  from zoneinfo import ZoneInfo
5
7
 
6
8
  from hypothesis import given
7
- from hypothesis.strategies import just, timezones
9
+ from hypothesis.strategies import just, none, timezones
8
10
  from pytest import mark, param, raises
9
11
  from whenever import Date, DateDelta, DateTimeDelta, TimeDelta, ZonedDateTime
10
12
 
11
13
  from tests.conftest import IS_CI
12
- from utilities.hypothesis import zoned_datetimes_whenever
14
+ from utilities.dataclasses import replace_non_sentinel
15
+ from utilities.hypothesis import dates_whenever, sentinels, zoned_datetimes_whenever
16
+ from utilities.sentinel import Sentinel, sentinel
13
17
  from utilities.tzdata import HongKong, Tokyo
14
18
  from utilities.tzlocal import LOCAL_TIME_ZONE
15
19
  from utilities.whenever2 import (
@@ -27,6 +31,7 @@ from utilities.whenever2 import (
27
31
  NOW_UTC,
28
32
  PLAIN_DATE_TIME_MAX,
29
33
  PLAIN_DATE_TIME_MIN,
34
+ SECOND,
30
35
  TIME_DELTA_MAX,
31
36
  TIME_DELTA_MIN,
32
37
  TODAY_LOCAL,
@@ -41,9 +46,15 @@ from utilities.whenever2 import (
41
46
  get_now_local,
42
47
  get_today,
43
48
  get_today_local,
49
+ to_date,
50
+ to_zoned_date_time,
44
51
  )
45
52
  from utilities.zoneinfo import UTC
46
53
 
54
+ if TYPE_CHECKING:
55
+ from utilities.sentinel import Sentinel
56
+ from utilities.types import MaybeCallableDate, MaybeCallableZonedDateTime
57
+
47
58
 
48
59
  class TestFromTimeStamp:
49
60
  @given(datetime=zoned_datetimes_whenever(time_zone=UTC if IS_CI else timezones()))
@@ -246,6 +257,70 @@ class TestMinMax:
246
257
  _ = ZONED_DATE_TIME_MAX.add(microseconds=1)
247
258
 
248
259
 
260
+ class TestToDate:
261
+ @given(date=dates_whenever())
262
+ def test_date(self, *, date: Date) -> None:
263
+ assert to_date(date=date) == date
264
+
265
+ @given(date=none() | sentinels())
266
+ def test_none_or_sentinel(self, *, date: None | Sentinel) -> None:
267
+ assert to_date(date=date) is date
268
+
269
+ @given(date1=dates_whenever(), date2=dates_whenever())
270
+ def test_replace_non_sentinel(self, *, date1: Date, date2: Date) -> None:
271
+ @dataclass(kw_only=True, slots=True)
272
+ class Example:
273
+ date: Date = field(default_factory=get_today)
274
+
275
+ def replace(self, *, date: MaybeCallableDate | Sentinel = sentinel) -> Self:
276
+ return replace_non_sentinel(self, date=to_date(date=date))
277
+
278
+ obj = Example(date=date1)
279
+ assert obj.date == date1
280
+ assert obj.replace().date == date1
281
+ assert obj.replace(date=date2).date == date2
282
+ assert obj.replace(date=get_today).date == get_today()
283
+
284
+ @given(date=dates_whenever())
285
+ def test_callable(self, *, date: Date) -> None:
286
+ assert to_date(date=lambda: date) == date
287
+
288
+
289
+ class TestGetDateTime:
290
+ @given(date_time=zoned_datetimes_whenever())
291
+ def test_date_time(self, *, date_time: ZonedDateTime) -> None:
292
+ assert to_zoned_date_time(date_time=date_time) == date_time
293
+
294
+ @given(date_time=none() | sentinels())
295
+ def test_none_or_sentinel(self, *, date_time: None | Sentinel) -> None:
296
+ assert to_zoned_date_time(date_time=date_time) is date_time
297
+
298
+ @given(date_time1=zoned_datetimes_whenever(), date_time2=zoned_datetimes_whenever())
299
+ def test_replace_non_sentinel(
300
+ self, *, date_time1: ZonedDateTime, date_time2: ZonedDateTime
301
+ ) -> None:
302
+ @dataclass(kw_only=True, slots=True)
303
+ class Example:
304
+ date_time: ZonedDateTime = field(default_factory=get_now)
305
+
306
+ def replace(
307
+ self, *, date_time: MaybeCallableZonedDateTime | Sentinel = sentinel
308
+ ) -> Self:
309
+ return replace_non_sentinel(
310
+ self, date_time=to_zoned_date_time(date_time=date_time)
311
+ )
312
+
313
+ obj = Example(date_time=date_time1)
314
+ assert obj.date_time == date_time1
315
+ assert obj.replace().date_time == date_time1
316
+ assert obj.replace(date_time=date_time2).date_time == date_time2
317
+ assert abs(obj.replace(date_time=get_now).date_time - get_now()) <= SECOND
318
+
319
+ @given(date_time=zoned_datetimes_whenever())
320
+ def test_callable(self, *, date_time: ZonedDateTime) -> None:
321
+ assert to_zoned_date_time(date_time=lambda: date_time) == date_time
322
+
323
+
249
324
  class TestWheneverLogRecord:
250
325
  def test_init(self) -> None:
251
326
  _ = WheneverLogRecord("name", DEBUG, "pathname", 0, None, None, None)
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.131.10"
3
+ __version__ = "0.131.11"
@@ -23,13 +23,13 @@ from utilities.functions import EnsureStrError, ensure_str, get_class_name
23
23
  from utilities.iterables import is_iterable_not_str
24
24
  from utilities.text import split_str
25
25
  from utilities.types import (
26
- DateLike,
27
26
  DateTimeLike,
28
27
  EnumLike,
29
28
  MaybeStr,
29
+ PyDateLike,
30
+ PyTimeDeltaLike,
31
+ PyTimeLike,
30
32
  TEnum,
31
- TimeDeltaLike,
32
- TimeLike,
33
33
  )
34
34
 
35
35
  if TYPE_CHECKING:
@@ -76,7 +76,7 @@ class Date(ParamType):
76
76
 
77
77
  @override
78
78
  def convert(
79
- self, value: DateLike, param: Parameter | None, ctx: Context | None
79
+ self, value: PyDateLike, param: Parameter | None, ctx: Context | None
80
80
  ) -> dt.date:
81
81
  """Convert a value into the `Date` type."""
82
82
  from utilities.whenever import EnsureDateError, ensure_date
@@ -197,7 +197,7 @@ class Time(ParamType):
197
197
 
198
198
  @override
199
199
  def convert(
200
- self, value: TimeLike, param: Parameter | None, ctx: Context | None
200
+ self, value: PyTimeLike, param: Parameter | None, ctx: Context | None
201
201
  ) -> dt.time:
202
202
  """Convert a value into the `Time` type."""
203
203
  from utilities.whenever import EnsureTimeError, ensure_time
@@ -219,7 +219,7 @@ class Timedelta(ParamType):
219
219
 
220
220
  @override
221
221
  def convert(
222
- self, value: TimeDeltaLike, param: Parameter | None, ctx: Context | None
222
+ self, value: PyTimeDeltaLike, param: Parameter | None, ctx: Context | None
223
223
  ) -> dt.timedelta:
224
224
  """Convert a value into the `Timedelta` type."""
225
225
  from utilities.whenever import EnsureTimedeltaError, ensure_timedelta
@@ -31,9 +31,9 @@ if TYPE_CHECKING:
31
31
  from utilities.types import (
32
32
  DateOrDateTime,
33
33
  Duration,
34
- MaybeCallableDate,
35
- MaybeCallableDateTime,
36
- RoundMode,
34
+ MathRoundMode,
35
+ MaybeCallablePyDate,
36
+ MaybeCallablePyDateTime,
37
37
  TimeZoneLike,
38
38
  )
39
39
 
@@ -476,19 +476,19 @@ def format_datetime_local_and_utc(datetime: dt.datetime, /) -> str:
476
476
 
477
477
 
478
478
  @overload
479
- def get_date(*, date: MaybeCallableDate) -> dt.date: ...
479
+ def get_date(*, date: MaybeCallablePyDate) -> dt.date: ...
480
480
  @overload
481
481
  def get_date(*, date: None) -> None: ...
482
482
  @overload
483
483
  def get_date(*, date: Sentinel) -> Sentinel: ...
484
484
  @overload
485
- def get_date(*, date: MaybeCallableDate | Sentinel) -> dt.date | Sentinel: ...
485
+ def get_date(*, date: MaybeCallablePyDate | Sentinel) -> dt.date | Sentinel: ...
486
486
  @overload
487
487
  def get_date(
488
- *, date: MaybeCallableDate | None | Sentinel = sentinel
488
+ *, date: MaybeCallablePyDate | None | Sentinel = sentinel
489
489
  ) -> dt.date | None | Sentinel: ...
490
490
  def get_date(
491
- *, date: MaybeCallableDate | None | Sentinel = sentinel
491
+ *, date: MaybeCallablePyDate | None | Sentinel = sentinel
492
492
  ) -> dt.date | None | Sentinel:
493
493
  """Get the date."""
494
494
  match date:
@@ -504,13 +504,13 @@ def get_date(
504
504
 
505
505
 
506
506
  @overload
507
- def get_datetime(*, datetime: MaybeCallableDateTime) -> dt.datetime: ...
507
+ def get_datetime(*, datetime: MaybeCallablePyDateTime) -> dt.datetime: ...
508
508
  @overload
509
509
  def get_datetime(*, datetime: None) -> None: ...
510
510
  @overload
511
511
  def get_datetime(*, datetime: Sentinel) -> Sentinel: ...
512
512
  def get_datetime(
513
- *, datetime: MaybeCallableDateTime | None | Sentinel = sentinel
513
+ *, datetime: MaybeCallablePyDateTime | None | Sentinel = sentinel
514
514
  ) -> dt.datetime | None | Sentinel:
515
515
  """Get the datetime."""
516
516
  match datetime:
@@ -755,7 +755,7 @@ def mean_datetime(
755
755
  /,
756
756
  *,
757
757
  weights: Iterable[SupportsFloat] | None = None,
758
- mode: RoundMode = "standard",
758
+ mode: MathRoundMode = "standard",
759
759
  rel_tol: float | None = None,
760
760
  abs_tol: float | None = None,
761
761
  ) -> dt.datetime:
@@ -790,7 +790,7 @@ def mean_timedelta(
790
790
  /,
791
791
  *,
792
792
  weights: Iterable[SupportsFloat] | None = None,
793
- mode: RoundMode = "standard",
793
+ mode: MathRoundMode = "standard",
794
794
  rel_tol: float | None = None,
795
795
  abs_tol: float | None = None,
796
796
  ) -> dt.timedelta:
@@ -1022,7 +1022,7 @@ def round_datetime(
1022
1022
  duration: Duration,
1023
1023
  /,
1024
1024
  *,
1025
- mode: RoundMode = "standard",
1025
+ mode: MathRoundMode = "standard",
1026
1026
  rel_tol: float | None = None,
1027
1027
  abs_tol: float | None = None,
1028
1028
  ) -> dt.datetime:
@@ -48,7 +48,7 @@ from hypothesis.strategies import (
48
48
  uuids,
49
49
  )
50
50
  from hypothesis.utils.conventions import not_set
51
- from whenever import Date, DateDelta, PlainDateTime, Time, TimeDelta
51
+ from whenever import Date, DateDelta, PlainDateTime, Time, TimeDelta, ZonedDateTime
52
52
 
53
53
  from utilities.datetime import (
54
54
  DATETIME_MAX_NAIVE,
@@ -112,10 +112,9 @@ if TYPE_CHECKING:
112
112
 
113
113
  from hypothesis.database import ExampleDatabase
114
114
  from numpy.random import RandomState
115
- from whenever import ZonedDateTime
116
115
 
117
116
  from utilities.numpy import NDArrayB, NDArrayF, NDArrayI, NDArrayO
118
- from utilities.types import Duration, Number, RoundMode, TimeZoneLike
117
+ from utilities.types import Duration, MathRoundMode, Number, TimeZoneLike
119
118
 
120
119
 
121
120
  _T = TypeVar("_T")
@@ -725,7 +724,7 @@ def min_and_max_datetimes(
725
724
  min_value: MaybeSearchStrategy[dt.datetime | None] = None,
726
725
  max_value: MaybeSearchStrategy[dt.datetime | None] = None,
727
726
  time_zone: MaybeSearchStrategy[ZoneInfo | timezone] = UTC,
728
- round_: RoundMode | None = None,
727
+ round_: MathRoundMode | None = None,
729
728
  timedelta: dt.timedelta | None = None,
730
729
  rel_tol: float | None = None,
731
730
  abs_tol: float | None = None,
@@ -804,7 +803,7 @@ def min_and_maybe_max_datetimes(
804
803
  min_value: MaybeSearchStrategy[dt.datetime | None] = None,
805
804
  max_value: MaybeSearchStrategy[dt.datetime | None | Sentinel] = sentinel,
806
805
  time_zone: MaybeSearchStrategy[ZoneInfo | timezone] = UTC,
807
- round_: RoundMode | None = None,
806
+ round_: MathRoundMode | None = None,
808
807
  timedelta: dt.timedelta | None = None,
809
808
  rel_tol: float | None = None,
810
809
  abs_tol: float | None = None,
@@ -1036,7 +1035,7 @@ def plain_datetimes(
1036
1035
  *,
1037
1036
  min_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MIN_NAIVE,
1038
1037
  max_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MAX_NAIVE,
1039
- round_: RoundMode | None = None,
1038
+ round_: MathRoundMode | None = None,
1040
1039
  timedelta: dt.timedelta | None = None,
1041
1040
  rel_tol: float | None = None,
1042
1041
  abs_tol: float | None = None,
@@ -1056,7 +1055,7 @@ def plain_datetimes(
1056
1055
 
1057
1056
  @dataclass(kw_only=True, slots=True)
1058
1057
  class PlainDateTimesError(Exception):
1059
- round_: RoundMode
1058
+ round_: MathRoundMode
1060
1059
 
1061
1060
  @override
1062
1061
  def __str__(self) -> str:
@@ -1577,7 +1576,7 @@ def zoned_datetimes(
1577
1576
  min_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MIN_UTC + DAY,
1578
1577
  max_value: MaybeSearchStrategy[dt.datetime] = DATETIME_MAX_UTC - DAY,
1579
1578
  time_zone: MaybeSearchStrategy[ZoneInfo | timezone] = UTC,
1580
- round_: RoundMode | None = None,
1579
+ round_: MathRoundMode | None = None,
1581
1580
  timedelta: dt.timedelta | None = None,
1582
1581
  rel_tol: float | None = None,
1583
1582
  abs_tol: float | None = None,
@@ -1626,7 +1625,7 @@ def zoned_datetimes(
1626
1625
 
1627
1626
  @dataclass(kw_only=True, slots=True)
1628
1627
  class ZonedDateTimesError(Exception):
1629
- round_: RoundMode
1628
+ round_: MathRoundMode
1630
1629
 
1631
1630
  @override
1632
1631
  def __str__(self) -> str:
@@ -1646,8 +1645,6 @@ def zoned_datetimes_whenever(
1646
1645
  time_zone: MaybeSearchStrategy[TimeZoneLike] = UTC,
1647
1646
  ) -> ZonedDateTime:
1648
1647
  """Strategy for generating zoned datetimes."""
1649
- from whenever import PlainDateTime, ZonedDateTime
1650
-
1651
1648
  min_value_, max_value_ = [draw2(draw, v) for v in [min_value, max_value]]
1652
1649
  time_zone_ = ensure_time_zone(draw2(draw, time_zone))
1653
1650
  match min_value_:
@@ -34,12 +34,7 @@ from typing import (
34
34
 
35
35
  from utilities.atomicwrites import move_many
36
36
  from utilities.dataclasses import replace_non_sentinel
37
- from utilities.datetime import (
38
- SECOND,
39
- parse_datetime_compact,
40
- round_datetime,
41
- serialize_compact,
42
- )
37
+ from utilities.datetime import parse_datetime_compact, serialize_compact
43
38
  from utilities.errors import ImpossibleCaseError
44
39
  from utilities.iterables import OneEmptyError, always_iterable, one
45
40
  from utilities.pathlib import ensure_suffix, get_path
@@ -484,12 +479,6 @@ class _RotatingLogFile:
484
479
  start: dt.datetime | None = None
485
480
  end: dt.datetime | None = None
486
481
 
487
- def __post_init__(self) -> None:
488
- if self.start is not None:
489
- self.start = round_datetime(self.start, SECOND)
490
- if self.end is not None:
491
- self.end = round_datetime(self.end, SECOND)
492
-
493
482
  @classmethod
494
483
  def from_path(
495
484
  cls,
@@ -582,12 +571,6 @@ class _Rotation:
582
571
  start: dt.datetime | None | Sentinel = sentinel
583
572
  end: dt.datetime | Sentinel = sentinel
584
573
 
585
- def __post_init__(self) -> None:
586
- if isinstance(self.start, dt.datetime):
587
- self.start = round_datetime(self.start, SECOND)
588
- if isinstance(self.end, dt.datetime):
589
- self.end = round_datetime(self.end, SECOND)
590
-
591
574
  @cached_property
592
575
  def destination(self) -> Path:
593
576
  return self.file.replace(index=self.index, start=self.start, end=self.end).path
@@ -8,9 +8,10 @@ from re import Match, search
8
8
  from typing import TYPE_CHECKING, Literal, assert_never, overload, override
9
9
 
10
10
  from utilities.errors import ImpossibleCaseError
11
+ from utilities.re import ExtractGroupsError, extract_groups
11
12
 
12
13
  if TYPE_CHECKING:
13
- from utilities.types import Number, RoundMode, Sign
14
+ from utilities.types import MathRoundMode, Number, Sign
14
15
 
15
16
 
16
17
  MIN_FLOAT32, MAX_FLOAT32 = -3.4028234663852886e38, 3.4028234663852886e38
@@ -708,7 +709,7 @@ def round_(
708
709
  x: float,
709
710
  /,
710
711
  *,
711
- mode: RoundMode = "standard",
712
+ mode: MathRoundMode = "standard",
712
713
  rel_tol: float | None = None,
713
714
  abs_tol: float | None = None,
714
715
  ) -> int:
@@ -748,7 +749,7 @@ def round_(
748
749
 
749
750
  def _round_tie_standard(
750
751
  x: float,
751
- mode: RoundMode,
752
+ mode: MathRoundMode,
752
753
  /,
753
754
  *,
754
755
  rel_tol: float | None = None,
@@ -757,9 +758,9 @@ def _round_tie_standard(
757
758
  """Round a float to an integer using the standard method."""
758
759
  frac, _ = modf(x)
759
760
  if _is_close(abs(frac), 0.5, rel_tol=rel_tol, abs_tol=abs_tol):
760
- mode_use: RoundMode = mode
761
+ mode_use: MathRoundMode = mode
761
762
  else:
762
- mode_use: RoundMode = "standard"
763
+ mode_use: MathRoundMode = "standard"
763
764
  return round_(x, mode=mode_use)
764
765
 
765
766
 
@@ -775,9 +776,9 @@ def round_float_imprecisions(
775
776
  ) -> float:
776
777
  """Round a float, removing binary representation imprecisions."""
777
778
  try:
778
- ((head, tail),) = _ROUND_FLOAT_IMPRECISIONS_PATTERN.findall(str(x))
779
- except ValueError:
780
- ((head, tail),) = _ROUND_FLOAT_IMPRECISIONS_PATTERN.findall(f"{x:.20f}")
779
+ head, tail = extract_groups(_ROUND_FLOAT_IMPRECISIONS_PATTERN, str(x))
780
+ except ExtractGroupsError:
781
+ head, tail = extract_groups(_ROUND_FLOAT_IMPRECISIONS_PATTERN, f"{x:.20f}")
781
782
  half = ceil(decimals / 2)
782
783
  pattern0 = search(rf"^([0-9]+?)(0{{{half},}})([0-9]+?)$", tail)
783
784
  pattern9 = search(rf"^(0*)([0-9]+?)(9{{{half},}})([0-9]+?)$", tail)
@@ -823,7 +824,7 @@ def round_to_float(
823
824
  y: float,
824
825
  /,
825
826
  *,
826
- mode: RoundMode = "standard",
827
+ mode: MathRoundMode = "standard",
827
828
  rel_tol: float | None = None,
828
829
  abs_tol: float | None = None,
829
830
  ) -> float:
@@ -5,8 +5,6 @@ from dataclasses import dataclass
5
5
  from re import Pattern
6
6
  from typing import TYPE_CHECKING, assert_never, override
7
7
 
8
- from utilities.iterables import OneEmptyError, OneNonUniqueError, one
9
-
10
8
  if TYPE_CHECKING:
11
9
  from utilities.types import PatternLike
12
10
 
@@ -36,16 +34,17 @@ def extract_group(pattern: PatternLike, text: str, /, *, flags: int = 0) -> str:
36
34
  raise _ExtractGroupNoCaptureGroupsError(pattern=pattern_use, text=text)
37
35
  case 1:
38
36
  matches: list[str] = pattern_use.findall(text)
39
- try:
40
- return one(matches)
41
- except OneEmptyError:
42
- raise _ExtractGroupNoMatchesError(
43
- pattern=pattern_use, text=text
44
- ) from None
45
- except OneNonUniqueError:
46
- raise _ExtractGroupMultipleMatchesError(
47
- pattern=pattern_use, text=text, matches=matches
48
- ) from None
37
+ match len(matches):
38
+ case 0:
39
+ raise _ExtractGroupNoMatchesError(
40
+ pattern=pattern_use, text=text
41
+ ) from None
42
+ case 1:
43
+ return matches[0]
44
+ case _:
45
+ raise _ExtractGroupMultipleMatchesError(
46
+ pattern=pattern_use, text=text, matches=matches
47
+ ) from None
49
48
  case _:
50
49
  raise _ExtractGroupMultipleCaptureGroupsError(
51
50
  pattern=pattern_use, text=text
@@ -109,7 +108,7 @@ def extract_groups(pattern: PatternLike, text: str, /, *, flags: int = 0) -> lis
109
108
  case 1, 1:
110
109
  return matches
111
110
  case 1, _:
112
- return list(one(matches))
111
+ return list(matches[0])
113
112
  case _:
114
113
  raise _ExtractGroupsMultipleMatchesError(
115
114
  pattern=pattern_use, text=text, matches=matches
@@ -36,7 +36,7 @@ if TYPE_CHECKING:
36
36
  from traceback import FrameSummary
37
37
  from types import TracebackType
38
38
 
39
- from utilities.types import MaybeCallableDateTime, MaybeCallablePathLike, PathLike
39
+ from utilities.types import MaybeCallablePathLike, MaybeCallablePyDateTime, PathLike
40
40
  from utilities.version import MaybeCallableVersionLike
41
41
 
42
42
 
@@ -51,7 +51,7 @@ def format_exception_stack(
51
51
  /,
52
52
  *,
53
53
  header: bool = False,
54
- start: MaybeCallableDateTime | None = _START,
54
+ start: MaybeCallablePyDateTime | None = _START,
55
55
  version: MaybeCallableVersionLike | None = None,
56
56
  capture_locals: bool = False,
57
57
  max_width: int = RICH_MAX_WIDTH,
@@ -82,7 +82,7 @@ def format_exception_stack(
82
82
 
83
83
  def _yield_header_lines(
84
84
  *,
85
- start: MaybeCallableDateTime | None = _START,
85
+ start: MaybeCallablePyDateTime | None = _START,
86
86
  version: MaybeCallableVersionLike | None = None,
87
87
  ) -> Iterator[str]:
88
88
  """Yield the header lines."""
@@ -193,7 +193,7 @@ def _trim_path(path: PathLike, pattern: str, /) -> Path | None:
193
193
 
194
194
  def make_except_hook(
195
195
  *,
196
- start: MaybeCallableDateTime | None = _START,
196
+ start: MaybeCallablePyDateTime | None = _START,
197
197
  version: MaybeCallableVersionLike | None = None,
198
198
  path: MaybeCallablePathLike | None = None,
199
199
  max_width: int = RICH_MAX_WIDTH,
@@ -228,7 +228,7 @@ def _make_except_hook_inner(
228
228
  traceback: TracebackType | None,
229
229
  /,
230
230
  *,
231
- start: MaybeCallableDateTime | None = _START,
231
+ start: MaybeCallablePyDateTime | None = _START,
232
232
  version: MaybeCallableVersionLike | None = None,
233
233
  path: MaybeCallablePathLike | None = None,
234
234
  max_width: int = RICH_MAX_WIDTH,