dycw-utilities 0.109.23__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 (229) hide show
  1. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/PKG-INFO +1 -1
  2. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/pyproject.toml +2 -2
  3. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_iterables.py +5 -1
  4. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pqdm.py +3 -3
  5. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_text.py +68 -13
  6. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/__init__.py +1 -1
  7. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/click.py +35 -51
  8. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/dataclasses.py +3 -5
  9. dycw_utilities-0.109.25/src/utilities/text.py +249 -0
  10. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/types.py +2 -0
  11. dycw_utilities-0.109.23/src/utilities/text.py +0 -139
  12. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/.gitignore +0 -0
  13. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/LICENSE +0 -0
  14. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/README.md +0 -0
  15. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/__init__.py +0 -0
  16. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/conftest.py +0 -0
  17. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/__init__.py +0 -0
  18. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_missing/__init__.py +0 -0
  19. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_missing/module.py +0 -0
  20. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/__init__.py +0 -0
  21. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/outer_1.py +0 -0
  22. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/outer_2.py +0 -0
  23. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  24. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  25. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  26. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  27. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_without/__init__.py +0 -0
  28. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_without/module_1.py +0 -0
  29. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/package_without/module_2.py +0 -0
  30. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/standalone.py +0 -0
  31. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/modules/with_imports.py +0 -0
  32. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  33. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  34. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  35. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  36. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  37. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  38. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  39. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  40. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/__init__.py +0 -0
  41. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/__init__.py +0 -0
  42. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/__main__.py +0 -0
  43. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_async_service/run.sh +0 -0
  44. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  45. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  46. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  47. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_altair.py +0 -0
  48. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_astor.py +0 -0
  49. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_asyncio.py +0 -0
  50. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_atomicwrites.py +0 -0
  51. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_atools.py +0 -0
  52. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_cachetools.py +0 -0
  53. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_click.py +0 -0
  54. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_concurrent.py +0 -0
  55. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_contextlib.py +0 -0
  56. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_contextvars.py +0 -0
  57. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_cryptography.py +0 -0
  58. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_cvxpy.py +0 -0
  59. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_dataclasses.py +0 -0
  60. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_datetime.py +0 -0
  61. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_enum.py +0 -0
  62. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_errors.py +0 -0
  63. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_eventkit.py +0 -0
  64. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_fastapi.py +0 -0
  65. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_fpdf2.py +0 -0
  66. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_functions.py +0 -0
  67. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_functools.py +0 -0
  68. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_getpass.py +0 -0
  69. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_git.py +0 -0
  70. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_hashlib.py +0 -0
  71. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_http.py +0 -0
  72. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_hypothesis.py +0 -0
  73. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_ipython.py +0 -0
  74. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_jupyter.py +0 -0
  75. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_lightweight_charts.py +0 -0
  76. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_logging.py +0 -0
  77. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_loguru.py +0 -0
  78. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_luigi.py +0 -0
  79. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_math.py +0 -0
  80. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_memory_profiler.py +0 -0
  81. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_modules.py +0 -0
  82. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_more_itertools.py +0 -0
  83. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_numpy.py +0 -0
  84. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_operator.py +0 -0
  85. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_optuna.py +0 -0
  86. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_orjson.py +0 -0
  87. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_os.py +0 -0
  88. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_parse.py +0 -0
  89. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pathlib.py +0 -0
  90. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_period.py +0 -0
  91. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pickle.py +0 -0
  92. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_platform.py +0 -0
  93. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_polars.py +0 -0
  94. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_polars_ols.py +0 -0
  95. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pydantic.py +0 -0
  96. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pyinstrument.py +0 -0
  97. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pyrsistent.py +0 -0
  98. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pytest.py +0 -0
  99. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_pytest_regressions.py +0 -0
  100. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_python_dotenv.py +0 -0
  101. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_random.py +0 -0
  102. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_re.py +0 -0
  103. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_redis.py +0 -0
  104. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_reprlib.py +0 -0
  105. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_rich.py +0 -0
  106. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_scipy.py +0 -0
  107. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sentinel.py +0 -0
  108. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_shelve.py +0 -0
  109. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_slack_sdk.py +0 -0
  110. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_socket.py +0 -0
  111. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sqlalchemy.py +0 -0
  112. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sqlalchemy_polars.py +0 -0
  113. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_statsmodel.py +0 -0
  114. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_streamlit.py +0 -0
  115. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_sys.py +0 -0
  116. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tempfile.py +0 -0
  117. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tenacity.py +0 -0
  118. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_threading.py +0 -0
  119. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_timer.py +0 -0
  120. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback.py +0 -0
  121. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/__init__.py +0 -0
  122. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/chain.py +0 -0
  123. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  124. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  125. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  126. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/many.py +0 -0
  127. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/one.py +0 -0
  128. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/recursive.py +0 -0
  129. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  130. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  131. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/two.py +0 -0
  132. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_traceback_funcs/untraced.py +0 -0
  133. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_types.py +0 -0
  134. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing.py +0 -0
  135. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/__init__.py +0 -0
  136. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/no_future.py +0 -0
  137. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_typing_funcs/with_future.py +0 -0
  138. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tzdata.py +0 -0
  139. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_tzlocal.py +0 -0
  140. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_uuid.py +0 -0
  141. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_version.py +0 -0
  142. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_warnings.py +0 -0
  143. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_whenever.py +0 -0
  144. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_zipfile.py +0 -0
  145. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/tests/test_zoneinfo.py +0 -0
  146. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/altair.py +0 -0
  147. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/astor.py +0 -0
  148. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/asyncio.py +0 -0
  149. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/atomicwrites.py +0 -0
  150. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/atools.py +0 -0
  151. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/cachetools.py +0 -0
  152. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/concurrent.py +0 -0
  153. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/contextlib.py +0 -0
  154. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/contextvars.py +0 -0
  155. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/cryptography.py +0 -0
  156. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/cvxpy.py +0 -0
  157. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/datetime.py +0 -0
  158. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/enum.py +0 -0
  159. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/errors.py +0 -0
  160. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/eventkit.py +0 -0
  161. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/fastapi.py +0 -0
  162. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/fpdf2.py +0 -0
  163. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/functions.py +0 -0
  164. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/functools.py +0 -0
  165. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/getpass.py +0 -0
  166. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/git.py +0 -0
  167. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/hashlib.py +0 -0
  168. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/http.py +0 -0
  169. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/hypothesis.py +0 -0
  170. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/ipython.py +0 -0
  171. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/iterables.py +0 -0
  172. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/jupyter.py +0 -0
  173. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/lightweight_charts.py +0 -0
  174. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/logging.py +0 -0
  175. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/loguru.py +0 -0
  176. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/luigi.py +0 -0
  177. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/math.py +0 -0
  178. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/memory_profiler.py +0 -0
  179. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/modules.py +0 -0
  180. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/more_itertools.py +0 -0
  181. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/numpy.py +0 -0
  182. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/operator.py +0 -0
  183. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/optuna.py +0 -0
  184. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/orjson.py +0 -0
  185. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/os.py +0 -0
  186. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/parse.py +0 -0
  187. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pathlib.py +0 -0
  188. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/period.py +0 -0
  189. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pickle.py +0 -0
  190. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/platform.py +0 -0
  191. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/polars.py +0 -0
  192. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/polars_ols.py +0 -0
  193. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pqdm.py +0 -0
  194. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/py.typed +0 -0
  195. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pydantic.py +0 -0
  196. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pyinstrument.py +0 -0
  197. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pyrsistent.py +0 -0
  198. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pytest.py +0 -0
  199. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/pytest_regressions.py +0 -0
  200. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/python_dotenv.py +0 -0
  201. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/random.py +0 -0
  202. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/re.py +0 -0
  203. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/redis.py +0 -0
  204. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/reprlib.py +0 -0
  205. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/rich.py +0 -0
  206. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/scipy.py +0 -0
  207. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sentinel.py +0 -0
  208. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/shelve.py +0 -0
  209. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/slack_sdk.py +0 -0
  210. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/socket.py +0 -0
  211. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sqlalchemy.py +0 -0
  212. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sqlalchemy_polars.py +0 -0
  213. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/statsmodels.py +0 -0
  214. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/streamlit.py +0 -0
  215. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/sys.py +0 -0
  216. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tempfile.py +0 -0
  217. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tenacity.py +0 -0
  218. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/threading.py +0 -0
  219. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/timer.py +0 -0
  220. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/traceback.py +0 -0
  221. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/typing.py +0 -0
  222. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tzdata.py +0 -0
  223. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/tzlocal.py +0 -0
  224. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/uuid.py +0 -0
  225. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/version.py +0 -0
  226. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/warnings.py +0 -0
  227. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/whenever.py +0 -0
  228. {dycw_utilities-0.109.23 → dycw_utilities-0.109.25}/src/utilities/zipfile.py +0 -0
  229. {dycw_utilities-0.109.23 → 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.23
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.23"
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.23"
339
+ current_version = "0.109.25"
340
340
 
341
341
  [[tool.bumpversion.files]]
342
342
  filename = "src/utilities/__init__.py"
@@ -4,7 +4,7 @@ import re
4
4
  from dataclasses import dataclass, replace
5
5
  from enum import Enum, auto
6
6
  from itertools import chain, repeat
7
- from math import isfinite, isinf, isnan
7
+ from math import isfinite, isinf, isnan, nan
8
8
  from operator import add, neg, sub
9
9
  from re import DOTALL
10
10
  from typing import TYPE_CHECKING, Any, ClassVar, override
@@ -1359,6 +1359,10 @@ class TestSortIterablesCmpFloats:
1359
1359
  if isnan(x) is not isnan(y):
1360
1360
  assert result1 != result2
1361
1361
 
1362
+ def test_nan_vs_nan(self) -> None:
1363
+ result = _sort_iterable_cmp_floats(nan, nan)
1364
+ assert result == 0
1365
+
1362
1366
 
1363
1367
  class TestSumMappings:
1364
1368
  @given(mappings=lists(dictionaries(text_ascii(), integers())))
@@ -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
 
@@ -1,32 +1,41 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from typing import TYPE_CHECKING
4
+
3
5
  from hypothesis import given
4
6
  from hypothesis.strategies import (
5
7
  DataObject,
6
8
  booleans,
7
9
  data,
8
10
  integers,
11
+ just,
9
12
  lists,
13
+ none,
10
14
  sampled_from,
11
15
  sets,
12
16
  )
13
17
  from pytest import mark, param, raises
14
18
 
15
19
  from utilities.hypothesis import text_ascii
16
- from utilities.sentinel import sentinel
17
20
  from utilities.text import (
18
21
  ParseBoolError,
19
22
  ParseNoneError,
23
+ SplitKeyValuePairsError,
24
+ SplitStrError,
20
25
  join_strs,
21
26
  parse_bool,
22
27
  parse_none,
23
28
  repr_encode,
24
29
  snake_case,
30
+ split_key_value_pairs,
25
31
  split_str,
26
32
  str_encode,
27
33
  strip_and_dedent,
28
34
  )
29
35
 
36
+ if TYPE_CHECKING:
37
+ from collections.abc import Sequence
38
+
30
39
 
31
40
  class TestParseBool:
32
41
  @given(data=data(), value=booleans())
@@ -66,20 +75,60 @@ class TestReprEncode:
66
75
  assert result == expected
67
76
 
68
77
 
78
+ class TestSplitKeyValuePairs:
79
+ @given(
80
+ case=sampled_from([
81
+ ("", []),
82
+ ("a=1", [("a", "1")]),
83
+ ("a=1,b=22", [("a", "1"), ("b", "22")]),
84
+ ("a=1,b=22,c=333", [("a", "1"), ("b", "22"), ("c", "333")]),
85
+ ("=1", [("", "1")]),
86
+ ("a=", [("a", "")]),
87
+ ("a=1,=22,c=333", [("a", "1"), ("", "22"), ("c", "333")]),
88
+ ("a=1,b=,c=333", [("a", "1"), ("b", ""), ("c", "333")]),
89
+ ])
90
+ )
91
+ def test_main(self, *, case: tuple[str, Sequence[tuple[str, str]]]) -> None:
92
+ text, expected = case
93
+ result = split_key_value_pairs(text)
94
+ assert result == expected
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
+
108
+
69
109
  class TestSplitStrAndJoinStr:
70
- @mark.parametrize(
71
- ("text", "texts"),
72
- [
73
- param("", [""]),
74
- param("1", ["1"]),
75
- param("1,2", ["1", "2"]),
76
- param(",", ["", ""]),
77
- param(str(sentinel), []),
78
- ],
110
+ @given(
111
+ data=data(),
112
+ case=sampled_from([
113
+ ("", 0, []),
114
+ (r"\,", 1, [""]),
115
+ (",", 2, ["", ""]),
116
+ (",,", 3, ["", "", ""]),
117
+ ("1", 1, ["1"]),
118
+ ("1,22", 2, ["1", "22"]),
119
+ ("1,22,333", 3, ["1", "22", "333"]),
120
+ ("1,,333", 3, ["1", "", "333"]),
121
+ ]),
79
122
  )
80
- def test_main(self, *, text: str, texts: list[str]) -> None:
81
- assert split_str(text) == texts
82
- assert join_strs(texts) == text
123
+ def test_main(self, *, case: tuple[str, int, list[str]], data: DataObject) -> None:
124
+ text, n, expected = case
125
+ n_use = data.draw(just(n) | none())
126
+ result = split_str(text, n=n_use)
127
+ if n_use is None:
128
+ assert result == expected
129
+ else:
130
+ assert result == tuple(expected)
131
+ assert join_strs(result) == text
83
132
 
84
133
  @given(texts=lists(text_ascii()))
85
134
  def test_generic(self, *, texts: list[str]) -> None:
@@ -89,6 +138,12 @@ class TestSplitStrAndJoinStr:
89
138
  def test_sort(self, *, texts: set[str]) -> None:
90
139
  assert split_str(join_strs(texts, sort=True)) == sorted(texts)
91
140
 
141
+ def test_error(self) -> None:
142
+ with raises(
143
+ SplitStrError, match=r"Unable to split '1,22,333' into 4 part\(s\); got 3"
144
+ ):
145
+ _ = split_str("1,22,333", n=4)
146
+
92
147
 
93
148
  class TestSnakeCase:
94
149
  @given(
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.109.23"
3
+ __version__ = "0.109.25"
@@ -21,7 +21,6 @@ from utilities.datetime import EnsureMonthError, MonthLike, ensure_month
21
21
  from utilities.enum import EnsureEnumError, ensure_enum
22
22
  from utilities.functions import EnsureStrError, ensure_str, get_class_name
23
23
  from utilities.iterables import is_iterable_not_str
24
- from utilities.sentinel import SENTINEL_REPR
25
24
  from utilities.text import split_str
26
25
  from utilities.types import (
27
26
  DateLike,
@@ -245,13 +244,10 @@ class ZonedDateTime(ParamType):
245
244
  class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
246
245
  """A frozenset-valued parameter."""
247
246
 
248
- def __init__(
249
- self, param: _TParam, /, *, separator: str = ",", empty: str = SENTINEL_REPR
250
- ) -> None:
247
+ def __init__(self, param: _TParam, /, *, separator: str = ",") -> None:
251
248
  self.name = f"FROZENSET[{param.name}]"
252
249
  self._param = param
253
250
  self._separator = separator
254
- self._empty = empty
255
251
  super().__init__()
256
252
 
257
253
  @override
@@ -273,7 +269,7 @@ class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
273
269
  text = ensure_str(value)
274
270
  except EnsureStrError as error:
275
271
  return self.fail(str(error), param=param, ctx=ctx)
276
- values = split_str(text, separator=self._separator, empty=self._empty)
272
+ values = split_str(text, separator=self._separator)
277
273
  return frozenset(self._param.convert(v, param, ctx) for v in values)
278
274
 
279
275
  @override
@@ -290,15 +286,15 @@ class FrozenSetParameter(ParamType, Generic[_TParam, _T]):
290
286
  class FrozenSetBools(FrozenSetParameter[BoolParamType, str]):
291
287
  """A frozenset-of-bools-valued parameter."""
292
288
 
293
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
294
- super().__init__(BoolParamType(), separator=separator, empty=empty)
289
+ def __init__(self, *, separator: str = ",") -> None:
290
+ super().__init__(BoolParamType(), separator=separator)
295
291
 
296
292
 
297
293
  class FrozenSetDates(FrozenSetParameter[Date, dt.date]):
298
294
  """A frozenset-of-dates-valued parameter."""
299
295
 
300
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
301
- super().__init__(Date(), separator=separator, empty=empty)
296
+ def __init__(self, *, separator: str = ",") -> None:
297
+ super().__init__(Date(), separator=separator)
302
298
 
303
299
 
304
300
  class FrozenSetChoices(FrozenSetParameter[Choice, str]):
@@ -311,12 +307,9 @@ class FrozenSetChoices(FrozenSetParameter[Choice, str]):
311
307
  *,
312
308
  case_sensitive: bool = False,
313
309
  separator: str = ",",
314
- empty: str = SENTINEL_REPR,
315
310
  ) -> None:
316
311
  super().__init__(
317
- Choice(choices, case_sensitive=case_sensitive),
318
- separator=separator,
319
- empty=empty,
312
+ Choice(choices, case_sensitive=case_sensitive), separator=separator
320
313
  )
321
314
 
322
315
 
@@ -330,46 +323,43 @@ class FrozenSetEnums(FrozenSetParameter[Enum[TEnum], TEnum]):
330
323
  *,
331
324
  case_sensitive: bool = False,
332
325
  separator: str = ",",
333
- empty: str = SENTINEL_REPR,
334
326
  ) -> None:
335
- super().__init__(
336
- Enum(enum, case_sensitive=case_sensitive), separator=separator, empty=empty
337
- )
327
+ super().__init__(Enum(enum, case_sensitive=case_sensitive), separator=separator)
338
328
 
339
329
 
340
330
  class FrozenSetFloats(FrozenSetParameter[FloatParamType, float]):
341
331
  """A frozenset-of-floats-valued parameter."""
342
332
 
343
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
344
- super().__init__(FloatParamType(), separator=separator, empty=empty)
333
+ def __init__(self, *, separator: str = ",") -> None:
334
+ super().__init__(FloatParamType(), separator=separator)
345
335
 
346
336
 
347
337
  class FrozenSetInts(FrozenSetParameter[IntParamType, int]):
348
338
  """A frozenset-of-ints-valued parameter."""
349
339
 
350
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
351
- super().__init__(IntParamType(), separator=separator, empty=empty)
340
+ def __init__(self, *, separator: str = ",") -> None:
341
+ super().__init__(IntParamType(), separator=separator)
352
342
 
353
343
 
354
344
  class FrozenSetMonths(FrozenSetParameter[Month, utilities.datetime.Month]):
355
345
  """A frozenset-of-months-valued parameter."""
356
346
 
357
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
358
- super().__init__(Month(), separator=separator, empty=empty)
347
+ def __init__(self, *, separator: str = ",") -> None:
348
+ super().__init__(Month(), separator=separator)
359
349
 
360
350
 
361
351
  class FrozenSetStrs(FrozenSetParameter[StringParamType, str]):
362
352
  """A frozenset-of-strs-valued parameter."""
363
353
 
364
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
365
- super().__init__(StringParamType(), separator=separator, empty=empty)
354
+ def __init__(self, *, separator: str = ",") -> None:
355
+ super().__init__(StringParamType(), separator=separator)
366
356
 
367
357
 
368
358
  class FrozenSetUUIDs(FrozenSetParameter[UUIDParameterType, UUID]):
369
359
  """A frozenset-of-UUIDs-valued parameter."""
370
360
 
371
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
372
- super().__init__(UUIDParameterType(), separator=separator, empty=empty)
361
+ def __init__(self, *, separator: str = ",") -> None:
362
+ super().__init__(UUIDParameterType(), separator=separator)
373
363
 
374
364
 
375
365
  # parameters - list
@@ -378,13 +368,10 @@ class FrozenSetUUIDs(FrozenSetParameter[UUIDParameterType, UUID]):
378
368
  class ListParameter(ParamType, Generic[_TParam, _T]):
379
369
  """A list-valued parameter."""
380
370
 
381
- def __init__(
382
- self, param: _TParam, /, *, separator: str = ",", empty: str = SENTINEL_REPR
383
- ) -> None:
371
+ def __init__(self, param: _TParam, /, *, separator: str = ",") -> None:
384
372
  self.name = f"LIST[{param.name}]"
385
373
  self._param = param
386
374
  self._separator = separator
387
- self._empty = empty
388
375
  super().__init__()
389
376
 
390
377
  @override
@@ -406,7 +393,7 @@ class ListParameter(ParamType, Generic[_TParam, _T]):
406
393
  text = ensure_str(value)
407
394
  except EnsureStrError as error:
408
395
  return self.fail(str(error), param=param, ctx=ctx)
409
- values = split_str(text, separator=self._separator, empty=self._empty)
396
+ values = split_str(text, separator=self._separator)
410
397
  return [self._param.convert(v, param, ctx) for v in values]
411
398
 
412
399
  @override
@@ -423,15 +410,15 @@ class ListParameter(ParamType, Generic[_TParam, _T]):
423
410
  class ListBools(ListParameter[BoolParamType, str]):
424
411
  """A list-of-bools-valued parameter."""
425
412
 
426
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
427
- super().__init__(BoolParamType(), separator=separator, empty=empty)
413
+ def __init__(self, *, separator: str = ",") -> None:
414
+ super().__init__(BoolParamType(), separator=separator)
428
415
 
429
416
 
430
417
  class ListDates(ListParameter[Date, dt.date]):
431
418
  """A list-of-dates-valued parameter."""
432
419
 
433
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
434
- super().__init__(Date(), separator=separator, empty=empty)
420
+ def __init__(self, *, separator: str = ",") -> None:
421
+ super().__init__(Date(), separator=separator)
435
422
 
436
423
 
437
424
  class ListEnums(ListParameter[Enum[TEnum], TEnum]):
@@ -444,46 +431,43 @@ class ListEnums(ListParameter[Enum[TEnum], TEnum]):
444
431
  *,
445
432
  case_sensitive: bool = False,
446
433
  separator: str = ",",
447
- empty: str = SENTINEL_REPR,
448
434
  ) -> None:
449
- super().__init__(
450
- Enum(enum, case_sensitive=case_sensitive), separator=separator, empty=empty
451
- )
435
+ super().__init__(Enum(enum, case_sensitive=case_sensitive), separator=separator)
452
436
 
453
437
 
454
438
  class ListFloats(ListParameter[FloatParamType, float]):
455
439
  """A list-of-floats-valued parameter."""
456
440
 
457
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
458
- super().__init__(FloatParamType(), separator=separator, empty=empty)
441
+ def __init__(self, *, separator: str = ",") -> None:
442
+ super().__init__(FloatParamType(), separator=separator)
459
443
 
460
444
 
461
445
  class ListInts(ListParameter[IntParamType, int]):
462
446
  """A list-of-ints-valued parameter."""
463
447
 
464
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
465
- super().__init__(IntParamType(), separator=separator, empty=empty)
448
+ def __init__(self, *, separator: str = ",") -> None:
449
+ super().__init__(IntParamType(), separator=separator)
466
450
 
467
451
 
468
452
  class ListMonths(ListParameter[Month, utilities.datetime.Month]):
469
453
  """A list-of-months-valued parameter."""
470
454
 
471
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
472
- super().__init__(Month(), separator=separator, empty=empty)
455
+ def __init__(self, *, separator: str = ",") -> None:
456
+ super().__init__(Month(), separator=separator)
473
457
 
474
458
 
475
459
  class ListStrs(ListParameter[StringParamType, str]):
476
460
  """A list-of-strs-valued parameter."""
477
461
 
478
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
479
- super().__init__(StringParamType(), separator=separator, empty=empty)
462
+ def __init__(self, *, separator: str = ",") -> None:
463
+ super().__init__(StringParamType(), separator=separator)
480
464
 
481
465
 
482
466
  class ListUUIDs(ListParameter[UUIDParameterType, UUID]):
483
467
  """A list-of-UUIDs-valued parameter."""
484
468
 
485
- def __init__(self, *, separator: str = ",", empty: str = SENTINEL_REPR) -> None:
486
- super().__init__(UUIDParameterType(), separator=separator, empty=empty)
469
+ def __init__(self, *, separator: str = ",") -> None:
470
+ super().__init__(UUIDParameterType(), separator=separator)
487
471
 
488
472
 
489
473
  # private
@@ -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