dycw-utilities 0.166.18__tar.gz → 0.166.19__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 (218) hide show
  1. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/PKG-INFO +1 -1
  2. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/pyproject.toml +2 -2
  3. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pydantic_settings.py +0 -48
  4. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/__init__.py +1 -1
  5. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pydantic_settings.py +33 -46
  6. dycw_utilities-0.166.19/src/utilities/pydantic_settings_sops.py +62 -0
  7. dycw_utilities-0.166.18/src/utilities/pydantic_settings_sops.py +0 -39
  8. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/.gitignore +0 -0
  9. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/LICENSE +0 -0
  10. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/README.md +0 -0
  11. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/__init__.py +0 -0
  12. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/conftest.py +0 -0
  13. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/__init__.py +0 -0
  14. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_missing/__init__.py +0 -0
  15. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_missing/module.py +0 -0
  16. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_with/__init__.py +0 -0
  17. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_with/outer_1.py +0 -0
  18. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_with/outer_2.py +0 -0
  19. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_with/subpackage/__init__.py +0 -0
  20. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_with/subpackage/inner_1.py +0 -0
  21. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_with/subpackage/inner_2.py +0 -0
  22. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_with/subpackage/inner_3.py +0 -0
  23. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_without/__init__.py +0 -0
  24. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_without/module_1.py +0 -0
  25. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/package_without/module_2.py +0 -0
  26. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/standalone.py +0 -0
  27. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/modules/with_imports.py +0 -0
  28. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__obj.json +0 -0
  29. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestMultipleRegressionFixtures__test_main__series.json +0 -0
  30. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_int.json +0 -0
  31. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__false.json +0 -0
  32. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_literal__true.json +0 -0
  33. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestOrjsonRegressionFixture__test_dataclass_nested.json +0 -0
  34. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_dataframe.json +0 -0
  35. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/regressions/test_pytest_regressions/TestPolarsRegressionFixture__test_series.json +0 -0
  36. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_aeventkit.py +0 -0
  37. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_altair.py +0 -0
  38. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_asyncio.py +0 -0
  39. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_atomicwrites.py +0 -0
  40. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_atools.py +0 -0
  41. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_cachetools.py +0 -0
  42. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_click.py +0 -0
  43. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_concurrent.py +0 -0
  44. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_contextlib.py +0 -0
  45. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_contextvars.py +0 -0
  46. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_cryptography.py +0 -0
  47. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_cvxpy.py +0 -0
  48. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_dataclasses.py +0 -0
  49. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_enum.py +0 -0
  50. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_errors.py +0 -0
  51. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_fastapi.py +0 -0
  52. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_fpdf2.py +0 -0
  53. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_functions.py +0 -0
  54. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_functools.py +0 -0
  55. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_getpass.py +0 -0
  56. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_git.py +0 -0
  57. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_gzip.py +0 -0
  58. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_hashlib.py +0 -0
  59. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_http.py +0 -0
  60. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_hypothesis.py +0 -0
  61. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_importlib.py +0 -0
  62. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_inflect.py +0 -0
  63. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_ipython.py +0 -0
  64. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_iterables.py +0 -0
  65. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_json.py +0 -0
  66. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_jupyter.py +0 -0
  67. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_libcst.py +0 -0
  68. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_lightweight_charts.py +0 -0
  69. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_logging.py +0 -0
  70. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_math.py +0 -0
  71. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_memory_profiler.py +0 -0
  72. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_modules.py +0 -0
  73. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_more_itertools.py +0 -0
  74. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_numpy.py +0 -0
  75. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_objects/__init__.py +0 -0
  76. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_objects/objects.py +0 -0
  77. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_operator.py +0 -0
  78. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_optuna.py +0 -0
  79. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_orjson.py +0 -0
  80. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_os.py +0 -0
  81. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_parse.py +0 -0
  82. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pathlib.py +0 -0
  83. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pickle.py +0 -0
  84. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_platform.py +0 -0
  85. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_polars.py +0 -0
  86. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_polars_ols.py +0 -0
  87. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_postgres.py +0 -0
  88. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pottery.py +0 -0
  89. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pqdm.py +0 -0
  90. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_psutil.py +0 -0
  91. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pydantic_settings_sops.py +0 -0
  92. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pyinstrument.py +0 -0
  93. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pytest.py +0 -0
  94. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pytest_randomly.py +0 -0
  95. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_pytest_regressions.py +0 -0
  96. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_random.py +0 -0
  97. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_re.py +0 -0
  98. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_redis.py +0 -0
  99. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_reprlib.py +0 -0
  100. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_scipy.py +0 -0
  101. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_sentinel.py +0 -0
  102. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_shelve.py +0 -0
  103. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_slack_sdk.py +0 -0
  104. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_socket.py +0 -0
  105. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_sqlalchemy.py +0 -0
  106. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_sqlalchemy_polars.py +0 -0
  107. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_statsmodels.py +0 -0
  108. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_string.py +0 -0
  109. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_tempfile.py +0 -0
  110. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_testbook.py +0 -0
  111. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_text.py +0 -0
  112. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_threading.py +0 -0
  113. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_timer.py +0 -0
  114. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_traceback.py +0 -0
  115. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_typed_settings.py +0 -0
  116. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_types.py +0 -0
  117. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_typing.py +0 -0
  118. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_typing_funcs/__init__.py +0 -0
  119. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_typing_funcs/no_future.py +0 -0
  120. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_typing_funcs/with_future.py +0 -0
  121. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_tzdata.py +0 -0
  122. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_tzlocal.py +0 -0
  123. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_uuid.py +0 -0
  124. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_version.py +0 -0
  125. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_warnings.py +0 -0
  126. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_whenever.py +0 -0
  127. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_zipfile.py +0 -0
  128. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/tests/test_zoneinfo.py +0 -0
  129. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/aeventkit.py +0 -0
  130. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/altair.py +0 -0
  131. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/asyncio.py +0 -0
  132. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/atomicwrites.py +0 -0
  133. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/atools.py +0 -0
  134. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/cachetools.py +0 -0
  135. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/click.py +0 -0
  136. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/concurrent.py +0 -0
  137. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/contextlib.py +0 -0
  138. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/contextvars.py +0 -0
  139. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/cryptography.py +0 -0
  140. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/cvxpy.py +0 -0
  141. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/dataclasses.py +0 -0
  142. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/enum.py +0 -0
  143. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/errors.py +0 -0
  144. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/fastapi.py +0 -0
  145. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/fpdf2.py +0 -0
  146. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/functions.py +0 -0
  147. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/functools.py +0 -0
  148. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/getpass.py +0 -0
  149. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/git.py +0 -0
  150. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/gzip.py +0 -0
  151. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/hashlib.py +0 -0
  152. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/http.py +0 -0
  153. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/hypothesis.py +0 -0
  154. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/importlib.py +0 -0
  155. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/inflect.py +0 -0
  156. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/ipython.py +0 -0
  157. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/iterables.py +0 -0
  158. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/json.py +0 -0
  159. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/jupyter.py +0 -0
  160. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/libcst.py +0 -0
  161. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/lightweight_charts.py +0 -0
  162. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/logging.py +0 -0
  163. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/math.py +0 -0
  164. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/memory_profiler.py +0 -0
  165. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/modules.py +0 -0
  166. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/more_itertools.py +0 -0
  167. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/numpy.py +0 -0
  168. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/operator.py +0 -0
  169. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/optuna.py +0 -0
  170. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/orjson.py +0 -0
  171. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/os.py +0 -0
  172. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/parse.py +0 -0
  173. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pathlib.py +0 -0
  174. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pickle.py +0 -0
  175. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/platform.py +0 -0
  176. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/polars.py +0 -0
  177. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/polars_ols.py +0 -0
  178. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/postgres.py +0 -0
  179. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pottery.py +0 -0
  180. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pqdm.py +0 -0
  181. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/psutil.py +0 -0
  182. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/py.typed +0 -0
  183. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pyinstrument.py +0 -0
  184. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pytest.py +0 -0
  185. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pytest_plugins/__init__.py +0 -0
  186. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  187. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  188. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/pytest_regressions.py +0 -0
  189. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/random.py +0 -0
  190. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/re.py +0 -0
  191. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/redis.py +0 -0
  192. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/reprlib.py +0 -0
  193. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/scipy.py +0 -0
  194. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/sentinel.py +0 -0
  195. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/shelve.py +0 -0
  196. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/slack_sdk.py +0 -0
  197. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/socket.py +0 -0
  198. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/sqlalchemy.py +0 -0
  199. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/sqlalchemy_polars.py +0 -0
  200. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/statsmodels.py +0 -0
  201. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/string.py +0 -0
  202. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/tempfile.py +0 -0
  203. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/testbook.py +0 -0
  204. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/text.py +0 -0
  205. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/threading.py +0 -0
  206. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/timer.py +0 -0
  207. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/traceback.py +0 -0
  208. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/typed_settings.py +0 -0
  209. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/types.py +0 -0
  210. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/typing.py +0 -0
  211. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/tzdata.py +0 -0
  212. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/tzlocal.py +0 -0
  213. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/uuid.py +0 -0
  214. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/version.py +0 -0
  215. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/warnings.py +0 -0
  216. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/whenever.py +0 -0
  217. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/src/utilities/zipfile.py +0 -0
  218. {dycw_utilities-0.166.18 → dycw_utilities-0.166.19}/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.18
3
+ Version: 0.166.19
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.18"
249
+ version = "0.166.19"
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.18"
282
+ current_version = "0.166.19"
283
283
 
284
284
  [[tool.bumpversion.files]]
285
285
  filename = "src/utilities/__init__.py"
@@ -66,30 +66,6 @@ class TestCustomBaseSettings:
66
66
  settings = load_settings(Settings)
67
67
  assert settings.x == 1
68
68
 
69
- def test_toml_section_str(self, *, tmp_path: Path) -> None:
70
- file = tmp_path.joinpath("settings.toml")
71
- _ = file.write_text(tomlkit.dumps({"outer": {"x": 1}}))
72
-
73
- class Settings(CustomBaseSettings):
74
- toml_files: ClassVar[Sequence[PathLikeOrWithSection]] = [(file, "outer")]
75
- x: int
76
-
77
- settings = load_settings(Settings)
78
- assert settings.x == 1
79
-
80
- def test_toml_section_nested(self, *, tmp_path: Path) -> None:
81
- file = tmp_path.joinpath("settings.toml")
82
- _ = file.write_text(tomlkit.dumps({"outer": {"middle": {"x": 1}}}))
83
-
84
- class Settings(CustomBaseSettings):
85
- toml_files: ClassVar[Sequence[PathLikeOrWithSection]] = [
86
- (file, ["outer", "middle"])
87
- ]
88
- x: int
89
-
90
- settings = load_settings(Settings)
91
- assert settings.x == 1
92
-
93
69
  def test_yaml(self, *, tmp_path: Path) -> None:
94
70
  file = tmp_path.joinpath("settings.yaml")
95
71
  _ = file.write_text(yaml.dump({"x": 1}))
@@ -101,30 +77,6 @@ class TestCustomBaseSettings:
101
77
  settings = load_settings(Settings)
102
78
  assert settings.x == 1
103
79
 
104
- def test_yaml_section_str(self, *, tmp_path: Path) -> None:
105
- file = tmp_path.joinpath("settings.yaml")
106
- _ = file.write_text(yaml.dump({"outer": {"x": 1}}))
107
-
108
- class Settings(CustomBaseSettings):
109
- yaml_files: ClassVar[Sequence[PathLikeOrWithSection]] = [(file, "outer")]
110
- x: int
111
-
112
- settings = load_settings(Settings)
113
- assert settings.x == 1
114
-
115
- def test_yaml_section_nested(self, *, tmp_path: Path) -> None:
116
- file = tmp_path.joinpath("settings.yaml")
117
- _ = file.write_text(yaml.dump({"outer": {"middle": {"x": 1}}}))
118
-
119
- class Settings(CustomBaseSettings):
120
- yaml_files: ClassVar[Sequence[PathLikeOrWithSection]] = [
121
- (file, ["outer", "middle"])
122
- ]
123
- x: int
124
-
125
- settings = load_settings(Settings)
126
- assert settings.x == 1
127
-
128
80
  def test_env_var(self) -> None:
129
81
  class Settings(CustomBaseSettings):
130
82
  x: int
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.166.18"
3
+ __version__ = "0.166.19"
@@ -24,7 +24,8 @@ if TYPE_CHECKING:
24
24
  from utilities.types import MaybeSequenceStr, PathLike
25
25
 
26
26
 
27
- type PathLikeOrWithSection = PathLike | tuple[PathLike, MaybeSequenceStr]
27
+ type PathLikeWithSection = tuple[PathLike, MaybeSequenceStr]
28
+ type PathLikeOrWithSection = PathLike | PathLikeWithSection
28
29
 
29
30
 
30
31
  class CustomBaseSettings(BaseSettings):
@@ -61,36 +62,18 @@ class CustomBaseSettings(BaseSettings):
61
62
  /,
62
63
  ) -> Iterator[PydanticBaseSettingsSource]:
63
64
  yield env_settings
64
- for json in cls.json_files:
65
- match json:
66
- case Path() | str():
67
- yield JsonConfigSettingsSource(settings_cls, json_file=json)
68
- case Path() | str() as file, str() | list() | tuple() as section:
69
- yield JsonConfigSectionSettingsSource(
70
- settings_cls, json_file=file, section=section
71
- )
72
- case never:
73
- assert_never(never)
74
- for toml in cls.toml_files:
75
- match toml:
76
- case Path() | str():
77
- yield TomlConfigSettingsSource(settings_cls, toml_file=toml)
78
- case Path() | str() as file, str() | list() | tuple() as section:
79
- yield TomlConfigSectionSettingsSource(
80
- settings_cls, toml_file=file, section=section
81
- )
82
- case never:
83
- assert_never(never)
84
- for yaml in cls.yaml_files:
85
- match yaml:
86
- case Path() | str():
87
- yield YamlConfigSettingsSource(settings_cls, yaml_file=yaml)
88
- case Path() | str() as file, str() | list() | tuple() as section:
89
- yield YamlConfigSectionSettingsSource(
90
- settings_cls, yaml_file=file, section=section
91
- )
92
- case never:
93
- assert_never(never)
65
+ for file, section in map(_ensure_section, cls.json_files):
66
+ yield JsonConfigSectionSettingsSource(
67
+ settings_cls, json_file=file, section=section
68
+ )
69
+ for file, section in map(_ensure_section, cls.toml_files):
70
+ yield TomlConfigSectionSettingsSource(
71
+ settings_cls, toml_file=file, section=section
72
+ )
73
+ for file, section in map(_ensure_section, cls.yaml_files):
74
+ yield YamlConfigSectionSettingsSource(
75
+ settings_cls, yaml_file=file, section=section
76
+ )
94
77
 
95
78
 
96
79
  def load_settings[T: BaseSettings](cls: type[T], /) -> T:
@@ -115,11 +98,7 @@ class JsonConfigSectionSettingsSource(JsonConfigSettingsSource):
115
98
 
116
99
  @override
117
100
  def __call__(self) -> dict[str, Any]:
118
- return reduce(
119
- lambda acc, el: acc.get(el, {}),
120
- always_iterable(self.section),
121
- super().__call__(),
122
- )
101
+ return _get_section(super().__call__(), self.section)
123
102
 
124
103
 
125
104
  class TomlConfigSectionSettingsSource(TomlConfigSettingsSource):
@@ -136,11 +115,7 @@ class TomlConfigSectionSettingsSource(TomlConfigSettingsSource):
136
115
 
137
116
  @override
138
117
  def __call__(self) -> dict[str, Any]:
139
- return reduce(
140
- lambda acc, el: acc.get(el, {}),
141
- always_iterable(self.section),
142
- super().__call__(),
143
- )
118
+ return _get_section(super().__call__(), self.section)
144
119
 
145
120
 
146
121
  class YamlConfigSectionSettingsSource(YamlConfigSettingsSource):
@@ -164,11 +139,23 @@ class YamlConfigSectionSettingsSource(YamlConfigSettingsSource):
164
139
 
165
140
  @override
166
141
  def __call__(self) -> dict[str, Any]:
167
- return reduce(
168
- lambda acc, el: acc.get(el, {}),
169
- always_iterable(self.section),
170
- super().__call__(),
171
- )
142
+ return _get_section(super().__call__(), self.section)
143
+
144
+
145
+ def _ensure_section(file: PathLikeOrWithSection, /) -> PathLikeWithSection:
146
+ match file:
147
+ case Path() | str():
148
+ return file, []
149
+ case Path() | str() as path, str() | list() | tuple() as section:
150
+ return path, section
151
+ case never:
152
+ assert_never(never)
153
+
154
+
155
+ def _get_section(
156
+ mapping: dict[str, Any], section: MaybeSequenceStr, /
157
+ ) -> dict[str, Any]:
158
+ return reduce(lambda acc, el: acc.get(el, {}), always_iterable(section), mapping)
172
159
 
173
160
 
174
161
  __all__ = [
@@ -0,0 +1,62 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any, ClassVar, override
4
+
5
+ from pydantic_settings.sources import DEFAULT_PATH
6
+ from pydantic_settings_sops import SOPSConfigSettingsSource
7
+
8
+ from utilities.pydantic_settings import (
9
+ CustomBaseSettings,
10
+ _ensure_section,
11
+ _get_section,
12
+ )
13
+
14
+ if TYPE_CHECKING:
15
+ from collections.abc import Iterator, Sequence
16
+
17
+ from pydantic_settings import BaseSettings, PydanticBaseSettingsSource
18
+ from pydantic_settings.sources import PathType
19
+
20
+ from utilities.types import MaybeSequenceStr, PathLike
21
+
22
+
23
+ class SopsBaseSettings(CustomBaseSettings):
24
+ """Base settings for loading secrets using `sops/age`."""
25
+
26
+ # paths
27
+ secret_files: ClassVar[Sequence[PathLike]] = ()
28
+
29
+ @classmethod
30
+ @override
31
+ def _yield_base_settings_sources(
32
+ cls,
33
+ settings_cls: type[BaseSettings],
34
+ env_settings: PydanticBaseSettingsSource,
35
+ /,
36
+ ) -> Iterator[PydanticBaseSettingsSource]:
37
+ yield from super()._yield_base_settings_sources(settings_cls, env_settings)
38
+ for file, section in map(_ensure_section, cls.secret_files):
39
+ yield SOPSConfigSectionSettingsSource(
40
+ settings_cls, json_file=file, section=section
41
+ )
42
+
43
+
44
+ class SOPSConfigSectionSettingsSource(SOPSConfigSettingsSource):
45
+ @override
46
+ def __init__(
47
+ self,
48
+ settings_cls: type[BaseSettings],
49
+ json_file: PathType | None = DEFAULT_PATH,
50
+ yaml_file: PathType | None = DEFAULT_PATH,
51
+ *,
52
+ section: MaybeSequenceStr,
53
+ ) -> None:
54
+ super().__init__(settings_cls, json_file=json_file, yaml_file=yaml_file) # pyright: ignore[reportArgumentType]
55
+ self.section = section
56
+
57
+ @override
58
+ def __call__(self) -> dict[str, Any]:
59
+ return _get_section(super().__call__(), self.section)
60
+
61
+
62
+ __all__ = ["SOPSConfigSectionSettingsSource", "SopsBaseSettings"]
@@ -1,39 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING, ClassVar, override
4
-
5
- from pydantic_settings_sops import SOPSConfigSettingsSource
6
-
7
- from utilities.pydantic_settings import CustomBaseSettings
8
-
9
- if TYPE_CHECKING:
10
- from collections.abc import Iterator, Sequence
11
-
12
- from pydantic_settings import BaseSettings, PydanticBaseSettingsSource
13
-
14
- from utilities.types import PathLike
15
-
16
-
17
- class SopsBaseSettings(CustomBaseSettings):
18
- """Base settings for loading secrets using `sops/age`."""
19
-
20
- # paths
21
- secret_files: ClassVar[Sequence[PathLike]] = ()
22
-
23
- @classmethod
24
- @override
25
- def _yield_base_settings_sources(
26
- cls,
27
- settings_cls: type[BaseSettings],
28
- env_settings: PydanticBaseSettingsSource,
29
- /,
30
- ) -> Iterator[PydanticBaseSettingsSource]:
31
- yield from super()._yield_base_settings_sources(settings_cls, env_settings)
32
- for file in cls.secret_files:
33
- yield SOPSConfigSettingsSource(
34
- settings_cls, # pyright: ignore[reportArgumentType],
35
- json_file=file,
36
- )
37
-
38
-
39
- __all__ = ["SopsBaseSettings"]