dycw-utilities 0.129.4__tar.gz → 0.129.6__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 (228) hide show
  1. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/PKG-INFO +1 -1
  2. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/pyproject.toml +2 -2
  3. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_logging.py +87 -100
  4. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/logging.py +19 -11
  6. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/.gitignore +0 -0
  7. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/LICENSE +0 -0
  8. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/README.md +0 -0
  9. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/__init__.py +0 -0
  10. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/conftest.py +0 -0
  11. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/__init__.py +0 -0
  12. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_missing/__init__.py +0 -0
  13. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_missing/module.py +0 -0
  14. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_with/__init__.py +0 -0
  15. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_with/outer_1.py +0 -0
  16. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_with/outer_2.py +0 -0
  17. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  18. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  19. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  20. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  21. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_without/__init__.py +0 -0
  22. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_without/module_1.py +0 -0
  23. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/package_without/module_2.py +0 -0
  24. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/standalone.py +0 -0
  25. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/modules/with_imports.py +0 -0
  26. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  27. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  28. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  29. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  30. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  31. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  32. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  33. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  34. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_altair.py +0 -0
  35. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_asyncio.py +0 -0
  36. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_asyncio_classes/__init__.py +0 -0
  37. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_asyncio_classes/loopers.py +0 -0
  38. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_asyncio_classes/redis.py +0 -0
  39. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_atomicwrites.py +0 -0
  40. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_atools.py +0 -0
  41. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_cachetools.py +0 -0
  42. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_click.py +0 -0
  43. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_concurrent.py +0 -0
  44. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_contextlib.py +0 -0
  45. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_datetime.py +0 -0
  50. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_errors.py +0 -0
  52. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_eventkit.py +0 -0
  53. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_fastapi.py +0 -0
  54. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_fpdf2.py +0 -0
  55. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_functions.py +0 -0
  56. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_functools.py +0 -0
  57. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_getpass.py +0 -0
  58. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_hashlib.py +0 -0
  59. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_http.py +0 -0
  60. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_hypothesis.py +0 -0
  61. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_importlib.py +0 -0
  62. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_ipython.py +0 -0
  63. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_iterables.py +0 -0
  64. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_jupyter.py +0 -0
  65. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_libcst.py +0 -0
  66. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_lightweight_charts.py +0 -0
  67. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_loguru.py +0 -0
  68. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_luigi.py +0 -0
  69. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_math.py +0 -0
  70. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_memory_profiler.py +0 -0
  71. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_modules.py +0 -0
  72. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_more_itertools.py +0 -0
  73. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_numpy.py +0 -0
  74. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_operator.py +0 -0
  75. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_optuna.py +0 -0
  76. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_orjson.py +0 -0
  77. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_os.py +0 -0
  78. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_parse.py +0 -0
  79. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pathlib.py +0 -0
  80. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_period.py +0 -0
  81. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pickle.py +0 -0
  82. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_platform.py +0 -0
  83. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_polars.py +0 -0
  84. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_polars_ols.py +0 -0
  85. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pottery.py +0 -0
  86. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pqdm.py +0 -0
  87. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_psutil.py +0 -0
  88. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pydantic.py +0 -0
  89. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pyinstrument.py +0 -0
  90. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pyrsistent.py +0 -0
  91. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pytest.py +0 -0
  92. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_pytest_regressions.py +0 -0
  93. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_python_dotenv.py +0 -0
  94. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_random.py +0 -0
  95. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_re.py +0 -0
  96. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_redis.py +0 -0
  97. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_reprlib.py +0 -0
  98. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_scipy.py +0 -0
  99. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_sentinel.py +0 -0
  100. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_shelve.py +0 -0
  101. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_slack_sdk.py +0 -0
  102. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_socket.py +0 -0
  103. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_sqlalchemy.py +0 -0
  104. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_sqlalchemy_polars.py +0 -0
  105. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_statsmodel.py +0 -0
  106. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_streamlit.py +0 -0
  107. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_string.py +0 -0
  108. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_sys.py +0 -0
  109. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_tempfile.py +0 -0
  110. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_tenacity.py +0 -0
  111. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_text.py +0 -0
  112. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_threading.py +0 -0
  113. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_timer.py +0 -0
  114. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback.py +0 -0
  115. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/__init__.py +0 -0
  116. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/chain.py +0 -0
  117. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  118. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  119. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  120. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/many.py +0 -0
  121. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/one.py +0 -0
  122. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/recursive.py +0 -0
  123. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  124. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  125. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/two.py +0 -0
  126. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_traceback_funcs/untraced.py +0 -0
  127. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_types.py +0 -0
  128. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_typing.py +0 -0
  129. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_typing_funcs/__init__.py +0 -0
  130. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_typing_funcs/no_future.py +0 -0
  131. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_typing_funcs/with_future.py +0 -0
  132. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_tzdata.py +0 -0
  133. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_tzlocal.py +0 -0
  134. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_uuid.py +0 -0
  135. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_version.py +0 -0
  136. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_warnings.py +0 -0
  137. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_whenever.py +0 -0
  138. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_zipfile.py +0 -0
  139. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/tests/test_zoneinfo.py +0 -0
  140. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/altair.py +0 -0
  141. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/asyncio.py +0 -0
  142. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/atomicwrites.py +0 -0
  143. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/atools.py +0 -0
  144. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/cachetools.py +0 -0
  145. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/click.py +0 -0
  146. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/concurrent.py +0 -0
  147. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/contextlib.py +0 -0
  148. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/contextvars.py +0 -0
  149. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/cryptography.py +0 -0
  150. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/cvxpy.py +0 -0
  151. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/dataclasses.py +0 -0
  152. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/datetime.py +0 -0
  153. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/enum.py +0 -0
  154. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/errors.py +0 -0
  155. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/eventkit.py +0 -0
  156. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/fastapi.py +0 -0
  157. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/fpdf2.py +0 -0
  158. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/functions.py +0 -0
  159. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/functools.py +0 -0
  160. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/getpass.py +0 -0
  161. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/hashlib.py +0 -0
  162. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/http.py +0 -0
  163. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/hypothesis.py +0 -0
  164. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/importlib.py +0 -0
  165. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/ipython.py +0 -0
  166. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/iterables.py +0 -0
  167. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/jupyter.py +0 -0
  168. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/libcst.py +0 -0
  169. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/lightweight_charts.py +0 -0
  170. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/loguru.py +0 -0
  171. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/luigi.py +0 -0
  172. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/math.py +0 -0
  173. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/memory_profiler.py +0 -0
  174. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/modules.py +0 -0
  175. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/more_itertools.py +0 -0
  176. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/numpy.py +0 -0
  177. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/operator.py +0 -0
  178. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/optuna.py +0 -0
  179. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/orjson.py +0 -0
  180. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/os.py +0 -0
  181. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/parse.py +0 -0
  182. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pathlib.py +0 -0
  183. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/period.py +0 -0
  184. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pickle.py +0 -0
  185. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/platform.py +0 -0
  186. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/polars.py +0 -0
  187. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/polars_ols.py +0 -0
  188. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pottery.py +0 -0
  189. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pqdm.py +0 -0
  190. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/psutil.py +0 -0
  191. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/py.typed +0 -0
  192. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pydantic.py +0 -0
  193. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pyinstrument.py +0 -0
  194. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pyrsistent.py +0 -0
  195. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pytest.py +0 -0
  196. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/pytest_regressions.py +0 -0
  197. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/python_dotenv.py +0 -0
  198. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/random.py +0 -0
  199. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/re.py +0 -0
  200. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/redis.py +0 -0
  201. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/reprlib.py +0 -0
  202. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/scipy.py +0 -0
  203. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/sentinel.py +0 -0
  204. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/shelve.py +0 -0
  205. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/slack_sdk.py +0 -0
  206. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/socket.py +0 -0
  207. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/sqlalchemy.py +0 -0
  208. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/sqlalchemy_polars.py +0 -0
  209. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/statsmodels.py +0 -0
  210. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/streamlit.py +0 -0
  211. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/string.py +0 -0
  212. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/sys.py +0 -0
  213. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/tempfile.py +0 -0
  214. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/tenacity.py +0 -0
  215. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/text.py +0 -0
  216. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/threading.py +0 -0
  217. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/timer.py +0 -0
  218. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/traceback.py +0 -0
  219. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/types.py +0 -0
  220. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/typing.py +0 -0
  221. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/tzdata.py +0 -0
  222. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/tzlocal.py +0 -0
  223. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/uuid.py +0 -0
  224. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/version.py +0 -0
  225. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/warnings.py +0 -0
  226. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/whenever.py +0 -0
  227. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/zipfile.py +0 -0
  228. {dycw_utilities-0.129.4 → dycw_utilities-0.129.6}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.129.4
3
+ Version: 0.129.6
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -94,7 +94,7 @@ dependencies = [
94
94
  name = "dycw-utilities"
95
95
  readme = "README.md"
96
96
  requires-python = ">= 3.12"
97
- version = "0.129.4"
97
+ version = "0.129.6"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  test = [
@@ -334,7 +334,7 @@ zzz-test-zoneinfo = [
334
334
  # bump-my-version
335
335
  [tool.bumpversion]
336
336
  allow_dirty = true
337
- current_version = "0.129.4"
337
+ current_version = "0.129.6"
338
338
 
339
339
  [[tool.bumpversion.files]]
340
340
  filename = "src/utilities/__init__.py"
@@ -42,6 +42,7 @@ from utilities.logging import (
42
42
  temp_logger,
43
43
  )
44
44
  from utilities.pytest import skipif_windows
45
+ from utilities.text import unique_str
45
46
  from utilities.types import LogLevel
46
47
  from utilities.typing import get_args
47
48
 
@@ -53,9 +54,9 @@ if TYPE_CHECKING:
53
54
 
54
55
 
55
56
  class TestAddFilters:
56
- @given(root=temp_paths(), expected=booleans())
57
- def test_main(self, *, root: Path, expected: bool) -> None:
58
- logger = getLogger(str(root))
57
+ @given(expected=booleans())
58
+ def test_main(self, *, expected: bool) -> None:
59
+ logger = getLogger(unique_str())
59
60
  logger.addHandler(handler := StreamHandler(buffer := StringIO()))
60
61
  add_filters(handler, lambda _: expected)
61
62
  assert len(handler.filters) == 1
@@ -71,10 +72,13 @@ class TestAddFilters:
71
72
 
72
73
 
73
74
  class TestBasicConfig:
74
- def test_main(self, *, tmp_path: Path) -> None:
75
- basic_config()
76
- logger = getLogger(str(tmp_path))
77
- logger.info("message")
75
+ @mark.parametrize("log", [param(True), param(False)])
76
+ def test_main(self, *, caplog: LogCaptureFixture, log: bool) -> None:
77
+ logger = unique_str() if log else None
78
+ basic_config(logger=logger)
79
+ logger_use = getLogger()
80
+ logger_use.warning("message")
81
+ assert "message" in caplog.messages
78
82
 
79
83
 
80
84
  class TestComputeRolloverActions:
@@ -191,16 +195,9 @@ class TestComputeRolloverActions:
191
195
 
192
196
 
193
197
  class TestFilterForKey:
194
- @given(
195
- root=temp_paths(),
196
- key=text_ascii(),
197
- value=booleans() | none(),
198
- default=booleans(),
199
- )
200
- def test_main(
201
- self, *, root: Path, key: str, value: bool | None, default: bool
202
- ) -> None:
203
- logger = getLogger(str(root))
198
+ @given(key=text_ascii(), value=booleans() | none(), default=booleans())
199
+ def test_main(self, *, key: str, value: bool | None, default: bool) -> None:
200
+ logger = getLogger(unique_str())
204
201
  logger.addHandler(handler := StreamHandler(buffer := StringIO()))
205
202
  with assume_does_not_raise(FilterForKeyError):
206
203
  filter_ = filter_for_key(key, default=default)
@@ -230,15 +227,16 @@ class TestGetDefaultLoggingPath:
230
227
 
231
228
 
232
229
  class TestGetLogger:
233
- def test_logger(self, *, tmp_path: Path) -> None:
234
- logger = getLogger(str(tmp_path))
230
+ def test_logger(self) -> None:
231
+ logger = getLogger(unique_str())
235
232
  result = get_logger(logger=logger)
236
233
  assert result is logger
237
234
 
238
- def test_str(self, *, tmp_path: Path) -> None:
239
- result = get_logger(logger=str(tmp_path))
240
- assert isinstance(result, Logger)
241
- assert result.name == str(tmp_path)
235
+ def test_str(self) -> None:
236
+ name = unique_str()
237
+ logger = getLogger(name)
238
+ assert isinstance(logger, Logger)
239
+ assert logger.name == name
242
240
 
243
241
  def test_none(self) -> None:
244
242
  result = get_logger()
@@ -382,7 +380,7 @@ class TestSetupLogging:
382
380
  def test_decorated(
383
381
  self, *, tmp_path: Path, traceback_func_one: Pattern[str]
384
382
  ) -> None:
385
- name = str(tmp_path)
383
+ name = unique_str()
386
384
  setup_logging(logger=name, files_dir=tmp_path)
387
385
  logger = getLogger(name)
388
386
  assert len(logger.handlers) == 7
@@ -397,7 +395,7 @@ class TestSetupLogging:
397
395
  def test_undecorated(
398
396
  self, *, tmp_path: Path, traceback_func_untraced: Pattern[str]
399
397
  ) -> None:
400
- name = str(tmp_path)
398
+ name = unique_str()
401
399
  setup_logging(logger=name, files_dir=tmp_path)
402
400
  logger = getLogger(name)
403
401
  assert len(logger.handlers) == 7
@@ -412,7 +410,7 @@ class TestSetupLogging:
412
410
  def test_regular_percent_formatting(
413
411
  self, *, tmp_path: Path, caplog: LogCaptureFixture
414
412
  ) -> None:
415
- name = str(tmp_path)
413
+ name = unique_str()
416
414
  setup_logging(logger=name, files_dir=tmp_path)
417
415
  logger = getLogger(name)
418
416
  logger.info("int: %d, float: %.2f", 1, 12.3456)
@@ -423,14 +421,14 @@ class TestSetupLogging:
423
421
 
424
422
  @skipif_windows
425
423
  def test_no_console(self, *, tmp_path: Path) -> None:
426
- name = str(tmp_path)
424
+ name = unique_str()
427
425
  setup_logging(logger=name, console_level=None, files_dir=tmp_path)
428
426
  logger = getLogger(name)
429
427
  assert len(logger.handlers) == 5
430
428
 
431
429
  @skipif_windows
432
430
  def test_zoned_datetime(self, *, tmp_path: Path, caplog: LogCaptureFixture) -> None:
433
- name = str(tmp_path)
431
+ name = unique_str()
434
432
  setup_logging(logger=name, files_dir=tmp_path)
435
433
  logger = getLogger(name)
436
434
  logger.info("")
@@ -441,7 +439,7 @@ class TestSetupLogging:
441
439
 
442
440
  @skipif_windows
443
441
  def test_extra(self, *, tmp_path: Path) -> None:
444
- name = str(tmp_path)
442
+ name = unique_str()
445
443
 
446
444
  def extra(logger: LoggerOrName | None, /) -> None:
447
445
  get_logger(logger=logger).addHandler(
@@ -478,7 +476,7 @@ class TestSetupLogging:
478
476
  class TestSizeAndTimeRotatingFileHandler:
479
477
  @skipif_windows
480
478
  def test_handlers(self, *, tmp_path: Path) -> None:
481
- logger = getLogger(str(tmp_path))
479
+ logger = getLogger(unique_str())
482
480
  filename = tmp_path.joinpath("log")
483
481
  logger.addHandler(SizeAndTimeRotatingFileHandler(filename=filename))
484
482
  logger.warning("message")
@@ -488,77 +486,66 @@ class TestSizeAndTimeRotatingFileHandler:
488
486
 
489
487
  @skipif_windows
490
488
  def test_size(self, *, tmp_path: Path) -> None:
491
- logger = getLogger(str(tmp_path))
489
+ logger = getLogger(unique_str())
492
490
  logger.addHandler(
493
491
  SizeAndTimeRotatingFileHandler(
494
492
  filename=tmp_path.joinpath("log.txt"), maxBytes=100, backupCount=3
495
493
  )
496
494
  )
497
-
498
- for i in range(1, 3):
499
- logger.warning("message %d", i)
500
- files = list(tmp_path.iterdir())
501
- assert len(files) == 1
502
- assert any(p for p in files if search(r"^log\.txt$", p.name))
503
-
504
- logger.warning(10 * "message 3")
505
- files = list(tmp_path.iterdir())
506
- assert len(files) == 2
507
- assert any(p for p in files if search(r"^log\.txt$", p.name))
508
- assert any(p for p in files if search(r"^log\.1__[\dT]+\.txt$", p.name))
509
-
510
- for i in range(4, 6):
511
- logger.warning("message %d", i)
512
- files = list(tmp_path.iterdir())
513
- assert len(files) == 3
514
- assert any(p for p in files if search(r"^log\.txt$", p.name))
515
- assert any(
516
- p for p in files if search(r"^log\.1__[\dT]+__[\dT]+\.txt$", p.name)
517
- )
518
- assert any(p for p in files if search(r"^log\.2__[\dT]+\.txt$", p.name))
519
-
520
- logger.warning(10 * "message 6")
521
- files = list(tmp_path.iterdir())
522
- assert len(files) == 4
523
- assert any(p for p in files if search(r"^log\.txt$", p.name))
524
- assert any(p for p in files if search(r"^log\.1__[\dT]+__[\dT]+\.txt$", p.name))
525
- assert any(p for p in files if search(r"^log\.2__[\dT]+__[\dT]+\.txt$", p.name))
526
- assert any(p for p in files if search(r"^log\.3__[\dT]+\.txt$", p.name))
527
-
528
- for _ in range(2):
529
- for i in range(7, 9):
530
- logger.warning("message %d", i)
495
+ for cycle in range(1, 10):
496
+ for i in range(1, 4):
497
+ logger.warning("%s message %d", 100 * "long" if i % 3 == 0 else "", i)
531
498
  files = list(tmp_path.iterdir())
532
- assert len(files) == 4
499
+ assert len(files) == min(cycle, 4)
533
500
  assert any(p for p in files if search(r"^log\.txt$", p.name))
534
- assert any(
535
- p for p in files if search(r"^log\.1__[\dT]+__[\dT]+\.txt$", p.name)
536
- )
537
- assert any(
538
- p for p in files if search(r"^log\.2__[\dT]+__[\dT]+\.txt$", p.name)
539
- )
540
- assert any(
541
- p for p in files if search(r"^log\.3__[\dT]+__[\dT]+\.txt$", p.name)
542
- )
543
-
544
- logger.warning("message 9")
545
- files = list(tmp_path.iterdir())
546
- assert len(files) == 4
547
- assert any(p for p in files if search(r"^log\.txt$", p.name))
548
- assert any(
549
- p for p in files if search(r"^log\.1__[\dT]+__[\dT]+\.txt$", p.name)
550
- )
551
- assert any(
552
- p for p in files if search(r"^log\.2__[\dT]+__[\dT]+\.txt$", p.name)
553
- )
554
- assert any(
555
- p for p in files if search(r"^log\.3__[\dT]+__[\dT]+\.txt$", p.name)
556
- )
501
+ if cycle == 2:
502
+ assert any(
503
+ p for p in files if search(r"^log\.1__[\dT]+\.txt$", p.name)
504
+ )
505
+ elif cycle == 3:
506
+ assert any(
507
+ p
508
+ for p in files
509
+ if search(r"^log\.1__[\dT]+__[\dT]+\.txt$", p.name)
510
+ )
511
+ assert any(
512
+ p for p in files if search(r"^log\.2__[\dT]+\.txt$", p.name)
513
+ )
514
+ elif cycle == 4:
515
+ assert any(
516
+ p
517
+ for p in files
518
+ if search(r"^log\.1__[\dT]+__[\dT]+\.txt$", p.name)
519
+ )
520
+ assert any(
521
+ p
522
+ for p in files
523
+ if search(r"^log\.2__[\dT]+__[\dT]+\.txt$", p.name)
524
+ )
525
+ assert any(
526
+ p for p in files if search(r"^log\.3__[\dT]+\.txt$", p.name)
527
+ )
528
+ elif cycle >= 5:
529
+ assert any(
530
+ p
531
+ for p in files
532
+ if search(r"^log\.1__[\dT]+__[\dT]+\.txt$", p.name)
533
+ )
534
+ assert any(
535
+ p
536
+ for p in files
537
+ if search(r"^log\.2__[\dT]+__[\dT]+\.txt$", p.name)
538
+ )
539
+ assert any(
540
+ p
541
+ for p in files
542
+ if search(r"^log\.3__[\dT]+__[\dT]+\.txt$", p.name)
543
+ )
557
544
 
558
545
  @mark.flaky
559
546
  @skipif_windows
560
547
  def test_time(self, *, tmp_path: Path) -> None:
561
- logger = getLogger(str(tmp_path))
548
+ logger = getLogger(unique_str())
562
549
  logger.addHandler(
563
550
  SizeAndTimeRotatingFileHandler(
564
551
  filename=tmp_path.joinpath("log.txt"),
@@ -631,7 +618,7 @@ class TestSizeAndTimeRotatingFileHandler:
631
618
  def test_should_rollover_file_not_found(
632
619
  self, *, tmp_path: Path, caplog: LogCaptureFixture
633
620
  ) -> None:
634
- logger = getLogger(str(tmp_path))
621
+ logger = getLogger(unique_str())
635
622
  path = tmp_path.joinpath("log")
636
623
  logger.addHandler(
637
624
  handler := SizeAndTimeRotatingFileHandler(filename=path, maxBytes=1)
@@ -645,7 +632,7 @@ class TestSizeAndTimeRotatingFileHandler:
645
632
  class TestStandaloneFileHandler:
646
633
  @skipif_windows
647
634
  def test_main(self, *, tmp_path: Path) -> None:
648
- logger = getLogger(str(tmp_path))
635
+ logger = getLogger(unique_str())
649
636
  logger.addHandler(StandaloneFileHandler(level=DEBUG, path=tmp_path))
650
637
  assert len(list(tmp_path.iterdir())) == 0
651
638
  logger.warning("message")
@@ -657,8 +644,8 @@ class TestStandaloneFileHandler:
657
644
 
658
645
 
659
646
  class TestTempHandler:
660
- def test_main(self, *, tmp_path: Path) -> None:
661
- logger = getLogger(str(tmp_path))
647
+ def test_main(self) -> None:
648
+ logger = getLogger(unique_str())
662
649
  logger.addHandler(h1 := StreamHandler())
663
650
  logger.addHandler(h2 := StreamHandler())
664
651
  assert len(logger.handlers) == 2
@@ -671,22 +658,22 @@ class TestTempHandler:
671
658
 
672
659
 
673
660
  class TestTempLogger:
674
- def test_disabled(self, *, tmp_path: Path) -> None:
675
- logger = getLogger(str(tmp_path))
661
+ def test_disabled(self) -> None:
662
+ logger = getLogger(unique_str())
676
663
  assert not logger.disabled
677
664
  with temp_logger(logger, disabled=True):
678
665
  assert logger.disabled
679
666
  assert not logger.disabled
680
667
 
681
- def test_level(self, *, tmp_path: Path) -> None:
682
- logger = getLogger(str(tmp_path))
668
+ def test_level(self) -> None:
669
+ logger = getLogger(unique_str())
683
670
  assert logger.level == NOTSET
684
671
  with temp_logger(logger, level="DEBUG"):
685
672
  assert logger.level == DEBUG
686
673
  assert logger.level == NOTSET
687
674
 
688
- def test_propagate(self, *, tmp_path: Path) -> None:
689
- logger = getLogger(str(tmp_path))
675
+ def test_propagate(self) -> None:
676
+ logger = getLogger(unique_str())
690
677
  assert logger.propagate
691
678
  with temp_logger(logger, propagate=False):
692
679
  assert not logger.propagate
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.129.4"
3
+ __version__ = "0.129.6"
@@ -160,13 +160,11 @@ class SizeAndTimeRotatingFileHandler(BaseRotatingHandler):
160
160
  def _should_rollover(self, record: LogRecord, /) -> bool:
161
161
  if self._max_bytes is not None: # skipif-ci-and-windows
162
162
  try:
163
- current = self._filename.stat().st_size
163
+ size = self._filename.stat().st_size
164
164
  except FileNotFoundError:
165
165
  pass
166
166
  else:
167
- delta = len(f"{self.format(record)}\n")
168
- new = current + delta
169
- if new >= self._max_bytes:
167
+ if size >= self._max_bytes:
170
168
  return True
171
169
  return bool(self._time_handler.shouldRollover(record)) # skipif-ci-and-windows
172
170
 
@@ -417,16 +415,26 @@ def add_filters(handler: Handler, /, *filters: _FilterType) -> None:
417
415
 
418
416
  def basic_config(
419
417
  *,
420
- format: str = "{asctime} | {name} | {levelname:8} | {message}", # noqa: A002
418
+ logger: LoggerOrName | None = None,
419
+ format_: str = "{asctime} | {name} | {levelname:8} | {message}",
421
420
  level: LogLevel = "INFO",
422
421
  ) -> None:
423
422
  """Do the basic config."""
424
- basicConfig(
425
- format=format,
426
- datefmt=maybe_sub_pct_y("%Y-%m-%d %H:%M:%S"),
427
- style="{",
428
- level=level,
429
- )
423
+ datefmt = maybe_sub_pct_y("%Y-%m-%d %H:%M:%S")
424
+ if logger is None:
425
+ basicConfig(format=format_, datefmt=datefmt, style="{", level=level)
426
+ else:
427
+ logger_use = get_logger(logger=logger)
428
+ logger_use.setLevel(level)
429
+ logger_use.addHandler(handler := StreamHandler())
430
+ handler.setLevel(level)
431
+ try:
432
+ from coloredlogs import ColoredFormatter
433
+ except ModuleNotFoundError: # pragma: no cover
434
+ formatter = Formatter(fmt=format_, datefmt=datefmt, style="{")
435
+ else:
436
+ formatter = ColoredFormatter(fmt=format_, datefmt=datefmt, style="{")
437
+ handler.setFormatter(formatter)
430
438
 
431
439
 
432
440
  ##