dycw-utilities 0.154.0__tar.gz → 0.155.1__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.1}/PKG-INFO +2 -3
  2. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/pyproject.toml +6 -10
  3. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_altair.py +2 -2
  4. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_click.py +4 -4
  5. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_hypothesis.py +173 -42
  6. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_logging.py +7 -5
  7. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_objects/objects.py +10 -4
  8. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_orjson.py +23 -6
  9. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_parse.py +4 -4
  10. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_polars.py +160 -106
  11. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy_polars.py +2 -2
  12. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typed_settings.py +6 -6
  13. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing.py +147 -7
  14. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/with_future.py +63 -4
  15. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_whenever.py +119 -212
  16. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_zoneinfo.py +4 -4
  17. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/__init__.py +1 -1
  18. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/hypothesis.py +151 -42
  19. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/orjson.py +45 -12
  20. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/polars.py +76 -43
  21. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_regressions.py +3 -1
  22. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/traceback.py +1 -1
  23. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/typing.py +9 -2
  24. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/whenever.py +10 -0
  25. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/.gitignore +0 -0
  26. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/LICENSE +0 -0
  27. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/README.md +0 -0
  28. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/__init__.py +0 -0
  29. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/conftest.py +0 -0
  30. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/__init__.py +0 -0
  31. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/__init__.py +0 -0
  32. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/module.py +0 -0
  33. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/__init__.py +0 -0
  34. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_1.py +0 -0
  35. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_2.py +0 -0
  36. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  37. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  38. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  39. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  40. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/__init__.py +0 -0
  41. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_1.py +0 -0
  42. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_2.py +0 -0
  43. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/standalone.py +0 -0
  44. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/modules/with_imports.py +0 -0
  45. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  46. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  47. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  48. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  49. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  50. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  51. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  52. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  53. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_asyncio.py +0 -0
  54. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_atomicwrites.py +0 -0
  55. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_atools.py +0 -0
  56. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_cachetools.py +0 -0
  57. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_concurrent.py +0 -0
  58. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_contextlib.py +0 -0
  59. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_contextvars.py +0 -0
  60. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_cryptography.py +0 -0
  61. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_cvxpy.py +0 -0
  62. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_dataclasses.py +0 -0
  63. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_enum.py +0 -0
  64. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_errors.py +0 -0
  65. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_eventkit.py +0 -0
  66. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_fastapi.py +0 -0
  67. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_fpdf2.py +0 -0
  68. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_functions.py +0 -0
  69. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_functools.py +0 -0
  70. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_getpass.py +0 -0
  71. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_gzip.py +0 -0
  72. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_hashlib.py +0 -0
  73. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_http.py +0 -0
  74. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_importlib.py +0 -0
  75. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_inflect.py +0 -0
  76. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_ipython.py +0 -0
  77. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_iterables.py +0 -0
  78. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_json.py +0 -0
  79. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_jupyter.py +0 -0
  80. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_libcst.py +0 -0
  81. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_lightweight_charts.py +0 -0
  82. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_math.py +0 -0
  83. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_memory_profiler.py +0 -0
  84. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_modules.py +0 -0
  85. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_more_itertools.py +0 -0
  86. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_numpy.py +0 -0
  87. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_objects/__init__.py +0 -0
  88. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_operator.py +0 -0
  89. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_optuna.py +0 -0
  90. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_os.py +0 -0
  91. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pathlib.py +0 -0
  92. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pickle.py +0 -0
  93. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_platform.py +0 -0
  94. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_polars_ols.py +0 -0
  95. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_postgres.py +0 -0
  96. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pottery.py +0 -0
  97. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pqdm.py +0 -0
  98. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_psutil.py +0 -0
  99. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pyinstrument.py +0 -0
  100. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pytest.py +0 -0
  101. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_randomly.py +0 -0
  102. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_regressions.py +0 -0
  103. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_random.py +0 -0
  104. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_re.py +0 -0
  105. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_redis.py +0 -0
  106. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_reprlib.py +0 -0
  107. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_scipy.py +0 -0
  108. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_sentinel.py +0 -0
  109. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_shelve.py +0 -0
  110. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_slack_sdk.py +0 -0
  111. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_socket.py +0 -0
  112. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy.py +0 -0
  113. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_statsmodels.py +0 -0
  114. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_string.py +0 -0
  115. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_tempfile.py +0 -0
  116. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_text.py +0 -0
  117. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_threading.py +0 -0
  118. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_timer.py +0 -0
  119. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_traceback.py +0 -0
  120. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_types.py +0 -0
  121. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/__init__.py +0 -0
  122. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/no_future.py +0 -0
  123. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_tzdata.py +0 -0
  124. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_tzlocal.py +0 -0
  125. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_uuid.py +0 -0
  126. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_version.py +0 -0
  127. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_warnings.py +0 -0
  128. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/__init__.py +0 -0
  129. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.py +0 -0
  130. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.sh +0 -0
  131. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/tests/test_zipfile.py +0 -0
  132. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/altair.py +0 -0
  133. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/asyncio.py +0 -0
  134. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/atomicwrites.py +0 -0
  135. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/atools.py +0 -0
  136. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/cachetools.py +0 -0
  137. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/click.py +0 -0
  138. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/concurrent.py +0 -0
  139. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/contextlib.py +0 -0
  140. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/contextvars.py +0 -0
  141. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/cryptography.py +0 -0
  142. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/cvxpy.py +0 -0
  143. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/dataclasses.py +0 -0
  144. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/enum.py +0 -0
  145. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/errors.py +0 -0
  146. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/eventkit.py +0 -0
  147. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/fastapi.py +0 -0
  148. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/fpdf2.py +0 -0
  149. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/functions.py +0 -0
  150. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/functools.py +0 -0
  151. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/getpass.py +0 -0
  152. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/gzip.py +0 -0
  153. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/hashlib.py +0 -0
  154. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/http.py +0 -0
  155. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/importlib.py +0 -0
  156. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/inflect.py +0 -0
  157. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/ipython.py +0 -0
  158. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/iterables.py +0 -0
  159. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/json.py +0 -0
  160. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/jupyter.py +0 -0
  161. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/libcst.py +0 -0
  162. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/lightweight_charts.py +0 -0
  163. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/logging.py +0 -0
  164. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/math.py +0 -0
  165. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/memory_profiler.py +0 -0
  166. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/modules.py +0 -0
  167. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/more_itertools.py +0 -0
  168. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/numpy.py +0 -0
  169. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/operator.py +0 -0
  170. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/optuna.py +0 -0
  171. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pathlib.py +0 -0
  174. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pickle.py +0 -0
  175. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/platform.py +0 -0
  176. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/postgres.py +0 -0
  178. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pottery.py +0 -0
  179. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pqdm.py +0 -0
  180. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/psutil.py +0 -0
  181. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/py.typed +0 -0
  182. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pyinstrument.py +0 -0
  183. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest.py +0 -0
  184. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/__init__.py +0 -0
  185. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  186. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  187. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/random.py +0 -0
  188. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/re.py +0 -0
  189. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/redis.py +0 -0
  190. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/reprlib.py +0 -0
  191. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/scipy.py +0 -0
  192. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/sentinel.py +0 -0
  193. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/shelve.py +0 -0
  194. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/slack_sdk.py +0 -0
  195. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/socket.py +0 -0
  196. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy.py +0 -0
  197. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy_polars.py +0 -0
  198. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/statsmodels.py +0 -0
  199. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/string.py +0 -0
  200. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/tempfile.py +0 -0
  201. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/text.py +0 -0
  202. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/threading.py +0 -0
  203. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/timer.py +0 -0
  204. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/typed_settings.py +0 -0
  205. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/types.py +0 -0
  206. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/tzdata.py +0 -0
  207. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/tzlocal.py +0 -0
  208. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/uuid.py +0 -0
  209. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/version.py +0 -0
  210. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/warnings.py +0 -0
  211. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/src/utilities/zipfile.py +0 -0
  212. {dycw_utilities-0.154.0 → dycw_utilities-0.155.1}/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.1
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -12,8 +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'
16
- Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
15
+ Requires-Dist: hypothesis<6.138,>=6.137.1; extra == 'test'
17
16
  Requires-Dist: pytest-asyncio<1.2,>=1.1.0; extra == 'test'
18
17
  Requires-Dist: pytest-cov<6.3,>=6.2.1; extra == 'test'
19
18
  Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
@@ -44,7 +44,6 @@ dev = [
44
44
  "coloredlogs >=15.0.1, <15.1",
45
45
  "coverage-conditional-plugin >=0.9.0, <0.10",
46
46
  "dycw-pytest-only >=2.1.1, <2.2",
47
- "pudb >=2025.1, <2025.2",
48
47
  "pyright[nodejs] >=1.1.401, <1.2",
49
48
  "pytest-cov >=6.2.1, <6.3",
50
49
  "pytest-timeout >=2.4.0, <2.5",
@@ -69,7 +68,7 @@ http-test = [
69
68
  "orjson",
70
69
  ]
71
70
  hypothesis = [
72
- "hypothesis >=6.136.7, <6.137",
71
+ "hypothesis >=6.137.1, <6.138",
73
72
  ]
74
73
  hypothesis-test = [
75
74
  "libcst",
@@ -119,7 +118,7 @@ orjson-test = [
119
118
  "polars",
120
119
  ]
121
120
  polars = [
122
- "polars >=1.32.0, <1.33",
121
+ "polars >=1.32.2, <1.33",
123
122
  ]
124
123
  polars-ols = [
125
124
  "polars-ols >=0.3.5, <0.4",
@@ -148,7 +147,6 @@ pyinstrument = [
148
147
  "pyinstrument >=5.0.3, <5.1",
149
148
  ]
150
149
  pytest = [
151
- "pudb >=2025.1, <2025.2",
152
150
  "pytest >=8.4.1, <8.5",
153
151
  "pytest-asyncio >=1.1.0, <1.2",
154
152
  "pytest-randomly >=3.16.0, <3.17",
@@ -168,7 +166,7 @@ pytest-test = [
168
166
  "pytest-rerunfailures",
169
167
  ]
170
168
  redis = [
171
- "redis >=6.2.0, <6.3",
169
+ "redis >=6.4.0, <6.5",
172
170
  "orjson",
173
171
  ]
174
172
  redis-test = [
@@ -229,7 +227,7 @@ dependencies = [
229
227
  name = "dycw-utilities"
230
228
  readme = "README.md"
231
229
  requires-python = ">= 3.12"
232
- version = "0.154.0"
230
+ version = "0.155.1"
233
231
 
234
232
  [project.entry-points.pytest11]
235
233
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -241,8 +239,7 @@ logging = [
241
239
  ]
242
240
  test = [
243
241
  "dycw-pytest-only >=2.1.1, <2.2",
244
- "hypothesis >=6.136.7, <6.137",
245
- "pudb >=2025.1, <2025.2",
242
+ "hypothesis >=6.137.1, <6.138",
246
243
  "pytest >=8.4.1, <8.5",
247
244
  "pytest-asyncio >=1.1.0, <1.2",
248
245
  "pytest-cov >=6.2.1, <6.3",
@@ -262,7 +259,7 @@ test = [
262
259
  # bump-my-version
263
260
  [tool.bumpversion]
264
261
  allow_dirty = true
265
- current_version = "0.154.0"
262
+ current_version = "0.155.1"
266
263
 
267
264
  [[tool.bumpversion.files]]
268
265
  filename = "src/utilities/__init__.py"
@@ -366,7 +363,6 @@ addopts = [
366
363
  "--color=auto",
367
364
  "--durations=10",
368
365
  "--durations-min=10",
369
- "--pdbcls=pudb.debugger:Debugger",
370
366
  "--strict-markers",
371
367
  "--timeout=600",
372
368
  ]
@@ -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
  ),
@@ -1,11 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import datetime as dt
3
4
  from itertools import pairwise
4
5
  from pathlib import Path
5
6
  from re import search
6
7
  from typing import TYPE_CHECKING, Any, cast
7
8
 
8
- from hypothesis import Phase, assume, given, settings
9
+ from hypothesis import assume, given, settings
9
10
  from hypothesis.errors import InvalidArgument
10
11
  from hypothesis.extra.numpy import array_shapes
11
12
  from hypothesis.strategies import (
@@ -46,6 +47,7 @@ from utilities.hypothesis import (
46
47
  assume_does_not_raise,
47
48
  bool_arrays,
48
49
  date_deltas,
50
+ date_periods,
49
51
  date_time_deltas,
50
52
  dates,
51
53
  draw2,
@@ -57,6 +59,8 @@ from utilities.hypothesis import (
57
59
  hashables,
58
60
  import_froms,
59
61
  imports,
62
+ int8s,
63
+ int16s,
60
64
  int32s,
61
65
  int64s,
62
66
  int_arrays,
@@ -65,7 +69,7 @@ from utilities.hypothesis import (
65
69
  numbers,
66
70
  pairs,
67
71
  paths,
68
- plain_datetimes,
72
+ plain_date_times,
69
73
  random_states,
70
74
  sentinels,
71
75
  sets_fixed_length,
@@ -82,6 +86,7 @@ from utilities.hypothesis import (
82
86
  text_digits,
83
87
  text_printable,
84
88
  time_deltas,
89
+ time_periods,
85
90
  times,
86
91
  triples,
87
92
  uint8s,
@@ -91,13 +96,16 @@ from utilities.hypothesis import (
91
96
  urls,
92
97
  versions,
93
98
  year_months,
94
- zoned_datetimes,
99
+ zoned_date_time_periods,
100
+ zoned_date_times,
95
101
  )
96
102
  from utilities.iterables import one
97
103
  from utilities.libcst import parse_import
98
104
  from utilities.math import (
99
105
  MAX_FLOAT32,
100
106
  MAX_FLOAT64,
107
+ MAX_INT8,
108
+ MAX_INT16,
101
109
  MAX_INT32,
102
110
  MAX_INT64,
103
111
  MAX_UINT8,
@@ -106,6 +114,8 @@ from utilities.math import (
106
114
  MAX_UINT64,
107
115
  MIN_FLOAT32,
108
116
  MIN_FLOAT64,
117
+ MIN_INT8,
118
+ MIN_INT16,
109
119
  MIN_INT32,
110
120
  MIN_INT64,
111
121
  MIN_UINT8,
@@ -120,12 +130,15 @@ from utilities.version import Version
120
130
  from utilities.whenever import (
121
131
  DATE_TWO_DIGIT_YEAR_MAX,
122
132
  DATE_TWO_DIGIT_YEAR_MIN,
133
+ DatePeriod,
134
+ TimePeriod,
135
+ ZonedDateTimePeriod,
123
136
  to_days,
124
137
  to_nanoseconds,
138
+ to_py_time_delta,
125
139
  )
126
140
 
127
141
  if TYPE_CHECKING:
128
- from collections.abc import Iterable
129
142
  from collections.abc import Set as AbstractSet
130
143
  from zoneinfo import ZoneInfo
131
144
 
@@ -186,6 +199,7 @@ class TestDateDeltas:
186
199
  date_deltas(min_value=min_value, max_value=max_value, parsable=parsable)
187
200
  )
188
201
  assert isinstance(delta, DateDelta)
202
+ assert isinstance(to_py_time_delta(delta), dt.timedelta)
189
203
  days = to_days(delta)
190
204
  if min_value is not None:
191
205
  assert days >= to_days(min_value)
@@ -195,15 +209,32 @@ class TestDateDeltas:
195
209
  assert DateDelta.parse_common_iso(delta.format_common_iso()) == delta
196
210
 
197
211
 
212
+ class TestDatePeriods:
213
+ @given(data=data())
214
+ def test_main(self, *, data: DataObject) -> None:
215
+ min_value = data.draw(dates() | none())
216
+ max_value = data.draw(dates() | none())
217
+ with assume_does_not_raise(InvalidArgument):
218
+ period = data.draw(date_periods(min_value=min_value, max_value=max_value))
219
+ assert isinstance(period, DatePeriod)
220
+ if min_value is not None:
221
+ assert period.start >= min_value
222
+ if max_value is not None:
223
+ assert period.end <= max_value
224
+
225
+
198
226
  class TestDateTimeDeltas:
199
- @given(data=data(), parsable=booleans())
200
- def test_main(self, *, data: DataObject, parsable: bool) -> None:
227
+ @given(data=data(), parsable=booleans(), nativable=booleans())
228
+ def test_main(self, *, data: DataObject, parsable: bool, nativable: bool) -> None:
201
229
  min_value = data.draw(date_time_deltas() | none())
202
230
  max_value = data.draw(date_time_deltas() | none())
203
231
  with assume_does_not_raise(InvalidArgument):
204
232
  delta = data.draw(
205
233
  date_time_deltas(
206
- min_value=min_value, max_value=max_value, parsable=parsable
234
+ min_value=min_value,
235
+ max_value=max_value,
236
+ parsable=parsable,
237
+ nativable=nativable,
207
238
  )
208
239
  )
209
240
  assert isinstance(delta, DateTimeDelta)
@@ -214,6 +245,8 @@ class TestDateTimeDeltas:
214
245
  assert nanos <= to_nanoseconds(max_value)
215
246
  if parsable:
216
247
  assert DateTimeDelta.parse_common_iso(delta.format_common_iso()) == delta
248
+ if nativable:
249
+ assert isinstance(to_py_time_delta(delta), dt.timedelta)
217
250
 
218
251
 
219
252
  class TestDates:
@@ -347,17 +380,27 @@ class TestDraw2:
347
380
  class TestFloat32s:
348
381
  @given(data=data())
349
382
  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)
383
+ min_value, max_value = data.draw(pairs(float32s() | none()))
384
+ with assume_does_not_raise(InvalidArgument):
385
+ x = data.draw(float32s(min_value=min_value, max_value=max_value))
386
+ assert MIN_FLOAT32 <= x <= MAX_FLOAT32
387
+ if min_value is not None:
388
+ assert x >= min_value
389
+ if max_value is not None:
390
+ assert x <= max_value
353
391
 
354
392
 
355
393
  class TestFloat64s:
356
394
  @given(data=data())
357
395
  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)
396
+ min_value, max_value = data.draw(pairs(float64s() | none()))
397
+ with assume_does_not_raise(InvalidArgument):
398
+ x = data.draw(float64s(min_value=min_value, max_value=max_value))
399
+ assert MIN_FLOAT64 <= x <= MAX_FLOAT64
400
+ if min_value is not None:
401
+ assert x >= min_value
402
+ if max_value is not None:
403
+ assert x <= max_value
361
404
 
362
405
 
363
406
  class TestFloatArrays:
@@ -574,20 +617,56 @@ class TestIntArrays:
574
617
  assert len(set(flat)) == len(flat)
575
618
 
576
619
 
620
+ class TestInt8s:
621
+ @given(data=data())
622
+ def test_main(self, *, data: DataObject) -> None:
623
+ min_value, max_value = data.draw(pairs(int8s() | none()))
624
+ with assume_does_not_raise(InvalidArgument):
625
+ x = data.draw(int8s(min_value=min_value, max_value=max_value))
626
+ assert MIN_INT8 <= x <= MAX_INT8
627
+ if min_value is not None:
628
+ assert x >= min_value
629
+ if max_value is not None:
630
+ assert x <= max_value
631
+
632
+
633
+ class TestInt16s:
634
+ @given(data=data())
635
+ def test_main(self, *, data: DataObject) -> None:
636
+ min_value, max_value = data.draw(pairs(int16s() | none()))
637
+ with assume_does_not_raise(InvalidArgument):
638
+ x = data.draw(int16s(min_value=min_value, max_value=max_value))
639
+ assert MIN_INT16 <= x <= MAX_INT16
640
+ if min_value is not None:
641
+ assert x >= min_value
642
+ if max_value is not None:
643
+ assert x <= max_value
644
+
645
+
577
646
  class TestInt32s:
578
647
  @given(data=data())
579
648
  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)
649
+ min_value, max_value = data.draw(pairs(int32s() | none()))
650
+ with assume_does_not_raise(InvalidArgument):
651
+ x = data.draw(int32s(min_value=min_value, max_value=max_value))
652
+ assert MIN_INT32 <= x <= MAX_INT32
653
+ if min_value is not None:
654
+ assert x >= min_value
655
+ if max_value is not None:
656
+ assert x <= max_value
583
657
 
584
658
 
585
659
  class TestInt64s:
586
660
  @given(data=data())
587
661
  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)
662
+ min_value, max_value = data.draw(pairs(int64s() | none()))
663
+ with assume_does_not_raise(InvalidArgument):
664
+ x = data.draw(int64s(min_value=min_value, max_value=max_value))
665
+ assert MIN_INT64 <= x <= MAX_INT64
666
+ if min_value is not None:
667
+ assert x >= min_value
668
+ if max_value is not None:
669
+ assert x <= max_value
591
670
 
592
671
 
593
672
  class TestListsFixedLength:
@@ -655,8 +734,8 @@ class TestPairs:
655
734
  class TestPaths:
656
735
  @given(data=data())
657
736
  def test_main(self, *, data: DataObject) -> None:
658
- min_depth = data.draw(integers(0, 5) | none())
659
- max_depth = data.draw(integers(0, 5) | none())
737
+ min_depth = data.draw(integers(0, 3) | none())
738
+ max_depth = data.draw(integers(0, 3) | none())
660
739
  with assume_does_not_raise(InvalidArgument):
661
740
  path = data.draw(paths(min_depth=min_depth, max_depth=max_depth))
662
741
  assert isinstance(path, Path)
@@ -671,11 +750,11 @@ class TestPaths:
671
750
  class TestPlainDateTimes:
672
751
  @given(data=data())
673
752
  def test_main(self, *, data: DataObject) -> None:
674
- min_value = data.draw(plain_datetimes() | none())
675
- max_value = data.draw(plain_datetimes() | none())
753
+ min_value = data.draw(plain_date_times() | none())
754
+ max_value = data.draw(plain_date_times() | none())
676
755
  with assume_does_not_raise(InvalidArgument):
677
756
  datetime = data.draw(
678
- plain_datetimes(min_value=min_value, max_value=max_value)
757
+ plain_date_times(min_value=min_value, max_value=max_value)
679
758
  )
680
759
  assert isinstance(datetime, PlainDateTime)
681
760
  assert PlainDateTime.parse_common_iso(datetime.format_common_iso()) == datetime
@@ -722,13 +801,11 @@ class TestSetupHypothesisProfiles:
722
801
  def test_main(self) -> None:
723
802
  setup_hypothesis_profiles()
724
803
  curr = settings()
725
- assert Phase.shrink in cast("Iterable[Phase]", curr.phases)
726
804
  assert curr.max_examples in {10, 100, 1000}
727
805
 
728
806
  def test_no_shrink(self) -> None:
729
807
  with temp_environ({"HYPOTHESIS_NO_SHRINK": "1"}):
730
808
  setup_hypothesis_profiles()
731
- assert Phase.shrink not in cast("Iterable[Phase]", settings().phases)
732
809
 
733
810
  @given(max_examples=integers(1, 100))
734
811
  def test_max_examples(self, *, max_examples: int) -> None:
@@ -920,12 +997,27 @@ class TestTimeDeltas:
920
997
  delta = data.draw(time_deltas(min_value=min_value, max_value=max_value))
921
998
  assert isinstance(delta, TimeDelta)
922
999
  assert TimeDelta.parse_common_iso(delta.format_common_iso()) == delta
1000
+ assert isinstance(to_py_time_delta(delta), dt.timedelta)
923
1001
  if min_value is not None:
924
1002
  assert delta >= min_value
925
1003
  if max_value is not None:
926
1004
  assert delta <= max_value
927
1005
 
928
1006
 
1007
+ class TestTimePeriods:
1008
+ @given(data=data())
1009
+ def test_main(self, *, data: DataObject) -> None:
1010
+ min_value = data.draw(times() | none())
1011
+ max_value = data.draw(times() | none())
1012
+ with assume_does_not_raise(InvalidArgument):
1013
+ period = data.draw(time_periods(min_value=min_value, max_value=max_value))
1014
+ assert isinstance(period, TimePeriod)
1015
+ if min_value is not None:
1016
+ assert period.start >= min_value
1017
+ if max_value is not None:
1018
+ assert period.end <= max_value
1019
+
1020
+
929
1021
  class TestTimes:
930
1022
  @given(data=data())
931
1023
  def test_main(self, *, data: DataObject) -> None:
@@ -958,33 +1050,53 @@ class TestTriples:
958
1050
  class TestUInt8s:
959
1051
  @given(data=data())
960
1052
  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)
1053
+ min_value, max_value = data.draw(pairs(uint8s() | none()))
1054
+ with assume_does_not_raise(InvalidArgument):
1055
+ x = data.draw(uint8s(min_value=min_value, max_value=max_value))
1056
+ assert MIN_UINT8 <= x <= MAX_UINT8
1057
+ if min_value is not None:
1058
+ assert x >= min_value
1059
+ if max_value is not None:
1060
+ assert x <= max_value
964
1061
 
965
1062
 
966
1063
  class TestUInt16s:
967
1064
  @given(data=data())
968
1065
  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)
1066
+ min_value, max_value = data.draw(pairs(uint16s() | none()))
1067
+ with assume_does_not_raise(InvalidArgument):
1068
+ x = data.draw(uint16s(min_value=min_value, max_value=max_value))
1069
+ assert MIN_UINT16 <= x <= MAX_UINT16
1070
+ if min_value is not None:
1071
+ assert x >= min_value
1072
+ if max_value is not None:
1073
+ assert x <= max_value
972
1074
 
973
1075
 
974
1076
  class TestUInt32s:
975
1077
  @given(data=data())
976
1078
  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)
1079
+ min_value, max_value = data.draw(pairs(uint32s() | none()))
1080
+ with assume_does_not_raise(InvalidArgument):
1081
+ x = data.draw(uint32s(min_value=min_value, max_value=max_value))
1082
+ assert MIN_UINT32 <= x <= MAX_UINT32
1083
+ if min_value is not None:
1084
+ assert x >= min_value
1085
+ if max_value is not None:
1086
+ assert x <= max_value
980
1087
 
981
1088
 
982
1089
  class TestUInt64s:
983
1090
  @given(data=data())
984
1091
  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)
1092
+ min_value, max_value = data.draw(pairs(uint64s() | none()))
1093
+ with assume_does_not_raise(InvalidArgument):
1094
+ x = data.draw(uint64s(min_value=min_value, max_value=max_value))
1095
+ assert MIN_UINT64 <= x <= MAX_UINT64
1096
+ if min_value is not None:
1097
+ assert x >= min_value
1098
+ if max_value is not None:
1099
+ assert x <= max_value
988
1100
 
989
1101
 
990
1102
  class TestURLs:
@@ -1063,14 +1175,33 @@ class TestYearMonths:
1063
1175
  assert year_month.on_day(28) <= DATE_TWO_DIGIT_YEAR_MAX
1064
1176
 
1065
1177
 
1178
+ class TestZonedDateTimePeriods:
1179
+ @given(data=data(), time_zone=timezones())
1180
+ def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1181
+ min_value = data.draw(zoned_date_times() | none())
1182
+ max_value = data.draw(zoned_date_times() | none())
1183
+ with assume_does_not_raise(InvalidArgument):
1184
+ period = data.draw(
1185
+ zoned_date_time_periods(
1186
+ min_value=min_value, max_value=max_value, time_zone=time_zone
1187
+ )
1188
+ )
1189
+ assert isinstance(period, ZonedDateTimePeriod)
1190
+ assert period.time_zone is time_zone
1191
+ if min_value is not None:
1192
+ assert period.start >= min_value
1193
+ if max_value is not None:
1194
+ assert period.end <= max_value
1195
+
1196
+
1066
1197
  class TestZonedDateTimes:
1067
1198
  @given(data=data(), time_zone=timezones())
1068
1199
  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())
1200
+ min_value = data.draw(zoned_date_times() | none())
1201
+ max_value = data.draw(zoned_date_times() | none())
1071
1202
  with assume_does_not_raise(InvalidArgument):
1072
1203
  datetime = data.draw(
1073
- zoned_datetimes(
1204
+ zoned_date_times(
1074
1205
  min_value=min_value, max_value=max_value, time_zone=time_zone
1075
1206
  )
1076
1207
  )
@@ -1087,5 +1218,5 @@ class TestZonedDateTimes:
1087
1218
  def test_examples(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1088
1219
  with assume_does_not_raise(TimeZoneNotFoundError):
1089
1220
  max_value = ZonedDateTime(1, 1, 2, tz=time_zone.key)
1090
- datetime = data.draw(zoned_datetimes(max_value=max_value, time_zone=time_zone))
1221
+ datetime = data.draw(zoned_date_times(max_value=max_value, time_zone=time_zone))
1091
1222
  _ = 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)