chutils 3.0.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 (624) hide show
  1. chutils-3.2.0/.chutilsignore +6 -0
  2. chutils-3.2.0/.gitignore +186 -0
  3. {chutils-3.0.0 → chutils-3.2.0}/GEMINI.md +1 -0
  4. {chutils-3.0.0 → chutils-3.2.0}/PKG-INFO +102 -5
  5. {chutils-3.0.0 → chutils-3.2.0}/README.md +90 -4
  6. chutils-3.2.0/ai-lint.toml +176 -0
  7. chutils-3.2.0/api_map.md +217 -0
  8. {chutils-3.0.0 → chutils-3.2.0}/benchmarks/cold_start.py +10 -1
  9. chutils-3.2.0/conductor/.gitignore +1 -0
  10. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/plan.md +23 -23
  11. chutils-3.2.0/conductor/archive/cloud_secret_managers_20260511/plan.md +36 -0
  12. {chutils-3.0.0/conductor/archive/chat_context_20260610 → chutils-3.2.0/conductor/archive/custom_config_providers_20260714}/index.md +1 -1
  13. chutils-3.2.0/conductor/archive/custom_config_providers_20260714/metadata.json +8 -0
  14. chutils-3.2.0/conductor/archive/custom_config_providers_20260714/plan.md +18 -0
  15. chutils-3.2.0/conductor/archive/custom_config_providers_20260714/spec.md +24 -0
  16. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/plan.md +24 -24
  17. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/plan.md +20 -20
  18. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/plan.md +18 -18
  19. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/spec.md +8 -1
  20. {chutils-3.0.0/conductor/archive/captcha_20260707 → chutils-3.2.0/conductor/archive/setup_github_actions_20260714}/index.md +1 -1
  21. chutils-3.2.0/conductor/archive/setup_github_actions_20260714/metadata.json +8 -0
  22. chutils-3.2.0/conductor/archive/setup_github_actions_20260714/plan.md +28 -0
  23. chutils-3.2.0/conductor/archive/setup_github_actions_20260714/spec.md +27 -0
  24. {chutils-3.0.0 → chutils-3.2.0}/conductor/product.md +29 -0
  25. {chutils-3.0.0 → chutils-3.2.0}/conductor/tech-stack.md +30 -4
  26. {chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707 → chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713}/index.md +1 -1
  27. chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713/metadata.json +8 -0
  28. chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713/plan.md +47 -0
  29. chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713/spec.md +111 -0
  30. {chutils-3.0.0/conductor/archive/config_required_20260708 → chutils-3.2.0/conductor/tracks/cache_invalidation_20260714}/index.md +1 -1
  31. chutils-3.2.0/conductor/tracks/cache_invalidation_20260714/metadata.json +8 -0
  32. chutils-3.2.0/conductor/tracks/cache_invalidation_20260714/plan.md +17 -0
  33. chutils-3.2.0/conductor/tracks/cache_invalidation_20260714/spec.md +28 -0
  34. chutils-3.2.0/conductor/tracks.md +48 -0
  35. {chutils-3.0.0 → chutils-3.2.0}/docs/INTEGRATION_AI.md +10 -0
  36. {chutils-3.0.0 → chutils-3.2.0}/docs/README_RU.md +89 -4
  37. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_lint.md +444 -339
  38. {chutils-3.0.0 → chutils-3.2.0}/docs/api.md +63 -0
  39. chutils-3.2.0/docs/audit.md +119 -0
  40. {chutils-3.0.0 → chutils-3.2.0}/docs/captcha.md +112 -110
  41. chutils-3.2.0/docs/cli/db.md +73 -0
  42. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/dev.md +197 -12
  43. chutils-3.2.0/docs/cli/env.md +62 -0
  44. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/index.md +3 -0
  45. chutils-3.2.0/docs/cli/pypi.md +121 -0
  46. chutils-3.2.0/docs/custom_config_providers.md +297 -0
  47. {chutils-3.0.0 → chutils-3.2.0}/docs/dependencies.md +110 -104
  48. {chutils-3.0.0 → chutils-3.2.0}/docs/index.md +14 -0
  49. {chutils-3.0.0 → chutils-3.2.0}/docs/recipes.md +297 -0
  50. {chutils-3.0.0 → chutils-3.2.0}/docs/scraping.md +162 -160
  51. chutils-3.2.0/examples/16_cloud_secret_managers.py +76 -0
  52. {chutils-3.0.0 → chutils-3.2.0}/mkdocs.yml +2 -0
  53. {chutils-3.0.0 → chutils-3.2.0}/project_index.json +15605 -6948
  54. {chutils-3.0.0 → chutils-3.2.0}/pyproject.toml +23 -3
  55. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/__init__.py +63 -3
  56. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/__init__.pyi +319 -1
  57. chutils-3.2.0/src/chutils/antigravity.md +6 -0
  58. chutils-3.2.0/src/chutils/audit/__init__.py +44 -0
  59. chutils-3.2.0/src/chutils/audit/_hash.py +22 -0
  60. chutils-3.2.0/src/chutils/audit/api.py +193 -0
  61. chutils-3.2.0/src/chutils/audit/backends/__init__.py +6 -0
  62. chutils-3.2.0/src/chutils/audit/backends/base.py +46 -0
  63. chutils-3.2.0/src/chutils/audit/backends/file.py +123 -0
  64. chutils-3.2.0/src/chutils/audit/backends/postgres.py +224 -0
  65. chutils-3.2.0/src/chutils/audit/backends/sqlite.py +200 -0
  66. chutils-3.2.0/src/chutils/audit/schema.py +116 -0
  67. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/base.py +28 -4
  68. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/in_memory.py +57 -8
  69. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/utils.py +28 -4
  70. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cli.py +6 -1
  71. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cli_booster.py +9 -3
  72. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cli_utils.py +39 -7
  73. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/__init__.py +11 -5
  74. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/base.py +1 -0
  75. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/config.py +20 -3
  76. chutils-3.2.0/src/chutils/commands/db.py +496 -0
  77. chutils-3.2.0/src/chutils/commands/dev/__init__.py +569 -0
  78. chutils-3.2.0/src/chutils/commands/dev/ai_lint.py +101 -0
  79. chutils-3.2.0/src/chutils/commands/dev/base.py +40 -0
  80. chutils-3.2.0/src/chutils/commands/dev/chat_context.py +100 -0
  81. chutils-3.2.0/src/chutils/commands/dev/dashboard.py +40 -0
  82. chutils-3.2.0/src/chutils/commands/dev/diagnostics.py +109 -0
  83. chutils-3.2.0/src/chutils/commands/dev/few_shot.py +55 -0
  84. chutils-3.2.0/src/chutils/commands/dev/generate_context.py +355 -0
  85. chutils-3.2.0/src/chutils/commands/dev/hooks.py +185 -0
  86. chutils-3.2.0/src/chutils/commands/dev/mock.py +87 -0
  87. chutils-3.2.0/src/chutils/commands/dev/profile_imports.py +47 -0
  88. chutils-3.2.0/src/chutils/commands/dev/scaffold.py +72 -0
  89. chutils-3.2.0/src/chutils/commands/dev/setup_github_actions.py +147 -0
  90. chutils-3.2.0/src/chutils/commands/dev/sync_env.py +177 -0
  91. chutils-3.2.0/src/chutils/commands/env.py +191 -0
  92. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/init.py +10 -1
  93. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/paths.py +10 -1
  94. chutils-3.2.0/src/chutils/commands/pypi.py +426 -0
  95. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/secrets.py +25 -4
  96. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/template.py +10 -1
  97. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/validate.py +10 -1
  98. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/__init__.py +56 -3
  99. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/ast_fallback_parser.py +14 -4
  100. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/core.py +4 -4
  101. chutils-3.2.0/src/chutils/config/custom_providers.py +290 -0
  102. chutils-3.2.0/src/chutils/config/dev.py +296 -0
  103. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/diagnostics.py +18 -4
  104. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/generator.py +23 -6
  105. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/getters.py +148 -49
  106. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/manager.py +31 -7
  107. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/providers.py +86 -7
  108. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/schema.py +3 -2
  109. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/utils.py +7 -1
  110. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/watcher.py +12 -3
  111. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/context.py +26 -6
  112. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/crypto.py +2 -2
  113. chutils-3.2.0/src/chutils/db.py +267 -0
  114. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/decorators.py +335 -3
  115. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/__init__.py +25 -21
  116. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/ai_lint.py +437 -367
  117. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/ast_indexer.py +48 -3
  118. chutils-3.2.0/src/chutils/dev/changelog_parser.py +194 -0
  119. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/chat_context.py +441 -355
  120. chutils-3.2.0/src/chutils/dev/constants.py +13 -0
  121. chutils-3.2.0/src/chutils/dev/dashboard/__init__.py +20 -0
  122. chutils-3.2.0/src/chutils/dev/dashboard/indexer.py +218 -0
  123. chutils-3.2.0/src/chutils/dev/dashboard/input.py +146 -0
  124. chutils-3.2.0/src/chutils/dev/dashboard/tui.py +593 -0
  125. chutils-3.2.0/src/chutils/dev/env_parser.py +227 -0
  126. chutils-3.2.0/src/chutils/dev/env_sync.py +113 -0
  127. chutils-3.2.0/src/chutils/dev/few_shot/__init__.py +113 -0
  128. chutils-3.2.0/src/chutils/dev/few_shot/detector.py +225 -0
  129. chutils-3.2.0/src/chutils/dev/few_shot/models.py +61 -0
  130. chutils-3.2.0/src/chutils/dev/few_shot/renderer.py +455 -0
  131. chutils-3.2.0/src/chutils/dev/few_shot/writer.py +301 -0
  132. chutils-3.2.0/src/chutils/dev/github_actions.py +91 -0
  133. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/mock_server.py +49 -7
  134. chutils-3.2.0/src/chutils/dev/models/__init__.py +17 -0
  135. chutils-3.2.0/src/chutils/dev/models/base.py +35 -0
  136. chutils-3.2.0/src/chutils/dev/models/index.py +34 -0
  137. chutils-3.2.0/src/chutils/dev/models/node.py +19 -0
  138. chutils-3.2.0/src/chutils/dev/models/symbol.py +21 -0
  139. chutils-3.2.0/src/chutils/dev/profile_imports.py +351 -0
  140. chutils-3.2.0/src/chutils/dev/project_metadata.py +195 -0
  141. chutils-3.2.0/src/chutils/dev/rules/__init__.py +24 -0
  142. chutils-3.2.0/src/chutils/dev/rules/api_map.py +439 -0
  143. chutils-3.2.0/src/chutils/dev/rules/decomposition.py +96 -0
  144. chutils-3.2.0/src/chutils/dev/rules/dependency_sync.py +256 -0
  145. chutils-3.2.0/src/chutils/dev/rules/docstring.py +218 -0
  146. chutils-3.2.0/src/chutils/dev/rules/env.py +111 -0
  147. chutils-3.2.0/src/chutils/dev/rules/integration.py +263 -0
  148. chutils-3.2.0/src/chutils/dev/rules/linter_coverage.py +171 -0
  149. chutils-3.2.0/src/chutils/dev/rules/manifest.py +74 -0
  150. chutils-3.2.0/src/chutils/dev/rules/security.py +99 -0
  151. chutils-3.2.0/src/chutils/dev/rules/upgrade_check.py +116 -0
  152. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/scaffold.py +425 -410
  153. chutils-3.2.0/src/chutils/dev/upgrade_client.py +121 -0
  154. chutils-3.2.0/src/chutils/dev/version_detector.py +114 -0
  155. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/di/container.py +35 -9
  156. chutils-3.2.0/src/chutils/diagnostics/__init__.py +24 -0
  157. chutils-3.2.0/src/chutils/diagnostics/manager.py +254 -0
  158. chutils-3.2.0/src/chutils/diagnostics/models.py +98 -0
  159. chutils-3.2.0/src/chutils/diagnostics/web.py +79 -0
  160. chutils-3.2.0/src/chutils/env.py +194 -0
  161. chutils-3.2.0/src/chutils/env.pyi +34 -0
  162. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/events/core.py +9 -2
  163. chutils-3.2.0/src/chutils/exceptions/__init__.py +80 -0
  164. chutils-3.2.0/src/chutils/exceptions/audit.py +15 -0
  165. chutils-3.2.0/src/chutils/exceptions/base.py +66 -0
  166. chutils-3.2.0/src/chutils/exceptions/cache.py +7 -0
  167. chutils-3.2.0/src/chutils/exceptions/config.py +52 -0
  168. chutils-3.2.0/src/chutils/exceptions/di.py +19 -0
  169. chutils-3.2.0/src/chutils/exceptions/events.py +34 -0
  170. chutils-3.2.0/src/chutils/exceptions/logger.py +7 -0
  171. chutils-3.2.0/src/chutils/exceptions/resilience.py +25 -0
  172. chutils-3.2.0/src/chutils/exceptions/secrets.py +19 -0
  173. chutils-3.2.0/src/chutils/exceptions/system.py +44 -0
  174. chutils-3.2.0/src/chutils/exceptions/validation.py +148 -0
  175. chutils-3.2.0/src/chutils/exceptions/watcher.py +7 -0
  176. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/features.py +2 -2
  177. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/fs.py +5 -5
  178. chutils-3.2.0/src/chutils/http/__init__.py +51 -0
  179. chutils-3.2.0/src/chutils/http/api.py +167 -0
  180. chutils-3.2.0/src/chutils/http/client.py +678 -0
  181. chutils-3.2.0/src/chutils/http/fallback.py +455 -0
  182. chutils-3.2.0/src/chutils/http/resilience.py +402 -0
  183. chutils-3.2.0/src/chutils/http/tracing.py +139 -0
  184. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/lifecycle.py +11 -9
  185. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/core.py +1 -1
  186. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/formatters.py +8 -1
  187. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/internal/builder.py +2 -1
  188. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/internal/levels.py +13 -5
  189. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/internal/utils.py +11 -6
  190. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/masking.py +2 -2
  191. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/__init__.py +31 -14
  192. chutils-3.2.0/src/chutils/metrics/base.py +56 -0
  193. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/in_memory.py +32 -2
  194. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/prometheus.py +29 -6
  195. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/timer.py +22 -2
  196. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/plugins/core.py +36 -9
  197. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/plugins/interfaces.py +20 -6
  198. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/__init__.py +59 -69
  199. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/anticaptcha.py +281 -227
  200. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/base.py +71 -61
  201. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/capmonster.py +281 -227
  202. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/rucaptcha.py +299 -245
  203. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/actions.py +268 -206
  204. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/antidetect.py +123 -111
  205. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/math_utils.py +223 -209
  206. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/secret_manager/core.py +68 -15
  207. chutils-3.2.0/src/chutils/secret_manager/providers/__init__.py +47 -0
  208. chutils-3.2.0/src/chutils/secret_manager/providers/aws.py +134 -0
  209. chutils-3.2.0/src/chutils/secret_manager/providers/base.py +51 -0
  210. chutils-3.2.0/src/chutils/secret_manager/providers/dotenv.py +91 -0
  211. chutils-3.2.0/src/chutils/secret_manager/providers/env.py +54 -0
  212. chutils-3.2.0/src/chutils/secret_manager/providers/gcp.py +168 -0
  213. chutils-3.2.0/src/chutils/secret_manager/providers/keyring_provider.py +124 -0
  214. chutils-3.2.0/src/chutils/tasks/__init__.pyi +49 -0
  215. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/tasks/core.py +82 -13
  216. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/time.py +2 -2
  217. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/tracing.py +3 -0
  218. chutils-3.2.0/src/chutils/validation.py +138 -0
  219. chutils-3.2.0/src/chutils/validation.pyi +13 -0
  220. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/client.py +43 -4
  221. chutils-3.2.0/tests/integration/__init__.py +0 -0
  222. chutils-3.2.0/tests/integration/test_db_migrations.py +351 -0
  223. chutils-3.2.0/tests/integration/test_setup_github_actions_integration.py +35 -0
  224. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev.py +9 -4
  225. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev_cmd.py +204 -4
  226. chutils-3.2.0/tests/unit/cli/test_cli_pypi.py +426 -0
  227. chutils-3.2.0/tests/unit/cli/test_cli_setup_github_actions.py +92 -0
  228. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_dev.py +187 -185
  229. chutils-3.2.0/tests/unit/config/test_config_validation_group.py +42 -0
  230. chutils-3.2.0/tests/unit/config/test_custom_config_providers.py +401 -0
  231. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_circuit_breaker.py +238 -193
  232. chutils-3.2.0/tests/unit/dev/test_ai_lint.py +744 -0
  233. chutils-3.2.0/tests/unit/dev/test_ai_lint_staged.py +129 -0
  234. chutils-3.2.0/tests/unit/dev/test_changelog_parser.py +95 -0
  235. chutils-3.2.0/tests/unit/dev/test_env_parser.py +152 -0
  236. chutils-3.2.0/tests/unit/dev/test_env_sync.py +49 -0
  237. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_generate_few_shot.py +511 -473
  238. chutils-3.2.0/tests/unit/dev/test_linter_coverage_rule.py +194 -0
  239. chutils-3.2.0/tests/unit/dev/test_setup_github_actions.py +75 -0
  240. chutils-3.2.0/tests/unit/dev/test_upgrade_check_rule.py +55 -0
  241. chutils-3.2.0/tests/unit/dev/test_upgrade_client.py +106 -0
  242. chutils-3.2.0/tests/unit/dev/test_version_detector.py +102 -0
  243. chutils-3.2.0/tests/unit/secret_manager/test_secret_manager_providers.py +455 -0
  244. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/tasks/test_scheduler.py +84 -1
  245. chutils-3.2.0/tests/unit/test_audit.py +365 -0
  246. chutils-3.2.0/tests/unit/test_audit_phase2.py +363 -0
  247. chutils-3.2.0/tests/unit/test_cli_db.py +321 -0
  248. chutils-3.2.0/tests/unit/test_dashboard.py +401 -0
  249. chutils-3.2.0/tests/unit/test_db_init.py +256 -0
  250. chutils-3.2.0/tests/unit/test_db_operations.py +258 -0
  251. chutils-3.2.0/tests/unit/test_decorators_bulkhead.py +269 -0
  252. chutils-3.2.0/tests/unit/test_diagnostics.py +367 -0
  253. chutils-3.2.0/tests/unit/test_env.py +261 -0
  254. chutils-3.2.0/tests/unit/test_http_api.py +213 -0
  255. chutils-3.2.0/tests/unit/test_http_client.py +344 -0
  256. chutils-3.2.0/tests/unit/test_http_fallback.py +407 -0
  257. chutils-3.2.0/tests/unit/test_http_resilience.py +330 -0
  258. chutils-3.2.0/tests/unit/test_http_tracing.py +226 -0
  259. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_install_hooks.py +120 -95
  260. chutils-3.2.0/tests/unit/test_minimal_imports.py +84 -0
  261. chutils-3.2.0/tests/unit/test_profile_imports.py +214 -0
  262. chutils-3.2.0/tests/unit/test_validation.py +242 -0
  263. {chutils-3.0.0 → chutils-3.2.0}/uv.lock +559 -210
  264. chutils-3.0.0/.gitignore +0 -0
  265. chutils-3.0.0/api_map.md +0 -166
  266. chutils-3.0.0/changelog.txt +0 -370
  267. chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707/metadata.json +0 -8
  268. chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707/plan.md +0 -22
  269. chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707/spec.md +0 -39
  270. chutils-3.0.0/conductor/archive/captcha_20260707/metadata.json +0 -8
  271. chutils-3.0.0/conductor/archive/captcha_20260707/plan.md +0 -41
  272. chutils-3.0.0/conductor/archive/captcha_20260707/spec.md +0 -52
  273. chutils-3.0.0/conductor/archive/chat_context_20260610/metadata.json +0 -8
  274. chutils-3.0.0/conductor/archive/chat_context_20260610/plan.md +0 -39
  275. chutils-3.0.0/conductor/archive/chat_context_20260610/spec.md +0 -36
  276. chutils-3.0.0/conductor/archive/circuit_breaker_20260521/index.md +0 -5
  277. chutils-3.0.0/conductor/archive/circuit_breaker_20260521/metadata.json +0 -8
  278. chutils-3.0.0/conductor/archive/circuit_breaker_20260521/plan.md +0 -45
  279. chutils-3.0.0/conductor/archive/circuit_breaker_20260521/spec.md +0 -50
  280. chutils-3.0.0/conductor/archive/cli_scaffold_20260610/index.md +0 -5
  281. chutils-3.0.0/conductor/archive/cli_scaffold_20260610/metadata.json +0 -8
  282. chutils-3.0.0/conductor/archive/cli_scaffold_20260610/plan.md +0 -40
  283. chutils-3.0.0/conductor/archive/cli_scaffold_20260610/spec.md +0 -50
  284. chutils-3.0.0/conductor/archive/config_required_20260708/metadata.json +0 -8
  285. chutils-3.0.0/conductor/archive/config_required_20260708/plan.md +0 -27
  286. chutils-3.0.0/conductor/archive/config_required_20260708/spec.md +0 -52
  287. chutils-3.0.0/conductor/archive/dependency_errors_20260707/index.md +0 -5
  288. chutils-3.0.0/conductor/archive/dependency_errors_20260707/metadata.json +0 -8
  289. chutils-3.0.0/conductor/archive/dependency_errors_20260707/plan.md +0 -27
  290. chutils-3.0.0/conductor/archive/dependency_errors_20260707/spec.md +0 -37
  291. chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/index.md +0 -5
  292. chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/metadata.json +0 -8
  293. chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/plan.md +0 -23
  294. chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/spec.md +0 -50
  295. chutils-3.0.0/conductor/archive/drop_python39_20260610/index.md +0 -5
  296. chutils-3.0.0/conductor/archive/drop_python39_20260610/metadata.json +0 -8
  297. chutils-3.0.0/conductor/archive/drop_python39_20260610/plan.md +0 -43
  298. chutils-3.0.0/conductor/archive/drop_python39_20260610/spec.md +0 -44
  299. chutils-3.0.0/conductor/archive/exception_groups_20260708/index.md +0 -5
  300. chutils-3.0.0/conductor/archive/exception_groups_20260708/metadata.json +0 -8
  301. chutils-3.0.0/conductor/archive/exception_groups_20260708/plan.md +0 -22
  302. chutils-3.0.0/conductor/archive/exception_groups_20260708/spec.md +0 -71
  303. chutils-3.0.0/conductor/archive/generate_few_shot_20260610/index.md +0 -5
  304. chutils-3.0.0/conductor/archive/generate_few_shot_20260610/metadata.json +0 -8
  305. chutils-3.0.0/conductor/archive/generate_few_shot_20260610/plan.md +0 -42
  306. chutils-3.0.0/conductor/archive/generate_few_shot_20260610/spec.md +0 -44
  307. chutils-3.0.0/conductor/archive/mock_server_20260610/index.md +0 -5
  308. chutils-3.0.0/conductor/archive/mock_server_20260610/metadata.json +0 -8
  309. chutils-3.0.0/conductor/archive/mock_server_20260610/plan.md +0 -43
  310. chutils-3.0.0/conductor/archive/mock_server_20260610/spec.md +0 -40
  311. chutils-3.0.0/conductor/archive/optional_dependencies_20260515/index.md +0 -5
  312. chutils-3.0.0/conductor/archive/optional_dependencies_20260515/metadata.json +0 -8
  313. chutils-3.0.0/conductor/archive/optional_dependencies_20260515/plan.md +0 -38
  314. chutils-3.0.0/conductor/archive/optional_dependencies_20260515/spec.md +0 -25
  315. chutils-3.0.0/conductor/archive/scraping_humanize_20260707/index.md +0 -5
  316. chutils-3.0.0/conductor/archive/scraping_humanize_20260707/metadata.json +0 -8
  317. chutils-3.0.0/conductor/archive/scraping_humanize_20260707/plan.md +0 -50
  318. chutils-3.0.0/conductor/archive/scraping_humanize_20260707/spec.md +0 -51
  319. chutils-3.0.0/conductor/archive/secrets_unification_20260708/index.md +0 -5
  320. chutils-3.0.0/conductor/archive/secrets_unification_20260708/metadata.json +0 -8
  321. chutils-3.0.0/conductor/archive/secrets_unification_20260708/plan.md +0 -31
  322. chutils-3.0.0/conductor/archive/secrets_unification_20260708/spec.md +0 -47
  323. chutils-3.0.0/conductor/archive/web_20260707/index.md +0 -5
  324. chutils-3.0.0/conductor/archive/web_20260707/metadata.json +0 -8
  325. chutils-3.0.0/conductor/archive/web_20260707/plan.md +0 -45
  326. chutils-3.0.0/conductor/archive/web_20260707/spec.md +0 -49
  327. chutils-3.0.0/conductor/tracks/cloud_secret_managers_20260511/plan.md +0 -44
  328. chutils-3.0.0/conductor/tracks/diagnostics_20260610/index.md +0 -5
  329. chutils-3.0.0/conductor/tracks/diagnostics_20260610/metadata.json +0 -8
  330. chutils-3.0.0/conductor/tracks/diagnostics_20260610/plan.md +0 -42
  331. chutils-3.0.0/conductor/tracks/diagnostics_20260610/spec.md +0 -40
  332. chutils-3.0.0/conductor/tracks/env_20260702/index.md +0 -5
  333. chutils-3.0.0/conductor/tracks/env_20260702/metadata.json +0 -8
  334. chutils-3.0.0/conductor/tracks/env_20260702/plan.md +0 -33
  335. chutils-3.0.0/conductor/tracks/env_20260702/spec.md +0 -53
  336. chutils-3.0.0/conductor/tracks/plan.md +0 -1
  337. chutils-3.0.0/conductor/tracks/sync_env_20260707/index.md +0 -5
  338. chutils-3.0.0/conductor/tracks/sync_env_20260707/metadata.json +0 -8
  339. chutils-3.0.0/conductor/tracks/sync_env_20260707/plan.md +0 -37
  340. chutils-3.0.0/conductor/tracks/sync_env_20260707/spec.md +0 -45
  341. chutils-3.0.0/conductor/tracks/validation_20260702/index.md +0 -5
  342. chutils-3.0.0/conductor/tracks/validation_20260702/metadata.json +0 -8
  343. chutils-3.0.0/conductor/tracks/validation_20260702/plan.md +0 -29
  344. chutils-3.0.0/conductor/tracks/validation_20260702/spec.md +0 -42
  345. chutils-3.0.0/conductor/tracks.md +0 -112
  346. chutils-3.0.0/src/chutils/commands/dev.py +0 -704
  347. chutils-3.0.0/src/chutils/config/dev.py +0 -141
  348. chutils-3.0.0/src/chutils/dev/generate_few_shot.py +0 -1004
  349. chutils-3.0.0/src/chutils/dev/models.py +0 -88
  350. chutils-3.0.0/src/chutils/dev/rules.py +0 -524
  351. chutils-3.0.0/src/chutils/env.py +0 -66
  352. chutils-3.0.0/src/chutils/exceptions.py +0 -240
  353. chutils-3.0.0/src/chutils/metrics/base.py +0 -42
  354. chutils-3.0.0/src/chutils/secret_manager/providers.py +0 -285
  355. chutils-3.0.0/tests/unit/dev/test_ai_lint.py +0 -341
  356. chutils-3.0.0/tests/unit/secret_manager/test_secret_manager_providers.py +0 -105
  357. chutils-3.0.0/tests/unit/test_minimal_imports.py +0 -75
  358. {chutils-3.0.0 → chutils-3.2.0}/.gitattributes +0 -0
  359. {chutils-3.0.0 → chutils-3.2.0}/.github/workflows/ci.yml +0 -0
  360. {chutils-3.0.0 → chutils-3.2.0}/.github/workflows/publish-docs.yml +0 -0
  361. {chutils-3.0.0 → chutils-3.2.0}/CODE_OF_CONDUCT.md +0 -0
  362. {chutils-3.0.0 → chutils-3.2.0}/CONTRIBUTING.md +0 -0
  363. {chutils-3.0.0 → chutils-3.2.0}/LICENSE +0 -0
  364. {chutils-3.0.0 → chutils-3.2.0}/conductor/GEMINI.md +0 -0
  365. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/index.md +0 -0
  366. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/metadata.json +0 -0
  367. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/spec.md +0 -0
  368. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/index.md +0 -0
  369. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/metadata.json +0 -0
  370. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/plan.md +0 -0
  371. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/spec.md +0 -0
  372. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/index.md +0 -0
  373. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/metadata.json +0 -0
  374. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/spec.md +0 -0
  375. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/index.md +0 -0
  376. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/metadata.json +0 -0
  377. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/spec.md +0 -0
  378. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/index.md +0 -0
  379. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/metadata.json +0 -0
  380. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/spec.md +0 -0
  381. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/index.md +0 -0
  382. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/metadata.json +0 -0
  383. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/plan.md +0 -0
  384. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/spec.md +0 -0
  385. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/index.md +0 -0
  386. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/metadata.json +0 -0
  387. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/index.md +0 -0
  388. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/metadata.json +0 -0
  389. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/plan.md +0 -0
  390. {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/spec.md +0 -0
  391. {chutils-3.0.0 → chutils-3.2.0}/conductor/code_styleguides/python.md +0 -0
  392. {chutils-3.0.0 → chutils-3.2.0}/conductor/index.md +0 -0
  393. {chutils-3.0.0 → chutils-3.2.0}/conductor/product-guidelines.md +0 -0
  394. {chutils-3.0.0 → chutils-3.2.0}/conductor/setup_state.json +0 -0
  395. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/index.md +0 -0
  396. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/metadata.json +0 -0
  397. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/plan.md +0 -0
  398. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/spec.md +0 -0
  399. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/index.md +0 -0
  400. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/metadata.json +0 -0
  401. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/plan.md +0 -0
  402. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/spec.md +0 -0
  403. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/index.md +0 -0
  404. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/metadata.json +0 -0
  405. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/plan.md +0 -0
  406. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/spec.md +0 -0
  407. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/index.md +0 -0
  408. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/metadata.json +0 -0
  409. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/plan.md +0 -0
  410. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/spec.md +0 -0
  411. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/index.md +0 -0
  412. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/metadata.json +0 -0
  413. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/plan.md +0 -0
  414. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/spec.md +0 -0
  415. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/index.md +0 -0
  416. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/metadata.json +0 -0
  417. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/plan.md +0 -0
  418. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/spec.md +0 -0
  419. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/index.md +0 -0
  420. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/metadata.json +0 -0
  421. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/plan.md +0 -0
  422. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/spec.md +0 -0
  423. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/index.md +0 -0
  424. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/metadata.json +0 -0
  425. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/plan.md +0 -0
  426. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/spec.md +0 -0
  427. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/index.md +0 -0
  428. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/metadata.json +0 -0
  429. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/plan.md +0 -0
  430. {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/spec.md +0 -0
  431. {chutils-3.0.0 → chutils-3.2.0}/conductor/workflow.md +0 -0
  432. {chutils-3.0.0 → chutils-3.2.0}/docs/CODE_OF_CONDUCT_RU.md +0 -0
  433. {chutils-3.0.0 → chutils-3.2.0}/docs/CONTRIBUTING_RU.md +0 -0
  434. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/README.md +0 -0
  435. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/configuration/README.md +0 -0
  436. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/configuration/bad_pattern.py +0 -0
  437. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/configuration/good_pattern.py +0 -0
  438. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/error_handling/README.md +0 -0
  439. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/error_handling/bad_pattern.py +0 -0
  440. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/error_handling/good_pattern.py +0 -0
  441. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/logging/README.md +0 -0
  442. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/logging/bad_pattern.py +0 -0
  443. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/logging/good_pattern.py +0 -0
  444. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/README.md +0 -0
  445. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/bad_pattern.py +0 -0
  446. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/good_pattern.py +0 -0
  447. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/secrets/README.md +0 -0
  448. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/secrets/bad_pattern.py +0 -0
  449. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/secrets/good_pattern.py +0 -0
  450. {chutils-3.0.0 → chutils-3.2.0}/docs/ai_hints.md +0 -0
  451. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/config.md +0 -0
  452. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/init.md +0 -0
  453. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/secrets.md +0 -0
  454. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/show_paths.md +0 -0
  455. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/template.md +0 -0
  456. {chutils-3.0.0 → chutils-3.2.0}/docs/cli/validate.md +0 -0
  457. {chutils-3.0.0 → chutils-3.2.0}/docs/migration.md +0 -0
  458. {chutils-3.0.0 → chutils-3.2.0}/docs/plugins.md +0 -0
  459. {chutils-3.0.0 → chutils-3.2.0}/docs/testing.md +0 -0
  460. {chutils-3.0.0 → chutils-3.2.0}/docs/web.md +0 -0
  461. {chutils-3.0.0 → chutils-3.2.0}/examples/.env +0 -0
  462. {chutils-3.0.0 → chutils-3.2.0}/examples/01_configuration.py +0 -0
  463. {chutils-3.0.0 → chutils-3.2.0}/examples/02_logging.py +0 -0
  464. {chutils-3.0.0 → chutils-3.2.0}/examples/03_secrets.py +0 -0
  465. {chutils-3.0.0 → chutils-3.2.0}/examples/04_full_example.py +0 -0
  466. {chutils-3.0.0 → chutils-3.2.0}/examples/05_different_log_levels.py +0 -0
  467. {chutils-3.0.0 → chutils-3.2.0}/examples/06_local_config_override.py +0 -0
  468. {chutils-3.0.0 → chutils-3.2.0}/examples/07_decorators_example.py +0 -0
  469. {chutils-3.0.0 → chutils-3.2.0}/examples/08_multiple_loggers_example.py +0 -0
  470. {chutils-3.0.0 → chutils-3.2.0}/examples/09_disable_keyring.py +0 -0
  471. {chutils-3.0.0 → chutils-3.2.0}/examples/10_universal_env_override.py +0 -0
  472. {chutils-3.0.0 → chutils-3.2.0}/examples/11_retry_decorator.py +0 -0
  473. {chutils-3.0.0 → chutils-3.2.0}/examples/12_secret_masking.py +0 -0
  474. {chutils-3.0.0 → chutils-3.2.0}/examples/13_pydantic_validation.py +0 -0
  475. {chutils-3.0.0 → chutils-3.2.0}/examples/15_context_logging.py +0 -0
  476. {chutils-3.0.0 → chutils-3.2.0}/examples/17_timeout_decorator.py +0 -0
  477. {chutils-3.0.0 → chutils-3.2.0}/examples/18_config_hot_reload.py +0 -0
  478. {chutils-3.0.0 → chutils-3.2.0}/examples/19_remote_config.py +0 -0
  479. {chutils-3.0.0 → chutils-3.2.0}/examples/20_opentelemetry_tracing.py +0 -0
  480. {chutils-3.0.0 → chutils-3.2.0}/examples/21_config_diagnostics.py +0 -0
  481. {chutils-3.0.0 → chutils-3.2.0}/examples/22_circuit_breaker_decorator.py +0 -0
  482. {chutils-3.0.0 → chutils-3.2.0}/examples/22_safe_path_resolution.py +0 -0
  483. {chutils-3.0.0 → chutils-3.2.0}/examples/23_event_bus.py +0 -0
  484. {chutils-3.0.0 → chutils-3.2.0}/examples/24_task_scheduler.py +0 -0
  485. {chutils-3.0.0 → chutils-3.2.0}/examples/25_testing_fixtures_example.py +0 -0
  486. {chutils-3.0.0 → chutils-3.2.0}/examples/26_metrics_prometheus.py +0 -0
  487. {chutils-3.0.0 → chutils-3.2.0}/examples/27_rate_limiting.py +0 -0
  488. {chutils-3.0.0 → chutils-3.2.0}/examples/28_dependency_injection.py +0 -0
  489. {chutils-3.0.0 → chutils-3.2.0}/examples/captcha_solvers_usage.py +0 -0
  490. {chutils-3.0.0 → chutils-3.2.0}/examples/config.yml +0 -0
  491. {chutils-3.0.0 → chutils-3.2.0}/examples/scraping_humanize_usage.py +0 -0
  492. {chutils-3.0.0 → chutils-3.2.0}/examples/web_client_usage.py +0 -0
  493. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/__main__.py +0 -0
  494. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/__init__.py +0 -0
  495. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/decorator.py +0 -0
  496. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/utils.py +0 -0
  497. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/GEMINI.md +0 -0
  498. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/di/__init__.py +0 -0
  499. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/events/__init__.py +0 -0
  500. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/GEMINI.md +0 -0
  501. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/__init__.py +0 -0
  502. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/handlers.py +0 -0
  503. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/plugins/__init__.py +0 -0
  504. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/__init__.py +0 -0
  505. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/exceptions.py +0 -0
  506. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/__init__.py +0 -0
  507. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/secret_manager/GEMINI.md +0 -0
  508. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/secret_manager/__init__.py +0 -0
  509. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/tasks/__init__.py +0 -0
  510. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/testing/__init__.py +0 -0
  511. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/testing/fixtures.py +0 -0
  512. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/text.py +0 -0
  513. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/typing.py +0 -0
  514. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/__init__.py +0 -0
  515. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/proxy_pool.py +0 -0
  516. {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/user_agent.py +0 -0
  517. {chutils-3.0.0 → chutils-3.2.0}/tests/conftest.py +0 -0
  518. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_ai_lint_integration.py +0 -0
  519. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_cli_e2e.py +0 -0
  520. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_event_loops.py +0 -0
  521. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_examples.py +0 -0
  522. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_hooks_integration.py +0 -0
  523. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_masking_integration.py +0 -0
  524. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_otel_tracing.py +0 -0
  525. {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_remote_config_integration.py +0 -0
  526. {chutils-3.0.0 → chutils-3.2.0}/tests/manual/manual_test_cli_booster.py +0 -0
  527. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/conftest.py +0 -0
  528. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli.py +0 -0
  529. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_booster.py +0 -0
  530. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config.py +0 -0
  531. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config_cmd.py +0 -0
  532. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config_schema.py +0 -0
  533. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev_tree.py +0 -0
  534. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_diagnostics.py +0 -0
  535. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_extras_suggestion.py +0 -0
  536. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_init.py +0 -0
  537. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_paths.py +0 -0
  538. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_rich.py +0 -0
  539. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_rich_width.py +0 -0
  540. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_secrets.py +0 -0
  541. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_template.py +0 -0
  542. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_utils_internal.py +0 -0
  543. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_validate.py +0 -0
  544. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config.py +0 -0
  545. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_ast_parser.py +0 -0
  546. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_diagnostics.py +0 -0
  547. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_env.py +0 -0
  548. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_env_loading.py +0 -0
  549. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_generator.py +0 -0
  550. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_json.py +0 -0
  551. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_pydantic.py +0 -0
  552. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_required.py +0 -0
  553. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_schema.py +0 -0
  554. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_tracing.py +0 -0
  555. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_universal_env.py +0 -0
  556. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_utils.py +0 -0
  557. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_watcher.py +0 -0
  558. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_priority_unification.py +0 -0
  559. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_remote_config.py +0 -0
  560. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer.py +0 -0
  561. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_abstract.py +0 -0
  562. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_graph.py +0 -0
  563. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_layers.py +0 -0
  564. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_metadata.py +0 -0
  565. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_cache.py +0 -0
  566. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_dev_models.py +0 -0
  567. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_exceptions.py +0 -0
  568. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_features.py +0 -0
  569. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_fs.py +0 -0
  570. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_lifecycle.py +0 -0
  571. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_thread_safety.py +0 -0
  572. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_time.py +0 -0
  573. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_retry.py +0 -0
  574. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_timeout.py +0 -0
  575. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorators.py +0 -0
  576. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_rate_limit.py +0 -0
  577. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_chat_context.py +0 -0
  578. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_mock_server.py +0 -0
  579. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_scaffold.py +0 -0
  580. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/di/test_di.py +0 -0
  581. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/events/test_event_bus.py +0 -0
  582. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/conftest.py +0 -0
  583. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_basics.py +0 -0
  584. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_compression.py +0 -0
  585. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_config_sections.py +0 -0
  586. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_configuration.py +0 -0
  587. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_context.py +0 -0
  588. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_env_control.py +0 -0
  589. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_files.py +0 -0
  590. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_json_format.py +0 -0
  591. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_logger_rich_width.py +0 -0
  592. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_masking.py +0 -0
  593. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_performance_security.py +0 -0
  594. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_rich.py +0 -0
  595. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_rotation.py +0 -0
  596. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/metrics/test_metrics.py +0 -0
  597. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/plugins/test_integration.py +0 -0
  598. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/plugins/test_interfaces.py +0 -0
  599. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/plugins/test_plugins.py +0 -0
  600. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secret_manager.py +0 -0
  601. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secret_manager_env.py +0 -0
  602. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secrets_required.py +0 -0
  603. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_ai_lint_ignore.py +0 -0
  604. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_anticaptcha.py +0 -0
  605. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_antidetect.py +0 -0
  606. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_async_web_client.py +0 -0
  607. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_capmonster.py +0 -0
  608. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_captcha_base.py +0 -0
  609. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_captcha_imports.py +0 -0
  610. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_crypto.py +0 -0
  611. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_crypto_dependencies.py +0 -0
  612. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_events_exception_group.py +0 -0
  613. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_humanize_math.py +0 -0
  614. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_playwright_humanize.py +0 -0
  615. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_proxy_pool.py +0 -0
  616. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_rucaptcha.py +0 -0
  617. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_scraping_imports.py +0 -0
  618. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_selenium_humanize.py +0 -0
  619. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_text.py +0 -0
  620. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_text_dependencies.py +0 -0
  621. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_user_agent.py +0 -0
  622. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_web_client.py +0 -0
  623. {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_web_imports.py +0 -0
  624. {chutils-3.0.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/
@@ -0,0 +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/
186
+ .chutils_dashboard_history.json
@@ -34,6 +34,7 @@
34
34
  - Вместо `Optional[T]` обязательно используйте `T | None`.
35
35
  - Вместо `List[T]`, `Dict[K, V]`, `Tuple[T, ...]` используйте встроенные типы `list[T]`, `dict[K, V]`,
36
36
  `tuple[T, ...]` без импорта из `typing`.
37
+ - **Использование uv**: Проект использует менеджер пакетов `uv` (в корне присутствует `uv.lock`). Для запуска любых скриптов, команд CLI или тестов AI-агенты ОБЯЗАТЕЛЬНО должны использовать `uv run` (например, `uv run chutils ...`, `uv run pytest`). Прямой запуск через интерпретатор `.venv` или глобальный `python` не рекомендуется.
37
38
  - **Документация**: Подробные советы для AI находятся в `docs/ai_hints.md` и `docs/INTEGRATION_AI.md`.
38
39
 
39
40
  ## 3. Тестирование
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chutils
3
- Version: 3.0.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
@@ -107,7 +118,11 @@ Every time you start a new project, you have to solve the same tasks:
107
118
  - **🛡️ Secure Paths:** Prevent Path Traversal attacks by safely resolving file paths against a base directory using
108
119
  `resolve_safe_path()`.
109
120
  - **🤖 AI Linter:** Run static analysis checks on your codebase to ensure AI readiness (strict type hints, structured
110
- docstrings, API map sync) via `chutils dev ai-lint`.
121
+ docstrings, API map sync, and file dependency synchronization) via `chutils dev ai-lint`.
122
+ - **✅ Data Validation (chutils.validation):** An all-in-one Pydantic-based data and JSON validation module featuring
123
+ `@validate_call` decorator for function argument checks and rich exception formatting.
124
+ - **🩺 Diagnostics API (chutils.diagnostics):** An asynchronous, thread-safe health checking framework with built-in
125
+ checks (keyring, config) and integrations for popular web frameworks (FastAPI, Flask).
111
126
  - **⚡ Async Ready:** Most core functions have asynchronous versions (prefixed with `a`) for non-blocking execution.
112
127
  - **🚀 Ready to Use:** Just install and use.
113
128
 
@@ -274,20 +289,71 @@ To use this feature, install `watchdog`:
274
289
 
275
290
  ### 3. Secret Management
276
291
 
277
- `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
+ **.
278
297
 
279
298
  ```python
280
299
  from chutils import SecretManager
281
300
 
282
301
  secrets = SecretManager("my_awesome_app")
283
302
 
284
- # Save once
303
+ # Save secret (will be written to the first writable provider in the chain)
285
304
  secrets.save_secret("API_KEY", "secret-value-123")
286
305
 
287
- # Use everywhere
306
+ # Retrieve secret
288
307
  key = secrets.get_secret("API_KEY")
289
308
  ```
290
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
+
291
357
  #### Disabling Keyring (Optional)
292
358
 
293
359
  In environments like Docker or CI/CD where `keyring` is unavailable, you can suppress warnings and skip the check:
@@ -333,6 +399,22 @@ except PathTraversalError as e:
333
399
  - `get_secret(key, fallback=None, required=False)` / `aget_secret(...)`
334
400
  - `delete_secret` / `adelete_secret`
335
401
 
402
+ ### Environment Manifest (`chutils.env`)
403
+
404
+ - `BaseEnvManifest`: Declarative specification of environment variables using Pydantic typing, automatic secret masking,
405
+ and `load()` classmethod.
406
+
407
+ ### Data Validation (`chutils.validation`)
408
+
409
+ - `validate_data(model, data)`: Validates dictionaries or JSON strings against Pydantic models, raising
410
+ `ChutilsValidationError`.
411
+ - `@validate_call`: Automatically validates function arguments using Pydantic.
412
+
413
+ ### Health Checking (`chutils.diagnostics`)
414
+
415
+ - `DiagnosticsManager`: Registers and аsynchronously executes system health checks with timeouts.
416
+ - Web Framework helpers: `get_fastapi_health_handler` and `get_flask_health_handler`.
417
+
336
418
  ### Decorators (`chutils.decorators`)
337
419
 
338
420
  - `@log_function_details`: Logs arguments, execution time, and result (uses `DEVDEBUG` level).
@@ -437,6 +519,21 @@ chutils dev ai-lint --strict --ignore "temp/,build/"
437
519
 
438
520
  See [docs/ai_lint.md](docs/ai_lint.md) for more details.
439
521
 
522
+ ### 7. Environment Variables Synchronization
523
+
524
+ Keep `.env` and `.env.example` files in sync with format preservation, comments, and values masking:
525
+
526
+ ```bash
527
+ # Compare .env and .env.example keys without making changes
528
+ chutils dev sync-env --dry-run
529
+
530
+ # Synchronize files automatically
531
+ chutils dev sync-env --yes
532
+
533
+ # Specify custom paths
534
+ chutils dev sync-env --env-path .env.dev --example-path .env.dev.example
535
+ ```
536
+
440
537
  ## License
441
538
 
442
539
  The project is distributed under the MIT License.
@@ -46,7 +46,11 @@ Every time you start a new project, you have to solve the same tasks:
46
46
  - **🛡️ Secure Paths:** Prevent Path Traversal attacks by safely resolving file paths against a base directory using
47
47
  `resolve_safe_path()`.
48
48
  - **🤖 AI Linter:** Run static analysis checks on your codebase to ensure AI readiness (strict type hints, structured
49
- docstrings, API map sync) via `chutils dev ai-lint`.
49
+ docstrings, API map sync, and file dependency synchronization) via `chutils dev ai-lint`.
50
+ - **✅ Data Validation (chutils.validation):** An all-in-one Pydantic-based data and JSON validation module featuring
51
+ `@validate_call` decorator for function argument checks and rich exception formatting.
52
+ - **🩺 Diagnostics API (chutils.diagnostics):** An asynchronous, thread-safe health checking framework with built-in
53
+ checks (keyring, config) and integrations for popular web frameworks (FastAPI, Flask).
50
54
  - **⚡ Async Ready:** Most core functions have asynchronous versions (prefixed with `a`) for non-blocking execution.
51
55
  - **🚀 Ready to Use:** Just install and use.
52
56
 
@@ -213,20 +217,71 @@ To use this feature, install `watchdog`:
213
217
 
214
218
  ### 3. Secret Management
215
219
 
216
- `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
+ **.
217
225
 
218
226
  ```python
219
227
  from chutils import SecretManager
220
228
 
221
229
  secrets = SecretManager("my_awesome_app")
222
230
 
223
- # Save once
231
+ # Save secret (will be written to the first writable provider in the chain)
224
232
  secrets.save_secret("API_KEY", "secret-value-123")
225
233
 
226
- # Use everywhere
234
+ # Retrieve secret
227
235
  key = secrets.get_secret("API_KEY")
228
236
  ```
229
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
+
230
285
  #### Disabling Keyring (Optional)
231
286
 
232
287
  In environments like Docker or CI/CD where `keyring` is unavailable, you can suppress warnings and skip the check:
@@ -272,6 +327,22 @@ except PathTraversalError as e:
272
327
  - `get_secret(key, fallback=None, required=False)` / `aget_secret(...)`
273
328
  - `delete_secret` / `adelete_secret`
274
329
 
330
+ ### Environment Manifest (`chutils.env`)
331
+
332
+ - `BaseEnvManifest`: Declarative specification of environment variables using Pydantic typing, automatic secret masking,
333
+ and `load()` classmethod.
334
+
335
+ ### Data Validation (`chutils.validation`)
336
+
337
+ - `validate_data(model, data)`: Validates dictionaries or JSON strings against Pydantic models, raising
338
+ `ChutilsValidationError`.
339
+ - `@validate_call`: Automatically validates function arguments using Pydantic.
340
+
341
+ ### Health Checking (`chutils.diagnostics`)
342
+
343
+ - `DiagnosticsManager`: Registers and аsynchronously executes system health checks with timeouts.
344
+ - Web Framework helpers: `get_fastapi_health_handler` and `get_flask_health_handler`.
345
+
275
346
  ### Decorators (`chutils.decorators`)
276
347
 
277
348
  - `@log_function_details`: Logs arguments, execution time, and result (uses `DEVDEBUG` level).
@@ -376,6 +447,21 @@ chutils dev ai-lint --strict --ignore "temp/,build/"
376
447
 
377
448
  See [docs/ai_lint.md](docs/ai_lint.md) for more details.
378
449
 
450
+ ### 7. Environment Variables Synchronization
451
+
452
+ Keep `.env` and `.env.example` files in sync with format preservation, comments, and values masking:
453
+
454
+ ```bash
455
+ # Compare .env and .env.example keys without making changes
456
+ chutils dev sync-env --dry-run
457
+
458
+ # Synchronize files automatically
459
+ chutils dev sync-env --yes
460
+
461
+ # Specify custom paths
462
+ chutils dev sync-env --env-path .env.dev --example-path .env.dev.example
463
+ ```
464
+
379
465
  ## License
380
466
 
381
467
  The project is distributed under the MIT License.
@@ -0,0 +1,176 @@
1
+ [dependencies]
2
+ # При изменении исходного кода chutils необходимо перегенерировать карту API и семантический индекс
3
+ "src/chutils/**/*.py" = ["api_map.md", "project_index.json"]
4
+
5
+ # ---------------------------------------------------------------------------
6
+ # Модуль config
7
+ # ---------------------------------------------------------------------------
8
+
9
+ # При изменении любого файла конфигурации — обновить docs/api.md
10
+ "src/chutils/config/**/*.py" = ["docs/api.md"]
11
+
12
+ # При изменении провайдеров конфигурации — обновить специализированную документацию
13
+ "new:src/chutils/config/custom_providers.py" = ["docs/custom_config_providers.md"]
14
+ "src/chutils/config/custom_providers.py" = ["docs/custom_config_providers.md", "docs/api.md"]
15
+
16
+ # ---------------------------------------------------------------------------
17
+ # Модуль logger
18
+ # ---------------------------------------------------------------------------
19
+
20
+ "src/chutils/logger/**/*.py" = ["docs/api.md"]
21
+
22
+ # ---------------------------------------------------------------------------
23
+ # Модуль secret_manager
24
+ # ---------------------------------------------------------------------------
25
+
26
+ "src/chutils/secret_manager/**/*.py" = ["docs/api.md"]
27
+
28
+ # ---------------------------------------------------------------------------
29
+ # Модуль cache
30
+ # ---------------------------------------------------------------------------
31
+
32
+ # Изменения кэша влияют на API и рецепты (там есть примеры использования)
33
+ "src/chutils/cache/**/*.py" = ["docs/api.md", "docs/recipes.md"]
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # Модуль events (шина событий)
37
+ # ---------------------------------------------------------------------------
38
+
39
+ "src/chutils/events/**/*.py" = ["docs/api.md"]
40
+
41
+ # ---------------------------------------------------------------------------
42
+ # Модуль tasks (планировщик)
43
+ # ---------------------------------------------------------------------------
44
+
45
+ "src/chutils/tasks/**/*.py" = ["docs/api.md"]
46
+
47
+ # ---------------------------------------------------------------------------
48
+ # Модуль di (Dependency Injection)
49
+ # ---------------------------------------------------------------------------
50
+
51
+ "src/chutils/di/**/*.py" = ["docs/api.md"]
52
+
53
+ # ---------------------------------------------------------------------------
54
+ # Модуль metrics
55
+ # ---------------------------------------------------------------------------
56
+
57
+ "src/chutils/metrics/**/*.py" = ["docs/api.md"]
58
+
59
+ # ---------------------------------------------------------------------------
60
+ # Модуль diagnostics (мониторинг работоспособности)
61
+ # ---------------------------------------------------------------------------
62
+
63
+ "src/chutils/diagnostics/**/*.py" = ["docs/api.md"]
64
+
65
+ # ---------------------------------------------------------------------------
66
+ # Модуль dev (AI-утилиты разработчика)
67
+ # ---------------------------------------------------------------------------
68
+
69
+ # При создании нового правила линтера — обновить документацию линтера и CLI
70
+ "new:src/chutils/dev/rules/*.py" = ["docs/ai_lint.md", "docs/cli/dev.md"]
71
+
72
+ # При изменении любого файла dev — обновить docs/ai_lint.md и docs/api.md
73
+ "src/chutils/dev/**/*.py" = ["docs/ai_lint.md", "docs/api.md"]
74
+
75
+ # ---------------------------------------------------------------------------
76
+ # Отдельные файлы-модули корневого пакета
77
+ # ---------------------------------------------------------------------------
78
+
79
+ # Декораторы — часто используются в рецептах
80
+ "src/chutils/decorators.py" = ["docs/api.md", "docs/recipes.md"]
81
+
82
+ # Файловая система
83
+ "src/chutils/fs.py" = ["docs/api.md"]
84
+
85
+ # Управление жизненным циклом
86
+ "src/chutils/lifecycle.py" = ["docs/api.md"]
87
+
88
+ # Фича-флаги
89
+ "src/chutils/features.py" = ["docs/api.md"]
90
+
91
+ # Манифест окружения
92
+ "src/chutils/env.py" = ["docs/api.md"]
93
+
94
+ # Валидация данных
95
+ "src/chutils/validation.py" = ["docs/api.md"]
96
+
97
+ # Распределённое трассирование
98
+ "src/chutils/tracing.py" = ["docs/api.md"]
99
+
100
+ # Криптография
101
+ "src/chutils/crypto.py" = ["docs/api.md"]
102
+
103
+ # Работа с БД (влияет также на CLI-документацию db)
104
+ "src/chutils/db.py" = ["docs/api.md", "docs/cli/db.md"]
105
+
106
+ # Работа с текстом
107
+ "src/chutils/text.py" = ["docs/api.md"]
108
+
109
+ # Работа со временем
110
+ "src/chutils/time.py" = ["docs/api.md"]
111
+
112
+ # Контекст выполнения
113
+ "src/chutils/context.py" = ["docs/api.md"]
114
+
115
+ # CLI booster (быстрое создание CLI)
116
+ "src/chutils/cli_booster.py" = ["docs/api.md"]
117
+
118
+ # Исключения
119
+ "src/chutils/exceptions/**/*.py" = ["docs/api.md"]
120
+
121
+ # ---------------------------------------------------------------------------
122
+ # Модули скрейпинга и капчи
123
+ # ---------------------------------------------------------------------------
124
+
125
+ "src/chutils/scraping/**/*.py" = ["docs/scraping.md"]
126
+ "src/chutils/scraping/captcha/**/*.py" = ["docs/captcha.md"]
127
+
128
+ # ---------------------------------------------------------------------------
129
+ # Модуль аудита
130
+ # ---------------------------------------------------------------------------
131
+
132
+ "src/chutils/audit/**/*.py" = ["docs/audit.md"]
133
+
134
+ # ---------------------------------------------------------------------------
135
+ # Система плагинов
136
+ # ---------------------------------------------------------------------------
137
+
138
+ "src/chutils/plugins/**/*.py" = ["docs/plugins.md"]
139
+
140
+ # ---------------------------------------------------------------------------
141
+ # Модуль тестирования
142
+ # ---------------------------------------------------------------------------
143
+
144
+ "src/chutils/testing/**/*.py" = ["docs/testing.md"]
145
+
146
+ # ---------------------------------------------------------------------------
147
+ # HTTP-клиент
148
+ # ---------------------------------------------------------------------------
149
+
150
+ "src/chutils/web/**/*.py" = ["docs/web.md"]
151
+
152
+ # ---------------------------------------------------------------------------
153
+ # CLI команды
154
+ # ---------------------------------------------------------------------------
155
+
156
+ "src/chutils/commands/dev/**/*.py" = ["docs/cli/dev.md"]
157
+ "src/chutils/commands/env.py" = ["docs/cli/env.md"]
158
+ "src/chutils/commands/secrets.py" = ["docs/cli/secrets.md"]
159
+ "src/chutils/commands/config.py" = ["docs/cli/config.md"]
160
+ "src/chutils/commands/init.py" = ["docs/cli/init.md"]
161
+ "src/chutils/commands/paths.py" = ["docs/cli/show_paths.md"]
162
+ "src/chutils/commands/pypi.py" = ["docs/cli/pypi.md"]
163
+ "src/chutils/commands/template.py" = ["docs/cli/template.md"]
164
+ "src/chutils/commands/validate.py" = ["docs/cli/validate.md"]
165
+ "src/chutils/commands/db.py" = ["docs/cli/db.md"]
166
+
167
+ # ---------------------------------------------------------------------------
168
+ # Корневые файлы проекта
169
+ # ---------------------------------------------------------------------------
170
+
171
+ # При обновлении зависимостей — синхронизировать docs/dependencies.md
172
+ "pyproject.toml" = ["docs/dependencies.md"]
173
+
174
+ # Взаимная зависимость README (рус/англ)
175
+ "README.md" = ["docs/README_RU.md"]
176
+ "docs/README_RU.md" = ["README.md"]