dycw-utilities 0.126.11__tar.gz → 0.126.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 (234) hide show
  1. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/PKG-INFO +1 -1
  2. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/pyproject.toml +2 -2
  3. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio.py +3 -2
  4. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_redis.py +33 -0
  5. dycw_utilities-0.126.12/src/tests/test_reprlib.py +87 -0
  6. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/__init__.py +1 -1
  7. dycw_utilities-0.126.12/src/utilities/reprlib.py +158 -0
  8. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/traceback.py +3 -5
  9. dycw_utilities-0.126.11/src/tests/test_reprlib.py +0 -38
  10. dycw_utilities-0.126.11/src/tests/test_rich.py +0 -24
  11. dycw_utilities-0.126.11/src/utilities/reprlib.py +0 -74
  12. dycw_utilities-0.126.11/src/utilities/rich.py +0 -74
  13. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/.gitignore +0 -0
  14. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/LICENSE +0 -0
  15. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/README.md +0 -0
  16. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/__init__.py +0 -0
  17. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/conftest.py +0 -0
  18. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/__init__.py +0 -0
  19. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_missing/__init__.py +0 -0
  20. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_missing/module.py +0 -0
  21. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/__init__.py +0 -0
  22. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/outer_1.py +0 -0
  23. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/outer_2.py +0 -0
  24. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  25. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  26. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  27. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  28. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_without/__init__.py +0 -0
  29. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_without/module_1.py +0 -0
  30. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/package_without/module_2.py +0 -0
  31. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/standalone.py +0 -0
  32. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/modules/with_imports.py +0 -0
  33. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  34. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  35. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  36. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  37. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  38. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  39. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  40. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  41. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_altair.py +0 -0
  42. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio_classes/__init__.py +0 -0
  43. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio_classes/loopers.py +0 -0
  44. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_asyncio_classes/redis.py +0 -0
  45. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_atomicwrites.py +0 -0
  46. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_atools.py +0 -0
  47. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_cachetools.py +0 -0
  48. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_click.py +0 -0
  49. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_concurrent.py +0 -0
  50. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_contextlib.py +0 -0
  51. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_contextvars.py +0 -0
  52. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_cryptography.py +0 -0
  53. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_cvxpy.py +0 -0
  54. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_dataclasses.py +0 -0
  55. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_datetime.py +0 -0
  56. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_enum.py +0 -0
  57. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_errors.py +0 -0
  58. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_eventkit.py +0 -0
  59. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_fastapi.py +0 -0
  60. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_fpdf2.py +0 -0
  61. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_functions.py +0 -0
  62. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_functools.py +0 -0
  63. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_getpass.py +0 -0
  64. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_git.py +0 -0
  65. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_hashlib.py +0 -0
  66. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_http.py +0 -0
  67. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_hypothesis.py +0 -0
  68. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_importlib.py +0 -0
  69. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_ipython.py +0 -0
  70. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_iterables.py +0 -0
  71. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_jupyter.py +0 -0
  72. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_libcst.py +0 -0
  73. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_lightweight_charts.py +0 -0
  74. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_logging.py +0 -0
  75. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_loguru.py +0 -0
  76. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_luigi.py +0 -0
  77. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_math.py +0 -0
  78. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_memory_profiler.py +0 -0
  79. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_modules.py +0 -0
  80. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_more_itertools.py +0 -0
  81. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_numpy.py +0 -0
  82. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_operator.py +0 -0
  83. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_optuna.py +0 -0
  84. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_orjson.py +0 -0
  85. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_os.py +0 -0
  86. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_parse.py +0 -0
  87. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pathlib.py +0 -0
  88. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_period.py +0 -0
  89. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pickle.py +0 -0
  90. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_platform.py +0 -0
  91. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_polars.py +0 -0
  92. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_polars_ols.py +0 -0
  93. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pottery.py +0 -0
  94. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pqdm.py +0 -0
  95. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_psutil.py +0 -0
  96. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pydantic.py +0 -0
  97. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pyinstrument.py +0 -0
  98. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pyrsistent.py +0 -0
  99. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pytest.py +0 -0
  100. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_pytest_regressions.py +0 -0
  101. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_python_dotenv.py +0 -0
  102. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_random.py +0 -0
  103. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_re.py +0 -0
  104. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_scipy.py +0 -0
  105. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sentinel.py +0 -0
  106. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_shelve.py +0 -0
  107. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_slack_sdk.py +0 -0
  108. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_socket.py +0 -0
  109. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sqlalchemy.py +0 -0
  110. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sqlalchemy_polars.py +0 -0
  111. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_statsmodel.py +0 -0
  112. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_streamlit.py +0 -0
  113. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_string.py +0 -0
  114. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_sys.py +0 -0
  115. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tempfile.py +0 -0
  116. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tenacity.py +0 -0
  117. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_text.py +0 -0
  118. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_threading.py +0 -0
  119. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_timer.py +0 -0
  120. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback.py +0 -0
  121. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/__init__.py +0 -0
  122. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/chain.py +0 -0
  123. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  124. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  125. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  126. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/many.py +0 -0
  127. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/one.py +0 -0
  128. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/recursive.py +0 -0
  129. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  130. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  131. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/two.py +0 -0
  132. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_traceback_funcs/untraced.py +0 -0
  133. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_types.py +0 -0
  134. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing.py +0 -0
  135. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing_funcs/__init__.py +0 -0
  136. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing_funcs/no_future.py +0 -0
  137. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_typing_funcs/with_future.py +0 -0
  138. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tzdata.py +0 -0
  139. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_tzlocal.py +0 -0
  140. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_uuid.py +0 -0
  141. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_version.py +0 -0
  142. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_warnings.py +0 -0
  143. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_whenever.py +0 -0
  144. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_zipfile.py +0 -0
  145. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/tests/test_zoneinfo.py +0 -0
  146. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/altair.py +0 -0
  147. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/asyncio.py +0 -0
  148. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/atomicwrites.py +0 -0
  149. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/atools.py +0 -0
  150. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/cachetools.py +0 -0
  151. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/click.py +0 -0
  152. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/concurrent.py +0 -0
  153. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/contextlib.py +0 -0
  154. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/contextvars.py +0 -0
  155. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/cryptography.py +0 -0
  156. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/cvxpy.py +0 -0
  157. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/dataclasses.py +0 -0
  158. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/datetime.py +0 -0
  159. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/enum.py +0 -0
  160. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/errors.py +0 -0
  161. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/eventkit.py +0 -0
  162. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/fastapi.py +0 -0
  163. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/fpdf2.py +0 -0
  164. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/functions.py +0 -0
  165. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/functools.py +0 -0
  166. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/getpass.py +0 -0
  167. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/git.py +0 -0
  168. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/hashlib.py +0 -0
  169. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/http.py +0 -0
  170. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/hypothesis.py +0 -0
  171. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/importlib.py +0 -0
  172. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/ipython.py +0 -0
  173. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/iterables.py +0 -0
  174. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/jupyter.py +0 -0
  175. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/libcst.py +0 -0
  176. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/lightweight_charts.py +0 -0
  177. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/logging.py +0 -0
  178. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/loguru.py +0 -0
  179. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/luigi.py +0 -0
  180. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/math.py +0 -0
  181. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/memory_profiler.py +0 -0
  182. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/modules.py +0 -0
  183. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/more_itertools.py +0 -0
  184. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/numpy.py +0 -0
  185. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/operator.py +0 -0
  186. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/optuna.py +0 -0
  187. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/orjson.py +0 -0
  188. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/os.py +0 -0
  189. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/parse.py +0 -0
  190. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pathlib.py +0 -0
  191. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/period.py +0 -0
  192. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pickle.py +0 -0
  193. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/platform.py +0 -0
  194. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/polars.py +0 -0
  195. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/polars_ols.py +0 -0
  196. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pottery.py +0 -0
  197. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pqdm.py +0 -0
  198. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/psutil.py +0 -0
  199. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/py.typed +0 -0
  200. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pydantic.py +0 -0
  201. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pyinstrument.py +0 -0
  202. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pyrsistent.py +0 -0
  203. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pytest.py +0 -0
  204. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/pytest_regressions.py +0 -0
  205. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/python_dotenv.py +0 -0
  206. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/random.py +0 -0
  207. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/re.py +0 -0
  208. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/redis.py +0 -0
  209. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/scipy.py +0 -0
  210. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sentinel.py +0 -0
  211. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/shelve.py +0 -0
  212. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/slack_sdk.py +0 -0
  213. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/socket.py +0 -0
  214. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sqlalchemy.py +0 -0
  215. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sqlalchemy_polars.py +0 -0
  216. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/statsmodels.py +0 -0
  217. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/streamlit.py +0 -0
  218. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/string.py +0 -0
  219. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/sys.py +0 -0
  220. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tempfile.py +0 -0
  221. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tenacity.py +0 -0
  222. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/text.py +0 -0
  223. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/threading.py +0 -0
  224. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/timer.py +0 -0
  225. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/types.py +0 -0
  226. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/typing.py +0 -0
  227. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tzdata.py +0 -0
  228. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/tzlocal.py +0 -0
  229. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/uuid.py +0 -0
  230. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/version.py +0 -0
  231. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/warnings.py +0 -0
  232. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/whenever.py +0 -0
  233. {dycw_utilities-0.126.11 → dycw_utilities-0.126.12}/src/utilities/zipfile.py +0 -0
  234. {dycw_utilities-0.126.11 → dycw_utilities-0.126.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.126.11
3
+ Version: 0.126.12
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.126.11"
97
+ version = "0.126.12"
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.126.11"
337
+ current_version = "0.126.12"
338
338
 
339
339
  [[tool.bumpversion.files]]
340
340
  filename = "src/utilities/__init__.py"
@@ -199,6 +199,7 @@ class TestEnhancedTaskGroup:
199
199
  assert looper.running
200
200
  assert not looper.running
201
201
 
202
+ @mark.flaky
202
203
  async def test_max_tasks_disabled(self) -> None:
203
204
  with Timer() as timer:
204
205
  async with EnhancedTaskGroup() as tg:
@@ -611,8 +612,8 @@ class TestInfiniteLooper:
611
612
 
612
613
  async with timeout(1.0), Parent(sleep_core=0.05) as parent:
613
614
  ...
614
- assert 15 <= parent.counter <= 25
615
- assert 15 <= parent.child.counter <= 25
615
+ assert 12 <= parent.counter <= 25
616
+ assert 12 <= parent.child.counter <= 25
616
617
 
617
618
  async def test_error_default_event(self) -> None:
618
619
  @dataclass(kw_only=True)
@@ -118,6 +118,7 @@ class TestIsMessage:
118
118
 
119
119
  class TestPublish:
120
120
  @given(data=lists(binary(min_size=1), min_size=1, max_size=5))
121
+ @mark.flaky
121
122
  @settings(max_examples=1, phases={Phase.generate})
122
123
  @SKIPIF_CI_AND_NOT_LINUX
123
124
  async def test_bytes(self, *, data: Sequence[bytes]) -> None:
@@ -138,6 +139,7 @@ class TestPublish:
138
139
  assert result == datum
139
140
 
140
141
  @given(objects=lists(make_objects(), min_size=1, max_size=5))
142
+ @mark.flaky
141
143
  @settings(max_examples=1, phases={Phase.generate})
142
144
  @SKIPIF_CI_AND_NOT_LINUX
143
145
  async def test_serializer(self, *, objects: Sequence[Any]) -> None:
@@ -157,6 +159,7 @@ class TestPublish:
157
159
  assert is_equal(result, obj)
158
160
 
159
161
  @given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
162
+ @mark.flaky
160
163
  @settings(max_examples=1, phases={Phase.generate})
161
164
  @SKIPIF_CI_AND_NOT_LINUX
162
165
  async def test_text(self, *, messages: Sequence[str]) -> None:
@@ -183,6 +186,7 @@ class TestPublish:
183
186
 
184
187
  class TestPublisher:
185
188
  @given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
189
+ @mark.flaky
186
190
  @settings(max_examples=1, phases={Phase.generate})
187
191
  @SKIPIF_CI_AND_NOT_LINUX
188
192
  async def test_main(self, *, messages: Sequence[str]) -> None:
@@ -210,6 +214,7 @@ class TestPublisher:
210
214
  raise PublisherError(publisher=publisher)
211
215
 
212
216
  @given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
217
+ @mark.flaky
213
218
  @settings(max_examples=1, phases={Phase.generate})
214
219
  @SKIPIF_CI_AND_NOT_LINUX
215
220
  async def test_main_service(self, *, messages: Sequence[str]) -> None:
@@ -299,6 +304,7 @@ class TestPublishServiceMixin:
299
304
 
300
305
  class TestRedisHashMapKey:
301
306
  @given(key=int64s(), value=booleans())
307
+ @mark.flaky
302
308
  @settings(max_examples=1, phases={Phase.generate})
303
309
  @SKIPIF_CI_AND_NOT_LINUX
304
310
  async def test_get_and_set_bool(self, *, key: int, value: bool) -> None:
@@ -308,6 +314,7 @@ class TestRedisHashMapKey:
308
314
  assert await hm_key.get(redis, key) is value
309
315
 
310
316
  @given(key=booleans() | int64s(), value=booleans())
317
+ @mark.flaky
311
318
  @settings(max_examples=1, phases={Phase.generate})
312
319
  @SKIPIF_CI_AND_NOT_LINUX
313
320
  async def test_get_and_set_union_key(self, *, key: bool | int, value: bool) -> None:
@@ -317,6 +324,7 @@ class TestRedisHashMapKey:
317
324
  assert await hm_key.get(redis, key) is value
318
325
 
319
326
  @given(value=booleans())
327
+ @mark.flaky
320
328
  @settings(max_examples=1, phases={Phase.generate})
321
329
  @SKIPIF_CI_AND_NOT_LINUX
322
330
  async def test_get_and_set_sentinel_key(self, *, value: bool) -> None:
@@ -331,6 +339,7 @@ class TestRedisHashMapKey:
331
339
  assert await hm_key.get(redis, sentinel) is value
332
340
 
333
341
  @given(key=int64s(), value=int64s() | booleans())
342
+ @mark.flaky
334
343
  @settings(max_examples=1, phases={Phase.generate})
335
344
  @SKIPIF_CI_AND_NOT_LINUX
336
345
  async def test_get_and_set_union_value(
@@ -342,6 +351,7 @@ class TestRedisHashMapKey:
342
351
  assert await hm_key.get(redis, key) == value
343
352
 
344
353
  @given(key=int64s())
354
+ @mark.flaky
345
355
  @settings(max_examples=1, phases={Phase.generate})
346
356
  @SKIPIF_CI_AND_NOT_LINUX
347
357
  async def test_get_and_set_sentinel_value(self, *, key: int) -> None:
@@ -364,6 +374,7 @@ class TestRedisHashMapKey:
364
374
  assert await hm_key.get(redis, key) is sentinel
365
375
 
366
376
  @given(data=data(), mapping=dictionaries(int64s(), booleans()))
377
+ @mark.flaky
367
378
  @settings(max_examples=1, phases={Phase.generate})
368
379
  @SKIPIF_CI_AND_NOT_LINUX
369
380
  async def test_get_and_set_many(
@@ -380,6 +391,7 @@ class TestRedisHashMapKey:
380
391
  assert await hm_key.get_many(redis, keys) == expected
381
392
 
382
393
  @given(key=int64s(), value=booleans())
394
+ @mark.flaky
383
395
  @settings(max_examples=1, phases={Phase.generate})
384
396
  @SKIPIF_CI_AND_NOT_LINUX
385
397
  async def test_delete(self, *, key: int, value: bool) -> None:
@@ -392,6 +404,7 @@ class TestRedisHashMapKey:
392
404
  _ = await hm_key.get(redis, key)
393
405
 
394
406
  @given(key=pairs(int64s()), value=booleans())
407
+ @mark.flaky
395
408
  @settings(max_examples=1, phases={Phase.generate})
396
409
  @SKIPIF_CI_AND_NOT_LINUX
397
410
  async def test_delete_compound(self, *, key: tuple[int, int], value: bool) -> None:
@@ -404,6 +417,7 @@ class TestRedisHashMapKey:
404
417
  _ = await hm_key.get(redis, key)
405
418
 
406
419
  @given(key=int64s(), value=booleans())
420
+ @mark.flaky
407
421
  @settings(max_examples=1, phases={Phase.generate})
408
422
  @SKIPIF_CI_AND_NOT_LINUX
409
423
  async def test_exists(self, *, key: int, value: bool) -> None:
@@ -414,6 +428,7 @@ class TestRedisHashMapKey:
414
428
  assert await hm_key.exists(redis, key)
415
429
 
416
430
  @given(key=pairs(int64s()), value=booleans())
431
+ @mark.flaky
417
432
  @settings(max_examples=1, phases={Phase.generate})
418
433
  @SKIPIF_CI_AND_NOT_LINUX
419
434
  async def test_exists_compound(self, *, key: tuple[int, int], value: bool) -> None:
@@ -424,6 +439,7 @@ class TestRedisHashMapKey:
424
439
  assert await hm_key.exists(redis, key)
425
440
 
426
441
  @given(mapping=dictionaries(int64s(), booleans()))
442
+ @mark.flaky
427
443
  @settings(max_examples=1, phases={Phase.generate})
428
444
  @SKIPIF_CI_AND_NOT_LINUX
429
445
  async def test_get_all(self, *, mapping: Mapping[int, bool]) -> None:
@@ -433,6 +449,7 @@ class TestRedisHashMapKey:
433
449
  assert await hm_key.get_all(redis) == mapping
434
450
 
435
451
  @given(mapping=dictionaries(int64s(), booleans()))
452
+ @mark.flaky
436
453
  @settings(max_examples=1, phases={Phase.generate})
437
454
  @SKIPIF_CI_AND_NOT_LINUX
438
455
  async def test_keys(self, *, mapping: Mapping[int, bool]) -> None:
@@ -442,6 +459,7 @@ class TestRedisHashMapKey:
442
459
  assert await hm_key.keys(redis) == list(mapping)
443
460
 
444
461
  @given(mapping=dictionaries(int64s(), booleans()))
462
+ @mark.flaky
445
463
  @settings(max_examples=1, phases={Phase.generate})
446
464
  @SKIPIF_CI_AND_NOT_LINUX
447
465
  async def test_length(self, *, mapping: Mapping[int, bool]) -> None:
@@ -451,6 +469,7 @@ class TestRedisHashMapKey:
451
469
  assert await hm_key.length(redis) == len(mapping)
452
470
 
453
471
  @given(key=int64s(), value=booleans())
472
+ @mark.flaky
454
473
  @settings(max_examples=1, phases={Phase.generate})
455
474
  @SKIPIF_CI_AND_NOT_LINUX
456
475
  async def test_ttl(self, *, key: int, value: bool) -> None:
@@ -463,6 +482,7 @@ class TestRedisHashMapKey:
463
482
  assert not await redis.exists(hm_key.name)
464
483
 
465
484
  @given(mapping=dictionaries(int64s(), booleans()))
485
+ @mark.flaky
466
486
  @settings(max_examples=1, phases={Phase.generate})
467
487
  @SKIPIF_CI_AND_NOT_LINUX
468
488
  async def test_values(self, *, mapping: Mapping[int, bool]) -> None:
@@ -474,6 +494,7 @@ class TestRedisHashMapKey:
474
494
 
475
495
  class TestRedisKey:
476
496
  @given(value=booleans())
497
+ @mark.flaky
477
498
  @settings(max_examples=1, phases={Phase.generate})
478
499
  @SKIPIF_CI_AND_NOT_LINUX
479
500
  async def test_get_and_set_bool(self, *, value: bool) -> None:
@@ -483,6 +504,7 @@ class TestRedisKey:
483
504
  assert await key.get(redis) is value
484
505
 
485
506
  @given(value=booleans() | int64s())
507
+ @mark.flaky
486
508
  @settings(max_examples=1, phases={Phase.generate})
487
509
  @SKIPIF_CI_AND_NOT_LINUX
488
510
  async def test_get_and_set_union(self, *, value: bool | int) -> None:
@@ -491,6 +513,7 @@ class TestRedisKey:
491
513
  _ = await key.set(redis, value)
492
514
  assert await key.get(redis) == value
493
515
 
516
+ @mark.flaky
494
517
  @SKIPIF_CI_AND_NOT_LINUX
495
518
  async def test_get_and_set_sentinel_with_serialize(self) -> None:
496
519
  def serializer(sentinel: Sentinel, /) -> bytes:
@@ -508,6 +531,7 @@ class TestRedisKey:
508
531
  assert await red_key.get(redis) is sentinel
509
532
 
510
533
  @given(value=booleans())
534
+ @mark.flaky
511
535
  @settings(max_examples=1, phases={Phase.generate})
512
536
  @SKIPIF_CI_AND_NOT_LINUX
513
537
  async def test_delete(self, *, value: bool) -> None:
@@ -520,6 +544,7 @@ class TestRedisKey:
520
544
  _ = await key.get(redis)
521
545
 
522
546
  @given(value=booleans())
547
+ @mark.flaky
523
548
  @settings(max_examples=1, phases={Phase.generate})
524
549
  @SKIPIF_CI_AND_NOT_LINUX
525
550
  async def test_exists(self, *, value: bool) -> None:
@@ -530,6 +555,7 @@ class TestRedisKey:
530
555
  assert await key.exists(redis)
531
556
 
532
557
  @given(value=booleans())
558
+ @mark.flaky
533
559
  @settings(max_examples=1, phases={Phase.generate})
534
560
  @SKIPIF_CI_AND_NOT_LINUX
535
561
  async def test_ttl(self, *, value: bool) -> None:
@@ -544,6 +570,7 @@ class TestRedisKey:
544
570
 
545
571
  class TestSubscribe:
546
572
  @given(messages=lists(binary(min_size=1), min_size=1, max_size=5))
573
+ @mark.flaky
547
574
  @settings(max_examples=1, phases={Phase.generate})
548
575
  @SKIPIF_CI_AND_NOT_LINUX
549
576
  async def test_bytes(self, *, messages: Sequence[bytes]) -> None:
@@ -564,6 +591,7 @@ class TestSubscribe:
564
591
  assert result == message
565
592
 
566
593
  @given(objs=lists(make_objects(), min_size=1, max_size=5))
594
+ @mark.flaky
567
595
  @settings(max_examples=1, phases={Phase.generate})
568
596
  @SKIPIF_CI_AND_NOT_LINUX
569
597
  async def test_deserialize(self, *, objs: Sequence[Any]) -> None:
@@ -587,6 +615,7 @@ class TestSubscribe:
587
615
  short_messages=lists(text_ascii(max_size=4), min_size=1, max_size=5),
588
616
  long_messages=lists(text_ascii(min_size=6), min_size=1, max_size=5),
589
617
  )
618
+ @mark.flaky
590
619
  @settings(max_examples=1, phases={Phase.generate})
591
620
  @SKIPIF_CI_AND_NOT_LINUX
592
621
  async def test_filter(
@@ -614,6 +643,7 @@ class TestSubscribe:
614
643
  assert len(result) >= 3
615
644
 
616
645
  @given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
646
+ @mark.flaky
617
647
  @settings(max_examples=1, phases={Phase.generate})
618
648
  @SKIPIF_CI_AND_NOT_LINUX
619
649
  async def test_raw(self, *, messages: Sequence[str]) -> None:
@@ -637,6 +667,7 @@ class TestSubscribe:
637
667
  assert result["data"] == message.encode()
638
668
 
639
669
  @given(messages=lists(text_ascii(min_size=1), min_size=1, max_size=5))
670
+ @mark.flaky
640
671
  @settings(max_examples=1, phases={Phase.generate})
641
672
  @SKIPIF_CI_AND_NOT_LINUX
642
673
  async def test_text(self, *, messages: Sequence[str]) -> None:
@@ -662,6 +693,7 @@ class TestSubscribe:
662
693
 
663
694
  class TestSubscribeService:
664
695
  @given(objects=lists(make_objects(), min_size=1, max_size=5))
696
+ @mark.flaky
665
697
  @settings(max_examples=1, phases={Phase.generate})
666
698
  @SKIPIF_CI_AND_NOT_LINUX
667
699
  async def test_main(self, *, objects: list[str]) -> None:
@@ -679,6 +711,7 @@ class TestSubscribeService:
679
711
  for result, obj in zip(results, objects, strict=True):
680
712
  assert is_equal(result, obj)
681
713
 
714
+ @mark.flaky
682
715
  @SKIPIF_CI_AND_NOT_LINUX
683
716
  async def test_context_manager_already_subscribing(
684
717
  self, *, caplog: LogCaptureFixture
@@ -0,0 +1,87 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from hypothesis import given
6
+ from hypothesis.strategies import sampled_from
7
+
8
+ from utilities.reprlib import (
9
+ get_call_args_mapping,
10
+ get_repr,
11
+ get_repr_and_class,
12
+ yield_call_args_repr,
13
+ yield_mapping_repr,
14
+ )
15
+
16
+
17
+ class TestGetCallArgsMapping:
18
+ def test_main(self) -> None:
19
+ mapping = get_call_args_mapping(1, 2, 3, x=4, y=5, z=6)
20
+ expected = {
21
+ "args[0]": 1,
22
+ "args[1]": 2,
23
+ "args[2]": 3,
24
+ "kwargs[x]": 4,
25
+ "kwargs[y]": 5,
26
+ "kwargs[z]": 6,
27
+ }
28
+ assert mapping == expected
29
+
30
+
31
+ class TestGetRepr:
32
+ @given(
33
+ case=sampled_from([
34
+ (None, "None"),
35
+ (0, "0"),
36
+ (
37
+ list(range(21)),
38
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +1]",
39
+ ),
40
+ ])
41
+ )
42
+ def test_main(self, *, case: tuple[Any, str]) -> None:
43
+ obj, expected = case
44
+ result = get_repr(obj)
45
+ assert result == expected
46
+
47
+
48
+ class TestGetReprAndClass:
49
+ @given(
50
+ case=sampled_from([
51
+ (None, "Object 'None' of type 'NoneType'"),
52
+ (0, "Object '0' of type 'int'"),
53
+ ])
54
+ )
55
+ def test_main(self, *, case: tuple[Any, str]) -> None:
56
+ obj, expected = case
57
+ result = get_repr_and_class(obj)
58
+ assert result == expected
59
+
60
+
61
+ class TestYieldCallArgsRepr:
62
+ def test_main(self) -> None:
63
+ lines = list(
64
+ yield_call_args_repr(1, 2, list(range(100)), d=4, e=5, f=list(range(100)))
65
+ )
66
+ expected = [
67
+ "args[0] = 1",
68
+ "args[1] = 2",
69
+ "args[2] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
70
+ "kwargs[d] = 4",
71
+ "kwargs[e] = 5",
72
+ "kwargs[f] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
73
+ ]
74
+ assert lines == expected
75
+
76
+
77
+ class TestYieldMappingRepr:
78
+ def test_main(self) -> None:
79
+ mapping = {"a": 1, "b": 2, "c": 3, "d": list(range(100))}
80
+ lines = list(yield_mapping_repr(mapping))
81
+ expected = [
82
+ "a = 1",
83
+ "b = 2",
84
+ "c = 3",
85
+ "d = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +80]",
86
+ ]
87
+ assert lines == expected
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.126.11"
3
+ __version__ = "0.126.12"
@@ -0,0 +1,158 @@
1
+ from __future__ import annotations
2
+
3
+ import reprlib
4
+ from functools import partial
5
+ from typing import TYPE_CHECKING, Any
6
+
7
+ if TYPE_CHECKING:
8
+ from collections.abc import Iterator
9
+
10
+ from utilities.types import StrMapping
11
+
12
+ RICH_MAX_WIDTH: int = 80
13
+ RICH_INDENT_SIZE: int = 4
14
+ RICH_MAX_LENGTH: int | None = 20
15
+ RICH_MAX_STRING: int | None = None
16
+ RICH_MAX_DEPTH: int | None = None
17
+ RICH_EXPAND_ALL: bool = False
18
+
19
+
20
+ ##
21
+
22
+
23
+ def get_call_args_mapping(*args: Any, **kwargs: Any) -> StrMapping:
24
+ """Get the representation of a set of call arguments."""
25
+ return {f"args[{i}]": v for i, v in enumerate(args)} | {
26
+ f"kwargs[{k}]": v for k, v in kwargs.items()
27
+ }
28
+
29
+
30
+ ##
31
+
32
+
33
+ def get_repr(
34
+ obj: Any,
35
+ /,
36
+ *,
37
+ max_width: int = RICH_MAX_WIDTH,
38
+ indent_size: int = RICH_INDENT_SIZE,
39
+ max_length: int | None = RICH_MAX_LENGTH,
40
+ max_string: int | None = RICH_MAX_STRING,
41
+ max_depth: int | None = RICH_MAX_DEPTH,
42
+ expand_all: bool = RICH_EXPAND_ALL,
43
+ ) -> str:
44
+ """Get the representation of an object."""
45
+ try:
46
+ from rich.pretty import pretty_repr
47
+ except ModuleNotFoundError: # pragma: no cover
48
+ return reprlib.repr(obj)
49
+ return pretty_repr(
50
+ obj,
51
+ max_width=max_width,
52
+ indent_size=indent_size,
53
+ max_length=max_length,
54
+ max_string=max_string,
55
+ max_depth=max_depth,
56
+ expand_all=expand_all,
57
+ )
58
+
59
+
60
+ ##
61
+
62
+
63
+ def get_repr_and_class(
64
+ obj: Any,
65
+ /,
66
+ *,
67
+ max_width: int = RICH_MAX_WIDTH,
68
+ indent_size: int = RICH_INDENT_SIZE,
69
+ max_length: int | None = RICH_MAX_LENGTH,
70
+ max_string: int | None = RICH_MAX_STRING,
71
+ max_depth: int | None = RICH_MAX_DEPTH,
72
+ expand_all: bool = RICH_EXPAND_ALL,
73
+ ) -> str:
74
+ """Get the `reprlib`-representation & class of an object."""
75
+ repr_use = get_repr(
76
+ obj,
77
+ max_width=max_width,
78
+ indent_size=indent_size,
79
+ max_length=max_length,
80
+ max_string=max_string,
81
+ max_depth=max_depth,
82
+ expand_all=expand_all,
83
+ )
84
+ return f"Object {repr_use!r} of type {type(obj).__name__!r}"
85
+
86
+
87
+ ##
88
+
89
+
90
+ def yield_call_args_repr(
91
+ *args: Any,
92
+ _max_width: int = RICH_MAX_WIDTH,
93
+ _indent_size: int = RICH_INDENT_SIZE,
94
+ _max_length: int | None = RICH_MAX_LENGTH,
95
+ _max_string: int | None = RICH_MAX_STRING,
96
+ _max_depth: int | None = RICH_MAX_DEPTH,
97
+ _expand_all: bool = RICH_EXPAND_ALL,
98
+ **kwargs: Any,
99
+ ) -> Iterator[str]:
100
+ """Pretty print of a set of positional/keyword arguments."""
101
+ mapping = get_call_args_mapping(*args, **kwargs)
102
+ return yield_mapping_repr(
103
+ mapping,
104
+ _max_width=_max_width,
105
+ _indent_size=_indent_size,
106
+ _max_length=_max_length,
107
+ _max_string=_max_string,
108
+ _max_depth=_max_depth,
109
+ _expand_all=_expand_all,
110
+ )
111
+
112
+
113
+ ##
114
+
115
+
116
+ def yield_mapping_repr(
117
+ mapping: StrMapping,
118
+ /,
119
+ *,
120
+ _max_width: int = RICH_MAX_WIDTH,
121
+ _indent_size: int = RICH_INDENT_SIZE,
122
+ _max_length: int | None = RICH_MAX_LENGTH,
123
+ _max_string: int | None = RICH_MAX_STRING,
124
+ _max_depth: int | None = RICH_MAX_DEPTH,
125
+ _expand_all: bool = RICH_EXPAND_ALL,
126
+ ) -> Iterator[str]:
127
+ """Pretty print of a set of keyword arguments."""
128
+ try:
129
+ from rich.pretty import pretty_repr
130
+ except ModuleNotFoundError: # pragma: no cover
131
+ repr_use = repr
132
+ else:
133
+ repr_use = partial(
134
+ pretty_repr,
135
+ max_width=_max_width,
136
+ indent_size=_indent_size,
137
+ max_length=_max_length,
138
+ max_string=_max_string,
139
+ max_depth=_max_depth,
140
+ expand_all=_expand_all,
141
+ )
142
+ for k, v in mapping.items():
143
+ yield f"{k} = {repr_use(v)}"
144
+
145
+
146
+ __all__ = [
147
+ "RICH_EXPAND_ALL",
148
+ "RICH_INDENT_SIZE",
149
+ "RICH_MAX_DEPTH",
150
+ "RICH_MAX_LENGTH",
151
+ "RICH_MAX_STRING",
152
+ "RICH_MAX_WIDTH",
153
+ "get_call_args_mapping",
154
+ "get_repr",
155
+ "get_repr_and_class",
156
+ "yield_call_args_repr",
157
+ "yield_mapping_repr",
158
+ ]
@@ -42,6 +42,8 @@ from utilities.reprlib import (
42
42
  RICH_MAX_LENGTH,
43
43
  RICH_MAX_STRING,
44
44
  RICH_MAX_WIDTH,
45
+ yield_call_args_repr,
46
+ yield_mapping_repr,
45
47
  )
46
48
  from utilities.types import TBaseException, TCallable
47
49
  from utilities.version import get_version
@@ -199,8 +201,6 @@ class _CallArgs:
199
201
  @classmethod
200
202
  def create(cls, func: Callable[..., Any], *args: Any, **kwargs: Any) -> Self:
201
203
  """Make the initial trace data."""
202
- from utilities.rich import yield_call_args_repr
203
-
204
204
  sig = signature(func)
205
205
  try:
206
206
  bound_args = sig.bind(*args, **kwargs)
@@ -437,8 +437,6 @@ class _Frame:
437
437
  depth: int = 0,
438
438
  ) -> str:
439
439
  """Format the traceback."""
440
- from utilities.rich import yield_call_args_repr, yield_mapping_repr
441
-
442
440
  lines: list[str] = [f"Frame {index + 1}/{total}: {self.name} ({self.module})"]
443
441
  if detail:
444
442
  lines.append(indent("Inputs:", _INDENT))
@@ -459,13 +457,13 @@ class _Frame:
459
457
  lines.extend(
460
458
  indent(line, 2 * _INDENT)
461
459
  for line in yield_mapping_repr(
460
+ self.locals,
462
461
  _max_width=self.max_width,
463
462
  _indent_size=self.indent_size,
464
463
  _max_length=self.max_length,
465
464
  _max_string=self.max_string,
466
465
  _max_depth=self.max_depth,
467
466
  _expand_all=self.expand_all,
468
- **self.locals,
469
467
  )
470
468
  )
471
469
  lines.extend([
@@ -1,38 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Any
4
-
5
- from hypothesis import given
6
- from hypothesis.strategies import sampled_from
7
-
8
- from utilities.reprlib import get_repr, get_repr_and_class
9
-
10
-
11
- class TestGetRepr:
12
- @given(
13
- case=sampled_from([
14
- (None, "None"),
15
- (0, "0"),
16
- (
17
- list(range(21)),
18
- "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... +1]",
19
- ),
20
- ])
21
- )
22
- def test_main(self, *, case: tuple[Any, str]) -> None:
23
- obj, expected = case
24
- result = get_repr(obj)
25
- assert result == expected
26
-
27
-
28
- class TestGetReprAndClass:
29
- @given(
30
- case=sampled_from([
31
- (None, "Object 'None' of type 'NoneType'"),
32
- (0, "Object '0' of type 'int'"),
33
- ])
34
- )
35
- def test_main(self, *, case: tuple[Any, str]) -> None:
36
- obj, expected = case
37
- result = get_repr_and_class(obj)
38
- assert result == expected
@@ -1,24 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from utilities.rich import yield_call_args_repr, yield_mapping_repr
4
-
5
-
6
- class TestYieldCallArgsRepr:
7
- def test_main(self) -> None:
8
- lines = list(yield_call_args_repr(1, 2, 3, x=4, y=5, z=6))
9
- expected = [
10
- "args[0] = 1",
11
- "args[1] = 2",
12
- "args[2] = 3",
13
- "kwargs[x] = 4",
14
- "kwargs[y] = 5",
15
- "kwargs[z] = 6",
16
- ]
17
- assert lines == expected
18
-
19
-
20
- class TestYieldMappingRepr:
21
- def test_main(self) -> None:
22
- lines = list(yield_mapping_repr(a=1, b=2, c=3))
23
- expected = ["a = 1", "b = 2", "c = 3"]
24
- assert lines == expected