dycw-utilities 0.131.1__tar.gz → 0.131.3__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.1 → dycw_utilities-0.131.3}/PKG-INFO +4 -45
  2. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/pyproject.toml +10 -49
  3. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_hypothesis.py +80 -0
  4. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_tzlocal.py +5 -1
  5. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_whenever.py +1 -20
  6. dycw_utilities-0.131.3/src/tests/test_whenever2.py +188 -0
  7. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/__init__.py +1 -1
  8. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/altair.py +1 -4
  9. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/fastapi.py +2 -3
  10. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/fpdf2.py +2 -2
  11. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/hypothesis.py +160 -3
  12. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/lightweight_charts.py +1 -2
  13. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/logging.py +3 -5
  14. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/orjson.py +0 -2
  15. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pickle.py +2 -2
  16. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pydantic.py +2 -2
  17. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pyinstrument.py +1 -2
  18. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pytest.py +1 -2
  19. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/traceback.py +3 -7
  20. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/typing.py +1 -1
  21. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/tzlocal.py +6 -1
  22. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/whenever.py +1 -64
  23. dycw_utilities-0.131.3/src/utilities/whenever2.py +121 -0
  24. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/zoneinfo.py +2 -2
  25. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/.gitignore +0 -0
  26. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/LICENSE +0 -0
  27. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/README.md +0 -0
  28. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/__init__.py +0 -0
  29. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/conftest.py +0 -0
  30. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/__init__.py +0 -0
  31. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_missing/__init__.py +0 -0
  32. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_missing/module.py +0 -0
  33. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_with/__init__.py +0 -0
  34. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_with/outer_1.py +0 -0
  35. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_with/outer_2.py +0 -0
  36. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  37. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  38. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  39. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  40. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_without/__init__.py +0 -0
  41. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_without/module_1.py +0 -0
  42. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/package_without/module_2.py +0 -0
  43. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/standalone.py +0 -0
  44. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/modules/with_imports.py +0 -0
  45. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  46. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  47. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  48. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  49. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  50. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  51. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  52. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  53. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_aiolimiter.py +0 -0
  54. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_altair.py +0 -0
  55. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_asyncio.py +0 -0
  56. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_asyncio_classes/__init__.py +0 -0
  57. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_asyncio_classes/loopers.py +0 -0
  58. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_asyncio_classes/redis.py +0 -0
  59. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_atomicwrites.py +0 -0
  60. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_atools.py +0 -0
  61. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_cachetools.py +0 -0
  62. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_click.py +0 -0
  63. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_concurrent.py +0 -0
  64. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_contextlib.py +0 -0
  65. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_contextvars.py +0 -0
  66. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_cryptography.py +0 -0
  67. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_cvxpy.py +0 -0
  68. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_dataclasses.py +0 -0
  69. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_datetime.py +0 -0
  70. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_enum.py +0 -0
  71. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_errors.py +0 -0
  72. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_eventkit.py +0 -0
  73. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_fastapi.py +0 -0
  74. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_fpdf2.py +0 -0
  75. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_functions.py +0 -0
  76. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_functools.py +0 -0
  77. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_getpass.py +0 -0
  78. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_git.py +0 -0
  79. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_hashlib.py +0 -0
  80. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_http.py +0 -0
  81. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_importlib.py +0 -0
  82. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_inflect.py +0 -0
  83. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_ipython.py +0 -0
  84. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_iterables.py +0 -0
  85. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_jupyter.py +0 -0
  86. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_libcst.py +0 -0
  87. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_lightweight_charts.py +0 -0
  88. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_logging.py +0 -0
  89. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_luigi.py +0 -0
  90. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_math.py +0 -0
  91. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_memory_profiler.py +0 -0
  92. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_modules.py +0 -0
  93. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_more_itertools.py +0 -0
  94. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_numpy.py +0 -0
  95. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_operator.py +0 -0
  96. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_optuna.py +0 -0
  97. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_orjson.py +0 -0
  98. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_os.py +0 -0
  99. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_parse.py +0 -0
  100. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pathlib.py +0 -0
  101. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_period.py +0 -0
  102. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pickle.py +0 -0
  103. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_platform.py +0 -0
  104. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_polars.py +0 -0
  105. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_polars_ols.py +0 -0
  106. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pottery.py +0 -0
  107. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pqdm.py +0 -0
  108. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_psutil.py +0 -0
  109. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pydantic.py +0 -0
  110. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pyinstrument.py +0 -0
  111. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pyrsistent.py +0 -0
  112. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pytest.py +0 -0
  113. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_pytest_regressions.py +0 -0
  114. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_python_dotenv.py +0 -0
  115. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_random.py +0 -0
  116. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_re.py +0 -0
  117. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_redis.py +0 -0
  118. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_reprlib.py +0 -0
  119. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_scipy.py +0 -0
  120. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_sentinel.py +0 -0
  121. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_shelve.py +0 -0
  122. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_slack_sdk.py +0 -0
  123. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_socket.py +0 -0
  124. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_sqlalchemy.py +0 -0
  125. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_sqlalchemy_polars.py +0 -0
  126. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_statsmodel.py +0 -0
  127. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_streamlit.py +0 -0
  128. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_string.py +0 -0
  129. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_tempfile.py +0 -0
  130. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_tenacity.py +0 -0
  131. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_text.py +0 -0
  132. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_threading.py +0 -0
  133. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_timer.py +0 -0
  134. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_traceback.py +0 -0
  135. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_types.py +0 -0
  136. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_typing.py +0 -0
  137. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_typing_funcs/__init__.py +0 -0
  138. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_typing_funcs/no_future.py +0 -0
  139. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_typing_funcs/with_future.py +0 -0
  140. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_tzdata.py +0 -0
  141. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_uuid.py +0 -0
  142. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_version.py +0 -0
  143. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_warnings.py +0 -0
  144. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_zipfile.py +0 -0
  145. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/tests/test_zoneinfo.py +0 -0
  146. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/aiolimiter.py +0 -0
  147. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/asyncio.py +0 -0
  148. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/atomicwrites.py +0 -0
  149. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/atools.py +0 -0
  150. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/cachetools.py +0 -0
  151. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/click.py +0 -0
  152. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/concurrent.py +0 -0
  153. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/contextlib.py +0 -0
  154. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/contextvars.py +0 -0
  155. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/cryptography.py +0 -0
  156. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/cvxpy.py +0 -0
  157. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/dataclasses.py +0 -0
  158. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/datetime.py +0 -0
  159. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/enum.py +0 -0
  160. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/errors.py +0 -0
  161. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/eventkit.py +0 -0
  162. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/functions.py +0 -0
  163. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/functools.py +0 -0
  164. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/getpass.py +0 -0
  165. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/git.py +0 -0
  166. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/hashlib.py +0 -0
  167. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/http.py +0 -0
  168. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/importlib.py +0 -0
  169. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/inflect.py +0 -0
  170. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/ipython.py +0 -0
  171. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/iterables.py +0 -0
  172. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/jupyter.py +0 -0
  173. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/libcst.py +0 -0
  174. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/luigi.py +0 -0
  175. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/math.py +0 -0
  176. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/memory_profiler.py +0 -0
  177. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/modules.py +0 -0
  178. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/more_itertools.py +0 -0
  179. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/numpy.py +0 -0
  180. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/operator.py +0 -0
  181. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/optuna.py +0 -0
  182. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/os.py +0 -0
  183. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/parse.py +0 -0
  184. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pathlib.py +0 -0
  185. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/period.py +0 -0
  186. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/platform.py +0 -0
  187. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/polars.py +0 -0
  188. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/polars_ols.py +0 -0
  189. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pottery.py +0 -0
  190. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pqdm.py +0 -0
  191. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/psutil.py +0 -0
  192. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/py.typed +0 -0
  193. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pyrsistent.py +0 -0
  194. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/pytest_regressions.py +0 -0
  195. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/python_dotenv.py +0 -0
  196. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/random.py +0 -0
  197. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/re.py +0 -0
  198. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/redis.py +0 -0
  199. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/reprlib.py +0 -0
  200. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/scipy.py +0 -0
  201. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/sentinel.py +0 -0
  202. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/shelve.py +0 -0
  203. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/slack_sdk.py +0 -0
  204. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/socket.py +0 -0
  205. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/sqlalchemy.py +0 -0
  206. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/sqlalchemy_polars.py +0 -0
  207. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/statsmodels.py +0 -0
  208. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/streamlit.py +0 -0
  209. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/string.py +0 -0
  210. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/tempfile.py +0 -0
  211. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/tenacity.py +0 -0
  212. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/text.py +0 -0
  213. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/threading.py +0 -0
  214. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/timer.py +0 -0
  215. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/types.py +0 -0
  216. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/tzdata.py +0 -0
  217. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/uuid.py +0 -0
  218. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/version.py +0 -0
  219. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/warnings.py +0 -0
  220. {dycw_utilities-0.131.1 → dycw_utilities-0.131.3}/src/utilities/zipfile.py +0 -0
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.131.1
3
+ Version: 0.131.3
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
7
+ Requires-Dist: atomicwrites<1.5,>=1.4.1
7
8
  Requires-Dist: typing-extensions<4.15,>=4.14.0
9
+ Requires-Dist: tzlocal<5.4,>=5.3.1
10
+ Requires-Dist: whenever<0.9,>=0.8.5
8
11
  Provides-Extra: logging
9
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'logging'
10
12
  Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
11
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'logging'
12
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'logging'
13
13
  Provides-Extra: test
14
14
  Requires-Dist: dycw-pytest-only<2.2,>=2.1.1; extra == 'test'
15
15
  Requires-Dist: hypothesis<6.136,>=6.135.2; extra == 'test'
@@ -28,14 +28,11 @@ Provides-Extra: zzz-test-aiolimiter
28
28
  Requires-Dist: aiolimiter<1.3,>=1.2.1; extra == 'zzz-test-aiolimiter'
29
29
  Provides-Extra: zzz-test-altair
30
30
  Requires-Dist: altair<5.6,>=5.5.0; extra == 'zzz-test-altair'
31
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-altair'
32
31
  Requires-Dist: img2pdf<0.7,>=0.6.0; extra == 'zzz-test-altair'
33
32
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-altair'
34
33
  Requires-Dist: vl-convert-python<1.9,>=1.8.0; extra == 'zzz-test-altair'
35
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-altair'
36
34
  Provides-Extra: zzz-test-asyncio
37
35
  Provides-Extra: zzz-test-atomicwrites
38
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-atomicwrites'
39
36
  Provides-Extra: zzz-test-atools
40
37
  Requires-Dist: atools<0.15,>=0.14.2; extra == 'zzz-test-atools'
41
38
  Provides-Extra: zzz-test-cachetools
@@ -43,7 +40,6 @@ Requires-Dist: cachetools<5.6,>=5.5.2; extra == 'zzz-test-cachetools'
43
40
  Provides-Extra: zzz-test-click
44
41
  Requires-Dist: click<8.3,>=8.2.1; extra == 'zzz-test-click'
45
42
  Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-click'
46
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-click'
47
43
  Provides-Extra: zzz-test-contextlib
48
44
  Provides-Extra: zzz-test-contextvars
49
45
  Provides-Extra: zzz-test-cryptography
@@ -53,10 +49,7 @@ Requires-Dist: cvxpy<1.7,>=1.6.5; extra == 'zzz-test-cvxpy'
53
49
  Provides-Extra: zzz-test-dataclasses
54
50
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-dataclasses'
55
51
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-dataclasses'
56
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-dataclasses'
57
52
  Provides-Extra: zzz-test-datetime
58
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-datetime'
59
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-datetime'
60
53
  Provides-Extra: zzz-test-enum
61
54
  Provides-Extra: zzz-test-errors
62
55
  Provides-Extra: zzz-test-eventkit
@@ -67,7 +60,6 @@ Requires-Dist: httpx<0.29,>=0.28.1; extra == 'zzz-test-fastapi'
67
60
  Requires-Dist: uvicorn<0.35,>=0.34.1; extra == 'zzz-test-fastapi'
68
61
  Provides-Extra: zzz-test-fpdf2
69
62
  Requires-Dist: fpdf2<2.9,>=2.8.3; extra == 'zzz-test-fpdf2'
70
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-fpdf2'
71
63
  Provides-Extra: zzz-test-functions
72
64
  Provides-Extra: zzz-test-functools
73
65
  Provides-Extra: zzz-test-getpass
@@ -75,11 +67,8 @@ Provides-Extra: zzz-test-git
75
67
  Provides-Extra: zzz-test-hashlib
76
68
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-hashlib'
77
69
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-hashlib'
78
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-hashlib'
79
70
  Provides-Extra: zzz-test-http
80
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-http'
81
71
  Requires-Dist: orjson<3.11,>=3.10.18; extra == 'zzz-test-http'
82
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-http'
83
72
  Provides-Extra: zzz-test-hypothesis
84
73
  Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-hypothesis'
85
74
  Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-hypothesis'
@@ -91,27 +80,20 @@ Requires-Dist: pathvalidate<3.3,>=3.2.3; extra == 'zzz-test-hypothesis'
91
80
  Requires-Dist: redis<6.3,>=6.2.0; extra == 'zzz-test-hypothesis'
92
81
  Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-hypothesis'
93
82
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-hypothesis'
94
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-hypothesis'
95
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-hypothesis'
96
83
  Provides-Extra: zzz-test-ipython
97
84
  Requires-Dist: ipython<9.1,>=9.0.1; extra == 'zzz-test-ipython'
98
85
  Provides-Extra: zzz-test-iterables
99
86
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-iterables'
100
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-iterables'
101
87
  Provides-Extra: zzz-test-jupyter
102
88
  Requires-Dist: jupyterlab<4.3,>=4.2.0; extra == 'zzz-test-jupyter'
103
89
  Requires-Dist: pandas<2.4,>=2.3.0; extra == 'zzz-test-jupyter'
104
90
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-jupyter'
105
91
  Provides-Extra: zzz-test-logging
106
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-logging'
107
92
  Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'zzz-test-logging'
108
93
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-logging'
109
94
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-logging'
110
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-logging'
111
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-logging'
112
95
  Provides-Extra: zzz-test-luigi
113
96
  Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-luigi'
114
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-luigi'
115
97
  Provides-Extra: zzz-test-math
116
98
  Requires-Dist: numpy<2.4,>=2.3.0; extra == 'zzz-test-math'
117
99
  Provides-Extra: zzz-test-memory-profiler
@@ -123,43 +105,32 @@ Provides-Extra: zzz-test-numpy
123
105
  Requires-Dist: numpy<2.4,>=2.3.0; extra == 'zzz-test-numpy'
124
106
  Provides-Extra: zzz-test-operator
125
107
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-operator'
126
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-operator'
127
108
  Provides-Extra: zzz-test-optuna
128
109
  Requires-Dist: optuna<4.4,>=4.3.0; extra == 'zzz-test-optuna'
129
110
  Provides-Extra: zzz-test-orjson
130
111
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-orjson'
131
112
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-orjson'
132
113
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-orjson'
133
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-orjson'
134
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-orjson'
135
114
  Provides-Extra: zzz-test-os
136
115
  Provides-Extra: zzz-test-pathlib
137
116
  Provides-Extra: zzz-test-pickle
138
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pickle'
139
117
  Provides-Extra: zzz-test-platform
140
118
  Provides-Extra: zzz-test-polars
141
119
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-polars'
142
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-polars'
143
120
  Provides-Extra: zzz-test-pqdm
144
121
  Requires-Dist: pqdm<0.3,>=0.2.0; extra == 'zzz-test-pqdm'
145
122
  Provides-Extra: zzz-test-pydantic
146
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pydantic'
147
123
  Requires-Dist: pydantic<2.12,>=2.11.4; extra == 'zzz-test-pydantic'
148
124
  Provides-Extra: zzz-test-pyinstrument
149
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pyinstrument'
150
125
  Requires-Dist: pyinstrument<5.1,>=5.0.2; extra == 'zzz-test-pyinstrument'
151
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-pyinstrument'
152
126
  Provides-Extra: zzz-test-pyrsistent
153
127
  Requires-Dist: pyrsistent<0.21,>=0.20.0; extra == 'zzz-test-pyrsistent'
154
128
  Provides-Extra: zzz-test-pytest
155
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pytest'
156
129
  Requires-Dist: orjson<3.11,>=3.10.18; extra == 'zzz-test-pytest'
157
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-pytest'
158
130
  Provides-Extra: zzz-test-pytest-regressions
159
131
  Requires-Dist: pytest-regressions<2.9,>=2.8.0; extra == 'zzz-test-pytest-regressions'
160
132
  Provides-Extra: zzz-test-python-dotenv
161
133
  Requires-Dist: python-dotenv<1.2,>=1.1.0; extra == 'zzz-test-python-dotenv'
162
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-python-dotenv'
163
134
  Provides-Extra: zzz-test-random
164
135
  Provides-Extra: zzz-test-re
165
136
  Provides-Extra: zzz-test-redis
@@ -168,8 +139,6 @@ Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-redis'
168
139
  Requires-Dist: redis<6.3,>=6.2.0; extra == 'zzz-test-redis'
169
140
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-redis'
170
141
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-redis'
171
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-redis'
172
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-redis'
173
142
  Provides-Extra: zzz-test-rich
174
143
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-rich'
175
144
  Provides-Extra: zzz-test-scipy
@@ -195,15 +164,11 @@ Requires-Dist: nest-asyncio<1.7,>=1.6.0; extra == 'zzz-test-sqlalchemy-polars'
195
164
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-sqlalchemy-polars'
196
165
  Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-sqlalchemy-polars'
197
166
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-sqlalchemy-polars'
198
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-sqlalchemy-polars'
199
167
  Provides-Extra: zzz-test-streamlit
200
168
  Requires-Dist: streamlit<1.46,>=1.45.0; extra == 'zzz-test-streamlit'
201
169
  Provides-Extra: zzz-test-sys
202
- Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-sys'
203
170
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-sys'
204
171
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-sys'
205
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-sys'
206
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-sys'
207
172
  Provides-Extra: zzz-test-tempfile
208
173
  Provides-Extra: zzz-test-tenacity
209
174
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-tenacity'
@@ -213,24 +178,18 @@ Provides-Extra: zzz-test-timer
213
178
  Provides-Extra: zzz-test-traceback
214
179
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-traceback'
215
180
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-traceback'
216
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-traceback'
217
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-traceback'
218
181
  Provides-Extra: zzz-test-types
219
182
  Provides-Extra: zzz-test-typing
220
183
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-typing'
221
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-typing'
222
184
  Provides-Extra: zzz-test-tzlocal
223
- Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-tzlocal'
224
185
  Provides-Extra: zzz-test-uuid
225
186
  Provides-Extra: zzz-test-version
226
187
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-version'
227
188
  Provides-Extra: zzz-test-warnings
228
189
  Provides-Extra: zzz-test-whenever
229
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-whenever'
230
190
  Provides-Extra: zzz-test-zipfile
231
191
  Provides-Extra: zzz-test-zoneinfo
232
192
  Requires-Dist: tzdata<2025.3,>=2025.2; extra == 'zzz-test-zoneinfo'
233
- Requires-Dist: whenever<0.9,>=0.8.5; extra == 'zzz-test-zoneinfo'
234
193
  Description-Content-Type: text/markdown
235
194
 
236
195
  [![PyPI version](https://badge.fury.io/py/dycw-utilities.svg)](https://badge.fury.io/py/dycw-utilities)
@@ -13,7 +13,6 @@ dev = [
13
13
  "aiosqlite >= 0.21.0, < 0.22",
14
14
  "altair >= 5.5.0, < 5.6",
15
15
  "asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async
16
- "atomicwrites >= 1.4.1, < 1.5",
17
16
  "atools >= 0.14.2, < 0.15",
18
17
  "cachetools >= 5.5.2, < 5.6",
19
18
  "click >= 8.2.1, < 8.3",
@@ -63,12 +62,10 @@ dev = [
63
62
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
64
63
  "tomlkit >= 0.13.2, < 0.14",
65
64
  "tzdata >= 2025.2, < 2025.3",
66
- "tzlocal >= 5.3.1, < 5.4",
67
65
  "uvicorn >= 0.34.1, < 0.35",
68
66
  "vegafusion >= 2.0.2, < 2.1",
69
67
  "vegafusion-python-embed >= 1.6.9, < 1.7",
70
68
  "vl-convert-python >= 1.8.0, < 1.9",
71
- "whenever >= 0.8.5, < 0.9",
72
69
  # test
73
70
  "coverage-conditional-plugin >= 0.9.0, < 0.10",
74
71
  "dycw-pytest-only >= 2.1.1, < 2.2",
@@ -89,19 +86,19 @@ dev = [
89
86
  [project]
90
87
  authors = [{name = "Derek Wan", email = "d.wan@icloud.com"}]
91
88
  dependencies = [
89
+ "atomicwrites >= 1.4.1, < 1.5",
92
90
  "typing-extensions >= 4.14.0, < 4.15",
91
+ "tzlocal >= 5.3.1, < 5.4",
92
+ "whenever >= 0.8.5, < 0.9",
93
93
  ]
94
94
  name = "dycw-utilities"
95
95
  readme = "README.md"
96
96
  requires-python = ">= 3.12"
97
- version = "0.131.1"
97
+ version = "0.131.3"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  logging = [
101
- "atomicwrites >= 1.4.1, < 1.5",
102
101
  "coloredlogs >= 15.0.1, < 15.1",
103
- "tzlocal >= 5.3.1, < 5.4",
104
- "whenever >= 0.8.5, < 0.9",
105
102
  ]
106
103
  test = [
107
104
  "dycw-pytest-only >= 2.1.1, < 2.2",
@@ -123,14 +120,12 @@ zzz-test-aiolimiter = [
123
120
  ]
124
121
  zzz-test-altair = [
125
122
  "altair >= 5.5.0, < 5.6",
126
- "atomicwrites >= 1.4.1, < 1.5",
127
123
  "img2pdf >= 0.6.0, < 0.7",
128
124
  "polars-lts-cpu >= 1.30.0, < 1.31",
129
125
  "vl-convert-python >= 1.8.0, < 1.9",
130
- "whenever >= 0.8.5, < 0.9",
131
126
  ]
132
127
  zzz-test-asyncio = []
133
- zzz-test-atomicwrites = ["atomicwrites >= 1.4.1, < 1.5"]
128
+ zzz-test-atomicwrites = []
134
129
  zzz-test-atools = [
135
130
  "atools >= 0.14.2, < 0.15",
136
131
  ]
@@ -138,7 +133,6 @@ zzz-test-cachetools = ["cachetools >= 5.5.2, < 5.6"]
138
133
  zzz-test-click = [
139
134
  "click >= 8.2.1, < 8.3",
140
135
  "sqlalchemy >= 2.0.41, < 2.1",
141
- "whenever >= 0.8.5, < 0.9",
142
136
  ]
143
137
  zzz-test-contextlib = []
144
138
  zzz-test-contextvars = []
@@ -147,11 +141,8 @@ zzz-test-cvxpy = ["cvxpy >= 1.6.5, < 1.7"]
147
141
  zzz-test-dataclasses = [
148
142
  "orjson >= 3.10.15, < 3.11",
149
143
  "polars-lts-cpu >= 1.30.0, < 1.31",
150
- "whenever >= 0.8.5, < 0.9",
151
144
  ]
152
145
  zzz-test-datetime = [
153
- "tzlocal >= 5.3.1, < 5.4",
154
- "whenever >= 0.8.5, < 0.9",
155
146
  ]
156
147
  zzz-test-enum = []
157
148
  zzz-test-errors = []
@@ -163,7 +154,6 @@ zzz-test-fastapi = [
163
154
  ]
164
155
  zzz-test-fpdf2 = [
165
156
  "fpdf2 >= 2.8.3, < 2.9",
166
- "tzlocal >= 5.3.1, < 5.4",
167
157
  ]
168
158
  zzz-test-functions = []
169
159
  zzz-test-functools = []
@@ -172,12 +162,9 @@ zzz-test-git = []
172
162
  zzz-test-hashlib = [
173
163
  "polars-lts-cpu >= 1.30.0, < 1.31",
174
164
  "orjson >= 3.10.15, < 3.11",
175
- "whenever >= 0.8.5, < 0.9",
176
165
  ]
177
166
  zzz-test-http = [
178
- "atomicwrites >= 1.4.1, < 1.5",
179
167
  "orjson >= 3.10.18, < 3.11",
180
- "whenever >= 0.8.5, < 0.9",
181
168
  ]
182
169
  zzz-test-hypothesis = [
183
170
  "aiosqlite >= 0.21.0, < 0.22",
@@ -190,13 +177,10 @@ zzz-test-hypothesis = [
190
177
  "redis >= 6.2.0, < 6.3",
191
178
  "sqlalchemy >= 2.0.41, < 2.1",
192
179
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
193
- "tzlocal >= 5.3.1, < 5.4",
194
- "whenever >= 0.8.5, < 0.9",
195
180
  ]
196
181
  zzz-test-ipython = ["ipython >= 9.0.1, < 9.1"]
197
182
  zzz-test-iterables = [
198
183
  "polars-lts-cpu >= 1.30.0, < 1.31",
199
- "whenever >= 0.8.5, < 0.9",
200
184
  ]
201
185
  zzz-test-jupyter = [
202
186
  "jupyterlab >= 4.2.0, < 4.3",
@@ -204,16 +188,12 @@ zzz-test-jupyter = [
204
188
  "polars-lts-cpu >= 1.30.0, < 1.31",
205
189
  ]
206
190
  zzz-test-logging = [
207
- "atomicwrites >= 1.4.1, < 1.5",
208
191
  "coloredlogs >= 15.0.1, < 15.1",
209
192
  "rich >= 14.0.0, < 14.1",
210
193
  "tomlkit >= 0.13.2, < 0.14",
211
- "tzlocal >= 5.3.1, < 5.4",
212
- "whenever >= 0.8.5, < 0.9",
213
194
  ]
214
195
  zzz-test-luigi = [
215
196
  "luigi >= 3.6.0, < 3.7",
216
- "whenever >= 0.8.5, < 0.9",
217
197
  ]
218
198
  zzz-test-math = ["numpy >= 2.3.0, < 2.4"]
219
199
  zzz-test-memory-profiler = ["memory-profiler >= 0.61.0, < 0.62"]
@@ -222,44 +202,34 @@ zzz-test-more-itertools = ["more-itertools >= 10.7.0, < 10.8"]
222
202
  zzz-test-numpy = ["numpy >= 2.3.0, < 2.4"]
223
203
  zzz-test-operator = [
224
204
  "polars-lts-cpu >= 1.30.0, < 1.31",
225
- "whenever >= 0.8.5, < 0.9",
226
205
  ]
227
206
  zzz-test-optuna = ["optuna >= 4.3.0, < 4.4"]
228
207
  zzz-test-orjson = [
229
208
  "orjson >= 3.10.15, < 3.11",
230
209
  "polars-lts-cpu >= 1.30.0, < 1.31",
231
210
  "rich >= 14.0.0, < 14.1",
232
- "tzlocal >= 5.3.1, < 5.4",
233
- "whenever >= 0.8.5, < 0.9",
234
211
  ]
235
212
  zzz-test-os = []
236
213
  zzz-test-pathlib = []
237
- zzz-test-pickle = ["atomicwrites >= 1.4.1, < 1.5"]
214
+ zzz-test-pickle = []
238
215
  zzz-test-platform = []
239
216
  zzz-test-polars = [
240
217
  "polars-lts-cpu >= 1.30.0, < 1.31",
241
- "whenever >= 0.8.5, < 0.9",
242
218
  ]
243
219
  zzz-test-pqdm = ["pqdm >= 0.2.0, < 0.3"]
244
220
  zzz-test-pydantic = [
245
- "atomicwrites >= 1.4.1, < 1.5",
246
221
  "pydantic >= 2.11.4, < 2.12",
247
222
  ]
248
223
  zzz-test-pyinstrument = [
249
- "atomicwrites >= 1.4.1, < 1.5",
250
224
  "pyinstrument >= 5.0.2, < 5.1",
251
- "tzlocal >= 5.3.1, < 5.4",
252
225
  ]
253
226
  zzz-test-pyrsistent = ["pyrsistent >= 0.20.0, < 0.21"]
254
227
  zzz-test-pytest = [
255
- "atomicwrites >= 1.4.1, < 1.5",
256
228
  "orjson >= 3.10.18, < 3.11",
257
- "whenever >= 0.8.5, < 0.9",
258
229
  ]
259
230
  zzz-test-pytest-regressions = ["pytest-regressions >= 2.8.0, < 2.9"]
260
231
  zzz-test-python-dotenv = [
261
232
  "python-dotenv >= 1.1.0, < 1.2",
262
- "whenever >= 0.8.5, < 0.9",
263
233
  ]
264
234
  zzz-test-random = []
265
235
  zzz-test-re = []
@@ -269,8 +239,6 @@ zzz-test-redis = [
269
239
  "redis >= 6.2.0, < 6.3",
270
240
  "rich >= 14.0.0, < 14.1",
271
241
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
272
- "tzlocal >= 5.3.1, < 5.4",
273
- "whenever >= 0.8.5, < 0.9",
274
242
  ]
275
243
  zzz-test-rich = ["rich >= 14.0.0, < 14.1"]
276
244
  zzz-test-scipy = ["scipy >= 1.15.3, < 1.16"]
@@ -297,15 +265,11 @@ zzz-test-sqlalchemy-polars = [
297
265
  "polars-lts-cpu >= 1.30.0, < 1.31",
298
266
  "sqlalchemy >= 2.0.41, < 2.1",
299
267
  "tenacity >= 8.5.0, < 9.0", # limited by luigi
300
- "whenever >= 0.8.5, < 0.9",
301
268
  ]
302
269
  zzz-test-streamlit = ["streamlit >= 1.45.0, < 1.46"]
303
270
  zzz-test-sys = [
304
- "atomicwrites >= 1.4.1, < 1.5",
305
271
  "rich >= 14.0.0, < 14.1",
306
272
  "tomlkit >= 0.13.2, < 0.14",
307
- "tzlocal >= 5.3.1, < 5.4",
308
- "whenever >= 0.8.5, < 0.9",
309
273
  ]
310
274
  zzz-test-tempfile = []
311
275
  zzz-test-tenacity = [
@@ -317,23 +281,19 @@ zzz-test-timer = []
317
281
  zzz-test-traceback = [
318
282
  "rich >= 14.0.0, < 14.1",
319
283
  "tomlkit >= 0.13.2, < 0.14",
320
- "tzlocal >= 5.3.1, < 5.4",
321
- "whenever >= 0.8.5, < 0.9",
322
284
  ]
323
285
  zzz-test-types = []
324
286
  zzz-test-typing = [
325
287
  "polars-lts-cpu >= 1.30.0, < 1.31",
326
- "whenever >= 0.8.5, < 0.9",
327
288
  ]
328
- zzz-test-tzlocal = ["tzlocal >= 5.3.1, < 5.4"]
289
+ zzz-test-tzlocal = []
329
290
  zzz-test-uuid = []
330
291
  zzz-test-version = ["tomlkit >= 0.13.2, < 0.14"]
331
292
  zzz-test-warnings = []
332
- zzz-test-whenever = ["whenever >= 0.8.5, < 0.9"]
293
+ zzz-test-whenever = []
333
294
  zzz-test-zipfile = []
334
295
  zzz-test-zoneinfo = [
335
296
  "tzdata >= 2025.2, < 2025.3",
336
- "whenever >= 0.8.5, < 0.9",
337
297
  ]
338
298
 
339
299
  [project.scripts]
@@ -341,7 +301,7 @@ zzz-test-zoneinfo = [
341
301
  # bump-my-version
342
302
  [tool.bumpversion]
343
303
  allow_dirty = true
344
- current_version = "0.131.1"
304
+ current_version = "0.131.3"
345
305
 
346
306
  [[tool.bumpversion.files]]
347
307
  filename = "src/utilities/__init__.py"
@@ -354,6 +314,7 @@ search = "__version__ = \"{current_version}\""
354
314
  [tool.coverage.coverage_conditional_plugin.rules]
355
315
  skipif-ci = '"CI" in os_environ'
356
316
  skipif-ci-and-not-linux = '("CI" in os_environ) and (sys_platform != "linux")'
317
+ skipif-ci-and-not-windows = '("CI" in os_environ) and (sys_platform != "windows")'
357
318
  skipif-ci-and-windows = '("CI" in os_environ) and (sys_platform != "windows")'
358
319
  skipif-linux = 'sys_platform == "linux"'
359
320
  skipif-mac = 'sys_platform == "darwin"'
@@ -28,6 +28,7 @@ from luigi import Task
28
28
  from numpy import inf, int64, isfinite, isinf, isnan, ravel, rint
29
29
  from pathvalidate import validate_filepath
30
30
  from pytest import mark, raises
31
+ from whenever import Date, DateDelta, PlainDateTime, ZonedDateTime
31
32
 
32
33
  from tests.conftest import SKIPIF_CI_AND_WINDOWS
33
34
  from utilities.datetime import (
@@ -50,8 +51,10 @@ from utilities.hypothesis import (
50
51
  _Draw2InputResolvedToSentinelError,
51
52
  assume_does_not_raise,
52
53
  bool_arrays,
54
+ date_deltas_whenever,
53
55
  date_durations,
54
56
  dates_two_digit_year,
57
+ dates_whenever,
55
58
  datetime_durations,
56
59
  draw2,
57
60
  float32s,
@@ -73,6 +76,7 @@ from utilities.hypothesis import (
73
76
  pairs,
74
77
  paths,
75
78
  plain_datetimes,
79
+ plain_datetimes_whenever,
76
80
  random_states,
77
81
  sentinels,
78
82
  sets_fixed_length,
@@ -94,6 +98,7 @@ from utilities.hypothesis import (
94
98
  uint64s,
95
99
  versions,
96
100
  zoned_datetimes,
101
+ zoned_datetimes_whenever,
97
102
  )
98
103
  from utilities.math import (
99
104
  MAX_FLOAT32,
@@ -178,6 +183,31 @@ class TestBoolArrays:
178
183
  assert array.shape == shape
179
184
 
180
185
 
186
+ class TestDateDeltas:
187
+ @given(data=data())
188
+ def test_main(self, *, data: DataObject) -> None:
189
+ min_value = data.draw(date_deltas_whenever() | none())
190
+ max_value = data.draw(date_deltas_whenever() | none())
191
+ with assume_does_not_raise(InvalidArgument):
192
+ delta = data.draw(
193
+ date_deltas_whenever(min_value=min_value, max_value=max_value)
194
+ )
195
+ assert isinstance(delta, DateDelta)
196
+ years, months, days = delta.in_years_months_days()
197
+ assert years == 0
198
+ assert months == 0
199
+ if min_value is not None:
200
+ min_years, min_months, min_days = min_value.in_years_months_days()
201
+ assert min_years == 0
202
+ assert min_months == 0
203
+ assert days >= min_days
204
+ if max_value is not None:
205
+ max_years, max_months, max_days = max_value.in_years_months_days()
206
+ assert max_years == 0
207
+ assert max_months == 0
208
+ assert days <= max_days
209
+
210
+
181
211
  class TestDateDurations:
182
212
  @given(
183
213
  data=data(),
@@ -257,6 +287,20 @@ class TestDatesTwoDigitYear:
257
287
  assert date.year == parsed
258
288
 
259
289
 
290
+ class TestDatesWhenever:
291
+ @given(data=data())
292
+ def test_main(self, *, data: DataObject) -> None:
293
+ min_value = data.draw(dates_whenever() | none())
294
+ max_value = data.draw(dates_whenever() | none())
295
+ with assume_does_not_raise(InvalidArgument):
296
+ date = data.draw(dates_whenever(min_value=min_value, max_value=max_value))
297
+ assert isinstance(date, Date)
298
+ if min_value is not None:
299
+ assert date >= min_value
300
+ if max_value is not None:
301
+ assert date <= max_value
302
+
303
+
260
304
  class TestDateTimeDurations:
261
305
  @given(
262
306
  data=data(),
@@ -840,6 +884,22 @@ class TestPlainDateTimes:
840
884
  _ = data.draw(plain_datetimes(round_="standard"))
841
885
 
842
886
 
887
+ class TestPlainDateTimesWhenever:
888
+ @given(data=data())
889
+ def test_main(self, *, data: DataObject) -> None:
890
+ min_value = data.draw(plain_datetimes_whenever() | none())
891
+ max_value = data.draw(plain_datetimes_whenever() | none())
892
+ with assume_does_not_raise(InvalidArgument):
893
+ datetime = data.draw(
894
+ plain_datetimes_whenever(min_value=min_value, max_value=max_value)
895
+ )
896
+ assert isinstance(datetime, PlainDateTime)
897
+ if min_value is not None:
898
+ assert datetime >= min_value
899
+ if max_value is not None:
900
+ assert datetime <= max_value
901
+
902
+
843
903
  class TestRandomStates:
844
904
  @given(data=data())
845
905
  def test_main(self, *, data: DataObject) -> None:
@@ -1198,3 +1258,23 @@ class TestZonedDateTimes:
1198
1258
  ZonedDateTimesError, match="Rounding requires a timedelta; got None"
1199
1259
  ):
1200
1260
  _ = data.draw(zoned_datetimes(round_="standard"))
1261
+
1262
+
1263
+ class TestZonedDateTimesWhenever:
1264
+ @given(data=data(), time_zone=timezones())
1265
+ @settings(suppress_health_check={HealthCheck.filter_too_much})
1266
+ def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1267
+ min_value = data.draw(zoned_datetimes_whenever() | none())
1268
+ max_value = data.draw(zoned_datetimes_whenever() | none())
1269
+ with assume_does_not_raise(InvalidArgument):
1270
+ datetime = data.draw(
1271
+ zoned_datetimes_whenever(
1272
+ min_value=min_value, max_value=max_value, time_zone=time_zone
1273
+ )
1274
+ )
1275
+ assert isinstance(datetime, ZonedDateTime)
1276
+ assert datetime.tz == time_zone.key
1277
+ if min_value is not None:
1278
+ assert datetime >= min_value
1279
+ if max_value is not None:
1280
+ assert datetime <= max_value
@@ -5,6 +5,7 @@ from zoneinfo import ZoneInfo
5
5
 
6
6
  from utilities.tzdata import HongKong, Tokyo
7
7
  from utilities.tzlocal import (
8
+ LOCAL_TIME_ZONE,
8
9
  NOW_LOCAL,
9
10
  TODAY_LOCAL,
10
11
  get_local_time_zone,
@@ -15,10 +16,13 @@ from utilities.zoneinfo import UTC
15
16
 
16
17
 
17
18
  class TestGetLocalTimeZone:
18
- def test_main(self) -> None:
19
+ def test_function(self) -> None:
19
20
  time_zone = get_local_time_zone()
20
21
  assert isinstance(time_zone, ZoneInfo)
21
22
 
23
+ def test_constant(self) -> None:
24
+ assert isinstance(LOCAL_TIME_ZONE, ZoneInfo)
25
+
22
26
 
23
27
  class TestGetNowLocal:
24
28
  def test_function(self) -> None:
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import datetime as dt
4
4
  from datetime import timezone
5
- from logging import DEBUG
6
5
  from re import escape
7
6
  from typing import TYPE_CHECKING
8
7
  from zoneinfo import ZoneInfo
@@ -21,7 +20,7 @@ from hypothesis.strategies import (
21
20
  timezones,
22
21
  )
23
22
  from pytest import raises
24
- from whenever import DateTimeDelta, ZonedDateTime
23
+ from whenever import DateTimeDelta
25
24
 
26
25
  from tests.conftest import SKIPIF_CI_AND_WINDOWS
27
26
  from utilities.datetime import (
@@ -61,7 +60,6 @@ from utilities.whenever import (
61
60
  SerializePlainDateTimeError,
62
61
  SerializeTimeDeltaError,
63
62
  SerializeZonedDateTimeError,
64
- WheneverLogRecord,
65
63
  _CheckValidZonedDateTimeUnequalError,
66
64
  _EnsureTimedeltaNanosecondError,
67
65
  _EnsureTimedeltaParseError,
@@ -495,20 +493,3 @@ class TestToDateTimeDelta:
495
493
  _ToDateTimeDeltaError, match="Unable to create DateTimeDelta; got .*"
496
494
  ):
497
495
  _ = _to_datetime_delta(timedelta)
498
-
499
-
500
- class TestWheneverLogRecord:
501
- def test_init(self) -> None:
502
- _ = WheneverLogRecord("name", DEBUG, "pathname", 0, None, None, None)
503
-
504
- def test_get_length(self) -> None:
505
- assert isinstance(WheneverLogRecord._get_length(), int)
506
-
507
- def test_get_now(self) -> None:
508
- assert isinstance(WheneverLogRecord._get_now(), ZonedDateTime)
509
-
510
- def test_get_time_zone(self) -> None:
511
- assert isinstance(WheneverLogRecord._get_time_zone(), ZoneInfo)
512
-
513
- def test_get_time_zone_key(self) -> None:
514
- assert isinstance(WheneverLogRecord._get_time_zone_key(), str)