dycw-utilities 0.166.19__tar.gz → 0.166.21__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 (217) hide show
  1. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/PKG-INFO +1 -1
  2. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/pyproject.toml +2 -2
  3. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pydantic_settings_sops.py +2 -4
  4. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pytest.py +32 -7
  5. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/__init__.py +1 -1
  6. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pydantic_settings_sops.py +3 -2
  7. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pytest.py +29 -3
  8. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pytest_plugins/pytest_regressions.py +6 -2
  9. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/.gitignore +0 -0
  10. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/LICENSE +0 -0
  11. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/README.md +0 -0
  12. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/__init__.py +0 -0
  13. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/conftest.py +0 -0
  14. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/__init__.py +0 -0
  15. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_missing/__init__.py +0 -0
  16. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_missing/module.py +0 -0
  17. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_with/__init__.py +0 -0
  18. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_with/outer_1.py +0 -0
  19. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_with/outer_2.py +0 -0
  20. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  21. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  22. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  23. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  24. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_without/__init__.py +0 -0
  25. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_without/module_1.py +0 -0
  26. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/package_without/module_2.py +0 -0
  27. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/standalone.py +0 -0
  28. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/modules/with_imports.py +0 -0
  29. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  30. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  31. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  32. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  33. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  34. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  35. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  36. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  37. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_aeventkit.py +0 -0
  38. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_altair.py +0 -0
  39. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_asyncio.py +0 -0
  40. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_atomicwrites.py +0 -0
  41. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_atools.py +0 -0
  42. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_cachetools.py +0 -0
  43. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_click.py +0 -0
  44. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_concurrent.py +0 -0
  45. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_contextlib.py +0 -0
  46. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_contextvars.py +0 -0
  47. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_cryptography.py +0 -0
  48. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_cvxpy.py +0 -0
  49. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_dataclasses.py +0 -0
  50. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_enum.py +0 -0
  51. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_errors.py +0 -0
  52. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_fastapi.py +0 -0
  53. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_fpdf2.py +0 -0
  54. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_functions.py +0 -0
  55. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_functools.py +0 -0
  56. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_getpass.py +0 -0
  57. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_git.py +0 -0
  58. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_gzip.py +0 -0
  59. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_hashlib.py +0 -0
  60. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_http.py +0 -0
  61. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_hypothesis.py +0 -0
  62. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_importlib.py +0 -0
  63. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_inflect.py +0 -0
  64. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_ipython.py +0 -0
  65. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_iterables.py +0 -0
  66. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_json.py +0 -0
  67. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_jupyter.py +0 -0
  68. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_libcst.py +0 -0
  69. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_lightweight_charts.py +0 -0
  70. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_logging.py +0 -0
  71. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_math.py +0 -0
  72. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_memory_profiler.py +0 -0
  73. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_modules.py +0 -0
  74. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_more_itertools.py +0 -0
  75. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_numpy.py +0 -0
  76. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_objects/__init__.py +0 -0
  77. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_objects/objects.py +0 -0
  78. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_operator.py +0 -0
  79. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_optuna.py +0 -0
  80. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_orjson.py +0 -0
  81. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_os.py +0 -0
  82. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_parse.py +0 -0
  83. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pathlib.py +0 -0
  84. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pickle.py +0 -0
  85. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_platform.py +0 -0
  86. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_polars.py +0 -0
  87. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_polars_ols.py +0 -0
  88. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_postgres.py +0 -0
  89. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pottery.py +0 -0
  90. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pqdm.py +0 -0
  91. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_psutil.py +0 -0
  92. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pydantic_settings.py +0 -0
  93. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pyinstrument.py +0 -0
  94. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pytest_randomly.py +0 -0
  95. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_random.py +0 -0
  97. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_re.py +0 -0
  98. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_redis.py +0 -0
  99. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_reprlib.py +0 -0
  100. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_scipy.py +0 -0
  101. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_sentinel.py +0 -0
  102. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_shelve.py +0 -0
  103. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_slack_sdk.py +0 -0
  104. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_socket.py +0 -0
  105. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_sqlalchemy.py +0 -0
  106. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_sqlalchemy_polars.py +0 -0
  107. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_statsmodels.py +0 -0
  108. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_string.py +0 -0
  109. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_tempfile.py +0 -0
  110. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_testbook.py +0 -0
  111. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_text.py +0 -0
  112. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_threading.py +0 -0
  113. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_timer.py +0 -0
  114. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_traceback.py +0 -0
  115. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_typed_settings.py +0 -0
  116. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_types.py +0 -0
  117. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_typing.py +0 -0
  118. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_typing_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_typing_funcs/no_future.py +0 -0
  120. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_typing_funcs/with_future.py +0 -0
  121. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_tzdata.py +0 -0
  122. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_tzlocal.py +0 -0
  123. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_uuid.py +0 -0
  124. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_version.py +0 -0
  125. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_warnings.py +0 -0
  126. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_whenever.py +0 -0
  127. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_zipfile.py +0 -0
  128. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/tests/test_zoneinfo.py +0 -0
  129. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/aeventkit.py +0 -0
  130. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/altair.py +0 -0
  131. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/asyncio.py +0 -0
  132. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/atomicwrites.py +0 -0
  133. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/atools.py +0 -0
  134. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/cachetools.py +0 -0
  135. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/click.py +0 -0
  136. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/concurrent.py +0 -0
  137. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/contextlib.py +0 -0
  138. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/contextvars.py +0 -0
  139. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/cryptography.py +0 -0
  140. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/cvxpy.py +0 -0
  141. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/dataclasses.py +0 -0
  142. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/fastapi.py +0 -0
  145. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/fpdf2.py +0 -0
  146. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/functions.py +0 -0
  147. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/functools.py +0 -0
  148. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/getpass.py +0 -0
  149. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/git.py +0 -0
  150. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/gzip.py +0 -0
  151. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/hypothesis.py +0 -0
  154. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/importlib.py +0 -0
  155. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/inflect.py +0 -0
  156. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/ipython.py +0 -0
  157. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/iterables.py +0 -0
  158. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/json.py +0 -0
  159. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/jupyter.py +0 -0
  160. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/libcst.py +0 -0
  161. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/lightweight_charts.py +0 -0
  162. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/logging.py +0 -0
  163. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/math.py +0 -0
  164. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/memory_profiler.py +0 -0
  165. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/modules.py +0 -0
  166. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/more_itertools.py +0 -0
  167. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/numpy.py +0 -0
  168. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/operator.py +0 -0
  169. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/optuna.py +0 -0
  170. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/orjson.py +0 -0
  171. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pathlib.py +0 -0
  174. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pickle.py +0 -0
  175. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/platform.py +0 -0
  176. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/polars.py +0 -0
  177. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/polars_ols.py +0 -0
  178. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/postgres.py +0 -0
  179. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pottery.py +0 -0
  180. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pqdm.py +0 -0
  181. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/psutil.py +0 -0
  182. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/py.typed +0 -0
  183. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pydantic_settings.py +0 -0
  184. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pyinstrument.py +0 -0
  185. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pytest_plugins/__init__.py +0 -0
  186. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  187. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/random.py +0 -0
  189. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/re.py +0 -0
  190. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/redis.py +0 -0
  191. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/reprlib.py +0 -0
  192. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/scipy.py +0 -0
  193. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/sentinel.py +0 -0
  194. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/shelve.py +0 -0
  195. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/slack_sdk.py +0 -0
  196. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/socket.py +0 -0
  197. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/sqlalchemy.py +0 -0
  198. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/sqlalchemy_polars.py +0 -0
  199. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/statsmodels.py +0 -0
  200. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/string.py +0 -0
  201. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/tempfile.py +0 -0
  202. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/testbook.py +0 -0
  203. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/text.py +0 -0
  204. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/threading.py +0 -0
  205. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/timer.py +0 -0
  206. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/traceback.py +0 -0
  207. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/typed_settings.py +0 -0
  208. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/types.py +0 -0
  209. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/typing.py +0 -0
  210. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/tzdata.py +0 -0
  211. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/tzlocal.py +0 -0
  212. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/uuid.py +0 -0
  213. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/version.py +0 -0
  214. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/warnings.py +0 -0
  215. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/whenever.py +0 -0
  216. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/zipfile.py +0 -0
  217. {dycw_utilities-0.166.19 → dycw_utilities-0.166.21}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.166.19
3
+ Version: 0.166.21
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -246,7 +246,7 @@ dependencies = [
246
246
  name = "dycw-utilities"
247
247
  readme = "README.md"
248
248
  requires-python = ">= 3.12"
249
- version = "0.166.19"
249
+ version = "0.166.21"
250
250
 
251
251
  [project.entry-points.pytest11]
252
252
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -279,7 +279,7 @@ test = [
279
279
  # bump-my-version
280
280
  [tool.bumpversion]
281
281
  allow_dirty = true
282
- current_version = "0.166.19"
282
+ current_version = "0.166.21"
283
283
 
284
284
  [[tool.bumpversion.files]]
285
285
  filename = "src/utilities/__init__.py"
@@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, ClassVar
8
8
  from tests.conftest import SKIPIF_CI
9
9
  from utilities.iterables import one
10
10
  from utilities.os import temp_environ
11
- from utilities.pydantic_settings import load_settings
11
+ from utilities.pydantic_settings import PathLikeOrWithSection, load_settings
12
12
  from utilities.pydantic_settings_sops import SopsBaseSettings
13
13
  from utilities.re import extract_group
14
14
 
@@ -16,8 +16,6 @@ if TYPE_CHECKING:
16
16
  from collections.abc import Sequence
17
17
  from pathlib import Path
18
18
 
19
- from utilities.types import PathLike
20
-
21
19
 
22
20
  class TestSOPSBaseSettings:
23
21
  @SKIPIF_CI
@@ -40,7 +38,7 @@ class TestSOPSBaseSettings:
40
38
  _ = check_call(["sops", "encrypt", str(unencrypted_file)], stdout=file)
41
39
 
42
40
  class Settings(SopsBaseSettings):
43
- secret_files: ClassVar[Sequence[PathLike]] = [encrypted_file]
41
+ secret_files: ClassVar[Sequence[PathLikeOrWithSection]] = [encrypted_file]
44
42
  x: int
45
43
  y: int
46
44
 
@@ -9,7 +9,12 @@ from pytest import fixture, mark, param, raises
9
9
 
10
10
  from utilities.iterables import one
11
11
  from utilities.os import temp_environ
12
- from utilities.pytest import NodeIdToPathError, node_id_path, throttle
12
+ from utilities.pytest import (
13
+ _NodeIdToPathNotGetTailError,
14
+ _NodeIdToPathNotPythonFileError,
15
+ node_id_path,
16
+ throttle,
17
+ )
13
18
 
14
19
  if TYPE_CHECKING:
15
20
  from _pytest.legacypath import Testdir
@@ -51,26 +56,46 @@ class TestNodeIdPath:
51
56
  "node_id",
52
57
  [
53
58
  param("src/tests/module/test_funcs.py::TestClass::test_main"),
59
+ param("tests/module/test_funcs.py::TestClass::test_main"),
54
60
  param(
55
61
  "python/package/src/tests/module/test_funcs.py::TestClass::test_main"
56
62
  ),
57
63
  ],
58
64
  )
59
65
  def test_root(self, *, node_id: str) -> None:
60
- result = node_id_path(node_id, root="src/tests")
66
+ result = node_id_path(node_id, root="tests")
61
67
  expected = Path("module.test_funcs/TestClass__test_main")
62
68
  assert result == expected
63
69
 
64
- def test_suffix(self) -> None:
65
- node_id = "src/tests/module/test_funcs.py::TestClass::test_main"
66
- result = node_id_path(node_id, root="src/tests", suffix=".csv")
70
+ @mark.parametrize(
71
+ "node_id",
72
+ [
73
+ param("src/tests/module/test_funcs.py::TestClass::test_main"),
74
+ param("tests/module/test_funcs.py::TestClass::test_main"),
75
+ ],
76
+ )
77
+ def test_suffix(self, *, node_id: str) -> None:
78
+ result = node_id_path(node_id, root="tests", suffix=".csv")
67
79
  expected = Path("module.test_funcs/TestClass__test_main.csv")
68
80
  assert result == expected
69
81
 
70
- def test_error_file_suffix(self) -> None:
71
- with raises(NodeIdToPathError, match="Node ID must be a Python file; got .*"):
82
+ def test_error_not_python_file(self) -> None:
83
+ with raises(
84
+ _NodeIdToPathNotPythonFileError,
85
+ match="Node ID must be a Python file; got .*",
86
+ ):
72
87
  _ = node_id_path("src/tests/module/test_funcs.csv::TestClass::test_main")
73
88
 
89
+ def test_error_get_tail_error(self) -> None:
90
+ with raises(
91
+ _NodeIdToPathNotGetTailError,
92
+ match=r"Unable to get the tail of 'tests.+module.+test_funcs' with root 'src.+tests'",
93
+ ):
94
+ _ = node_id_path(
95
+ "tests/module/test_funcs.py::TestClass::test_main",
96
+ root=Path("src", "tests"),
97
+ )
98
+
74
99
 
75
100
  class TestPytestOptions:
76
101
  def test_unknown_mark(self, *, testdir: Testdir) -> None:
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.166.19"
3
+ __version__ = "0.166.21"
@@ -7,6 +7,7 @@ from pydantic_settings_sops import SOPSConfigSettingsSource
7
7
 
8
8
  from utilities.pydantic_settings import (
9
9
  CustomBaseSettings,
10
+ PathLikeOrWithSection,
10
11
  _ensure_section,
11
12
  _get_section,
12
13
  )
@@ -17,14 +18,14 @@ if TYPE_CHECKING:
17
18
  from pydantic_settings import BaseSettings, PydanticBaseSettingsSource
18
19
  from pydantic_settings.sources import PathType
19
20
 
20
- from utilities.types import MaybeSequenceStr, PathLike
21
+ from utilities.types import MaybeSequenceStr
21
22
 
22
23
 
23
24
  class SopsBaseSettings(CustomBaseSettings):
24
25
  """Base settings for loading secrets using `sops/age`."""
25
26
 
26
27
  # paths
27
- secret_files: ClassVar[Sequence[PathLike]] = ()
28
+ secret_files: ClassVar[Sequence[PathLikeOrWithSection]] = []
28
29
 
29
30
  @classmethod
30
31
  @override
@@ -13,7 +13,13 @@ from utilities.atomicwrites import writer
13
13
  from utilities.functools import cache
14
14
  from utilities.hashlib import md5_hash
15
15
  from utilities.os import get_env_var
16
- from utilities.pathlib import ensure_suffix, get_root, get_tail, module_path
16
+ from utilities.pathlib import (
17
+ _GetTailEmptyError,
18
+ ensure_suffix,
19
+ get_root,
20
+ get_tail,
21
+ module_path,
22
+ )
17
23
  from utilities.platform import (
18
24
  IS_LINUX,
19
25
  IS_MAC,
@@ -118,10 +124,15 @@ def node_id_path(
118
124
  path_file, *parts = node_id.split("::")
119
125
  path_file = Path(path_file)
120
126
  if path_file.suffix != ".py":
121
- raise NodeIdToPathError(node_id=node_id)
127
+ raise _NodeIdToPathNotPythonFileError(node_id=node_id)
122
128
  path = path_file.with_suffix("")
123
129
  if root is not None:
124
- path = get_tail(path, root)
130
+ try:
131
+ path = get_tail(path, root)
132
+ except _GetTailEmptyError as error:
133
+ raise _NodeIdToPathNotGetTailError(
134
+ node_id=node_id, path=error.path, root=error.root
135
+ ) from None
125
136
  path = Path(module_path(path), "__".join(parts))
126
137
  if suffix is not None:
127
138
  path = ensure_suffix(path, suffix)
@@ -132,11 +143,26 @@ def node_id_path(
132
143
  class NodeIdToPathError(Exception):
133
144
  node_id: str
134
145
 
146
+
147
+ @dataclass(kw_only=True, slots=True)
148
+ class _NodeIdToPathNotPythonFileError(NodeIdToPathError):
135
149
  @override
136
150
  def __str__(self) -> str:
137
151
  return f"Node ID must be a Python file; got {self.node_id!r}"
138
152
 
139
153
 
154
+ @dataclass(kw_only=True, slots=True)
155
+ class _NodeIdToPathNotGetTailError(NodeIdToPathError):
156
+ path: PathLike
157
+ root: PathLike
158
+
159
+ @override
160
+ def __str__(self) -> str:
161
+ return (
162
+ f"Unable to get the tail of {str(self.path)!r} with root {str(self.root)!r}"
163
+ )
164
+
165
+
140
166
  ##
141
167
 
142
168
 
@@ -41,11 +41,15 @@ else:
41
41
 
42
42
  def _get_path(request: FixtureRequest, /) -> Path:
43
43
  from utilities.pathlib import get_root
44
- from utilities.pytest import node_id_path
44
+ from utilities.pytest import _NodeIdToPathNotGetTailError, node_id_path
45
45
 
46
46
  path = Path(cast("Any", request).fspath)
47
47
  root = Path("src", "tests")
48
- tail = node_id_path(request.node.nodeid, root=root)
48
+ try:
49
+ tail = node_id_path(request.node.nodeid, root=root)
50
+ except _NodeIdToPathNotGetTailError:
51
+ root = Path("tests")
52
+ tail = node_id_path(request.node.nodeid, root=root)
49
53
  return get_root(path).joinpath(root, "regressions", tail)
50
54
 
51
55