dycw-utilities 0.111.0__tar.gz → 0.112.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 (231) hide show
  1. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/PKG-INFO +1 -1
  2. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/pyproject.toml +2 -2
  3. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_altair.py +2 -1
  4. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_datetime.py +10 -41
  5. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_orjson.py +3 -2
  6. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_parse.py +63 -0
  7. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_polars.py +2 -2
  8. dycw_utilities-0.112.0/src/tests/test_tzdata.py +60 -0
  9. dycw_utilities-0.112.0/src/tests/test_tzlocal.py +41 -0
  10. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_whenever.py +3 -1
  11. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_zoneinfo.py +1 -2
  12. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/__init__.py +1 -1
  13. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/datetime.py +1 -60
  14. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/fastapi.py +2 -1
  15. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/fpdf2.py +2 -2
  16. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/hypothesis.py +1 -1
  17. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/logging.py +7 -2
  18. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/parse.py +25 -37
  19. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pyinstrument.py +2 -1
  20. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/traceback.py +7 -3
  21. dycw_utilities-0.112.0/src/utilities/tzdata.py +63 -0
  22. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/tzlocal.py +24 -1
  23. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/whenever.py +1 -0
  24. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/zoneinfo.py +3 -10
  25. dycw_utilities-0.111.0/src/tests/test_tzdata.py +0 -14
  26. dycw_utilities-0.111.0/src/tests/test_tzlocal.py +0 -11
  27. dycw_utilities-0.111.0/src/utilities/tzdata.py +0 -9
  28. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/.gitignore +0 -0
  29. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/LICENSE +0 -0
  30. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/README.md +0 -0
  31. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/__init__.py +0 -0
  32. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/conftest.py +0 -0
  33. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/__init__.py +0 -0
  34. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_missing/__init__.py +0 -0
  35. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_missing/module.py +0 -0
  36. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/__init__.py +0 -0
  37. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/outer_1.py +0 -0
  38. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/outer_2.py +0 -0
  39. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  40. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  41. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  42. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  43. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_without/__init__.py +0 -0
  44. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_without/module_1.py +0 -0
  45. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/package_without/module_2.py +0 -0
  46. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/standalone.py +0 -0
  47. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/modules/with_imports.py +0 -0
  48. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  49. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  50. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  51. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  52. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  53. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  54. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  55. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  56. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/__init__.py +0 -0
  57. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_async_service/__init__.py +0 -0
  58. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_async_service/__main__.py +0 -0
  59. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_async_service/run.sh +0 -0
  60. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  61. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  62. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  63. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_astor.py +0 -0
  64. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_asyncio.py +0 -0
  65. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_atomicwrites.py +0 -0
  66. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_atools.py +0 -0
  67. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_cachetools.py +0 -0
  68. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_click.py +0 -0
  69. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_concurrent.py +0 -0
  70. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_contextlib.py +0 -0
  71. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_contextvars.py +0 -0
  72. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_cryptography.py +0 -0
  73. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_cvxpy.py +0 -0
  74. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_dataclasses.py +0 -0
  75. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_enum.py +0 -0
  76. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_errors.py +0 -0
  77. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_eventkit.py +0 -0
  78. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_fastapi.py +0 -0
  79. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_fpdf2.py +0 -0
  80. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_functions.py +0 -0
  81. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_functools.py +0 -0
  82. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_getpass.py +0 -0
  83. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_git.py +0 -0
  84. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_hashlib.py +0 -0
  85. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_http.py +0 -0
  86. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_hypothesis.py +0 -0
  87. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_ipython.py +0 -0
  88. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_iterables.py +0 -0
  89. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_jupyter.py +0 -0
  90. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_lightweight_charts.py +0 -0
  91. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_logging.py +0 -0
  92. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_loguru.py +0 -0
  93. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_luigi.py +0 -0
  94. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_math.py +0 -0
  95. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_memory_profiler.py +0 -0
  96. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_modules.py +0 -0
  97. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_more_itertools.py +0 -0
  98. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_numpy.py +0 -0
  99. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_operator.py +0 -0
  100. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_optuna.py +0 -0
  101. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_os.py +0 -0
  102. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pathlib.py +0 -0
  103. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_period.py +0 -0
  104. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pickle.py +0 -0
  105. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_platform.py +0 -0
  106. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_polars_ols.py +0 -0
  107. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pqdm.py +0 -0
  108. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pydantic.py +0 -0
  109. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pyinstrument.py +0 -0
  110. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pyrsistent.py +0 -0
  111. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pytest.py +0 -0
  112. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_pytest_regressions.py +0 -0
  113. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_python_dotenv.py +0 -0
  114. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_random.py +0 -0
  115. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_re.py +0 -0
  116. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_redis.py +0 -0
  117. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_reprlib.py +0 -0
  118. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_rich.py +0 -0
  119. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_scipy.py +0 -0
  120. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sentinel.py +0 -0
  121. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_shelve.py +0 -0
  122. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_slack_sdk.py +0 -0
  123. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_socket.py +0 -0
  124. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sqlalchemy.py +0 -0
  125. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  126. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_statsmodel.py +0 -0
  127. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_streamlit.py +0 -0
  128. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_sys.py +0 -0
  129. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_tempfile.py +0 -0
  130. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_tenacity.py +0 -0
  131. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_text.py +0 -0
  132. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_threading.py +0 -0
  133. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_timer.py +0 -0
  134. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback.py +0 -0
  135. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/__init__.py +0 -0
  136. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/chain.py +0 -0
  137. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  138. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  139. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  140. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/many.py +0 -0
  141. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/one.py +0 -0
  142. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/recursive.py +0 -0
  143. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  144. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  145. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/two.py +0 -0
  146. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_traceback_funcs/untraced.py +0 -0
  147. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_types.py +0 -0
  148. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing.py +0 -0
  149. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  150. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  151. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  152. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_uuid.py +0 -0
  153. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_version.py +0 -0
  154. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_warnings.py +0 -0
  155. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/tests/test_zipfile.py +0 -0
  156. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/altair.py +0 -0
  157. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/astor.py +0 -0
  158. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/asyncio.py +0 -0
  159. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/atomicwrites.py +0 -0
  160. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/atools.py +0 -0
  161. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/cachetools.py +0 -0
  162. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/click.py +0 -0
  163. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/concurrent.py +0 -0
  164. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/contextlib.py +0 -0
  165. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/contextvars.py +0 -0
  166. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/cryptography.py +0 -0
  167. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/cvxpy.py +0 -0
  168. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/dataclasses.py +0 -0
  169. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/enum.py +0 -0
  170. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/errors.py +0 -0
  171. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/eventkit.py +0 -0
  172. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/functions.py +0 -0
  173. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/functools.py +0 -0
  174. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/getpass.py +0 -0
  175. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/git.py +0 -0
  176. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/hashlib.py +0 -0
  177. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/http.py +0 -0
  178. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/ipython.py +0 -0
  179. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/iterables.py +0 -0
  180. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/jupyter.py +0 -0
  181. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/lightweight_charts.py +0 -0
  182. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/loguru.py +0 -0
  183. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/luigi.py +0 -0
  184. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/math.py +0 -0
  185. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/memory_profiler.py +0 -0
  186. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/modules.py +0 -0
  187. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/more_itertools.py +0 -0
  188. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/numpy.py +0 -0
  189. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/operator.py +0 -0
  190. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/optuna.py +0 -0
  191. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/orjson.py +0 -0
  192. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/os.py +0 -0
  193. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pathlib.py +0 -0
  194. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/period.py +0 -0
  195. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pickle.py +0 -0
  196. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/platform.py +0 -0
  197. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/polars.py +0 -0
  198. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/polars_ols.py +0 -0
  199. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pqdm.py +0 -0
  200. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/py.typed +0 -0
  201. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pydantic.py +0 -0
  202. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pyrsistent.py +0 -0
  203. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pytest.py +0 -0
  204. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/pytest_regressions.py +0 -0
  205. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/python_dotenv.py +0 -0
  206. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/random.py +0 -0
  207. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/re.py +0 -0
  208. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/redis.py +0 -0
  209. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/reprlib.py +0 -0
  210. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/rich.py +0 -0
  211. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/scipy.py +0 -0
  212. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sentinel.py +0 -0
  213. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/shelve.py +0 -0
  214. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/slack_sdk.py +0 -0
  215. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/socket.py +0 -0
  216. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sqlalchemy.py +0 -0
  217. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sqlalchemy_polars.py +0 -0
  218. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/statsmodels.py +0 -0
  219. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/streamlit.py +0 -0
  220. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/sys.py +0 -0
  221. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/tempfile.py +0 -0
  222. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/tenacity.py +0 -0
  223. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/text.py +0 -0
  224. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/threading.py +0 -0
  225. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/timer.py +0 -0
  226. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/types.py +0 -0
  227. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/typing.py +0 -0
  228. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/uuid.py +0 -0
  229. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/version.py +0 -0
  230. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/warnings.py +0 -0
  231. {dycw_utilities-0.111.0 → dycw_utilities-0.112.0}/src/utilities/zipfile.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.111.0
3
+ Version: 0.112.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -94,7 +94,7 @@ dependencies = [
94
94
  name = "dycw-utilities"
95
95
  readme = "README.md"
96
96
  requires-python = ">= 3.12"
97
- version = "0.111.0"
97
+ version = "0.112.0"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  test = [
@@ -337,7 +337,7 @@ zzz-test-zoneinfo = [
337
337
  # bump-my-version
338
338
  [tool.bumpversion]
339
339
  allow_dirty = true
340
- current_version = "0.111.0"
340
+ current_version = "0.112.0"
341
341
 
342
342
  [[tool.bumpversion.files]]
343
343
  filename = "src/utilities/__init__.py"
@@ -33,7 +33,8 @@ from utilities.datetime import get_now
33
33
  from utilities.functions import ensure_class
34
34
  from utilities.hypothesis import text_ascii, zoned_datetimes
35
35
  from utilities.polars import DatetimeUTC, zoned_datetime
36
- from utilities.zoneinfo import UTC, HongKong, Tokyo
36
+ from utilities.tzdata import HongKong, Tokyo
37
+ from utilities.zoneinfo import UTC
37
38
 
38
39
  if TYPE_CHECKING:
39
40
  from pathlib import Path
@@ -6,7 +6,6 @@ from math import isclose
6
6
  from operator import eq, gt, lt
7
7
  from re import search
8
8
  from typing import TYPE_CHECKING, Any, Self
9
- from zoneinfo import ZoneInfo
10
9
 
11
10
  from hypothesis import HealthCheck, assume, given, settings
12
11
  from hypothesis.strategies import (
@@ -38,13 +37,9 @@ from utilities.datetime import (
38
37
  MILLISECOND,
39
38
  MINUTE,
40
39
  MONTH,
41
- NOW_HK,
42
- NOW_TOKYO,
43
40
  NOW_UTC,
44
41
  QUARTER,
45
42
  SECOND,
46
- TODAY_HK,
47
- TODAY_TOKYO,
48
43
  TODAY_UTC,
49
44
  WEEK,
50
45
  YEAR,
@@ -98,14 +93,8 @@ from utilities.datetime import (
98
93
  get_half_years,
99
94
  get_months,
100
95
  get_now,
101
- get_now_hk,
102
- get_now_local,
103
- get_now_tokyo,
104
96
  get_quarters,
105
97
  get_today,
106
- get_today_hk,
107
- get_today_local,
108
- get_today_tokyo,
109
98
  get_years,
110
99
  is_integral_timedelta,
111
100
  is_local_datetime,
@@ -149,10 +138,12 @@ from utilities.hypothesis import (
149
138
  )
150
139
  from utilities.math import MAX_INT32, MIN_INT32, is_integral, round_to_float
151
140
  from utilities.sentinel import Sentinel, sentinel
152
- from utilities.zoneinfo import UTC, HongKong, Tokyo
141
+ from utilities.tzdata import HongKong
142
+ from utilities.zoneinfo import UTC
153
143
 
154
144
  if TYPE_CHECKING:
155
145
  from collections.abc import Callable
146
+ from zoneinfo import ZoneInfo
156
147
 
157
148
  from utilities.sentinel import Sentinel
158
149
  from utilities.types import (
@@ -686,24 +677,14 @@ class TestGetDateTime:
686
677
 
687
678
  class TestGetNow:
688
679
  @given(time_zone=timezones())
689
- def test_main(self, *, time_zone: ZoneInfo) -> None:
680
+ def test_function(self, *, time_zone: ZoneInfo) -> None:
690
681
  now = get_now(time_zone=time_zone)
691
682
  assert isinstance(now, dt.datetime)
692
683
  assert now.tzinfo is time_zone
693
684
 
694
- def test_local(self) -> None:
695
- now = get_now(time_zone="local")
696
- assert isinstance(now, dt.datetime)
697
- ETC = ZoneInfo("Etc/UTC") # noqa: N806
698
- assert now.tzinfo in {ETC, HongKong, Tokyo, UTC}
699
-
700
- @given(get_now=sampled_from([get_now, get_now_local, get_now_hk, get_now_tokyo]))
701
- def test_getters(self, *, get_now: Callable[[], dt.datetime]) -> None:
702
- assert isinstance(get_now(), dt.date)
703
-
704
- @given(now=sampled_from([NOW_UTC, NOW_HK, NOW_TOKYO]))
705
- def test_constants(self, *, now: dt.datetime) -> None:
706
- assert isinstance(now, dt.date)
685
+ def test_constant(self) -> None:
686
+ assert isinstance(NOW_UTC, dt.datetime)
687
+ assert NOW_UTC.tzinfo is UTC
707
688
 
708
689
 
709
690
  class TestGetTimedelta:
@@ -729,24 +710,12 @@ class TestGetTimedelta:
729
710
 
730
711
  class TestGetToday:
731
712
  @given(time_zone=timezones())
732
- def test_main(self, *, time_zone: ZoneInfo) -> None:
713
+ def test_function(self, *, time_zone: ZoneInfo) -> None:
733
714
  today = get_today(time_zone=time_zone)
734
715
  assert isinstance(today, dt.date)
735
716
 
736
- @given(
737
- get_today=sampled_from([
738
- get_today,
739
- get_today_local,
740
- get_today_hk,
741
- get_today_tokyo,
742
- ])
743
- )
744
- def test_getters(self, *, get_today: Callable[[], dt.datetime]) -> None:
745
- assert isinstance(get_today(), dt.date)
746
-
747
- @given(today=sampled_from([TODAY_UTC, TODAY_HK, TODAY_TOKYO]))
748
- def test_constants(self, *, today: dt.date) -> None:
749
- assert isinstance(today, dt.date)
717
+ def test_constant(self) -> None:
718
+ assert isinstance(TODAY_UTC, dt.date)
750
719
 
751
720
 
752
721
  class TestIsIntegralTimeDelta:
@@ -51,7 +51,7 @@ from tests.test_typing_funcs.with_future import (
51
51
  DataClassFutureTypeLiteral,
52
52
  DataClassFutureTypeLiteralNullable,
53
53
  )
54
- from utilities.datetime import MINUTE, SECOND, get_now, get_now_local
54
+ from utilities.datetime import MINUTE, SECOND, get_now
55
55
  from utilities.functions import is_sequence_of
56
56
  from utilities.hypothesis import (
57
57
  assume_does_not_raise,
@@ -83,6 +83,7 @@ from utilities.polars import check_polars_dataframe, zoned_datetime
83
83
  from utilities.sentinel import Sentinel, sentinel
84
84
  from utilities.types import DateOrDateTime, LogLevel, MaybeIterable, PathLike
85
85
  from utilities.typing import get_args
86
+ from utilities.tzlocal import get_now_local
86
87
 
87
88
  if TYPE_CHECKING:
88
89
  from collections.abc import Sequence
@@ -124,7 +125,7 @@ class TestGetLogRecords:
124
125
  assert record.name == str(tmp_path)
125
126
  assert record.message == ""
126
127
  assert record.level == WARNING
127
- assert record.line_num == approx(92, rel=0.1)
128
+ assert record.line_num == approx(102, rel=0.1)
128
129
  assert abs(record.datetime - get_now()) <= MINUTE
129
130
  assert record.func_name == "test_main"
130
131
  assert record.stack_info is None
@@ -300,6 +300,43 @@ class TestSerializeAndParseObject:
300
300
 
301
301
 
302
302
  class TestParseObject:
303
+ @given(text=sampled_from(["F_a_l_s_e", "T_r_u_e"]))
304
+ def test_bool_custom(self, *, text: str) -> None:
305
+ def parser(text: str, /) -> bool:
306
+ match text:
307
+ case "F_a_l_s_e":
308
+ return False
309
+ case "T_r_u_e":
310
+ return True
311
+ case _:
312
+ raise ImpossibleCaseError(case=[f"{text=}"])
313
+
314
+ bool_ = parse_object(bool, text, extra={bool: parser})
315
+ match text:
316
+ case "F_a_l_s_e":
317
+ expected = False
318
+ case "T_r_u_e":
319
+ expected = True
320
+ case _:
321
+ raise ImpossibleCaseError(case=[f"{text=}"])
322
+ assert bool_ is expected
323
+
324
+ @given(text=sampled_from(["F_a_l_s_e", "T_r_u_e"]))
325
+ def test_bool_extra_not_used(self, *, text: str) -> None:
326
+ def parser(text: str, /) -> bool:
327
+ match text:
328
+ case "F_a_l_s_e":
329
+ return False
330
+ case "T_r_u_e":
331
+ return True
332
+ case _:
333
+ raise ImpossibleCaseError(case=[f"{text=}"])
334
+
335
+ with raises(
336
+ _ParseObjectParseError, match="Unable to parse <class 'bool'>; got '.*'"
337
+ ):
338
+ _ = parse_object(bool, text, extra={int: parser})
339
+
303
340
  def test_error_bool(self) -> None:
304
341
  with raises(
305
342
  _ParseObjectParseError,
@@ -531,6 +568,32 @@ class TestParseObject:
531
568
 
532
569
 
533
570
  class TestSerializeObject:
571
+ @given(bool_=booleans())
572
+ def test_bool_custom(self, *, bool_: bool) -> None:
573
+ def serializer(bool_: bool, /) -> str: # noqa: FBT001
574
+ match bool_:
575
+ case True:
576
+ return "1"
577
+ case False:
578
+ return "0"
579
+
580
+ serialized = serialize_object(bool_, extra={bool: serializer})
581
+ match bool_:
582
+ case True:
583
+ expected = "1"
584
+ case False:
585
+ expected = "0"
586
+ assert serialized == expected
587
+
588
+ @given(bool_=booleans())
589
+ def test_bool_extra_not_used(self, *, bool_: bool) -> None:
590
+ def serializer(int_: int, /) -> str:
591
+ return f"({int_})"
592
+
593
+ serialized = serialize_object(bool_, extra={int: serializer})
594
+ expected = str(bool_)
595
+ assert serialized == expected
596
+
534
597
  @given(int_=integers())
535
598
  def test_type_with_extra(self, *, int_: int) -> None:
536
599
  obj = DataClassFutureInt(int_=int_)
@@ -156,8 +156,8 @@ from utilities.polars import (
156
156
  )
157
157
  from utilities.random import get_state
158
158
  from utilities.sentinel import Sentinel, sentinel
159
- from utilities.tzdata import USCentral, USEastern
160
- from utilities.zoneinfo import UTC, HongKong, Tokyo, get_time_zone_name
159
+ from utilities.tzdata import HongKong, Tokyo, USCentral, USEastern
160
+ from utilities.zoneinfo import UTC, get_time_zone_name
161
161
 
162
162
  if TYPE_CHECKING:
163
163
  from collections.abc import Callable, Mapping, Sequence
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime as dt
4
+ from typing import TYPE_CHECKING
5
+ from zoneinfo import ZoneInfo
6
+
7
+ from hypothesis import given
8
+ from hypothesis.strategies import sampled_from
9
+
10
+ from utilities.tzdata import (
11
+ NOW_HONG_KONG,
12
+ NOW_TOKYO,
13
+ TODAY_HONG_KONG,
14
+ TODAY_TOKYO,
15
+ HongKong,
16
+ Tokyo,
17
+ USCentral,
18
+ USEastern,
19
+ get_now_hong_kong,
20
+ get_now_tokyo,
21
+ get_today_hong_kong,
22
+ get_today_tokyo,
23
+ )
24
+
25
+ if TYPE_CHECKING:
26
+ from collections.abc import Callable
27
+
28
+
29
+ class TestGetNow:
30
+ @given(case=sampled_from([(get_now_hong_kong, HongKong), (get_now_tokyo, Tokyo)]))
31
+ def test_function(
32
+ self, *, case: tuple[Callable[[], dt.datetime], ZoneInfo]
33
+ ) -> None:
34
+ func, time_zone = case
35
+ self._assert(func(), time_zone)
36
+
37
+ @given(case=sampled_from([(NOW_HONG_KONG, HongKong), (NOW_TOKYO, Tokyo)]))
38
+ def test_constant(self, *, case: tuple[dt.datetime, ZoneInfo]) -> None:
39
+ datetime, time_zone = case
40
+ self._assert(datetime, time_zone)
41
+
42
+ def _assert(self, datetime: dt.datetime, time_zone: ZoneInfo, /) -> None:
43
+ assert isinstance(datetime, dt.datetime)
44
+ assert datetime.tzinfo is time_zone
45
+
46
+
47
+ class TestGetToday:
48
+ @given(func=sampled_from([get_today_hong_kong, get_today_tokyo]))
49
+ def test_function(self, *, func: Callable[[], dt.date]) -> None:
50
+ assert isinstance(func(), dt.date)
51
+
52
+ @given(date=sampled_from([TODAY_HONG_KONG, TODAY_TOKYO]))
53
+ def test_constant(self, *, date: dt.date) -> None:
54
+ assert isinstance(date, dt.date)
55
+
56
+
57
+ class TestTimeZones:
58
+ @given(time_zone=sampled_from([HongKong, Tokyo, USCentral, USEastern]))
59
+ def test_main(self, *, time_zone: ZoneInfo) -> None:
60
+ assert isinstance(time_zone, ZoneInfo)
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime as dt
4
+ from zoneinfo import ZoneInfo
5
+
6
+ from utilities.tzdata import HongKong, Tokyo
7
+ from utilities.tzlocal import (
8
+ NOW_LOCAL,
9
+ TODAY_LOCAL,
10
+ get_local_time_zone,
11
+ get_now_local,
12
+ get_today_local,
13
+ )
14
+ from utilities.zoneinfo import UTC
15
+
16
+
17
+ class TestGetLocalTimeZone:
18
+ def test_main(self) -> None:
19
+ time_zone = get_local_time_zone()
20
+ assert isinstance(time_zone, ZoneInfo)
21
+
22
+
23
+ class TestGetNowLocal:
24
+ def test_function(self) -> None:
25
+ self._assert(get_now_local())
26
+
27
+ def test_constant(self) -> None:
28
+ self._assert(NOW_LOCAL)
29
+
30
+ def _assert(self, datetime: dt.datetime, /) -> None:
31
+ assert isinstance(datetime, dt.datetime)
32
+ ETC = ZoneInfo("Etc/UTC") # noqa: N806
33
+ assert datetime.tzinfo in {ETC, HongKong, Tokyo, UTC}
34
+
35
+
36
+ class TestGetTodayLocal:
37
+ def test_function(self) -> None:
38
+ assert isinstance(get_today_local(), dt.date)
39
+
40
+ def test_constant(self) -> None:
41
+ assert isinstance(TODAY_LOCAL, dt.date)
@@ -40,6 +40,7 @@ from utilities.hypothesis import (
40
40
  timedeltas_2w,
41
41
  zoned_datetimes,
42
42
  )
43
+ from utilities.tzdata import HongKong
43
44
  from utilities.whenever import (
44
45
  MAX_SERIALIZABLE_TIMEDELTA,
45
46
  MIN_SERIALIZABLE_TIMEDELTA,
@@ -89,11 +90,12 @@ from utilities.whenever import (
89
90
  serialize_timedelta,
90
91
  serialize_zoned_datetime,
91
92
  )
92
- from utilities.zoneinfo import UTC, HongKong, get_time_zone_name
93
+ from utilities.zoneinfo import UTC, get_time_zone_name
93
94
 
94
95
  if TYPE_CHECKING:
95
96
  from utilities.types import Duration
96
97
 
98
+
97
99
  _TIMEDELTA_MICROSECONDS = int(1e18) * MICROSECOND
98
100
  _TIMEDELTA_OVERFLOW = dt.timedelta(days=106751991, seconds=14454, microseconds=775808)
99
101
 
@@ -9,11 +9,10 @@ from hypothesis.strategies import DataObject, data, datetimes, sampled_from, tim
9
9
  from pytest import raises
10
10
 
11
11
  from utilities.hypothesis import zoned_datetimes
12
+ from utilities.tzdata import HongKong, Tokyo
12
13
  from utilities.tzlocal import get_local_time_zone
13
14
  from utilities.zoneinfo import (
14
15
  UTC,
15
- HongKong,
16
- Tokyo,
17
16
  _EnsureTimeZoneInvalidTZInfoError,
18
17
  _EnsureTimeZoneLocalDateTimeError,
19
18
  ensure_time_zone,
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.111.0"
3
+ __version__ = "0.112.0"
@@ -23,13 +23,7 @@ from utilities.platform import SYSTEM
23
23
  from utilities.sentinel import Sentinel, sentinel
24
24
  from utilities.types import MaybeStr
25
25
  from utilities.typing import is_instance_gen
26
- from utilities.zoneinfo import (
27
- UTC,
28
- HongKong,
29
- Tokyo,
30
- ensure_time_zone,
31
- get_time_zone_name,
32
- )
26
+ from utilities.zoneinfo import UTC, ensure_time_zone, get_time_zone_name
33
27
 
34
28
  if TYPE_CHECKING:
35
29
  from collections.abc import Iterator
@@ -525,28 +519,6 @@ def get_now(*, time_zone: TimeZoneLike = UTC) -> dt.datetime:
525
519
  NOW_UTC = get_now(time_zone=UTC)
526
520
 
527
521
 
528
- def get_now_hk() -> dt.datetime:
529
- """Get the current time in Hong Kong."""
530
- return dt.datetime.now(tz=HongKong)
531
-
532
-
533
- NOW_HK = get_now_hk()
534
-
535
-
536
- def get_now_local() -> dt.datetime:
537
- """Get the current time in local."""
538
- return get_now(time_zone="local")
539
- # don't define `NOW_LOCAL` as this would require `tzlocal`
540
-
541
-
542
- def get_now_tokyo() -> dt.datetime:
543
- """Get the current time in Tokyo."""
544
- return dt.datetime.now(tz=Tokyo)
545
-
546
-
547
- NOW_TOKYO = get_now_tokyo()
548
-
549
-
550
522
  ##
551
523
 
552
524
 
@@ -570,27 +542,6 @@ def get_today(*, time_zone: TimeZoneLike = UTC) -> dt.date:
570
542
  TODAY_UTC = get_today(time_zone=UTC)
571
543
 
572
544
 
573
- def get_today_hk() -> dt.date:
574
- """Get the current date in Hong Kong."""
575
- return get_now_hk().date()
576
-
577
-
578
- TODAY_HK = get_today_hk()
579
-
580
-
581
- def get_today_local() -> dt.date:
582
- """Get the current, timezone-aware local date."""
583
- return get_now_local().date()
584
-
585
-
586
- def get_today_tokyo() -> dt.date:
587
- """Get the current date in Tokyo."""
588
- return get_now_tokyo().date()
589
-
590
-
591
- TODAY_TOKYO = get_today_tokyo()
592
-
593
-
594
545
  ##
595
546
 
596
547
 
@@ -1279,13 +1230,9 @@ __all__ = [
1279
1230
  "MIN_DATE_TWO_DIGIT_YEAR",
1280
1231
  "MIN_MONTH",
1281
1232
  "MONTH",
1282
- "NOW_HK",
1283
- "NOW_TOKYO",
1284
1233
  "NOW_UTC",
1285
1234
  "QUARTER",
1286
1235
  "SECOND",
1287
- "TODAY_HK",
1288
- "TODAY_TOKYO",
1289
1236
  "TODAY_UTC",
1290
1237
  "WEEK",
1291
1238
  "YEAR",
@@ -1335,14 +1282,8 @@ __all__ = [
1335
1282
  "get_half_years",
1336
1283
  "get_months",
1337
1284
  "get_now",
1338
- "get_now_hk",
1339
- "get_now_local",
1340
- "get_now_tokyo",
1341
1285
  "get_quarters",
1342
1286
  "get_today",
1343
- "get_today_hk",
1344
- "get_today_local",
1345
- "get_today_tokyo",
1346
1287
  "get_years",
1347
1288
  "is_integral_timedelta",
1348
1289
  "is_local_datetime",
@@ -7,7 +7,7 @@ from fastapi import FastAPI
7
7
  from uvicorn import Config, Server
8
8
 
9
9
  from utilities.asyncio import AsyncService
10
- from utilities.datetime import SECOND, datetime_duration_to_float, get_now_local
10
+ from utilities.datetime import SECOND, datetime_duration_to_float
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from utilities.types import Duration
@@ -26,6 +26,7 @@ class _PingerReceiverApp(FastAPI):
26
26
 
27
27
  @self.get("/ping") # skipif-ci
28
28
  def ping() -> str:
29
+ from utilities.tzlocal import get_now_local # skipif-ci
29
30
  from utilities.whenever import serialize_zoned_datetime # skipif-ci
30
31
 
31
32
  now = serialize_zoned_datetime(get_now_local()) # skipif-ci
@@ -6,8 +6,6 @@ from typing import TYPE_CHECKING, override
6
6
  from fpdf import FPDF
7
7
  from fpdf.enums import XPos, YPos
8
8
 
9
- from utilities.datetime import get_now_local
10
-
11
9
  if TYPE_CHECKING:
12
10
  from collections.abc import Iterator
13
11
 
@@ -45,6 +43,8 @@ def yield_pdf(*, header: str | None = None) -> Iterator[_BasePDF]:
45
43
 
46
44
  @override
47
45
  def footer(self) -> None:
46
+ from utilities.tzlocal import get_now_local
47
+
48
48
  self.set_y(-15)
49
49
  self.set_font(family="Helvetica", style="I", size=8)
50
50
  page_no, now = self.page_no(), get_now_local()
@@ -69,7 +69,6 @@ from utilities.datetime import (
69
69
  date_to_month,
70
70
  datetime_duration_to_float,
71
71
  datetime_duration_to_timedelta,
72
- get_now_local,
73
72
  round_datetime,
74
73
  )
75
74
  from utilities.functions import ensure_int, ensure_str, max_nullable, min_nullable
@@ -1440,6 +1439,7 @@ def yield_test_redis(data: DataObject, /) -> AbstractAsyncContextManager[_TestRe
1440
1439
  from redis.exceptions import ResponseError # skipif-ci-and-not-linux
1441
1440
 
1442
1441
  from utilities.redis import _TestRedis, yield_redis # skipif-ci-and-not-linux
1442
+ from utilities.tzlocal import get_now_local # skipif-ci-and-not-linux
1443
1443
 
1444
1444
  now = get_now_local() # skipif-ci-and-not-linux
1445
1445
  uuid = data.draw(uuids()) # skipif-ci-and-not-linux
@@ -37,11 +37,9 @@ from typing import (
37
37
  override,
38
38
  )
39
39
 
40
- from utilities.atomicwrites import move_many, writer
41
40
  from utilities.dataclasses import replace_non_sentinel
42
41
  from utilities.datetime import (
43
42
  SECOND,
44
- get_now_local,
45
43
  maybe_sub_pct_y,
46
44
  parse_datetime_compact,
47
45
  round_datetime,
@@ -200,6 +198,8 @@ def _compute_rollover_actions(
200
198
  patterns: _RolloverPatterns | None = None,
201
199
  backup_count: int = 1,
202
200
  ) -> _RolloverActions:
201
+ from utilities.tzlocal import get_now_local # skipif-ci-and-windows
202
+
203
203
  patterns = ( # skipif-ci-and-windows
204
204
  _compute_rollover_patterns(stem, suffix) if patterns is None else patterns
205
205
  )
@@ -244,6 +244,8 @@ class _RolloverActions:
244
244
  rotations: set[_Rotation] = field(default_factory=set)
245
245
 
246
246
  def do(self) -> None:
247
+ from utilities.atomicwrites import move_many # skipif-ci-and-windows
248
+
247
249
  for deletion in self.deletions: # skipif-ci-and-windows
248
250
  deletion.delete()
249
251
  move_many( # skipif-ci-and-windows
@@ -388,6 +390,9 @@ class StandaloneFileHandler(Handler):
388
390
 
389
391
  @override
390
392
  def emit(self, record: LogRecord) -> None:
393
+ from utilities.atomicwrites import writer
394
+ from utilities.tzlocal import get_now_local
395
+
391
396
  try:
392
397
  path = (
393
398
  resolve_path(path=self._path)