dycw-utilities 0.163.1__tar.gz → 0.164.1__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 (211) hide show
  1. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/PKG-INFO +1 -1
  2. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/pyproject.toml +2 -2
  3. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_functions.py +0 -233
  4. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_iterables.py +1 -7
  5. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_logging.py +29 -4
  6. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_orjson.py +1 -2
  7. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing.py +228 -10
  8. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing_funcs/with_future.py +6 -1
  9. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/__init__.py +1 -1
  10. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/dataclasses.py +2 -6
  11. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/functions.py +5 -266
  12. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/iterables.py +1 -16
  13. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/logging.py +34 -1
  14. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/operator.py +1 -1
  15. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/orjson.py +2 -1
  16. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/polars.py +4 -6
  17. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/polars_ols.py +1 -1
  18. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/redis.py +2 -11
  19. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/sqlalchemy.py +7 -9
  20. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/typing.py +418 -14
  21. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/.gitignore +0 -0
  22. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/LICENSE +0 -0
  23. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/README.md +0 -0
  24. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/__init__.py +0 -0
  25. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/conftest.py +0 -0
  26. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/__init__.py +0 -0
  27. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_missing/__init__.py +0 -0
  28. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_missing/module.py +0 -0
  29. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/__init__.py +0 -0
  30. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/outer_1.py +0 -0
  31. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/outer_2.py +0 -0
  32. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  33. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  34. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  35. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  36. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_without/__init__.py +0 -0
  37. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_without/module_1.py +0 -0
  38. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/package_without/module_2.py +0 -0
  39. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/standalone.py +0 -0
  40. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/modules/with_imports.py +0 -0
  41. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  42. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  43. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  44. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  45. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  46. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  47. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  48. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  49. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_aeventkit.py +0 -0
  50. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_altair.py +0 -0
  51. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_asyncio.py +0 -0
  52. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_atomicwrites.py +0 -0
  53. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_atools.py +0 -0
  54. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_cachetools.py +0 -0
  55. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_click.py +0 -0
  56. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_concurrent.py +0 -0
  57. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_contextlib.py +0 -0
  58. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_contextvars.py +0 -0
  59. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_cryptography.py +0 -0
  60. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_cvxpy.py +0 -0
  61. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_dataclasses.py +0 -0
  62. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_enum.py +0 -0
  63. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_errors.py +0 -0
  64. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_fastapi.py +0 -0
  65. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_fpdf2.py +0 -0
  66. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_functools.py +0 -0
  67. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_getpass.py +0 -0
  68. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_gzip.py +0 -0
  69. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_hashlib.py +0 -0
  70. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_http.py +0 -0
  71. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_hypothesis.py +0 -0
  72. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_importlib.py +0 -0
  73. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_inflect.py +0 -0
  74. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_ipython.py +0 -0
  75. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_json.py +0 -0
  76. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_jupyter.py +0 -0
  77. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_libcst.py +0 -0
  78. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_lightweight_charts.py +0 -0
  79. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_math.py +0 -0
  80. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_memory_profiler.py +0 -0
  81. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_modules.py +0 -0
  82. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_more_itertools.py +0 -0
  83. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_numpy.py +0 -0
  84. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_objects/__init__.py +0 -0
  85. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_objects/objects.py +0 -0
  86. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_operator.py +0 -0
  87. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_optuna.py +0 -0
  88. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_os.py +0 -0
  89. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_parse.py +0 -0
  90. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pathlib.py +0 -0
  91. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pickle.py +0 -0
  92. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_platform.py +0 -0
  93. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_polars.py +0 -0
  94. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_polars_ols.py +0 -0
  95. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_postgres.py +0 -0
  96. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pottery.py +0 -0
  97. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pqdm.py +0 -0
  98. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_psutil.py +0 -0
  99. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pyinstrument.py +0 -0
  100. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pytest.py +0 -0
  101. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pytest_randomly.py +0 -0
  102. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_pytest_regressions.py +0 -0
  103. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_random.py +0 -0
  104. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_re.py +0 -0
  105. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_redis.py +0 -0
  106. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_reprlib.py +0 -0
  107. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_scipy.py +0 -0
  108. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_sentinel.py +0 -0
  109. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_shelve.py +0 -0
  110. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_slack_sdk.py +0 -0
  111. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_socket.py +0 -0
  112. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_sqlalchemy.py +0 -0
  113. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_sqlalchemy_polars.py +0 -0
  114. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_statsmodels.py +0 -0
  115. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_string.py +0 -0
  116. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_tempfile.py +0 -0
  117. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_testbook.py +0 -0
  118. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_text.py +0 -0
  119. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_threading.py +0 -0
  120. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_timer.py +0 -0
  121. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_traceback.py +0 -0
  122. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typed_settings.py +0 -0
  123. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_types.py +0 -0
  124. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing_funcs/__init__.py +0 -0
  125. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_typing_funcs/no_future.py +0 -0
  126. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_tzdata.py +0 -0
  127. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_tzlocal.py +0 -0
  128. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_uuid.py +0 -0
  129. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_version.py +0 -0
  130. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_warnings.py +0 -0
  131. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_whenever.py +0 -0
  132. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_zipfile.py +0 -0
  133. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/tests/test_zoneinfo.py +0 -0
  134. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/aeventkit.py +0 -0
  135. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/altair.py +0 -0
  136. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/asyncio.py +0 -0
  137. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/atomicwrites.py +0 -0
  138. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/atools.py +0 -0
  139. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/cachetools.py +0 -0
  140. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/click.py +0 -0
  141. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/concurrent.py +0 -0
  142. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/contextlib.py +0 -0
  143. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/contextvars.py +0 -0
  144. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/cryptography.py +0 -0
  145. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/cvxpy.py +0 -0
  146. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/enum.py +0 -0
  147. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/errors.py +0 -0
  148. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/fastapi.py +0 -0
  149. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/fpdf2.py +0 -0
  150. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/functools.py +0 -0
  151. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/getpass.py +0 -0
  152. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/gzip.py +0 -0
  153. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/hashlib.py +0 -0
  154. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/http.py +0 -0
  155. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/hypothesis.py +0 -0
  156. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/importlib.py +0 -0
  157. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/inflect.py +0 -0
  158. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/ipython.py +0 -0
  159. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/json.py +0 -0
  160. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/jupyter.py +0 -0
  161. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/libcst.py +0 -0
  162. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/lightweight_charts.py +0 -0
  163. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/math.py +0 -0
  164. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/memory_profiler.py +0 -0
  165. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/modules.py +0 -0
  166. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/more_itertools.py +0 -0
  167. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/numpy.py +0 -0
  168. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/optuna.py +0 -0
  169. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/os.py +0 -0
  170. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/parse.py +0 -0
  171. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pathlib.py +0 -0
  172. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pickle.py +0 -0
  173. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/platform.py +0 -0
  174. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/postgres.py +0 -0
  175. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pottery.py +0 -0
  176. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pqdm.py +0 -0
  177. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/psutil.py +0 -0
  178. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/py.typed +0 -0
  179. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pyinstrument.py +0 -0
  180. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest.py +0 -0
  181. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_plugins/__init__.py +0 -0
  182. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  183. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  184. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/pytest_regressions.py +0 -0
  185. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/random.py +0 -0
  186. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/re.py +0 -0
  187. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/reprlib.py +0 -0
  188. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/scipy.py +0 -0
  189. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/sentinel.py +0 -0
  190. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/shelve.py +0 -0
  191. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/slack_sdk.py +0 -0
  192. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/socket.py +0 -0
  193. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/sqlalchemy_polars.py +0 -0
  194. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/statsmodels.py +0 -0
  195. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/string.py +0 -0
  196. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/tempfile.py +0 -0
  197. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/testbook.py +0 -0
  198. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/text.py +0 -0
  199. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/threading.py +0 -0
  200. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/timer.py +0 -0
  201. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/traceback.py +0 -0
  202. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/typed_settings.py +0 -0
  203. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/types.py +0 -0
  204. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/tzdata.py +0 -0
  205. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/tzlocal.py +0 -0
  206. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/uuid.py +0 -0
  207. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/version.py +0 -0
  208. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/warnings.py +0 -0
  209. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/whenever.py +0 -0
  210. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/zipfile.py +0 -0
  211. {dycw_utilities-0.163.1 → dycw_utilities-0.164.1}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.163.1
3
+ Version: 0.164.1
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -232,7 +232,7 @@ dependencies = [
232
232
  name = "dycw-utilities"
233
233
  readme = "README.md"
234
234
  requires-python = ">= 3.12"
235
- version = "0.163.1"
235
+ version = "0.164.1"
236
236
 
237
237
  [project.entry-points.pytest11]
238
238
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -265,7 +265,7 @@ test = [
265
265
  # bump-my-version
266
266
  [tool.bumpversion]
267
267
  allow_dirty = true
268
- current_version = "0.163.1"
268
+ current_version = "0.164.1"
269
269
 
270
270
  [[tool.bumpversion.files]]
271
271
  filename = "src/utilities/__init__.py"
@@ -33,15 +33,12 @@ from utilities.functions import (
33
33
  EnsureClassError,
34
34
  EnsureDateError,
35
35
  EnsureFloatError,
36
- EnsureHashableError,
37
36
  EnsureIntError,
38
37
  EnsureMemberError,
39
38
  EnsureNotNoneError,
40
39
  EnsureNumberError,
41
40
  EnsurePathError,
42
41
  EnsurePlainDateTimeError,
43
- EnsureSizedError,
44
- EnsureSizedNotStrError,
45
42
  EnsureStrError,
46
43
  EnsureTimeDeltaError,
47
44
  EnsureTimeError,
@@ -54,15 +51,12 @@ from utilities.functions import (
54
51
  ensure_class,
55
52
  ensure_date,
56
53
  ensure_float,
57
- ensure_hashable,
58
54
  ensure_int,
59
55
  ensure_member,
60
56
  ensure_not_none,
61
57
  ensure_number,
62
58
  ensure_path,
63
59
  ensure_plain_date_time,
64
- ensure_sized,
65
- ensure_sized_not_str,
66
60
  ensure_str,
67
61
  ensure_time,
68
62
  ensure_time_delta,
@@ -73,20 +67,8 @@ from utilities.functions import (
73
67
  get_func_name,
74
68
  get_func_qualname,
75
69
  identity,
76
- is_dataclass_class,
77
- is_dataclass_instance,
78
- is_hashable,
79
- is_iterable_of,
80
70
  is_none,
81
71
  is_not_none,
82
- is_sequence_of,
83
- is_sequence_of_tuple_or_str_mapping,
84
- is_sized,
85
- is_sized_not_str,
86
- is_string_mapping,
87
- is_tuple,
88
- is_tuple_or_str_mapping,
89
- make_isinstance,
90
72
  map_object,
91
73
  max_nullable,
92
74
  min_nullable,
@@ -232,18 +214,6 @@ class TestEnsureFloat:
232
214
  _ = ensure_float(sentinel, nullable=nullable)
233
215
 
234
216
 
235
- class TestEnsureHashable:
236
- @given(obj=sampled_from([0, (1, 2, 3)]))
237
- def test_main(self, *, obj: Any) -> None:
238
- assert ensure_hashable(obj) == obj
239
-
240
- def test_error(self) -> None:
241
- with raises(
242
- EnsureHashableError, match=r"Object '.*' of type '.*' must be hashable"
243
- ):
244
- _ = ensure_hashable([1, 2, 3])
245
-
246
-
247
217
  class TestEnsureInt:
248
218
  @given(case=sampled_from([(0, False), (0, True), (None, True)]))
249
219
  def test_main(self, *, case: tuple[int | None, bool]) -> None:
@@ -363,30 +333,6 @@ class TestEnsurePlainDateTime:
363
333
  _ = ensure_plain_date_time(sentinel, nullable=nullable)
364
334
 
365
335
 
366
- class TestEnsureSized:
367
- @given(obj=sampled_from([[], (), ""]))
368
- def test_main(self, *, obj: Any) -> None:
369
- _ = ensure_sized(obj)
370
-
371
- def test_error(self) -> None:
372
- with raises(EnsureSizedError, match=r"Object '.*' of type '.*' must be sized"):
373
- _ = ensure_sized(None)
374
-
375
-
376
- class TestEnsureSizedNotStr:
377
- @given(obj=sampled_from([[], ()]))
378
- def test_main(self, *, obj: Any) -> None:
379
- _ = ensure_sized_not_str(obj)
380
-
381
- @given(obj=sampled_from([None, '""']))
382
- def test_error(self, *, obj: Any) -> None:
383
- with raises(
384
- EnsureSizedNotStrError,
385
- match="Object '.*' of type '.*' must be sized and not a string",
386
- ):
387
- _ = ensure_sized_not_str(obj)
388
-
389
-
390
336
  class TestEnsureStr:
391
337
  @given(case=sampled_from([("", False), ("", True), (None, True)]))
392
338
  def test_main(self, *, case: tuple[bool | None, bool]) -> None:
@@ -610,72 +556,6 @@ class TestIdentity:
610
556
  assert identity(x) == x
611
557
 
612
558
 
613
- class TestIsDataClassClass:
614
- def test_main(self) -> None:
615
- @dataclass(kw_only=True, slots=True)
616
- class Example:
617
- x: None = None
618
-
619
- assert is_dataclass_class(Example)
620
- assert not is_dataclass_class(Example())
621
-
622
- @given(obj=sampled_from([None, type(None)]))
623
- def test_others(self, *, obj: Any) -> None:
624
- assert not is_dataclass_class(obj)
625
-
626
-
627
- class TestIsDataClassInstance:
628
- def test_main(self) -> None:
629
- @dataclass(kw_only=True, slots=True)
630
- class Example:
631
- x: None = None
632
-
633
- assert not is_dataclass_instance(Example)
634
- assert is_dataclass_instance(Example())
635
-
636
- @given(obj=sampled_from([None, type(None)]))
637
- def test_others(self, *, obj: Any) -> None:
638
- assert not is_dataclass_instance(obj)
639
-
640
-
641
- class TestIsHashable:
642
- @given(case=sampled_from([(0, True), ((1, 2, 3), True), ([1, 2, 3], False)]))
643
- def test_main(self, *, case: tuple[Any, bool]) -> None:
644
- obj, expected = case
645
- assert is_hashable(obj) is expected
646
-
647
-
648
- class TestIsIterableOf:
649
- @given(
650
- case=sampled_from([
651
- ([0], True),
652
- (["0"], False),
653
- ({0}, True),
654
- ({0: 0}, True),
655
- (None, False),
656
- ([None], False),
657
- ])
658
- )
659
- def test_single(self, *, case: tuple[Any, bool]) -> None:
660
- obj, expected = case
661
- result = is_iterable_of(obj, int)
662
- assert result is expected
663
-
664
- @given(
665
- case=sampled_from([
666
- ([0], True),
667
- (["0"], True),
668
- ([0, "0"], True),
669
- (None, False),
670
- ([None], False),
671
- ])
672
- )
673
- def test_multiple(self, *, case: tuple[Any, bool]) -> None:
674
- obj, expected = case
675
- result = is_iterable_of(obj, (int, str))
676
- assert result is expected
677
-
678
-
679
559
  class TestIsNoneAndIsNotNone:
680
560
  @given(
681
561
  case=sampled_from([
@@ -691,119 +571,6 @@ class TestIsNoneAndIsNotNone:
691
571
  assert result is expected
692
572
 
693
573
 
694
- class TestIsSequenceOf:
695
- @given(
696
- case=sampled_from([
697
- ([0], True),
698
- (["0"], False),
699
- ({0}, False),
700
- ({0: 0}, False),
701
- (None, False),
702
- ([None], False),
703
- ])
704
- )
705
- def test_single(self, *, case: tuple[Any, bool]) -> None:
706
- obj, expected = case
707
- result = is_sequence_of(obj, int)
708
- assert result is expected
709
-
710
- @given(
711
- case=sampled_from([
712
- ([0], True),
713
- (["0"], True),
714
- ([0, "0"], True),
715
- (None, False),
716
- ([None], False),
717
- ])
718
- )
719
- def test_multiple(self, *, case: tuple[Any, bool]) -> None:
720
- obj, expected = case
721
- result = is_sequence_of(obj, (int, str))
722
- assert result is expected
723
-
724
-
725
- class TestIsSequenceOfTupleOrStrgMapping:
726
- @given(
727
- case=sampled_from([
728
- (None, False),
729
- ([(1, 2, 3)], True),
730
- ([{"a": 1, "b": 2, "c": 3}], True),
731
- ([(1, 2, 3), {"a": 1, "b": 2, "c": 3}], True),
732
- ])
733
- )
734
- def test_main(self, *, case: tuple[Any, bool]) -> None:
735
- obj, expected = case
736
- result = is_sequence_of_tuple_or_str_mapping(obj)
737
- assert result is expected
738
-
739
-
740
- class TestIsSized:
741
- @given(case=sampled_from([(None, False), ([], True), ((), True), ("", True)]))
742
- def test_main(self, *, case: tuple[Any, bool]) -> None:
743
- obj, expected = case
744
- assert is_sized(obj) is expected
745
-
746
-
747
- class TestIsSizedNotStr:
748
- @given(case=sampled_from([(None, False), ([], True), ((), True), ("", False)]))
749
- def test_main(self, *, case: tuple[Any, bool]) -> None:
750
- obj, expected = case
751
- assert is_sized_not_str(obj) is expected
752
-
753
-
754
- class TestIsStringMapping:
755
- @given(
756
- case=sampled_from([
757
- (None, False),
758
- ({"a": 1, "b": 2, "c": 3}, True),
759
- ({1: "a", 2: "b", 3: "c"}, False),
760
- ])
761
- )
762
- def test_main(self, *, case: tuple[Any, bool]) -> None:
763
- obj, expected = case
764
- result = is_string_mapping(obj)
765
- assert result is expected
766
-
767
-
768
- class TestIsTuple:
769
- @given(case=sampled_from([(None, False), ((1, 2, 3), True), ([1, 2, 3], False)]))
770
- def test_main(self, *, case: tuple[Any, bool]) -> None:
771
- obj, expected = case
772
- result = is_tuple(obj)
773
- assert result is expected
774
-
775
-
776
- class TestIsTupleOrStringMapping:
777
- @given(
778
- case=sampled_from([
779
- (None, False),
780
- ((1, 2, 3), True),
781
- ({"a": 1, "b": 2, "c": 3}, True),
782
- ({1: "a", 2: "b", 3: "c"}, False),
783
- ])
784
- )
785
- def test_main(self, *, case: tuple[Any, bool]) -> None:
786
- obj, expected = case
787
- result = is_tuple_or_str_mapping(obj)
788
- assert result is expected
789
-
790
-
791
- class TestMakeIsInstance:
792
- @given(case=sampled_from([(True, True), (False, True), (None, False)]))
793
- def test_single(self, *, case: tuple[bool | None, bool]) -> None:
794
- obj, expected = case
795
- func = make_isinstance(bool)
796
- result = func(obj)
797
- assert result is expected
798
-
799
- @given(case=sampled_from([(0, True), ("0", True), (None, False)]))
800
- def test_multiple(self, *, case: tuple[bool | None, bool]) -> None:
801
- obj, expected = case
802
- func = make_isinstance((int, str))
803
- result = func(obj)
804
- assert result is expected
805
-
806
-
807
574
  class TestMapObject:
808
575
  @given(x=integers())
809
576
  def test_int(self, *, x: int) -> None:
@@ -32,7 +32,6 @@ from hypothesis.strategies import (
32
32
  from pytest import mark, param, raises
33
33
 
34
34
  from tests.test_objects.objects import objects
35
- from utilities.functions import is_sequence_of
36
35
  from utilities.hypothesis import pairs, sentinels, sets_fixed_length, text_ascii
37
36
  from utilities.iterables import (
38
37
  CheckBijectionError,
@@ -88,7 +87,6 @@ from utilities.iterables import (
88
87
  check_unique_modulo_case,
89
88
  chunked,
90
89
  cmp_nullable,
91
- ensure_hashables,
92
90
  ensure_iterable,
93
91
  ensure_iterable_not_str,
94
92
  enumerate_with_edge,
@@ -119,6 +117,7 @@ from utilities.iterables import (
119
117
  unique_everseen,
120
118
  )
121
119
  from utilities.sentinel import Sentinel, sentinel
120
+ from utilities.typing import is_sequence_of
122
121
 
123
122
  if TYPE_CHECKING:
124
123
  from collections.abc import Iterable, Iterator, Mapping, Sequence
@@ -609,11 +608,6 @@ class TestCmpNullable:
609
608
  assert result == expected
610
609
 
611
610
 
612
- class TestEnsureHashables:
613
- def test_main(self) -> None:
614
- assert ensure_hashables(1, 2, a=3, b=4) == ([1, 2], {"a": 3, "b": 4})
615
-
616
-
617
611
  class TestEnsureIterable:
618
612
  @mark.parametrize("obj", [param([]), param(()), param("")])
619
613
  def test_main(self, *, obj: Any) -> None:
@@ -1,14 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from asyncio import sleep
4
+ from dataclasses import dataclass, field
4
5
  from io import StringIO
5
- from logging import Formatter, StreamHandler, getLogger
6
+ from logging import Formatter, LoggerAdapter, StreamHandler, getLogger
6
7
  from pathlib import Path
7
8
  from re import search
8
9
  from typing import TYPE_CHECKING, Any, cast
9
10
 
10
11
  from hypothesis import given
11
- from hypothesis.strategies import booleans, integers
12
+ from hypothesis.strategies import integers
12
13
  from pytest import LogCaptureFixture, mark, param, raises
13
14
 
14
15
  from tests.conftest import SKIPIF_CI_AND_WINDOWS
@@ -20,6 +21,7 @@ from utilities.logging import (
20
21
  _compute_rollover_actions,
21
22
  _FieldStyleKeys,
22
23
  _RotatingLogFile,
24
+ add_adapter,
23
25
  add_filters,
24
26
  basic_config,
25
27
  get_format_str,
@@ -41,14 +43,37 @@ if TYPE_CHECKING:
41
43
  from whenever import ZonedDateTime
42
44
 
43
45
 
46
+ class TestAddAdapter:
47
+ def test_main(self, *, caplog: LogCaptureFixture) -> None:
48
+ logger = getLogger(name := unique_str())
49
+ logger.setLevel("DEBUG")
50
+
51
+ def process(msg: str, x: int, /) -> str:
52
+ return f"x={x}: {msg}"
53
+
54
+ @dataclass
55
+ class Example:
56
+ x: int = 0
57
+ logger: LoggerAdapter = field(init=False)
58
+
59
+ def __post_init__(self) -> None:
60
+ self.logger = add_adapter(logger, process, self.x)
61
+ self.logger.info("Initializing...")
62
+
63
+ _ = Example()
64
+ record = one(r for r in caplog.records if r.name == name)
65
+ assert record.message == "x=0: Initializing..."
66
+
67
+
44
68
  class TestAddFilters:
45
- @given(expected=booleans())
69
+ @mark.parametrize("expected", [param(True), param(False)])
46
70
  def test_main(self, *, expected: bool) -> None:
47
71
  logger = getLogger(unique_str())
48
72
  logger.addHandler(handler := StreamHandler(buffer := StringIO()))
73
+ logger.setLevel("DEBUG")
49
74
  add_filters(handler, lambda _: expected)
50
75
  assert len(handler.filters) == 1
51
- logger.warning("message")
76
+ logger.info("message")
52
77
  result = buffer.getvalue() != ""
53
78
  assert result is expected
54
79
 
@@ -50,7 +50,6 @@ from tests.test_typing_funcs.with_future import (
50
50
  DataClassFutureTypeLiteral,
51
51
  DataClassFutureTypeLiteralNullable,
52
52
  )
53
- from utilities.functions import is_sequence_of
54
53
  from utilities.hypothesis import (
55
54
  date_periods,
56
55
  dates,
@@ -86,7 +85,7 @@ from utilities.orjson import (
86
85
  from utilities.polars import check_polars_dataframe, zoned_date_time_dtype
87
86
  from utilities.sentinel import Sentinel, sentinel
88
87
  from utilities.types import LogLevel, MaybeIterable, PathLike
89
- from utilities.typing import get_args
88
+ from utilities.typing import get_args, is_sequence_of
90
89
  from utilities.tzlocal import LOCAL_TIME_ZONE
91
90
  from utilities.whenever import (
92
91
  HOUR,