dycw-utilities 0.168.0__tar.gz → 0.168.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.

Potentially problematic release.


This version of dycw-utilities might be problematic. Click here for more details.

Files changed (221) hide show
  1. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/PKG-INFO +2 -2
  2. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/pyproject.toml +4 -4
  3. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/conftest.py +1 -1
  4. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_click.py +9 -9
  5. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_hypothesis.py +9 -9
  6. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_logging.py +2 -0
  7. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pydantic_settings.py +19 -4
  8. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_whenever.py +9 -9
  9. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/__init__.py +1 -1
  10. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/click.py +9 -9
  11. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/hypothesis.py +1 -1
  12. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/orjson.py +17 -17
  13. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/parse.py +2 -2
  14. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pydantic_settings.py +12 -1
  15. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest.py +2 -2
  16. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/timer.py +2 -2
  17. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/traceback.py +1 -1
  18. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/typed_settings.py +9 -9
  19. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/whenever.py +5 -5
  20. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/.gitignore +0 -0
  21. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/LICENSE +0 -0
  22. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/README.md +0 -0
  23. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/__init__.py +0 -0
  24. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/__init__.py +0 -0
  25. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_missing/__init__.py +0 -0
  26. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_missing/module.py +0 -0
  27. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/__init__.py +0 -0
  28. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/outer_1.py +0 -0
  29. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/outer_2.py +0 -0
  30. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  31. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  32. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  33. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  34. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_without/__init__.py +0 -0
  35. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_without/module_1.py +0 -0
  36. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/package_without/module_2.py +0 -0
  37. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/standalone.py +0 -0
  38. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/modules/with_imports.py +0 -0
  39. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  40. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  41. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  42. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  43. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  44. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  45. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  46. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  47. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_aeventkit.py +0 -0
  48. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_altair.py +0 -0
  49. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_asyncio.py +0 -0
  50. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_atomicwrites.py +0 -0
  51. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_atools.py +0 -0
  52. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_cachetools.py +0 -0
  53. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_concurrent.py +0 -0
  54. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_contextlib.py +0 -0
  55. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_contextvars.py +0 -0
  56. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_cryptography.py +0 -0
  57. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_cvxpy.py +0 -0
  58. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_dataclasses.py +0 -0
  59. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_docker.py +0 -0
  60. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_enum.py +0 -0
  61. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_errors.py +0 -0
  62. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_fastapi.py +0 -0
  63. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_fpdf2.py +0 -0
  64. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_functions.py +0 -0
  65. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_functools.py +0 -0
  66. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_getpass.py +0 -0
  67. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_git.py +0 -0
  68. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_gzip.py +0 -0
  69. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_hashlib.py +0 -0
  70. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_http.py +0 -0
  71. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_importlib.py +0 -0
  72. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_inflect.py +0 -0
  73. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_ipython.py +0 -0
  74. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_iterables.py +0 -0
  75. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_jinja2.py +0 -0
  76. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_json.py +0 -0
  77. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_jupyter.py +0 -0
  78. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_libcst.py +0 -0
  79. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_lightweight_charts.py +0 -0
  80. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_math.py +0 -0
  81. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_memory_profiler.py +0 -0
  82. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_modules.py +0 -0
  83. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_more_itertools.py +0 -0
  84. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_numpy.py +0 -0
  85. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_objects/__init__.py +0 -0
  86. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_objects/objects.py +0 -0
  87. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_operator.py +0 -0
  88. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_optuna.py +0 -0
  89. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_orjson.py +0 -0
  90. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_os.py +0 -0
  91. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_parse.py +0 -0
  92. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pathlib.py +0 -0
  93. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pickle.py +0 -0
  94. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_platform.py +0 -0
  95. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_polars.py +0 -0
  96. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_polars_ols.py +0 -0
  97. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_postgres.py +0 -0
  98. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pottery.py +0 -0
  99. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pqdm.py +0 -0
  100. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_psutil.py +0 -0
  101. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pydantic_settings_sops.py +0 -0
  102. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pyinstrument.py +0 -0
  103. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pytest.py +0 -0
  104. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pytest_randomly.py +0 -0
  105. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_pytest_regressions.py +0 -0
  106. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_random.py +0 -0
  107. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_re.py +0 -0
  108. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_redis.py +0 -0
  109. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_reprlib.py +0 -0
  110. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_scipy.py +0 -0
  111. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_sentinel.py +0 -0
  112. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_shelve.py +0 -0
  113. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_slack_sdk.py +0 -0
  114. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_socket.py +0 -0
  115. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_sqlalchemy.py +0 -0
  116. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  117. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_statsmodels.py +0 -0
  118. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_string.py +0 -0
  119. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_tempfile.py +0 -0
  120. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_testbook.py +0 -0
  121. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_text.py +0 -0
  122. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_threading.py +0 -0
  123. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_timer.py +0 -0
  124. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_traceback.py +0 -0
  125. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typed_settings.py +0 -0
  126. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_types.py +0 -0
  127. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing.py +0 -0
  128. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  129. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  130. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  131. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_tzdata.py +0 -0
  132. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_tzlocal.py +0 -0
  133. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_uuid.py +0 -0
  134. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_version.py +0 -0
  135. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_warnings.py +0 -0
  136. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_zipfile.py +0 -0
  137. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/tests/test_zoneinfo.py +0 -0
  138. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/aeventkit.py +0 -0
  139. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/altair.py +0 -0
  140. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/asyncio.py +0 -0
  141. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/atomicwrites.py +0 -0
  142. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/atools.py +0 -0
  143. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/cachetools.py +0 -0
  144. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/concurrent.py +0 -0
  145. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/contextlib.py +0 -0
  146. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/contextvars.py +0 -0
  147. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/cryptography.py +0 -0
  148. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/cvxpy.py +0 -0
  149. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/dataclasses.py +0 -0
  150. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/docker.py +0 -0
  151. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/enum.py +0 -0
  152. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/errors.py +0 -0
  153. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/fastapi.py +0 -0
  154. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/fpdf2.py +0 -0
  155. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/functions.py +0 -0
  156. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/functools.py +0 -0
  157. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/getpass.py +0 -0
  158. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/git.py +0 -0
  159. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/gzip.py +0 -0
  160. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/hashlib.py +0 -0
  161. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/http.py +0 -0
  162. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/importlib.py +0 -0
  163. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/inflect.py +0 -0
  164. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/ipython.py +0 -0
  165. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/iterables.py +0 -0
  166. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/jinja2.py +0 -0
  167. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/json.py +0 -0
  168. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/jupyter.py +0 -0
  169. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/libcst.py +0 -0
  170. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/lightweight_charts.py +0 -0
  171. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/logging.py +0 -0
  172. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/math.py +0 -0
  173. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/memory_profiler.py +0 -0
  174. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/modules.py +0 -0
  175. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/more_itertools.py +0 -0
  176. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/numpy.py +0 -0
  177. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/operator.py +0 -0
  178. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/optuna.py +0 -0
  179. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/os.py +0 -0
  180. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pathlib.py +0 -0
  181. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pickle.py +0 -0
  182. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/platform.py +0 -0
  183. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/polars.py +0 -0
  184. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/polars_ols.py +0 -0
  185. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/postgres.py +0 -0
  186. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pottery.py +0 -0
  187. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pqdm.py +0 -0
  188. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/psutil.py +0 -0
  189. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/py.typed +0 -0
  190. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pydantic_settings_sops.py +0 -0
  191. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pyinstrument.py +0 -0
  192. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_plugins/__init__.py +0 -0
  193. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  194. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  195. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/pytest_regressions.py +0 -0
  196. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/random.py +0 -0
  197. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/re.py +0 -0
  198. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/redis.py +0 -0
  199. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/reprlib.py +0 -0
  200. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/scipy.py +0 -0
  201. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/sentinel.py +0 -0
  202. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/shelve.py +0 -0
  203. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/slack_sdk.py +0 -0
  204. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/socket.py +0 -0
  205. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/sqlalchemy.py +0 -0
  206. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/sqlalchemy_polars.py +0 -0
  207. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/statsmodels.py +0 -0
  208. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/string.py +0 -0
  209. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/tempfile.py +0 -0
  210. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/testbook.py +0 -0
  211. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/text.py +0 -0
  212. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/threading.py +0 -0
  213. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/types.py +0 -0
  214. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/typing.py +0 -0
  215. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/tzdata.py +0 -0
  216. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/tzlocal.py +0 -0
  217. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/uuid.py +0 -0
  218. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/version.py +0 -0
  219. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/warnings.py +0 -0
  220. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/zipfile.py +0 -0
  221. {dycw_utilities-0.168.0 → dycw_utilities-0.168.2}/src/utilities/zoneinfo.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.168.0
3
+ Version: 0.168.2
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
7
7
  Requires-Dist: atomicwrites<1.5,>=1.4.1
8
8
  Requires-Dist: typing-extensions<4.16,>=4.15.0
9
9
  Requires-Dist: tzlocal<5.4,>=5.3.1
10
- Requires-Dist: whenever<0.9,>=0.8.9
10
+ Requires-Dist: whenever<0.10,>=0.9.0
11
11
  Provides-Extra: logging
12
12
  Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
13
13
  Provides-Extra: test
@@ -31,7 +31,7 @@ core = [
31
31
  "atomicwrites >=1.4.1, <1.5",
32
32
  "typing-extensions >=4.15.0, <4.16",
33
33
  "tzlocal >=5.3.1, <5.4",
34
- "whenever >=0.8.9, <0.9",
34
+ "whenever >=0.9.0, <0.10",
35
35
  ]
36
36
  cryptography = [
37
37
  "cryptography >=46.0.1, <46.1",
@@ -244,12 +244,12 @@ dependencies = [
244
244
  "atomicwrites >=1.4.1, <1.5",
245
245
  "typing-extensions >=4.15.0, <4.16",
246
246
  "tzlocal >=5.3.1, <5.4",
247
- "whenever >=0.8.9, <0.9",
247
+ "whenever >=0.9.0, <0.10",
248
248
  ]
249
249
  name = "dycw-utilities"
250
250
  readme = "README.md"
251
251
  requires-python = ">= 3.12"
252
- version = "0.168.0"
252
+ version = "0.168.2"
253
253
 
254
254
  [project.entry-points.pytest11]
255
255
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -282,7 +282,7 @@ test = [
282
282
  # bump-my-version
283
283
  [tool.bumpversion]
284
284
  allow_dirty = true
285
- current_version = "0.168.0"
285
+ current_version = "0.168.2"
286
286
 
287
287
  [[tool.bumpversion.files]]
288
288
  filename = "src/utilities/__init__.py"
@@ -176,7 +176,7 @@ def _is_to_drop(table: str, /) -> bool:
176
176
  text = extract_group(r"^(\d{8}T\d{2,})_", table)
177
177
  except ExtractGroupError:
178
178
  return True
179
- date_time = PlainDateTime.parse_common_iso(text)
179
+ date_time = PlainDateTime.parse_iso(text)
180
180
  age = now.difference(date_time, ignore_dst=True)
181
181
  return age >= MINUTE
182
182
 
@@ -124,21 +124,21 @@ class TestParameters:
124
124
  param=Date(),
125
125
  name="date",
126
126
  strategy=dates(),
127
- serialize=whenever.Date.format_common_iso,
127
+ serialize=whenever.Date.format_iso,
128
128
  failable=True,
129
129
  ),
130
130
  _Case(
131
131
  param=DateDelta(),
132
132
  name="date delta",
133
133
  strategy=date_deltas(parsable=True),
134
- serialize=whenever.DateDelta.format_common_iso,
134
+ serialize=whenever.DateDelta.format_iso,
135
135
  failable=True,
136
136
  ),
137
137
  _Case(
138
138
  param=DateTimeDelta(),
139
139
  name="date-time delta",
140
140
  strategy=date_time_deltas(parsable=True),
141
- serialize=whenever.DateTimeDelta.format_common_iso,
141
+ serialize=whenever.DateTimeDelta.format_iso,
142
142
  failable=True,
143
143
  ),
144
144
  _Case(
@@ -222,7 +222,7 @@ class TestParameters:
222
222
  param=MonthDay(),
223
223
  name="month-day",
224
224
  strategy=month_days(),
225
- serialize=whenever.MonthDay.format_common_iso,
225
+ serialize=whenever.MonthDay.format_iso,
226
226
  failable=True,
227
227
  ),
228
228
  _Case(
@@ -232,21 +232,21 @@ class TestParameters:
232
232
  param=PlainDateTime(),
233
233
  name="plain date-time",
234
234
  strategy=plain_date_times(),
235
- serialize=whenever.PlainDateTime.format_common_iso,
235
+ serialize=whenever.PlainDateTime.format_iso,
236
236
  failable=True,
237
237
  ),
238
238
  _Case(
239
239
  param=Time(),
240
240
  name="time",
241
241
  strategy=times(),
242
- serialize=whenever.Time.format_common_iso,
242
+ serialize=whenever.Time.format_iso,
243
243
  failable=True,
244
244
  ),
245
245
  _Case(
246
246
  param=TimeDelta(),
247
247
  name="time-delta",
248
248
  strategy=time_deltas(),
249
- serialize=whenever.TimeDelta.format_common_iso,
249
+ serialize=whenever.TimeDelta.format_iso,
250
250
  failable=True,
251
251
  ),
252
252
  _Case(
@@ -256,14 +256,14 @@ class TestParameters:
256
256
  param=YearMonth(),
257
257
  name="year-month",
258
258
  strategy=year_months(),
259
- serialize=whenever.YearMonth.format_common_iso,
259
+ serialize=whenever.YearMonth.format_iso,
260
260
  failable=True,
261
261
  ),
262
262
  _Case(
263
263
  param=ZonedDateTime(),
264
264
  name="zoned date-time",
265
265
  strategy=zoned_date_times(),
266
- serialize=whenever.ZonedDateTime.format_common_iso,
266
+ serialize=whenever.ZonedDateTime.format_iso,
267
267
  failable=True,
268
268
  ),
269
269
  ]
@@ -209,7 +209,7 @@ class TestDateDeltas:
209
209
  if max_value is not None:
210
210
  assert days <= to_days(max_value)
211
211
  if parsable:
212
- assert DateDelta.parse_common_iso(delta.format_common_iso()) == delta
212
+ assert DateDelta.parse_iso(delta.format_iso()) == delta
213
213
 
214
214
 
215
215
  class TestDatePeriods:
@@ -247,7 +247,7 @@ class TestDateTimeDeltas:
247
247
  if max_value is not None:
248
248
  assert nanos <= to_nanoseconds(max_value)
249
249
  if parsable:
250
- assert DateTimeDelta.parse_common_iso(delta.format_common_iso()) == delta
250
+ assert DateTimeDelta.parse_iso(delta.format_iso()) == delta
251
251
  if nativable:
252
252
  assert isinstance(to_py_time_delta(delta), dt.timedelta)
253
253
 
@@ -262,7 +262,7 @@ class TestDates:
262
262
  dates(min_value=min_value, max_value=max_value, two_digit=two_digit)
263
263
  )
264
264
  assert isinstance(date, Date)
265
- assert Date.parse_common_iso(date.format_common_iso()) == date
265
+ assert Date.parse_iso(date.format_iso()) == date
266
266
  if min_value is not None:
267
267
  assert date >= min_value
268
268
  if max_value is not None:
@@ -722,7 +722,7 @@ class TestMonthDays:
722
722
  with assume_does_not_raise(InvalidArgument):
723
723
  month_day = data.draw(month_days(min_value=min_value, max_value=max_value))
724
724
  assert isinstance(month_day, MonthDay)
725
- assert MonthDay.parse_common_iso(month_day.format_common_iso()) == month_day
725
+ assert MonthDay.parse_iso(month_day.format_iso()) == month_day
726
726
  if min_value is not None:
727
727
  assert month_day >= min_value
728
728
  if max_value is not None:
@@ -786,7 +786,7 @@ class TestPlainDateTimes:
786
786
  plain_date_times(min_value=min_value, max_value=max_value)
787
787
  )
788
788
  assert isinstance(datetime, PlainDateTime)
789
- assert PlainDateTime.parse_common_iso(datetime.format_common_iso()) == datetime
789
+ assert PlainDateTime.parse_iso(datetime.format_iso()) == datetime
790
790
  if min_value is not None:
791
791
  assert datetime >= min_value
792
792
  if max_value is not None:
@@ -1037,7 +1037,7 @@ class TestTimeDeltas:
1037
1037
  with assume_does_not_raise(InvalidArgument):
1038
1038
  delta = data.draw(time_deltas(min_value=min_value, max_value=max_value))
1039
1039
  assert isinstance(delta, TimeDelta)
1040
- assert TimeDelta.parse_common_iso(delta.format_common_iso()) == delta
1040
+ assert TimeDelta.parse_iso(delta.format_iso()) == delta
1041
1041
  assert isinstance(to_py_time_delta(delta), dt.timedelta)
1042
1042
  if min_value is not None:
1043
1043
  assert delta >= min_value
@@ -1067,7 +1067,7 @@ class TestTimes:
1067
1067
  with assume_does_not_raise(InvalidArgument):
1068
1068
  time = data.draw(times(min_value=min_value, max_value=max_value))
1069
1069
  assert isinstance(time, Time)
1070
- assert Time.parse_common_iso(time.format_common_iso()) == time
1070
+ assert Time.parse_iso(time.format_iso()) == time
1071
1071
  if min_value is not None:
1072
1072
  assert time >= min_value
1073
1073
  if max_value is not None:
@@ -1204,7 +1204,7 @@ class TestYearMonths:
1204
1204
  )
1205
1205
  )
1206
1206
  assert isinstance(year_month, YearMonth)
1207
- assert YearMonth.parse_common_iso(year_month.format_common_iso()) == year_month
1207
+ assert YearMonth.parse_iso(year_month.format_iso()) == year_month
1208
1208
  if min_value is not None:
1209
1209
  assert year_month >= min_value
1210
1210
  if max_value is not None:
@@ -1258,7 +1258,7 @@ class TestZonedDateTimes:
1258
1258
  )
1259
1259
  assert isinstance(datetime, ZonedDateTime)
1260
1260
  _ = datetime.py_datetime()
1261
- assert ZonedDateTime.parse_common_iso(datetime.format_common_iso()) == datetime
1261
+ assert ZonedDateTime.parse_iso(datetime.format_iso()) == datetime
1262
1262
  assert datetime.tz == time_zone.key
1263
1263
  if min_value is not None:
1264
1264
  assert datetime >= min_value
@@ -449,10 +449,12 @@ class TestSizeAndTimeRotatingFileHandler:
449
449
  )
450
450
  )
451
451
 
452
+ await sleep(0.1)
452
453
  files = list(tmp_path.iterdir())
453
454
  assert len(files) == 1
454
455
  assert any(p for p in files if search(r"^log\.txt$", p.name))
455
456
 
457
+ await sleep(0.1)
456
458
  logger.warning("message 1")
457
459
  files = list(tmp_path.iterdir())
458
460
  assert len(files) == 1
@@ -6,10 +6,12 @@ from typing import TYPE_CHECKING, ClassVar
6
6
  import tomlkit
7
7
  import yaml
8
8
  from pydantic_settings import BaseSettings, SettingsConfigDict
9
+ from pytest import mark, param
9
10
 
10
11
  from utilities.os import temp_environ
11
12
  from utilities.pydantic_settings import (
12
13
  CustomBaseSettings,
14
+ HashableBaseSettings,
13
15
  PathLikeOrWithSection,
14
16
  load_settings,
15
17
  )
@@ -101,11 +103,12 @@ class TestCustomBaseSettings:
101
103
  settings = load_settings(Settings)
102
104
  assert settings.x == 1
103
105
 
104
- def test_env_var_with_nested(self) -> None:
106
+ @mark.parametrize("inner_cls", [param(BaseSettings), param(HashableBaseSettings)])
107
+ def test_env_var_with_nested(self, *, inner_cls: type[BaseSettings]) -> None:
105
108
  class Settings(CustomBaseSettings):
106
109
  inner: Inner
107
110
 
108
- class Inner(BaseSettings):
111
+ class Inner(inner_cls):
109
112
  x: int
110
113
 
111
114
  _ = Settings.model_rebuild()
@@ -114,12 +117,15 @@ class TestCustomBaseSettings:
114
117
  settings = load_settings(Settings)
115
118
  assert settings.inner.x == 1
116
119
 
117
- def test_env_var_with_prefix_and_nested(self) -> None:
120
+ @mark.parametrize("inner_cls", [param(BaseSettings), param(HashableBaseSettings)])
121
+ def test_env_var_with_prefix_and_nested(
122
+ self, *, inner_cls: type[BaseSettings]
123
+ ) -> None:
118
124
  class Settings(CustomBaseSettings):
119
125
  model_config = SettingsConfigDict(env_prefix="test__")
120
126
  inner: Inner
121
127
 
122
- class Inner(BaseSettings):
128
+ class Inner(inner_cls):
123
129
  x: int
124
130
 
125
131
  _ = Settings.model_rebuild()
@@ -131,3 +137,12 @@ class TestCustomBaseSettings:
131
137
  class Settings(CustomBaseSettings): ...
132
138
 
133
139
  _ = load_settings(Settings)
140
+
141
+
142
+ class TestHashableBaseSettings:
143
+ def test_hashable(self) -> None:
144
+ class Settings(HashableBaseSettings):
145
+ x: int = 1
146
+
147
+ settings = load_settings(Settings)
148
+ _ = hash(settings)
@@ -345,14 +345,14 @@ class TestFormatCompact:
345
345
  def test_date(self, *, date: Date) -> None:
346
346
  result = format_compact(date)
347
347
  assert isinstance(result, str)
348
- parsed = Date.parse_common_iso(result)
348
+ parsed = Date.parse_iso(result)
349
349
  assert parsed == date
350
350
 
351
351
  @given(time=times())
352
352
  def test_time(self, *, time: Time) -> None:
353
353
  result = format_compact(time)
354
354
  assert isinstance(result, str)
355
- parsed = Time.parse_common_iso(result)
355
+ parsed = Time.parse_iso(result)
356
356
  assert parsed.nanosecond == 0
357
357
  expected = time.round()
358
358
  assert parsed == expected
@@ -361,7 +361,7 @@ class TestFormatCompact:
361
361
  def test_plain_date_time(self, *, date_time: PlainDateTime) -> None:
362
362
  result = format_compact(date_time)
363
363
  assert isinstance(result, str)
364
- parsed = PlainDateTime.parse_common_iso(result)
364
+ parsed = PlainDateTime.parse_iso(result)
365
365
  assert parsed.nanosecond == 0
366
366
  expected = date_time.round()
367
367
  assert parsed == expected
@@ -736,10 +736,10 @@ class TestMinMax:
736
736
  _ = ZONED_DATE_TIME_MAX.add(microseconds=1)
737
737
 
738
738
  def _format_parse_date_delta(self, delta: DateDelta, /) -> None:
739
- _ = DateDelta.parse_common_iso(delta.format_common_iso())
739
+ _ = DateDelta.parse_iso(delta.format_iso())
740
740
 
741
741
  def _format_parse_date_time_delta(self, delta: DateTimeDelta, /) -> None:
742
- _ = DateTimeDelta.parse_common_iso(delta.format_common_iso())
742
+ _ = DateTimeDelta.parse_iso(delta.format_iso())
743
743
 
744
744
 
745
745
  class TestMinMaxDate:
@@ -1025,7 +1025,7 @@ class TestToDate:
1025
1025
 
1026
1026
  @given(date=dates())
1027
1027
  def test_str(self, *, date: Date) -> None:
1028
- assert to_date(date.format_common_iso()) == date
1028
+ assert to_date(date.format_iso()) == date
1029
1029
 
1030
1030
  @given(date=dates())
1031
1031
  def test_py_date(self, *, date: Date) -> None:
@@ -1482,7 +1482,7 @@ class TestToTime:
1482
1482
 
1483
1483
  @given(time=times())
1484
1484
  def test_str(self, *, time: Time) -> None:
1485
- assert to_time(time.format_common_iso()) == time
1485
+ assert to_time(time.format_iso()) == time
1486
1486
 
1487
1487
  @given(time=times())
1488
1488
  def test_py_time(self, *, time: Time) -> None:
@@ -1628,7 +1628,7 @@ class TestToZonedDateTime:
1628
1628
  def test_str(
1629
1629
  self, *, data: DataObject, date_time: ZonedDateTime, time_zone: ZoneInfo
1630
1630
  ) -> None:
1631
- text = date_time.format_common_iso()
1631
+ text = date_time.format_iso()
1632
1632
  text_use = data.draw(sampled_from([text, text.replace("/", "_")]))
1633
1633
  result = to_zoned_date_time(text_use, time_zone=time_zone)
1634
1634
  expected = date_time.to_tz(time_zone.key)
@@ -1699,7 +1699,7 @@ class TestToZonedDateTime:
1699
1699
 
1700
1700
 
1701
1701
  class TestTwoDigitYearMonth:
1702
- def test_parse_common_iso(self) -> None:
1702
+ def test_parse_iso(self) -> None:
1703
1703
  result = two_digit_year_month(0, 1)
1704
1704
  expected = YearMonth(2000, 1)
1705
1705
  assert result == expected
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.168.0"
3
+ __version__ = "0.168.2"
@@ -72,7 +72,7 @@ class Date(ParamType):
72
72
  return value
73
73
  case str():
74
74
  try:
75
- return whenever.Date.parse_common_iso(value)
75
+ return whenever.Date.parse_iso(value)
76
76
  except ValueError as error:
77
77
  self.fail(str(error), param, ctx)
78
78
  case never:
@@ -98,7 +98,7 @@ class DateDelta(ParamType):
98
98
  return value
99
99
  case str():
100
100
  try:
101
- return whenever.DateDelta.parse_common_iso(value)
101
+ return whenever.DateDelta.parse_iso(value)
102
102
  except ValueError as error:
103
103
  self.fail(str(error), param, ctx)
104
104
  case never:
@@ -124,7 +124,7 @@ class DateTimeDelta(ParamType):
124
124
  return value
125
125
  case str():
126
126
  try:
127
- return whenever.DateTimeDelta.parse_common_iso(value)
127
+ return whenever.DateTimeDelta.parse_iso(value)
128
128
  except ValueError as error:
129
129
  self.fail(str(error), param, ctx)
130
130
  case never:
@@ -235,7 +235,7 @@ class MonthDay(ParamType):
235
235
  return value
236
236
  case str():
237
237
  try:
238
- return whenever.MonthDay.parse_common_iso(value)
238
+ return whenever.MonthDay.parse_iso(value)
239
239
  except ValueError as error:
240
240
  self.fail(str(error), param, ctx)
241
241
  case never:
@@ -284,7 +284,7 @@ class PlainDateTime(ParamType):
284
284
  return value
285
285
  case str():
286
286
  try:
287
- return whenever.PlainDateTime.parse_common_iso(value)
287
+ return whenever.PlainDateTime.parse_iso(value)
288
288
  except ValueError as error:
289
289
  self.fail(str(error), param, ctx)
290
290
  case never:
@@ -310,7 +310,7 @@ class Time(ParamType):
310
310
  return value
311
311
  case str():
312
312
  try:
313
- return whenever.Time.parse_common_iso(value)
313
+ return whenever.Time.parse_iso(value)
314
314
  except ValueError as error:
315
315
  self.fail(str(error), param, ctx)
316
316
  case never:
@@ -336,7 +336,7 @@ class TimeDelta(ParamType):
336
336
  return value
337
337
  case str():
338
338
  try:
339
- return whenever.TimeDelta.parse_common_iso(value)
339
+ return whenever.TimeDelta.parse_iso(value)
340
340
  except ValueError as error:
341
341
  self.fail(str(error), param, ctx)
342
342
  case never:
@@ -388,7 +388,7 @@ class YearMonth(ParamType):
388
388
  return value
389
389
  case str():
390
390
  try:
391
- return whenever.YearMonth.parse_common_iso(value)
391
+ return whenever.YearMonth.parse_iso(value)
392
392
  except ValueError as error:
393
393
  self.fail(str(error), param, ctx)
394
394
  case never:
@@ -414,7 +414,7 @@ class ZonedDateTime(ParamType):
414
414
  return value
415
415
  case str():
416
416
  try:
417
- return whenever.ZonedDateTime.parse_common_iso(value)
417
+ return whenever.ZonedDateTime.parse_iso(value)
418
418
  except ValueError as error:
419
419
  self.fail(str(error), param, ctx)
420
420
  case never:
@@ -1570,7 +1570,7 @@ def zoned_date_times(
1570
1570
  with (
1571
1571
  assume_does_not_raise(RepeatedTime),
1572
1572
  assume_does_not_raise(SkippedTime),
1573
- assume_does_not_raise(ValueError, match=r"Resulting datetime is out of range"),
1573
+ assume_does_not_raise(ValueError, match=r"Resulting time is out of range"),
1574
1574
  ):
1575
1575
  zoned = plain.assume_tz(time_zone_.key, disambiguate="raise")
1576
1576
  with assume_does_not_raise(OverflowError, match=r"date value out of range"):
@@ -481,49 +481,49 @@ def _object_hook(
481
481
  if match := _NONE_PATTERN.search(text):
482
482
  return None
483
483
  if match := _DATE_PATTERN.search(text):
484
- return Date.parse_common_iso(match.group(1))
484
+ return Date.parse_iso(match.group(1))
485
485
  if match := _DATE_DELTA_PATTERN.search(text):
486
- return DateDelta.parse_common_iso(match.group(1))
486
+ return DateDelta.parse_iso(match.group(1))
487
487
  if match := _DATE_PERIOD_PATTERN.search(text):
488
- start, end = map(Date.parse_common_iso, match.group(1).split(","))
488
+ start, end = map(Date.parse_iso, match.group(1).split(","))
489
489
  return DatePeriod(start, end)
490
490
  if match := _DATE_TIME_DELTA_PATTERN.search(text):
491
- return DateTimeDelta.parse_common_iso(match.group(1))
491
+ return DateTimeDelta.parse_iso(match.group(1))
492
492
  if match := _FLOAT_PATTERN.search(text):
493
493
  return float(match.group(1))
494
494
  if match := _MONTH_DAY_PATTERN.search(text):
495
- return MonthDay.parse_common_iso(match.group(1))
495
+ return MonthDay.parse_iso(match.group(1))
496
496
  if match := _PATH_PATTERN.search(text):
497
497
  return Path(match.group(1))
498
498
  if match := _PLAIN_DATE_TIME_PATTERN.search(text):
499
- return PlainDateTime.parse_common_iso(match.group(1))
499
+ return PlainDateTime.parse_iso(match.group(1))
500
500
  if match := _PY_DATE_PATTERN.search(text):
501
- return Date.parse_common_iso(match.group(1)).py_date()
501
+ return Date.parse_iso(match.group(1)).py_date()
502
502
  if match := _PY_PLAIN_DATE_TIME_PATTERN.search(text):
503
- return PlainDateTime.parse_common_iso(match.group(1)).py_datetime()
503
+ return PlainDateTime.parse_iso(match.group(1)).py_datetime()
504
504
  if match := _PY_TIME_PATTERN.search(text):
505
- return Time.parse_common_iso(match.group(1)).py_time()
505
+ return Time.parse_iso(match.group(1)).py_time()
506
506
  if match := _PY_ZONED_DATE_TIME_PATTERN.search(text):
507
- return ZonedDateTime.parse_common_iso(match.group(1)).py_datetime()
507
+ return ZonedDateTime.parse_iso(match.group(1)).py_datetime()
508
508
  if match := _TIME_PATTERN.search(text):
509
- return Time.parse_common_iso(match.group(1))
509
+ return Time.parse_iso(match.group(1))
510
510
  if match := _TIME_DELTA_PATTERN.search(text):
511
- return TimeDelta.parse_common_iso(match.group(1))
511
+ return TimeDelta.parse_iso(match.group(1))
512
512
  if match := _TIME_PERIOD_PATTERN.search(text):
513
- start, end = map(Time.parse_common_iso, match.group(1).split(","))
513
+ start, end = map(Time.parse_iso, match.group(1).split(","))
514
514
  return TimePeriod(start, end)
515
515
  if match := _UUID_PATTERN.search(text):
516
516
  return UUID(match.group(1))
517
517
  if match := _VERSION_PATTERN.search(text):
518
518
  return parse_version(match.group(1))
519
519
  if match := _YEAR_MONTH_PATTERN.search(text):
520
- return YearMonth.parse_common_iso(match.group(1))
520
+ return YearMonth.parse_iso(match.group(1))
521
521
  if match := _ZONED_DATE_TIME_PATTERN.search(text):
522
- return ZonedDateTime.parse_common_iso(match.group(1))
522
+ return ZonedDateTime.parse_iso(match.group(1))
523
523
  if match := _ZONED_DATE_TIME_PERIOD_PATTERN.search(text):
524
524
  start, end = match.group(1).split(",")
525
- end = ZonedDateTime.parse_common_iso(end)
526
- start = PlainDateTime.parse_common_iso(start).assume_tz(end.tz)
525
+ end = ZonedDateTime.parse_iso(end)
526
+ start = PlainDateTime.parse_iso(start).assume_tz(end.tz)
527
527
  return ZonedDateTimePeriod(start, end)
528
528
  if (
529
529
  exc_class := _object_hook_exception_class(
@@ -204,7 +204,7 @@ def _parse_object_type(
204
204
  ),
205
205
  ):
206
206
  try:
207
- return cls.parse_common_iso(text)
207
+ return cls.parse_iso(text)
208
208
  except ValueError:
209
209
  raise _ParseObjectParseError(type_=cls, text=text) from None
210
210
  if issubclass(cls, Path):
@@ -477,7 +477,7 @@ def serialize_object(
477
477
  ZonedDateTime,
478
478
  ),
479
479
  ):
480
- return obj.format_common_iso()
480
+ return obj.format_iso()
481
481
  if isinstance(obj, Enum):
482
482
  return obj.name
483
483
  if isinstance(obj, dict):
@@ -29,7 +29,7 @@ type PathLikeOrWithSection = PathLike | PathLikeWithSection
29
29
 
30
30
 
31
31
  class CustomBaseSettings(BaseSettings):
32
- """Base settings for loading JSON files."""
32
+ """Base settings for loading JSON/TOML/YAML files."""
33
33
 
34
34
  # paths
35
35
  json_files: ClassVar[Sequence[PathLikeOrWithSection]] = []
@@ -158,8 +158,19 @@ def _get_section(
158
158
  return reduce(lambda acc, el: acc.get(el, {}), always_iterable(section), mapping)
159
159
 
160
160
 
161
+ ##
162
+
163
+
164
+ class HashableBaseSettings(BaseSettings):
165
+ """Base settings for loading JSON files."""
166
+
167
+ # config
168
+ model_config: ClassVar[SettingsConfigDict] = SettingsConfigDict(frozen=True)
169
+
170
+
161
171
  __all__ = [
162
172
  "CustomBaseSettings",
173
+ "HashableBaseSettings",
163
174
  "JsonConfigSectionSettingsSource",
164
175
  "TomlConfigSectionSettingsSource",
165
176
  "YamlConfigSectionSettingsSource",
@@ -299,7 +299,7 @@ def _skipif_recent(*, root: PathLike | None = None, delta: Delta = SECOND) -> No
299
299
  except FileNotFoundError:
300
300
  return
301
301
  try:
302
- last = ZonedDateTime.parse_common_iso(contents)
302
+ last = ZonedDateTime.parse_iso(contents)
303
303
  except ValueError:
304
304
  return
305
305
  now = get_now_local()
@@ -328,7 +328,7 @@ def _get_name() -> str:
328
328
  def _write(root: PathLike | None = None, /) -> None:
329
329
  path = _get_path(root)
330
330
  with writer(path, overwrite=True) as temp:
331
- _ = temp.write_text(get_now_local().format_common_iso())
331
+ _ = temp.write_text(get_now_local().format_iso())
332
332
 
333
333
 
334
334
  __all__ = [
@@ -56,11 +56,11 @@ class Timer:
56
56
 
57
57
  @override
58
58
  def __repr__(self) -> str:
59
- return self.timedelta.format_common_iso()
59
+ return self.timedelta.format_iso()
60
60
 
61
61
  @override
62
62
  def __str__(self) -> str:
63
- return self.timedelta.format_common_iso()
63
+ return self.timedelta.format_iso()
64
64
 
65
65
  # comparison
66
66
 
@@ -98,7 +98,7 @@ def _yield_header_lines(
98
98
  yield f"Date/time | {format_compact(now)}"
99
99
  start_use = to_zoned_date_time(start).to_tz(LOCAL_TIME_ZONE_NAME)
100
100
  yield f"Started | {format_compact(start_use)}"
101
- yield f"Duration | {(now - start_use).format_common_iso()}"
101
+ yield f"Duration | {(now - start_use).format_iso()}"
102
102
  yield f"User | {getuser()}"
103
103
  yield f"Host | {gethostname()}"
104
104
  yield f"Process ID | {getpid()}"
@@ -57,19 +57,19 @@ class ExtendedTSConverter(TSConverter):
57
57
  ) -> None:
58
58
  super().__init__(resolve_paths=resolve_paths, strlist_sep=strlist_sep)
59
59
  cases: list[_ConverterItem] = [
60
- (Date, Date.parse_common_iso),
61
- (DateDelta, DateDelta.parse_common_iso),
62
- (DateTimeDelta, DateTimeDelta.parse_common_iso),
60
+ (Date, Date.parse_iso),
61
+ (DateDelta, DateDelta.parse_iso),
62
+ (DateTimeDelta, DateTimeDelta.parse_iso),
63
63
  (IPv4Address, IPv4Address),
64
64
  (IPv6Address, IPv6Address),
65
- (MonthDay, MonthDay.parse_common_iso),
65
+ (MonthDay, MonthDay.parse_iso),
66
66
  (Path, partial(_parse_path, resolve=resolve_paths, pwd=Path.cwd())),
67
- (PlainDateTime, PlainDateTime.parse_common_iso),
68
- (Time, Time.parse_common_iso),
69
- (TimeDelta, TimeDelta.parse_common_iso),
67
+ (PlainDateTime, PlainDateTime.parse_iso),
68
+ (Time, Time.parse_iso),
69
+ (TimeDelta, TimeDelta.parse_iso),
70
70
  (UUID, UUID),
71
- (YearMonth, YearMonth.parse_common_iso),
72
- (ZonedDateTime, ZonedDateTime.parse_common_iso),
71
+ (YearMonth, YearMonth.parse_iso),
72
+ (ZonedDateTime, ZonedDateTime.parse_iso),
73
73
  *extra,
74
74
  ]
75
75
  extras = {cls: _make_converter(cls, func) for cls, func in cases}