dycw-utilities 0.153.15__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.153.15 → dycw_utilities-0.155.0}/PKG-INFO +2 -2
  2. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/pyproject.toml +6 -6
  3. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/conftest.py +2 -8
  4. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_altair.py +2 -2
  5. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_click.py +4 -4
  6. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_hypothesis.py +159 -37
  7. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_iterables.py +0 -14
  8. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_logging.py +14 -51
  9. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_objects/objects.py +10 -4
  10. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_orjson.py +23 -6
  11. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_parse.py +4 -4
  12. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_polars.py +6 -4
  13. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_sqlalchemy.py +2 -2
  14. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_sqlalchemy_polars.py +2 -2
  15. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_traceback.py +16 -3
  16. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_typed_settings.py +6 -6
  17. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_whenever.py +112 -215
  18. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_zoneinfo.py +4 -4
  19. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/__init__.py +1 -1
  20. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/fpdf2.py +2 -2
  21. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/hypothesis.py +143 -41
  22. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/iterables.py +1 -21
  23. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/logging.py +8 -49
  24. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/orjson.py +45 -12
  25. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/polars.py +2 -2
  26. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pyinstrument.py +2 -4
  27. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pytest_regressions.py +3 -1
  28. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/traceback.py +24 -16
  29. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/whenever.py +8 -4
  30. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/.gitignore +0 -0
  31. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/LICENSE +0 -0
  32. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/README.md +0 -0
  33. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/__init__.py +0 -0
  34. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/__init__.py +0 -0
  35. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_missing/__init__.py +0 -0
  36. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_missing/module.py +0 -0
  37. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_with/__init__.py +0 -0
  38. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_with/outer_1.py +0 -0
  39. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_with/outer_2.py +0 -0
  40. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  41. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  42. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  43. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  44. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_without/__init__.py +0 -0
  45. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_without/module_1.py +0 -0
  46. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/package_without/module_2.py +0 -0
  47. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/standalone.py +0 -0
  48. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/modules/with_imports.py +0 -0
  49. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  50. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  51. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  52. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  53. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  54. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  55. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  56. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  57. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_asyncio.py +0 -0
  58. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_atomicwrites.py +0 -0
  59. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_atools.py +0 -0
  60. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_cachetools.py +0 -0
  61. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_concurrent.py +0 -0
  62. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_contextlib.py +0 -0
  63. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_contextvars.py +0 -0
  64. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_cryptography.py +0 -0
  65. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_cvxpy.py +0 -0
  66. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_dataclasses.py +0 -0
  67. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_enum.py +0 -0
  68. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_errors.py +0 -0
  69. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_eventkit.py +0 -0
  70. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_fastapi.py +0 -0
  71. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_fpdf2.py +0 -0
  72. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_functions.py +0 -0
  73. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_functools.py +0 -0
  74. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_getpass.py +0 -0
  75. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_gzip.py +0 -0
  76. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_hashlib.py +0 -0
  77. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_http.py +0 -0
  78. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_importlib.py +0 -0
  79. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_inflect.py +0 -0
  80. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_ipython.py +0 -0
  81. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_json.py +0 -0
  82. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_jupyter.py +0 -0
  83. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_libcst.py +0 -0
  84. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_lightweight_charts.py +0 -0
  85. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_math.py +0 -0
  86. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_memory_profiler.py +0 -0
  87. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_modules.py +0 -0
  88. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_more_itertools.py +0 -0
  89. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_numpy.py +0 -0
  90. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_objects/__init__.py +0 -0
  91. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_operator.py +0 -0
  92. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_optuna.py +0 -0
  93. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_os.py +0 -0
  94. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pathlib.py +0 -0
  95. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pickle.py +0 -0
  96. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_platform.py +0 -0
  97. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_polars_ols.py +0 -0
  98. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_postgres.py +0 -0
  99. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pottery.py +0 -0
  100. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pqdm.py +0 -0
  101. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_psutil.py +0 -0
  102. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pyinstrument.py +0 -0
  103. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pytest.py +0 -0
  104. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pytest_randomly.py +0 -0
  105. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_pytest_regressions.py +0 -0
  106. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_random.py +0 -0
  107. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_re.py +0 -0
  108. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_redis.py +0 -0
  109. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_reprlib.py +0 -0
  110. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_scipy.py +0 -0
  111. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_sentinel.py +0 -0
  112. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_shelve.py +0 -0
  113. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_slack_sdk.py +0 -0
  114. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_socket.py +0 -0
  115. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_statsmodels.py +0 -0
  116. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_string.py +0 -0
  117. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_tempfile.py +0 -0
  118. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_text.py +0 -0
  119. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_threading.py +0 -0
  120. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_timer.py +0 -0
  121. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_types.py +0 -0
  122. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_typing.py +0 -0
  123. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  124. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  125. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  126. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_tzdata.py +0 -0
  127. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_tzlocal.py +0 -0
  128. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_uuid.py +0 -0
  129. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_version.py +0 -0
  130. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_warnings.py +0 -0
  131. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_yield_access/__init__.py +0 -0
  132. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_yield_access/script.py +0 -0
  133. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_yield_access/script.sh +0 -0
  134. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/tests/test_zipfile.py +0 -0
  135. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/altair.py +0 -0
  136. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/asyncio.py +0 -0
  137. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/atomicwrites.py +0 -0
  138. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/atools.py +0 -0
  139. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/cachetools.py +0 -0
  140. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/click.py +0 -0
  141. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/concurrent.py +0 -0
  142. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/contextlib.py +0 -0
  143. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/contextvars.py +0 -0
  144. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/cryptography.py +0 -0
  145. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/cvxpy.py +0 -0
  146. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/dataclasses.py +0 -0
  147. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/enum.py +0 -0
  148. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/errors.py +0 -0
  149. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/eventkit.py +0 -0
  150. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/fastapi.py +0 -0
  151. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/functions.py +0 -0
  152. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/functools.py +0 -0
  153. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/getpass.py +0 -0
  154. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/gzip.py +0 -0
  155. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/hashlib.py +0 -0
  156. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/http.py +0 -0
  157. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/importlib.py +0 -0
  158. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/inflect.py +0 -0
  159. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/ipython.py +0 -0
  160. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/json.py +0 -0
  161. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/jupyter.py +0 -0
  162. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/libcst.py +0 -0
  163. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/lightweight_charts.py +0 -0
  164. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/math.py +0 -0
  165. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/memory_profiler.py +0 -0
  166. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/modules.py +0 -0
  167. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/more_itertools.py +0 -0
  168. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/numpy.py +0 -0
  169. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/operator.py +0 -0
  170. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/optuna.py +0 -0
  171. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pathlib.py +0 -0
  174. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pickle.py +0 -0
  175. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/platform.py +0 -0
  176. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/postgres.py +0 -0
  178. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pottery.py +0 -0
  179. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pqdm.py +0 -0
  180. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/psutil.py +0 -0
  181. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/py.typed +0 -0
  182. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pytest.py +0 -0
  183. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/__init__.py +0 -0
  184. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  185. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  186. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/random.py +0 -0
  187. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/re.py +0 -0
  188. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/redis.py +0 -0
  189. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/reprlib.py +0 -0
  190. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/scipy.py +0 -0
  191. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/sentinel.py +0 -0
  192. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/shelve.py +0 -0
  193. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/slack_sdk.py +0 -0
  194. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/socket.py +0 -0
  195. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/sqlalchemy.py +0 -0
  196. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/sqlalchemy_polars.py +0 -0
  197. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/statsmodels.py +0 -0
  198. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/string.py +0 -0
  199. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/tempfile.py +0 -0
  200. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/text.py +0 -0
  201. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/threading.py +0 -0
  202. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/timer.py +0 -0
  203. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/typed_settings.py +0 -0
  204. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/types.py +0 -0
  205. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/typing.py +0 -0
  206. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/tzdata.py +0 -0
  207. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/tzlocal.py +0 -0
  208. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/uuid.py +0 -0
  209. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/version.py +0 -0
  210. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/warnings.py +0 -0
  211. {dycw_utilities-0.153.15 → dycw_utilities-0.155.0}/src/utilities/zipfile.py +0 -0
  212. {dycw_utilities-0.153.15 → 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.153.15
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.153.15"
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.153.15"
265
+ current_version = "0.155.0"
266
266
 
267
267
  [[tool.bumpversion.files]]
268
268
  filename = "src/utilities/__init__.py"
@@ -7,13 +7,11 @@ from typing import TYPE_CHECKING
7
7
 
8
8
  from hypothesis import HealthCheck
9
9
  from pytest import fixture, mark, param, skip
10
- from whenever import PlainDateTime
11
10
 
12
11
  from utilities.contextlib import enhanced_context_manager
13
12
  from utilities.platform import IS_MAC, IS_NOT_LINUX, IS_WINDOWS
14
13
  from utilities.re import ExtractGroupError, extract_group
15
- from utilities.tzlocal import LOCAL_TIME_ZONE_NAME
16
- from utilities.whenever import MINUTE, get_now
14
+ from utilities.whenever import MINUTE, get_now, parse_plain_local
17
15
 
18
16
  if TYPE_CHECKING:
19
17
  from collections.abc import AsyncIterator, Iterator, Sequence
@@ -174,11 +172,7 @@ def _is_to_drop(table: str, /) -> bool:
174
172
  datetime_str = extract_group(r"^(\d{8}T\d{6})_", table)
175
173
  except ExtractGroupError:
176
174
  return True
177
- datetime = PlainDateTime.parse_common_iso(datetime_str).assume_tz(
178
- LOCAL_TIME_ZONE_NAME
179
- )
180
- now = get_now()
181
- return (now - datetime) >= MINUTE
175
+ return (get_now() - parse_plain_local(datetime_str)) >= MINUTE
182
176
 
183
177
 
184
178
  def _select_tables() -> TextClause:
@@ -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()
@@ -94,7 +94,6 @@ from utilities.iterables import (
94
94
  enumerate_with_edge,
95
95
  expanding_window,
96
96
  filter_include_and_exclude,
97
- group_consecutive_integers,
98
97
  groupby_lists,
99
98
  hashable_to_iterable,
100
99
  is_iterable,
@@ -117,7 +116,6 @@ from utilities.iterables import (
117
116
  sum_mappings,
118
117
  take,
119
118
  transpose,
120
- ungroup_consecutive_integers,
121
119
  unique_everseen,
122
120
  )
123
121
  from utilities.sentinel import Sentinel, sentinel
@@ -745,18 +743,6 @@ class TestFilterIncludeAndExclude:
745
743
  assert result == expected
746
744
 
747
745
 
748
- class TestGroupAndUngroupConsecutiveIntegers:
749
- @given(xs=lists(integers(), unique=True).map(sorted))
750
- def test_main(self, *, xs: list[int]) -> None:
751
- result = list(ungroup_consecutive_integers(group_consecutive_integers(xs)))
752
- assert result == xs
753
-
754
- def test_example(self) -> None:
755
- result = list(group_consecutive_integers([1, 2, 3, 6, 7, 10, 11, 12]))
756
- expected = [(1, 3), (6, 7), (10, 12)]
757
- assert result == expected
758
-
759
-
760
746
  class TestGroupbyLists:
761
747
  iterable: ClassVar[str] = "AAAABBBCCDAABB"
762
748