dycw-utilities 0.151.10__tar.gz → 0.151.12__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/PKG-INFO +1 -1
  2. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/pyproject.toml +3 -6
  3. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_period.py +4 -4
  4. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_polars.py +35 -0
  5. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/period.py +33 -12
  7. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/polars.py +34 -1
  8. dycw_utilities-0.151.10/src/tests/test_dnspython.py +0 -14
  9. dycw_utilities-0.151.10/src/utilities/dnspython.py +0 -17
  10. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/.gitignore +0 -0
  11. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/LICENSE +0 -0
  12. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/README.md +0 -0
  13. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/__init__.py +0 -0
  14. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/conftest.py +0 -0
  15. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/__init__.py +0 -0
  16. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_missing/__init__.py +0 -0
  17. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_missing/module.py +0 -0
  18. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_with/__init__.py +0 -0
  19. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_with/outer_1.py +0 -0
  20. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_with/outer_2.py +0 -0
  21. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  22. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  23. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  24. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  25. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_without/__init__.py +0 -0
  26. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_without/module_1.py +0 -0
  27. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/package_without/module_2.py +0 -0
  28. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/standalone.py +0 -0
  29. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/modules/with_imports.py +0 -0
  30. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  31. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  32. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  33. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  34. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  35. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  36. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  37. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  38. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_altair.py +0 -0
  39. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_asyncio.py +0 -0
  40. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_atomicwrites.py +0 -0
  41. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_atools.py +0 -0
  42. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_cachetools.py +0 -0
  43. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_click.py +0 -0
  44. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_concurrent.py +0 -0
  45. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_contextlib.py +0 -0
  46. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_contextvars.py +0 -0
  47. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_cryptography.py +0 -0
  48. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_cvxpy.py +0 -0
  49. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_dataclasses.py +0 -0
  50. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_errors.py +0 -0
  52. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_eventkit.py +0 -0
  53. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_fastapi.py +0 -0
  54. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_fpdf2.py +0 -0
  55. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_functions.py +0 -0
  56. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_functools.py +0 -0
  57. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_getpass.py +0 -0
  58. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_gzip.py +0 -0
  59. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_hashlib.py +0 -0
  60. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_http.py +0 -0
  61. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_hypothesis.py +0 -0
  62. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_importlib.py +0 -0
  63. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_inflect.py +0 -0
  64. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_ipython.py +0 -0
  65. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_iterables.py +0 -0
  66. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_json.py +0 -0
  67. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_jupyter.py +0 -0
  68. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_libcst.py +0 -0
  69. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_lightweight_charts.py +0 -0
  70. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_logging.py +0 -0
  71. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_objects/__init__.py +0 -0
  77. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_objects/objects.py +0 -0
  78. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_orjson.py +0 -0
  81. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_os.py +0 -0
  82. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_parse.py +0 -0
  83. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pickle.py +0 -0
  85. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_platform.py +0 -0
  86. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_polars_ols.py +0 -0
  87. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_postgres.py +0 -0
  88. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pottery.py +0 -0
  89. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pqdm.py +0 -0
  90. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_psutil.py +0 -0
  91. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pyinstrument.py +0 -0
  92. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pytest.py +0 -0
  93. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pytest_randomly.py +0 -0
  94. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_pytest_regressions.py +0 -0
  95. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_random.py +0 -0
  96. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_re.py +0 -0
  97. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_redis.py +0 -0
  98. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_reprlib.py +0 -0
  99. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_scipy.py +0 -0
  100. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_sentinel.py +0 -0
  101. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_shelve.py +0 -0
  102. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_slack_sdk.py +0 -0
  103. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_socket.py +0 -0
  104. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_sqlalchemy.py +0 -0
  105. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_sqlalchemy_polars.py +0 -0
  106. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_statsmodels.py +0 -0
  107. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_string.py +0 -0
  108. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_tempfile.py +0 -0
  109. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_text.py +0 -0
  110. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_threading.py +0 -0
  111. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_timer.py +0 -0
  112. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_traceback.py +0 -0
  113. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_typed_settings.py +0 -0
  114. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_types.py +0 -0
  115. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_typing.py +0 -0
  116. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_typing_funcs/__init__.py +0 -0
  117. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_typing_funcs/no_future.py +0 -0
  118. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_typing_funcs/with_future.py +0 -0
  119. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_tzdata.py +0 -0
  120. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_tzlocal.py +0 -0
  121. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_uuid.py +0 -0
  122. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_version.py +0 -0
  123. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_warnings.py +0 -0
  124. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_whenever.py +0 -0
  125. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_yield_access/__init__.py +0 -0
  126. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_yield_access/script.py +0 -0
  127. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_yield_access/script.sh +0 -0
  128. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_zipfile.py +0 -0
  129. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/tests/test_zoneinfo.py +0 -0
  130. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/altair.py +0 -0
  131. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/asyncio.py +0 -0
  132. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/atomicwrites.py +0 -0
  133. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/atools.py +0 -0
  134. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/cachetools.py +0 -0
  135. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/click.py +0 -0
  136. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/concurrent.py +0 -0
  137. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/contextlib.py +0 -0
  138. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/contextvars.py +0 -0
  139. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/cryptography.py +0 -0
  140. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/cvxpy.py +0 -0
  141. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/dataclasses.py +0 -0
  142. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/eventkit.py +0 -0
  145. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/fastapi.py +0 -0
  146. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/fpdf2.py +0 -0
  147. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/functions.py +0 -0
  148. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/functools.py +0 -0
  149. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/getpass.py +0 -0
  150. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/gzip.py +0 -0
  151. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/hypothesis.py +0 -0
  154. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/importlib.py +0 -0
  155. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/inflect.py +0 -0
  156. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/ipython.py +0 -0
  157. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/iterables.py +0 -0
  158. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/json.py +0 -0
  159. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/jupyter.py +0 -0
  160. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/libcst.py +0 -0
  161. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/lightweight_charts.py +0 -0
  162. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/logging.py +0 -0
  163. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/math.py +0 -0
  164. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/memory_profiler.py +0 -0
  165. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/modules.py +0 -0
  166. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/more_itertools.py +0 -0
  167. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/numpy.py +0 -0
  168. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/operator.py +0 -0
  169. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/optuna.py +0 -0
  170. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/orjson.py +0 -0
  171. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pathlib.py +0 -0
  174. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pickle.py +0 -0
  175. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/platform.py +0 -0
  176. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/polars_ols.py +0 -0
  177. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/postgres.py +0 -0
  178. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pottery.py +0 -0
  179. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pqdm.py +0 -0
  180. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/psutil.py +0 -0
  181. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/py.typed +0 -0
  182. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pyinstrument.py +0 -0
  183. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pytest.py +0 -0
  184. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pytest_plugins/__init__.py +0 -0
  185. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  186. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  187. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/random.py +0 -0
  189. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/re.py +0 -0
  190. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/redis.py +0 -0
  191. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/reprlib.py +0 -0
  192. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/scipy.py +0 -0
  193. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/sentinel.py +0 -0
  194. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/shelve.py +0 -0
  195. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/slack_sdk.py +0 -0
  196. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/socket.py +0 -0
  197. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/sqlalchemy.py +0 -0
  198. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/sqlalchemy_polars.py +0 -0
  199. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/statsmodels.py +0 -0
  200. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/text.py +0 -0
  203. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/threading.py +0 -0
  204. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/timer.py +0 -0
  205. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/traceback.py +0 -0
  206. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/typed_settings.py +0 -0
  207. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/types.py +0 -0
  208. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/typing.py +0 -0
  209. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/tzdata.py +0 -0
  210. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/tzlocal.py +0 -0
  211. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/uuid.py +0 -0
  212. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/version.py +0 -0
  213. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/warnings.py +0 -0
  214. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/whenever.py +0 -0
  215. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/zipfile.py +0 -0
  216. {dycw_utilities-0.151.10 → dycw_utilities-0.151.12}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.151.10
3
+ Version: 0.151.12
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -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
  ]
@@ -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.10"
232
+ version = "0.151.12"
236
233
 
237
234
  [project.entry-points.pytest11]
238
235
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -265,7 +262,7 @@ test = [
265
262
  # bump-my-version
266
263
  [tool.bumpversion]
267
264
  allow_dirty = true
268
- current_version = "0.151.10"
265
+ current_version = "0.151.12"
269
266
 
270
267
  [[tool.bumpversion.files]]
271
268
  filename = "src/utilities/__init__.py"
@@ -21,9 +21,9 @@ from utilities.hypothesis import (
21
21
  )
22
22
  from utilities.period import (
23
23
  DatePeriod,
24
+ PeriodDict,
24
25
  TimePeriod,
25
26
  ZonedDateTimePeriod,
26
- _PeriodAsDict,
27
27
  _PeriodExactEqArgumentsError,
28
28
  _PeriodInvalidError,
29
29
  _PeriodTimeZoneError,
@@ -154,7 +154,7 @@ class TestDatePeriod:
154
154
  period = DatePeriod(start, end)
155
155
  dict1 = period.to_dict()
156
156
  dstart, dend = dict1["start"], dict1["end"]
157
- dict2 = _PeriodAsDict(
157
+ dict2 = PeriodDict(
158
158
  start=data.draw(sampled_from([dstart, dstart.py_date()])),
159
159
  end=data.draw(sampled_from([dend, dend.py_date()])),
160
160
  )
@@ -240,7 +240,7 @@ class TestTimePeriod:
240
240
  period = TimePeriod(start, end)
241
241
  dict1 = period.to_dict()
242
242
  dstart, dend = dict1["start"], dict1["end"]
243
- dict2 = _PeriodAsDict(
243
+ dict2 = PeriodDict(
244
244
  start=data.draw(sampled_from([dstart, dstart.py_time()])),
245
245
  end=data.draw(sampled_from([dend, dend.py_time()])),
246
246
  )
@@ -478,7 +478,7 @@ class TestZonedDateTimePeriod:
478
478
  period = ZonedDateTimePeriod(start, end)
479
479
  dict1 = period.to_dict()
480
480
  dstart, dend = dict1["start"], dict1["end"]
481
- dict2 = _PeriodAsDict(
481
+ dict2 = PeriodDict(
482
482
  start=data.draw(sampled_from([dstart, dstart.py_datetime()])),
483
483
  end=data.draw(sampled_from([dend, dend.py_datetime()])),
484
484
  )
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.151.10"
3
+ __version__ = "0.151.12"
@@ -2,7 +2,16 @@ from __future__ import annotations
2
2
 
3
3
  import datetime as dt
4
4
  from dataclasses import dataclass
5
- from typing import TYPE_CHECKING, Any, Self, TypedDict, assert_never, overload, override
5
+ from typing import (
6
+ TYPE_CHECKING,
7
+ Any,
8
+ Self,
9
+ TypedDict,
10
+ TypeVar,
11
+ assert_never,
12
+ overload,
13
+ override,
14
+ )
6
15
  from zoneinfo import ZoneInfo
7
16
 
8
17
  from whenever import Date, DateDelta, PlainDateTime, Time, TimeDelta, ZonedDateTime
@@ -16,8 +25,14 @@ from utilities.zoneinfo import UTC, ensure_time_zone, get_time_zone_name
16
25
  if TYPE_CHECKING:
17
26
  from utilities.types import TimeZoneLike
18
27
 
28
+ _TDate_co = TypeVar("_TDate_co", bound=Date | dt.date, covariant=True)
29
+ _TTime_co = TypeVar("_TTime_co", bound=Time | dt.time, covariant=True)
30
+ _TDateTime_co = TypeVar(
31
+ "_TDateTime_co", bound=ZonedDateTime | dt.datetime, covariant=True
32
+ )
19
33
 
20
- class _PeriodAsDict[T: Date | Time | ZonedDateTime | dt.date | dt.time | dt.datetime](
34
+
35
+ class PeriodDict[T: Date | Time | ZonedDateTime | dt.date | dt.time | dt.datetime](
21
36
  TypedDict
22
37
  ):
23
38
  start: T
@@ -85,7 +100,7 @@ class DatePeriod:
85
100
  return f"{fc(start)}-{fc(end)}"
86
101
 
87
102
  @classmethod
88
- def from_dict(cls, mapping: _PeriodAsDict[Date | dt.date], /) -> Self:
103
+ def from_dict(cls, mapping: PeriodDict[_TDate_co], /) -> Self:
89
104
  """Convert the dictionary to a period."""
90
105
  match mapping["start"]:
91
106
  case Date() as start:
@@ -109,9 +124,9 @@ class DatePeriod:
109
124
  """Replace elements of the period."""
110
125
  return replace_non_sentinel(self, start=start, end=end)
111
126
 
112
- def to_dict(self) -> _PeriodAsDict[Date]:
127
+ def to_dict(self) -> PeriodDict[Date]:
113
128
  """Convert the period to a dictionary."""
114
- return _PeriodAsDict(start=self.start, end=self.end)
129
+ return PeriodDict(start=self.start, end=self.end)
115
130
 
116
131
 
117
132
  @dataclass(repr=False, order=True, unsafe_hash=True, kw_only=False)
@@ -140,7 +155,7 @@ class TimePeriod:
140
155
  return DatePeriod(start, end).at((self.start, self.end), time_zone=time_zone)
141
156
 
142
157
  @classmethod
143
- def from_dict(cls, mapping: _PeriodAsDict[Time | dt.time], /) -> Self:
158
+ def from_dict(cls, mapping: PeriodDict[_TTime_co], /) -> Self:
144
159
  """Convert the dictionary to a period."""
145
160
  match mapping["start"]:
146
161
  case Time() as start:
@@ -164,9 +179,9 @@ class TimePeriod:
164
179
  """Replace elements of the period."""
165
180
  return replace_non_sentinel(self, start=start, end=end)
166
181
 
167
- def to_dict(self) -> _PeriodAsDict[Time]:
182
+ def to_dict(self) -> PeriodDict[Time]:
168
183
  """Convert the period to a dictionary."""
169
- return _PeriodAsDict(start=self.start, end=self.end)
184
+ return PeriodDict(start=self.start, end=self.end)
170
185
 
171
186
 
172
187
  @dataclass(repr=False, order=True, unsafe_hash=True, kw_only=False)
@@ -271,7 +286,7 @@ class ZonedDateTimePeriod:
271
286
  return f"{fc(start.to_plain())}-{fc(end, fmt='%Y%m%dT%H')}"
272
287
 
273
288
  @classmethod
274
- def from_dict(cls, mapping: _PeriodAsDict[ZonedDateTime | dt.datetime], /) -> Self:
289
+ def from_dict(cls, mapping: PeriodDict[_TDateTime_co], /) -> Self:
275
290
  """Convert the dictionary to a period."""
276
291
  match mapping["start"]:
277
292
  case ZonedDateTime() as start:
@@ -303,9 +318,9 @@ class ZonedDateTimePeriod:
303
318
  """The time zone of the period."""
304
319
  return ZoneInfo(self.start.tz)
305
320
 
306
- def to_dict(self) -> _PeriodAsDict[ZonedDateTime]:
321
+ def to_dict(self) -> PeriodDict[ZonedDateTime]:
307
322
  """Convert the period to a dictionary."""
308
- return _PeriodAsDict(start=self.start, end=self.end)
323
+ return PeriodDict(start=self.start, end=self.end)
309
324
 
310
325
  def to_tz(self, time_zone: TimeZoneLike, /) -> Self:
311
326
  """Convert the time zone."""
@@ -346,4 +361,10 @@ class _PeriodExactEqArgumentsError(PeriodError):
346
361
  return f"Invalid arguments; got {self.args}"
347
362
 
348
363
 
349
- __all__ = ["DatePeriod", "PeriodError", "TimePeriod", "ZonedDateTimePeriod"]
364
+ __all__ = [
365
+ "DatePeriod",
366
+ "PeriodDict",
367
+ "PeriodError",
368
+ "TimePeriod",
369
+ "ZonedDateTimePeriod",
370
+ ]
@@ -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",
@@ -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"]