dycw-utilities 0.151.11__tar.gz → 0.152.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 (216) hide show
  1. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/PKG-INFO +2 -2
  2. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/pyproject.toml +5 -8
  3. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_iterables.py +0 -22
  4. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_polars.py +35 -0
  5. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_postgres.py +2 -4
  6. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/__init__.py +1 -1
  7. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/iterables.py +1 -12
  8. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/polars.py +34 -1
  9. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/redis.py +2 -2
  10. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/types.py +6 -22
  11. dycw_utilities-0.151.11/src/tests/test_dnspython.py +0 -14
  12. dycw_utilities-0.151.11/src/utilities/dnspython.py +0 -17
  13. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/.gitignore +0 -0
  14. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/LICENSE +0 -0
  15. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/README.md +0 -0
  16. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/__init__.py +0 -0
  17. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/conftest.py +0 -0
  18. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/__init__.py +0 -0
  19. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_missing/__init__.py +0 -0
  20. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_missing/module.py +0 -0
  21. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_with/__init__.py +0 -0
  22. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_with/outer_1.py +0 -0
  23. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_with/outer_2.py +0 -0
  24. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  25. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  26. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  27. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  28. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_without/__init__.py +0 -0
  29. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_without/module_1.py +0 -0
  30. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/package_without/module_2.py +0 -0
  31. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/standalone.py +0 -0
  32. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/modules/with_imports.py +0 -0
  33. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  34. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  35. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  36. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  37. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  38. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  39. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  40. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  41. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_altair.py +0 -0
  42. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_asyncio.py +0 -0
  43. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_atomicwrites.py +0 -0
  44. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_atools.py +0 -0
  45. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_cachetools.py +0 -0
  46. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_click.py +0 -0
  47. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_concurrent.py +0 -0
  48. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_contextlib.py +0 -0
  49. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_contextvars.py +0 -0
  50. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_cryptography.py +0 -0
  51. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_cvxpy.py +0 -0
  52. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_dataclasses.py +0 -0
  53. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_enum.py +0 -0
  54. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_errors.py +0 -0
  55. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_eventkit.py +0 -0
  56. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_fastapi.py +0 -0
  57. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_fpdf2.py +0 -0
  58. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_functions.py +0 -0
  59. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_functools.py +0 -0
  60. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_getpass.py +0 -0
  61. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_gzip.py +0 -0
  62. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_hashlib.py +0 -0
  63. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_http.py +0 -0
  64. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_hypothesis.py +0 -0
  65. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_importlib.py +0 -0
  66. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_inflect.py +0 -0
  67. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_ipython.py +0 -0
  68. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_json.py +0 -0
  69. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_jupyter.py +0 -0
  70. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_libcst.py +0 -0
  71. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_lightweight_charts.py +0 -0
  72. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_logging.py +0 -0
  73. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_math.py +0 -0
  74. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_memory_profiler.py +0 -0
  75. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_modules.py +0 -0
  76. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_more_itertools.py +0 -0
  77. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_numpy.py +0 -0
  78. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_objects/__init__.py +0 -0
  79. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_objects/objects.py +0 -0
  80. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_operator.py +0 -0
  81. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_optuna.py +0 -0
  82. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_orjson.py +0 -0
  83. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_os.py +0 -0
  84. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_parse.py +0 -0
  85. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pathlib.py +0 -0
  86. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_period.py +0 -0
  87. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_polars_ols.py +0 -0
  90. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pottery.py +0 -0
  91. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pqdm.py +0 -0
  92. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_psutil.py +0 -0
  93. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pyinstrument.py +0 -0
  94. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pytest.py +0 -0
  95. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pytest_randomly.py +0 -0
  96. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_pytest_regressions.py +0 -0
  97. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_scipy.py +0 -0
  102. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_sentinel.py +0 -0
  103. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_shelve.py +0 -0
  104. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_slack_sdk.py +0 -0
  105. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_socket.py +0 -0
  106. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_sqlalchemy.py +0 -0
  107. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_sqlalchemy_polars.py +0 -0
  108. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_statsmodels.py +0 -0
  109. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_string.py +0 -0
  110. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_tempfile.py +0 -0
  111. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_text.py +0 -0
  112. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_threading.py +0 -0
  113. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_timer.py +0 -0
  114. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_traceback.py +0 -0
  115. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_typed_settings.py +0 -0
  116. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_types.py +0 -0
  117. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_typing.py +0 -0
  118. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_typing_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_typing_funcs/no_future.py +0 -0
  120. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_typing_funcs/with_future.py +0 -0
  121. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_tzdata.py +0 -0
  122. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_tzlocal.py +0 -0
  123. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_uuid.py +0 -0
  124. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_version.py +0 -0
  125. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_warnings.py +0 -0
  126. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_whenever.py +0 -0
  127. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_yield_access/__init__.py +0 -0
  128. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_yield_access/script.py +0 -0
  129. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_yield_access/script.sh +0 -0
  130. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_zipfile.py +0 -0
  131. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/tests/test_zoneinfo.py +0 -0
  132. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/altair.py +0 -0
  133. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/asyncio.py +0 -0
  134. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/atomicwrites.py +0 -0
  135. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/atools.py +0 -0
  136. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/cachetools.py +0 -0
  137. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/click.py +0 -0
  138. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/concurrent.py +0 -0
  139. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/contextlib.py +0 -0
  140. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/contextvars.py +0 -0
  141. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/cryptography.py +0 -0
  142. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/cvxpy.py +0 -0
  143. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/dataclasses.py +0 -0
  144. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/enum.py +0 -0
  145. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/errors.py +0 -0
  146. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/eventkit.py +0 -0
  147. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/fastapi.py +0 -0
  148. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/fpdf2.py +0 -0
  149. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/functions.py +0 -0
  150. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/functools.py +0 -0
  151. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/getpass.py +0 -0
  152. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/gzip.py +0 -0
  153. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/hashlib.py +0 -0
  154. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/http.py +0 -0
  155. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/hypothesis.py +0 -0
  156. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/importlib.py +0 -0
  157. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/inflect.py +0 -0
  158. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/ipython.py +0 -0
  159. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/json.py +0 -0
  160. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/jupyter.py +0 -0
  161. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/libcst.py +0 -0
  162. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/lightweight_charts.py +0 -0
  163. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/logging.py +0 -0
  164. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/math.py +0 -0
  165. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/memory_profiler.py +0 -0
  166. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/modules.py +0 -0
  167. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/more_itertools.py +0 -0
  168. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/numpy.py +0 -0
  169. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/operator.py +0 -0
  170. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/optuna.py +0 -0
  171. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/orjson.py +0 -0
  172. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/os.py +0 -0
  173. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/parse.py +0 -0
  174. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pathlib.py +0 -0
  175. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/period.py +0 -0
  176. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pickle.py +0 -0
  177. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/platform.py +0 -0
  178. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/polars_ols.py +0 -0
  179. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/postgres.py +0 -0
  180. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pottery.py +0 -0
  181. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pqdm.py +0 -0
  182. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/psutil.py +0 -0
  183. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/py.typed +0 -0
  184. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pyinstrument.py +0 -0
  185. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pytest.py +0 -0
  186. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pytest_plugins/__init__.py +0 -0
  187. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  188. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  189. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/pytest_regressions.py +0 -0
  190. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/random.py +0 -0
  191. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/re.py +0 -0
  192. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/reprlib.py +0 -0
  193. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/scipy.py +0 -0
  194. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/sentinel.py +0 -0
  195. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/shelve.py +0 -0
  196. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/slack_sdk.py +0 -0
  197. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/socket.py +0 -0
  198. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/sqlalchemy.py +0 -0
  199. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/sqlalchemy_polars.py +0 -0
  200. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/statsmodels.py +0 -0
  201. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/string.py +0 -0
  202. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/tempfile.py +0 -0
  203. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/text.py +0 -0
  204. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/threading.py +0 -0
  205. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/timer.py +0 -0
  206. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/traceback.py +0 -0
  207. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/typed_settings.py +0 -0
  208. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/typing.py +0 -0
  209. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/tzdata.py +0 -0
  210. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/tzlocal.py +0 -0
  211. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/uuid.py +0 -0
  212. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/version.py +0 -0
  213. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/warnings.py +0 -0
  214. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/whenever.py +0 -0
  215. {dycw_utilities-0.151.11 → dycw_utilities-0.152.0}/src/utilities/zipfile.py +0 -0
  216. {dycw_utilities-0.151.11 → dycw_utilities-0.152.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.151.11
3
+ Version: 0.152.0
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.137,>=6.136.1; extra == 'test'
15
+ Requires-Dist: hypothesis<6.137,>=6.136.6; extra == 'test'
16
16
  Requires-Dist: pudb<2025.2,>=2025.1; extra == 'test'
17
17
  Requires-Dist: pytest-asyncio<1.2,>=1.1.0; extra == 'test'
18
18
  Requires-Dist: pytest-cov<6.3,>=6.2.1; extra == 'test'
@@ -49,9 +49,6 @@ dev = [
49
49
  "pytest-cov >=6.2.1, <6.3",
50
50
  "pytest-timeout >=2.4.0, <2.5",
51
51
  ]
52
- dnspython = [
53
- "dnspython >=2.7.0, <2.8",
54
- ]
55
52
  eventkit = [
56
53
  "eventkit >=1.0.3, <1.1",
57
54
  ]
@@ -72,7 +69,7 @@ http-test = [
72
69
  "orjson",
73
70
  ]
74
71
  hypothesis = [
75
- "hypothesis >=6.136.1, <6.137",
72
+ "hypothesis >=6.136.6, <6.137",
76
73
  ]
77
74
  hypothesis-test = [
78
75
  "libcst",
@@ -214,7 +211,7 @@ statsmodels = [
214
211
  "statsmodels >=0.14.4, <0.15",
215
212
  ]
216
213
  typed-settings = [
217
- "typed-settings >=24.6.0, <24.7",
214
+ "typed-settings >=25.0.0, <25.1",
218
215
  ]
219
216
  tzdata = [
220
217
  "tzdata >=2025.2, <2025.3",
@@ -232,7 +229,7 @@ dependencies = [
232
229
  name = "dycw-utilities"
233
230
  readme = "README.md"
234
231
  requires-python = ">= 3.12"
235
- version = "0.151.11"
232
+ version = "0.152.0"
236
233
 
237
234
  [project.entry-points.pytest11]
238
235
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -244,7 +241,7 @@ logging = [
244
241
  ]
245
242
  test = [
246
243
  "dycw-pytest-only >=2.1.1, <2.2",
247
- "hypothesis >=6.136.1, <6.137",
244
+ "hypothesis >=6.136.6, <6.137",
248
245
  "pudb >=2025.1, <2025.2",
249
246
  "pytest >=8.4.1, <8.5",
250
247
  "pytest-asyncio >=1.1.0, <1.2",
@@ -265,7 +262,7 @@ test = [
265
262
  # bump-my-version
266
263
  [tool.bumpversion]
267
264
  allow_dirty = true
268
- current_version = "0.151.11"
265
+ current_version = "0.152.0"
269
266
 
270
267
  [[tool.bumpversion.files]]
271
268
  filename = "src/utilities/__init__.py"
@@ -68,7 +68,6 @@ from utilities.iterables import (
68
68
  _RangePartitionsTotalError,
69
69
  _sort_iterable_cmp_floats,
70
70
  always_iterable,
71
- always_iterable_hashable,
72
71
  apply_bijection,
73
72
  apply_to_tuple,
74
73
  apply_to_varargs,
@@ -166,27 +165,6 @@ class TestAlwaysIterable:
166
165
  assert list(always_iterable(yield_ints())) == [0, 1]
167
166
 
168
167
 
169
- class TestAlwaysIterableHashable:
170
- def test_none(self) -> None:
171
- assert always_iterable_hashable(None) is None
172
-
173
- @given(x=integers())
174
- def test_integer(self, *, x: int) -> None:
175
- assert always_iterable_hashable(x) == (x,)
176
-
177
- @given(x=text())
178
- def test_string(self, *, x: str) -> None:
179
- assert always_iterable_hashable(x) == (x,)
180
-
181
- @given(x=lists(integers()))
182
- def test_list_of_integers(self, *, x: list[int]) -> None:
183
- assert always_iterable_hashable(x) == tuple(x)
184
-
185
- @given(x=lists(text()))
186
- def test_list_of_strings(self, *, x: list[str]) -> None:
187
- assert always_iterable_hashable(x) == tuple(x)
188
-
189
-
190
168
  class TestApplyBijection:
191
169
  @given(text=text_ascii())
192
170
  def test_main(self, *, text: str) -> None:
@@ -147,6 +147,7 @@ from utilities.polars import (
147
147
  cross_rolling_quantile,
148
148
  dataclass_to_dataframe,
149
149
  dataclass_to_schema,
150
+ decreasing_horizontal,
150
151
  deserialize_dataframe,
151
152
  deserialize_series,
152
153
  drop_null_struct_series,
@@ -159,6 +160,7 @@ from utilities.polars import (
159
160
  get_expr_name,
160
161
  get_frequency_spectrum,
161
162
  get_series_number_of_decimals,
163
+ increasing_horizontal,
162
164
  insert_after,
163
165
  insert_before,
164
166
  insert_between,
@@ -1594,6 +1596,39 @@ class TestGetSeriesNumberOfDecimals:
1594
1596
  _ = get_series_number_of_decimals(Series(dtype=Float64))
1595
1597
 
1596
1598
 
1599
+ class TestIncreasingAndDecreasingHorizontal:
1600
+ def test_main(self) -> None:
1601
+ df = DataFrame(
1602
+ data=[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)],
1603
+ schema={"x": Int64, "y": Int64, "z": Int64},
1604
+ orient="row",
1605
+ ).with_columns(
1606
+ increasing_horizontal("x", "y", "z").alias("inc"),
1607
+ decreasing_horizontal("x", "y", "z").alias("dec"),
1608
+ )
1609
+ inc = Series(
1610
+ name="inc", values=[True, False, False, False, False, False], dtype=Boolean
1611
+ )
1612
+ assert_series_equal(df["inc"], inc)
1613
+ dec = Series(
1614
+ name="dec", values=[False, False, False, False, False, True], dtype=Boolean
1615
+ )
1616
+ assert_series_equal(df["dec"], dec)
1617
+
1618
+ def test_empty(self) -> None:
1619
+ df = (
1620
+ Series(name="x", values=[1, 2, 3], dtype=Int64)
1621
+ .to_frame()
1622
+ .with_columns(
1623
+ increasing_horizontal().alias("inc"),
1624
+ decreasing_horizontal().alias("dec"),
1625
+ )
1626
+ )
1627
+ expected = Series(values=[True, True, True], dtype=Boolean)
1628
+ assert_series_equal(df["inc"], expected, check_names=False)
1629
+ assert_series_equal(df["dec"], expected, check_names=False)
1630
+
1631
+
1597
1632
  class TestInsertBeforeOrAfter:
1598
1633
  df: ClassVar[DataFrame] = DataFrame(schema={"a": Int64, "b": Int64, "c": Int64})
1599
1634
 
@@ -23,8 +23,6 @@ from utilities.typing import get_literal_elements
23
23
  if TYPE_CHECKING:
24
24
  from pathlib import Path
25
25
 
26
- from utilities.types import MaybeListStr
27
-
28
26
 
29
27
  @composite
30
28
  def tables(draw: DrawFn, /) -> list[Table | str]:
@@ -68,8 +66,8 @@ class TestPGDump:
68
66
  format_: _PGDumpFormat,
69
67
  jobs: int | None,
70
68
  create: bool,
71
- extension: MaybeListStr | None,
72
- extension_exc: MaybeListStr | None,
69
+ extension: list[str] | None,
70
+ extension_exc: list[str] | None,
73
71
  schema: list[str] | None,
74
72
  schema_exc: list[str] | None,
75
73
  table: list[Table | str] | None,
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.151.11"
3
+ __version__ = "0.152.0"
@@ -46,7 +46,7 @@ from utilities.types import SupportsAdd, SupportsLT
46
46
  if TYPE_CHECKING:
47
47
  from types import NoneType
48
48
 
49
- from utilities.types import MaybeIterable, MaybeIterableHashable, Sign, StrMapping
49
+ from utilities.types import MaybeIterable, Sign, StrMapping
50
50
 
51
51
 
52
52
  ##
@@ -66,16 +66,6 @@ def always_iterable[T](obj: MaybeIterable[T], /) -> Iterable[T]:
66
66
  ##
67
67
 
68
68
 
69
- def always_iterable_hashable[T](
70
- obj: MaybeIterable[T] | None, /
71
- ) -> MaybeIterableHashable[T] | None:
72
- """Ensure an object is always hashable."""
73
- return None if obj is None else tuple(always_iterable(obj))
74
-
75
-
76
- ##
77
-
78
-
79
69
  def apply_bijection[T, U](
80
70
  func: Callable[[T], U], iterable: Iterable[T], /
81
71
  ) -> Mapping[T, U]:
@@ -1489,7 +1479,6 @@ __all__ = [
1489
1479
  "ResolveIncludeAndExcludeError",
1490
1480
  "SortIterableError",
1491
1481
  "always_iterable",
1492
- "always_iterable_hashable",
1493
1482
  "apply_bijection",
1494
1483
  "apply_to_tuple",
1495
1484
  "apply_to_varargs",
@@ -7,7 +7,7 @@ from collections.abc import Set as AbstractSet
7
7
  from contextlib import suppress
8
8
  from dataclasses import asdict, dataclass
9
9
  from functools import partial, reduce
10
- from itertools import chain, product
10
+ from itertools import chain, pairwise, product
11
11
  from math import ceil, log
12
12
  from pathlib import Path
13
13
  from typing import TYPE_CHECKING, Any, Literal, assert_never, cast, overload, override
@@ -1471,6 +1471,37 @@ class _GetSeriesNumberOfDecimalsAllNullError(GetSeriesNumberOfDecimalsError):
1471
1471
  ##
1472
1472
 
1473
1473
 
1474
+ @overload
1475
+ def increasing_horizontal(*columns: ExprLike) -> Expr: ...
1476
+ @overload
1477
+ def increasing_horizontal(*columns: Series) -> Series: ...
1478
+ @overload
1479
+ def increasing_horizontal(*columns: IntoExprColumn) -> Expr | Series: ...
1480
+ def increasing_horizontal(*columns: IntoExprColumn) -> Expr | Series:
1481
+ """Check if a set of columns are increasing."""
1482
+ columns2 = ensure_expr_or_series_many(*columns)
1483
+ if len(columns2) == 0:
1484
+ return lit(value=True, dtype=Boolean)
1485
+ return all_horizontal(prev < curr for prev, curr in pairwise(columns2))
1486
+
1487
+
1488
+ @overload
1489
+ def decreasing_horizontal(*columns: ExprLike) -> Expr: ...
1490
+ @overload
1491
+ def decreasing_horizontal(*columns: Series) -> Series: ...
1492
+ @overload
1493
+ def decreasing_horizontal(*columns: IntoExprColumn) -> Expr | Series: ...
1494
+ def decreasing_horizontal(*columns: IntoExprColumn) -> Expr | Series:
1495
+ """Check if a set of columns are decreasing."""
1496
+ columns2 = ensure_expr_or_series_many(*columns)
1497
+ if len(columns2) == 0:
1498
+ return lit(value=True, dtype=Boolean)
1499
+ return all_horizontal(prev > curr for prev, curr in pairwise(columns2))
1500
+
1501
+
1502
+ ##
1503
+
1504
+
1474
1505
  def insert_after(df: DataFrame, column: str, value: IntoExprColumn, /) -> DataFrame:
1475
1506
  """Insert a series after an existing column; not in-place."""
1476
1507
  columns = df.columns
@@ -2472,6 +2503,7 @@ __all__ = [
2472
2503
  "cross",
2473
2504
  "dataclass_to_dataframe",
2474
2505
  "dataclass_to_schema",
2506
+ "decreasing_horizontal",
2475
2507
  "deserialize_dataframe",
2476
2508
  "drop_null_struct_series",
2477
2509
  "ensure_data_type",
@@ -2483,6 +2515,7 @@ __all__ = [
2483
2515
  "get_expr_name",
2484
2516
  "get_frequency_spectrum",
2485
2517
  "get_series_number_of_decimals",
2518
+ "increasing_horizontal",
2486
2519
  "insert_after",
2487
2520
  "insert_before",
2488
2521
  "insert_between",
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
35
35
  from redis.typing import EncodableT
36
36
 
37
37
  from utilities.iterables import MaybeIterable
38
- from utilities.types import Delta, MaybeListStr, MaybeSequence, MaybeType, TypeLike
38
+ from utilities.types import Delta, MaybeSequence, MaybeType, TypeLike
39
39
 
40
40
 
41
41
  _PUBLISH_TIMEOUT: Delta = SECOND
@@ -583,7 +583,7 @@ class PublishError(Exception):
583
583
  async def publish_many[T](
584
584
  redis: Redis,
585
585
  channel: str,
586
- data: MaybeSequence[bytes | T] | MaybeListStr,
586
+ data: MaybeSequence[bytes | str | T],
587
587
  /,
588
588
  *,
589
589
  serializer: Callable[[T], EncodableT] | None = None,
@@ -2,15 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import datetime as dt
4
4
  from asyncio import Event
5
- from collections.abc import (
6
- Callable,
7
- Collection,
8
- Coroutine,
9
- Hashable,
10
- Iterable,
11
- Mapping,
12
- Sequence,
13
- )
5
+ from collections.abc import Callable, Collection, Coroutine, Iterable, Mapping
14
6
  from enum import Enum
15
7
  from ipaddress import IPv4Address, IPv6Address
16
8
  from logging import Logger
@@ -123,20 +115,16 @@ IPv6AddressLike = MaybeStr[IPv6Address]
123
115
 
124
116
 
125
117
  # iterables
126
- type IterableHashable[T: Hashable] = tuple[T, ...] | frozenset[T]
127
118
  type MaybeCollection[T] = T | Collection[T]
128
- type MaybeIterableHashable[T: Hashable] = T | IterableHashable[T]
129
119
  type MaybeIterable[T] = T | Iterable[T]
130
- type MaybeList[T] = T | list[T]
131
- type MaybeSequence[T] = T | Sequence[T]
120
+ type MaybeSequence[T] = T | SequenceLT[T]
121
+ type SequenceLT[T] = list[T] | tuple[T, ...]
132
122
  # iterables - str
133
- type CollectionStr = (
134
- dict[str, Any] | frozenset[str] | list[str] | set[str] | tuple[str, ...]
135
- )
123
+ type SequenceStr = SequenceLT[str]
124
+ type CollectionStr = dict[str, Any] | frozenset[str] | set[str] | SequenceStr
125
+ # iterables - maybe str
136
126
  type MaybeCollectionStr = str | CollectionStr
137
- type MaybeListStr = MaybeList[str]
138
127
  type MaybeSequenceStr = str | SequenceStr
139
- type SequenceStr = list[str] | tuple[str, ...]
140
128
 
141
129
 
142
130
  # logging
@@ -288,7 +276,6 @@ __all__ = [
288
276
  "ExceptionTypeLike",
289
277
  "IPv4AddressLike",
290
278
  "IPv6AddressLike",
291
- "IterableHashable",
292
279
  "LogLevel",
293
280
  "LoggerOrName",
294
281
  "MathRoundMode",
@@ -303,9 +290,6 @@ __all__ = [
303
290
  "MaybeCollectionStr",
304
291
  "MaybeCoro",
305
292
  "MaybeIterable",
306
- "MaybeIterableHashable",
307
- "MaybeList",
308
- "MaybeListStr",
309
293
  "MaybeSequence",
310
294
  "MaybeSequenceStr",
311
295
  "MaybeStr",
@@ -1,14 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from ipaddress import IPv4Address
4
-
5
- from tests.conftest import SKIPIF_CI_AND_MAC
6
- from utilities.dnspython import nslookup
7
-
8
-
9
- class TestNSLookup:
10
- @SKIPIF_CI_AND_MAC
11
- def test_main(self) -> None:
12
- result = nslookup("localhost")
13
- expected = [IPv4Address("127.0.0.1")]
14
- assert result == expected
@@ -1,17 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from ipaddress import IPv4Address
4
-
5
- from dns.resolver import resolve
6
-
7
- from utilities.functools import cache
8
-
9
-
10
- @cache
11
- def nslookup(address: str, /) -> list[IPv4Address]:
12
- """Look up a set of addresses."""
13
- ans = resolve(address) # skipif-ci-and-mac
14
- return [IPv4Address(str(rd)) for rd in ans] # skipif-ci-and-mac
15
-
16
-
17
- __all__ = ["nslookup"]