dycw-utilities 0.155.0__tar.gz → 0.155.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/PKG-INFO +1 -2
  2. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/pyproject.toml +2 -6
  3. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_hypothesis.py +14 -5
  4. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_polars.py +159 -107
  5. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing.py +147 -7
  6. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/with_future.py +63 -4
  7. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_whenever.py +13 -0
  8. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/__init__.py +1 -1
  9. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/hypothesis.py +8 -1
  10. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/polars.py +74 -41
  11. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/traceback.py +1 -1
  12. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/typing.py +9 -2
  13. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/whenever.py +10 -0
  14. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/.gitignore +0 -0
  15. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/LICENSE +0 -0
  16. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/README.md +0 -0
  17. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/__init__.py +0 -0
  18. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/conftest.py +0 -0
  19. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/__init__.py +0 -0
  20. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/__init__.py +0 -0
  21. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_missing/module.py +0 -0
  22. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/__init__.py +0 -0
  23. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_1.py +0 -0
  24. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/outer_2.py +0 -0
  25. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  26. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  27. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  28. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  29. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/__init__.py +0 -0
  30. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_1.py +0 -0
  31. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/package_without/module_2.py +0 -0
  32. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/standalone.py +0 -0
  33. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/modules/with_imports.py +0 -0
  34. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  35. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  36. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  37. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  38. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  39. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  40. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  41. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  42. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_altair.py +0 -0
  43. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_asyncio.py +0 -0
  44. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_atomicwrites.py +0 -0
  45. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_atools.py +0 -0
  46. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_cachetools.py +0 -0
  47. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_click.py +0 -0
  48. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_concurrent.py +0 -0
  49. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_contextlib.py +0 -0
  50. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_contextvars.py +0 -0
  51. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_cryptography.py +0 -0
  52. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_cvxpy.py +0 -0
  53. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_dataclasses.py +0 -0
  54. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_enum.py +0 -0
  55. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_errors.py +0 -0
  56. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_eventkit.py +0 -0
  57. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_fastapi.py +0 -0
  58. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_fpdf2.py +0 -0
  59. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_functions.py +0 -0
  60. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_functools.py +0 -0
  61. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_getpass.py +0 -0
  62. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_gzip.py +0 -0
  63. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_hashlib.py +0 -0
  64. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_http.py +0 -0
  65. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_importlib.py +0 -0
  66. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_inflect.py +0 -0
  67. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_ipython.py +0 -0
  68. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_iterables.py +0 -0
  69. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_json.py +0 -0
  70. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_jupyter.py +0 -0
  71. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_libcst.py +0 -0
  72. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_lightweight_charts.py +0 -0
  73. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_logging.py +0 -0
  74. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_math.py +0 -0
  75. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_memory_profiler.py +0 -0
  76. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_modules.py +0 -0
  77. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_more_itertools.py +0 -0
  78. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_numpy.py +0 -0
  79. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_objects/__init__.py +0 -0
  80. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_objects/objects.py +0 -0
  81. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_operator.py +0 -0
  82. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_optuna.py +0 -0
  83. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_orjson.py +0 -0
  84. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_os.py +0 -0
  85. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_parse.py +0 -0
  86. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pathlib.py +0 -0
  87. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_polars_ols.py +0 -0
  90. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_postgres.py +0 -0
  91. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pottery.py +0 -0
  92. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pqdm.py +0 -0
  93. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_psutil.py +0 -0
  94. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pyinstrument.py +0 -0
  95. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pytest.py +0 -0
  96. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_randomly.py +0 -0
  97. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_pytest_regressions.py +0 -0
  98. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_random.py +0 -0
  99. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_re.py +0 -0
  100. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_redis.py +0 -0
  101. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_reprlib.py +0 -0
  102. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_scipy.py +0 -0
  103. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_sentinel.py +0 -0
  104. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_shelve.py +0 -0
  105. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_slack_sdk.py +0 -0
  106. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_socket.py +0 -0
  107. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy.py +0 -0
  108. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_sqlalchemy_polars.py +0 -0
  109. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_statsmodels.py +0 -0
  110. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_string.py +0 -0
  111. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_tempfile.py +0 -0
  112. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_text.py +0 -0
  113. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_threading.py +0 -0
  114. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_timer.py +0 -0
  115. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_traceback.py +0 -0
  116. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typed_settings.py +0 -0
  117. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_types.py +0 -0
  118. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_typing_funcs/no_future.py +0 -0
  120. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_tzdata.py +0 -0
  121. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_tzlocal.py +0 -0
  122. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_uuid.py +0 -0
  123. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_version.py +0 -0
  124. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_warnings.py +0 -0
  125. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/__init__.py +0 -0
  126. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.py +0 -0
  127. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_yield_access/script.sh +0 -0
  128. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_zipfile.py +0 -0
  129. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/tests/test_zoneinfo.py +0 -0
  130. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/altair.py +0 -0
  131. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/asyncio.py +0 -0
  132. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/atomicwrites.py +0 -0
  133. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/atools.py +0 -0
  134. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/cachetools.py +0 -0
  135. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/click.py +0 -0
  136. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/concurrent.py +0 -0
  137. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/contextlib.py +0 -0
  138. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/contextvars.py +0 -0
  139. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/cryptography.py +0 -0
  140. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/cvxpy.py +0 -0
  141. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/dataclasses.py +0 -0
  142. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/eventkit.py +0 -0
  145. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/fastapi.py +0 -0
  146. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/fpdf2.py +0 -0
  147. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/functions.py +0 -0
  148. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/functools.py +0 -0
  149. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/getpass.py +0 -0
  150. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/gzip.py +0 -0
  151. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/importlib.py +0 -0
  154. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/inflect.py +0 -0
  155. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/ipython.py +0 -0
  156. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/iterables.py +0 -0
  157. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/json.py +0 -0
  158. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/jupyter.py +0 -0
  159. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/libcst.py +0 -0
  160. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/lightweight_charts.py +0 -0
  161. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/logging.py +0 -0
  162. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/math.py +0 -0
  163. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/memory_profiler.py +0 -0
  164. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/modules.py +0 -0
  165. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/more_itertools.py +0 -0
  166. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/numpy.py +0 -0
  167. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/operator.py +0 -0
  168. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/optuna.py +0 -0
  169. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/orjson.py +0 -0
  170. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/os.py +0 -0
  171. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/parse.py +0 -0
  172. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pathlib.py +0 -0
  173. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pickle.py +0 -0
  174. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/platform.py +0 -0
  175. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/polars_ols.py +0 -0
  176. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/postgres.py +0 -0
  177. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pottery.py +0 -0
  178. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pqdm.py +0 -0
  179. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/psutil.py +0 -0
  180. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/py.typed +0 -0
  181. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pyinstrument.py +0 -0
  182. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest.py +0 -0
  183. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/__init__.py +0 -0
  184. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  185. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  186. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/pytest_regressions.py +0 -0
  187. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/random.py +0 -0
  188. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/re.py +0 -0
  189. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/redis.py +0 -0
  190. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/reprlib.py +0 -0
  191. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/scipy.py +0 -0
  192. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/sentinel.py +0 -0
  193. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/shelve.py +0 -0
  194. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/slack_sdk.py +0 -0
  195. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/socket.py +0 -0
  196. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy.py +0 -0
  197. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/sqlalchemy_polars.py +0 -0
  198. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/statsmodels.py +0 -0
  199. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/string.py +0 -0
  200. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/tempfile.py +0 -0
  201. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/text.py +0 -0
  202. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/threading.py +0 -0
  203. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/timer.py +0 -0
  204. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/typed_settings.py +0 -0
  205. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/types.py +0 -0
  206. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/tzdata.py +0 -0
  207. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/tzlocal.py +0 -0
  208. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/uuid.py +0 -0
  209. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/version.py +0 -0
  210. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/warnings.py +0 -0
  211. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/zipfile.py +0 -0
  212. {dycw_utilities-0.155.0 → dycw_utilities-0.155.1}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.155.0
3
+ Version: 0.155.1
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -13,7 +13,6 @@ Requires-Dist: coloredlogs<15.1,>=15.0.1; extra == 'logging'
13
13
  Provides-Extra: test
14
14
  Requires-Dist: dycw-pytest-only<2.2,>=2.1.1; extra == 'test'
15
15
  Requires-Dist: hypothesis<6.138,>=6.137.1; extra == 'test'
16
- Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
17
16
  Requires-Dist: pytest-asyncio<1.2,>=1.1.0; extra == 'test'
18
17
  Requires-Dist: pytest-cov<6.3,>=6.2.1; extra == 'test'
19
18
  Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
@@ -44,7 +44,6 @@ dev = [
44
44
  "coloredlogs >=15.0.1, <15.1",
45
45
  "coverage-conditional-plugin >=0.9.0, <0.10",
46
46
  "dycw-pytest-only >=2.1.1, <2.2",
47
- "pudb >=2025.1, <2025.2",
48
47
  "pyright[nodejs] >=1.1.401, <1.2",
49
48
  "pytest-cov >=6.2.1, <6.3",
50
49
  "pytest-timeout >=2.4.0, <2.5",
@@ -148,7 +147,6 @@ pyinstrument = [
148
147
  "pyinstrument >=5.0.3, <5.1",
149
148
  ]
150
149
  pytest = [
151
- "pudb >=2025.1, <2025.2",
152
150
  "pytest >=8.4.1, <8.5",
153
151
  "pytest-asyncio >=1.1.0, <1.2",
154
152
  "pytest-randomly >=3.16.0, <3.17",
@@ -229,7 +227,7 @@ dependencies = [
229
227
  name = "dycw-utilities"
230
228
  readme = "README.md"
231
229
  requires-python = ">= 3.12"
232
- version = "0.155.0"
230
+ version = "0.155.1"
233
231
 
234
232
  [project.entry-points.pytest11]
235
233
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -242,7 +240,6 @@ logging = [
242
240
  test = [
243
241
  "dycw-pytest-only >=2.1.1, <2.2",
244
242
  "hypothesis >=6.137.1, <6.138",
245
- "pudb >=2025.1, <2025.2",
246
243
  "pytest >=8.4.1, <8.5",
247
244
  "pytest-asyncio >=1.1.0, <1.2",
248
245
  "pytest-cov >=6.2.1, <6.3",
@@ -262,7 +259,7 @@ test = [
262
259
  # bump-my-version
263
260
  [tool.bumpversion]
264
261
  allow_dirty = true
265
- current_version = "0.155.0"
262
+ current_version = "0.155.1"
266
263
 
267
264
  [[tool.bumpversion.files]]
268
265
  filename = "src/utilities/__init__.py"
@@ -366,7 +363,6 @@ addopts = [
366
363
  "--color=auto",
367
364
  "--durations=10",
368
365
  "--durations-min=10",
369
- "--pdbcls=pudb.debugger:Debugger",
370
366
  "--strict-markers",
371
367
  "--timeout=600",
372
368
  ]
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import datetime as dt
3
4
  from itertools import pairwise
4
5
  from pathlib import Path
5
6
  from re import search
@@ -134,6 +135,7 @@ from utilities.whenever import (
134
135
  ZonedDateTimePeriod,
135
136
  to_days,
136
137
  to_nanoseconds,
138
+ to_py_time_delta,
137
139
  )
138
140
 
139
141
  if TYPE_CHECKING:
@@ -197,6 +199,7 @@ class TestDateDeltas:
197
199
  date_deltas(min_value=min_value, max_value=max_value, parsable=parsable)
198
200
  )
199
201
  assert isinstance(delta, DateDelta)
202
+ assert isinstance(to_py_time_delta(delta), dt.timedelta)
200
203
  days = to_days(delta)
201
204
  if min_value is not None:
202
205
  assert days >= to_days(min_value)
@@ -221,14 +224,17 @@ class TestDatePeriods:
221
224
 
222
225
 
223
226
  class TestDateTimeDeltas:
224
- @given(data=data(), parsable=booleans())
225
- def test_main(self, *, data: DataObject, parsable: bool) -> None:
227
+ @given(data=data(), parsable=booleans(), nativable=booleans())
228
+ def test_main(self, *, data: DataObject, parsable: bool, nativable: bool) -> None:
226
229
  min_value = data.draw(date_time_deltas() | none())
227
230
  max_value = data.draw(date_time_deltas() | none())
228
231
  with assume_does_not_raise(InvalidArgument):
229
232
  delta = data.draw(
230
233
  date_time_deltas(
231
- min_value=min_value, max_value=max_value, parsable=parsable
234
+ min_value=min_value,
235
+ max_value=max_value,
236
+ parsable=parsable,
237
+ nativable=nativable,
232
238
  )
233
239
  )
234
240
  assert isinstance(delta, DateTimeDelta)
@@ -239,6 +245,8 @@ class TestDateTimeDeltas:
239
245
  assert nanos <= to_nanoseconds(max_value)
240
246
  if parsable:
241
247
  assert DateTimeDelta.parse_common_iso(delta.format_common_iso()) == delta
248
+ if nativable:
249
+ assert isinstance(to_py_time_delta(delta), dt.timedelta)
242
250
 
243
251
 
244
252
  class TestDates:
@@ -726,8 +734,8 @@ class TestPairs:
726
734
  class TestPaths:
727
735
  @given(data=data())
728
736
  def test_main(self, *, data: DataObject) -> None:
729
- min_depth = data.draw(integers(0, 5) | none())
730
- max_depth = data.draw(integers(0, 5) | none())
737
+ min_depth = data.draw(integers(0, 3) | none())
738
+ max_depth = data.draw(integers(0, 3) | none())
731
739
  with assume_does_not_raise(InvalidArgument):
732
740
  path = data.draw(paths(min_depth=min_depth, max_depth=max_depth))
733
741
  assert isinstance(path, Path)
@@ -989,6 +997,7 @@ class TestTimeDeltas:
989
997
  delta = data.draw(time_deltas(min_value=min_value, max_value=max_value))
990
998
  assert isinstance(delta, TimeDelta)
991
999
  assert TimeDelta.parse_common_iso(delta.format_common_iso()) == delta
1000
+ assert isinstance(to_py_time_delta(delta), dt.timedelta)
992
1001
  if min_value is not None:
993
1002
  assert delta >= min_value
994
1003
  if max_value is not None:
@@ -7,7 +7,6 @@ from dataclasses import dataclass, field
7
7
  from enum import auto
8
8
  from itertools import chain, repeat
9
9
  from math import isfinite, nan
10
- from pathlib import Path
11
10
  from random import Random
12
11
  from typing import TYPE_CHECKING, Any, ClassVar, Literal, assert_never, cast
13
12
  from uuid import UUID, uuid4
@@ -15,6 +14,7 @@ from uuid import UUID, uuid4
15
14
  import hypothesis.strategies
16
15
  import numpy as np
17
16
  import polars as pl
17
+ import whenever
18
18
  from hypothesis import given
19
19
  from hypothesis.strategies import (
20
20
  DataObject,
@@ -27,15 +27,14 @@ from hypothesis.strategies import (
27
27
  lists,
28
28
  none,
29
29
  sampled_from,
30
- timezones,
31
30
  )
32
31
  from numpy import allclose, linspace, pi
33
32
  from polars import (
34
33
  Boolean,
35
34
  DataFrame,
36
35
  DataType,
37
- Date,
38
36
  Datetime,
37
+ Duration,
39
38
  Expr,
40
39
  Float64,
41
40
  Int32,
@@ -55,24 +54,25 @@ from polars import (
55
54
  struct,
56
55
  )
57
56
  from polars._typing import IntoExprColumn, SchemaDict
58
- from polars.exceptions import (
59
- ComputeError, # pyright: ignore[reportAttributeAccessIssue]
60
- )
61
57
  from polars.schema import Schema
62
58
  from polars.testing import assert_frame_equal, assert_series_equal
63
59
  from pytest import mark, param, raises
64
- from whenever import Time, TimeZoneNotFoundError, ZonedDateTime
60
+ from whenever import DateDelta, DateTimeDelta, PlainDateTime, TimeDelta, ZonedDateTime
65
61
 
66
62
  import tests.test_math
67
63
  import utilities.polars
68
64
  from utilities.hypothesis import (
69
- assume_does_not_raise,
65
+ date_deltas,
66
+ date_time_deltas,
67
+ dates,
70
68
  float64s,
71
69
  int64s,
72
70
  pairs,
73
71
  py_datetimes,
74
72
  temp_paths,
75
73
  text_ascii,
74
+ time_deltas,
75
+ times,
76
76
  zoned_date_times,
77
77
  )
78
78
  from utilities.math import number_of_decimals
@@ -207,11 +207,21 @@ from utilities.polars import (
207
207
  )
208
208
  from utilities.sentinel import Sentinel, sentinel
209
209
  from utilities.tzdata import HongKong, Tokyo, USCentral, USEastern
210
- from utilities.whenever import get_now, get_today
210
+ from utilities.whenever import (
211
+ NOW_UTC,
212
+ TODAY_UTC,
213
+ DatePeriod,
214
+ TimePeriod,
215
+ ZonedDateTimePeriod,
216
+ get_now,
217
+ get_now_plain,
218
+ get_today,
219
+ )
211
220
  from utilities.zoneinfo import UTC, get_time_zone_name
212
221
 
213
222
  if TYPE_CHECKING:
214
223
  from collections.abc import Callable, Iterable, Mapping, Sequence
224
+ from pathlib import Path
215
225
  from zoneinfo import ZoneInfo
216
226
 
217
227
  from _pytest.mark import ParameterSet
@@ -392,17 +402,13 @@ class TestAppendDataClass:
392
402
  height = 0 if (row.a is None) and (row.b is None) else 1
393
403
  check_polars_dataframe(result, height=height, schema_list=df.schema)
394
404
 
395
- @given(
396
- data=fixed_dictionaries({
397
- "datetime": zoned_date_times().map(lambda d: d.py_datetime())
398
- })
399
- )
405
+ @given(data=fixed_dictionaries({"datetime": zoned_date_times()}))
400
406
  def test_zoned_datetime(self, *, data: StrMapping) -> None:
401
407
  df = DataFrame(schema={"datetime": DatetimeUTC})
402
408
 
403
409
  @dataclass(kw_only=True, slots=True)
404
410
  class Row:
405
- datetime: dt.datetime
411
+ datetime: ZonedDateTime
406
412
 
407
413
  row = Row(**data)
408
414
  result = append_dataclass(df, row)
@@ -1014,7 +1020,6 @@ class TestDataClassToDataFrame:
1014
1020
  int_field: int
1015
1021
  float_field: float
1016
1022
  str_field: str
1017
- date_field: dt.date
1018
1023
 
1019
1024
  objs = data.draw(lists(builds(Example, int_field=int64s()), min_size=1))
1020
1025
  df = dataclass_to_dataframe(objs)
@@ -1026,10 +1031,41 @@ class TestDataClassToDataFrame:
1026
1031
  "int_field": Int64,
1027
1032
  "float_field": Float64,
1028
1033
  "str_field": String,
1029
- "date_field": Date,
1030
1034
  },
1031
1035
  )
1032
1036
 
1037
+ @given(data=data())
1038
+ def test_date(self, *, data: DataObject) -> None:
1039
+ @dataclass(kw_only=True, slots=True)
1040
+ class Example:
1041
+ x: whenever.Date
1042
+
1043
+ objs = data.draw(lists(builds(Example, x=dates()), min_size=1))
1044
+ df = dataclass_to_dataframe(objs)
1045
+ check_polars_dataframe(df, height=len(objs), schema_list={"x": pl.Date})
1046
+
1047
+ @given(data=data())
1048
+ def test_date_delta(self, *, data: DataObject) -> None:
1049
+ @dataclass(kw_only=True, slots=True)
1050
+ class Example:
1051
+ x: DateDelta
1052
+
1053
+ objs = data.draw(lists(builds(Example, x=date_deltas()), min_size=1))
1054
+ df = dataclass_to_dataframe(objs)
1055
+ check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
1056
+
1057
+ @given(data=data())
1058
+ def test_date_time_delta(self, *, data: DataObject) -> None:
1059
+ @dataclass(kw_only=True, slots=True)
1060
+ class Example:
1061
+ x: DateTimeDelta
1062
+
1063
+ objs = data.draw(
1064
+ lists(builds(Example, x=date_time_deltas(nativable=True)), min_size=1)
1065
+ )
1066
+ df = dataclass_to_dataframe(objs)
1067
+ check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
1068
+
1033
1069
  @given(data=data())
1034
1070
  def test_nested(self, *, data: DataObject) -> None:
1035
1071
  @dataclass(kw_only=True, slots=True)
@@ -1056,6 +1092,26 @@ class TestDataClassToDataFrame:
1056
1092
  df = dataclass_to_dataframe(obj, localns=locals())
1057
1093
  check_polars_dataframe(df, height=len(df), schema_list={"x": String})
1058
1094
 
1095
+ @given(data=data())
1096
+ def test_time(self, *, data: DataObject) -> None:
1097
+ @dataclass(kw_only=True, slots=True)
1098
+ class Example:
1099
+ x: whenever.Time
1100
+
1101
+ objs = data.draw(lists(builds(Example, x=times()), min_size=1))
1102
+ df = dataclass_to_dataframe(objs)
1103
+ check_polars_dataframe(df, height=len(objs), schema_list={"x": pl.Time})
1104
+
1105
+ @given(data=data())
1106
+ def test_time_delta(self, *, data: DataObject) -> None:
1107
+ @dataclass(kw_only=True, slots=True)
1108
+ class Example:
1109
+ x: TimeDelta
1110
+
1111
+ objs = data.draw(lists(builds(Example, x=time_deltas()), min_size=1))
1112
+ df = dataclass_to_dataframe(objs)
1113
+ check_polars_dataframe(df, height=len(objs), schema_list={"x": Duration})
1114
+
1059
1115
  @given(data=data())
1060
1116
  def test_uuid(self, *, data: DataObject) -> None:
1061
1117
  @dataclass(kw_only=True, slots=True)
@@ -1066,32 +1122,16 @@ class TestDataClassToDataFrame:
1066
1122
  df = dataclass_to_dataframe(obj, localns=locals())
1067
1123
  check_polars_dataframe(df, height=len(df), schema_list={"x": String})
1068
1124
 
1069
- @given(data=data(), time_zone=timezones())
1070
- def test_zoned_datetime(self, *, data: DataObject, time_zone: ZoneInfo) -> None:
1125
+ @given(data=data())
1126
+ def test_zoned_datetime(self, *, data: DataObject) -> None:
1071
1127
  @dataclass(kw_only=True, slots=True)
1072
1128
  class Example:
1073
- x: dt.datetime
1129
+ x: ZonedDateTime
1074
1130
 
1075
- objs = data.draw(
1076
- lists(
1077
- builds(
1078
- Example,
1079
- x=zoned_date_times(time_zone=time_zone).map(
1080
- lambda d: d.py_datetime()
1081
- ),
1082
- ),
1083
- min_size=1,
1084
- )
1085
- )
1086
- with assume_does_not_raise(
1087
- ComputeError, # unable to parse time zone
1088
- ValueError, # failed to parse timezone
1089
- ):
1090
- df = dataclass_to_dataframe(objs, localns=locals())
1131
+ objs = data.draw(lists(builds(Example, x=zoned_date_times()), min_size=1))
1132
+ df = dataclass_to_dataframe(objs, localns=locals())
1091
1133
  check_polars_dataframe(
1092
- df,
1093
- height=len(objs),
1094
- schema_list={"x": zoned_datetime_dtype(time_zone=time_zone)},
1134
+ df, height=len(objs), schema_list={"x": zoned_datetime_dtype()}
1095
1135
  )
1096
1136
 
1097
1137
  def test_error_empty(self) -> None:
@@ -1119,15 +1159,12 @@ class TestDataClassToDataFrame:
1119
1159
 
1120
1160
  class TestDataClassToSchema:
1121
1161
  def test_basic(self) -> None:
1122
- today = get_today().py_date()
1123
-
1124
1162
  @dataclass(kw_only=True, slots=True)
1125
1163
  class Example:
1126
1164
  bool_field: bool = False
1127
1165
  int_field: int = 0
1128
1166
  float_field: float = 0.0
1129
1167
  str_field: str = ""
1130
- date_field: dt.date = today
1131
1168
 
1132
1169
  obj = Example()
1133
1170
  result = dataclass_to_schema(obj)
@@ -1136,7 +1173,6 @@ class TestDataClassToSchema:
1136
1173
  "int_field": Int64,
1137
1174
  "float_field": Float64,
1138
1175
  "str_field": String,
1139
- "date_field": Date,
1140
1176
  }
1141
1177
  assert result == expected
1142
1178
 
@@ -1150,42 +1186,60 @@ class TestDataClassToSchema:
1150
1186
  expected = {"x": Int64}
1151
1187
  assert result == expected
1152
1188
 
1153
- def test_date_or_datetime_as_date(self) -> None:
1154
- today = get_today().py_date()
1189
+ def test_containers(self) -> None:
1190
+ @dataclass(kw_only=True, slots=True)
1191
+ class Example:
1192
+ frozenset_field: frozenset[int] = field(default_factory=frozenset)
1193
+ list_field: list[int] = field(default_factory=list)
1194
+ set_field: set[int] = field(default_factory=set)
1195
+
1196
+ obj = Example()
1197
+ result = dataclass_to_schema(obj)
1198
+ expected = {
1199
+ "frozenset_field": List(Int64),
1200
+ "list_field": List(Int64),
1201
+ "set_field": List(Int64),
1202
+ }
1203
+ assert result == expected
1155
1204
 
1205
+ def test_date(self) -> None:
1156
1206
  @dataclass(kw_only=True, slots=True)
1157
1207
  class Example:
1158
- x: dt.date | dt.datetime = today
1208
+ x: whenever.Date = field(default_factory=get_today)
1159
1209
 
1160
1210
  obj = Example()
1161
1211
  result = dataclass_to_schema(obj)
1162
- expected = {"x": Date}
1212
+ expected = {"x": Object}
1163
1213
  assert result == expected
1164
1214
 
1165
- def test_date_or_datetime_as_local_datetime(self) -> None:
1166
- now = get_now().to_plain().py_datetime()
1215
+ def test_date_period(self) -> None:
1216
+ @dataclass(kw_only=True, slots=True)
1217
+ class Example:
1218
+ x: DatePeriod
1167
1219
 
1220
+ obj = Example(x=DatePeriod(TODAY_UTC, TODAY_UTC))
1221
+ result = dataclass_to_schema(obj, globalns=globals())
1222
+ expected = {"x": Object}
1223
+ assert result == expected
1224
+
1225
+ def test_date_delta(self) -> None:
1168
1226
  @dataclass(kw_only=True, slots=True)
1169
1227
  class Example:
1170
- x: dt.date | dt.datetime = now
1228
+ x: DateDelta = field(default_factory=DateDelta)
1171
1229
 
1172
1230
  obj = Example()
1173
1231
  result = dataclass_to_schema(obj)
1174
- expected = {"x": Datetime()}
1232
+ expected = {"x": Object}
1175
1233
  assert result == expected
1176
1234
 
1177
- @given(time_zone=timezones())
1178
- def test_date_or_datetime_as_zoned_datetime(self, *, time_zone: ZoneInfo) -> None:
1179
- with assume_does_not_raise(TimeZoneNotFoundError):
1180
- now = get_now(time_zone).py_datetime()
1181
-
1235
+ def test_date_time_delta(self) -> None:
1182
1236
  @dataclass(kw_only=True, slots=True)
1183
1237
  class Example:
1184
- x: dt.date | dt.datetime = now
1238
+ x: DateTimeDelta = field(default_factory=DateTimeDelta)
1185
1239
 
1186
1240
  obj = Example()
1187
1241
  result = dataclass_to_schema(obj)
1188
- expected = {"x": zoned_datetime_dtype(time_zone=time_zone)}
1242
+ expected = {"x": Object}
1189
1243
  assert result == expected
1190
1244
 
1191
1245
  def test_enum(self) -> None:
@@ -1212,16 +1266,14 @@ class TestDataClassToSchema:
1212
1266
  expected = {"x": pl.Enum(["true", "false"])}
1213
1267
  assert result == expected
1214
1268
 
1215
- def test_local_datetime(self) -> None:
1216
- now = get_now().to_plain().py_datetime()
1217
-
1269
+ def test_plain_date_time(self) -> None:
1218
1270
  @dataclass(kw_only=True, slots=True)
1219
1271
  class Example:
1220
- x: dt.datetime = now
1272
+ x: PlainDateTime = field(default_factory=get_now_plain)
1221
1273
 
1222
1274
  obj = Example()
1223
1275
  result = dataclass_to_schema(obj)
1224
- expected = {"x": Datetime()}
1276
+ expected = {"x": Object}
1225
1277
  assert result == expected
1226
1278
 
1227
1279
  def test_nested_once(self) -> None:
@@ -1289,71 +1341,69 @@ class TestDataClassToSchema:
1289
1341
  class Example:
1290
1342
  x: Path = PWD
1291
1343
 
1292
- _ = Path # add to locals
1293
1344
  obj = Example()
1294
- result = dataclass_to_schema(obj, localns=locals())
1345
+ result = dataclass_to_schema(obj)
1295
1346
  expected = {"x": Object}
1296
1347
  assert result == expected
1297
1348
 
1298
- def test_uuid(self) -> None:
1349
+ def test_time(self) -> None:
1299
1350
  @dataclass(kw_only=True, slots=True)
1300
1351
  class Example:
1301
- x: UUID = field(default_factory=uuid4)
1352
+ x: whenever.Time = field(default_factory=whenever.Time)
1302
1353
 
1303
- _ = UUID # add to locals
1304
1354
  obj = Example()
1305
- result = dataclass_to_schema(obj, localns=locals())
1355
+ result = dataclass_to_schema(obj)
1306
1356
  expected = {"x": Object}
1307
1357
  assert result == expected
1308
1358
 
1309
- @given(time_zone=timezones())
1310
- def test_zoned_datetime(self, *, time_zone: ZoneInfo) -> None:
1311
- with assume_does_not_raise(TimeZoneNotFoundError):
1312
- now = get_now(time_zone).py_datetime()
1313
-
1359
+ def test_time_delta(self) -> None:
1314
1360
  @dataclass(kw_only=True, slots=True)
1315
1361
  class Example:
1316
- x: dt.datetime = now
1362
+ x: TimeDelta = field(default_factory=TimeDelta)
1317
1363
 
1318
1364
  obj = Example()
1319
1365
  result = dataclass_to_schema(obj)
1320
- expected = {"x": zoned_datetime_dtype(time_zone=time_zone)}
1366
+ expected = {"x": Object}
1321
1367
  assert result == expected
1322
1368
 
1323
- @given(start=timezones(), end=timezones())
1324
- def test_zoned_datetime_nested(self, *, start: ZoneInfo, end: ZoneInfo) -> None:
1325
- with assume_does_not_raise(TimeZoneNotFoundError):
1326
- now_start = get_now(start).py_datetime()
1327
- now_end = get_now(end).py_datetime()
1328
-
1369
+ def test_time_period(self) -> None:
1329
1370
  @dataclass(kw_only=True, slots=True)
1330
- class Inner:
1331
- start: dt.datetime = now_start
1332
- end: dt.datetime = now_end
1371
+ class Example:
1372
+ x: TimePeriod
1373
+
1374
+ obj = Example(x=TimePeriod(whenever.Time(), whenever.Time()))
1375
+ result = dataclass_to_schema(obj, globalns=globals())
1376
+ expected = {"x": Object}
1377
+ assert result == expected
1333
1378
 
1379
+ def test_uuid(self) -> None:
1334
1380
  @dataclass(kw_only=True, slots=True)
1335
- class Outer:
1336
- inner: Inner = field(default_factory=Inner)
1381
+ class Example:
1382
+ x: UUID = field(default_factory=uuid4)
1337
1383
 
1338
- obj = Outer()
1339
- result = dataclass_to_schema(obj, localns=locals())
1340
- expected = {"inner": zoned_datetime_period_dtype(time_zone=(start, end))}
1384
+ obj = Example()
1385
+ result = dataclass_to_schema(obj)
1386
+ expected = {"x": Object}
1341
1387
  assert result == expected
1342
1388
 
1343
- def test_containers(self) -> None:
1389
+ def test_zoned_date_time(self) -> None:
1344
1390
  @dataclass(kw_only=True, slots=True)
1345
1391
  class Example:
1346
- frozenset_field: frozenset[int] = field(default_factory=frozenset)
1347
- list_field: list[int] = field(default_factory=list)
1348
- set_field: set[int] = field(default_factory=set)
1392
+ x: ZonedDateTime = field(default_factory=get_now)
1349
1393
 
1350
1394
  obj = Example()
1351
1395
  result = dataclass_to_schema(obj)
1352
- expected = {
1353
- "frozenset_field": List(Int64),
1354
- "list_field": List(Int64),
1355
- "set_field": List(Int64),
1356
- }
1396
+ expected = {"x": Object}
1397
+ assert result == expected
1398
+
1399
+ def test_zoned_date_time_period(self) -> None:
1400
+ @dataclass(kw_only=True, slots=True)
1401
+ class Example:
1402
+ x: ZonedDateTimePeriod
1403
+
1404
+ obj = Example(x=ZonedDateTimePeriod(NOW_UTC, NOW_UTC))
1405
+ result = dataclass_to_schema(obj, globalns=globals())
1406
+ expected = {"x": Object}
1357
1407
  assert result == expected
1358
1408
 
1359
1409
  def test_error(self) -> None:
@@ -2275,8 +2325,10 @@ class TestNormal:
2275
2325
 
2276
2326
 
2277
2327
  class TestOffsetDateTime:
2278
- @mark.parametrize(("n", "time"), [param(1, Time(13, 30)), param(2, Time(15))])
2279
- def test_main(self, *, n: int, time: Time) -> None:
2328
+ @mark.parametrize(
2329
+ ("n", "time"), [param(1, whenever.Time(13, 30)), param(2, whenever.Time(15))]
2330
+ )
2331
+ def test_main(self, *, n: int, time: whenever.Time) -> None:
2280
2332
  datetime = ZonedDateTime(2000, 1, 1, 12, tz=UTC.key)
2281
2333
  result = offset_datetime(datetime, "1h30m", n=n)
2282
2334
  expected = datetime.replace_time(time)
@@ -2450,8 +2502,8 @@ class TestSerializeAndDeserializeDataFrame:
2450
2502
  cases: ClassVar[list[tuple[PolarsDataType, SearchStrategy[Any]]]] = [
2451
2503
  (Boolean, booleans()),
2452
2504
  (Boolean(), booleans()),
2453
- (Date, hypothesis.strategies.dates()),
2454
- (Date(), hypothesis.strategies.dates()),
2505
+ (pl.Date, hypothesis.strategies.dates()),
2506
+ (pl.Date(), hypothesis.strategies.dates()),
2455
2507
  (Datetime(), py_datetimes(zoned=False)),
2456
2508
  (Datetime(time_zone=UTC.key), py_datetimes(zoned=True)),
2457
2509
  (Int64, int64s()),
@@ -2550,8 +2602,8 @@ class TestStructFromDataClass:
2550
2602
  class Example:
2551
2603
  bool_: bool
2552
2604
  bool_maybe: bool | None = None
2553
- date: dt.date
2554
- date_maybe: dt.date | None = None
2605
+ date: whenever.Date
2606
+ date_maybe: whenever.Date | None = None
2555
2607
  float_: float
2556
2608
  float_maybe: float | None = None
2557
2609
  int_: int
@@ -2563,8 +2615,8 @@ class TestStructFromDataClass:
2563
2615
  expected = Struct({
2564
2616
  "bool_": Boolean,
2565
2617
  "bool_maybe": Boolean,
2566
- "date": Date,
2567
- "date_maybe": Date,
2618
+ "date": pl.Date,
2619
+ "date_maybe": pl.Date,
2568
2620
  "float_": Float64,
2569
2621
  "float_maybe": Float64,
2570
2622
  "int_": Int64,