dycw-utilities 0.138.9__tar.gz → 0.138.11__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 (215) hide show
  1. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/PKG-INFO +2 -2
  2. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/pyproject.toml +4 -4
  3. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_orjson.py +11 -1
  4. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_whenever.py +30 -1
  5. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/whenever.py +38 -3
  7. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/.gitignore +0 -0
  8. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/LICENSE +0 -0
  9. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/README.md +0 -0
  10. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_aiolimiter.py +0 -0
  36. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_altair.py +0 -0
  37. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_asyncio.py +0 -0
  38. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_asyncio_classes/__init__.py +0 -0
  39. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_asyncio_classes/loopers.py +0 -0
  40. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_asyncio_classes/redis.py +0 -0
  41. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_atomicwrites.py +0 -0
  42. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_atools.py +0 -0
  43. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_cachetools.py +0 -0
  44. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_click.py +0 -0
  45. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_concurrent.py +0 -0
  46. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_contextlib.py +0 -0
  47. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_contextvars.py +0 -0
  48. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_cryptography.py +0 -0
  49. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_cvxpy.py +0 -0
  50. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_dataclasses.py +0 -0
  51. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_enum.py +0 -0
  52. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_errors.py +0 -0
  53. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_eventkit.py +0 -0
  54. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_fastapi.py +0 -0
  55. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_fpdf2.py +0 -0
  56. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_functions.py +0 -0
  57. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_functools.py +0 -0
  58. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_getpass.py +0 -0
  59. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_hashlib.py +0 -0
  60. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_http.py +0 -0
  61. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_hypothesis.py +0 -0
  62. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_importlib.py +0 -0
  63. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_inflect.py +0 -0
  64. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_ipython.py +0 -0
  65. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_iterables.py +0 -0
  66. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_jupyter.py +0 -0
  67. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_libcst.py +0 -0
  68. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_lightweight_charts.py +0 -0
  69. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_logging.py +0 -0
  70. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_luigi.py +0 -0
  71. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_objects/__init__.py +0 -0
  77. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_objects/objects.py +0 -0
  78. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_os.py +0 -0
  81. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_parse.py +0 -0
  82. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pathlib.py +0 -0
  83. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_period.py +0 -0
  84. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pickle.py +0 -0
  85. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_platform.py +0 -0
  86. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_polars.py +0 -0
  87. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_polars_ols.py +0 -0
  88. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pottery.py +0 -0
  89. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pqdm.py +0 -0
  90. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_psutil.py +0 -0
  91. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pydantic.py +0 -0
  92. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pytest.py +0 -0
  94. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_pytest_regressions.py +0 -0
  95. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_python_dotenv.py +0 -0
  96. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_random.py +0 -0
  97. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_re.py +0 -0
  98. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_redis.py +0 -0
  99. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_reprlib.py +0 -0
  100. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_scipy.py +0 -0
  101. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_sentinel.py +0 -0
  102. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_shelve.py +0 -0
  103. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_slack_sdk.py +0 -0
  104. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_socket.py +0 -0
  105. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_sqlalchemy.py +0 -0
  106. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_sqlalchemy_polars.py +0 -0
  107. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_statsmodels.py +0 -0
  108. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_streamlit.py +0 -0
  109. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_string.py +0 -0
  110. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_tempfile.py +0 -0
  111. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_text.py +0 -0
  112. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_threading.py +0 -0
  113. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_timer.py +0 -0
  114. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_traceback.py +0 -0
  115. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_typed_settings.py +0 -0
  116. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_types.py +0 -0
  117. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_typing.py +0 -0
  118. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_typing_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_typing_funcs/no_future.py +0 -0
  120. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_typing_funcs/with_future.py +0 -0
  121. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_tzdata.py +0 -0
  122. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_tzlocal.py +0 -0
  123. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_uuid.py +0 -0
  124. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_version.py +0 -0
  125. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_warnings.py +0 -0
  126. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_zipfile.py +0 -0
  127. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/tests/test_zoneinfo.py +0 -0
  128. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/aiolimiter.py +0 -0
  129. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/altair.py +0 -0
  130. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/asyncio.py +0 -0
  131. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/atomicwrites.py +0 -0
  132. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/atools.py +0 -0
  133. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/cachetools.py +0 -0
  134. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/click.py +0 -0
  135. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/concurrent.py +0 -0
  136. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/contextlib.py +0 -0
  137. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/contextvars.py +0 -0
  138. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/cryptography.py +0 -0
  139. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/cvxpy.py +0 -0
  140. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/dataclasses.py +0 -0
  141. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/enum.py +0 -0
  142. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/errors.py +0 -0
  143. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/eventkit.py +0 -0
  144. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/fastapi.py +0 -0
  145. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/fpdf2.py +0 -0
  146. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/functions.py +0 -0
  147. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/functools.py +0 -0
  148. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/getpass.py +0 -0
  149. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/hashlib.py +0 -0
  150. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/http.py +0 -0
  151. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/hypothesis.py +0 -0
  152. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/importlib.py +0 -0
  153. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/inflect.py +0 -0
  154. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/ipython.py +0 -0
  155. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/iterables.py +0 -0
  156. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/jupyter.py +0 -0
  157. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/libcst.py +0 -0
  158. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/lightweight_charts.py +0 -0
  159. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/logging.py +0 -0
  160. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/luigi.py +0 -0
  161. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/math.py +0 -0
  162. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/memory_profiler.py +0 -0
  163. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/modules.py +0 -0
  164. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/more_itertools.py +0 -0
  165. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/numpy.py +0 -0
  166. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/operator.py +0 -0
  167. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/optuna.py +0 -0
  168. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/orjson.py +0 -0
  169. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/os.py +0 -0
  170. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/parse.py +0 -0
  171. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pathlib.py +0 -0
  172. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/period.py +0 -0
  173. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pickle.py +0 -0
  174. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/platform.py +0 -0
  175. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/polars.py +0 -0
  176. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pottery.py +0 -0
  178. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pqdm.py +0 -0
  179. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/psutil.py +0 -0
  180. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/py.typed +0 -0
  181. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pydantic.py +0 -0
  182. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pyinstrument.py +0 -0
  183. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pytest.py +0 -0
  184. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pytest_regressions.py +0 -0
  185. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/pytest_regressions_plugin.py +0 -0
  186. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/python_dotenv.py +0 -0
  187. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/random.py +0 -0
  188. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/re.py +0 -0
  189. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/redis.py +0 -0
  190. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/reprlib.py +0 -0
  191. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/scipy.py +0 -0
  192. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/sentinel.py +0 -0
  193. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/shelve.py +0 -0
  194. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/slack_sdk.py +0 -0
  195. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/socket.py +0 -0
  196. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/sqlalchemy.py +0 -0
  197. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/sqlalchemy_polars.py +0 -0
  198. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/statsmodels.py +0 -0
  199. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/streamlit.py +0 -0
  200. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/text.py +0 -0
  203. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/threading.py +0 -0
  204. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/timer.py +0 -0
  205. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/traceback.py +0 -0
  206. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/typed_settings.py +0 -0
  207. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/types.py +0 -0
  208. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/typing.py +0 -0
  209. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/tzdata.py +0 -0
  210. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/tzlocal.py +0 -0
  211. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/uuid.py +0 -0
  212. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/version.py +0 -0
  213. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/warnings.py +0 -0
  214. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/zipfile.py +0 -0
  215. {dycw_utilities-0.138.9 → dycw_utilities-0.138.11}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.138.9
3
+ Version: 0.138.11
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -12,7 +12,7 @@ Provides-Extra: logging
12
12
  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
- Requires-Dist: hypothesis<6.136,>=6.135.14; extra == 'test'
15
+ Requires-Dist: hypothesis<6.136,>=6.135.15; extra == 'test'
16
16
  Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
17
17
  Requires-Dist: pytest-asyncio<1.1,>=1.0.0; extra == 'test'
18
18
  Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
@@ -41,7 +41,7 @@ fastapi-test = ["httpx", "uvicorn"]
41
41
  fpdf2 = ["fpdf2 >= 2.8.3, < 2.9"]
42
42
  hashlib-test = ["orjson"]
43
43
  http-test = ["orjson"]
44
- hypothesis = ["hypothesis >= 6.135.14, < 6.136"]
44
+ hypothesis = ["hypothesis >= 6.135.15, < 6.136"]
45
45
  hypothesis-test = ["libcst", "luigi", "pathvalidate", "numpy", "pytest-rerunfailures"]
46
46
  inflect = ["inflect >= 7.5.0, < 7.6"]
47
47
  jupyter-test = ["pandas", "polars"]
@@ -106,7 +106,7 @@ dependencies = [
106
106
  name = "dycw-utilities"
107
107
  readme = "README.md"
108
108
  requires-python = ">= 3.12"
109
- version = "0.138.9"
109
+ version = "0.138.11"
110
110
 
111
111
  [project.entry-points.pytest11]
112
112
  pytest-regressions = "utilities.pytest_regressions_plugin"
@@ -117,7 +117,7 @@ logging = [
117
117
  ]
118
118
  test = [
119
119
  "dycw-pytest-only >= 2.1.1, < 2.2",
120
- "hypothesis >= 6.135.14, < 6.136",
120
+ "hypothesis >= 6.135.15, < 6.136",
121
121
  "pudb >= 2025.1, < 2025.2",
122
122
  "pytest >= 8.3.5, < 8.4",
123
123
  "pytest-asyncio >= 1.0.0, < 1.1",
@@ -137,7 +137,7 @@ test = [
137
137
  # bump-my-version
138
138
  [tool.bumpversion]
139
139
  allow_dirty = true
140
- current_version = "0.138.9"
140
+ current_version = "0.138.11"
141
141
 
142
142
  [[tool.bumpversion.files]]
143
143
  filename = "src/utilities/__init__.py"
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from collections.abc import Iterable
4
4
  from io import StringIO
5
5
  from logging import DEBUG, WARNING, FileHandler, StreamHandler, getLogger
6
+ from math import inf, isnan, nan
6
7
  from pathlib import Path
7
8
  from re import search
8
9
  from typing import TYPE_CHECKING, Any
@@ -21,7 +22,7 @@ from hypothesis.strategies import (
21
22
  )
22
23
  from orjson import JSONDecodeError
23
24
  from polars import Object, String, UInt64
24
- from pytest import approx, raises
25
+ from pytest import approx, mark, param, raises
25
26
 
26
27
  from tests.conftest import SKIPIF_CI_AND_WINDOWS
27
28
  from tests.test_objects.objects import (
@@ -619,6 +620,15 @@ class TestSerializeAndDeserialize:
619
620
  with assume_does_not_raise(IsEqualError):
620
621
  assert is_equal(result, obj)
621
622
 
623
+ @mark.parametrize("value", [param(inf), param(-inf)])
624
+ def test_inf(self, *, value: float) -> None:
625
+ result = deserialize(serialize(value))
626
+ assert result == value
627
+
628
+ def test_nan(self) -> None:
629
+ result = deserialize(serialize(nan))
630
+ assert isnan(result)
631
+
622
632
  def test_none(self) -> None:
623
633
  result = deserialize(serialize(None))
624
634
  assert result is None
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import datetime as dt
3
4
  from dataclasses import dataclass, field
4
5
  from logging import DEBUG
5
6
  from typing import TYPE_CHECKING, ClassVar, Self
@@ -7,7 +8,7 @@ from zoneinfo import ZoneInfo
7
8
 
8
9
  from hypothesis import given
9
10
  from hypothesis.strategies import integers, none, sampled_from, timezones
10
- from pytest import raises
11
+ from pytest import mark, param, raises
11
12
  from whenever import (
12
13
  Date,
13
14
  DateDelta,
@@ -64,6 +65,7 @@ from utilities.whenever import (
64
65
  MinMaxDateError,
65
66
  ToDaysError,
66
67
  ToNanosError,
68
+ ToPyTimeDeltaError,
67
69
  WheneverLogRecord,
68
70
  _FreqDayIncrementError,
69
71
  _FreqIncrementError,
@@ -87,6 +89,7 @@ from utilities.whenever import (
87
89
  to_days,
88
90
  to_local_plain,
89
91
  to_nanos,
92
+ to_py_time_delta,
90
93
  to_time_delta,
91
94
  to_zoned_date_time,
92
95
  two_digit_year_month,
@@ -520,6 +523,32 @@ class TestToLocalPlain:
520
523
  assert isinstance(result, PlainDateTime)
521
524
 
522
525
 
526
+ class TestToPyTimeDelta:
527
+ @mark.parametrize(
528
+ ("delta", "expected"),
529
+ [
530
+ param(DateDelta(days=1), dt.timedelta(days=1)),
531
+ param(TimeDelta(microseconds=1), dt.timedelta(microseconds=1)),
532
+ param(
533
+ DateTimeDelta(days=1, microseconds=1),
534
+ dt.timedelta(days=1, microseconds=1),
535
+ ),
536
+ ],
537
+ )
538
+ def test_main(
539
+ self, *, delta: DateDelta | TimeDelta | DateTimeDelta, expected: dt.timedelta
540
+ ) -> None:
541
+ result = to_py_time_delta(delta)
542
+ assert result == expected
543
+
544
+ def test_error(self) -> None:
545
+ delta = TimeDelta(nanoseconds=1)
546
+ with raises(
547
+ ToPyTimeDeltaError, match="Time delta must not contain nanoseconds; got 1"
548
+ ):
549
+ _ = to_py_time_delta(delta)
550
+
551
+
523
552
  class TestToZonedDateTime:
524
553
  @given(date_time=zoned_datetimes())
525
554
  def test_date_time(self, *, date_time: ZonedDateTime) -> None:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.138.9"
3
+ __version__ = "0.138.11"
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import datetime as dt
3
4
  from collections.abc import Callable, Iterable, Mapping
4
5
  from dataclasses import dataclass
5
6
  from functools import cache
@@ -553,9 +554,10 @@ def to_local_plain(date_time: ZonedDateTime, /) -> PlainDateTime:
553
554
 
554
555
  def to_nanos(delta: DateTimeDelta, /) -> int:
555
556
  """Compute the number of nanoseconds in a date-time delta."""
556
- months, days, _, _ = delta.in_months_days_secs_nanos()
557
- if months != 0:
558
- raise ToNanosError(months=months)
557
+ try:
558
+ days = to_days(delta.date_part())
559
+ except ToDaysError as error:
560
+ raise ToNanosError(months=error.months) from None
559
561
  return 24 * 60 * 60 * int(1e9) * days + delta.time_part().in_nanoseconds()
560
562
 
561
563
 
@@ -571,6 +573,37 @@ class ToNanosError(Exception):
571
573
  ##
572
574
 
573
575
 
576
+ def to_py_time_delta(delta: DateDelta | TimeDelta | DateTimeDelta, /) -> dt.timedelta:
577
+ """Try convert a DateDelta to a standard library timedelta."""
578
+ match delta:
579
+ case DateDelta():
580
+ return dt.timedelta(days=to_days(delta))
581
+ case TimeDelta():
582
+ nanos = delta.in_nanoseconds()
583
+ micros, remainder = divmod(nanos, 1000)
584
+ if remainder != 0:
585
+ raise ToPyTimeDeltaError(nanoseconds=remainder)
586
+ return dt.timedelta(microseconds=micros)
587
+ case DateTimeDelta():
588
+ return to_py_time_delta(delta.date_part()) + to_py_time_delta(
589
+ delta.time_part()
590
+ )
591
+ case _ as never:
592
+ assert_never(never)
593
+
594
+
595
+ @dataclass(kw_only=True, slots=True)
596
+ class ToPyTimeDeltaError(Exception):
597
+ nanoseconds: int
598
+
599
+ @override
600
+ def __str__(self) -> str:
601
+ return f"Time delta must not contain nanoseconds; got {self.nanoseconds}"
602
+
603
+
604
+ ##
605
+
606
+
574
607
  def to_time_delta(nanos: int, /) -> TimeDelta:
575
608
  """Construct a time delta."""
576
609
  components = _to_time_delta_components(nanos)
@@ -769,6 +802,7 @@ __all__ = [
769
802
  "MinMaxDateError",
770
803
  "ToDaysError",
771
804
  "ToNanosError",
805
+ "ToPyTimeDeltaError",
772
806
  "WheneverLogRecord",
773
807
  "datetime_utc",
774
808
  "format_compact",
@@ -786,6 +820,7 @@ __all__ = [
786
820
  "to_days",
787
821
  "to_local_plain",
788
822
  "to_nanos",
823
+ "to_py_time_delta",
789
824
  "to_zoned_date_time",
790
825
  "two_digit_year_month",
791
826
  ]