dycw-utilities 0.151.8__tar.gz → 0.151.9__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 (216) hide show
  1. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/PKG-INFO +1 -1
  2. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/pyproject.toml +2 -2
  3. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_period.py +38 -16
  4. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_whenever.py +1 -6
  5. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/hypothesis.py +6 -0
  7. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/period.py +68 -8
  8. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/.gitignore +0 -0
  9. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/LICENSE +0 -0
  10. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/README.md +0 -0
  11. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/__init__.py +0 -0
  12. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/conftest.py +0 -0
  13. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/__init__.py +0 -0
  14. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_missing/__init__.py +0 -0
  15. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_missing/module.py +0 -0
  16. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_with/__init__.py +0 -0
  17. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_with/outer_1.py +0 -0
  18. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_with/outer_2.py +0 -0
  19. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  20. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  21. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  22. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  23. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_without/__init__.py +0 -0
  24. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_without/module_1.py +0 -0
  25. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/package_without/module_2.py +0 -0
  26. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/standalone.py +0 -0
  27. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/modules/with_imports.py +0 -0
  28. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  29. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  30. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  31. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  32. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  33. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  34. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  35. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  36. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_altair.py +0 -0
  37. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_asyncio.py +0 -0
  38. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_atomicwrites.py +0 -0
  39. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_atools.py +0 -0
  40. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_cachetools.py +0 -0
  41. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_click.py +0 -0
  42. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_concurrent.py +0 -0
  43. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_contextlib.py +0 -0
  44. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_contextvars.py +0 -0
  45. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_cryptography.py +0 -0
  46. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_cvxpy.py +0 -0
  47. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_dataclasses.py +0 -0
  48. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_dnspython.py +0 -0
  49. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_enum.py +0 -0
  50. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_errors.py +0 -0
  51. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_eventkit.py +0 -0
  52. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_fastapi.py +0 -0
  53. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_fpdf2.py +0 -0
  54. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_functions.py +0 -0
  55. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_functools.py +0 -0
  56. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_getpass.py +0 -0
  57. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_gzip.py +0 -0
  58. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_hashlib.py +0 -0
  59. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_http.py +0 -0
  60. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_hypothesis.py +0 -0
  61. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_importlib.py +0 -0
  62. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_inflect.py +0 -0
  63. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_ipython.py +0 -0
  64. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_iterables.py +0 -0
  65. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_json.py +0 -0
  66. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_jupyter.py +0 -0
  67. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_libcst.py +0 -0
  68. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_lightweight_charts.py +0 -0
  69. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_logging.py +0 -0
  70. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_math.py +0 -0
  71. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_memory_profiler.py +0 -0
  72. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_modules.py +0 -0
  73. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_more_itertools.py +0 -0
  74. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_numpy.py +0 -0
  75. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_objects/__init__.py +0 -0
  76. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_objects/objects.py +0 -0
  77. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_operator.py +0 -0
  78. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_optuna.py +0 -0
  79. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_orjson.py +0 -0
  80. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_os.py +0 -0
  81. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_parse.py +0 -0
  82. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pathlib.py +0 -0
  83. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pickle.py +0 -0
  84. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_platform.py +0 -0
  85. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_polars.py +0 -0
  86. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_polars_ols.py +0 -0
  87. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_postgres.py +0 -0
  88. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pottery.py +0 -0
  89. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pqdm.py +0 -0
  90. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_psutil.py +0 -0
  91. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pyinstrument.py +0 -0
  92. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pytest.py +0 -0
  93. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pytest_randomly.py +0 -0
  94. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_pytest_regressions.py +0 -0
  95. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_random.py +0 -0
  96. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_re.py +0 -0
  97. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_redis.py +0 -0
  98. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_reprlib.py +0 -0
  99. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_scipy.py +0 -0
  100. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_sentinel.py +0 -0
  101. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_shelve.py +0 -0
  102. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_slack_sdk.py +0 -0
  103. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_socket.py +0 -0
  104. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_sqlalchemy.py +0 -0
  105. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_sqlalchemy_polars.py +0 -0
  106. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_statsmodels.py +0 -0
  107. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_string.py +0 -0
  108. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_tempfile.py +0 -0
  109. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_text.py +0 -0
  110. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_threading.py +0 -0
  111. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_timer.py +0 -0
  112. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_traceback.py +0 -0
  113. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_typed_settings.py +0 -0
  114. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_types.py +0 -0
  115. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_typing.py +0 -0
  116. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_typing_funcs/__init__.py +0 -0
  117. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_typing_funcs/no_future.py +0 -0
  118. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_typing_funcs/with_future.py +0 -0
  119. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_tzdata.py +0 -0
  120. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_tzlocal.py +0 -0
  121. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_uuid.py +0 -0
  122. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_version.py +0 -0
  123. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_warnings.py +0 -0
  124. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_yield_access/__init__.py +0 -0
  125. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_yield_access/script.py +0 -0
  126. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_yield_access/script.sh +0 -0
  127. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_zipfile.py +0 -0
  128. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/tests/test_zoneinfo.py +0 -0
  129. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/altair.py +0 -0
  130. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/asyncio.py +0 -0
  131. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/atomicwrites.py +0 -0
  132. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/atools.py +0 -0
  133. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/cachetools.py +0 -0
  134. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/click.py +0 -0
  135. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/concurrent.py +0 -0
  136. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/contextlib.py +0 -0
  137. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/contextvars.py +0 -0
  138. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/cryptography.py +0 -0
  139. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/cvxpy.py +0 -0
  140. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/dataclasses.py +0 -0
  141. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/dnspython.py +0 -0
  142. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/eventkit.py +0 -0
  145. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/fastapi.py +0 -0
  146. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/fpdf2.py +0 -0
  147. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/functions.py +0 -0
  148. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/functools.py +0 -0
  149. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/getpass.py +0 -0
  150. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/gzip.py +0 -0
  151. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/importlib.py +0 -0
  154. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/inflect.py +0 -0
  155. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/ipython.py +0 -0
  156. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/iterables.py +0 -0
  157. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/json.py +0 -0
  158. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/jupyter.py +0 -0
  159. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/libcst.py +0 -0
  160. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/lightweight_charts.py +0 -0
  161. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/logging.py +0 -0
  162. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/math.py +0 -0
  163. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/memory_profiler.py +0 -0
  164. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/modules.py +0 -0
  165. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/more_itertools.py +0 -0
  166. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/numpy.py +0 -0
  167. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/operator.py +0 -0
  168. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/optuna.py +0 -0
  169. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/orjson.py +0 -0
  170. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/os.py +0 -0
  171. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/parse.py +0 -0
  172. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pathlib.py +0 -0
  173. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pickle.py +0 -0
  174. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/platform.py +0 -0
  175. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/polars.py +0 -0
  176. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/postgres.py +0 -0
  178. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pottery.py +0 -0
  179. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pqdm.py +0 -0
  180. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/psutil.py +0 -0
  181. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/py.typed +0 -0
  182. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pyinstrument.py +0 -0
  183. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pytest.py +0 -0
  184. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pytest_plugins/__init__.py +0 -0
  185. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  186. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  187. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/random.py +0 -0
  189. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/re.py +0 -0
  190. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/redis.py +0 -0
  191. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/reprlib.py +0 -0
  192. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/scipy.py +0 -0
  193. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/sentinel.py +0 -0
  194. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/shelve.py +0 -0
  195. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/slack_sdk.py +0 -0
  196. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/socket.py +0 -0
  197. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/sqlalchemy.py +0 -0
  198. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/sqlalchemy_polars.py +0 -0
  199. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/statsmodels.py +0 -0
  200. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/text.py +0 -0
  203. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/threading.py +0 -0
  204. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/timer.py +0 -0
  205. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/traceback.py +0 -0
  206. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/typed_settings.py +0 -0
  207. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/types.py +0 -0
  208. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/typing.py +0 -0
  209. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/tzdata.py +0 -0
  210. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/tzlocal.py +0 -0
  211. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/uuid.py +0 -0
  212. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/version.py +0 -0
  213. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/warnings.py +0 -0
  214. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/whenever.py +0 -0
  215. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/zipfile.py +0 -0
  216. {dycw_utilities-0.151.8 → dycw_utilities-0.151.9}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.151.8
3
+ Version: 0.151.9
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -232,7 +232,7 @@ dependencies = [
232
232
  name = "dycw-utilities"
233
233
  readme = "README.md"
234
234
  requires-python = ">= 3.12"
235
- version = "0.151.8"
235
+ version = "0.151.9"
236
236
 
237
237
  [project.entry-points.pytest11]
238
238
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -265,7 +265,7 @@ test = [
265
265
  # bump-my-version
266
266
  [tool.bumpversion]
267
267
  allow_dirty = true
268
- current_version = "0.151.8"
268
+ current_version = "0.151.9"
269
269
 
270
270
  [[tool.bumpversion.files]]
271
271
  filename = "src/utilities/__init__.py"
@@ -4,7 +4,7 @@ from re import search
4
4
  from typing import TYPE_CHECKING, Any, cast
5
5
 
6
6
  from hypothesis import HealthCheck, given, settings
7
- from hypothesis.strategies import DataObject, data
7
+ from hypothesis.strategies import DataObject, data, sampled_from
8
8
  from pytest import mark, param, raises
9
9
  from whenever import Date, Time, ZonedDateTime
10
10
 
@@ -17,6 +17,7 @@ from utilities.hypothesis import (
17
17
  time_deltas,
18
18
  times,
19
19
  zoned_datetimes,
20
+ zoned_datetimes_2000,
20
21
  )
21
22
  from utilities.period import (
22
23
  DatePeriod,
@@ -145,13 +146,20 @@ class TestDatePeriod:
145
146
  expected = DatePeriod(start - delta, end - delta)
146
147
  assert result == expected
147
148
 
148
- @given(dates=pairs(dates(), sorted=True))
149
- def test_to_dict(self, *, dates: tuple[Date, Date]) -> None:
149
+ @given(data=data(), dates=pairs(dates(), sorted=True))
150
+ def test_to_and_from_dict(
151
+ self, *, data: DataObject, dates: tuple[Date, Date]
152
+ ) -> None:
150
153
  start, end = dates
151
154
  period = DatePeriod(start, end)
152
- result = period.to_dict()
153
- expected = _PeriodAsDict(start=start, end=end)
154
- assert result == expected
155
+ dict1 = period.to_dict()
156
+ dstart, dend = dict1["start"], dict1["end"]
157
+ dict2 = _PeriodAsDict(
158
+ start=data.draw(sampled_from([dstart, dstart.py_date()])),
159
+ end=data.draw(sampled_from([dend, dend.py_date()])),
160
+ )
161
+ result = DatePeriod.from_dict(dict2)
162
+ assert result == period
155
163
 
156
164
  @given(dates=pairs(dates(), unique=True, sorted=True))
157
165
  def test_error_period_invalid(self, *, dates: tuple[Date, Date]) -> None:
@@ -224,13 +232,20 @@ class TestTimePeriod:
224
232
  result,
225
233
  )
226
234
 
227
- @given(times=pairs(times()))
228
- def test_to_dict(self, *, times: tuple[Time, Time]) -> None:
235
+ @given(data=data(), times=pairs(times()))
236
+ def test_to_and_from_dict(
237
+ self, *, data: DataObject, times: tuple[Time, Time]
238
+ ) -> None:
229
239
  start, end = times
230
240
  period = TimePeriod(start, end)
231
- result = period.to_dict()
232
- expected = _PeriodAsDict(start=start, end=end)
233
- assert result == expected
241
+ dict1 = period.to_dict()
242
+ dstart, dend = dict1["start"], dict1["end"]
243
+ dict2 = _PeriodAsDict(
244
+ start=data.draw(sampled_from([dstart, dstart.py_time()])),
245
+ end=data.draw(sampled_from([dend, dend.py_time()])),
246
+ )
247
+ result = TimePeriod.from_dict(dict2)
248
+ assert result == period
234
249
 
235
250
 
236
251
  class TestZonedDateTimePeriod:
@@ -455,13 +470,20 @@ class TestZonedDateTimePeriod:
455
470
  expected = ZonedDateTimePeriod(start - delta, end - delta)
456
471
  assert result == expected
457
472
 
458
- @given(datetimes=pairs(zoned_datetimes(), sorted=True))
459
- def test_to_dict(self, *, datetimes: tuple[ZonedDateTime, ZonedDateTime]) -> None:
473
+ @given(data=data(), datetimes=pairs(zoned_datetimes_2000, sorted=True))
474
+ def test_to_and_from_dict(
475
+ self, data: DataObject, *, datetimes: tuple[ZonedDateTime, ZonedDateTime]
476
+ ) -> None:
460
477
  start, end = datetimes
461
478
  period = ZonedDateTimePeriod(start, end)
462
- result = period.to_dict()
463
- expected = _PeriodAsDict(start=start, end=end)
464
- assert result == expected
479
+ dict1 = period.to_dict()
480
+ dstart, dend = dict1["start"], dict1["end"]
481
+ dict2 = _PeriodAsDict(
482
+ start=data.draw(sampled_from([dstart, dstart.py_datetime()])),
483
+ end=data.draw(sampled_from([dend, dend.py_datetime()])),
484
+ )
485
+ result = ZonedDateTimePeriod.from_dict(dict2)
486
+ assert result == period
465
487
 
466
488
  @given(datetimes=pairs(zoned_datetimes(), sorted=True))
467
489
  def test_to_tz(self, *, datetimes: tuple[ZonedDateTime, ZonedDateTime]) -> None:
@@ -32,6 +32,7 @@ from utilities.hypothesis import (
32
32
  sentinels,
33
33
  times,
34
34
  zoned_datetimes,
35
+ zoned_datetimes_2000,
35
36
  )
36
37
  from utilities.sentinel import Sentinel, sentinel
37
38
  from utilities.tzdata import HongKong, Tokyo
@@ -1184,12 +1185,6 @@ class TestToYears:
1184
1185
  _ = to_years(delta)
1185
1186
 
1186
1187
 
1187
- zoned_datetimes_2000 = zoned_datetimes(
1188
- min_value=ZonedDateTime(2000, 1, 1, tz=UTC.key),
1189
- max_value=ZonedDateTime(2000, 12, 31, tz=UTC.key),
1190
- )
1191
-
1192
-
1193
1188
  class TestToZonedDateTime:
1194
1189
  @given(date_time=zoned_datetimes())
1195
1190
  def test_date_time(self, *, date_time: ZonedDateTime) -> None:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.151.8"
3
+ __version__ = "0.151.9"
@@ -1415,6 +1415,11 @@ def zoned_datetimes(
1415
1415
  return zoned
1416
1416
 
1417
1417
 
1418
+ zoned_datetimes_2000 = zoned_datetimes(
1419
+ min_value=ZonedDateTime(2000, 1, 1, tz=UTC.key),
1420
+ max_value=ZonedDateTime(2000, 12, 31, tz=UTC.key),
1421
+ )
1422
+
1418
1423
  __all__ = [
1419
1424
  "Draw2Error",
1420
1425
  "MaybeSearchStrategy",
@@ -1468,4 +1473,5 @@ __all__ = [
1468
1473
  "versions",
1469
1474
  "year_months",
1470
1475
  "zoned_datetimes",
1476
+ "zoned_datetimes_2000",
1471
1477
  ]
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import datetime as dt
3
4
  from dataclasses import dataclass
4
5
  from typing import TYPE_CHECKING, Any, Self, TypedDict, assert_never, overload, override
5
6
  from zoneinfo import ZoneInfo
@@ -16,7 +17,9 @@ if TYPE_CHECKING:
16
17
  from utilities.types import TimeZoneLike
17
18
 
18
19
 
19
- class _PeriodAsDict[T: (Date, Time, ZonedDateTime)](TypedDict):
20
+ class _PeriodAsDict[T: Date | Time | ZonedDateTime | dt.date | dt.time | dt.datetime](
21
+ TypedDict
22
+ ):
20
23
  start: T
21
24
  end: T
22
25
 
@@ -81,6 +84,25 @@ class DatePeriod:
81
84
  return f"{fc(start)}-{fc(end, fmt='%m%d')}"
82
85
  return f"{fc(start)}-{fc(end)}"
83
86
 
87
+ @classmethod
88
+ def from_dict(cls, mapping: _PeriodAsDict[Date | dt.date], /) -> Self:
89
+ """Convert the dictionary to a period."""
90
+ match mapping["start"]:
91
+ case Date() as start:
92
+ ...
93
+ case dt.date() as py_date:
94
+ start = Date.from_py_date(py_date)
95
+ case never:
96
+ assert_never(never)
97
+ match mapping["end"]:
98
+ case Date() as end:
99
+ ...
100
+ case dt.date() as py_date:
101
+ end = Date.from_py_date(py_date)
102
+ case never:
103
+ assert_never(never)
104
+ return cls(start=start, end=end)
105
+
84
106
  def replace(
85
107
  self, *, start: Date | Sentinel = sentinel, end: Date | Sentinel = sentinel
86
108
  ) -> Self:
@@ -104,12 +126,6 @@ class TimePeriod:
104
126
  cls = get_class_name(self)
105
127
  return f"{cls}({self.start}, {self.end})"
106
128
 
107
- def replace(
108
- self, *, start: Time | Sentinel = sentinel, end: Time | Sentinel = sentinel
109
- ) -> Self:
110
- """Replace elements of the period."""
111
- return replace_non_sentinel(self, start=start, end=end)
112
-
113
129
  def at(
114
130
  self, obj: Date | tuple[Date, Date], /, *, time_zone: TimeZoneLike = UTC
115
131
  ) -> ZonedDateTimePeriod:
@@ -123,6 +139,31 @@ class TimePeriod:
123
139
  assert_never(never)
124
140
  return DatePeriod(start, end).at((self.start, self.end), time_zone=time_zone)
125
141
 
142
+ @classmethod
143
+ def from_dict(cls, mapping: _PeriodAsDict[Time | dt.time], /) -> Self:
144
+ """Convert the dictionary to a period."""
145
+ match mapping["start"]:
146
+ case Time() as start:
147
+ ...
148
+ case dt.time() as py_time:
149
+ start = Time.from_py_time(py_time)
150
+ case never:
151
+ assert_never(never)
152
+ match mapping["end"]:
153
+ case Time() as end:
154
+ ...
155
+ case dt.time() as py_time:
156
+ end = Time.from_py_time(py_time)
157
+ case never:
158
+ assert_never(never)
159
+ return cls(start=start, end=end)
160
+
161
+ def replace(
162
+ self, *, start: Time | Sentinel = sentinel, end: Time | Sentinel = sentinel
163
+ ) -> Self:
164
+ """Replace elements of the period."""
165
+ return replace_non_sentinel(self, start=start, end=end)
166
+
126
167
  def to_dict(self) -> _PeriodAsDict[Time]:
127
168
  """Convert the period to a dictionary."""
128
169
  return _PeriodAsDict(start=self.start, end=self.end)
@@ -229,6 +270,25 @@ class ZonedDateTimePeriod:
229
270
  return f"{fc(start.to_plain())}-{fc(end, fmt='%Y%m%dT%H%M')}"
230
271
  return f"{fc(start.to_plain())}-{fc(end, fmt='%Y%m%dT%H')}"
231
272
 
273
+ @classmethod
274
+ def from_dict(cls, mapping: _PeriodAsDict[ZonedDateTime | dt.datetime], /) -> Self:
275
+ """Convert the dictionary to a period."""
276
+ match mapping["start"]:
277
+ case ZonedDateTime() as start:
278
+ ...
279
+ case dt.date() as py_datetime:
280
+ start = ZonedDateTime.from_py_datetime(py_datetime)
281
+ case never:
282
+ assert_never(never)
283
+ match mapping["end"]:
284
+ case ZonedDateTime() as end:
285
+ ...
286
+ case dt.date() as py_datetime:
287
+ end = ZonedDateTime.from_py_datetime(py_datetime)
288
+ case never:
289
+ assert_never(never)
290
+ return cls(start=start, end=end)
291
+
232
292
  def replace(
233
293
  self,
234
294
  *,
@@ -258,7 +318,7 @@ class PeriodError(Exception): ...
258
318
 
259
319
 
260
320
  @dataclass(kw_only=True, slots=True)
261
- class _PeriodInvalidError[T: (Date, ZonedDateTime)](PeriodError):
321
+ class _PeriodInvalidError[T: Date | ZonedDateTime](PeriodError):
262
322
  start: T
263
323
  end: T
264
324