dycw-utilities 0.138.5__tar.gz → 0.138.7__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 (215) hide show
  1. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/PKG-INFO +1 -1
  2. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/pyproject.toml +12 -3
  3. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pathlib.py +48 -0
  4. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pytest.py +2 -2
  5. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pytest_regressions.py +4 -10
  6. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/__init__.py +1 -1
  7. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pathlib.py +82 -1
  8. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pytest_regressions.py +1 -38
  9. dycw_utilities-0.138.7/src/utilities/pytest_regressions_plugin.py +51 -0
  10. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/.gitignore +0 -0
  11. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/LICENSE +0 -0
  12. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/README.md +0 -0
  13. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/__init__.py +0 -0
  14. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/conftest.py +0 -0
  15. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/__init__.py +0 -0
  16. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_missing/__init__.py +0 -0
  17. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_missing/module.py +0 -0
  18. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_with/__init__.py +0 -0
  19. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_with/outer_1.py +0 -0
  20. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_with/outer_2.py +0 -0
  21. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  22. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  23. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  24. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  25. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_without/__init__.py +0 -0
  26. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_without/module_1.py +0 -0
  27. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/package_without/module_2.py +0 -0
  28. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/standalone.py +0 -0
  29. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/modules/with_imports.py +0 -0
  30. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  31. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  32. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  33. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  34. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  35. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  36. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  37. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  38. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_aiolimiter.py +0 -0
  39. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_altair.py +0 -0
  40. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_asyncio.py +0 -0
  41. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_asyncio_classes/__init__.py +0 -0
  42. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_asyncio_classes/loopers.py +0 -0
  43. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_asyncio_classes/redis.py +0 -0
  44. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_atomicwrites.py +0 -0
  45. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_atools.py +0 -0
  46. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_cachetools.py +0 -0
  47. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_click.py +0 -0
  48. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_concurrent.py +0 -0
  49. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_contextlib.py +0 -0
  50. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_contextvars.py +0 -0
  51. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_cryptography.py +0 -0
  52. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_cvxpy.py +0 -0
  53. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_dataclasses.py +0 -0
  54. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_enum.py +0 -0
  55. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_errors.py +0 -0
  56. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_eventkit.py +0 -0
  57. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_fastapi.py +0 -0
  58. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_fpdf2.py +0 -0
  59. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_functions.py +0 -0
  60. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_functools.py +0 -0
  61. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_getpass.py +0 -0
  62. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_hashlib.py +0 -0
  63. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_http.py +0 -0
  64. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_hypothesis.py +0 -0
  65. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_importlib.py +0 -0
  66. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_inflect.py +0 -0
  67. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_ipython.py +0 -0
  68. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_iterables.py +0 -0
  69. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_jupyter.py +0 -0
  70. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_libcst.py +0 -0
  71. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_lightweight_charts.py +0 -0
  72. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_logging.py +0 -0
  73. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_luigi.py +0 -0
  74. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_math.py +0 -0
  75. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_memory_profiler.py +0 -0
  76. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_modules.py +0 -0
  77. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_more_itertools.py +0 -0
  78. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_numpy.py +0 -0
  79. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_objects/__init__.py +0 -0
  80. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_objects/objects.py +0 -0
  81. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_operator.py +0 -0
  82. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_optuna.py +0 -0
  83. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_orjson.py +0 -0
  84. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_os.py +0 -0
  85. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_parse.py +0 -0
  86. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_period.py +0 -0
  87. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pickle.py +0 -0
  88. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_platform.py +0 -0
  89. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_polars.py +0 -0
  90. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_polars_ols.py +0 -0
  91. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pottery.py +0 -0
  92. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pqdm.py +0 -0
  93. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_psutil.py +0 -0
  94. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pydantic.py +0 -0
  95. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_pyinstrument.py +0 -0
  96. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_python_dotenv.py +0 -0
  97. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_random.py +0 -0
  98. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_re.py +0 -0
  99. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_redis.py +0 -0
  100. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_reprlib.py +0 -0
  101. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_scipy.py +0 -0
  102. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_sentinel.py +0 -0
  103. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_shelve.py +0 -0
  104. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_slack_sdk.py +0 -0
  105. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_socket.py +0 -0
  106. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_sqlalchemy.py +0 -0
  107. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_sqlalchemy_polars.py +0 -0
  108. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_statsmodels.py +0 -0
  109. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_streamlit.py +0 -0
  110. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_string.py +0 -0
  111. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_tempfile.py +0 -0
  112. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_text.py +0 -0
  113. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_threading.py +0 -0
  114. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_timer.py +0 -0
  115. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_traceback.py +0 -0
  116. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_typed_settings.py +0 -0
  117. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_types.py +0 -0
  118. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_typing.py +0 -0
  119. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_typing_funcs/__init__.py +0 -0
  120. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_typing_funcs/no_future.py +0 -0
  121. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_typing_funcs/with_future.py +0 -0
  122. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_tzdata.py +0 -0
  123. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_tzlocal.py +0 -0
  124. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_uuid.py +0 -0
  125. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_version.py +0 -0
  126. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_warnings.py +0 -0
  127. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_whenever.py +0 -0
  128. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_zipfile.py +0 -0
  129. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/tests/test_zoneinfo.py +0 -0
  130. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/aiolimiter.py +0 -0
  131. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/altair.py +0 -0
  132. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/asyncio.py +0 -0
  133. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/atomicwrites.py +0 -0
  134. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/atools.py +0 -0
  135. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/cachetools.py +0 -0
  136. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/click.py +0 -0
  137. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/concurrent.py +0 -0
  138. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/contextlib.py +0 -0
  139. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/contextvars.py +0 -0
  140. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/cryptography.py +0 -0
  141. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/cvxpy.py +0 -0
  142. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/dataclasses.py +0 -0
  143. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/enum.py +0 -0
  144. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/errors.py +0 -0
  145. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/eventkit.py +0 -0
  146. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/fastapi.py +0 -0
  147. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/fpdf2.py +0 -0
  148. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/functions.py +0 -0
  149. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/functools.py +0 -0
  150. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/getpass.py +0 -0
  151. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/hypothesis.py +0 -0
  154. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/importlib.py +0 -0
  155. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/inflect.py +0 -0
  156. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/ipython.py +0 -0
  157. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/iterables.py +0 -0
  158. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/jupyter.py +0 -0
  159. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/libcst.py +0 -0
  160. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/lightweight_charts.py +0 -0
  161. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/logging.py +0 -0
  162. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/luigi.py +0 -0
  163. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/math.py +0 -0
  164. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/memory_profiler.py +0 -0
  165. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/modules.py +0 -0
  166. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/more_itertools.py +0 -0
  167. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/numpy.py +0 -0
  168. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/operator.py +0 -0
  169. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/optuna.py +0 -0
  170. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/orjson.py +0 -0
  171. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/period.py +0 -0
  174. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pickle.py +0 -0
  175. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/platform.py +0 -0
  176. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/polars.py +0 -0
  177. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/polars_ols.py +0 -0
  178. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pottery.py +0 -0
  179. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pqdm.py +0 -0
  180. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/psutil.py +0 -0
  181. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/py.typed +0 -0
  182. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pydantic.py +0 -0
  183. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pyinstrument.py +0 -0
  184. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/pytest.py +0 -0
  185. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/python_dotenv.py +0 -0
  186. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/random.py +0 -0
  187. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/re.py +0 -0
  188. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/redis.py +0 -0
  189. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/reprlib.py +0 -0
  190. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/scipy.py +0 -0
  191. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/sentinel.py +0 -0
  192. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/shelve.py +0 -0
  193. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/slack_sdk.py +0 -0
  194. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/socket.py +0 -0
  195. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/sqlalchemy.py +0 -0
  196. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/sqlalchemy_polars.py +0 -0
  197. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/statsmodels.py +0 -0
  198. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/streamlit.py +0 -0
  199. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/string.py +0 -0
  200. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/tempfile.py +0 -0
  201. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/text.py +0 -0
  202. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/threading.py +0 -0
  203. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/timer.py +0 -0
  204. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/traceback.py +0 -0
  205. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/typed_settings.py +0 -0
  206. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/types.py +0 -0
  207. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/typing.py +0 -0
  208. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/tzdata.py +0 -0
  209. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/tzlocal.py +0 -0
  210. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/uuid.py +0 -0
  211. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/version.py +0 -0
  212. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/warnings.py +0 -0
  213. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/whenever.py +0 -0
  214. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/zipfile.py +0 -0
  215. {dycw_utilities-0.138.5 → dycw_utilities-0.138.7}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.138.5
3
+ Version: 0.138.7
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -33,6 +33,7 @@ dev = [
33
33
  "pudb >= 2025.1, < 2025.2",
34
34
  "pyright[nodejs] >= 1.1.401, < 1.2",
35
35
  "pytest-cov >= 6.1.1, < 6.2",
36
+ "pytest-timeout >= 2.4.0, < 2.5",
36
37
  ]
37
38
  eventkit = ["eventkit >= 1.0.3, < 1.1"]
38
39
  fastapi = ["fastapi >= 0.115.11, < 0.116"]
@@ -105,7 +106,10 @@ dependencies = [
105
106
  name = "dycw-utilities"
106
107
  readme = "README.md"
107
108
  requires-python = ">= 3.12"
108
- version = "0.138.5"
109
+ version = "0.138.7"
110
+
111
+ [project.entry-points.pytest11]
112
+ pytest-regressions = "utilities.pytest_regressions_plugin"
109
113
 
110
114
  [project.optional-dependencies]
111
115
  logging = [
@@ -133,7 +137,7 @@ test = [
133
137
  # bump-my-version
134
138
  [tool.bumpversion]
135
139
  allow_dirty = true
136
- current_version = "0.138.5"
140
+ current_version = "0.138.7"
137
141
 
138
142
  [[tool.bumpversion.files]]
139
143
  filename = "src/utilities/__init__.py"
@@ -172,7 +176,11 @@ skip_empty = true
172
176
  [tool.coverage.run]
173
177
  branch = true
174
178
  data_file = ".coverage/data"
175
- omit = ["src/utilities/streamlit.py"]
179
+ omit = [
180
+ "src/utilities/__init__.py",
181
+ "src/utilities/pytest_regressions_plugin.py",
182
+ "src/utilities/streamlit.py",
183
+ ]
176
184
  parallel = true
177
185
  plugins = ["coverage_conditional_plugin"]
178
186
  source = ["src/utilities"]
@@ -236,6 +244,7 @@ addopts = [
236
244
  "--durations-min=10",
237
245
  "--pdbcls=pudb.debugger:Debugger",
238
246
  "--strict-markers",
247
+ "--timeout=600",
239
248
  ]
240
249
  asyncio_default_fixture_loop_scope = "function"
241
250
  asyncio_mode = "auto"
@@ -14,10 +14,15 @@ from utilities.dataclasses import replace_non_sentinel
14
14
  from utilities.hypothesis import git_repos, paths, temp_paths
15
15
  from utilities.pathlib import (
16
16
  GetRootError,
17
+ _GetTailDisambiguate,
18
+ _GetTailEmptyError,
19
+ _GetTailLengthError,
20
+ _GetTailNonUniqueError,
17
21
  ensure_suffix,
18
22
  expand_path,
19
23
  get_path,
20
24
  get_root,
25
+ get_tail,
21
26
  is_sub_path,
22
27
  list_dir,
23
28
  temp_cwd,
@@ -175,6 +180,49 @@ class TestGetRoot:
175
180
  _ = get_root(path=tmp_path)
176
181
 
177
182
 
183
+ class TestGetTail:
184
+ @mark.parametrize(
185
+ ("path", "root", "disambiguate", "expected"),
186
+ [
187
+ param("foo/bar/baz", "foo", "raise", Path("bar/baz")),
188
+ param("foo/bar/baz", "foo/bar", "raise", Path("baz")),
189
+ param("a/b/c/d/a/b/c/d/e", "b/c", "earlier", Path("d/a/b/c/d/e")),
190
+ param("a/b/c/d/a/b/c/d/e", "b/c", "later", Path("d/e")),
191
+ ],
192
+ )
193
+ def test_main(
194
+ self,
195
+ *,
196
+ path: PathLike,
197
+ root: PathLike,
198
+ disambiguate: _GetTailDisambiguate,
199
+ expected: Path,
200
+ ) -> None:
201
+ tail = get_tail(path, root, disambiguate=disambiguate)
202
+ assert tail == expected
203
+
204
+ def test_error_length(self) -> None:
205
+ with raises(
206
+ _GetTailLengthError,
207
+ match="Unable to get the tail of 'foo' with root of length 2",
208
+ ):
209
+ _ = get_tail("foo", "bar/baz")
210
+
211
+ def test_error_empty(self) -> None:
212
+ with raises(
213
+ _GetTailEmptyError,
214
+ match="Unable to get the tail of 'foo/bar' with root 'baz'",
215
+ ):
216
+ _ = get_tail("foo/bar", "baz")
217
+
218
+ def test_error_non_unique(self) -> None:
219
+ with raises(
220
+ _GetTailNonUniqueError,
221
+ match="Path '.*' must contain exactly one tail with root 'b'; got '.*', '.*' and perhaps more",
222
+ ):
223
+ _ = get_tail("a/b/c/a/b/c", "b")
224
+
225
+
178
226
  class TestIsSubPath:
179
227
  @mark.parametrize(
180
228
  ("x", "y", "strict", "expected"),
@@ -58,13 +58,13 @@ class TestNodeIdToPath:
58
58
 
59
59
  def test_head(self) -> None:
60
60
  node_id = "src/tests/module/test_funcs.py::TestClass::test_main"
61
- result = node_id_to_path(node_id, head=Path("src/tests"))
61
+ result = node_id_to_path(node_id, head="src/tests")
62
62
  expected = Path("module.test_funcs", "TestClass__test_main")
63
63
  assert result == expected
64
64
 
65
65
  def test_suffix(self) -> None:
66
66
  node_id = "src/tests/module/test_funcs.py::TestClass::test_main"
67
- result = node_id_to_path(node_id, head=Path("src/tests"), suffix=".sv")
67
+ result = node_id_to_path(node_id, head="src/tests", suffix=".sv")
68
68
  expected = Path("module.test_funcs", "TestClass__test_main.sv")
69
69
  assert result == expected
70
70
 
@@ -12,18 +12,12 @@ from tests.test_typing_funcs.with_future import (
12
12
  DataClassFutureNestedOuterFirstInner,
13
13
  DataClassFutureNestedOuterFirstOuter,
14
14
  )
15
- from utilities.pytest_regressions import (
16
- PolarsRegressionFixture,
17
- orjson_regression,
18
- polars_regression,
19
- )
20
15
 
21
16
  if TYPE_CHECKING:
22
- from utilities.pytest_regressions import OrjsonRegressionFixture
23
-
24
-
25
- _ = orjson_regression
26
- _ = polars_regression
17
+ from utilities.pytest_regressions import (
18
+ OrjsonRegressionFixture,
19
+ PolarsRegressionFixture,
20
+ )
27
21
 
28
22
 
29
23
  class TestMultipleRegressionFixtures:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.138.5"
3
+ __version__ = "0.138.7"
@@ -9,7 +9,7 @@ from os.path import expandvars
9
9
  from pathlib import Path
10
10
  from re import IGNORECASE, search
11
11
  from subprocess import PIPE, CalledProcessError, check_output
12
- from typing import TYPE_CHECKING, assert_never, overload, override
12
+ from typing import TYPE_CHECKING, Literal, assert_never, overload, override
13
13
 
14
14
  from utilities.errors import ImpossibleCaseError
15
15
  from utilities.sentinel import Sentinel, sentinel
@@ -132,6 +132,85 @@ class GetRootError(Exception):
132
132
  ##
133
133
 
134
134
 
135
+ type _GetTailDisambiguate = Literal["raise", "earlier", "later"]
136
+
137
+
138
+ def get_tail(
139
+ path: PathLike, root: PathLike, /, *, disambiguate: _GetTailDisambiguate = "raise"
140
+ ) -> Path:
141
+ """Get the tail of a path following a root match."""
142
+ path_parts, root_parts = [Path(p).parts for p in [path, root]]
143
+ len_path, len_root = map(len, [path_parts, root_parts])
144
+ if len_root > len_path:
145
+ raise _GetTailLengthError(path=path, root=root, len_root=len_root)
146
+ candidates = {
147
+ i + len_root: path_parts[i : i + len_root]
148
+ for i in range(len_path + 1 - len_root)
149
+ }
150
+ matches = {k: v for k, v in candidates.items() if v == root_parts}
151
+ match len(matches), disambiguate:
152
+ case 0, _:
153
+ raise _GetTailEmptyError(path=path, root=root)
154
+ case 1, _:
155
+ return _get_tail_core(path, next(iter(matches)))
156
+ case _, "raise":
157
+ first, second, *_ = matches
158
+ raise _GetTailNonUniqueError(
159
+ path=path,
160
+ root=root,
161
+ first=_get_tail_core(path, first),
162
+ second=_get_tail_core(path, second),
163
+ )
164
+ case _, "earlier":
165
+ return _get_tail_core(path, next(iter(matches)))
166
+ case _, "later":
167
+ return _get_tail_core(path, next(iter(reversed(matches))))
168
+ case _ as never:
169
+ assert_never(never)
170
+
171
+
172
+ def _get_tail_core(path: PathLike, i: int, /) -> Path:
173
+ parts = Path(path).parts
174
+ return Path(*parts[i:])
175
+
176
+
177
+ @dataclass(kw_only=True, slots=True)
178
+ class GetTailError(Exception):
179
+ path: PathLike
180
+ root: PathLike
181
+
182
+
183
+ @dataclass(kw_only=True, slots=True)
184
+ class _GetTailLengthError(GetTailError):
185
+ len_root: int
186
+
187
+ @override
188
+ def __str__(self) -> str:
189
+ return f"Unable to get the tail of {str(self.path)!r} with root of length {self.len_root}"
190
+
191
+
192
+ @dataclass(kw_only=True, slots=True)
193
+ class _GetTailEmptyError(GetTailError):
194
+ @override
195
+ def __str__(self) -> str:
196
+ return (
197
+ f"Unable to get the tail of {str(self.path)!r} with root {str(self.root)!r}"
198
+ )
199
+
200
+
201
+ @dataclass(kw_only=True, slots=True)
202
+ class _GetTailNonUniqueError(GetTailError):
203
+ first: Path
204
+ second: Path
205
+
206
+ @override
207
+ def __str__(self) -> str:
208
+ return f"Path {str(self.path)!r} must contain exactly one tail with root {str(self.root)!r}; got {str(self.first)!r}, {str(self.second)!r} and perhaps more"
209
+
210
+
211
+ ##
212
+
213
+
135
214
  def is_sub_path(x: PathLike, y: PathLike, /, *, strict: bool = False) -> bool:
136
215
  """Check if a path is a sub path of another."""
137
216
  x, y = [Path(i).resolve() for i in [x, y]]
@@ -162,9 +241,11 @@ def temp_cwd(path: PathLike, /) -> Iterator[None]:
162
241
 
163
242
  __all__ = [
164
243
  "PWD",
244
+ "GetTailError",
165
245
  "ensure_suffix",
166
246
  "expand_path",
167
247
  "get_path",
248
+ "get_tail",
168
249
  "is_sub_path",
169
250
  "list_dir",
170
251
  "temp_cwd",
@@ -6,13 +6,10 @@ from pathlib import Path
6
6
  from shutil import copytree
7
7
  from typing import TYPE_CHECKING, Any, assert_never
8
8
 
9
- from pytest import fixture
10
9
  from pytest_regressions.file_regression import FileRegressionFixture
11
10
 
12
11
  from utilities.functions import ensure_str
13
12
  from utilities.operator import is_equal
14
- from utilities.pathlib import get_root
15
- from utilities.pytest import node_id_to_path
16
13
 
17
14
  if TYPE_CHECKING:
18
15
  from polars import DataFrame, Series
@@ -21,9 +18,6 @@ if TYPE_CHECKING:
21
18
  from utilities.types import PathLike, StrMapping
22
19
 
23
20
 
24
- _PATH_TESTS = Path("src", "tests")
25
-
26
-
27
21
  ##
28
22
 
29
23
 
@@ -84,15 +78,6 @@ class OrjsonRegressionFixture:
84
78
  assert is_equal(left, right), f"{left=}, {right=}"
85
79
 
86
80
 
87
- @fixture
88
- def orjson_regression(
89
- *, request: FixtureRequest, tmp_path: Path
90
- ) -> OrjsonRegressionFixture:
91
- """Instance of the `OrjsonRegressionFixture`."""
92
- path = _get_path(request)
93
- return OrjsonRegressionFixture(path, request, tmp_path)
94
-
95
-
96
81
  ##
97
82
 
98
83
 
@@ -139,26 +124,4 @@ class PolarsRegressionFixture:
139
124
  self._fixture.check(data, suffix=suffix)
140
125
 
141
126
 
142
- @fixture
143
- def polars_regression(
144
- *, request: FixtureRequest, tmp_path: Path
145
- ) -> PolarsRegressionFixture:
146
- """Instance of the `PolarsRegressionFixture`."""
147
- path = _get_path(request)
148
- return PolarsRegressionFixture(path, request, tmp_path)
149
-
150
-
151
- ##
152
-
153
-
154
- def _get_path(request: FixtureRequest, /) -> Path:
155
- tail = node_id_to_path(request.node.nodeid, head=_PATH_TESTS)
156
- return get_root().joinpath(_PATH_TESTS, "regressions", tail)
157
-
158
-
159
- __all__ = [
160
- "OrjsonRegressionFixture",
161
- "PolarsRegressionFixture",
162
- "orjson_regression",
163
- "polars_regression",
164
- ]
127
+ __all__ = ["OrjsonRegressionFixture", "PolarsRegressionFixture"]
@@ -0,0 +1,51 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from pytest import FixtureRequest
8
+
9
+ from utilities.pytest_regressions import (
10
+ OrjsonRegressionFixture,
11
+ PolarsRegressionFixture,
12
+ )
13
+
14
+
15
+ try:
16
+ from pytest import fixture
17
+ except ModuleNotFoundError:
18
+ pass
19
+ else:
20
+
21
+ @fixture
22
+ def orjson_regression(
23
+ *, request: FixtureRequest, tmp_path: Path
24
+ ) -> OrjsonRegressionFixture:
25
+ """Instance of the `OrjsonRegressionFixture`."""
26
+ from utilities.pytest_regressions import OrjsonRegressionFixture
27
+
28
+ path = _get_path(request)
29
+ return OrjsonRegressionFixture(path, request, tmp_path)
30
+
31
+ @fixture
32
+ def polars_regression(
33
+ *, request: FixtureRequest, tmp_path: Path
34
+ ) -> PolarsRegressionFixture:
35
+ """Instance of the `PolarsRegressionFixture`."""
36
+ from utilities.pytest_regressions import PolarsRegressionFixture
37
+
38
+ path = _get_path(request)
39
+ return PolarsRegressionFixture(path, request, tmp_path)
40
+
41
+
42
+ def _get_path(request: FixtureRequest, /) -> Path:
43
+ from utilities.pathlib import get_root
44
+ from utilities.pytest import node_id_to_path
45
+
46
+ head = Path("src", "tests")
47
+ tail = node_id_to_path(request.node.nodeid, head=head)
48
+ return get_root().joinpath(head, "regressions", tail)
49
+
50
+
51
+ __all__ = ["orjson_regression", "polars_regression"]