dycw-utilities 0.159.7__tar.gz → 0.160.0__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.7 → dycw_utilities-0.160.0}/PKG-INFO +1 -1
  2. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/pyproject.toml +2 -2
  3. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_polars.py +56 -25
  4. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/polars.py +37 -32
  6. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/.gitignore +0 -0
  7. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/LICENSE +0 -0
  8. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/README.md +0 -0
  9. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/__init__.py +0 -0
  10. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/conftest.py +0 -0
  11. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/__init__.py +0 -0
  12. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_missing/__init__.py +0 -0
  13. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_missing/module.py +0 -0
  14. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_with/__init__.py +0 -0
  15. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_with/outer_1.py +0 -0
  16. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_with/outer_2.py +0 -0
  17. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  18. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  19. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  20. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  21. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_without/__init__.py +0 -0
  22. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_without/module_1.py +0 -0
  23. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/package_without/module_2.py +0 -0
  24. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/standalone.py +0 -0
  25. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/modules/with_imports.py +0 -0
  26. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  27. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  28. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  29. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  30. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  31. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  32. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  33. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  34. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_altair.py +0 -0
  35. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_asyncio.py +0 -0
  36. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_atomicwrites.py +0 -0
  37. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_atools.py +0 -0
  38. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_cachetools.py +0 -0
  39. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_click.py +0 -0
  40. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_concurrent.py +0 -0
  41. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_contextlib.py +0 -0
  42. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_contextvars.py +0 -0
  43. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_cryptography.py +0 -0
  44. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_cvxpy.py +0 -0
  45. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_dataclasses.py +0 -0
  46. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_enum.py +0 -0
  47. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_errors.py +0 -0
  48. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_eventkit.py +0 -0
  49. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_fastapi.py +0 -0
  50. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_fpdf2.py +0 -0
  51. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_functions.py +0 -0
  52. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_functools.py +0 -0
  53. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_getpass.py +0 -0
  54. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_gzip.py +0 -0
  55. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_hashlib.py +0 -0
  56. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_http.py +0 -0
  57. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_hypothesis.py +0 -0
  58. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_importlib.py +0 -0
  59. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_inflect.py +0 -0
  60. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_ipython.py +0 -0
  61. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_iterables.py +0 -0
  62. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_json.py +0 -0
  63. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_jupyter.py +0 -0
  64. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_libcst.py +0 -0
  65. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_lightweight_charts.py +0 -0
  66. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_logging.py +0 -0
  67. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_math.py +0 -0
  68. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_memory_profiler.py +0 -0
  69. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_modules.py +0 -0
  70. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_more_itertools.py +0 -0
  71. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_numpy.py +0 -0
  72. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_objects/__init__.py +0 -0
  73. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_objects/objects.py +0 -0
  74. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_operator.py +0 -0
  75. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_optuna.py +0 -0
  76. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_orjson.py +0 -0
  77. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_os.py +0 -0
  78. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_parse.py +0 -0
  79. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pathlib.py +0 -0
  80. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pickle.py +0 -0
  81. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_platform.py +0 -0
  82. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_polars_ols.py +0 -0
  83. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_postgres.py +0 -0
  84. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pottery.py +0 -0
  85. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pqdm.py +0 -0
  86. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_psutil.py +0 -0
  87. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pyinstrument.py +0 -0
  88. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pytest.py +0 -0
  89. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pytest_randomly.py +0 -0
  90. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_pytest_regressions.py +0 -0
  91. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_random.py +0 -0
  92. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_re.py +0 -0
  93. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_redis.py +0 -0
  94. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_reprlib.py +0 -0
  95. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_scipy.py +0 -0
  96. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_sentinel.py +0 -0
  97. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_shelve.py +0 -0
  98. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_slack_sdk.py +0 -0
  99. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_socket.py +0 -0
  100. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_sqlalchemy.py +0 -0
  101. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  102. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_statsmodels.py +0 -0
  103. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_string.py +0 -0
  104. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_tempfile.py +0 -0
  105. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_text.py +0 -0
  106. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_threading.py +0 -0
  107. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_timer.py +0 -0
  108. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_traceback.py +0 -0
  109. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_typed_settings.py +0 -0
  110. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_types.py +0 -0
  111. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_typing.py +0 -0
  112. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  113. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  114. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  115. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_tzdata.py +0 -0
  116. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_tzlocal.py +0 -0
  117. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_uuid.py +0 -0
  118. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_version.py +0 -0
  119. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_warnings.py +0 -0
  120. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_whenever.py +0 -0
  121. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_zipfile.py +0 -0
  122. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/tests/test_zoneinfo.py +0 -0
  123. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/altair.py +0 -0
  124. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/asyncio.py +0 -0
  125. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/atomicwrites.py +0 -0
  126. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/atools.py +0 -0
  127. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/cachetools.py +0 -0
  128. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/click.py +0 -0
  129. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/concurrent.py +0 -0
  130. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/contextlib.py +0 -0
  131. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/contextvars.py +0 -0
  132. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/cryptography.py +0 -0
  133. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/cvxpy.py +0 -0
  134. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/dataclasses.py +0 -0
  135. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/enum.py +0 -0
  136. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/errors.py +0 -0
  137. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/eventkit.py +0 -0
  138. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/fastapi.py +0 -0
  139. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/fpdf2.py +0 -0
  140. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/functions.py +0 -0
  141. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/functools.py +0 -0
  142. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/getpass.py +0 -0
  143. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/gzip.py +0 -0
  144. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/hashlib.py +0 -0
  145. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/http.py +0 -0
  146. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/hypothesis.py +0 -0
  147. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/importlib.py +0 -0
  148. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/inflect.py +0 -0
  149. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/ipython.py +0 -0
  150. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/iterables.py +0 -0
  151. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/json.py +0 -0
  152. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/jupyter.py +0 -0
  153. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/libcst.py +0 -0
  154. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/lightweight_charts.py +0 -0
  155. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/logging.py +0 -0
  156. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/math.py +0 -0
  157. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/memory_profiler.py +0 -0
  158. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/modules.py +0 -0
  159. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/more_itertools.py +0 -0
  160. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/numpy.py +0 -0
  161. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/operator.py +0 -0
  162. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/optuna.py +0 -0
  163. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/orjson.py +0 -0
  164. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/os.py +0 -0
  165. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/parse.py +0 -0
  166. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pathlib.py +0 -0
  167. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pickle.py +0 -0
  168. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/platform.py +0 -0
  169. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/polars_ols.py +0 -0
  170. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/postgres.py +0 -0
  171. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pottery.py +0 -0
  172. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pqdm.py +0 -0
  173. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/psutil.py +0 -0
  174. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/py.typed +0 -0
  175. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pyinstrument.py +0 -0
  176. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pytest.py +0 -0
  177. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pytest_plugins/__init__.py +0 -0
  178. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  179. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  180. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/pytest_regressions.py +0 -0
  181. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/random.py +0 -0
  182. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/re.py +0 -0
  183. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/redis.py +0 -0
  184. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/reprlib.py +0 -0
  185. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/scipy.py +0 -0
  186. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/sentinel.py +0 -0
  187. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/shelve.py +0 -0
  188. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/slack_sdk.py +0 -0
  189. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/socket.py +0 -0
  190. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/sqlalchemy.py +0 -0
  191. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/sqlalchemy_polars.py +0 -0
  192. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/statsmodels.py +0 -0
  193. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/string.py +0 -0
  194. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/tempfile.py +0 -0
  195. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/text.py +0 -0
  196. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/threading.py +0 -0
  197. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/timer.py +0 -0
  198. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/traceback.py +0 -0
  199. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/typed_settings.py +0 -0
  200. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/types.py +0 -0
  201. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/typing.py +0 -0
  202. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/tzdata.py +0 -0
  203. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/tzlocal.py +0 -0
  204. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/uuid.py +0 -0
  205. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/version.py +0 -0
  206. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/warnings.py +0 -0
  207. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/whenever.py +0 -0
  208. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/src/utilities/zipfile.py +0 -0
  209. {dycw_utilities-0.159.7 → dycw_utilities-0.160.0}/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.7
3
+ Version: 0.160.0
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -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.7"
230
+ version = "0.160.0"
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.7"
262
+ current_version = "0.160.0"
263
263
 
264
264
  [[tool.bumpversion.files]]
265
265
  filename = "src/utilities/__init__.py"
@@ -98,6 +98,7 @@ from utilities.polars import (
98
98
  OneColumnEmptyError,
99
99
  OneColumnNonUniqueError,
100
100
  RoundToFloatError,
101
+ SelectExactError,
101
102
  SetFirstRowAsColumnsError,
102
103
  TimePeriodDType,
103
104
  _check_polars_dataframe_predicates,
@@ -179,7 +180,7 @@ from utilities.polars import (
179
180
  join_into_periods,
180
181
  map_over_columns,
181
182
  nan_sum_agg,
182
- nan_sum_cols,
183
+ nan_sum_horizonal,
183
184
  normal,
184
185
  number_of_decimals,
185
186
  offset_datetime,
@@ -191,6 +192,7 @@ from utilities.polars import (
191
192
  reify_exprs,
192
193
  replace_time_zone,
193
194
  round_to_float,
195
+ select_exact,
194
196
  serialize_dataframe,
195
197
  serialize_series,
196
198
  set_first_row_as_columns,
@@ -1561,16 +1563,16 @@ class TestFiniteEWMWeights:
1561
1563
 
1562
1564
  class TestFirstTrueHorizontal:
1563
1565
  @mark.parametrize(
1564
- ("values", "expected"),
1566
+ ("x", "y", "z", "expected"),
1565
1567
  [
1566
- param([True, True, True], 0),
1567
- param([False, True, True], 1),
1568
- param([False, False, True], 2),
1569
- param([False, False, False], None),
1568
+ param(True, True, True, 0),
1569
+ param(False, True, True, 1),
1570
+ param(False, False, True, 2),
1571
+ param(False, False, False, None),
1570
1572
  ],
1571
1573
  )
1572
- def test_main(self, *, values: list[bool], expected: int | None) -> None:
1573
- series = [Series(values=[v], dtype=Boolean) for v in values]
1574
+ def test_main(self, *, x: bool, y: bool, z: bool, expected: int | None) -> None:
1575
+ series = [Series(values=[i], dtype=Boolean) for i in [x, y, z]]
1574
1576
  result = first_true_horizontal(*series)
1575
1577
  assert result.item() == expected
1576
1578
 
@@ -2186,26 +2188,22 @@ class TestNanSumAgg:
2186
2188
  assert result["value"].item() == expected
2187
2189
 
2188
2190
 
2189
- class TestNanSumCols:
2190
- @given(
2191
- case=sampled_from([(None, None, None), (None, 0, 0), (0, None, 0), (1, 2, 3)]),
2192
- x_kind=sampled_from(["str", "column"]),
2193
- y_kind=sampled_from(["str", "column"]),
2191
+ class TestNanSumHorizontal:
2192
+ @mark.parametrize(
2193
+ ("x", "y", "z", "expected"),
2194
+ [
2195
+ param(1, 2, 3, 6),
2196
+ param(None, 2, 3, 5),
2197
+ param(None, None, 3, 3),
2198
+ param(None, None, None, None),
2199
+ ],
2194
2200
  )
2195
2201
  def test_main(
2196
- self,
2197
- *,
2198
- case: tuple[int | None, int | None, int | None],
2199
- x_kind: Literal["str", "column"],
2200
- y_kind: Literal["str", "column"],
2202
+ self, *, x: int | None, y: int | None, z: int | None, expected: int | None
2201
2203
  ) -> None:
2202
- x, y, expected = case
2203
- x_use = "x" if x_kind == "str" else col("x")
2204
- y_use = "y" if y_kind == "str" else col("y")
2205
- df = DataFrame(
2206
- data=[(x, y)], schema={"x": Int64, "y": Int64}, orient="row"
2207
- ).with_columns(z=nan_sum_cols(x_use, y_use))
2208
- assert df["z"].item() == expected
2204
+ series = [Series(values=[i], dtype=Int64) for i in [x, y, z]]
2205
+ result = nan_sum_horizonal(*series)
2206
+ assert result.item() == expected
2209
2207
 
2210
2208
 
2211
2209
  class TestNormal:
@@ -2467,6 +2465,39 @@ class TestRoundToFloat:
2467
2465
  _ = round_to_float(cast("Any", x), cast("Any", y))
2468
2466
 
2469
2467
 
2468
+ class TestSelectExact:
2469
+ df: ClassVar[DataFrame] = DataFrame(
2470
+ data=[(True, False), (False, None), (None, True)],
2471
+ schema={"x": Boolean, "y": Boolean},
2472
+ orient="row",
2473
+ )
2474
+
2475
+ def test_adding_and_reordering(self) -> None:
2476
+ df = select_exact(self.df, "y", ~col.x.alias("z"), "x")
2477
+ expected = DataFrame(
2478
+ data=[(False, False, True), (None, True, False), (True, None, None)],
2479
+ schema={"y": Boolean, "z": Boolean, "x": Boolean},
2480
+ orient="row",
2481
+ )
2482
+ assert_frame_equal(df, expected)
2483
+
2484
+ def test_adding_and_dropping(self) -> None:
2485
+ df = select_exact(self.df, "y", ~col.x.alias("z"), drop="x")
2486
+ expected = DataFrame(
2487
+ data=[(False, False), (None, True), (True, None)],
2488
+ schema={"y": Boolean, "z": Boolean},
2489
+ orient="row",
2490
+ )
2491
+ assert_frame_equal(df, expected)
2492
+
2493
+ def test_error(self) -> None:
2494
+ with raises(
2495
+ SelectExactError,
2496
+ match=r"All columns must be selected; got \['y'\] remaining",
2497
+ ):
2498
+ _ = select_exact(self.df, ~col.x.alias("z"), "x")
2499
+
2500
+
2470
2501
  class TestSerializeAndDeserializeDataFrame:
2471
2502
  cases: ClassVar[list[tuple[PolarsDataType, SearchStrategy[Any]]]] = [
2472
2503
  (Boolean, booleans()),
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.159.7"
3
+ __version__ = "0.160.0"
@@ -1325,18 +1325,6 @@ class _FiniteEWMWeightsError(Exception):
1325
1325
  ##
1326
1326
 
1327
1327
 
1328
- @overload
1329
- def first_true_horizontal(column: Series, /) -> Series: ...
1330
- @overload
1331
- def first_true_horizontal(column1: Series, column2: Series, /) -> Series: ...
1332
- @overload
1333
- def first_true_horizontal(
1334
- column1: Series, column2: Series, column3: Series, /
1335
- ) -> Series: ...
1336
- @overload
1337
- def first_true_horizontal(
1338
- column1: Series, column2: Series, column3: Series, column4: Series, /
1339
- ) -> Series: ...
1340
1328
  @overload
1341
1329
  def first_true_horizontal(*columns: Series) -> Series: ...
1342
1330
  @overload
@@ -1931,27 +1919,17 @@ def nan_sum_agg(column: str | Expr, /, *, dtype: PolarsDataType | None = None) -
1931
1919
  ##
1932
1920
 
1933
1921
 
1934
- def nan_sum_cols(
1935
- column: str | Expr, *columns: str | Expr, dtype: PolarsDataType | None = None
1936
- ) -> Expr:
1922
+ @overload
1923
+ def nan_sum_horizonal(*columns: Series) -> Series: ...
1924
+ @overload
1925
+ def nan_sum_horizonal(*columns: IntoExprColumn) -> ExprOrSeries: ...
1926
+ def nan_sum_horizonal(*columns: IntoExprColumn) -> ExprOrSeries:
1937
1927
  """Nan sum across columns."""
1938
- all_columns = chain([column], columns)
1939
- all_exprs = (
1940
- col(column) if isinstance(column, str) else column for column in all_columns
1928
+ columns2 = ensure_expr_or_series_many(*columns)
1929
+ expr = when(any_horizontal(*(c.is_not_null() for c in columns2))).then(
1930
+ sum_horizontal(*columns2)
1941
1931
  )
1942
-
1943
- def func(x: Expr, y: Expr, /) -> Expr:
1944
- return (
1945
- when(x.is_not_null() & y.is_not_null())
1946
- .then(x + y)
1947
- .when(x.is_not_null() & y.is_null())
1948
- .then(x)
1949
- .when(x.is_null() & y.is_not_null())
1950
- .then(y)
1951
- .otherwise(lit(None, dtype=dtype))
1952
- )
1953
-
1954
- return reduce(func, all_exprs)
1932
+ return try_reify_expr(expr, *columns2)
1955
1933
 
1956
1934
 
1957
1935
  ##
@@ -2446,6 +2424,31 @@ class RoundToFloatError(Exception):
2446
2424
  ##
2447
2425
 
2448
2426
 
2427
+ def select_exact(
2428
+ df: DataFrame, /, *columns: IntoExprColumn, drop: MaybeIterable[str] | None = None
2429
+ ) -> DataFrame:
2430
+ """Select an exact set of columns from a DataFrame."""
2431
+ names = [get_expr_name(df, c) for c in columns]
2432
+ drop = set() if drop is None else set(always_iterable(drop))
2433
+ union = set(names) | drop
2434
+ extra = [c for c in df.columns if c not in union]
2435
+ if len(extra) >= 1:
2436
+ raise SelectExactError(columns=extra)
2437
+ return df.select(*columns)
2438
+
2439
+
2440
+ @dataclass(kw_only=True, slots=True)
2441
+ class SelectExactError(Exception):
2442
+ columns: list[str]
2443
+
2444
+ @override
2445
+ def __str__(self) -> str:
2446
+ return f"All columns must be selected; got {get_repr(self.columns)} remaining"
2447
+
2448
+
2449
+ ##
2450
+
2451
+
2449
2452
  def set_first_row_as_columns(df: DataFrame, /) -> DataFrame:
2450
2453
  """Set the first row of a DataFrame as its columns."""
2451
2454
  try:
@@ -2654,6 +2657,7 @@ __all__ = [
2654
2657
  "OneColumnError",
2655
2658
  "OneColumnNonUniqueError",
2656
2659
  "RoundToFloatError",
2660
+ "SelectExactError",
2657
2661
  "SetFirstRowAsColumnsError",
2658
2662
  "TimePeriodDType",
2659
2663
  "acf",
@@ -2698,7 +2702,7 @@ __all__ = [
2698
2702
  "join_into_periods",
2699
2703
  "map_over_columns",
2700
2704
  "nan_sum_agg",
2701
- "nan_sum_cols",
2705
+ "nan_sum_horizonal",
2702
2706
  "normal",
2703
2707
  "number_of_decimals",
2704
2708
  "offset_datetime",
@@ -2709,6 +2713,7 @@ __all__ = [
2709
2713
  "read_series",
2710
2714
  "replace_time_zone",
2711
2715
  "round_to_float",
2716
+ "select_exact",
2712
2717
  "serialize_dataframe",
2713
2718
  "set_first_row_as_columns",
2714
2719
  "struct_dtype",