dycw-utilities 0.109.25__tar.gz → 0.109.27__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.25 → dycw_utilities-0.109.27}/PKG-INFO +1 -1
  2. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/pyproject.toml +2 -2
  3. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_text.py +11 -3
  4. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_whenever.py +7 -7
  5. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/text.py +24 -5
  7. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/.gitignore +0 -0
  8. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/LICENSE +0 -0
  9. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/README.md +0 -0
  10. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/scripts/__init__.py +0 -0
  36. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/scripts/test_async_service/__init__.py +0 -0
  37. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/scripts/test_async_service/__main__.py +0 -0
  38. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/scripts/test_async_service/run.sh +0 -0
  39. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/scripts/test_queue_processor/__init__.py +0 -0
  40. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/scripts/test_queue_processor/__main__.py +0 -0
  41. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/scripts/test_queue_processor/run.sh +0 -0
  42. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_altair.py +0 -0
  43. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_astor.py +0 -0
  44. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_asyncio.py +0 -0
  45. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_atomicwrites.py +0 -0
  46. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_atools.py +0 -0
  47. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_cachetools.py +0 -0
  48. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_click.py +0 -0
  49. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_concurrent.py +0 -0
  50. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_contextlib.py +0 -0
  51. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_contextvars.py +0 -0
  52. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_cryptography.py +0 -0
  53. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_cvxpy.py +0 -0
  54. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_dataclasses.py +0 -0
  55. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_datetime.py +0 -0
  56. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_enum.py +0 -0
  57. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_errors.py +0 -0
  58. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_eventkit.py +0 -0
  59. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_fastapi.py +0 -0
  60. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_fpdf2.py +0 -0
  61. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_functions.py +0 -0
  62. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_functools.py +0 -0
  63. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_getpass.py +0 -0
  64. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_git.py +0 -0
  65. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_hashlib.py +0 -0
  66. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_http.py +0 -0
  67. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_hypothesis.py +0 -0
  68. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_ipython.py +0 -0
  69. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_iterables.py +0 -0
  70. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_jupyter.py +0 -0
  71. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_lightweight_charts.py +0 -0
  72. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_logging.py +0 -0
  73. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_loguru.py +0 -0
  74. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_luigi.py +0 -0
  75. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_math.py +0 -0
  76. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_memory_profiler.py +0 -0
  77. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_modules.py +0 -0
  78. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_more_itertools.py +0 -0
  79. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_numpy.py +0 -0
  80. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_operator.py +0 -0
  81. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_optuna.py +0 -0
  82. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_orjson.py +0 -0
  83. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_os.py +0 -0
  84. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_parse.py +0 -0
  85. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pathlib.py +0 -0
  86. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_period.py +0 -0
  87. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_polars.py +0 -0
  90. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_polars_ols.py +0 -0
  91. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pqdm.py +0 -0
  92. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pydantic.py +0 -0
  93. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pyinstrument.py +0 -0
  94. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pyrsistent.py +0 -0
  95. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pytest.py +0 -0
  96. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_pytest_regressions.py +0 -0
  97. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_python_dotenv.py +0 -0
  98. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_random.py +0 -0
  99. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_re.py +0 -0
  100. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_redis.py +0 -0
  101. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_reprlib.py +0 -0
  102. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_rich.py +0 -0
  103. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_scipy.py +0 -0
  104. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_sentinel.py +0 -0
  105. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_shelve.py +0 -0
  106. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_slack_sdk.py +0 -0
  107. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_socket.py +0 -0
  108. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_sqlalchemy.py +0 -0
  109. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_sqlalchemy_polars.py +0 -0
  110. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_statsmodel.py +0 -0
  111. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_streamlit.py +0 -0
  112. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_sys.py +0 -0
  113. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_tempfile.py +0 -0
  114. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_tenacity.py +0 -0
  115. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_threading.py +0 -0
  116. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_timer.py +0 -0
  117. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback.py +0 -0
  118. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/chain.py +0 -0
  120. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/decorated_async.py +0 -0
  121. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/decorated_sync.py +0 -0
  122. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/error_bind.py +0 -0
  123. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/many.py +0 -0
  124. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/one.py +0 -0
  125. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/recursive.py +0 -0
  126. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/task_group_one.py +0 -0
  127. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/task_group_two.py +0 -0
  128. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/two.py +0 -0
  129. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_traceback_funcs/untraced.py +0 -0
  130. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_types.py +0 -0
  131. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_typing.py +0 -0
  132. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_typing_funcs/__init__.py +0 -0
  133. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_typing_funcs/no_future.py +0 -0
  134. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_typing_funcs/with_future.py +0 -0
  135. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_tzdata.py +0 -0
  136. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_tzlocal.py +0 -0
  137. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_uuid.py +0 -0
  138. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_version.py +0 -0
  139. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_warnings.py +0 -0
  140. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_zipfile.py +0 -0
  141. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/tests/test_zoneinfo.py +0 -0
  142. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/altair.py +0 -0
  143. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/astor.py +0 -0
  144. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/asyncio.py +0 -0
  145. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/atomicwrites.py +0 -0
  146. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/atools.py +0 -0
  147. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/cachetools.py +0 -0
  148. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/click.py +0 -0
  149. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/concurrent.py +0 -0
  150. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/contextlib.py +0 -0
  151. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/contextvars.py +0 -0
  152. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/cryptography.py +0 -0
  153. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/cvxpy.py +0 -0
  154. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/dataclasses.py +0 -0
  155. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/datetime.py +0 -0
  156. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/enum.py +0 -0
  157. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/errors.py +0 -0
  158. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/eventkit.py +0 -0
  159. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/fastapi.py +0 -0
  160. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/fpdf2.py +0 -0
  161. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/functions.py +0 -0
  162. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/functools.py +0 -0
  163. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/getpass.py +0 -0
  164. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/git.py +0 -0
  165. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/hashlib.py +0 -0
  166. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/http.py +0 -0
  167. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/hypothesis.py +0 -0
  168. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/ipython.py +0 -0
  169. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/iterables.py +0 -0
  170. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/jupyter.py +0 -0
  171. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/lightweight_charts.py +0 -0
  172. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/logging.py +0 -0
  173. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/loguru.py +0 -0
  174. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/luigi.py +0 -0
  175. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/math.py +0 -0
  176. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/memory_profiler.py +0 -0
  177. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/modules.py +0 -0
  178. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/more_itertools.py +0 -0
  179. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/numpy.py +0 -0
  180. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/operator.py +0 -0
  181. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/optuna.py +0 -0
  182. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/orjson.py +0 -0
  183. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/os.py +0 -0
  184. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/parse.py +0 -0
  185. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pathlib.py +0 -0
  186. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/period.py +0 -0
  187. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pickle.py +0 -0
  188. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/platform.py +0 -0
  189. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/polars.py +0 -0
  190. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/polars_ols.py +0 -0
  191. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pqdm.py +0 -0
  192. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/py.typed +0 -0
  193. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pydantic.py +0 -0
  194. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pyinstrument.py +0 -0
  195. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pyrsistent.py +0 -0
  196. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pytest.py +0 -0
  197. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/pytest_regressions.py +0 -0
  198. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/python_dotenv.py +0 -0
  199. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/random.py +0 -0
  200. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/re.py +0 -0
  201. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/redis.py +0 -0
  202. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/reprlib.py +0 -0
  203. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/rich.py +0 -0
  204. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/scipy.py +0 -0
  205. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/sentinel.py +0 -0
  206. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/shelve.py +0 -0
  207. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/slack_sdk.py +0 -0
  208. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/socket.py +0 -0
  209. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/sqlalchemy.py +0 -0
  210. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/sqlalchemy_polars.py +0 -0
  211. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/statsmodels.py +0 -0
  212. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/streamlit.py +0 -0
  213. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/sys.py +0 -0
  214. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/tempfile.py +0 -0
  215. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/tenacity.py +0 -0
  216. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/threading.py +0 -0
  217. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/timer.py +0 -0
  218. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/traceback.py +0 -0
  219. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/types.py +0 -0
  220. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/typing.py +0 -0
  221. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/tzdata.py +0 -0
  222. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/tzlocal.py +0 -0
  223. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/uuid.py +0 -0
  224. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/version.py +0 -0
  225. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/warnings.py +0 -0
  226. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/whenever.py +0 -0
  227. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/src/utilities/zipfile.py +0 -0
  228. {dycw_utilities-0.109.25 → dycw_utilities-0.109.27}/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.25
3
+ Version: 0.109.27
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.25"
96
+ version = "0.109.27"
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.25"
339
+ current_version = "0.109.27"
340
340
 
341
341
  [[tool.bumpversion.files]]
342
342
  filename = "src/utilities/__init__.py"
@@ -20,8 +20,9 @@ from utilities.hypothesis import text_ascii
20
20
  from utilities.text import (
21
21
  ParseBoolError,
22
22
  ParseNoneError,
23
- SplitKeyValuePairsError,
24
23
  SplitStrError,
24
+ _SplitKeyValuePairsDuplicateKeysError,
25
+ _SplitKeyValuePairsSplitError,
25
26
  join_strs,
26
27
  parse_bool,
27
28
  parse_none,
@@ -98,9 +99,16 @@ class TestSplitKeyValuePairs:
98
99
  expected = {"a": "1", "b": "22", "c": "333"}
99
100
  assert result == expected
100
101
 
101
- def test_error(self) -> None:
102
+ def test_error_split(self) -> None:
103
+ with raises(
104
+ _SplitKeyValuePairsSplitError,
105
+ match=r"Unable to split 'a=1,b=22=22,c=333' into key-value pairs; got 'b=22=22'",
106
+ ):
107
+ _ = split_key_value_pairs("a=1,b=22=22,c=333")
108
+
109
+ def test_error_duplicate_keys(self) -> None:
102
110
  with raises(
103
- SplitKeyValuePairsError,
111
+ _SplitKeyValuePairsDuplicateKeysError,
104
112
  match=r"Unable to split 'a=1,a=22,a=333' into a mapping since there are duplicate keys; got \{'a': 3\}",
105
113
  ):
106
114
  _ = split_key_value_pairs("a=1,a=22,a=333", mapping=True)
@@ -120,7 +120,7 @@ class TestCheckValidZonedDateTime:
120
120
  check_valid_zoned_datetime(datetime)
121
121
 
122
122
 
123
- class TestParseAndSerializeDate:
123
+ class TestSerializeAndParseDate:
124
124
  @given(date=dates())
125
125
  def test_main(self, *, date: dt.date) -> None:
126
126
  serialized = serialize_date(date)
@@ -156,7 +156,7 @@ class TestParseAndSerializeDate:
156
156
  _ = ensure_date("invalid")
157
157
 
158
158
 
159
- class TestParseAndSerializeDateTime:
159
+ class TestSerializeAndParseDateTime:
160
160
  @given(
161
161
  datetime=local_datetimes()
162
162
  | zoned_datetimes(time_zone=timezones() | just(dt.UTC), valid=True)
@@ -191,7 +191,7 @@ class TestParseAndSerializeDateTime:
191
191
  _ = ensure_datetime("invalid")
192
192
 
193
193
 
194
- class TestParseAndSerializeDuration:
194
+ class TestSerializeAndParseDuration:
195
195
  @given(duration=datetime_durations())
196
196
  def test_main(self, *, duration: Duration) -> None:
197
197
  with assume_does_not_raise(SerializeDurationError):
@@ -226,7 +226,7 @@ class TestParseAndSerializeDuration:
226
226
  _ = ensure_duration("invalid")
227
227
 
228
228
 
229
- class TestParseAndSerializeLocalDateTime:
229
+ class TestSerializeAndParseLocalDateTime:
230
230
  @given(datetime=datetimes())
231
231
  def test_main(self, *, datetime: dt.datetime) -> None:
232
232
  serialized = serialize_local_datetime(datetime)
@@ -278,7 +278,7 @@ class TestParseAndSerializeLocalDateTime:
278
278
  _ = ensure_local_datetime("invalid")
279
279
 
280
280
 
281
- class TestParseAndSerializeTime:
281
+ class TestSerializeAndParseTime:
282
282
  @given(time=times())
283
283
  def test_main(self, *, time: dt.time) -> None:
284
284
  serialized = serialize_time(time)
@@ -300,7 +300,7 @@ class TestParseAndSerializeTime:
300
300
  _ = ensure_time("invalid")
301
301
 
302
302
 
303
- class TestParseAndSerializeTimedelta:
303
+ class TestSerializeAndParseTimedelta:
304
304
  @given(
305
305
  timedelta=timedeltas(
306
306
  min_value=MIN_SERIALIZABLE_TIMEDELTA, max_value=MAX_SERIALIZABLE_TIMEDELTA
@@ -374,7 +374,7 @@ class TestParseAndSerializeTimedelta:
374
374
  _ = ensure_timedelta("PT0.111222333S")
375
375
 
376
376
 
377
- class TestParseAndSerializeZonedDateTime:
377
+ class TestSerializeAndParseZonedDateTime:
378
378
  @given(datetime=zoned_datetimes(time_zone=timezones() | just(dt.UTC), valid=True))
379
379
  @SKIPIF_CI_AND_WINDOWS
380
380
  def test_main(self, *, datetime: dt.datetime) -> None:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.109.25"
3
+ __version__ = "0.109.27"
@@ -122,22 +122,40 @@ def split_key_value_pairs(
122
122
  mapping: bool = False,
123
123
  ) -> Sequence[tuple[str, str]] | StrStrMapping:
124
124
  """Split a string into key-value pairs."""
125
- pairs = [
126
- split_str(text_i, separator=pair_separator, n=2)
127
- for text_i in split_str(text, separator=list_separator)
128
- ]
125
+ try:
126
+ pairs = [
127
+ split_str(text_i, separator=pair_separator, n=2)
128
+ for text_i in split_str(text, separator=list_separator)
129
+ ]
130
+ except SplitStrError as error:
131
+ raise _SplitKeyValuePairsSplitError(text=text, inner=error.text) from None
129
132
  if not mapping:
130
133
  return pairs
131
134
  try:
132
135
  check_duplicates(k for k, _ in pairs)
133
136
  except CheckDuplicatesError as error:
134
- raise SplitKeyValuePairsError(text=text, counts=error.counts) from None
137
+ raise _SplitKeyValuePairsDuplicateKeysError(
138
+ text=text, counts=error.counts
139
+ ) from None
135
140
  return dict(pairs)
136
141
 
137
142
 
138
143
  @dataclass(kw_only=True, slots=True)
139
144
  class SplitKeyValuePairsError(Exception):
140
145
  text: str
146
+
147
+
148
+ @dataclass(kw_only=True, slots=True)
149
+ class _SplitKeyValuePairsSplitError(SplitKeyValuePairsError):
150
+ inner: str
151
+
152
+ @override
153
+ def __str__(self) -> str:
154
+ return f"Unable to split {self.text!r} into key-value pairs; got {self.inner!r}"
155
+
156
+
157
+ @dataclass(kw_only=True, slots=True)
158
+ class _SplitKeyValuePairsDuplicateKeysError(SplitKeyValuePairsError):
141
159
  counts: Mapping[str, int]
142
160
 
143
161
  @override
@@ -236,6 +254,7 @@ def strip_and_dedent(text: str, /, *, trailing: bool = False) -> str:
236
254
  __all__ = [
237
255
  "ParseBoolError",
238
256
  "ParseNoneError",
257
+ "SplitKeyValuePairsError",
239
258
  "SplitStrError",
240
259
  "join_strs",
241
260
  "parse_bool",