dycw-utilities 0.153.1__tar.gz → 0.153.3__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.153.1 → dycw_utilities-0.153.3}/PKG-INFO +1 -1
  2. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/pyproject.toml +3 -3
  3. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_polars.py +25 -1
  4. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/polars.py +87 -0
  6. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/types.py +8 -6
  7. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/.gitignore +0 -0
  8. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/LICENSE +0 -0
  9. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/README.md +0 -0
  10. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_altair.py +0 -0
  36. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_asyncio.py +0 -0
  37. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_atomicwrites.py +0 -0
  38. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_atools.py +0 -0
  39. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_cachetools.py +0 -0
  40. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_click.py +0 -0
  41. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_concurrent.py +0 -0
  42. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_contextlib.py +0 -0
  43. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_contextvars.py +0 -0
  44. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_cryptography.py +0 -0
  45. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_cvxpy.py +0 -0
  46. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_dataclasses.py +0 -0
  47. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_enum.py +0 -0
  48. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_errors.py +0 -0
  49. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_eventkit.py +0 -0
  50. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_fastapi.py +0 -0
  51. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_fpdf2.py +0 -0
  52. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_functions.py +0 -0
  53. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_functools.py +0 -0
  54. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_getpass.py +0 -0
  55. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_gzip.py +0 -0
  56. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_hashlib.py +0 -0
  57. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_http.py +0 -0
  58. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_hypothesis.py +0 -0
  59. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_importlib.py +0 -0
  60. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_inflect.py +0 -0
  61. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_ipython.py +0 -0
  62. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_iterables.py +0 -0
  63. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_json.py +0 -0
  64. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_jupyter.py +0 -0
  65. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_libcst.py +0 -0
  66. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_lightweight_charts.py +0 -0
  67. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_logging.py +0 -0
  68. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_math.py +0 -0
  69. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_memory_profiler.py +0 -0
  70. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_modules.py +0 -0
  71. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_more_itertools.py +0 -0
  72. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_numpy.py +0 -0
  73. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_objects/__init__.py +0 -0
  74. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_objects/objects.py +0 -0
  75. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_operator.py +0 -0
  76. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_optuna.py +0 -0
  77. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_orjson.py +0 -0
  78. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_os.py +0 -0
  79. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_parse.py +0 -0
  80. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pathlib.py +0 -0
  81. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pickle.py +0 -0
  82. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_platform.py +0 -0
  83. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_polars_ols.py +0 -0
  84. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_postgres.py +0 -0
  85. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pottery.py +0 -0
  86. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pqdm.py +0 -0
  87. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_psutil.py +0 -0
  88. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pyinstrument.py +0 -0
  89. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pytest.py +0 -0
  90. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pytest_randomly.py +0 -0
  91. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_pytest_regressions.py +0 -0
  92. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_random.py +0 -0
  93. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_re.py +0 -0
  94. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_redis.py +0 -0
  95. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_reprlib.py +0 -0
  96. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_scipy.py +0 -0
  97. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_sentinel.py +0 -0
  98. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_shelve.py +0 -0
  99. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_slack_sdk.py +0 -0
  100. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_socket.py +0 -0
  101. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_sqlalchemy.py +0 -0
  102. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_sqlalchemy_polars.py +0 -0
  103. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_statsmodels.py +0 -0
  104. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_string.py +0 -0
  105. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_tempfile.py +0 -0
  106. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_text.py +0 -0
  107. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_threading.py +0 -0
  108. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_timer.py +0 -0
  109. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_traceback.py +0 -0
  110. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_typed_settings.py +0 -0
  111. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_types.py +0 -0
  112. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_typing.py +0 -0
  113. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_typing_funcs/__init__.py +0 -0
  114. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_typing_funcs/no_future.py +0 -0
  115. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_typing_funcs/with_future.py +0 -0
  116. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_tzdata.py +0 -0
  117. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_tzlocal.py +0 -0
  118. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_uuid.py +0 -0
  119. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_version.py +0 -0
  120. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_warnings.py +0 -0
  121. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_whenever.py +0 -0
  122. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_yield_access/__init__.py +0 -0
  123. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_yield_access/script.py +0 -0
  124. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_yield_access/script.sh +0 -0
  125. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_zipfile.py +0 -0
  126. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/tests/test_zoneinfo.py +0 -0
  127. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/altair.py +0 -0
  128. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/asyncio.py +0 -0
  129. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/atomicwrites.py +0 -0
  130. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/atools.py +0 -0
  131. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/cachetools.py +0 -0
  132. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/click.py +0 -0
  133. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/concurrent.py +0 -0
  134. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/contextlib.py +0 -0
  135. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/contextvars.py +0 -0
  136. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/cryptography.py +0 -0
  137. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/cvxpy.py +0 -0
  138. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/dataclasses.py +0 -0
  139. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/enum.py +0 -0
  140. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/errors.py +0 -0
  141. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/eventkit.py +0 -0
  142. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/fastapi.py +0 -0
  143. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/fpdf2.py +0 -0
  144. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/functions.py +0 -0
  145. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/functools.py +0 -0
  146. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/getpass.py +0 -0
  147. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/gzip.py +0 -0
  148. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/hashlib.py +0 -0
  149. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/http.py +0 -0
  150. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/hypothesis.py +0 -0
  151. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/importlib.py +0 -0
  152. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/inflect.py +0 -0
  153. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/ipython.py +0 -0
  154. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/iterables.py +0 -0
  155. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/json.py +0 -0
  156. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/jupyter.py +0 -0
  157. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/libcst.py +0 -0
  158. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/lightweight_charts.py +0 -0
  159. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/logging.py +0 -0
  160. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/math.py +0 -0
  161. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/memory_profiler.py +0 -0
  162. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/modules.py +0 -0
  163. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/more_itertools.py +0 -0
  164. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/numpy.py +0 -0
  165. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/operator.py +0 -0
  166. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/optuna.py +0 -0
  167. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/orjson.py +0 -0
  168. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/os.py +0 -0
  169. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/parse.py +0 -0
  170. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pathlib.py +0 -0
  171. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pickle.py +0 -0
  172. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/platform.py +0 -0
  173. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/polars_ols.py +0 -0
  174. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/postgres.py +0 -0
  175. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pottery.py +0 -0
  176. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pqdm.py +0 -0
  177. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/psutil.py +0 -0
  178. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/py.typed +0 -0
  179. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pyinstrument.py +0 -0
  180. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pytest.py +0 -0
  181. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pytest_plugins/__init__.py +0 -0
  182. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  183. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  184. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/pytest_regressions.py +0 -0
  185. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/random.py +0 -0
  186. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/re.py +0 -0
  187. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/redis.py +0 -0
  188. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/reprlib.py +0 -0
  189. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/scipy.py +0 -0
  190. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/sentinel.py +0 -0
  191. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/shelve.py +0 -0
  192. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/slack_sdk.py +0 -0
  193. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/socket.py +0 -0
  194. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/sqlalchemy.py +0 -0
  195. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/sqlalchemy_polars.py +0 -0
  196. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/statsmodels.py +0 -0
  197. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/string.py +0 -0
  198. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/tempfile.py +0 -0
  199. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/text.py +0 -0
  200. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/threading.py +0 -0
  201. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/timer.py +0 -0
  202. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/traceback.py +0 -0
  203. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/typed_settings.py +0 -0
  204. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/typing.py +0 -0
  205. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/tzdata.py +0 -0
  206. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/tzlocal.py +0 -0
  207. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/uuid.py +0 -0
  208. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/version.py +0 -0
  209. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/warnings.py +0 -0
  210. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/whenever.py +0 -0
  211. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/zipfile.py +0 -0
  212. {dycw_utilities-0.153.1 → dycw_utilities-0.153.3}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.153.1
3
+ Version: 0.153.3
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -190,7 +190,7 @@ slack-sdk-test = [
190
190
  "aiohttp",
191
191
  ]
192
192
  sqlalchemy = [
193
- "sqlalchemy >=2.0.41, <2.1",
193
+ "sqlalchemy >=2.0.42, <2.1",
194
194
  "psycopg",
195
195
  ]
196
196
  sqlalchemy-polars = [
@@ -229,7 +229,7 @@ dependencies = [
229
229
  name = "dycw-utilities"
230
230
  readme = "README.md"
231
231
  requires-python = ">= 3.12"
232
- version = "0.153.1"
232
+ version = "0.153.3"
233
233
 
234
234
  [project.entry-points.pytest11]
235
235
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -262,7 +262,7 @@ test = [
262
262
  # bump-my-version
263
263
  [tool.bumpversion]
264
264
  allow_dirty = true
265
- current_version = "0.153.1"
265
+ current_version = "0.153.3"
266
266
 
267
267
  [[tool.bumpversion.files]]
268
268
  filename = "src/utilities/__init__.py"
@@ -58,7 +58,7 @@ from polars.exceptions import ComputeError
58
58
  from polars.schema import Schema
59
59
  from polars.testing import assert_frame_equal, assert_series_equal
60
60
  from pytest import mark, param, raises
61
- from whenever import TimeZoneNotFoundError
61
+ from whenever import Time, TimeZoneNotFoundError, ZonedDateTime
62
62
 
63
63
  import utilities.polars
64
64
  from utilities.hypothesis import (
@@ -173,7 +173,9 @@ from utilities.polars import (
173
173
  nan_sum_agg,
174
174
  nan_sum_cols,
175
175
  normal,
176
+ offset_datetime,
176
177
  order_of_magnitude,
178
+ period_range,
177
179
  read_dataframe,
178
180
  read_series,
179
181
  reify_exprs,
@@ -2205,6 +2207,15 @@ class TestNormal:
2205
2207
  assert series.is_finite().all()
2206
2208
 
2207
2209
 
2210
+ class TestOffsetDateTime:
2211
+ @mark.parametrize(("n", "time"), [param(1, Time(13, 30)), param(2, Time(15))])
2212
+ def test_main(self, *, n: int, time: Time) -> None:
2213
+ datetime = ZonedDateTime(2000, 1, 1, 12, tz=UTC.key)
2214
+ result = offset_datetime(datetime, "1h30m", n=n)
2215
+ expected = datetime.replace_time(time)
2216
+ assert result == expected
2217
+
2218
+
2208
2219
  class TestOrderOfMagnitude:
2209
2220
  @given(
2210
2221
  sign=sampled_from([1, -1]),
@@ -2231,6 +2242,19 @@ class TestOrderOfMagnitude:
2231
2242
  assert (res_int == exp_int).all()
2232
2243
 
2233
2244
 
2245
+ class TestPeriodRange:
2246
+ start: ClassVar[ZonedDateTime] = ZonedDateTime(2000, 1, 1, 12, tz=UTC.key)
2247
+ end: ClassVar[ZonedDateTime] = ZonedDateTime(2000, 1, 1, 15, tz=UTC.key)
2248
+
2249
+ @mark.parametrize("end_or_length", [param(end), param(3)])
2250
+ def test_main(self, *, end_or_length: ZonedDateTime | int) -> None:
2251
+ rng = period_range(self.start, end_or_length, interval="1h", eager=True)
2252
+ assert len(rng) == 3
2253
+ assert rng.dtype == zoned_datetime_period_dtype()
2254
+ assert rng[0]["start"] == self.start.py_datetime()
2255
+ assert rng[-1]["end"] == self.end.py_datetime()
2256
+
2257
+
2234
2258
  class TestReifyExprs:
2235
2259
  @given(length=hypothesis.strategies.integers(0, 10), name=text_ascii())
2236
2260
  def test_one_expr(self, *, length: int, name: str) -> None:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.153.1"
3
+ __version__ = "0.153.3"
@@ -33,6 +33,7 @@ from polars import (
33
33
  any_horizontal,
34
34
  col,
35
35
  concat,
36
+ datetime_range,
36
37
  int_range,
37
38
  lit,
38
39
  struct,
@@ -49,6 +50,7 @@ from polars.exceptions import (
49
50
  )
50
51
  from polars.schema import Schema
51
52
  from polars.testing import assert_frame_equal, assert_series_equal
53
+ from whenever import ZonedDateTime
52
54
 
53
55
  from utilities.dataclasses import _YieldFieldsInstance, yield_fields
54
56
  from utilities.errors import ImpossibleCaseError
@@ -129,6 +131,7 @@ DatetimeUSEastern = Datetime(time_zone="US/Eastern")
129
131
  DatetimeUTC = Datetime(time_zone="UTC")
130
132
  _FINITE_EWM_MIN_WEIGHT = 0.9999
131
133
 
134
+
132
135
  ##
133
136
 
134
137
 
@@ -2021,6 +2024,19 @@ def normal(
2021
2024
  ##
2022
2025
 
2023
2026
 
2027
+ def offset_datetime(
2028
+ datetime: ZonedDateTime, offset: str, /, *, n: int = 1
2029
+ ) -> ZonedDateTime:
2030
+ """Offset a datetime as `polars` would."""
2031
+ sr = Series(values=[datetime.py_datetime()])
2032
+ for _ in range(n):
2033
+ sr = sr.dt.offset_by(offset)
2034
+ return ZonedDateTime.from_py_datetime(sr.item())
2035
+
2036
+
2037
+ ##
2038
+
2039
+
2024
2040
  @overload
2025
2041
  def order_of_magnitude(column: ExprLike, /, *, round_: bool = False) -> Expr: ...
2026
2042
  @overload
@@ -2041,6 +2057,75 @@ def order_of_magnitude(
2041
2057
  ##
2042
2058
 
2043
2059
 
2060
+ @overload
2061
+ def period_range(
2062
+ start: ZonedDateTime,
2063
+ end_or_length: ZonedDateTime | int,
2064
+ /,
2065
+ *,
2066
+ interval: str = "1d",
2067
+ time_unit: TimeUnit | None = None,
2068
+ time_zone: TimeZoneLike | None = None,
2069
+ eager: Literal[True],
2070
+ ) -> Series: ...
2071
+ @overload
2072
+ def period_range(
2073
+ start: ZonedDateTime,
2074
+ end_or_length: ZonedDateTime | int,
2075
+ /,
2076
+ *,
2077
+ interval: str = "1d",
2078
+ time_unit: TimeUnit | None = None,
2079
+ time_zone: TimeZoneLike | None = None,
2080
+ eager: Literal[False] = False,
2081
+ ) -> Expr: ...
2082
+ @overload
2083
+ def period_range(
2084
+ start: ZonedDateTime,
2085
+ end_or_length: ZonedDateTime | int,
2086
+ /,
2087
+ *,
2088
+ interval: str = "1d",
2089
+ time_unit: TimeUnit | None = None,
2090
+ time_zone: TimeZoneLike | None = None,
2091
+ eager: bool = False,
2092
+ ) -> Series | Expr: ...
2093
+ def period_range(
2094
+ start: ZonedDateTime,
2095
+ end_or_length: ZonedDateTime | int,
2096
+ /,
2097
+ *,
2098
+ interval: str = "1d",
2099
+ time_unit: TimeUnit | None = None,
2100
+ time_zone: TimeZoneLike | None = None,
2101
+ eager: bool = False,
2102
+ ) -> Series | Expr:
2103
+ """Construct a period range."""
2104
+ time_zone_use = None if time_zone is None else ensure_time_zone(time_zone).key
2105
+ match end_or_length:
2106
+ case ZonedDateTime() as end:
2107
+ ...
2108
+ case int() as length:
2109
+ end = offset_datetime(start, interval, n=length)
2110
+ case never:
2111
+ assert_never(never)
2112
+ starts = datetime_range(
2113
+ start.py_datetime(),
2114
+ end.py_datetime(),
2115
+ interval,
2116
+ closed="left",
2117
+ time_unit=time_unit,
2118
+ time_zone=time_zone_use,
2119
+ eager=eager,
2120
+ ).alias("start")
2121
+ ends = (starts.dt.offset_by(interval)).alias("end")
2122
+ period = struct(starts, ends)
2123
+ return try_reify_expr(period, starts, ends)
2124
+
2125
+
2126
+ ##
2127
+
2128
+
2044
2129
  def reify_exprs(
2045
2130
  *exprs: IntoExprColumn, **named_exprs: IntoExprColumn
2046
2131
  ) -> Expr | Series | DataFrame:
@@ -2529,7 +2614,9 @@ __all__ = [
2529
2614
  "nan_sum_agg",
2530
2615
  "nan_sum_cols",
2531
2616
  "normal",
2617
+ "offset_datetime",
2532
2618
  "order_of_magnitude",
2619
+ "period_range",
2533
2620
  "read_dataframe",
2534
2621
  "read_series",
2535
2622
  "replace_time_zone",
@@ -39,7 +39,6 @@ _T_contra = TypeVar("_T_contra", contravariant=True)
39
39
 
40
40
 
41
41
  # basic
42
- type BoolLike = MaybeStr[bool]
43
42
  type OpenMode = Literal[
44
43
  "r",
45
44
  "w",
@@ -63,13 +62,15 @@ type OpenMode = Literal[
63
62
  "a+b",
64
63
  ]
65
64
  type MaybeCallable[T] = T | Callable[[], T]
66
- type MaybeCallableBoolLike = MaybeCallable[BoolLike]
67
65
  type MaybeStr[T] = T | str
68
66
  type MaybeType[T] = T | type[T]
69
67
  type StrMapping = Mapping[str, Any]
70
68
  type StrStrMapping = Mapping[str, str]
71
- type TypeLike[T] = type[T] | tuple[type[T], ...]
72
69
  type TupleOrStrMapping = tuple[Any, ...] | StrMapping
70
+ type TypeLike[T] = type[T] | tuple[type[T], ...]
71
+ # basic - derived
72
+ type MaybeCallableBoolLike = MaybeCallable[BoolLike]
73
+ type BoolLike = MaybeStr[bool]
73
74
 
74
75
 
75
76
  # asyncio
@@ -114,12 +115,12 @@ IPv6AddressLike = MaybeStr[IPv6Address]
114
115
 
115
116
 
116
117
  # iterables
117
- type SequenceLT[T] = list[T] | tuple[T, ...]
118
- # iterables - maybe
119
118
  type MaybeCollection[T] = T | Collection[T]
120
119
  type MaybeIterable[T] = T | Iterable[T]
120
+ type MaybeList[T] = T | list[T]
121
+ type SequenceLT[T] = list[T] | tuple[T, ...]
122
+ # iterables - dervied
121
123
  type MaybeSequence[T] = T | SequenceLT[T]
122
- # iterables - str
123
124
  type SequenceStr = SequenceLT[str]
124
125
  type CollectionStr = dict[str, Any] | frozenset[str] | set[str] | SequenceStr
125
126
  # iterables - maybe str
@@ -299,6 +300,7 @@ __all__ = [
299
300
  "MaybeCollectionStr",
300
301
  "MaybeCoro",
301
302
  "MaybeIterable",
303
+ "MaybeList",
302
304
  "MaybeSequence",
303
305
  "MaybeSequenceStr",
304
306
  "MaybeStr",