dycw-utilities 0.131.8__tar.gz → 0.131.9__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 (220) hide show
  1. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/PKG-INFO +1 -1
  2. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/pyproject.toml +2 -2
  3. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_re.py +12 -0
  4. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/re.py +51 -20
  6. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/types.py +6 -0
  7. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/.gitignore +0 -0
  8. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/LICENSE +0 -0
  9. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/README.md +0 -0
  10. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/__init__.py +0 -0
  11. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/conftest.py +0 -0
  12. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/__init__.py +0 -0
  13. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_missing/__init__.py +0 -0
  14. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_missing/module.py +0 -0
  15. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_with/__init__.py +0 -0
  16. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_with/outer_1.py +0 -0
  17. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_with/outer_2.py +0 -0
  18. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  19. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  20. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  21. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  22. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_without/__init__.py +0 -0
  23. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_without/module_1.py +0 -0
  24. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/package_without/module_2.py +0 -0
  25. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/standalone.py +0 -0
  26. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/modules/with_imports.py +0 -0
  27. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  28. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  29. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  30. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  31. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  32. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  33. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  34. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  35. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_aiolimiter.py +0 -0
  36. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_altair.py +0 -0
  37. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_asyncio.py +0 -0
  38. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_asyncio_classes/__init__.py +0 -0
  39. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_asyncio_classes/loopers.py +0 -0
  40. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_asyncio_classes/redis.py +0 -0
  41. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_atomicwrites.py +0 -0
  42. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_atools.py +0 -0
  43. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_cachetools.py +0 -0
  44. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_click.py +0 -0
  45. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_concurrent.py +0 -0
  46. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_contextlib.py +0 -0
  47. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_contextvars.py +0 -0
  48. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_cryptography.py +0 -0
  49. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_cvxpy.py +0 -0
  50. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_dataclasses.py +0 -0
  51. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_datetime.py +0 -0
  52. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_enum.py +0 -0
  53. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_errors.py +0 -0
  54. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_eventkit.py +0 -0
  55. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_fastapi.py +0 -0
  56. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_fpdf2.py +0 -0
  57. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_functions.py +0 -0
  58. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_functools.py +0 -0
  59. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_getpass.py +0 -0
  60. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_git.py +0 -0
  61. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_hashlib.py +0 -0
  62. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_http.py +0 -0
  63. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_hypothesis.py +0 -0
  64. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_importlib.py +0 -0
  65. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_inflect.py +0 -0
  66. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_ipython.py +0 -0
  67. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_iterables.py +0 -0
  68. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_jupyter.py +0 -0
  69. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_libcst.py +0 -0
  70. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_lightweight_charts.py +0 -0
  71. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_logging.py +0 -0
  72. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_luigi.py +0 -0
  73. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_math.py +0 -0
  74. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_memory_profiler.py +0 -0
  75. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_modules.py +0 -0
  76. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_more_itertools.py +0 -0
  77. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_numpy.py +0 -0
  78. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_orjson.py +0 -0
  81. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_os.py +0 -0
  82. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_parse.py +0 -0
  83. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_period.py +0 -0
  85. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pickle.py +0 -0
  86. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_platform.py +0 -0
  87. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_polars.py +0 -0
  88. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_polars_ols.py +0 -0
  89. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pottery.py +0 -0
  90. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_psutil.py +0 -0
  92. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pydantic.py +0 -0
  93. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pyinstrument.py +0 -0
  94. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pyrsistent.py +0 -0
  95. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pytest.py +0 -0
  96. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_pytest_regressions.py +0 -0
  97. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_python_dotenv.py +0 -0
  98. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_random.py +0 -0
  99. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_scipy.py +0 -0
  102. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_sentinel.py +0 -0
  103. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_shelve.py +0 -0
  104. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_slack_sdk.py +0 -0
  105. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_socket.py +0 -0
  106. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_sqlalchemy.py +0 -0
  107. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_sqlalchemy_polars.py +0 -0
  108. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_statsmodel.py +0 -0
  109. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_streamlit.py +0 -0
  110. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_string.py +0 -0
  111. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_tempfile.py +0 -0
  112. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_tenacity.py +0 -0
  113. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_text.py +0 -0
  114. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_threading.py +0 -0
  115. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_timer.py +0 -0
  116. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_traceback.py +0 -0
  117. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_types.py +0 -0
  118. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_typing.py +0 -0
  119. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_typing_funcs/__init__.py +0 -0
  120. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_typing_funcs/no_future.py +0 -0
  121. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_typing_funcs/with_future.py +0 -0
  122. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_tzdata.py +0 -0
  123. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_tzlocal.py +0 -0
  124. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_uuid.py +0 -0
  125. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_version.py +0 -0
  126. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_warnings.py +0 -0
  127. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_whenever.py +0 -0
  128. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_whenever2.py +0 -0
  129. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_zipfile.py +0 -0
  130. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/tests/test_zoneinfo.py +0 -0
  131. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/aiolimiter.py +0 -0
  132. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/altair.py +0 -0
  133. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/asyncio.py +0 -0
  134. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/atomicwrites.py +0 -0
  135. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/atools.py +0 -0
  136. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/cachetools.py +0 -0
  137. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/click.py +0 -0
  138. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/concurrent.py +0 -0
  139. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/contextlib.py +0 -0
  140. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/contextvars.py +0 -0
  141. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/cryptography.py +0 -0
  142. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/cvxpy.py +0 -0
  143. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/dataclasses.py +0 -0
  144. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/datetime.py +0 -0
  145. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/enum.py +0 -0
  146. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/errors.py +0 -0
  147. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/eventkit.py +0 -0
  148. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/fastapi.py +0 -0
  149. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/fpdf2.py +0 -0
  150. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/functions.py +0 -0
  151. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/functools.py +0 -0
  152. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/getpass.py +0 -0
  153. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/git.py +0 -0
  154. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/hashlib.py +0 -0
  155. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/http.py +0 -0
  156. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/hypothesis.py +0 -0
  157. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/importlib.py +0 -0
  158. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/inflect.py +0 -0
  159. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/ipython.py +0 -0
  160. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/iterables.py +0 -0
  161. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/jupyter.py +0 -0
  162. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/libcst.py +0 -0
  163. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/lightweight_charts.py +0 -0
  164. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/logging.py +0 -0
  165. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/luigi.py +0 -0
  166. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/math.py +0 -0
  167. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/memory_profiler.py +0 -0
  168. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/modules.py +0 -0
  169. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/more_itertools.py +0 -0
  170. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/numpy.py +0 -0
  171. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/operator.py +0 -0
  172. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/optuna.py +0 -0
  173. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/orjson.py +0 -0
  174. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/os.py +0 -0
  175. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/parse.py +0 -0
  176. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pathlib.py +0 -0
  177. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/period.py +0 -0
  178. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pickle.py +0 -0
  179. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/platform.py +0 -0
  180. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/polars.py +0 -0
  181. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/polars_ols.py +0 -0
  182. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pottery.py +0 -0
  183. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pqdm.py +0 -0
  184. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/psutil.py +0 -0
  185. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/py.typed +0 -0
  186. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pydantic.py +0 -0
  187. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pyinstrument.py +0 -0
  188. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pyrsistent.py +0 -0
  189. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pytest.py +0 -0
  190. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/pytest_regressions.py +0 -0
  191. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/python_dotenv.py +0 -0
  192. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/random.py +0 -0
  193. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/redis.py +0 -0
  194. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/reprlib.py +0 -0
  195. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/scipy.py +0 -0
  196. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/sentinel.py +0 -0
  197. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/shelve.py +0 -0
  198. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/slack_sdk.py +0 -0
  199. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/socket.py +0 -0
  200. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/sqlalchemy.py +0 -0
  201. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/sqlalchemy_polars.py +0 -0
  202. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/statsmodels.py +0 -0
  203. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/streamlit.py +0 -0
  204. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/string.py +0 -0
  205. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/tempfile.py +0 -0
  206. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/tenacity.py +0 -0
  207. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/text.py +0 -0
  208. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/threading.py +0 -0
  209. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/timer.py +0 -0
  210. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/traceback.py +0 -0
  211. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/typing.py +0 -0
  212. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/tzdata.py +0 -0
  213. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/tzlocal.py +0 -0
  214. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/uuid.py +0 -0
  215. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/version.py +0 -0
  216. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/warnings.py +0 -0
  217. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/whenever.py +0 -0
  218. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/whenever2.py +0 -0
  219. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/zipfile.py +0 -0
  220. {dycw_utilities-0.131.8 → dycw_utilities-0.131.9}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.131.8
3
+ Version: 0.131.9
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -94,7 +94,7 @@ dependencies = [
94
94
  name = "dycw-utilities"
95
95
  readme = "README.md"
96
96
  requires-python = ">= 3.12"
97
- version = "0.131.8"
97
+ version = "0.131.9"
98
98
 
99
99
  [project.optional-dependencies]
100
100
  logging = [
@@ -121,7 +121,7 @@ test = [
121
121
  # bump-my-version
122
122
  [tool.bumpversion]
123
123
  allow_dirty = true
124
- current_version = "0.131.8"
124
+ current_version = "0.131.9"
125
125
 
126
126
  [[tool.bumpversion.files]]
127
127
  filename = "src/utilities/__init__.py"
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from re import DOTALL
4
5
  from typing import TYPE_CHECKING
5
6
 
@@ -13,6 +14,7 @@ from utilities.re import (
13
14
  _ExtractGroupsMultipleMatchesError,
14
15
  _ExtractGroupsNoCaptureGroupsError,
15
16
  _ExtractGroupsNoMatchesError,
17
+ ensure_pattern,
16
18
  extract_group,
17
19
  extract_groups,
18
20
  )
@@ -21,6 +23,16 @@ if TYPE_CHECKING:
21
23
  from collections.abc import Sequence
22
24
 
23
25
 
26
+ class TestEnsurePattern:
27
+ def test_pattern(self) -> None:
28
+ pattern = re.compile(r"\d")
29
+ assert ensure_pattern(pattern) == pattern
30
+
31
+ def test_str(self) -> None:
32
+ pattern = r"\d"
33
+ assert ensure_pattern(pattern) == re.compile(pattern)
34
+
35
+
24
36
  class TestExtractGroup:
25
37
  def test_main(self) -> None:
26
38
  assert extract_group(r"(\d)", "A0A") == "0"
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.131.8"
3
+ __version__ = "0.131.9"
@@ -2,37 +2,59 @@ from __future__ import annotations
2
2
 
3
3
  import re
4
4
  from dataclasses import dataclass
5
- from typing import override
5
+ from re import Pattern
6
+ from typing import TYPE_CHECKING, assert_never, override
6
7
 
7
8
  from utilities.iterables import OneEmptyError, OneNonUniqueError, one
8
9
 
10
+ if TYPE_CHECKING:
11
+ from utilities.types import PatternLike
9
12
 
10
- def extract_group(pattern: str, text: str, /, *, flags: int = 0) -> str:
13
+
14
+ def ensure_pattern(pattern: PatternLike, /, *, flags: int = 0) -> Pattern[str]:
15
+ """Ensure a pattern is returned."""
16
+ match pattern:
17
+ case Pattern():
18
+ return pattern
19
+ case str():
20
+ return re.compile(pattern, flags=flags)
21
+ case _ as never:
22
+ assert_never(never)
23
+
24
+
25
+ ##
26
+
27
+
28
+ def extract_group(pattern: PatternLike, text: str, /, *, flags: int = 0) -> str:
11
29
  """Extract a group.
12
30
 
13
31
  The regex must have 1 capture group, and this must match exactly once.
14
32
  """
15
- compiled = re.compile(pattern, flags=flags)
16
- match compiled.groups:
33
+ pattern_use = ensure_pattern(pattern, flags=flags)
34
+ match pattern_use.groups:
17
35
  case 0:
18
- raise _ExtractGroupNoCaptureGroupsError(pattern=pattern, text=text)
36
+ raise _ExtractGroupNoCaptureGroupsError(pattern=pattern_use, text=text)
19
37
  case 1:
20
- matches: list[str] = compiled.findall(text)
38
+ matches: list[str] = pattern_use.findall(text)
21
39
  try:
22
40
  return one(matches)
23
41
  except OneEmptyError:
24
- raise _ExtractGroupNoMatchesError(pattern=pattern, text=text) from None
42
+ raise _ExtractGroupNoMatchesError(
43
+ pattern=pattern_use, text=text
44
+ ) from None
25
45
  except OneNonUniqueError:
26
46
  raise _ExtractGroupMultipleMatchesError(
27
- pattern=pattern, text=text, matches=matches
47
+ pattern=pattern_use, text=text, matches=matches
28
48
  ) from None
29
49
  case _:
30
- raise _ExtractGroupMultipleCaptureGroupsError(pattern=pattern, text=text)
50
+ raise _ExtractGroupMultipleCaptureGroupsError(
51
+ pattern=pattern_use, text=text
52
+ )
31
53
 
32
54
 
33
55
  @dataclass(kw_only=True, slots=True)
34
56
  class ExtractGroupError(Exception):
35
- pattern: str
57
+ pattern: Pattern[str]
36
58
  text: str
37
59
 
38
60
 
@@ -68,32 +90,35 @@ class _ExtractGroupNoMatchesError(ExtractGroupError):
68
90
  return f"Pattern {self.pattern} must match against {self.text}"
69
91
 
70
92
 
71
- def extract_groups(pattern: str, text: str, /, *, flags: int = 0) -> list[str]:
93
+ ##
94
+
95
+
96
+ def extract_groups(pattern: PatternLike, text: str, /, *, flags: int = 0) -> list[str]:
72
97
  """Extract multiple groups.
73
98
 
74
99
  The regex may have any number of capture groups, and they must collectively
75
100
  match exactly once.
76
101
  """
77
- compiled = re.compile(pattern, flags=flags)
78
- if (n_groups := compiled.groups) == 0:
79
- raise _ExtractGroupsNoCaptureGroupsError(pattern=pattern, text=text)
80
- matches: list[str] = compiled.findall(text)
102
+ pattern_use = ensure_pattern(pattern, flags=flags)
103
+ if (n_groups := pattern_use.groups) == 0:
104
+ raise _ExtractGroupsNoCaptureGroupsError(pattern=pattern_use, text=text)
105
+ matches: list[str] = pattern_use.findall(text)
81
106
  match len(matches), n_groups:
82
107
  case 0, _:
83
- raise _ExtractGroupsNoMatchesError(pattern=pattern, text=text)
108
+ raise _ExtractGroupsNoMatchesError(pattern=pattern_use, text=text)
84
109
  case 1, 1:
85
110
  return matches
86
111
  case 1, _:
87
112
  return list(one(matches))
88
113
  case _:
89
114
  raise _ExtractGroupsMultipleMatchesError(
90
- pattern=pattern, text=text, matches=matches
115
+ pattern=pattern_use, text=text, matches=matches
91
116
  )
92
117
 
93
118
 
94
119
  @dataclass(kw_only=True, slots=True)
95
120
  class ExtractGroupsError(Exception):
96
- pattern: str
121
+ pattern: Pattern[str]
97
122
  text: str
98
123
 
99
124
 
@@ -108,7 +133,7 @@ class _ExtractGroupsMultipleMatchesError(ExtractGroupsError):
108
133
 
109
134
  @dataclass(kw_only=True, slots=True)
110
135
  class _ExtractGroupsNoCaptureGroupsError(ExtractGroupsError):
111
- pattern: str
136
+ pattern: Pattern[str]
112
137
  text: str
113
138
 
114
139
  @override
@@ -123,4 +148,10 @@ class _ExtractGroupsNoMatchesError(ExtractGroupsError):
123
148
  return f"Pattern {self.pattern} must match against {self.text}"
124
149
 
125
150
 
126
- __all__ = ["ExtractGroupError", "ExtractGroupsError", "extract_group", "extract_groups"]
151
+ __all__ = [
152
+ "ExtractGroupError",
153
+ "ExtractGroupsError",
154
+ "ensure_pattern",
155
+ "extract_group",
156
+ "extract_groups",
157
+ ]
@@ -7,6 +7,7 @@ from enum import Enum
7
7
  from logging import Logger
8
8
  from pathlib import Path
9
9
  from random import Random
10
+ from re import Pattern
10
11
  from types import TracebackType
11
12
  from typing import (
12
13
  Any,
@@ -249,6 +250,10 @@ type PathLike = MaybeStr[Path]
249
250
  type Seed = int | float | str | bytes | bytearray | Random
250
251
 
251
252
 
253
+ # re
254
+ type PatternLike = MaybeStr[Pattern[str]]
255
+
256
+
252
257
  # traceback
253
258
  type ExcInfo = tuple[type[BaseException], BaseException, TracebackType]
254
259
  type OptExcInfo = ExcInfo | tuple[None, None, None]
@@ -294,6 +299,7 @@ __all__ = [
294
299
  "Parallelism",
295
300
  "ParseObjectExtra",
296
301
  "PathLike",
302
+ "PatternLike",
297
303
  "RoundMode",
298
304
  "Seed",
299
305
  "SerializeObjectExtra",