dycw-utilities 0.138.10__tar.gz → 0.138.12__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.10 → dycw_utilities-0.138.12}/PKG-INFO +2 -2
  2. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/pyproject.toml +4 -4
  3. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_polars.py +27 -0
  4. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_whenever.py +30 -1
  5. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/polars.py +21 -0
  7. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/whenever.py +38 -3
  8. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/.gitignore +0 -0
  9. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/LICENSE +0 -0
  10. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/README.md +0 -0
  11. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/__init__.py +0 -0
  12. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/conftest.py +0 -0
  13. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/__init__.py +0 -0
  14. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_missing/__init__.py +0 -0
  15. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_missing/module.py +0 -0
  16. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_with/__init__.py +0 -0
  17. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_with/outer_1.py +0 -0
  18. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_with/outer_2.py +0 -0
  19. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  20. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  21. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  22. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  23. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_without/__init__.py +0 -0
  24. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_without/module_1.py +0 -0
  25. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/package_without/module_2.py +0 -0
  26. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/standalone.py +0 -0
  27. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/modules/with_imports.py +0 -0
  28. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  29. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  30. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  31. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  32. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  33. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  34. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  35. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  36. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_aiolimiter.py +0 -0
  37. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_altair.py +0 -0
  38. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_asyncio.py +0 -0
  39. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_asyncio_classes/__init__.py +0 -0
  40. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_asyncio_classes/loopers.py +0 -0
  41. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_asyncio_classes/redis.py +0 -0
  42. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_atomicwrites.py +0 -0
  43. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_atools.py +0 -0
  44. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_cachetools.py +0 -0
  45. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_click.py +0 -0
  46. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_concurrent.py +0 -0
  47. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_contextlib.py +0 -0
  48. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_contextvars.py +0 -0
  49. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_cryptography.py +0 -0
  50. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_cvxpy.py +0 -0
  51. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_dataclasses.py +0 -0
  52. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_enum.py +0 -0
  53. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_errors.py +0 -0
  54. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_eventkit.py +0 -0
  55. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_fastapi.py +0 -0
  56. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_fpdf2.py +0 -0
  57. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_functions.py +0 -0
  58. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_functools.py +0 -0
  59. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_getpass.py +0 -0
  60. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_hashlib.py +0 -0
  61. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_http.py +0 -0
  62. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_hypothesis.py +0 -0
  63. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_importlib.py +0 -0
  64. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_inflect.py +0 -0
  65. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_ipython.py +0 -0
  66. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_iterables.py +0 -0
  67. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_jupyter.py +0 -0
  68. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_libcst.py +0 -0
  69. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_lightweight_charts.py +0 -0
  70. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_logging.py +0 -0
  71. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_luigi.py +0 -0
  72. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_math.py +0 -0
  73. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_memory_profiler.py +0 -0
  74. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_modules.py +0 -0
  75. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_more_itertools.py +0 -0
  76. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_numpy.py +0 -0
  77. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_objects/__init__.py +0 -0
  78. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_objects/objects.py +0 -0
  79. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_operator.py +0 -0
  80. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_optuna.py +0 -0
  81. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_orjson.py +0 -0
  82. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_os.py +0 -0
  83. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_parse.py +0 -0
  84. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pathlib.py +0 -0
  85. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_period.py +0 -0
  86. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pickle.py +0 -0
  87. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_platform.py +0 -0
  88. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_polars_ols.py +0 -0
  89. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pottery.py +0 -0
  90. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_psutil.py +0 -0
  92. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pydantic.py +0 -0
  93. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pyinstrument.py +0 -0
  94. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pytest.py +0 -0
  95. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_python_dotenv.py +0 -0
  97. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_scipy.py +0 -0
  102. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_sentinel.py +0 -0
  103. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_shelve.py +0 -0
  104. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_slack_sdk.py +0 -0
  105. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_socket.py +0 -0
  106. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_sqlalchemy.py +0 -0
  107. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_sqlalchemy_polars.py +0 -0
  108. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_statsmodels.py +0 -0
  109. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_streamlit.py +0 -0
  110. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_string.py +0 -0
  111. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_tempfile.py +0 -0
  112. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_text.py +0 -0
  113. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_threading.py +0 -0
  114. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_timer.py +0 -0
  115. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_traceback.py +0 -0
  116. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_typed_settings.py +0 -0
  117. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_types.py +0 -0
  118. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_typing.py +0 -0
  119. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_typing_funcs/__init__.py +0 -0
  120. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_typing_funcs/no_future.py +0 -0
  121. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_typing_funcs/with_future.py +0 -0
  122. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_tzdata.py +0 -0
  123. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_tzlocal.py +0 -0
  124. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_uuid.py +0 -0
  125. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_version.py +0 -0
  126. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_warnings.py +0 -0
  127. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_zipfile.py +0 -0
  128. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/tests/test_zoneinfo.py +0 -0
  129. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/aiolimiter.py +0 -0
  130. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/altair.py +0 -0
  131. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/asyncio.py +0 -0
  132. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/atomicwrites.py +0 -0
  133. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/atools.py +0 -0
  134. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/cachetools.py +0 -0
  135. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/click.py +0 -0
  136. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/concurrent.py +0 -0
  137. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/contextlib.py +0 -0
  138. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/contextvars.py +0 -0
  139. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/cryptography.py +0 -0
  140. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/cvxpy.py +0 -0
  141. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/dataclasses.py +0 -0
  142. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/eventkit.py +0 -0
  145. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/fastapi.py +0 -0
  146. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/fpdf2.py +0 -0
  147. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/functions.py +0 -0
  148. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/functools.py +0 -0
  149. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/getpass.py +0 -0
  150. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/hashlib.py +0 -0
  151. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/http.py +0 -0
  152. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/hypothesis.py +0 -0
  153. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/importlib.py +0 -0
  154. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/inflect.py +0 -0
  155. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/ipython.py +0 -0
  156. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/iterables.py +0 -0
  157. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/jupyter.py +0 -0
  158. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/libcst.py +0 -0
  159. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/lightweight_charts.py +0 -0
  160. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/logging.py +0 -0
  161. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/luigi.py +0 -0
  162. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/math.py +0 -0
  163. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/memory_profiler.py +0 -0
  164. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/modules.py +0 -0
  165. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/more_itertools.py +0 -0
  166. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/numpy.py +0 -0
  167. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/operator.py +0 -0
  168. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/optuna.py +0 -0
  169. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/orjson.py +0 -0
  170. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/os.py +0 -0
  171. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/parse.py +0 -0
  172. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pathlib.py +0 -0
  173. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/period.py +0 -0
  174. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pickle.py +0 -0
  175. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/platform.py +0 -0
  176. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pottery.py +0 -0
  178. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pqdm.py +0 -0
  179. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/psutil.py +0 -0
  180. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/py.typed +0 -0
  181. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pydantic.py +0 -0
  182. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pyinstrument.py +0 -0
  183. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pytest.py +0 -0
  184. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pytest_regressions.py +0 -0
  185. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/pytest_regressions_plugin.py +0 -0
  186. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/python_dotenv.py +0 -0
  187. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/random.py +0 -0
  188. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/re.py +0 -0
  189. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/redis.py +0 -0
  190. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/reprlib.py +0 -0
  191. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/scipy.py +0 -0
  192. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/sentinel.py +0 -0
  193. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/shelve.py +0 -0
  194. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/slack_sdk.py +0 -0
  195. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/socket.py +0 -0
  196. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/sqlalchemy.py +0 -0
  197. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/sqlalchemy_polars.py +0 -0
  198. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/statsmodels.py +0 -0
  199. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/streamlit.py +0 -0
  200. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/text.py +0 -0
  203. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/threading.py +0 -0
  204. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/timer.py +0 -0
  205. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/traceback.py +0 -0
  206. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/typed_settings.py +0 -0
  207. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/types.py +0 -0
  208. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/typing.py +0 -0
  209. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/tzdata.py +0 -0
  210. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/tzlocal.py +0 -0
  211. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/uuid.py +0 -0
  212. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/version.py +0 -0
  213. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/warnings.py +0 -0
  214. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/src/utilities/zipfile.py +0 -0
  215. {dycw_utilities-0.138.10 → dycw_utilities-0.138.12}/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.10
3
+ Version: 0.138.12
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.16; 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.16, < 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.10"
109
+ version = "0.138.12"
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.16, < 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.10"
140
+ current_version = "0.138.12"
141
141
 
142
142
  [[tool.bumpversion.files]]
143
143
  filename = "src/utilities/__init__.py"
@@ -153,6 +153,7 @@ from utilities.polars import (
153
153
  nan_sum_agg,
154
154
  nan_sum_cols,
155
155
  normal,
156
+ order_of_magnitude,
156
157
  reify_exprs,
157
158
  replace_time_zone,
158
159
  set_first_row_as_columns,
@@ -1990,6 +1991,32 @@ class TestNormal:
1990
1991
  assert series.is_finite().all()
1991
1992
 
1992
1993
 
1994
+ class TestOrderOfMagnitude:
1995
+ @given(
1996
+ sign=sampled_from([1, -1]),
1997
+ case=sampled_from([
1998
+ (0.25, -0.60206, -1),
1999
+ (0.5, -0.30103, 0),
2000
+ (0.75, -0.1249387, 0),
2001
+ (1.0, 0.0, 0),
2002
+ (5.0, 0.69897, 1),
2003
+ (10.0, 1.0, 1),
2004
+ (50.0, 1.69897, 2),
2005
+ (100.0, 2.0, 2),
2006
+ ]),
2007
+ )
2008
+ def test_main(self, *, sign: int, case: tuple[float, float, int]) -> None:
2009
+ x, exp_float, exp_int = case
2010
+ x_use = Series(values=[sign * x])
2011
+ res_float = order_of_magnitude(x_use)
2012
+ assert res_float.dtype == Float64
2013
+ assert_series_equal(res_float, Series([exp_float]))
2014
+ res_int = order_of_magnitude(x_use, round_=True)
2015
+ assert res_int.dtype == Int64
2016
+ assert_series_equal(res_int, Series([exp_int]))
2017
+ assert (res_int == exp_int).all()
2018
+
2019
+
1993
2020
  class TestReifyExprs:
1994
2021
  @given(length=hypothesis.strategies.integers(0, 10), name=text_ascii())
1995
2022
  def test_one_expr(self, *, length: int, name: str) -> 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.10"
3
+ __version__ = "0.138.12"
@@ -1833,6 +1833,26 @@ def normal(
1833
1833
  ##
1834
1834
 
1835
1835
 
1836
+ @overload
1837
+ def order_of_magnitude(column: ExprLike, /, *, round_: bool = False) -> Expr: ...
1838
+ @overload
1839
+ def order_of_magnitude(column: Series, /, *, round_: bool = False) -> Series: ...
1840
+ @overload
1841
+ def order_of_magnitude(
1842
+ column: IntoExprColumn, /, *, round_: bool = False
1843
+ ) -> Expr | Series: ...
1844
+ def order_of_magnitude(
1845
+ column: IntoExprColumn, /, *, round_: bool = False
1846
+ ) -> Expr | Series:
1847
+ """Compute the order of magnitude of a column."""
1848
+ column = ensure_expr_or_series(column)
1849
+ result = column.abs().log10()
1850
+ return result.round().cast(Int64) if round_ else result
1851
+
1852
+
1853
+ ##
1854
+
1855
+
1836
1856
  def reify_exprs(
1837
1857
  *exprs: IntoExprColumn, **named_exprs: IntoExprColumn
1838
1858
  ) -> Expr | Series | DataFrame:
@@ -2184,6 +2204,7 @@ __all__ = [
2184
2204
  "nan_sum_agg",
2185
2205
  "nan_sum_cols",
2186
2206
  "normal",
2207
+ "order_of_magnitude",
2187
2208
  "replace_time_zone",
2188
2209
  "set_first_row_as_columns",
2189
2210
  "struct_dtype",
@@ -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
  ]