chutils 3.1.0__tar.gz → 3.2.0__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 (637) hide show
  1. chutils-3.2.0/.chutilsignore +6 -0
  2. {chutils-3.1.0 → chutils-3.2.0}/.gitignore +186 -185
  3. {chutils-3.1.0 → chutils-3.2.0}/PKG-INFO +66 -4
  4. {chutils-3.1.0 → chutils-3.2.0}/README.md +54 -3
  5. chutils-3.2.0/ai-lint.toml +176 -0
  6. {chutils-3.1.0 → chutils-3.2.0}/api_map.md +212 -180
  7. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/plan.md +23 -23
  8. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/custom_config_providers_20260714/plan.md +11 -11
  9. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/plan.md +24 -24
  10. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/plan.md +20 -20
  11. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/plan.md +18 -18
  12. {chutils-3.1.0 → chutils-3.2.0}/conductor/product.md +19 -0
  13. {chutils-3.1.0 → chutils-3.2.0}/conductor/tech-stack.md +16 -0
  14. chutils-3.2.0/conductor/tracks.md +48 -0
  15. {chutils-3.1.0 → chutils-3.2.0}/docs/README_RU.md +53 -3
  16. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_lint.md +444 -388
  17. {chutils-3.1.0 → chutils-3.2.0}/docs/api.md +32 -0
  18. chutils-3.2.0/docs/audit.md +119 -0
  19. {chutils-3.1.0 → chutils-3.2.0}/docs/captcha.md +112 -112
  20. chutils-3.2.0/docs/cli/db.md +73 -0
  21. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/dev.md +131 -1
  22. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/env.md +62 -62
  23. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/index.md +1 -0
  24. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/pypi.md +121 -121
  25. chutils-3.2.0/docs/custom_config_providers.md +297 -0
  26. {chutils-3.1.0 → chutils-3.2.0}/docs/dependencies.md +110 -108
  27. {chutils-3.1.0 → chutils-3.2.0}/docs/index.md +9 -4
  28. {chutils-3.1.0 → chutils-3.2.0}/docs/recipes.md +13 -3
  29. {chutils-3.1.0 → chutils-3.2.0}/docs/scraping.md +162 -162
  30. chutils-3.2.0/examples/16_cloud_secret_managers.py +76 -0
  31. {chutils-3.1.0 → chutils-3.2.0}/project_index.json +10789 -4998
  32. {chutils-3.1.0 → chutils-3.2.0}/pyproject.toml +14 -4
  33. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/__init__.py +47 -0
  34. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/__init__.pyi +311 -0
  35. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/antigravity.md +6 -6
  36. chutils-3.2.0/src/chutils/audit/__init__.py +44 -0
  37. chutils-3.2.0/src/chutils/audit/_hash.py +22 -0
  38. chutils-3.2.0/src/chutils/audit/api.py +193 -0
  39. chutils-3.2.0/src/chutils/audit/backends/__init__.py +6 -0
  40. chutils-3.2.0/src/chutils/audit/backends/base.py +46 -0
  41. chutils-3.2.0/src/chutils/audit/backends/file.py +123 -0
  42. chutils-3.2.0/src/chutils/audit/backends/postgres.py +224 -0
  43. chutils-3.2.0/src/chutils/audit/backends/sqlite.py +200 -0
  44. chutils-3.2.0/src/chutils/audit/schema.py +116 -0
  45. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cli.py +5 -0
  46. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/__init__.py +3 -1
  47. chutils-3.2.0/src/chutils/commands/db.py +496 -0
  48. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/__init__.py +569 -437
  49. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/ai_lint.py +101 -101
  50. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/base.py +40 -40
  51. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/chat_context.py +100 -100
  52. chutils-3.2.0/src/chutils/commands/dev/dashboard.py +40 -0
  53. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/diagnostics.py +109 -109
  54. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/few_shot.py +55 -55
  55. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/generate_context.py +355 -355
  56. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/hooks.py +185 -185
  57. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/mock.py +87 -87
  58. chutils-3.2.0/src/chutils/commands/dev/profile_imports.py +47 -0
  59. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/scaffold.py +72 -72
  60. chutils-3.2.0/src/chutils/commands/dev/setup_github_actions.py +147 -0
  61. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/dev/sync_env.py +177 -157
  62. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/env.py +191 -191
  63. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/pypi.py +2 -2
  64. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/__init__.py +52 -1
  65. chutils-3.2.0/src/chutils/config/custom_providers.py +290 -0
  66. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/getters.py +63 -2
  67. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/manager.py +26 -2
  68. chutils-3.2.0/src/chutils/db.py +267 -0
  69. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/decorators.py +252 -0
  70. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/__init__.py +25 -23
  71. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/ai_lint.py +437 -436
  72. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/ast_indexer.py +1 -0
  73. chutils-3.2.0/src/chutils/dev/changelog_parser.py +194 -0
  74. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/chat_context.py +441 -441
  75. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/constants.py +13 -13
  76. chutils-3.2.0/src/chutils/dev/dashboard/__init__.py +20 -0
  77. chutils-3.2.0/src/chutils/dev/dashboard/indexer.py +218 -0
  78. chutils-3.2.0/src/chutils/dev/dashboard/input.py +146 -0
  79. chutils-3.2.0/src/chutils/dev/dashboard/tui.py +593 -0
  80. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/env_parser.py +227 -227
  81. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/env_sync.py +113 -113
  82. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/few_shot/detector.py +225 -225
  83. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/few_shot/models.py +61 -61
  84. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/few_shot/renderer.py +455 -455
  85. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/few_shot/writer.py +3 -4
  86. chutils-3.2.0/src/chutils/dev/github_actions.py +91 -0
  87. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/models/__init__.py +17 -17
  88. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/models/base.py +35 -35
  89. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/models/index.py +34 -34
  90. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/models/node.py +19 -19
  91. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/models/symbol.py +21 -21
  92. chutils-3.2.0/src/chutils/dev/profile_imports.py +351 -0
  93. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/__init__.py +24 -20
  94. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/api_map.py +439 -439
  95. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/decomposition.py +96 -96
  96. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/dependency_sync.py +256 -256
  97. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/docstring.py +218 -210
  98. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/env.py +111 -111
  99. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/integration.py +263 -263
  100. chutils-3.2.0/src/chutils/dev/rules/linter_coverage.py +171 -0
  101. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/manifest.py +74 -74
  102. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/rules/security.py +99 -99
  103. chutils-3.2.0/src/chutils/dev/rules/upgrade_check.py +116 -0
  104. chutils-3.2.0/src/chutils/dev/upgrade_client.py +121 -0
  105. chutils-3.2.0/src/chutils/dev/version_detector.py +114 -0
  106. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/diagnostics/__init__.py +24 -24
  107. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/diagnostics/models.py +98 -98
  108. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/diagnostics/web.py +79 -79
  109. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/env.pyi +34 -34
  110. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/__init__.py +80 -73
  111. chutils-3.2.0/src/chutils/exceptions/audit.py +15 -0
  112. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/base.py +66 -66
  113. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/cache.py +7 -7
  114. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/config.py +52 -52
  115. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/di.py +19 -19
  116. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/events.py +34 -34
  117. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/logger.py +7 -7
  118. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/resilience.py +25 -13
  119. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/secrets.py +19 -19
  120. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/system.py +44 -44
  121. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/validation.py +148 -148
  122. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/exceptions/watcher.py +7 -7
  123. chutils-3.2.0/src/chutils/http/__init__.py +51 -0
  124. chutils-3.2.0/src/chutils/http/api.py +167 -0
  125. chutils-3.2.0/src/chutils/http/client.py +678 -0
  126. chutils-3.2.0/src/chutils/http/fallback.py +455 -0
  127. chutils-3.2.0/src/chutils/http/resilience.py +402 -0
  128. chutils-3.2.0/src/chutils/http/tracing.py +139 -0
  129. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/lifecycle.py +1 -4
  130. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/internal/builder.py +2 -1
  131. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/metrics/prometheus.py +2 -6
  132. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/captcha/__init__.py +59 -59
  133. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/captcha/base.py +71 -71
  134. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/humanize/actions.py +268 -268
  135. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/humanize/antidetect.py +123 -123
  136. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/humanize/math_utils.py +223 -223
  137. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/providers/__init__.py +47 -34
  138. chutils-3.2.0/src/chutils/secret_manager/providers/aws.py +134 -0
  139. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/providers/base.py +51 -51
  140. chutils-3.2.0/src/chutils/secret_manager/providers/gcp.py +168 -0
  141. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/providers/keyring_provider.py +124 -124
  142. chutils-3.2.0/src/chutils/tasks/__init__.pyi +49 -0
  143. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/tasks/core.py +18 -6
  144. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/validation.py +138 -138
  145. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/validation.pyi +13 -13
  146. chutils-3.2.0/tests/integration/__init__.py +0 -0
  147. chutils-3.2.0/tests/integration/test_db_migrations.py +351 -0
  148. chutils-3.2.0/tests/integration/test_setup_github_actions_integration.py +35 -0
  149. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev_cmd.py +71 -2
  150. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_pypi.py +426 -426
  151. chutils-3.2.0/tests/unit/cli/test_cli_setup_github_actions.py +92 -0
  152. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_dev.py +187 -187
  153. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_validation_group.py +42 -42
  154. chutils-3.2.0/tests/unit/config/test_custom_config_providers.py +401 -0
  155. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_circuit_breaker.py +238 -238
  156. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_ai_lint.py +744 -734
  157. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_ai_lint_staged.py +129 -129
  158. chutils-3.2.0/tests/unit/dev/test_changelog_parser.py +95 -0
  159. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_env_parser.py +152 -152
  160. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_env_sync.py +49 -49
  161. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_generate_few_shot.py +511 -511
  162. chutils-3.2.0/tests/unit/dev/test_linter_coverage_rule.py +194 -0
  163. chutils-3.2.0/tests/unit/dev/test_setup_github_actions.py +75 -0
  164. chutils-3.2.0/tests/unit/dev/test_upgrade_check_rule.py +55 -0
  165. chutils-3.2.0/tests/unit/dev/test_upgrade_client.py +106 -0
  166. chutils-3.2.0/tests/unit/dev/test_version_detector.py +102 -0
  167. chutils-3.2.0/tests/unit/secret_manager/test_secret_manager_providers.py +455 -0
  168. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/tasks/test_scheduler.py +25 -1
  169. chutils-3.2.0/tests/unit/test_audit.py +365 -0
  170. chutils-3.2.0/tests/unit/test_audit_phase2.py +363 -0
  171. chutils-3.2.0/tests/unit/test_cli_db.py +321 -0
  172. chutils-3.2.0/tests/unit/test_dashboard.py +401 -0
  173. chutils-3.2.0/tests/unit/test_db_init.py +256 -0
  174. chutils-3.2.0/tests/unit/test_db_operations.py +258 -0
  175. chutils-3.2.0/tests/unit/test_decorators_bulkhead.py +269 -0
  176. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_diagnostics.py +367 -367
  177. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_env.py +261 -261
  178. chutils-3.2.0/tests/unit/test_http_api.py +213 -0
  179. chutils-3.2.0/tests/unit/test_http_client.py +344 -0
  180. chutils-3.2.0/tests/unit/test_http_fallback.py +407 -0
  181. chutils-3.2.0/tests/unit/test_http_resilience.py +330 -0
  182. chutils-3.2.0/tests/unit/test_http_tracing.py +226 -0
  183. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_install_hooks.py +120 -120
  184. chutils-3.2.0/tests/unit/test_profile_imports.py +214 -0
  185. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_validation.py +242 -242
  186. {chutils-3.1.0 → chutils-3.2.0}/uv.lock +559 -210
  187. chutils-3.1.0/ai-lint.toml +0 -33
  188. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/index.md +0 -5
  189. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/metadata.json +0 -8
  190. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/plan.md +0 -15
  191. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/spec.md +0 -23
  192. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/index.md +0 -5
  193. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/metadata.json +0 -8
  194. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/plan.md +0 -16
  195. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/spec.md +0 -30
  196. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/index.md +0 -5
  197. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/metadata.json +0 -8
  198. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/plan.md +0 -22
  199. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/spec.md +0 -39
  200. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/index.md +0 -5
  201. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/metadata.json +0 -8
  202. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/plan.md +0 -16
  203. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/spec.md +0 -23
  204. chutils-3.1.0/conductor/archive/captcha_20260707/index.md +0 -5
  205. chutils-3.1.0/conductor/archive/captcha_20260707/metadata.json +0 -8
  206. chutils-3.1.0/conductor/archive/captcha_20260707/plan.md +0 -41
  207. chutils-3.1.0/conductor/archive/captcha_20260707/spec.md +0 -52
  208. chutils-3.1.0/conductor/archive/chat_context_20260610/index.md +0 -5
  209. chutils-3.1.0/conductor/archive/chat_context_20260610/metadata.json +0 -8
  210. chutils-3.1.0/conductor/archive/chat_context_20260610/plan.md +0 -39
  211. chutils-3.1.0/conductor/archive/chat_context_20260610/spec.md +0 -36
  212. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/index.md +0 -5
  213. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/metadata.json +0 -8
  214. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/plan.md +0 -45
  215. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/spec.md +0 -50
  216. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/index.md +0 -5
  217. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/metadata.json +0 -8
  218. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/plan.md +0 -40
  219. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/spec.md +0 -50
  220. chutils-3.1.0/conductor/archive/config_required_20260708/index.md +0 -5
  221. chutils-3.1.0/conductor/archive/config_required_20260708/metadata.json +0 -8
  222. chutils-3.1.0/conductor/archive/config_required_20260708/plan.md +0 -27
  223. chutils-3.1.0/conductor/archive/config_required_20260708/spec.md +0 -52
  224. chutils-3.1.0/conductor/archive/context_metadata_20260714/index.md +0 -5
  225. chutils-3.1.0/conductor/archive/context_metadata_20260714/metadata.json +0 -8
  226. chutils-3.1.0/conductor/archive/context_metadata_20260714/plan.md +0 -19
  227. chutils-3.1.0/conductor/archive/context_metadata_20260714/spec.md +0 -31
  228. chutils-3.1.0/conductor/archive/dependency_errors_20260707/index.md +0 -5
  229. chutils-3.1.0/conductor/archive/dependency_errors_20260707/metadata.json +0 -8
  230. chutils-3.1.0/conductor/archive/dependency_errors_20260707/plan.md +0 -27
  231. chutils-3.1.0/conductor/archive/dependency_errors_20260707/spec.md +0 -37
  232. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/index.md +0 -5
  233. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/metadata.json +0 -8
  234. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/plan.md +0 -23
  235. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/spec.md +0 -50
  236. chutils-3.1.0/conductor/archive/diagnostics_20260610/index.md +0 -5
  237. chutils-3.1.0/conductor/archive/diagnostics_20260610/metadata.json +0 -8
  238. chutils-3.1.0/conductor/archive/diagnostics_20260610/plan.md +0 -42
  239. chutils-3.1.0/conductor/archive/diagnostics_20260610/spec.md +0 -40
  240. chutils-3.1.0/conductor/archive/drop_python39_20260610/index.md +0 -5
  241. chutils-3.1.0/conductor/archive/drop_python39_20260610/metadata.json +0 -8
  242. chutils-3.1.0/conductor/archive/drop_python39_20260610/plan.md +0 -43
  243. chutils-3.1.0/conductor/archive/drop_python39_20260610/spec.md +0 -44
  244. chutils-3.1.0/conductor/archive/env_20260702/index.md +0 -5
  245. chutils-3.1.0/conductor/archive/env_20260702/metadata.json +0 -8
  246. chutils-3.1.0/conductor/archive/env_20260702/plan.md +0 -33
  247. chutils-3.1.0/conductor/archive/env_20260702/spec.md +0 -53
  248. chutils-3.1.0/conductor/archive/exception_groups_20260708/index.md +0 -5
  249. chutils-3.1.0/conductor/archive/exception_groups_20260708/metadata.json +0 -8
  250. chutils-3.1.0/conductor/archive/exception_groups_20260708/plan.md +0 -22
  251. chutils-3.1.0/conductor/archive/exception_groups_20260708/spec.md +0 -71
  252. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/index.md +0 -5
  253. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/metadata.json +0 -8
  254. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/plan.md +0 -42
  255. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/spec.md +0 -44
  256. chutils-3.1.0/conductor/archive/mock_server_20260610/index.md +0 -5
  257. chutils-3.1.0/conductor/archive/mock_server_20260610/metadata.json +0 -8
  258. chutils-3.1.0/conductor/archive/mock_server_20260610/plan.md +0 -43
  259. chutils-3.1.0/conductor/archive/mock_server_20260610/spec.md +0 -40
  260. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/index.md +0 -5
  261. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/metadata.json +0 -8
  262. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/plan.md +0 -38
  263. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/spec.md +0 -25
  264. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/index.md +0 -5
  265. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/metadata.json +0 -8
  266. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/plan.md +0 -33
  267. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/spec.md +0 -35
  268. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/index.md +0 -5
  269. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/metadata.json +0 -8
  270. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/plan.md +0 -38
  271. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/spec.md +0 -44
  272. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/index.md +0 -5
  273. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/metadata.json +0 -8
  274. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/plan.md +0 -50
  275. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/spec.md +0 -51
  276. chutils-3.1.0/conductor/archive/secrets_unification_20260708/index.md +0 -5
  277. chutils-3.1.0/conductor/archive/secrets_unification_20260708/metadata.json +0 -8
  278. chutils-3.1.0/conductor/archive/secrets_unification_20260708/plan.md +0 -31
  279. chutils-3.1.0/conductor/archive/secrets_unification_20260708/spec.md +0 -47
  280. chutils-3.1.0/conductor/archive/sync_env_20260707/index.md +0 -5
  281. chutils-3.1.0/conductor/archive/sync_env_20260707/metadata.json +0 -8
  282. chutils-3.1.0/conductor/archive/sync_env_20260707/plan.md +0 -37
  283. chutils-3.1.0/conductor/archive/sync_env_20260707/spec.md +0 -45
  284. chutils-3.1.0/conductor/archive/validation_20260702/index.md +0 -5
  285. chutils-3.1.0/conductor/archive/validation_20260702/metadata.json +0 -8
  286. chutils-3.1.0/conductor/archive/validation_20260702/plan.md +0 -29
  287. chutils-3.1.0/conductor/archive/validation_20260702/spec.md +0 -42
  288. chutils-3.1.0/conductor/archive/web_20260707/index.md +0 -5
  289. chutils-3.1.0/conductor/archive/web_20260707/metadata.json +0 -8
  290. chutils-3.1.0/conductor/archive/web_20260707/plan.md +0 -45
  291. chutils-3.1.0/conductor/archive/web_20260707/spec.md +0 -49
  292. chutils-3.1.0/conductor/tracks.md +0 -99
  293. chutils-3.1.0/tests/unit/secret_manager/test_secret_manager_providers.py +0 -105
  294. {chutils-3.1.0 → chutils-3.2.0}/.gitattributes +0 -0
  295. {chutils-3.1.0 → chutils-3.2.0}/.github/workflows/ci.yml +0 -0
  296. {chutils-3.1.0 → chutils-3.2.0}/.github/workflows/publish-docs.yml +0 -0
  297. {chutils-3.1.0 → chutils-3.2.0}/CODE_OF_CONDUCT.md +0 -0
  298. {chutils-3.1.0 → chutils-3.2.0}/CONTRIBUTING.md +0 -0
  299. {chutils-3.1.0 → chutils-3.2.0}/GEMINI.md +0 -0
  300. {chutils-3.1.0 → chutils-3.2.0}/LICENSE +0 -0
  301. {chutils-3.1.0 → chutils-3.2.0}/benchmarks/cold_start.py +0 -0
  302. {chutils-3.1.0 → chutils-3.2.0}/conductor/.gitignore +0 -0
  303. {chutils-3.1.0 → chutils-3.2.0}/conductor/GEMINI.md +0 -0
  304. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/index.md +0 -0
  305. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/metadata.json +0 -0
  306. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/spec.md +0 -0
  307. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/index.md +0 -0
  308. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/metadata.json +0 -0
  309. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/plan.md +0 -0
  310. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/spec.md +0 -0
  311. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/index.md +0 -0
  312. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/metadata.json +0 -0
  313. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/plan.md +0 -0
  314. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/spec.md +0 -0
  315. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/custom_config_providers_20260714/index.md +0 -0
  316. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/custom_config_providers_20260714/metadata.json +0 -0
  317. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/custom_config_providers_20260714/spec.md +0 -0
  318. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/index.md +0 -0
  319. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/metadata.json +0 -0
  320. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/spec.md +0 -0
  321. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/index.md +0 -0
  322. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/metadata.json +0 -0
  323. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/spec.md +0 -0
  324. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/index.md +0 -0
  325. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/metadata.json +0 -0
  326. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/plan.md +0 -0
  327. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/spec.md +0 -0
  328. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/index.md +0 -0
  329. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/metadata.json +0 -0
  330. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/spec.md +0 -0
  331. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/index.md +0 -0
  332. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/metadata.json +0 -0
  333. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/plan.md +0 -0
  334. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/spec.md +0 -0
  335. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/setup_github_actions_20260714/index.md +0 -0
  336. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/setup_github_actions_20260714/metadata.json +0 -0
  337. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/setup_github_actions_20260714/plan.md +0 -0
  338. {chutils-3.1.0/conductor/tracks → chutils-3.2.0/conductor/archive}/setup_github_actions_20260714/spec.md +0 -0
  339. {chutils-3.1.0 → chutils-3.2.0}/conductor/code_styleguides/python.md +0 -0
  340. {chutils-3.1.0 → chutils-3.2.0}/conductor/index.md +0 -0
  341. {chutils-3.1.0 → chutils-3.2.0}/conductor/product-guidelines.md +0 -0
  342. {chutils-3.1.0 → chutils-3.2.0}/conductor/setup_state.json +0 -0
  343. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/ai_manifests_few_shot_20260713/index.md +0 -0
  344. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/ai_manifests_few_shot_20260713/metadata.json +0 -0
  345. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/ai_manifests_few_shot_20260713/plan.md +0 -0
  346. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/ai_manifests_few_shot_20260713/spec.md +0 -0
  347. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/cache_invalidation_20260714/index.md +0 -0
  348. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/cache_invalidation_20260714/metadata.json +0 -0
  349. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/cache_invalidation_20260714/plan.md +0 -0
  350. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/cache_invalidation_20260714/spec.md +0 -0
  351. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/index.md +0 -0
  352. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/metadata.json +0 -0
  353. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/plan.md +0 -0
  354. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/spec.md +0 -0
  355. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/index.md +0 -0
  356. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/metadata.json +0 -0
  357. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/plan.md +0 -0
  358. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/spec.md +0 -0
  359. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/index.md +0 -0
  360. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/metadata.json +0 -0
  361. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/plan.md +0 -0
  362. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/spec.md +0 -0
  363. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/index.md +0 -0
  364. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/metadata.json +0 -0
  365. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/plan.md +0 -0
  366. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/spec.md +0 -0
  367. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/index.md +0 -0
  368. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/metadata.json +0 -0
  369. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/plan.md +0 -0
  370. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/spec.md +0 -0
  371. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/index.md +0 -0
  372. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/metadata.json +0 -0
  373. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/plan.md +0 -0
  374. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/spec.md +0 -0
  375. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/index.md +0 -0
  376. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/metadata.json +0 -0
  377. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/plan.md +0 -0
  378. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/spec.md +0 -0
  379. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/index.md +0 -0
  380. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/metadata.json +0 -0
  381. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/plan.md +0 -0
  382. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/spec.md +0 -0
  383. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/store_20260702/index.md +0 -0
  384. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/store_20260702/metadata.json +0 -0
  385. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/store_20260702/plan.md +0 -0
  386. {chutils-3.1.0 → chutils-3.2.0}/conductor/tracks/store_20260702/spec.md +0 -0
  387. {chutils-3.1.0 → chutils-3.2.0}/conductor/workflow.md +0 -0
  388. {chutils-3.1.0 → chutils-3.2.0}/docs/CODE_OF_CONDUCT_RU.md +0 -0
  389. {chutils-3.1.0 → chutils-3.2.0}/docs/CONTRIBUTING_RU.md +0 -0
  390. {chutils-3.1.0 → chutils-3.2.0}/docs/INTEGRATION_AI.md +0 -0
  391. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/README.md +0 -0
  392. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/configuration/README.md +0 -0
  393. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/configuration/bad_pattern.py +0 -0
  394. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/configuration/good_pattern.py +0 -0
  395. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/error_handling/README.md +0 -0
  396. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/error_handling/bad_pattern.py +0 -0
  397. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/error_handling/good_pattern.py +0 -0
  398. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/logging/README.md +0 -0
  399. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/logging/bad_pattern.py +0 -0
  400. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/logging/good_pattern.py +0 -0
  401. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/README.md +0 -0
  402. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/bad_pattern.py +0 -0
  403. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/good_pattern.py +0 -0
  404. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/secrets/README.md +0 -0
  405. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/secrets/bad_pattern.py +0 -0
  406. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_examples/secrets/good_pattern.py +0 -0
  407. {chutils-3.1.0 → chutils-3.2.0}/docs/ai_hints.md +0 -0
  408. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/config.md +0 -0
  409. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/init.md +0 -0
  410. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/secrets.md +0 -0
  411. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/show_paths.md +0 -0
  412. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/template.md +0 -0
  413. {chutils-3.1.0 → chutils-3.2.0}/docs/cli/validate.md +0 -0
  414. {chutils-3.1.0 → chutils-3.2.0}/docs/migration.md +0 -0
  415. {chutils-3.1.0 → chutils-3.2.0}/docs/plugins.md +0 -0
  416. {chutils-3.1.0 → chutils-3.2.0}/docs/testing.md +0 -0
  417. {chutils-3.1.0 → chutils-3.2.0}/docs/web.md +0 -0
  418. {chutils-3.1.0 → chutils-3.2.0}/examples/.env +0 -0
  419. {chutils-3.1.0 → chutils-3.2.0}/examples/01_configuration.py +0 -0
  420. {chutils-3.1.0 → chutils-3.2.0}/examples/02_logging.py +0 -0
  421. {chutils-3.1.0 → chutils-3.2.0}/examples/03_secrets.py +0 -0
  422. {chutils-3.1.0 → chutils-3.2.0}/examples/04_full_example.py +0 -0
  423. {chutils-3.1.0 → chutils-3.2.0}/examples/05_different_log_levels.py +0 -0
  424. {chutils-3.1.0 → chutils-3.2.0}/examples/06_local_config_override.py +0 -0
  425. {chutils-3.1.0 → chutils-3.2.0}/examples/07_decorators_example.py +0 -0
  426. {chutils-3.1.0 → chutils-3.2.0}/examples/08_multiple_loggers_example.py +0 -0
  427. {chutils-3.1.0 → chutils-3.2.0}/examples/09_disable_keyring.py +0 -0
  428. {chutils-3.1.0 → chutils-3.2.0}/examples/10_universal_env_override.py +0 -0
  429. {chutils-3.1.0 → chutils-3.2.0}/examples/11_retry_decorator.py +0 -0
  430. {chutils-3.1.0 → chutils-3.2.0}/examples/12_secret_masking.py +0 -0
  431. {chutils-3.1.0 → chutils-3.2.0}/examples/13_pydantic_validation.py +0 -0
  432. {chutils-3.1.0 → chutils-3.2.0}/examples/15_context_logging.py +0 -0
  433. {chutils-3.1.0 → chutils-3.2.0}/examples/17_timeout_decorator.py +0 -0
  434. {chutils-3.1.0 → chutils-3.2.0}/examples/18_config_hot_reload.py +0 -0
  435. {chutils-3.1.0 → chutils-3.2.0}/examples/19_remote_config.py +0 -0
  436. {chutils-3.1.0 → chutils-3.2.0}/examples/20_opentelemetry_tracing.py +0 -0
  437. {chutils-3.1.0 → chutils-3.2.0}/examples/21_config_diagnostics.py +0 -0
  438. {chutils-3.1.0 → chutils-3.2.0}/examples/22_circuit_breaker_decorator.py +0 -0
  439. {chutils-3.1.0 → chutils-3.2.0}/examples/22_safe_path_resolution.py +0 -0
  440. {chutils-3.1.0 → chutils-3.2.0}/examples/23_event_bus.py +0 -0
  441. {chutils-3.1.0 → chutils-3.2.0}/examples/24_task_scheduler.py +0 -0
  442. {chutils-3.1.0 → chutils-3.2.0}/examples/25_testing_fixtures_example.py +0 -0
  443. {chutils-3.1.0 → chutils-3.2.0}/examples/26_metrics_prometheus.py +0 -0
  444. {chutils-3.1.0 → chutils-3.2.0}/examples/27_rate_limiting.py +0 -0
  445. {chutils-3.1.0 → chutils-3.2.0}/examples/28_dependency_injection.py +0 -0
  446. {chutils-3.1.0 → chutils-3.2.0}/examples/captcha_solvers_usage.py +0 -0
  447. {chutils-3.1.0 → chutils-3.2.0}/examples/config.yml +0 -0
  448. {chutils-3.1.0 → chutils-3.2.0}/examples/scraping_humanize_usage.py +0 -0
  449. {chutils-3.1.0 → chutils-3.2.0}/examples/web_client_usage.py +0 -0
  450. {chutils-3.1.0 → chutils-3.2.0}/mkdocs.yml +0 -0
  451. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/__main__.py +0 -0
  452. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cache/__init__.py +0 -0
  453. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cache/base.py +0 -0
  454. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cache/decorator.py +0 -0
  455. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cache/in_memory.py +0 -0
  456. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cache/utils.py +0 -0
  457. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cli_booster.py +0 -0
  458. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/cli_utils.py +0 -0
  459. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/base.py +0 -0
  460. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/config.py +0 -0
  461. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/init.py +0 -0
  462. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/paths.py +0 -0
  463. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/secrets.py +0 -0
  464. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/template.py +0 -0
  465. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/utils.py +0 -0
  466. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/commands/validate.py +0 -0
  467. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/GEMINI.md +0 -0
  468. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/ast_fallback_parser.py +0 -0
  469. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/core.py +0 -0
  470. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/dev.py +0 -0
  471. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/diagnostics.py +0 -0
  472. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/generator.py +0 -0
  473. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/providers.py +0 -0
  474. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/schema.py +0 -0
  475. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/utils.py +0 -0
  476. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/config/watcher.py +0 -0
  477. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/context.py +0 -0
  478. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/crypto.py +0 -0
  479. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/few_shot/__init__.py +0 -0
  480. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/mock_server.py +0 -0
  481. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/project_metadata.py +0 -0
  482. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/dev/scaffold.py +0 -0
  483. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/di/__init__.py +0 -0
  484. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/di/container.py +0 -0
  485. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/diagnostics/manager.py +0 -0
  486. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/env.py +0 -0
  487. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/events/__init__.py +0 -0
  488. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/events/core.py +0 -0
  489. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/features.py +0 -0
  490. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/fs.py +0 -0
  491. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/GEMINI.md +0 -0
  492. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/__init__.py +0 -0
  493. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/core.py +0 -0
  494. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/formatters.py +0 -0
  495. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/handlers.py +0 -0
  496. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/internal/levels.py +0 -0
  497. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/internal/utils.py +0 -0
  498. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/logger/masking.py +0 -0
  499. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/metrics/__init__.py +0 -0
  500. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/metrics/base.py +0 -0
  501. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/metrics/in_memory.py +0 -0
  502. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/metrics/timer.py +0 -0
  503. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/plugins/__init__.py +0 -0
  504. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/plugins/core.py +0 -0
  505. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/plugins/interfaces.py +0 -0
  506. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/__init__.py +0 -0
  507. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/captcha/anticaptcha.py +0 -0
  508. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/captcha/capmonster.py +0 -0
  509. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/captcha/exceptions.py +0 -0
  510. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/captcha/rucaptcha.py +0 -0
  511. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/scraping/humanize/__init__.py +0 -0
  512. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/GEMINI.md +0 -0
  513. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/__init__.py +0 -0
  514. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/core.py +0 -0
  515. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/providers/dotenv.py +0 -0
  516. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/secret_manager/providers/env.py +0 -0
  517. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/tasks/__init__.py +0 -0
  518. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/testing/__init__.py +0 -0
  519. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/testing/fixtures.py +0 -0
  520. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/text.py +0 -0
  521. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/time.py +0 -0
  522. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/tracing.py +0 -0
  523. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/typing.py +0 -0
  524. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/web/__init__.py +0 -0
  525. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/web/client.py +0 -0
  526. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/web/proxy_pool.py +0 -0
  527. {chutils-3.1.0 → chutils-3.2.0}/src/chutils/web/user_agent.py +0 -0
  528. {chutils-3.1.0 → chutils-3.2.0}/tests/conftest.py +0 -0
  529. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_ai_lint_integration.py +0 -0
  530. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_cli_e2e.py +0 -0
  531. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_event_loops.py +0 -0
  532. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_examples.py +0 -0
  533. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_hooks_integration.py +0 -0
  534. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_masking_integration.py +0 -0
  535. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_otel_tracing.py +0 -0
  536. {chutils-3.1.0 → chutils-3.2.0}/tests/integration/test_remote_config_integration.py +0 -0
  537. {chutils-3.1.0 → chutils-3.2.0}/tests/manual/manual_test_cli_booster.py +0 -0
  538. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/conftest.py +0 -0
  539. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli.py +0 -0
  540. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_booster.py +0 -0
  541. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config.py +0 -0
  542. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config_cmd.py +0 -0
  543. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config_schema.py +0 -0
  544. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev.py +0 -0
  545. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev_tree.py +0 -0
  546. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_diagnostics.py +0 -0
  547. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_extras_suggestion.py +0 -0
  548. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_init.py +0 -0
  549. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_paths.py +0 -0
  550. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_rich.py +0 -0
  551. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_rich_width.py +0 -0
  552. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_secrets.py +0 -0
  553. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_template.py +0 -0
  554. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_utils_internal.py +0 -0
  555. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/cli/test_cli_validate.py +0 -0
  556. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config.py +0 -0
  557. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_ast_parser.py +0 -0
  558. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_diagnostics.py +0 -0
  559. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_env.py +0 -0
  560. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_env_loading.py +0 -0
  561. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_generator.py +0 -0
  562. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_json.py +0 -0
  563. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_pydantic.py +0 -0
  564. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_required.py +0 -0
  565. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_schema.py +0 -0
  566. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_tracing.py +0 -0
  567. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_universal_env.py +0 -0
  568. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_utils.py +0 -0
  569. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_config_watcher.py +0 -0
  570. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_priority_unification.py +0 -0
  571. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/config/test_remote_config.py +0 -0
  572. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer.py +0 -0
  573. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_abstract.py +0 -0
  574. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_graph.py +0 -0
  575. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_layers.py +0 -0
  576. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_metadata.py +0 -0
  577. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_cache.py +0 -0
  578. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_dev_models.py +0 -0
  579. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_exceptions.py +0 -0
  580. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_features.py +0 -0
  581. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_fs.py +0 -0
  582. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_lifecycle.py +0 -0
  583. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_thread_safety.py +0 -0
  584. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/core/test_time.py +0 -0
  585. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_retry.py +0 -0
  586. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_timeout.py +0 -0
  587. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/decorators/test_decorators.py +0 -0
  588. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/decorators/test_rate_limit.py +0 -0
  589. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_chat_context.py +0 -0
  590. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_mock_server.py +0 -0
  591. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/dev/test_scaffold.py +0 -0
  592. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/di/test_di.py +0 -0
  593. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/events/test_event_bus.py +0 -0
  594. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/conftest.py +0 -0
  595. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_basics.py +0 -0
  596. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_compression.py +0 -0
  597. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_config_sections.py +0 -0
  598. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_configuration.py +0 -0
  599. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_context.py +0 -0
  600. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_env_control.py +0 -0
  601. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_files.py +0 -0
  602. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_json_format.py +0 -0
  603. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_logger_rich_width.py +0 -0
  604. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_masking.py +0 -0
  605. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_performance_security.py +0 -0
  606. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_rich.py +0 -0
  607. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/logger/test_rotation.py +0 -0
  608. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/metrics/test_metrics.py +0 -0
  609. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/plugins/test_integration.py +0 -0
  610. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/plugins/test_interfaces.py +0 -0
  611. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/plugins/test_plugins.py +0 -0
  612. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secret_manager.py +0 -0
  613. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secret_manager_env.py +0 -0
  614. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secrets_required.py +0 -0
  615. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_ai_lint_ignore.py +0 -0
  616. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_anticaptcha.py +0 -0
  617. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_antidetect.py +0 -0
  618. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_async_web_client.py +0 -0
  619. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_capmonster.py +0 -0
  620. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_captcha_base.py +0 -0
  621. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_captcha_imports.py +0 -0
  622. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_crypto.py +0 -0
  623. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_crypto_dependencies.py +0 -0
  624. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_events_exception_group.py +0 -0
  625. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_humanize_math.py +0 -0
  626. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_minimal_imports.py +0 -0
  627. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_playwright_humanize.py +0 -0
  628. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_proxy_pool.py +0 -0
  629. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_rucaptcha.py +0 -0
  630. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_scraping_imports.py +0 -0
  631. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_selenium_humanize.py +0 -0
  632. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_text.py +0 -0
  633. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_text_dependencies.py +0 -0
  634. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_user_agent.py +0 -0
  635. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_web_client.py +0 -0
  636. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/test_web_imports.py +0 -0
  637. {chutils-3.1.0 → chutils-3.2.0}/tests/unit/testing/test_fixtures.py +0 -0
@@ -0,0 +1,6 @@
1
+ .idea/
2
+ .pytest_cache/
3
+ .venv/
4
+ dist/
5
+ build/
6
+ *.egg-info/
@@ -1,185 +1,186 @@
1
- # Byte-compiled / optimized / DLL files
2
- __pycache__/
3
- *.py[cod]
4
- *$py.class
5
-
6
- # C extensions
7
- *.so
8
-
9
- # Distribution / packaging
10
- .Python
11
- build/
12
- develop-eggs/
13
- dist/
14
- downloads/
15
- eggs/
16
- .eggs/
17
- lib/
18
- lib64/
19
- parts/
20
- sdist/
21
- var/
22
- wheels/
23
- share/python-wheels/
24
- *.egg-info/
25
- .installed.cfg
26
- *.egg
27
- MANIFEST
28
-
29
- # PyInstaller
30
- # Usually these files are written by a python script from a template
31
- # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
- *.manifest
33
- *.spec
34
-
35
- # Installer logs
36
- pip-log.txt
37
- pip-delete-this-directory.txt
38
-
39
- # Unit test / coverage reports
40
- htmlcov/
41
- .tox/
42
- .nox/
43
- .coverage
44
- .coverage.*
45
- .cache
46
- nosetests.xml
47
- coverage.xml
48
- *.cover
49
- *.py,cover
50
- .hypothesis/
51
- .pytest_cache/
52
- cover/
53
-
54
- # Translations
55
- *.mo
56
- *.pot
57
-
58
- # Django stuff:
59
- *.log
60
- local_settings.py
61
- db.sqlite3
62
- db.sqlite3-journal
63
-
64
- # Flask stuff:
65
- instance/
66
- .webassets-cache
67
-
68
- # Scrapy stuff:
69
- .scrapy
70
-
71
- # Sphinx documentation
72
- docs/_build/
73
-
74
- # PyBuilder
75
- .pybuilder/
76
- target/
77
-
78
- # Jupyter Notebook
79
- .ipynb_checkpoints
80
-
81
- # IPython
82
- profile_default/
83
- ipython_config.py
84
-
85
- # pyenv
86
- # For a library or package, you might want to ignore these files since the code is
87
- # intended to run in multiple environments; otherwise, check them in:
88
- # .python-version
89
-
90
- # pipenv
91
- # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
- # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
- # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
- # install all needed dependencies.
95
- #Pipfile.lock
96
-
97
- # UV
98
- # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
- # This is especially recommended for binary packages to ensure reproducibility, and is more
100
- # commonly ignored for libraries.
101
- #uv.lock
102
-
103
- # poetry
104
- # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
- # This is especially recommended for binary packages to ensure reproducibility, and is more
106
- # commonly ignored for libraries.
107
- # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
- #poetry.lock
109
-
110
- # pdm
111
- # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
112
- #pdm.lock
113
- # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
114
- # in version control.
115
- # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
116
- .pdm.toml
117
- .pdm-python
118
- .pdm-build/
119
-
120
- # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
- __pypackages__/
122
-
123
- # Celery stuff
124
- celerybeat-schedule
125
- celerybeat.pid
126
-
127
- # SageMath parsed files
128
- *.sage.py
129
-
130
- # Environments
131
- .env
132
- .venv
133
- env/
134
- venv/
135
- ENV/
136
- env.bak/
137
- venv.bak/
138
- !examples/.env
139
-
140
- # Spyder project settings
141
- .spyderproject
142
- .spyproject
143
-
144
- # Rope project settings
145
- .ropeproject
146
-
147
- # mkdocs documentation
148
- /site
149
-
150
- # mypy
151
- .mypy_cache/
152
- .dmypy.json
153
- dmypy.json
154
-
155
- # Pyre type checker
156
- .pyre/
157
-
158
- # pytype static type analyzer
159
- .pytype/
160
-
161
- # Cython debug symbols
162
- cython_debug/
163
-
164
- # PyCharm
165
- # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
166
- # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
167
- # and can be added to the global gitignore or merged into this file. For a more nuclear
168
- # option (not recommended) you can uncomment the following to ignore the entire idea folder.
169
- .idea/
170
-
171
- # Ruff stuff:
172
- .ruff_cache/
173
-
174
- # PyPI configuration file
175
- .pypirc
176
-
177
- # Project-specific documentation
178
- PUBLISHING.md
179
- project.txt
180
- changelog.txt
181
- *.log.*
182
- *.log
183
-
184
- # Local chutils cache
185
- .chutils/
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ #poetry.lock
109
+
110
+ # pdm
111
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
112
+ #pdm.lock
113
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
114
+ # in version control.
115
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
116
+ .pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
+ __pypackages__/
122
+
123
+ # Celery stuff
124
+ celerybeat-schedule
125
+ celerybeat.pid
126
+
127
+ # SageMath parsed files
128
+ *.sage.py
129
+
130
+ # Environments
131
+ .env
132
+ .venv
133
+ env/
134
+ venv/
135
+ ENV/
136
+ env.bak/
137
+ venv.bak/
138
+ !examples/.env
139
+
140
+ # Spyder project settings
141
+ .spyderproject
142
+ .spyproject
143
+
144
+ # Rope project settings
145
+ .ropeproject
146
+
147
+ # mkdocs documentation
148
+ /site
149
+
150
+ # mypy
151
+ .mypy_cache/
152
+ .dmypy.json
153
+ dmypy.json
154
+
155
+ # Pyre type checker
156
+ .pyre/
157
+
158
+ # pytype static type analyzer
159
+ .pytype/
160
+
161
+ # Cython debug symbols
162
+ cython_debug/
163
+
164
+ # PyCharm
165
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
166
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
167
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
168
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
169
+ .idea/
170
+
171
+ # Ruff stuff:
172
+ .ruff_cache/
173
+
174
+ # PyPI configuration file
175
+ .pypirc
176
+
177
+ # Project-specific documentation
178
+ PUBLISHING.md
179
+ project.txt
180
+ changelog.txt
181
+ *.log.*
182
+ *.log
183
+
184
+ # Local chutils cache
185
+ .chutils/
186
+ .chutils_dashboard_history.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chutils
3
- Version: 3.1.0
3
+ Version: 3.2.0
4
4
  Summary: Набор простых и удобных утилит для Python, который избавляет от рутины при работе с конфигурацией и логированием в новых проектах.
5
5
  Author-email: Chu4hel <sergeiivanov636@gmail.com>
6
6
  License-Expression: MIT
@@ -9,14 +9,23 @@ Requires-Python: <3.15,>=3.10
9
9
  Requires-Dist: exceptiongroup>=1.2.2; python_version < '3.11'
10
10
  Requires-Dist: python-dotenv>=1.2.2
11
11
  Requires-Dist: pyyaml>=6.0.3
12
+ Provides-Extra: aws
13
+ Requires-Dist: boto3>=1.34.0; extra == 'aws'
12
14
  Provides-Extra: captcha
13
15
  Requires-Dist: httpx>=0.27.0; extra == 'captcha'
14
16
  Provides-Extra: crypto
15
17
  Requires-Dist: cryptography>=42.0.0; extra == 'crypto'
16
18
  Provides-Extra: date
17
19
  Requires-Dist: python-dateutil>=2.9.0; extra == 'date'
20
+ Provides-Extra: db
21
+ Requires-Dist: aiosqlite>=0.20.0; extra == 'db'
22
+ Requires-Dist: alembic>=1.13.0; extra == 'db'
23
+ Requires-Dist: asyncpg>=0.29.0; extra == 'db'
24
+ Requires-Dist: sqlalchemy>=2.0.0; extra == 'db'
18
25
  Provides-Extra: full
26
+ Requires-Dist: boto3>=1.34.0; extra == 'full'
19
27
  Requires-Dist: cryptography>=42.0.0; extra == 'full'
28
+ Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == 'full'
20
29
  Requires-Dist: httpx>=0.27.0; extra == 'full'
21
30
  Requires-Dist: keyring>=25.7.0; extra == 'full'
22
31
  Requires-Dist: opentelemetry-api>=1.41.1; extra == 'full'
@@ -32,6 +41,8 @@ Requires-Dist: rapidfuzz>=3.9.0; extra == 'full'
32
41
  Requires-Dist: rich>=15.0.0; extra == 'full'
33
42
  Requires-Dist: selenium>=4.27.0; extra == 'full'
34
43
  Requires-Dist: watchdog>=6.0.0; extra == 'full'
44
+ Provides-Extra: gcp
45
+ Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == 'gcp'
35
46
  Provides-Extra: json
36
47
  Requires-Dist: python-json-logger>=3.2.1; extra == 'json'
37
48
  Provides-Extra: metrics
@@ -278,20 +289,71 @@ To use this feature, install `watchdog`:
278
289
 
279
290
  ### 3. Secret Management
280
291
 
281
- `SecretManager` looks for secrets in the following order: **Keyring > .env File > Environment Variables**.
292
+ `SecretManager` provides a unified abstraction for managing secrets using a custom chain of providers (`SecretProvider`)
293
+ and automatic fallback logic.
294
+
295
+ By default, `SecretManager` searches for secrets in the following order: **Keyring > .env File > Environment Variables
296
+ **.
282
297
 
283
298
  ```python
284
299
  from chutils import SecretManager
285
300
 
286
301
  secrets = SecretManager("my_awesome_app")
287
302
 
288
- # Save once
303
+ # Save secret (will be written to the first writable provider in the chain)
289
304
  secrets.save_secret("API_KEY", "secret-value-123")
290
305
 
291
- # Use everywhere
306
+ # Retrieve secret
292
307
  key = secrets.get_secret("API_KEY")
293
308
  ```
294
309
 
310
+ #### Built-in Providers
311
+
312
+ You can configure the providers list explicitly:
313
+
314
+ ```python
315
+ from chutils import SecretManager
316
+ from chutils.secret_manager.providers import KeyringProvider, DotEnvProvider, EnvProvider
317
+
318
+ secrets = SecretManager(
319
+ service_name="my_app",
320
+ providers=[
321
+ KeyringProvider(),
322
+ DotEnvProvider(),
323
+ EnvProvider()
324
+ ]
325
+ )
326
+ ```
327
+
328
+ #### Cloud Secret Managers
329
+
330
+ The library supports transparent integration with AWS Secrets Manager and Google Secret Manager:
331
+
332
+ ```python
333
+ from chutils import SecretManager
334
+ from chutils.secret_manager.providers import AWSSecretManagerProvider, GCPSecretManagerProvider, EnvProvider
335
+
336
+ # Initialize cloud providers (requires installation of chutils[aws,gcp])
337
+ aws_provider = AWSSecretManagerProvider(region_name="us-east-1")
338
+ gcp_provider = GCPSecretManagerProvider(project_id="my-gcp-project")
339
+
340
+ # Create a SecretManager with the chain: AWS -> GCP -> Environment Variables.
341
+ # If AWS or GCP calls fail due to network/permissions or the secret is missing,
342
+ # SecretManager logs a warning and automatically falls back to EnvProvider.
343
+ secrets = SecretManager(
344
+ service_name="my_service",
345
+ providers=[aws_provider, gcp_provider, EnvProvider()]
346
+ )
347
+ ```
348
+
349
+ Install cloud dependencies:
350
+
351
+ ```bash
352
+ pip install chutils[aws] # For AWS (boto3)
353
+ pip install chutils[gcp] # For GCP (google-cloud-secret-manager)
354
+ pip install chutils[all] # For all optional packages
355
+ ```
356
+
295
357
  #### Disabling Keyring (Optional)
296
358
 
297
359
  In environments like Docker or CI/CD where `keyring` is unavailable, you can suppress warnings and skip the check:
@@ -217,20 +217,71 @@ To use this feature, install `watchdog`:
217
217
 
218
218
  ### 3. Secret Management
219
219
 
220
- `SecretManager` looks for secrets in the following order: **Keyring > .env File > Environment Variables**.
220
+ `SecretManager` provides a unified abstraction for managing secrets using a custom chain of providers (`SecretProvider`)
221
+ and automatic fallback logic.
222
+
223
+ By default, `SecretManager` searches for secrets in the following order: **Keyring > .env File > Environment Variables
224
+ **.
221
225
 
222
226
  ```python
223
227
  from chutils import SecretManager
224
228
 
225
229
  secrets = SecretManager("my_awesome_app")
226
230
 
227
- # Save once
231
+ # Save secret (will be written to the first writable provider in the chain)
228
232
  secrets.save_secret("API_KEY", "secret-value-123")
229
233
 
230
- # Use everywhere
234
+ # Retrieve secret
231
235
  key = secrets.get_secret("API_KEY")
232
236
  ```
233
237
 
238
+ #### Built-in Providers
239
+
240
+ You can configure the providers list explicitly:
241
+
242
+ ```python
243
+ from chutils import SecretManager
244
+ from chutils.secret_manager.providers import KeyringProvider, DotEnvProvider, EnvProvider
245
+
246
+ secrets = SecretManager(
247
+ service_name="my_app",
248
+ providers=[
249
+ KeyringProvider(),
250
+ DotEnvProvider(),
251
+ EnvProvider()
252
+ ]
253
+ )
254
+ ```
255
+
256
+ #### Cloud Secret Managers
257
+
258
+ The library supports transparent integration with AWS Secrets Manager and Google Secret Manager:
259
+
260
+ ```python
261
+ from chutils import SecretManager
262
+ from chutils.secret_manager.providers import AWSSecretManagerProvider, GCPSecretManagerProvider, EnvProvider
263
+
264
+ # Initialize cloud providers (requires installation of chutils[aws,gcp])
265
+ aws_provider = AWSSecretManagerProvider(region_name="us-east-1")
266
+ gcp_provider = GCPSecretManagerProvider(project_id="my-gcp-project")
267
+
268
+ # Create a SecretManager with the chain: AWS -> GCP -> Environment Variables.
269
+ # If AWS or GCP calls fail due to network/permissions or the secret is missing,
270
+ # SecretManager logs a warning and automatically falls back to EnvProvider.
271
+ secrets = SecretManager(
272
+ service_name="my_service",
273
+ providers=[aws_provider, gcp_provider, EnvProvider()]
274
+ )
275
+ ```
276
+
277
+ Install cloud dependencies:
278
+
279
+ ```bash
280
+ pip install chutils[aws] # For AWS (boto3)
281
+ pip install chutils[gcp] # For GCP (google-cloud-secret-manager)
282
+ pip install chutils[all] # For all optional packages
283
+ ```
284
+
234
285
  #### Disabling Keyring (Optional)
235
286
 
236
287
  In environments like Docker or CI/CD where `keyring` is unavailable, you can suppress warnings and skip the check: