dycw-utilities 0.154.0__tar.gz → 0.155.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/PKG-INFO +2 -2
  2. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/pyproject.toml +6 -6
  3. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_altair.py +2 -2
  4. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_click.py +4 -4
  5. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_hypothesis.py +159 -37
  6. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_logging.py +7 -5
  7. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_objects/objects.py +10 -4
  8. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_orjson.py +23 -6
  9. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_parse.py +4 -4
  10. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_polars.py +6 -4
  11. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_sqlalchemy_polars.py +2 -2
  12. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typed_settings.py +6 -6
  13. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_whenever.py +106 -212
  14. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_zoneinfo.py +4 -4
  15. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/__init__.py +1 -1
  16. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/hypothesis.py +143 -41
  17. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/orjson.py +45 -12
  18. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/polars.py +2 -2
  19. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_regressions.py +3 -1
  20. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/.gitignore +0 -0
  21. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/LICENSE +0 -0
  22. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/README.md +0 -0
  23. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/__init__.py +0 -0
  24. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/conftest.py +0 -0
  25. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/__init__.py +0 -0
  26. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_missing/__init__.py +0 -0
  27. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_missing/module.py +0 -0
  28. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/__init__.py +0 -0
  29. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/outer_1.py +0 -0
  30. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/outer_2.py +0 -0
  31. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  32. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  33. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  34. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  35. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_without/__init__.py +0 -0
  36. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_without/module_1.py +0 -0
  37. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/package_without/module_2.py +0 -0
  38. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/standalone.py +0 -0
  39. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/modules/with_imports.py +0 -0
  40. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  41. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  42. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  43. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  44. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  45. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  46. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  47. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  48. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_asyncio.py +0 -0
  49. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_atomicwrites.py +0 -0
  50. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_atools.py +0 -0
  51. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_cachetools.py +0 -0
  52. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_concurrent.py +0 -0
  53. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_contextlib.py +0 -0
  54. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_contextvars.py +0 -0
  55. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_cryptography.py +0 -0
  56. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_cvxpy.py +0 -0
  57. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_dataclasses.py +0 -0
  58. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_enum.py +0 -0
  59. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_errors.py +0 -0
  60. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_eventkit.py +0 -0
  61. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_fastapi.py +0 -0
  62. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_fpdf2.py +0 -0
  63. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_functions.py +0 -0
  64. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_functools.py +0 -0
  65. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_getpass.py +0 -0
  66. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_gzip.py +0 -0
  67. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_hashlib.py +0 -0
  68. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_http.py +0 -0
  69. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_importlib.py +0 -0
  70. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_inflect.py +0 -0
  71. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_ipython.py +0 -0
  72. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_iterables.py +0 -0
  73. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_json.py +0 -0
  74. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_jupyter.py +0 -0
  75. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_libcst.py +0 -0
  76. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_lightweight_charts.py +0 -0
  77. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_math.py +0 -0
  78. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_memory_profiler.py +0 -0
  79. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_modules.py +0 -0
  80. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_more_itertools.py +0 -0
  81. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_numpy.py +0 -0
  82. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_objects/__init__.py +0 -0
  83. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_operator.py +0 -0
  84. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_optuna.py +0 -0
  85. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_os.py +0 -0
  86. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pathlib.py +0 -0
  87. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_polars_ols.py +0 -0
  90. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_postgres.py +0 -0
  91. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pottery.py +0 -0
  92. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pqdm.py +0 -0
  93. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_psutil.py +0 -0
  94. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pyinstrument.py +0 -0
  95. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pytest.py +0 -0
  96. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pytest_randomly.py +0 -0
  97. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_pytest_regressions.py +0 -0
  98. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_random.py +0 -0
  99. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_re.py +0 -0
  100. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_redis.py +0 -0
  101. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_reprlib.py +0 -0
  102. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_scipy.py +0 -0
  103. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_sentinel.py +0 -0
  104. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_shelve.py +0 -0
  105. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_slack_sdk.py +0 -0
  106. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_socket.py +0 -0
  107. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_sqlalchemy.py +0 -0
  108. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_statsmodels.py +0 -0
  109. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_string.py +0 -0
  110. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_tempfile.py +0 -0
  111. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_text.py +0 -0
  112. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_threading.py +0 -0
  113. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_timer.py +0 -0
  114. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_traceback.py +0 -0
  115. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_types.py +0 -0
  116. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing.py +0 -0
  117. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  118. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  119. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  120. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_tzdata.py +0 -0
  121. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_tzlocal.py +0 -0
  122. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_uuid.py +0 -0
  123. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_version.py +0 -0
  124. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_warnings.py +0 -0
  125. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_yield_access/__init__.py +0 -0
  126. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_yield_access/script.py +0 -0
  127. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_yield_access/script.sh +0 -0
  128. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/tests/test_zipfile.py +0 -0
  129. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/altair.py +0 -0
  130. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/asyncio.py +0 -0
  131. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/atomicwrites.py +0 -0
  132. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/atools.py +0 -0
  133. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/cachetools.py +0 -0
  134. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/click.py +0 -0
  135. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/concurrent.py +0 -0
  136. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/contextlib.py +0 -0
  137. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/contextvars.py +0 -0
  138. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/cryptography.py +0 -0
  139. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/cvxpy.py +0 -0
  140. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/dataclasses.py +0 -0
  141. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/enum.py +0 -0
  142. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/errors.py +0 -0
  143. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/eventkit.py +0 -0
  144. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/fastapi.py +0 -0
  145. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/fpdf2.py +0 -0
  146. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/functions.py +0 -0
  147. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/functools.py +0 -0
  148. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/getpass.py +0 -0
  149. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/gzip.py +0 -0
  150. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/hashlib.py +0 -0
  151. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/http.py +0 -0
  152. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/importlib.py +0 -0
  153. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/inflect.py +0 -0
  154. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/ipython.py +0 -0
  155. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/iterables.py +0 -0
  156. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/json.py +0 -0
  157. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/jupyter.py +0 -0
  158. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/libcst.py +0 -0
  159. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/lightweight_charts.py +0 -0
  160. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/logging.py +0 -0
  161. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/math.py +0 -0
  162. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/memory_profiler.py +0 -0
  163. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/modules.py +0 -0
  164. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/more_itertools.py +0 -0
  165. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/numpy.py +0 -0
  166. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/operator.py +0 -0
  167. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/optuna.py +0 -0
  168. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/os.py +0 -0
  169. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/parse.py +0 -0
  170. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pathlib.py +0 -0
  171. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pickle.py +0 -0
  172. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/platform.py +0 -0
  173. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/polars_ols.py +0 -0
  174. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/postgres.py +0 -0
  175. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pottery.py +0 -0
  176. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pqdm.py +0 -0
  177. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/psutil.py +0 -0
  178. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/py.typed +0 -0
  179. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pyinstrument.py +0 -0
  180. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest.py +0 -0
  181. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/__init__.py +0 -0
  182. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  183. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  184. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/random.py +0 -0
  185. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/re.py +0 -0
  186. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/redis.py +0 -0
  187. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/reprlib.py +0 -0
  188. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/scipy.py +0 -0
  189. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/sentinel.py +0 -0
  190. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/shelve.py +0 -0
  191. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/slack_sdk.py +0 -0
  192. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/socket.py +0 -0
  193. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/sqlalchemy.py +0 -0
  194. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/sqlalchemy_polars.py +0 -0
  195. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/statsmodels.py +0 -0
  196. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/string.py +0 -0
  197. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/tempfile.py +0 -0
  198. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/text.py +0 -0
  199. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/threading.py +0 -0
  200. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/timer.py +0 -0
  201. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/traceback.py +0 -0
  202. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/typed_settings.py +0 -0
  203. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/types.py +0 -0
  204. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/typing.py +0 -0
  205. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/tzdata.py +0 -0
  206. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/tzlocal.py +0 -0
  207. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/uuid.py +0 -0
  208. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/version.py +0 -0
  209. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/warnings.py +0 -0
  210. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/whenever.py +0 -0
  211. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/zipfile.py +0 -0
  212. {dycw_utilities-0.154.0 → dycw_utilities-0.155.0}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.154.0
3
+ Version: 0.155.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -12,7 +12,7 @@ Provides-Extra: logging
12
12
  Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
13
13
  Provides-Extra: test
14
14
  Requires-Dist: dycw-pytest-only<2.2,>=2.1.1; extra == 'test'
15
- Requires-Dist: hypothesis<6.137,>=6.136.7; extra == 'test'
15
+ Requires-Dist: hypothesis<6.138,>=6.137.1; extra == 'test'
16
16
  Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
17
17
  Requires-Dist: pytest-asyncio<1.2,>=1.1.0; extra == 'test'
18
18
  Requires-Dist: pytest-cov<6.3,>=6.2.1; extra == 'test'
@@ -69,7 +69,7 @@ http-test = [
69
69
  "orjson",
70
70
  ]
71
71
  hypothesis = [
72
- "hypothesis >=6.136.7, <6.137",
72
+ "hypothesis >=6.137.1, <6.138",
73
73
  ]
74
74
  hypothesis-test = [
75
75
  "libcst",
@@ -119,7 +119,7 @@ orjson-test = [
119
119
  "polars",
120
120
  ]
121
121
  polars = [
122
- "polars >=1.32.0, <1.33",
122
+ "polars >=1.32.2, <1.33",
123
123
  ]
124
124
  polars-ols = [
125
125
  "polars-ols >=0.3.5, <0.4",
@@ -168,7 +168,7 @@ pytest-test = [
168
168
  "pytest-rerunfailures",
169
169
  ]
170
170
  redis = [
171
- "redis >=6.2.0, <6.3",
171
+ "redis >=6.4.0, <6.5",
172
172
  "orjson",
173
173
  ]
174
174
  redis-test = [
@@ -229,7 +229,7 @@ dependencies = [
229
229
  name = "dycw-utilities"
230
230
  readme = "README.md"
231
231
  requires-python = ">= 3.12"
232
- version = "0.154.0"
232
+ version = "0.155.0"
233
233
 
234
234
  [project.entry-points.pytest11]
235
235
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -241,7 +241,7 @@ logging = [
241
241
  ]
242
242
  test = [
243
243
  "dycw-pytest-only >=2.1.1, <2.2",
244
- "hypothesis >=6.136.7, <6.137",
244
+ "hypothesis >=6.137.1, <6.138",
245
245
  "pudb >=2025.1, <2025.2",
246
246
  "pytest >=8.4.1, <8.5",
247
247
  "pytest-asyncio >=1.1.0, <1.2",
@@ -262,7 +262,7 @@ test = [
262
262
  # bump-my-version
263
263
  [tool.bumpversion]
264
264
  allow_dirty = true
265
- current_version = "0.154.0"
265
+ current_version = "0.155.0"
266
266
 
267
267
  [[tool.bumpversion.files]]
268
268
  filename = "src/utilities/__init__.py"
@@ -27,7 +27,7 @@ from utilities.altair import (
27
27
  vconcat_charts,
28
28
  )
29
29
  from utilities.functions import ensure_class
30
- from utilities.hypothesis import dates, text_ascii, zoned_datetimes
30
+ from utilities.hypothesis import dates, text_ascii, zoned_date_times
31
31
  from utilities.polars import DatetimeUTC, zoned_datetime_dtype
32
32
  from utilities.tzdata import HongKong, Tokyo
33
33
  from utilities.whenever import get_now
@@ -119,7 +119,7 @@ class TestPlotDataFrames:
119
119
  )
120
120
  _ = plot_dataframes(df, x="index", y="value")
121
121
 
122
- @given(data=lists(tuples(zoned_datetimes(), floats(-10, 10))))
122
+ @given(data=lists(tuples(zoned_date_times(), floats(-10, 10))))
123
123
  def test_tooltip_format_date_time(
124
124
  self, *, data: list[tuple[ZonedDateTime, float]]
125
125
  ) -> None:
@@ -57,12 +57,12 @@ from utilities.hypothesis import (
57
57
  date_time_deltas,
58
58
  dates,
59
59
  month_days,
60
- plain_datetimes,
60
+ plain_date_times,
61
61
  text_ascii,
62
62
  time_deltas,
63
63
  times,
64
64
  year_months,
65
- zoned_datetimes,
65
+ zoned_date_times,
66
66
  )
67
67
  from utilities.text import join_strs, strip_and_dedent
68
68
 
@@ -304,7 +304,7 @@ class TestParameters:
304
304
  _Case(
305
305
  param=PlainDateTime(),
306
306
  name="plain date-time",
307
- strategy=plain_datetimes(),
307
+ strategy=plain_date_times(),
308
308
  serialize=whenever.PlainDateTime.format_common_iso,
309
309
  failable=True,
310
310
  ),
@@ -335,7 +335,7 @@ class TestParameters:
335
335
  _Case(
336
336
  param=ZonedDateTime(),
337
337
  name="zoned date-time",
338
- strategy=zoned_datetimes(),
338
+ strategy=zoned_date_times(),
339
339
  serialize=whenever.ZonedDateTime.format_common_iso,
340
340
  failable=True,
341
341
  ),
@@ -5,7 +5,7 @@ from pathlib import Path
5
5
  from re import search
6
6
  from typing import TYPE_CHECKING, Any, cast
7
7
 
8
- from hypothesis import Phase, assume, given, settings
8
+ from hypothesis import assume, given, settings
9
9
  from hypothesis.errors import InvalidArgument
10
10
  from hypothesis.extra.numpy import array_shapes
11
11
  from hypothesis.strategies import (
@@ -46,6 +46,7 @@ from utilities.hypothesis import (
46
46
  assume_does_not_raise,
47
47
  bool_arrays,
48
48
  date_deltas,
49
+ date_periods,
49
50
  date_time_deltas,
50
51
  dates,
51
52
  draw2,
@@ -57,6 +58,8 @@ from utilities.hypothesis import (
57
58
  hashables,
58
59
  import_froms,
59
60
  imports,
61
+ int8s,
62
+ int16s,
60
63
  int32s,
61
64
  int64s,
62
65
  int_arrays,
@@ -65,7 +68,7 @@ from utilities.hypothesis import (
65
68
  numbers,
66
69
  pairs,
67
70
  paths,
68
- plain_datetimes,
71
+ plain_date_times,
69
72
  random_states,
70
73
  sentinels,
71
74
  sets_fixed_length,
@@ -82,6 +85,7 @@ from utilities.hypothesis import (
82
85
  text_digits,
83
86
  text_printable,
84
87
  time_deltas,
88
+ time_periods,
85
89
  times,
86
90
  triples,
87
91
  uint8s,
@@ -91,13 +95,16 @@ from utilities.hypothesis import (
91
95
  urls,
92
96
  versions,
93
97
  year_months,
94
- zoned_datetimes,
98
+ zoned_date_time_periods,
99
+ zoned_date_times,
95
100
  )
96
101
  from utilities.iterables import one
97
102
  from utilities.libcst import parse_import
98
103
  from utilities.math import (
99
104
  MAX_FLOAT32,
100
105
  MAX_FLOAT64,
106
+ MAX_INT8,
107
+ MAX_INT16,
101
108
  MAX_INT32,
102
109
  MAX_INT64,
103
110
  MAX_UINT8,
@@ -106,6 +113,8 @@ from utilities.math import (
106
113
  MAX_UINT64,
107
114
  MIN_FLOAT32,
108
115
  MIN_FLOAT64,
116
+ MIN_INT8,
117
+ MIN_INT16,
109
118
  MIN_INT32,
110
119
  MIN_INT64,
111
120
  MIN_UINT8,
@@ -120,12 +129,14 @@ from utilities.version import Version
120
129
  from utilities.whenever import (
121
130
  DATE_TWO_DIGIT_YEAR_MAX,
122
131
  DATE_TWO_DIGIT_YEAR_MIN,
132
+ DatePeriod,
133
+ TimePeriod,
134
+ ZonedDateTimePeriod,
123
135
  to_days,
124
136
  to_nanoseconds,
125
137
  )
126
138
 
127
139
  if TYPE_CHECKING:
128
- from collections.abc import Iterable
129
140
  from collections.abc import Set as AbstractSet
130
141
  from zoneinfo import ZoneInfo
131
142
 
@@ -195,6 +206,20 @@ class TestDateDeltas:
195
206
  assert DateDelta.parse_common_iso(delta.format_common_iso()) == delta
196
207
 
197
208
 
209
+ class TestDatePeriods:
210
+ @given(data=data())
211
+ def test_main(self, *, data: DataObject) -> None:
212
+ min_value = data.draw(dates() | none())
213
+ max_value = data.draw(dates() | none())
214
+ with assume_does_not_raise(InvalidArgument):
215
+ period = data.draw(date_periods(min_value=min_value, max_value=max_value))
216
+ assert isinstance(period, DatePeriod)
217
+ if min_value is not None:
218
+ assert period.start >= min_value
219
+ if max_value is not None:
220
+ assert period.end <= max_value
221
+
222
+
198
223
  class TestDateTimeDeltas:
199
224
  @given(data=data(), parsable=booleans())
200
225
  def test_main(self, *, data: DataObject, parsable: bool) -> None:
@@ -347,17 +372,27 @@ class TestDraw2:
347
372
  class TestFloat32s:
348
373
  @given(data=data())
349
374
  def test_main(self, *, data: DataObject) -> None:
350
- min_value, max_value = data.draw(pairs(float32s(), sorted=True))
351
- x = data.draw(float32s(min_value=min_value, max_value=max_value))
352
- assert max(min_value, MIN_FLOAT32) <= x <= min(max_value, MAX_FLOAT32)
375
+ min_value, max_value = data.draw(pairs(float32s() | none()))
376
+ with assume_does_not_raise(InvalidArgument):
377
+ x = data.draw(float32s(min_value=min_value, max_value=max_value))
378
+ assert MIN_FLOAT32 <= x <= MAX_FLOAT32
379
+ if min_value is not None:
380
+ assert x >= min_value
381
+ if max_value is not None:
382
+ assert x <= max_value
353
383
 
354
384
 
355
385
  class TestFloat64s:
356
386
  @given(data=data())
357
387
  def test_main(self, *, data: DataObject) -> None:
358
- min_value, max_value = data.draw(pairs(float64s(), sorted=True))
359
- x = data.draw(float64s(min_value=min_value, max_value=max_value))
360
- assert max(min_value, MIN_FLOAT64) <= x <= min(max_value, MAX_FLOAT64)
388
+ min_value, max_value = data.draw(pairs(float64s() | none()))
389
+ with assume_does_not_raise(InvalidArgument):
390
+ x = data.draw(float64s(min_value=min_value, max_value=max_value))
391
+ assert MIN_FLOAT64 <= x <= MAX_FLOAT64
392
+ if min_value is not None:
393
+ assert x >= min_value
394
+ if max_value is not None:
395
+ assert x <= max_value
361
396
 
362
397
 
363
398
  class TestFloatArrays:
@@ -574,20 +609,56 @@ class TestIntArrays:
574
609
  assert len(set(flat)) == len(flat)
575
610
 
576
611
 
612
+ class TestInt8s:
613
+ @given(data=data())
614
+ def test_main(self, *, data: DataObject) -> None:
615
+ min_value, max_value = data.draw(pairs(int8s() | none()))
616
+ with assume_does_not_raise(InvalidArgument):
617
+ x = data.draw(int8s(min_value=min_value, max_value=max_value))
618
+ assert MIN_INT8 <= x <= MAX_INT8
619
+ if min_value is not None:
620
+ assert x >= min_value
621
+ if max_value is not None:
622
+ assert x <= max_value
623
+
624
+
625
+ class TestInt16s:
626
+ @given(data=data())
627
+ def test_main(self, *, data: DataObject) -> None:
628
+ min_value, max_value = data.draw(pairs(int16s() | none()))
629
+ with assume_does_not_raise(InvalidArgument):
630
+ x = data.draw(int16s(min_value=min_value, max_value=max_value))
631
+ assert MIN_INT16 <= x <= MAX_INT16
632
+ if min_value is not None:
633
+ assert x >= min_value
634
+ if max_value is not None:
635
+ assert x <= max_value
636
+
637
+
577
638
  class TestInt32s:
578
639
  @given(data=data())
579
640
  def test_main(self, *, data: DataObject) -> None:
580
- min_value, max_value = data.draw(pairs(int32s(), sorted=True))
581
- x = data.draw(int32s(min_value=min_value, max_value=max_value))
582
- assert max(min_value, MIN_INT32) <= x <= min(max_value, MAX_INT32)
641
+ min_value, max_value = data.draw(pairs(int32s() | none()))
642
+ with assume_does_not_raise(InvalidArgument):
643
+ x = data.draw(int32s(min_value=min_value, max_value=max_value))
644
+ assert MIN_INT32 <= x <= MAX_INT32
645
+ if min_value is not None:
646
+ assert x >= min_value
647
+ if max_value is not None:
648
+ assert x <= max_value
583
649
 
584
650
 
585
651
  class TestInt64s:
586
652
  @given(data=data())
587
653
  def test_main(self, *, data: DataObject) -> None:
588
- min_value, max_value = data.draw(pairs(int64s(), sorted=True))
589
- x = data.draw(int64s(min_value=min_value, max_value=max_value))
590
- assert max(min_value, MIN_INT64) <= x <= min(max_value, MAX_INT64)
654
+ min_value, max_value = data.draw(pairs(int64s() | none()))
655
+ with assume_does_not_raise(InvalidArgument):
656
+ x = data.draw(int64s(min_value=min_value, max_value=max_value))
657
+ assert MIN_INT64 <= x <= MAX_INT64
658
+ if min_value is not None:
659
+ assert x >= min_value
660
+ if max_value is not None:
661
+ assert x <= max_value
591
662
 
592
663
 
593
664
  class TestListsFixedLength:
@@ -671,11 +742,11 @@ class TestPaths:
671
742
  class TestPlainDateTimes:
672
743
  @given(data=data())
673
744
  def test_main(self, *, data: DataObject) -> None:
674
- min_value = data.draw(plain_datetimes() | none())
675
- max_value = data.draw(plain_datetimes() | none())
745
+ min_value = data.draw(plain_date_times() | none())
746
+ max_value = data.draw(plain_date_times() | none())
676
747
  with assume_does_not_raise(InvalidArgument):
677
748
  datetime = data.draw(
678
- plain_datetimes(min_value=min_value, max_value=max_value)
749
+ plain_date_times(min_value=min_value, max_value=max_value)
679
750
  )
680
751
  assert isinstance(datetime, PlainDateTime)
681
752
  assert PlainDateTime.parse_common_iso(datetime.format_common_iso()) == datetime
@@ -722,13 +793,11 @@ class TestSetupHypothesisProfiles:
722
793
  def test_main(self) -> None:
723
794
  setup_hypothesis_profiles()
724
795
  curr = settings()
725
- assert Phase.shrink in cast("Iterable[Phase]", curr.phases)
726
796
  assert curr.max_examples in {10, 100, 1000}
727
797
 
728
798
  def test_no_shrink(self) -> None:
729
799
  with temp_environ({"HYPOTHESIS_NO_SHRINK": "1"}):
730
800
  setup_hypothesis_profiles()
731
- assert Phase.shrink not in cast("Iterable[Phase]", settings().phases)
732
801
 
733
802
  @given(max_examples=integers(1, 100))
734
803
  def test_max_examples(self, *, max_examples: int) -> None:
@@ -926,6 +995,20 @@ class TestTimeDeltas:
926
995
  assert delta <= max_value
927
996
 
928
997
 
998
+ class TestTimePeriods:
999
+ @given(data=data())
1000
+ def test_main(self, *, data: DataObject) -> None:
1001
+ min_value = data.draw(times() | none())
1002
+ max_value = data.draw(times() | none())
1003
+ with assume_does_not_raise(InvalidArgument):
1004
+ period = data.draw(time_periods(min_value=min_value, max_value=max_value))
1005
+ assert isinstance(period, TimePeriod)
1006
+ if min_value is not None:
1007
+ assert period.start >= min_value
1008
+ if max_value is not None:
1009
+ assert period.end <= max_value
1010
+
1011
+
929
1012
  class TestTimes:
930
1013
  @given(data=data())
931
1014
  def test_main(self, *, data: DataObject) -> None:
@@ -958,33 +1041,53 @@ class TestTriples:
958
1041
  class TestUInt8s:
959
1042
  @given(data=data())
960
1043
  def test_main(self, *, data: DataObject) -> None:
961
- min_value, max_value = data.draw(pairs(uint8s(), sorted=True))
962
- x = data.draw(uint8s(min_value=min_value, max_value=max_value))
963
- assert max(min_value, MIN_UINT8) <= x <= min(max_value, MAX_UINT8)
1044
+ min_value, max_value = data.draw(pairs(uint8s() | none()))
1045
+ with assume_does_not_raise(InvalidArgument):
1046
+ x = data.draw(uint8s(min_value=min_value, max_value=max_value))
1047
+ assert MIN_UINT8 <= x <= MAX_UINT8
1048
+ if min_value is not None:
1049
+ assert x >= min_value
1050
+ if max_value is not None:
1051
+ assert x <= max_value
964
1052
 
965
1053
 
966
1054
  class TestUInt16s:
967
1055
  @given(data=data())
968
1056
  def test_main(self, *, data: DataObject) -> None:
969
- min_value, max_value = data.draw(pairs(uint16s(), sorted=True))
970
- x = data.draw(uint16s(min_value=min_value, max_value=max_value))
971
- assert max(min_value, MIN_UINT16) <= x <= min(max_value, MAX_UINT16)
1057
+ min_value, max_value = data.draw(pairs(uint16s() | none()))
1058
+ with assume_does_not_raise(InvalidArgument):
1059
+ x = data.draw(uint16s(min_value=min_value, max_value=max_value))
1060
+ assert MIN_UINT16 <= x <= MAX_UINT16
1061
+ if min_value is not None:
1062
+ assert x >= min_value
1063
+ if max_value is not None:
1064
+ assert x <= max_value
972
1065
 
973
1066
 
974
1067
  class TestUInt32s:
975
1068
  @given(data=data())
976
1069
  def test_main(self, *, data: DataObject) -> None:
977
- min_value, max_value = data.draw(pairs(uint32s(), sorted=True))
978
- x = data.draw(uint32s(min_value=min_value, max_value=max_value))
979
- assert max(min_value, MIN_UINT32) <= x <= min(max_value, MAX_UINT32)
1070
+ min_value, max_value = data.draw(pairs(uint32s() | none()))
1071
+ with assume_does_not_raise(InvalidArgument):
1072
+ x = data.draw(uint32s(min_value=min_value, max_value=max_value))
1073
+ assert MIN_UINT32 <= x <= MAX_UINT32
1074
+ if min_value is not None:
1075
+ assert x >= min_value
1076
+ if max_value is not None:
1077
+ assert x <= max_value
980
1078
 
981
1079
 
982
1080
  class TestUInt64s:
983
1081
  @given(data=data())
984
1082
  def test_main(self, *, data: DataObject) -> None:
985
- min_value, max_value = data.draw(pairs(uint64s(), sorted=True))
986
- x = data.draw(uint64s(min_value=min_value, max_value=max_value))
987
- assert max(min_value, MIN_UINT64) <= x <= min(max_value, MAX_UINT64)
1083
+ min_value, max_value = data.draw(pairs(uint64s() | none()))
1084
+ with assume_does_not_raise(InvalidArgument):
1085
+ x = data.draw(uint64s(min_value=min_value, max_value=max_value))
1086
+ assert MIN_UINT64 <= x <= MAX_UINT64
1087
+ if min_value is not None:
1088
+ assert x >= min_value
1089
+ if max_value is not None:
1090
+ assert x <= max_value
988
1091
 
989
1092
 
990
1093
  class TestURLs:
@@ -1063,14 +1166,33 @@ class TestYearMonths:
1063
1166
  assert year_month.on_day(28) <= DATE_TWO_DIGIT_YEAR_MAX
1064
1167
 
1065
1168
 
1169
+ class TestZonedDateTimePeriods:
1170
+ @given(data=data(), time_zone=timezones())
1171
+ def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1172
+ min_value = data.draw(zoned_date_times() | none())
1173
+ max_value = data.draw(zoned_date_times() | none())
1174
+ with assume_does_not_raise(InvalidArgument):
1175
+ period = data.draw(
1176
+ zoned_date_time_periods(
1177
+ min_value=min_value, max_value=max_value, time_zone=time_zone
1178
+ )
1179
+ )
1180
+ assert isinstance(period, ZonedDateTimePeriod)
1181
+ assert period.time_zone is time_zone
1182
+ if min_value is not None:
1183
+ assert period.start >= min_value
1184
+ if max_value is not None:
1185
+ assert period.end <= max_value
1186
+
1187
+
1066
1188
  class TestZonedDateTimes:
1067
1189
  @given(data=data(), time_zone=timezones())
1068
1190
  def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1069
- min_value = data.draw(zoned_datetimes() | none())
1070
- max_value = data.draw(zoned_datetimes() | none())
1191
+ min_value = data.draw(zoned_date_times() | none())
1192
+ max_value = data.draw(zoned_date_times() | none())
1071
1193
  with assume_does_not_raise(InvalidArgument):
1072
1194
  datetime = data.draw(
1073
- zoned_datetimes(
1195
+ zoned_date_times(
1074
1196
  min_value=min_value, max_value=max_value, time_zone=time_zone
1075
1197
  )
1076
1198
  )
@@ -1087,5 +1209,5 @@ class TestZonedDateTimes:
1087
1209
  def test_examples(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1088
1210
  with assume_does_not_raise(TimeZoneNotFoundError):
1089
1211
  max_value = ZonedDateTime(1, 1, 2, tz=time_zone.key)
1090
- datetime = data.draw(zoned_datetimes(max_value=max_value, time_zone=time_zone))
1212
+ datetime = data.draw(zoned_date_times(max_value=max_value, time_zone=time_zone))
1091
1213
  _ = datetime.py_datetime()
@@ -12,7 +12,7 @@ from hypothesis.strategies import booleans, integers
12
12
  from pytest import LogCaptureFixture, mark, param, raises
13
13
 
14
14
  from tests.conftest import SKIPIF_CI_AND_WINDOWS
15
- from utilities.hypothesis import pairs, temp_paths, text_ascii, zoned_datetimes
15
+ from utilities.hypothesis import pairs, temp_paths, text_ascii, zoned_date_times
16
16
  from utilities.iterables import one
17
17
  from utilities.logging import (
18
18
  GetLoggingLevelNumberError,
@@ -274,7 +274,7 @@ class TestRotatingLogFile:
274
274
  assert result.start is None
275
275
  assert result.end is None
276
276
 
277
- @given(index=integers(min_value=1), end=zoned_datetimes())
277
+ @given(index=integers(min_value=1), end=zoned_date_times())
278
278
  def test_from_path_with_index_and_end(
279
279
  self, *, index: int, end: ZonedDateTime
280
280
  ) -> None:
@@ -287,7 +287,9 @@ class TestRotatingLogFile:
287
287
  assert result.start is None
288
288
  assert result.end == end.round()
289
289
 
290
- @given(index=integers(min_value=1), datetimes=pairs(zoned_datetimes(), sorted=True))
290
+ @given(
291
+ index=integers(min_value=1), datetimes=pairs(zoned_date_times(), sorted=True)
292
+ )
291
293
  def test_from_path_with_index_start_and_end(
292
294
  self, *, index: int, datetimes: tuple[ZonedDateTime, ZonedDateTime]
293
295
  ) -> None:
@@ -315,7 +317,7 @@ class TestRotatingLogFile:
315
317
  file = _RotatingLogFile(directory=root, stem="log", suffix=".txt", index=index)
316
318
  assert file.path == root.joinpath(f"log.{index}.txt")
317
319
 
318
- @given(root=temp_paths(), index=integers(min_value=1), end=zoned_datetimes())
320
+ @given(root=temp_paths(), index=integers(min_value=1), end=zoned_date_times())
319
321
  def test_path_with_index_and_end(
320
322
  self, *, root: Path, index: int, end: ZonedDateTime
321
323
  ) -> None:
@@ -327,7 +329,7 @@ class TestRotatingLogFile:
327
329
  @given(
328
330
  root=temp_paths(),
329
331
  index=integers(min_value=1),
330
- datetimes=pairs(zoned_datetimes(), sorted=True),
332
+ datetimes=pairs(zoned_date_times(), sorted=True),
331
333
  )
332
334
  def test_path_with_index_start_and_end(
333
335
  self, *, root: Path, index: int, datetimes: tuple[ZonedDateTime, ZonedDateTime]
@@ -37,20 +37,23 @@ from tests.test_typing_funcs.with_future import (
37
37
  from utilities.hypothesis import (
38
38
  assume_does_not_raise,
39
39
  date_deltas,
40
+ date_periods,
40
41
  date_time_deltas,
41
42
  dates,
42
43
  int64s,
43
44
  month_days,
44
45
  paths,
45
- plain_datetimes,
46
+ plain_date_times,
46
47
  py_datetimes,
47
48
  text_ascii,
48
49
  text_printable,
49
50
  time_deltas,
51
+ time_periods,
50
52
  times,
51
53
  versions,
52
54
  year_months,
53
- zoned_datetimes,
55
+ zoned_date_time_periods,
56
+ zoned_date_times,
54
57
  )
55
58
  from utilities.math import MAX_INT64, MIN_INT64
56
59
 
@@ -82,6 +85,7 @@ def objects(
82
85
  ) -> SearchStrategy[Any]:
83
86
  base = (
84
87
  booleans()
88
+ | date_periods()
85
89
  | dates()
86
90
  | hypothesis.strategies.dates()
87
91
  | py_datetimes(zoned=booleans())
@@ -90,15 +94,17 @@ def objects(
90
94
  | month_days()
91
95
  | none()
92
96
  | paths()
93
- | plain_datetimes()
97
+ | plain_date_times()
94
98
  | text_printable().filter(lambda x: not x.startswith("["))
95
99
  | time_deltas()
100
+ | time_periods()
96
101
  | times()
97
102
  | hypothesis.strategies.times()
98
103
  | uuids()
99
104
  | versions()
100
105
  | year_months()
101
- | zoned_datetimes()
106
+ | zoned_date_time_periods()
107
+ | zoned_date_times()
102
108
  )
103
109
  if dataclass_custom_equality:
104
110
  base |= builds(DataClassFutureCustomEquality)
@@ -52,13 +52,15 @@ from tests.test_typing_funcs.with_future import (
52
52
  )
53
53
  from utilities.functions import is_sequence_of
54
54
  from utilities.hypothesis import (
55
+ date_periods,
55
56
  dates,
56
57
  int64s,
57
58
  paths,
58
59
  temp_paths,
59
60
  text_ascii,
60
61
  text_printable,
61
- zoned_datetimes,
62
+ time_periods,
63
+ zoned_date_times,
62
64
  )
63
65
  from utilities.iterables import always_iterable, one
64
66
  from utilities.logging import get_logging_level_number
@@ -84,7 +86,7 @@ from utilities.sentinel import Sentinel, sentinel
84
86
  from utilities.types import LogLevel, MaybeIterable, PathLike
85
87
  from utilities.typing import get_args
86
88
  from utilities.tzlocal import LOCAL_TIME_ZONE
87
- from utilities.whenever import MINUTE, SECOND, get_now
89
+ from utilities.whenever import MINUTE, SECOND, DatePeriod, TimePeriod, get_now
88
90
 
89
91
  if TYPE_CHECKING:
90
92
  from collections.abc import Sequence
@@ -203,9 +205,9 @@ class TestGetLogRecords:
203
205
  date=dates() | none(),
204
206
  min_date=dates() | none(),
205
207
  max_date=dates() | none(),
206
- datetime=zoned_datetimes() | none(),
207
- min_datetime=zoned_datetimes() | none(),
208
- max_datetime=zoned_datetimes() | none(),
208
+ datetime=zoned_date_times() | none(),
209
+ min_datetime=zoned_date_times() | none(),
210
+ max_datetime=zoned_date_times() | none(),
209
211
  func_name=booleans() | text_ascii() | none(),
210
212
  extra=booleans() | text_ascii() | sets(text_ascii()) | none(),
211
213
  log_file=booleans() | paths() | text_ascii() | none(),
@@ -581,6 +583,11 @@ class TestSerializeAndDeserialize:
581
583
  ):
582
584
  _ = deserialize(ser, objects=set())
583
585
 
586
+ @given(period=date_periods())
587
+ def test_date_periods(self, *, period: DatePeriod) -> None:
588
+ result = deserialize(serialize(period))
589
+ assert result == period
590
+
584
591
  def test_deserialize_hook(self) -> None:
585
592
  obj = DataClassFutureDefaultInInitChild()
586
593
  ser = serialize(obj)
@@ -645,6 +652,11 @@ class TestSerializeAndDeserialize:
645
652
  result = deserialize(serialize(obj), objects={SubTuple})
646
653
  assert is_equal(result, obj)
647
654
 
655
+ @given(period=time_periods())
656
+ def test_time_periods(self, *, period: TimePeriod) -> None:
657
+ result = deserialize(serialize(period))
658
+ assert result == period
659
+
648
660
  def test_unserializable(self) -> None:
649
661
  ser = serialize(sentinel)
650
662
  exp_ser = b'{"[dc|Unserializable]":{"qualname":"Sentinel","repr":"<sentinel>","str":"<sentinel>"}}'
@@ -666,7 +678,7 @@ class TestSerialize:
666
678
  def test_dataclass(self) -> None:
667
679
  obj = DataClassFutureNone(none=None)
668
680
  result = serialize(obj)
669
- expected = b'{"[dc|DataClassFutureNone]":{"none":"[none]"}}'
681
+ expected = b'{"[dc|DataClassFutureNone]":{"none":"[0]"}}'
670
682
  assert result == expected
671
683
 
672
684
  def test_dataclass_nested(self) -> None:
@@ -708,6 +720,11 @@ class TestSerialize:
708
720
  expected = b'{"[ex|TestSerialize.test_exception_instance.<locals>.CustomError]":{"[tu]":[1,2,3]}}'
709
721
  assert result == expected
710
722
 
723
+ def test_none(self) -> None:
724
+ result = serialize(None)
725
+ expected = b'"[0]"'
726
+ assert result == expected
727
+
711
728
  @given(x=sampled_from([MIN_INT64 - 1, MAX_INT64 + 1]))
712
729
  def test_pre_process(self, *, x: int) -> None:
713
730
  with raises(_SerializeIntegerError, match="Integer .* is out of range"):