dycw-utilities 0.109.24__tar.gz → 0.109.25__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.109.24 → dycw_utilities-0.109.25}/PKG-INFO +1 -1
  2. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/pyproject.toml +2 -2
  3. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pqdm.py +3 -3
  4. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_text.py +13 -0
  5. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/dataclasses.py +3 -5
  7. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/text.py +58 -4
  8. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/types.py +2 -0
  9. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/.gitignore +0 -0
  10. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/LICENSE +0 -0
  11. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/README.md +0 -0
  12. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/__init__.py +0 -0
  13. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/conftest.py +0 -0
  14. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/__init__.py +0 -0
  15. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_missing/__init__.py +0 -0
  16. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_missing/module.py +0 -0
  17. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_with/__init__.py +0 -0
  18. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_with/outer_1.py +0 -0
  19. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_with/outer_2.py +0 -0
  20. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  21. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  22. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  23. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  24. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_without/__init__.py +0 -0
  25. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_without/module_1.py +0 -0
  26. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/package_without/module_2.py +0 -0
  27. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/standalone.py +0 -0
  28. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/modules/with_imports.py +0 -0
  29. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  30. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  31. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  32. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  33. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  34. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  35. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  36. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  37. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/scripts/__init__.py +0 -0
  38. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/__init__.py +0 -0
  39. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/__main__.py +0 -0
  40. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/run.sh +0 -0
  41. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  42. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  43. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  44. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_altair.py +0 -0
  45. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_astor.py +0 -0
  46. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_asyncio.py +0 -0
  47. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_atomicwrites.py +0 -0
  48. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_atools.py +0 -0
  49. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_cachetools.py +0 -0
  50. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_click.py +0 -0
  51. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_concurrent.py +0 -0
  52. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_contextlib.py +0 -0
  53. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_contextvars.py +0 -0
  54. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_cryptography.py +0 -0
  55. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_cvxpy.py +0 -0
  56. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_dataclasses.py +0 -0
  57. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_datetime.py +0 -0
  58. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_enum.py +0 -0
  59. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_errors.py +0 -0
  60. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_eventkit.py +0 -0
  61. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_fastapi.py +0 -0
  62. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_fpdf2.py +0 -0
  63. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_functions.py +0 -0
  64. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_functools.py +0 -0
  65. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_getpass.py +0 -0
  66. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_git.py +0 -0
  67. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_hashlib.py +0 -0
  68. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_http.py +0 -0
  69. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_hypothesis.py +0 -0
  70. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_ipython.py +0 -0
  71. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_iterables.py +0 -0
  72. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_jupyter.py +0 -0
  73. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_lightweight_charts.py +0 -0
  74. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_logging.py +0 -0
  75. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_loguru.py +0 -0
  76. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_luigi.py +0 -0
  77. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_math.py +0 -0
  78. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_memory_profiler.py +0 -0
  79. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_modules.py +0 -0
  80. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_more_itertools.py +0 -0
  81. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_numpy.py +0 -0
  82. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_operator.py +0 -0
  83. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_optuna.py +0 -0
  84. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_orjson.py +0 -0
  85. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_os.py +0 -0
  86. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_parse.py +0 -0
  87. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pathlib.py +0 -0
  88. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_period.py +0 -0
  89. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pickle.py +0 -0
  90. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_platform.py +0 -0
  91. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_polars.py +0 -0
  92. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_polars_ols.py +0 -0
  93. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pydantic.py +0 -0
  94. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pyinstrument.py +0 -0
  95. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pyrsistent.py +0 -0
  96. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pytest.py +0 -0
  97. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_pytest_regressions.py +0 -0
  98. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_python_dotenv.py +0 -0
  99. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_random.py +0 -0
  100. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_re.py +0 -0
  101. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_redis.py +0 -0
  102. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_reprlib.py +0 -0
  103. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_rich.py +0 -0
  104. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_scipy.py +0 -0
  105. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_sentinel.py +0 -0
  106. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_shelve.py +0 -0
  107. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_slack_sdk.py +0 -0
  108. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_socket.py +0 -0
  109. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_sqlalchemy.py +0 -0
  110. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_sqlalchemy_polars.py +0 -0
  111. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_statsmodel.py +0 -0
  112. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_streamlit.py +0 -0
  113. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_sys.py +0 -0
  114. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_tempfile.py +0 -0
  115. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_tenacity.py +0 -0
  116. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_threading.py +0 -0
  117. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_timer.py +0 -0
  118. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback.py +0 -0
  119. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/__init__.py +0 -0
  120. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/chain.py +0 -0
  121. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  122. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  123. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  124. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/many.py +0 -0
  125. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/one.py +0 -0
  126. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/recursive.py +0 -0
  127. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  128. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  129. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/two.py +0 -0
  130. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/untraced.py +0 -0
  131. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_types.py +0 -0
  132. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_typing.py +0 -0
  133. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/__init__.py +0 -0
  134. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/no_future.py +0 -0
  135. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/with_future.py +0 -0
  136. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_tzdata.py +0 -0
  137. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_tzlocal.py +0 -0
  138. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_uuid.py +0 -0
  139. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_version.py +0 -0
  140. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_warnings.py +0 -0
  141. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_whenever.py +0 -0
  142. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_zipfile.py +0 -0
  143. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/tests/test_zoneinfo.py +0 -0
  144. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/altair.py +0 -0
  145. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/astor.py +0 -0
  146. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/asyncio.py +0 -0
  147. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/atomicwrites.py +0 -0
  148. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/atools.py +0 -0
  149. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/cachetools.py +0 -0
  150. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/click.py +0 -0
  151. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/concurrent.py +0 -0
  152. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/contextlib.py +0 -0
  153. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/contextvars.py +0 -0
  154. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/cryptography.py +0 -0
  155. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/cvxpy.py +0 -0
  156. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/datetime.py +0 -0
  157. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/enum.py +0 -0
  158. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/errors.py +0 -0
  159. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/eventkit.py +0 -0
  160. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/fastapi.py +0 -0
  161. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/fpdf2.py +0 -0
  162. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/functions.py +0 -0
  163. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/functools.py +0 -0
  164. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/getpass.py +0 -0
  165. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/git.py +0 -0
  166. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/hashlib.py +0 -0
  167. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/http.py +0 -0
  168. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/hypothesis.py +0 -0
  169. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/ipython.py +0 -0
  170. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/iterables.py +0 -0
  171. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/jupyter.py +0 -0
  172. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/lightweight_charts.py +0 -0
  173. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/logging.py +0 -0
  174. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/loguru.py +0 -0
  175. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/luigi.py +0 -0
  176. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/math.py +0 -0
  177. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/memory_profiler.py +0 -0
  178. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/modules.py +0 -0
  179. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/more_itertools.py +0 -0
  180. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/numpy.py +0 -0
  181. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/operator.py +0 -0
  182. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/optuna.py +0 -0
  183. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/orjson.py +0 -0
  184. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/os.py +0 -0
  185. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/parse.py +0 -0
  186. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pathlib.py +0 -0
  187. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/period.py +0 -0
  188. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pickle.py +0 -0
  189. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/platform.py +0 -0
  190. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/polars.py +0 -0
  191. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/polars_ols.py +0 -0
  192. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pqdm.py +0 -0
  193. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/py.typed +0 -0
  194. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pydantic.py +0 -0
  195. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pyinstrument.py +0 -0
  196. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pyrsistent.py +0 -0
  197. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pytest.py +0 -0
  198. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/pytest_regressions.py +0 -0
  199. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/python_dotenv.py +0 -0
  200. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/random.py +0 -0
  201. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/re.py +0 -0
  202. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/redis.py +0 -0
  203. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/reprlib.py +0 -0
  204. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/rich.py +0 -0
  205. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/scipy.py +0 -0
  206. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/sentinel.py +0 -0
  207. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/shelve.py +0 -0
  208. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/slack_sdk.py +0 -0
  209. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/socket.py +0 -0
  210. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/sqlalchemy.py +0 -0
  211. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/sqlalchemy_polars.py +0 -0
  212. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/statsmodels.py +0 -0
  213. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/streamlit.py +0 -0
  214. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/sys.py +0 -0
  215. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/tempfile.py +0 -0
  216. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/tenacity.py +0 -0
  217. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/threading.py +0 -0
  218. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/timer.py +0 -0
  219. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/traceback.py +0 -0
  220. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/typing.py +0 -0
  221. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/tzdata.py +0 -0
  222. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/tzlocal.py +0 -0
  223. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/uuid.py +0 -0
  224. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/version.py +0 -0
  225. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/warnings.py +0 -0
  226. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/whenever.py +0 -0
  227. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/zipfile.py +0 -0
  228. {dycw_utilities-0.109.24 → dycw_utilities-0.109.25}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.109.24
3
+ Version: 0.109.25
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -93,7 +93,7 @@ dependencies = [
93
93
  name = "dycw-utilities"
94
94
  readme = "README.md"
95
95
  requires-python = ">= 3.12"
96
- version = "0.109.24"
96
+ version = "0.109.25"
97
97
 
98
98
  [project.optional-dependencies]
99
99
  test = [
@@ -336,7 +336,7 @@ zzz-test-zoneinfo = [
336
336
  # bump-my-version
337
337
  [tool.bumpversion]
338
338
  allow_dirty = true
339
- current_version = "0.109.24"
339
+ current_version = "0.109.25"
340
340
 
341
341
  [[tool.bumpversion.files]]
342
342
  filename = "src/utilities/__init__.py"
@@ -14,11 +14,11 @@ from utilities.hypothesis import int32s, pairs, settings_with_reduced_examples
14
14
  from utilities.iterables import transpose
15
15
  from utilities.pqdm import _get_desc, pqdm_map, pqdm_starmap
16
16
  from utilities.sentinel import Sentinel, sentinel
17
- from utilities.types import Parallelism
17
+ from utilities.types import Parallelism, StrStrMapping
18
18
  from utilities.typing import get_args
19
19
 
20
20
  if TYPE_CHECKING:
21
- from collections.abc import Callable, Mapping
21
+ from collections.abc import Callable
22
22
 
23
23
 
24
24
  class TestGetDesc:
@@ -36,7 +36,7 @@ class TestGetDesc:
36
36
  *,
37
37
  desc: str | None | Sentinel,
38
38
  func: Callable[..., Any],
39
- expected: Mapping[str, str],
39
+ expected: StrStrMapping,
40
40
  ) -> None:
41
41
  assert _get_desc(desc, func) == expected
42
42
 
@@ -20,6 +20,7 @@ from utilities.hypothesis import text_ascii
20
20
  from utilities.text import (
21
21
  ParseBoolError,
22
22
  ParseNoneError,
23
+ SplitKeyValuePairsError,
23
24
  SplitStrError,
24
25
  join_strs,
25
26
  parse_bool,
@@ -92,6 +93,18 @@ class TestSplitKeyValuePairs:
92
93
  result = split_key_value_pairs(text)
93
94
  assert result == expected
94
95
 
96
+ def test_mapping(self) -> None:
97
+ result = split_key_value_pairs("a=1,b=22,c=333", mapping=True)
98
+ expected = {"a": "1", "b": "22", "c": "333"}
99
+ assert result == expected
100
+
101
+ def test_error(self) -> None:
102
+ with raises(
103
+ SplitKeyValuePairsError,
104
+ match=r"Unable to split 'a=1,a=22,a=333' into a mapping since there are duplicate keys; got \{'a': 3\}",
105
+ ):
106
+ _ = split_key_value_pairs("a=1,a=22,a=333", mapping=True)
107
+
95
108
 
96
109
  class TestSplitStrAndJoinStr:
97
110
  @given(
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.109.24"
3
+ __version__ = "0.109.25"
@@ -24,7 +24,7 @@ from utilities.iterables import OneStrEmptyError, OneStrNonUniqueError, one_str
24
24
  from utilities.operator import is_equal
25
25
  from utilities.parse import ParseTextError, parse_text
26
26
  from utilities.sentinel import Sentinel, sentinel
27
- from utilities.types import ParseTextExtra, TDataclass
27
+ from utilities.types import ParseTextExtra, StrStrMapping, TDataclass
28
28
  from utilities.typing import get_type_hints
29
29
 
30
30
  if TYPE_CHECKING:
@@ -444,7 +444,7 @@ class StrMappingToFieldMappingError(Exception):
444
444
 
445
445
 
446
446
  def text_to_dataclass(
447
- text_or_mapping: str | Mapping[str, str],
447
+ text_or_mapping: str | StrStrMapping,
448
448
  cls: type[TDataclass],
449
449
  /,
450
450
  *,
@@ -499,9 +499,7 @@ def text_to_dataclass(
499
499
  )
500
500
 
501
501
 
502
- def _text_to_dataclass_split_text(
503
- text: str, cls: type[TDataclass], /
504
- ) -> Mapping[str, str]:
502
+ def _text_to_dataclass_split_text(text: str, cls: type[TDataclass], /) -> StrStrMapping:
505
503
  pairs = (t for t in text.split(",") if t != "")
506
504
  return dict(_text_to_dataclass_split_key_value_pair(pair, cls) for pair in pairs)
507
505
 
@@ -6,8 +6,13 @@ from re import IGNORECASE, Match, search
6
6
  from textwrap import dedent
7
7
  from typing import TYPE_CHECKING, Any, Literal, overload, override
8
8
 
9
+ from utilities.iterables import CheckDuplicatesError, check_duplicates
10
+ from utilities.reprlib import get_repr
11
+
9
12
  if TYPE_CHECKING:
10
- from collections.abc import Iterable, Sequence
13
+ from collections.abc import Iterable, Mapping, Sequence
14
+
15
+ from utilities.types import StrStrMapping
11
16
 
12
17
 
13
18
  def parse_bool(text: str, /) -> bool:
@@ -81,14 +86,63 @@ def _snake_case_title(match: Match[str], /) -> str:
81
86
  ##
82
87
 
83
88
 
89
+ @overload
90
+ def split_key_value_pairs(
91
+ text: str,
92
+ /,
93
+ *,
94
+ list_separator: str = ",",
95
+ pair_separator: str = "=",
96
+ mapping: Literal[True],
97
+ ) -> StrStrMapping: ...
98
+ @overload
99
+ def split_key_value_pairs(
100
+ text: str,
101
+ /,
102
+ *,
103
+ list_separator: str = ",",
104
+ pair_separator: str = "=",
105
+ mapping: Literal[False] = False,
106
+ ) -> Sequence[tuple[str, str]]: ...
107
+ @overload
108
+ def split_key_value_pairs(
109
+ text: str,
110
+ /,
111
+ *,
112
+ list_separator: str = ",",
113
+ pair_separator: str = "=",
114
+ mapping: bool = False,
115
+ ) -> Sequence[tuple[str, str]] | StrStrMapping: ...
84
116
  def split_key_value_pairs(
85
- text: str, /, *, list_separator: str = ",", pair_separator: str = "="
86
- ) -> Sequence[tuple[str, str]]:
117
+ text: str,
118
+ /,
119
+ *,
120
+ list_separator: str = ",",
121
+ pair_separator: str = "=",
122
+ mapping: bool = False,
123
+ ) -> Sequence[tuple[str, str]] | StrStrMapping:
87
124
  """Split a string into key-value pairs."""
88
- return [
125
+ pairs = [
89
126
  split_str(text_i, separator=pair_separator, n=2)
90
127
  for text_i in split_str(text, separator=list_separator)
91
128
  ]
129
+ if not mapping:
130
+ return pairs
131
+ try:
132
+ check_duplicates(k for k, _ in pairs)
133
+ except CheckDuplicatesError as error:
134
+ raise SplitKeyValuePairsError(text=text, counts=error.counts) from None
135
+ return dict(pairs)
136
+
137
+
138
+ @dataclass(kw_only=True, slots=True)
139
+ class SplitKeyValuePairsError(Exception):
140
+ text: str
141
+ counts: Mapping[str, int]
142
+
143
+ @override
144
+ def __str__(self) -> str:
145
+ return f"Unable to split {self.text!r} into a mapping since there are duplicate keys; got {get_repr(self.counts)}"
92
146
 
93
147
 
94
148
  ##
@@ -46,6 +46,7 @@ type OpenMode = Literal[
46
46
  "a+b",
47
47
  ]
48
48
  type StrMapping = Mapping[str, Any]
49
+ type StrStrMapping = Mapping[str, str]
49
50
  type TupleOrStrMapping = tuple[Any, ...] | StrMapping
50
51
  type MaybeCallable[_T] = _T | Callable[[], _T]
51
52
  type MaybeStr[_T] = _T | str
@@ -288,6 +289,7 @@ __all__ = [
288
289
  "RoundMode",
289
290
  "Seed",
290
291
  "StrMapping",
292
+ "StrStrMapping",
291
293
  "SupportsAbs",
292
294
  "SupportsAdd",
293
295
  "SupportsBytes",