dycw-utilities 0.159.0__tar.gz → 0.159.2__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 (209) hide show
  1. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/PKG-INFO +1 -1
  2. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/pyproject.toml +3 -3
  3. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_polars.py +50 -9
  4. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/polars.py +75 -26
  6. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pytest_regressions.py +1 -3
  7. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/.gitignore +0 -0
  8. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/LICENSE +0 -0
  9. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/README.md +0 -0
  10. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_altair.py +0 -0
  36. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_asyncio.py +0 -0
  37. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_atomicwrites.py +0 -0
  38. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_atools.py +0 -0
  39. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_cachetools.py +0 -0
  40. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_click.py +0 -0
  41. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_concurrent.py +0 -0
  42. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_contextlib.py +0 -0
  43. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_contextvars.py +0 -0
  44. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_cryptography.py +0 -0
  45. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_cvxpy.py +0 -0
  46. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_dataclasses.py +0 -0
  47. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_enum.py +0 -0
  48. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_errors.py +0 -0
  49. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_eventkit.py +0 -0
  50. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_fastapi.py +0 -0
  51. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_fpdf2.py +0 -0
  52. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_functions.py +0 -0
  53. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_functools.py +0 -0
  54. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_getpass.py +0 -0
  55. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_gzip.py +0 -0
  56. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_hashlib.py +0 -0
  57. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_http.py +0 -0
  58. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_hypothesis.py +0 -0
  59. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_importlib.py +0 -0
  60. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_inflect.py +0 -0
  61. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_ipython.py +0 -0
  62. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_iterables.py +0 -0
  63. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_json.py +0 -0
  64. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_jupyter.py +0 -0
  65. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_libcst.py +0 -0
  66. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_lightweight_charts.py +0 -0
  67. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_logging.py +0 -0
  68. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_math.py +0 -0
  69. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_memory_profiler.py +0 -0
  70. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_modules.py +0 -0
  71. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_more_itertools.py +0 -0
  72. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_numpy.py +0 -0
  73. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_objects/__init__.py +0 -0
  74. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_objects/objects.py +0 -0
  75. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_operator.py +0 -0
  76. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_optuna.py +0 -0
  77. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_orjson.py +0 -0
  78. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_os.py +0 -0
  79. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_parse.py +0 -0
  80. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pathlib.py +0 -0
  81. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pickle.py +0 -0
  82. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_platform.py +0 -0
  83. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_polars_ols.py +0 -0
  84. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_postgres.py +0 -0
  85. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pottery.py +0 -0
  86. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pqdm.py +0 -0
  87. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_psutil.py +0 -0
  88. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pyinstrument.py +0 -0
  89. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pytest.py +0 -0
  90. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pytest_randomly.py +0 -0
  91. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_pytest_regressions.py +0 -0
  92. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_random.py +0 -0
  93. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_re.py +0 -0
  94. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_redis.py +0 -0
  95. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_reprlib.py +0 -0
  96. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_scipy.py +0 -0
  97. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_sentinel.py +0 -0
  98. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_shelve.py +0 -0
  99. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_slack_sdk.py +0 -0
  100. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_socket.py +0 -0
  101. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_sqlalchemy.py +0 -0
  102. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_sqlalchemy_polars.py +0 -0
  103. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_statsmodels.py +0 -0
  104. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_string.py +0 -0
  105. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_tempfile.py +0 -0
  106. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_text.py +0 -0
  107. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_threading.py +0 -0
  108. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_timer.py +0 -0
  109. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_traceback.py +0 -0
  110. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_typed_settings.py +0 -0
  111. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_types.py +0 -0
  112. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_typing.py +0 -0
  113. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_typing_funcs/__init__.py +0 -0
  114. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_typing_funcs/no_future.py +0 -0
  115. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_typing_funcs/with_future.py +0 -0
  116. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_tzdata.py +0 -0
  117. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_tzlocal.py +0 -0
  118. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_uuid.py +0 -0
  119. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_version.py +0 -0
  120. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_warnings.py +0 -0
  121. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_whenever.py +0 -0
  122. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_zipfile.py +0 -0
  123. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/tests/test_zoneinfo.py +0 -0
  124. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/altair.py +0 -0
  125. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/asyncio.py +0 -0
  126. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/atomicwrites.py +0 -0
  127. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/atools.py +0 -0
  128. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/cachetools.py +0 -0
  129. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/click.py +0 -0
  130. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/concurrent.py +0 -0
  131. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/contextlib.py +0 -0
  132. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/contextvars.py +0 -0
  133. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/cryptography.py +0 -0
  134. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/cvxpy.py +0 -0
  135. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/dataclasses.py +0 -0
  136. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/enum.py +0 -0
  137. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/errors.py +0 -0
  138. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/eventkit.py +0 -0
  139. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/fastapi.py +0 -0
  140. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/fpdf2.py +0 -0
  141. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/functions.py +0 -0
  142. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/functools.py +0 -0
  143. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/getpass.py +0 -0
  144. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/gzip.py +0 -0
  145. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/hashlib.py +0 -0
  146. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/http.py +0 -0
  147. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/hypothesis.py +0 -0
  148. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/importlib.py +0 -0
  149. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/inflect.py +0 -0
  150. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/ipython.py +0 -0
  151. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/iterables.py +0 -0
  152. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/json.py +0 -0
  153. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/jupyter.py +0 -0
  154. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/libcst.py +0 -0
  155. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/lightweight_charts.py +0 -0
  156. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/logging.py +0 -0
  157. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/math.py +0 -0
  158. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/memory_profiler.py +0 -0
  159. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/modules.py +0 -0
  160. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/more_itertools.py +0 -0
  161. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/numpy.py +0 -0
  162. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/operator.py +0 -0
  163. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/optuna.py +0 -0
  164. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/orjson.py +0 -0
  165. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/os.py +0 -0
  166. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/parse.py +0 -0
  167. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pathlib.py +0 -0
  168. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pickle.py +0 -0
  169. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/platform.py +0 -0
  170. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/polars_ols.py +0 -0
  171. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/postgres.py +0 -0
  172. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pottery.py +0 -0
  173. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pqdm.py +0 -0
  174. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/psutil.py +0 -0
  175. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/py.typed +0 -0
  176. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pyinstrument.py +0 -0
  177. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pytest.py +0 -0
  178. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pytest_plugins/__init__.py +0 -0
  179. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  180. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  181. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/random.py +0 -0
  182. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/re.py +0 -0
  183. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/redis.py +0 -0
  184. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/reprlib.py +0 -0
  185. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/scipy.py +0 -0
  186. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/sentinel.py +0 -0
  187. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/shelve.py +0 -0
  188. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/slack_sdk.py +0 -0
  189. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/socket.py +0 -0
  190. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/sqlalchemy.py +0 -0
  191. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/sqlalchemy_polars.py +0 -0
  192. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/statsmodels.py +0 -0
  193. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/string.py +0 -0
  194. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/tempfile.py +0 -0
  195. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/text.py +0 -0
  196. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/threading.py +0 -0
  197. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/timer.py +0 -0
  198. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/traceback.py +0 -0
  199. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/typed_settings.py +0 -0
  200. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/types.py +0 -0
  201. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/typing.py +0 -0
  202. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/tzdata.py +0 -0
  203. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/tzlocal.py +0 -0
  204. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/uuid.py +0 -0
  205. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/version.py +0 -0
  206. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/warnings.py +0 -0
  207. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/whenever.py +0 -0
  208. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/zipfile.py +0 -0
  209. {dycw_utilities-0.159.0 → dycw_utilities-0.159.2}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.159.0
3
+ Version: 0.159.2
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -118,7 +118,7 @@ orjson-test = [
118
118
  "polars",
119
119
  ]
120
120
  polars = [
121
- "polars >=1.32.2, <1.33",
121
+ "polars >=1.32.3, <1.33",
122
122
  ]
123
123
  polars-ols = [
124
124
  "polars-ols >=0.3.5, <0.4",
@@ -227,7 +227,7 @@ dependencies = [
227
227
  name = "dycw-utilities"
228
228
  readme = "README.md"
229
229
  requires-python = ">= 3.12"
230
- version = "0.159.0"
230
+ version = "0.159.2"
231
231
 
232
232
  [project.entry-points.pytest11]
233
233
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -259,7 +259,7 @@ test = [
259
259
  # bump-my-version
260
260
  [tool.bumpversion]
261
261
  allow_dirty = true
262
- current_version = "0.159.0"
262
+ current_version = "0.159.2"
263
263
 
264
264
  [[tool.bumpversion.files]]
265
265
  filename = "src/utilities/__init__.py"
@@ -94,6 +94,8 @@ from utilities.polars import (
94
94
  FiniteEWMMeanError,
95
95
  InsertAfterError,
96
96
  InsertBeforeError,
97
+ OneColumnEmptyError,
98
+ OneColumnNonUniqueError,
97
99
  SetFirstRowAsColumnsError,
98
100
  TimePeriodDType,
99
101
  _check_polars_dataframe_predicates,
@@ -147,7 +149,6 @@ from utilities.polars import (
147
149
  boolean_value_counts,
148
150
  check_polars_dataframe,
149
151
  choice,
150
- collect_series,
151
152
  columns_to_dict,
152
153
  concat_series,
153
154
  convert_time_zone,
@@ -161,7 +162,9 @@ from utilities.polars import (
161
162
  ensure_data_type,
162
163
  ensure_expr_or_series,
163
164
  ensure_expr_or_series_many,
165
+ expr_to_series,
164
166
  finite_ewm_mean,
167
+ first_true_horizontal,
165
168
  get_data_type_or_series_time_zone,
166
169
  get_expr_name,
167
170
  get_frequency_spectrum,
@@ -180,6 +183,7 @@ from utilities.polars import (
180
183
  nan_sum_cols,
181
184
  normal,
182
185
  offset_datetime,
186
+ one_column,
183
187
  order_of_magnitude,
184
188
  period_range,
185
189
  read_dataframe,
@@ -827,14 +831,6 @@ class TestChoice:
827
831
  assert series.is_in(list(elements)).all()
828
832
 
829
833
 
830
- class TestCollectSeries:
831
- def test_main(self) -> None:
832
- expr = int_range(end=10)
833
- series = collect_series(expr)
834
- expected = int_range(end=10, eager=True)
835
- assert_series_equal(series, expected)
836
-
837
-
838
834
  class TestColumnsToDict:
839
835
  def test_main(self) -> None:
840
836
  df = DataFrame(
@@ -1470,6 +1466,14 @@ class TestEnsureExprOrSeriesMany:
1470
1466
  assert isinstance(r, Expr | Series)
1471
1467
 
1472
1468
 
1469
+ class TestExprToSeries:
1470
+ def test_main(self) -> None:
1471
+ expr = int_range(end=10)
1472
+ series = expr_to_series(expr)
1473
+ expected = int_range(end=10, eager=True)
1474
+ assert_series_equal(series, expected)
1475
+
1476
+
1473
1477
  class TestFiniteEWMMean:
1474
1478
  alpha_0_75_values: ClassVar[list[float]] = [
1475
1479
  -8.269850726503885,
@@ -1555,6 +1559,22 @@ class TestFiniteEWMWeights:
1555
1559
  _ = _finite_ewm_weights(min_weight=1.0)
1556
1560
 
1557
1561
 
1562
+ class TestFirstTrueHorizontal:
1563
+ @mark.parametrize(
1564
+ ("row", "expected"),
1565
+ [
1566
+ param([True, True, True], 0),
1567
+ param([False, True, True], 1),
1568
+ param([False, False, True], 2),
1569
+ param([False, False, False], None),
1570
+ ],
1571
+ )
1572
+ def test_main(self, *, row: list[bool], expected: int | None) -> None:
1573
+ df = DataFrame([row], schema={str(i): Boolean for i in range(3)}, orient="row")
1574
+ result = first_true_horizontal(df)
1575
+ assert result.item() == expected
1576
+
1577
+
1558
1578
  class TestGetDataTypeOrSeriesTimeZone:
1559
1579
  @given(
1560
1580
  time_zone=sampled_from([HongKong, UTC]),
@@ -2239,6 +2259,27 @@ class TestOffsetDateTime:
2239
2259
  assert result == expected
2240
2260
 
2241
2261
 
2262
+ class TestOneColumn:
2263
+ def test_main(self) -> None:
2264
+ series = int_range(end=10, eager=True).alias("x")
2265
+ df = series.to_frame()
2266
+ result = one_column(df)
2267
+ assert_series_equal(result, series)
2268
+
2269
+ def test_error_empty(self) -> None:
2270
+ with raises(OneColumnEmptyError, match="DataFrame must not be empty"):
2271
+ _ = one_column(DataFrame())
2272
+
2273
+ def test_error_non_unique(self) -> None:
2274
+ x, y = [int_range(end=10, eager=True).alias(name) for name in ["x", "y"]]
2275
+ df = concat_series(x, y)
2276
+ with raises(
2277
+ OneColumnNonUniqueError,
2278
+ match="DataFrame must contain exactly one column; got 'x', 'y' and perhaps more",
2279
+ ):
2280
+ _ = one_column(df)
2281
+
2282
+
2242
2283
  class TestOrderOfMagnitude:
2243
2284
  @given(
2244
2285
  sign=sampled_from([1, -1]),
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.159.0"
3
+ __version__ = "0.159.2"
@@ -32,6 +32,7 @@ from polars import (
32
32
  any_horizontal,
33
33
  col,
34
34
  concat,
35
+ concat_list,
35
36
  datetime_range,
36
37
  int_range,
37
38
  lit,
@@ -42,9 +43,9 @@ from polars import (
42
43
  from polars._typing import PolarsDataType
43
44
  from polars.datatypes import DataType, DataTypeClass
44
45
  from polars.exceptions import (
45
- ColumnNotFoundError, # pyright: ignore[reportAttributeAccessIssue]
46
+ ColumnNotFoundError,
46
47
  NoRowsReturnedError,
47
- OutOfBoundsError, # pyright: ignore[reportAttributeAccessIssue]
48
+ OutOfBoundsError,
48
49
  PolarsInefficientMapWarning,
49
50
  )
50
51
  from polars.schema import Schema
@@ -337,8 +338,8 @@ def are_frames_equal(
337
338
  check_column_order: bool = True,
338
339
  check_dtypes: bool = True,
339
340
  check_exact: bool = False,
340
- rtol: float = 1e-5,
341
- atol: float = 1e-8,
341
+ rel_tol: float = 1e-5,
342
+ abs_tol: float = 1e-8,
342
343
  categorical_as_str: bool = False,
343
344
  ) -> bool:
344
345
  """Check if two DataFrames are equal."""
@@ -350,8 +351,8 @@ def are_frames_equal(
350
351
  check_column_order=check_column_order,
351
352
  check_dtypes=check_dtypes,
352
353
  check_exact=check_exact,
353
- rtol=rtol,
354
- atol=atol,
354
+ rel_tol=rel_tol,
355
+ abs_tol=abs_tol,
355
356
  categorical_as_str=categorical_as_str,
356
357
  )
357
358
  except AssertionError:
@@ -783,15 +784,6 @@ def choice(
783
784
  ##
784
785
 
785
786
 
786
- def collect_series(expr: Expr, /) -> Series:
787
- """Collect a column expression into a Series."""
788
- data = DataFrame().with_columns(expr)
789
- return data[one(data.columns)]
790
-
791
-
792
- ##
793
-
794
-
795
787
  def columns_to_dict(df: DataFrame, key: str, value: str, /) -> dict[Any, Any]:
796
788
  """Map a pair of columns into a dictionary. Must be unique on `key`."""
797
789
  col_key = df[key]
@@ -1044,7 +1036,9 @@ def _dataclass_to_dataframe_cast(series: Series, /) -> Series:
1044
1036
  is_path = series.map_elements(make_isinstance(Path), return_dtype=Boolean).all()
1045
1037
  is_uuid = series.map_elements(make_isinstance(UUID), return_dtype=Boolean).all()
1046
1038
  if is_path or is_uuid:
1047
- with suppress_warnings(category=PolarsInefficientMapWarning):
1039
+ with suppress_warnings(
1040
+ category=cast("type[Warning]", PolarsInefficientMapWarning)
1041
+ ):
1048
1042
  return series.map_elements(str, return_dtype=String)
1049
1043
  if series.map_elements(make_isinstance(whenever.Time), return_dtype=Boolean).all():
1050
1044
  return series.map_elements(lambda x: x.py_time(), return_dtype=pl.Time)
@@ -1219,6 +1213,14 @@ def ensure_expr_or_series_many(
1219
1213
  ##
1220
1214
 
1221
1215
 
1216
+ def expr_to_series(expr: Expr, /) -> Series:
1217
+ """Collect a column expression into a Series."""
1218
+ return one_column(DataFrame().with_columns(expr))
1219
+
1220
+
1221
+ ##
1222
+
1223
+
1222
1224
  @overload
1223
1225
  def finite_ewm_mean(
1224
1226
  column: ExprLike,
@@ -1322,6 +1324,15 @@ class _FiniteEWMWeightsError(Exception):
1322
1324
  ##
1323
1325
 
1324
1326
 
1327
+ def first_true_horizontal(df: DataFrame, /) -> Series:
1328
+ """Get the index of the first true in each row."""
1329
+ expr = when(any_horizontal(pl.all())).then(concat_list(pl.all()).list.arg_max())
1330
+ return one_column(df.select(expr))
1331
+
1332
+
1333
+ ##
1334
+
1335
+
1325
1336
  def get_data_type_or_series_time_zone(
1326
1337
  dtype_or_series: PolarsDataType | Series, /
1327
1338
  ) -> ZoneInfo:
@@ -1393,8 +1404,7 @@ def get_expr_name(obj: Series | DataFrame, expr: IntoExprColumn, /) -> str:
1393
1404
  case Series() as series:
1394
1405
  return get_expr_name(series.to_frame(), expr)
1395
1406
  case DataFrame() as df:
1396
- selected = df.select(expr)
1397
- return one(selected.columns)
1407
+ return one_column(df.select(expr)).name
1398
1408
  case never:
1399
1409
  assert_never(never)
1400
1410
 
@@ -1989,6 +1999,43 @@ def offset_datetime(
1989
1999
  ##
1990
2000
 
1991
2001
 
2002
+ def one_column(df: DataFrame, /) -> Series:
2003
+ """Return the unique column in a DataFrame."""
2004
+ try:
2005
+ return df[one(df.columns)]
2006
+ except OneEmptyError:
2007
+ raise OneColumnEmptyError(df=df) from None
2008
+ except OneNonUniqueError as error:
2009
+ raise OneColumnNonUniqueError(
2010
+ df=df, first=error.first, second=error.second
2011
+ ) from None
2012
+
2013
+
2014
+ @dataclass(kw_only=True, slots=True)
2015
+ class OneColumnError(Exception):
2016
+ df: DataFrame
2017
+
2018
+
2019
+ @dataclass(kw_only=True, slots=True)
2020
+ class OneColumnEmptyError(OneColumnError):
2021
+ @override
2022
+ def __str__(self) -> str:
2023
+ return "DataFrame must not be empty"
2024
+
2025
+
2026
+ @dataclass(kw_only=True, slots=True)
2027
+ class OneColumnNonUniqueError(OneColumnError):
2028
+ first: str
2029
+ second: str
2030
+
2031
+ @override
2032
+ def __str__(self) -> str:
2033
+ return f"DataFrame must contain exactly one column; got {self.first!r}, {self.second!r} and perhaps more"
2034
+
2035
+
2036
+ ##
2037
+
2038
+
1992
2039
  @overload
1993
2040
  def order_of_magnitude(column: ExprLike, /, *, round_: bool = False) -> Expr: ...
1994
2041
  @overload
@@ -2110,13 +2157,10 @@ def reify_exprs(
2110
2157
  .with_columns(*all_exprs)
2111
2158
  .drop("_index")
2112
2159
  )
2113
- match len(df.columns):
2114
- case 0:
2115
- raise ImpossibleCaseError(case=[f"{df.columns=}"]) # pragma: no cover
2116
- case 1:
2117
- return df[one(df.columns)]
2118
- case _:
2119
- return df
2160
+ try:
2161
+ return one_column(df)
2162
+ except OneColumnNonUniqueError:
2163
+ return df
2120
2164
 
2121
2165
 
2122
2166
  @dataclass(kw_only=True, slots=True)
@@ -2519,6 +2563,9 @@ __all__ = [
2519
2563
  "InsertBeforeError",
2520
2564
  "InsertBetweenError",
2521
2565
  "IsNearEventError",
2566
+ "OneColumnEmptyError",
2567
+ "OneColumnError",
2568
+ "OneColumnNonUniqueError",
2522
2569
  "SetFirstRowAsColumnsError",
2523
2570
  "TimePeriodDType",
2524
2571
  "acf",
@@ -2533,7 +2580,6 @@ __all__ = [
2533
2580
  "boolean_value_counts",
2534
2581
  "check_polars_dataframe",
2535
2582
  "choice",
2536
- "collect_series",
2537
2583
  "columns_to_dict",
2538
2584
  "concat_series",
2539
2585
  "convert_time_zone",
@@ -2545,7 +2591,9 @@ __all__ = [
2545
2591
  "ensure_data_type",
2546
2592
  "ensure_expr_or_series",
2547
2593
  "ensure_expr_or_series_many",
2594
+ "expr_to_series",
2548
2595
  "finite_ewm_mean",
2596
+ "first_true_horizontal",
2549
2597
  "get_data_type_or_series_time_zone",
2550
2598
  "get_expr_name",
2551
2599
  "get_frequency_spectrum",
@@ -2565,6 +2613,7 @@ __all__ = [
2565
2613
  "nan_sum_cols",
2566
2614
  "normal",
2567
2615
  "offset_datetime",
2616
+ "one_column",
2568
2617
  "order_of_magnitude",
2569
2618
  "period_range",
2570
2619
  "read_dataframe",
@@ -91,9 +91,7 @@ class PolarsRegressionFixture:
91
91
  def check(self, obj: Series | DataFrame, /, *, suffix: str | None = None) -> None:
92
92
  """Check the Series/DataFrame summary against the baseline."""
93
93
  from polars import DataFrame, Series, col
94
- from polars.exceptions import (
95
- InvalidOperationError, # pyright: ignore[reportAttributeAccessIssue]
96
- )
94
+ from polars.exceptions import InvalidOperationError
97
95
 
98
96
  data: StrMapping = {
99
97
  "describe": obj.describe(percentiles=[i / 10 for i in range(1, 10)]).rows(