dycw-utilities 0.161.0__tar.gz → 0.161.2__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 (209) hide show
  1. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/PKG-INFO +1 -1
  2. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/pyproject.toml +2 -2
  3. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_hypothesis.py +25 -12
  4. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_whenever.py +54 -38
  5. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_zoneinfo.py +18 -25
  6. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/__init__.py +1 -1
  7. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/hypothesis.py +20 -3
  8. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/types.py +6 -1
  9. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/whenever.py +19 -12
  10. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/zoneinfo.py +2 -2
  11. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/.gitignore +0 -0
  12. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/LICENSE +0 -0
  13. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/README.md +0 -0
  14. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/__init__.py +0 -0
  15. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/conftest.py +0 -0
  16. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/__init__.py +0 -0
  17. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_missing/__init__.py +0 -0
  18. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_missing/module.py +0 -0
  19. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_with/__init__.py +0 -0
  20. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_with/outer_1.py +0 -0
  21. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_with/outer_2.py +0 -0
  22. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  23. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  24. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  25. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  26. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_without/__init__.py +0 -0
  27. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_without/module_1.py +0 -0
  28. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/package_without/module_2.py +0 -0
  29. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/standalone.py +0 -0
  30. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/modules/with_imports.py +0 -0
  31. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  32. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  33. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  34. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  35. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  36. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  37. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  38. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  39. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_altair.py +0 -0
  40. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_asyncio.py +0 -0
  41. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_atomicwrites.py +0 -0
  42. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_atools.py +0 -0
  43. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_cachetools.py +0 -0
  44. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_click.py +0 -0
  45. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_concurrent.py +0 -0
  46. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_contextlib.py +0 -0
  47. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_contextvars.py +0 -0
  48. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_cryptography.py +0 -0
  49. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_cvxpy.py +0 -0
  50. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_dataclasses.py +0 -0
  51. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_enum.py +0 -0
  52. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_errors.py +0 -0
  53. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_eventkit.py +0 -0
  54. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_fastapi.py +0 -0
  55. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_fpdf2.py +0 -0
  56. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_functions.py +0 -0
  57. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_functools.py +0 -0
  58. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_getpass.py +0 -0
  59. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_gzip.py +0 -0
  60. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_hashlib.py +0 -0
  61. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_http.py +0 -0
  62. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_importlib.py +0 -0
  63. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_inflect.py +0 -0
  64. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_ipython.py +0 -0
  65. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_iterables.py +0 -0
  66. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_json.py +0 -0
  67. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_jupyter.py +0 -0
  68. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_libcst.py +0 -0
  69. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_lightweight_charts.py +0 -0
  70. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_logging.py +0 -0
  71. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_objects/__init__.py +0 -0
  77. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_objects/objects.py +0 -0
  78. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_orjson.py +0 -0
  81. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_os.py +0 -0
  82. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_parse.py +0 -0
  83. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pickle.py +0 -0
  85. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_platform.py +0 -0
  86. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_polars.py +0 -0
  87. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_polars_ols.py +0 -0
  88. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_postgres.py +0 -0
  89. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pottery.py +0 -0
  90. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_psutil.py +0 -0
  92. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pytest.py +0 -0
  94. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pytest_randomly.py +0 -0
  95. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_random.py +0 -0
  97. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_re.py +0 -0
  98. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_redis.py +0 -0
  99. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_reprlib.py +0 -0
  100. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_scipy.py +0 -0
  101. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_sentinel.py +0 -0
  102. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_shelve.py +0 -0
  103. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_slack_sdk.py +0 -0
  104. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_socket.py +0 -0
  105. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_sqlalchemy.py +0 -0
  106. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  107. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_statsmodels.py +0 -0
  108. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_string.py +0 -0
  109. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_tempfile.py +0 -0
  110. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_text.py +0 -0
  111. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_threading.py +0 -0
  112. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_timer.py +0 -0
  113. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_traceback.py +0 -0
  114. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_typed_settings.py +0 -0
  115. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_types.py +0 -0
  116. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_typing.py +0 -0
  117. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  118. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  119. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  120. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_tzdata.py +0 -0
  121. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_tzlocal.py +0 -0
  122. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_uuid.py +0 -0
  123. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_version.py +0 -0
  124. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_warnings.py +0 -0
  125. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/tests/test_zipfile.py +0 -0
  126. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/altair.py +0 -0
  127. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/asyncio.py +0 -0
  128. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/atomicwrites.py +0 -0
  129. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/atools.py +0 -0
  130. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/cachetools.py +0 -0
  131. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/click.py +0 -0
  132. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/concurrent.py +0 -0
  133. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/contextlib.py +0 -0
  134. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/contextvars.py +0 -0
  135. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/cryptography.py +0 -0
  136. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/cvxpy.py +0 -0
  137. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/dataclasses.py +0 -0
  138. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/enum.py +0 -0
  139. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/errors.py +0 -0
  140. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/eventkit.py +0 -0
  141. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/fastapi.py +0 -0
  142. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/fpdf2.py +0 -0
  143. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/functions.py +0 -0
  144. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/functools.py +0 -0
  145. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/getpass.py +0 -0
  146. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/gzip.py +0 -0
  147. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/hashlib.py +0 -0
  148. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/http.py +0 -0
  149. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/importlib.py +0 -0
  150. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/inflect.py +0 -0
  151. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/ipython.py +0 -0
  152. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/iterables.py +0 -0
  153. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/json.py +0 -0
  154. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/jupyter.py +0 -0
  155. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/libcst.py +0 -0
  156. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/lightweight_charts.py +0 -0
  157. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/logging.py +0 -0
  158. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/math.py +0 -0
  159. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/memory_profiler.py +0 -0
  160. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/modules.py +0 -0
  161. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/more_itertools.py +0 -0
  162. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/numpy.py +0 -0
  163. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/operator.py +0 -0
  164. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/optuna.py +0 -0
  165. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/orjson.py +0 -0
  166. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/os.py +0 -0
  167. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/parse.py +0 -0
  168. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pathlib.py +0 -0
  169. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pickle.py +0 -0
  170. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/platform.py +0 -0
  171. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/polars.py +0 -0
  172. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/polars_ols.py +0 -0
  173. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/postgres.py +0 -0
  174. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pottery.py +0 -0
  175. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pqdm.py +0 -0
  176. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/psutil.py +0 -0
  177. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/py.typed +0 -0
  178. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pyinstrument.py +0 -0
  179. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pytest.py +0 -0
  180. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pytest_plugins/__init__.py +0 -0
  181. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  182. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  183. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/pytest_regressions.py +0 -0
  184. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/random.py +0 -0
  185. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/re.py +0 -0
  186. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/redis.py +0 -0
  187. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/reprlib.py +0 -0
  188. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/scipy.py +0 -0
  189. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/sentinel.py +0 -0
  190. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/shelve.py +0 -0
  191. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/slack_sdk.py +0 -0
  192. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/socket.py +0 -0
  193. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/sqlalchemy.py +0 -0
  194. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/sqlalchemy_polars.py +0 -0
  195. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/statsmodels.py +0 -0
  196. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/string.py +0 -0
  197. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/tempfile.py +0 -0
  198. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/text.py +0 -0
  199. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/threading.py +0 -0
  200. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/timer.py +0 -0
  201. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/traceback.py +0 -0
  202. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/typed_settings.py +0 -0
  203. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/typing.py +0 -0
  204. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/tzdata.py +0 -0
  205. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/tzlocal.py +0 -0
  206. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/uuid.py +0 -0
  207. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/version.py +0 -0
  208. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/warnings.py +0 -0
  209. {dycw_utilities-0.161.0 → dycw_utilities-0.161.2}/src/utilities/zipfile.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.161.0
3
+ Version: 0.161.2
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -227,7 +227,7 @@ dependencies = [
227
227
  name = "dycw-utilities"
228
228
  readme = "README.md"
229
229
  requires-python = ">= 3.12"
230
- version = "0.161.0"
230
+ version = "0.161.2"
231
231
 
232
232
  [project.entry-points.pytest11]
233
233
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -259,7 +259,7 @@ test = [
259
259
  # bump-my-version
260
260
  [tool.bumpversion]
261
261
  allow_dirty = true
262
- current_version = "0.161.0"
262
+ current_version = "0.161.2"
263
263
 
264
264
  [[tool.bumpversion.files]]
265
265
  filename = "src/utilities/__init__.py"
@@ -5,6 +5,7 @@ from itertools import pairwise
5
5
  from pathlib import Path
6
6
  from re import search
7
7
  from typing import TYPE_CHECKING, Any, cast
8
+ from zoneinfo import ZoneInfo
8
9
 
9
10
  from hypothesis import assume, given, settings
10
11
  from hypothesis.errors import InvalidArgument
@@ -20,7 +21,6 @@ from hypothesis.strategies import (
20
21
  just,
21
22
  none,
22
23
  sets,
23
- timezones,
24
24
  )
25
25
  from libcst import Import, ImportFrom
26
26
  from numpy import inf, int64, isfinite, isinf, isnan, ravel, rint
@@ -34,7 +34,6 @@ from whenever import (
34
34
  PlainDateTime,
35
35
  Time,
36
36
  TimeDelta,
37
- TimeZoneNotFoundError,
38
37
  YearMonth,
39
38
  ZonedDateTime,
40
39
  )
@@ -97,6 +96,7 @@ from utilities.hypothesis import (
97
96
  urls,
98
97
  versions,
99
98
  year_months,
99
+ zone_infos,
100
100
  zoned_date_time_periods,
101
101
  zoned_date_times,
102
102
  )
@@ -125,7 +125,7 @@ from utilities.math import (
125
125
  MIN_UINT64,
126
126
  )
127
127
  from utilities.os import temp_environ
128
- from utilities.platform import maybe_yield_lower_case
128
+ from utilities.platform import IS_LINUX, maybe_yield_lower_case
129
129
  from utilities.sentinel import is_sentinel
130
130
  from utilities.version import Version
131
131
  from utilities.whenever import (
@@ -134,6 +134,7 @@ from utilities.whenever import (
134
134
  DatePeriod,
135
135
  TimePeriod,
136
136
  ZonedDateTimePeriod,
137
+ get_now,
137
138
  to_days,
138
139
  to_nanoseconds,
139
140
  to_py_time_delta,
@@ -141,7 +142,6 @@ from utilities.whenever import (
141
142
 
142
143
  if TYPE_CHECKING:
143
144
  from collections.abc import Set as AbstractSet
144
- from zoneinfo import ZoneInfo
145
145
 
146
146
  from utilities.sentinel import Sentinel
147
147
  from utilities.tempfile import TemporaryDirectory
@@ -1186,11 +1186,23 @@ class TestYearMonths:
1186
1186
  assert year_month.on_day(28) <= DATE_TWO_DIGIT_YEAR_MAX
1187
1187
 
1188
1188
 
1189
+ class TestZoneInfos:
1190
+ @given(data=data())
1191
+ def test_main(self, *, data: DataObject) -> None:
1192
+ time_zone = data.draw(zone_infos())
1193
+ assert isinstance(time_zone, ZoneInfo)
1194
+ if IS_LINUX:
1195
+ _ = assume(time_zone.key not in {"Etc/UTC", "localtime"})
1196
+ assert time_zone.key not in {"Etc/UTC", "localtime"}
1197
+ _ = get_now(time_zone)
1198
+
1199
+
1189
1200
  class TestZonedDateTimePeriods:
1190
- @given(data=data(), time_zone=timezones())
1191
- def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1201
+ @given(data=data())
1202
+ def test_main(self, *, data: DataObject) -> None:
1192
1203
  min_value = data.draw(zoned_date_times() | none())
1193
1204
  max_value = data.draw(zoned_date_times() | none())
1205
+ time_zone = data.draw(zone_infos())
1194
1206
  with assume_does_not_raise(InvalidArgument):
1195
1207
  period = data.draw(
1196
1208
  zoned_date_time_periods(
@@ -1206,10 +1218,11 @@ class TestZonedDateTimePeriods:
1206
1218
 
1207
1219
 
1208
1220
  class TestZonedDateTimes:
1209
- @given(data=data(), time_zone=timezones())
1210
- def test_main(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1221
+ @given(data=data())
1222
+ def test_main(self, *, data: DataObject) -> None:
1211
1223
  min_value = data.draw(zoned_date_times() | none())
1212
1224
  max_value = data.draw(zoned_date_times() | none())
1225
+ time_zone = data.draw(zone_infos())
1213
1226
  with assume_does_not_raise(InvalidArgument):
1214
1227
  datetime = data.draw(
1215
1228
  zoned_date_times(
@@ -1225,9 +1238,9 @@ class TestZonedDateTimes:
1225
1238
  if max_value is not None:
1226
1239
  assert datetime <= max_value
1227
1240
 
1228
- @given(data=data(), time_zone=timezones())
1229
- def test_examples(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1230
- with assume_does_not_raise(TimeZoneNotFoundError):
1231
- max_value = ZonedDateTime(1, 1, 2, tz=time_zone.key)
1241
+ @given(data=data())
1242
+ def test_examples(self, *, data: DataObject) -> None:
1243
+ time_zone = data.draw(zone_infos())
1244
+ max_value = ZonedDateTime(1, 1, 2, tz=time_zone.key)
1232
1245
  datetime = data.draw(zoned_date_times(max_value=max_value, time_zone=time_zone))
1233
1246
  _ = datetime.py_datetime()
@@ -8,14 +8,7 @@ from typing import TYPE_CHECKING, Any, ClassVar, Self, cast
8
8
  from zoneinfo import ZoneInfo
9
9
 
10
10
  from hypothesis import HealthCheck, given, settings
11
- from hypothesis.strategies import (
12
- DataObject,
13
- data,
14
- integers,
15
- none,
16
- sampled_from,
17
- timezones,
18
- )
11
+ from hypothesis.strategies import DataObject, data, integers, none, sampled_from
19
12
  from pytest import mark, param, raises
20
13
  from whenever import (
21
14
  Date,
@@ -24,7 +17,6 @@ from whenever import (
24
17
  PlainDateTime,
25
18
  Time,
26
19
  TimeDelta,
27
- TimeZoneNotFoundError,
28
20
  Weekday,
29
21
  YearMonth,
30
22
  ZonedDateTime,
@@ -41,6 +33,7 @@ from utilities.hypothesis import (
41
33
  time_deltas,
42
34
  time_periods,
43
35
  times,
36
+ zone_infos,
44
37
  zoned_date_time_periods,
45
38
  zoned_date_times,
46
39
  zoned_date_times_2000,
@@ -382,7 +375,7 @@ class TestFormatCompact:
382
375
 
383
376
  class TestFromTimeStamp:
384
377
  @given(
385
- datetime=zoned_date_times(time_zone=timezones()).map(
378
+ datetime=zoned_date_times(time_zone=zone_infos()).map(
386
379
  lambda d: d.round("second")
387
380
  )
388
381
  )
@@ -392,7 +385,7 @@ class TestFromTimeStamp:
392
385
  assert result == datetime
393
386
 
394
387
  @given(
395
- datetime=zoned_date_times(time_zone=timezones()).map(
388
+ datetime=zoned_date_times(time_zone=zone_infos()).map(
396
389
  lambda d: d.round("millisecond")
397
390
  )
398
391
  )
@@ -401,7 +394,7 @@ class TestFromTimeStamp:
401
394
  result = from_timestamp_millis(timestamp, time_zone=ZoneInfo(datetime.tz))
402
395
  assert result == datetime
403
396
 
404
- @given(datetime=zoned_date_times(time_zone=timezones()))
397
+ @given(datetime=zoned_date_times(time_zone=zone_infos()))
405
398
  def test_nanos(self, *, datetime: ZonedDateTime) -> None:
406
399
  timestamp = datetime.timestamp_nanos()
407
400
  result = from_timestamp_nanos(timestamp, time_zone=ZoneInfo(datetime.tz))
@@ -409,10 +402,9 @@ class TestFromTimeStamp:
409
402
 
410
403
 
411
404
  class TestGetNow:
412
- @given(time_zone=timezones())
405
+ @given(time_zone=zone_infos())
413
406
  def test_function(self, *, time_zone: ZoneInfo) -> None:
414
- with assume_does_not_raise(TimeZoneNotFoundError):
415
- now = get_now(time_zone)
407
+ now = get_now(time_zone)
416
408
  assert isinstance(now, ZonedDateTime)
417
409
  assert now.tz == time_zone.key
418
410
 
@@ -436,10 +428,9 @@ class TestGetNowLocal:
436
428
 
437
429
 
438
430
  class TestGetNowPlain:
439
- @given(time_zone=timezones())
431
+ @given(time_zone=zone_infos())
440
432
  def test_function(self, *, time_zone: ZoneInfo) -> None:
441
- with assume_does_not_raise(TimeZoneNotFoundError):
442
- now = get_now_plain(time_zone)
433
+ now = get_now_plain(time_zone)
443
434
  assert isinstance(now, PlainDateTime)
444
435
 
445
436
  def test_constant(self) -> None:
@@ -1395,32 +1386,57 @@ class TestToZonedDateTime:
1395
1386
  def test_default(self) -> None:
1396
1387
  assert abs(to_zoned_date_time() - get_now()) <= SECOND
1397
1388
 
1398
- @given(date_time=zoned_date_times())
1399
- def test_date_time(self, *, date_time: ZonedDateTime) -> None:
1400
- assert to_zoned_date_time(date_time) == date_time
1389
+ @given(date_time=zoned_date_times(time_zone=zone_infos()))
1390
+ def test_date_time_without_time_zone(self, *, date_time: ZonedDateTime) -> None:
1391
+ result = to_zoned_date_time(date_time)
1392
+ assert result.exact_eq(date_time)
1401
1393
 
1402
- @given(date_time=zoned_date_times())
1403
- def test_str(self, *, date_time: ZonedDateTime) -> None:
1404
- assert to_zoned_date_time(date_time.format_common_iso()) == date_time
1394
+ @given(date_time=zoned_date_times(), time_zone=zone_infos())
1395
+ def test_date_time_with_time_zone(
1396
+ self, *, date_time: ZonedDateTime, time_zone: ZoneInfo
1397
+ ) -> None:
1398
+ result = to_zoned_date_time(date_time, time_zone=time_zone)
1399
+ expected = date_time.to_tz(time_zone.key)
1400
+ assert result.exact_eq(expected)
1401
+
1402
+ @given(date_time=zoned_date_times(), time_zone=zone_infos())
1403
+ def test_str(self, *, date_time: ZonedDateTime, time_zone: ZoneInfo) -> None:
1404
+ result = to_zoned_date_time(date_time.format_common_iso(), time_zone=time_zone)
1405
+ expected = date_time.to_tz(time_zone.key)
1406
+ assert result.exact_eq(expected)
1405
1407
 
1406
- @given(date_time=zoned_date_times_2000)
1407
- def test_py_date_time_zone_info(self, *, date_time: ZonedDateTime) -> None:
1408
- assert to_zoned_date_time(date_time.py_datetime()) == date_time
1408
+ @given(date_time=zoned_date_times_2000, time_zone=zone_infos())
1409
+ def test_py_date_time_zone_info(
1410
+ self, *, date_time: ZonedDateTime, time_zone: ZoneInfo
1411
+ ) -> None:
1412
+ result = to_zoned_date_time(date_time.py_datetime(), time_zone=time_zone)
1413
+ expected = date_time.to_tz(time_zone.key)
1414
+ assert result.exact_eq(expected)
1409
1415
 
1410
- @given(date_time=zoned_date_times_2000)
1411
- def test_py_date_time_dt_utc(self, *, date_time: ZonedDateTime) -> None:
1412
- result = to_zoned_date_time(date_time.py_datetime().astimezone(dt.UTC))
1413
- assert result == date_time
1416
+ @given(date_time=zoned_date_times_2000, time_zone=zone_infos())
1417
+ def test_py_date_time_dt_utc(
1418
+ self, *, date_time: ZonedDateTime, time_zone: ZoneInfo
1419
+ ) -> None:
1420
+ result = to_zoned_date_time(
1421
+ date_time.py_datetime().astimezone(dt.UTC), time_zone=time_zone
1422
+ )
1423
+ expected = date_time.to_tz(time_zone.key)
1424
+ assert result.exact_eq(expected)
1414
1425
 
1415
- @given(date_time=zoned_date_times())
1416
- def test_callable(self, *, date_time: ZonedDateTime) -> None:
1417
- assert to_zoned_date_time(lambda: date_time) == date_time
1426
+ @given(date_time=zoned_date_times(), time_zone=zone_infos())
1427
+ def test_callable(self, *, date_time: ZonedDateTime, time_zone: ZoneInfo) -> None:
1428
+ result = to_zoned_date_time(lambda: date_time, time_zone=time_zone)
1429
+ expected = date_time.to_tz(time_zone.key)
1430
+ assert result.exact_eq(expected)
1418
1431
 
1419
- def test_none(self) -> None:
1420
- assert abs(to_zoned_date_time(None) - get_now()) <= SECOND
1432
+ @given(time_zone=zone_infos())
1433
+ def test_none(self, *, time_zone: ZoneInfo) -> None:
1434
+ result = to_zoned_date_time(None, time_zone=time_zone)
1435
+ assert abs(result - get_now(time_zone)) <= SECOND
1421
1436
 
1422
- def test_sentinel(self) -> None:
1423
- assert to_zoned_date_time(sentinel) is sentinel
1437
+ @given(time_zone=zone_infos())
1438
+ def test_sentinel(self, *, time_zone: ZoneInfo) -> None:
1439
+ assert to_zoned_date_time(sentinel, time_zone=time_zone) is sentinel
1424
1440
 
1425
1441
  @given(date_times=pairs(zoned_date_times()))
1426
1442
  def test_replace_non_sentinel(
@@ -1,22 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import datetime as dt
4
- from typing import TYPE_CHECKING, cast
4
+ from typing import TYPE_CHECKING, Literal, cast
5
5
  from zoneinfo import ZoneInfo
6
6
 
7
7
  from hypothesis import given
8
- from hypothesis.strategies import (
9
- DataObject,
10
- data,
11
- datetimes,
12
- just,
13
- sampled_from,
14
- timezones,
15
- )
16
- from pytest import raises
8
+ from hypothesis.strategies import DataObject, data, datetimes, just, sampled_from
9
+ from pytest import mark, param, raises
17
10
 
18
- from tests.conftest import SKIPIF_CI_AND_LINUX
19
- from utilities.hypothesis import zoned_date_times
11
+ from utilities.hypothesis import zone_infos, zoned_date_times
20
12
  from utilities.tzdata import HongKong, Tokyo
21
13
  from utilities.tzlocal import LOCAL_TIME_ZONE, LOCAL_TIME_ZONE_NAME
22
14
  from utilities.zoneinfo import (
@@ -35,22 +27,23 @@ if TYPE_CHECKING:
35
27
 
36
28
 
37
29
  class TestToZoneInfo:
38
- @given(time_zone=timezones())
30
+ @given(time_zone=zone_infos())
39
31
  def test_zone_info(self, *, time_zone: ZoneInfo) -> None:
40
32
  result = to_zone_info(time_zone)
41
33
  assert result is time_zone
42
34
 
43
- @given(data=data(), time_zone=timezones())
35
+ @given(data=data(), time_zone=zone_infos())
44
36
  def test_zoned_date_time(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
45
37
  date_time = data.draw(zoned_date_times(time_zone=time_zone))
46
38
  result = to_zone_info(date_time)
47
39
  assert result is time_zone
48
40
 
49
- def test_local(self) -> None:
50
- result = to_zone_info("local")
41
+ @mark.parametrize("time_zone", [param("local"), param("localtime")])
42
+ def test_local(self, *, time_zone: Literal["local", "localtime"]) -> None:
43
+ result = to_zone_info(time_zone)
51
44
  assert result is LOCAL_TIME_ZONE
52
45
 
53
- @given(time_zone=timezones())
46
+ @given(time_zone=zone_infos())
54
47
  def test_str(self, *, time_zone: ZoneInfo) -> None:
55
48
  result = to_zone_info(cast("TimeZoneLike", time_zone.key))
56
49
  assert result is time_zone
@@ -59,7 +52,7 @@ class TestToZoneInfo:
59
52
  result = to_zone_info(dt.UTC)
60
53
  assert result is UTC
61
54
 
62
- @given(data=data(), time_zone=timezones())
55
+ @given(data=data(), time_zone=zone_infos())
63
56
  def test_py_zoned_date_time(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
64
57
  date_time = data.draw(datetimes(timezones=just(time_zone)))
65
58
  result = to_zone_info(date_time)
@@ -79,25 +72,25 @@ class TestToZoneInfo:
79
72
 
80
73
 
81
74
  class TestToTimeZoneName:
82
- @given(time_zone=timezones())
75
+ @given(time_zone=zone_infos())
83
76
  def test_zone_info(self, *, time_zone: ZoneInfo) -> None:
84
77
  result = to_time_zone_name(time_zone)
85
78
  expected = time_zone.key
86
79
  assert result == expected
87
80
 
88
- @given(data=data(), time_zone=timezones())
81
+ @given(data=data(), time_zone=zone_infos())
89
82
  def test_zoned_date_time(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
90
83
  date_time = data.draw(zoned_date_times(time_zone=time_zone))
91
84
  result = to_time_zone_name(date_time)
92
85
  expected = time_zone.key
93
86
  assert result == expected
94
87
 
95
- def test_local(self) -> None:
96
- result = to_time_zone_name("local")
88
+ @mark.parametrize("time_zone", [param("local"), param("localtime")])
89
+ def test_local(self, *, time_zone: Literal["local", "localtime"]) -> None:
90
+ result = to_time_zone_name(time_zone)
97
91
  assert result == LOCAL_TIME_ZONE_NAME
98
92
 
99
- @given(time_zone=timezones())
100
- @SKIPIF_CI_AND_LINUX
93
+ @given(time_zone=zone_infos())
101
94
  def test_str(self, *, time_zone: ZoneInfo) -> None:
102
95
  result = to_time_zone_name(cast("TimeZoneLike", time_zone.key))
103
96
  expected = time_zone.key
@@ -108,7 +101,7 @@ class TestToTimeZoneName:
108
101
  expected = UTC.key
109
102
  assert result == expected
110
103
 
111
- @given(data=data(), time_zone=timezones())
104
+ @given(data=data(), time_zone=zone_infos())
112
105
  def test_py_zoned_date_time(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
113
106
  date_time = data.draw(datetimes(timezones=just(time_zone)))
114
107
  result = to_time_zone_name(date_time)
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.161.0"
3
+ __version__ = "0.161.2"
@@ -32,6 +32,7 @@ from hypothesis.strategies import (
32
32
  sampled_from,
33
33
  sets,
34
34
  text,
35
+ timezones,
35
36
  uuids,
36
37
  )
37
38
  from hypothesis.utils.conventions import not_set
@@ -76,7 +77,7 @@ from utilities.math import (
76
77
  )
77
78
  from utilities.os import get_env_var
78
79
  from utilities.pathlib import module_path, temp_cwd
79
- from utilities.platform import IS_WINDOWS
80
+ from utilities.platform import IS_LINUX, IS_WINDOWS
80
81
  from utilities.sentinel import Sentinel, is_sentinel, sentinel
81
82
  from utilities.tempfile import TEMP_DIR, TemporaryDirectory
82
83
  from utilities.version import Version
@@ -97,6 +98,7 @@ from utilities.whenever import (
97
98
  DatePeriod,
98
99
  TimePeriod,
99
100
  ZonedDateTimePeriod,
101
+ get_now,
100
102
  to_date_time_delta,
101
103
  to_days,
102
104
  to_nanoseconds,
@@ -105,6 +107,7 @@ from utilities.zoneinfo import UTC, to_zone_info
105
107
 
106
108
  if TYPE_CHECKING:
107
109
  from collections.abc import Collection, Hashable, Iterable, Iterator
110
+ from zoneinfo import ZoneInfo
108
111
 
109
112
  from hypothesis.database import ExampleDatabase
110
113
  from libcst import Import, ImportFrom
@@ -835,7 +838,7 @@ def paths(
835
838
  @composite
836
839
  def _path_parts(draw: DrawFn, /) -> str:
837
840
  part = draw(text_ascii(min_size=1, max_size=10))
838
- reserved = {"AUX", "NUL", "nuL"}
841
+ reserved = {"AUX", "NUL", "nuL", "pRn"}
839
842
  _ = assume(part not in reserved)
840
843
  return part
841
844
 
@@ -1476,6 +1479,20 @@ def year_months(
1476
1479
  ##
1477
1480
 
1478
1481
 
1482
+ @composite
1483
+ def zone_infos(draw: DrawFn, /) -> ZoneInfo:
1484
+ """Strategy for generating time-zones."""
1485
+ time_zone = draw(timezones())
1486
+ if IS_LINUX:
1487
+ _ = assume(time_zone.key not in {"Etc/UTC", "localtime"})
1488
+ with assume_does_not_raise(TimeZoneNotFoundError):
1489
+ _ = get_now(time_zone)
1490
+ return time_zone
1491
+
1492
+
1493
+ ##
1494
+
1495
+
1479
1496
  @composite
1480
1497
  def zoned_date_time_periods(
1481
1498
  draw: DrawFn,
@@ -1530,7 +1547,6 @@ def zoned_date_times(
1530
1547
  with (
1531
1548
  assume_does_not_raise(RepeatedTime),
1532
1549
  assume_does_not_raise(SkippedTime),
1533
- assume_does_not_raise(TimeZoneNotFoundError),
1534
1550
  assume_does_not_raise(ValueError, match="Resulting datetime is out of range"),
1535
1551
  ):
1536
1552
  zoned = plain.assume_tz(time_zone_.key, disambiguate="raise")
@@ -1602,6 +1618,7 @@ __all__ = [
1602
1618
  "urls",
1603
1619
  "versions",
1604
1620
  "year_months",
1621
+ "zone_infos",
1605
1622
  "zoned_date_time_periods",
1606
1623
  "zoned_date_times",
1607
1624
  "zoned_date_times_2000",
@@ -276,7 +276,12 @@ TIME_ZONES: list[TimeZone] = list(get_args(TimeZone.__value__))
276
276
 
277
277
 
278
278
  type TimeZoneLike = (
279
- ZoneInfo | ZonedDateTime | Literal["local"] | TimeZone | dt.tzinfo | dt.datetime
279
+ ZoneInfo
280
+ | ZonedDateTime
281
+ | Literal["local", "localtime"]
282
+ | TimeZone
283
+ | dt.tzinfo
284
+ | dt.datetime
280
285
  )
281
286
 
282
287
 
@@ -1621,39 +1621,46 @@ class _ToYearsTimeError(ToYearsError):
1621
1621
 
1622
1622
  @overload
1623
1623
  def to_zoned_date_time(
1624
- date_time: Sentinel, /, *, time_zone: TimeZoneLike = UTC
1624
+ date_time: Sentinel, /, *, time_zone: TimeZoneLike | None = None
1625
1625
  ) -> Sentinel: ...
1626
1626
  @overload
1627
1627
  def to_zoned_date_time(
1628
1628
  date_time: MaybeCallableZonedDateTimeLike | dt.datetime | None = get_now,
1629
1629
  /,
1630
1630
  *,
1631
- time_zone: TimeZoneLike = UTC,
1631
+ time_zone: TimeZoneLike | None = None,
1632
1632
  ) -> ZonedDateTime: ...
1633
1633
  def to_zoned_date_time(
1634
1634
  date_time: MaybeCallableZonedDateTimeLike | dt.datetime | None | Sentinel = get_now,
1635
1635
  /,
1636
1636
  *,
1637
- time_zone: TimeZoneLike = UTC,
1637
+ time_zone: TimeZoneLike | None = None,
1638
1638
  ) -> ZonedDateTime | Sentinel:
1639
1639
  """Convert to a zoned date-time."""
1640
1640
  match date_time:
1641
- case ZonedDateTime() | Sentinel():
1642
- return date_time
1641
+ case ZonedDateTime() as date_time_use:
1642
+ ...
1643
+ case Sentinel():
1644
+ return sentinel
1643
1645
  case None:
1644
- return get_now(time_zone)
1646
+ return get_now(UTC if time_zone is None else time_zone)
1645
1647
  case str():
1646
- return ZonedDateTime.parse_common_iso(date_time)
1647
- case dt.datetime():
1648
+ date_time_use = ZonedDateTime.parse_common_iso(date_time)
1649
+ case dt.datetime() as py_date_time:
1648
1650
  if isinstance(date_time.tzinfo, ZoneInfo):
1649
- return ZonedDateTime.from_py_datetime(date_time)
1650
- if date_time.tzinfo is dt.UTC:
1651
- return ZonedDateTime.from_py_datetime(date_time.astimezone(UTC))
1652
- raise ToZonedDateTimeError(date_time=date_time)
1651
+ py_date_time_use = py_date_time
1652
+ elif date_time.tzinfo is dt.UTC:
1653
+ py_date_time_use = py_date_time.astimezone(UTC)
1654
+ else:
1655
+ raise ToZonedDateTimeError(date_time=date_time)
1656
+ date_time_use = ZonedDateTime.from_py_datetime(py_date_time_use)
1653
1657
  case Callable() as func:
1654
1658
  return to_zoned_date_time(func(), time_zone=time_zone)
1655
1659
  case never:
1656
1660
  assert_never(never)
1661
+ if time_zone is None:
1662
+ return date_time_use
1663
+ return date_time_use.to_tz(to_time_zone_name(time_zone))
1657
1664
 
1658
1665
 
1659
1666
  @dataclass(kw_only=True, slots=True)
@@ -27,7 +27,7 @@ def to_zone_info(obj: TimeZoneLike, /) -> ZoneInfo:
27
27
  return zone_info
28
28
  case ZonedDateTime() as date_time:
29
29
  return ZoneInfo(date_time.tz)
30
- case "local":
30
+ case "local" | "localtime":
31
31
  return LOCAL_TIME_ZONE
32
32
  case str() as key:
33
33
  return ZoneInfo(key)
@@ -75,7 +75,7 @@ def to_time_zone_name(obj: TimeZoneLike, /) -> TimeZone:
75
75
  return cast("TimeZone", zone_info.key)
76
76
  case ZonedDateTime() as date_time:
77
77
  return cast("TimeZone", date_time.tz)
78
- case "local":
78
+ case "local" | "localtime":
79
79
  return LOCAL_TIME_ZONE_NAME
80
80
  case str() as time_zone:
81
81
  if time_zone in TIME_ZONES: