chutils 2.9.0__tar.gz → 3.1.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 (579) hide show
  1. chutils-3.1.0/.gitattributes +2 -0
  2. chutils-3.1.0/.github/workflows/ci.yml +45 -0
  3. chutils-3.1.0/.github/workflows/publish-docs.yml +34 -0
  4. chutils-3.1.0/.gitignore +185 -0
  5. chutils-3.1.0/CODE_OF_CONDUCT.md +125 -0
  6. chutils-3.1.0/CONTRIBUTING.md +70 -0
  7. chutils-3.1.0/GEMINI.md +50 -0
  8. {chutils-2.9.0 → chutils-3.1.0}/PKG-INFO +83 -49
  9. {chutils-2.9.0 → chutils-3.1.0}/README.md +41 -5
  10. chutils-3.1.0/ai-lint.toml +33 -0
  11. chutils-3.1.0/api_map.md +185 -0
  12. chutils-3.1.0/benchmarks/cold_start.py +70 -0
  13. chutils-3.1.0/conductor/.gitignore +1 -0
  14. chutils-3.1.0/conductor/GEMINI.md +2 -0
  15. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/index.md +5 -0
  16. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/metadata.json +8 -0
  17. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/plan.md +15 -0
  18. chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/spec.md +23 -0
  19. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/index.md +5 -0
  20. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/metadata.json +8 -0
  21. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/plan.md +16 -0
  22. chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/spec.md +30 -0
  23. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/index.md +5 -0
  24. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/metadata.json +8 -0
  25. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/plan.md +22 -0
  26. chutils-3.1.0/conductor/archive/ai_lint_inline_ignore_20260707/spec.md +39 -0
  27. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/index.md +5 -0
  28. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/metadata.json +8 -0
  29. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/plan.md +16 -0
  30. chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/spec.md +23 -0
  31. chutils-3.1.0/conductor/archive/captcha_20260707/index.md +5 -0
  32. chutils-3.1.0/conductor/archive/captcha_20260707/metadata.json +8 -0
  33. chutils-3.1.0/conductor/archive/captcha_20260707/plan.md +41 -0
  34. chutils-3.1.0/conductor/archive/captcha_20260707/spec.md +52 -0
  35. chutils-3.1.0/conductor/archive/chat_context_20260610/index.md +5 -0
  36. chutils-3.1.0/conductor/archive/chat_context_20260610/metadata.json +8 -0
  37. chutils-3.1.0/conductor/archive/chat_context_20260610/plan.md +39 -0
  38. chutils-3.1.0/conductor/archive/chat_context_20260610/spec.md +36 -0
  39. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/index.md +5 -0
  40. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/metadata.json +8 -0
  41. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/plan.md +45 -0
  42. chutils-3.1.0/conductor/archive/circuit_breaker_20260521/spec.md +50 -0
  43. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/index.md +5 -0
  44. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/metadata.json +8 -0
  45. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/plan.md +40 -0
  46. chutils-3.1.0/conductor/archive/cli_scaffold_20260610/spec.md +50 -0
  47. chutils-3.1.0/conductor/archive/config_required_20260708/index.md +5 -0
  48. chutils-3.1.0/conductor/archive/config_required_20260708/metadata.json +8 -0
  49. chutils-3.1.0/conductor/archive/config_required_20260708/plan.md +27 -0
  50. chutils-3.1.0/conductor/archive/config_required_20260708/spec.md +52 -0
  51. chutils-3.1.0/conductor/archive/context_metadata_20260714/index.md +5 -0
  52. chutils-3.1.0/conductor/archive/context_metadata_20260714/metadata.json +8 -0
  53. chutils-3.1.0/conductor/archive/context_metadata_20260714/plan.md +19 -0
  54. chutils-3.1.0/conductor/archive/context_metadata_20260714/spec.md +31 -0
  55. chutils-3.1.0/conductor/archive/dependency_errors_20260707/index.md +5 -0
  56. chutils-3.1.0/conductor/archive/dependency_errors_20260707/metadata.json +8 -0
  57. chutils-3.1.0/conductor/archive/dependency_errors_20260707/plan.md +27 -0
  58. chutils-3.1.0/conductor/archive/dependency_errors_20260707/spec.md +37 -0
  59. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/index.md +5 -0
  60. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/metadata.json +8 -0
  61. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/plan.md +23 -0
  62. chutils-3.1.0/conductor/archive/dev_install_hooks_20260707/spec.md +50 -0
  63. chutils-3.1.0/conductor/archive/diagnostics_20260610/index.md +5 -0
  64. chutils-3.1.0/conductor/archive/diagnostics_20260610/metadata.json +8 -0
  65. chutils-3.1.0/conductor/archive/diagnostics_20260610/plan.md +42 -0
  66. chutils-3.1.0/conductor/archive/diagnostics_20260610/spec.md +40 -0
  67. chutils-3.1.0/conductor/archive/drop_python39_20260610/index.md +5 -0
  68. chutils-3.1.0/conductor/archive/drop_python39_20260610/metadata.json +8 -0
  69. chutils-3.1.0/conductor/archive/drop_python39_20260610/plan.md +43 -0
  70. chutils-3.1.0/conductor/archive/drop_python39_20260610/spec.md +44 -0
  71. chutils-3.1.0/conductor/archive/env_20260702/index.md +5 -0
  72. chutils-3.1.0/conductor/archive/env_20260702/metadata.json +8 -0
  73. chutils-3.1.0/conductor/archive/env_20260702/plan.md +33 -0
  74. chutils-3.1.0/conductor/archive/env_20260702/spec.md +53 -0
  75. chutils-3.1.0/conductor/archive/exception_groups_20260708/index.md +5 -0
  76. chutils-3.1.0/conductor/archive/exception_groups_20260708/metadata.json +8 -0
  77. chutils-3.1.0/conductor/archive/exception_groups_20260708/plan.md +22 -0
  78. chutils-3.1.0/conductor/archive/exception_groups_20260708/spec.md +71 -0
  79. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/index.md +5 -0
  80. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/metadata.json +8 -0
  81. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/plan.md +42 -0
  82. chutils-3.1.0/conductor/archive/generate_few_shot_20260610/spec.md +44 -0
  83. chutils-3.1.0/conductor/archive/mock_server_20260610/index.md +5 -0
  84. chutils-3.1.0/conductor/archive/mock_server_20260610/metadata.json +8 -0
  85. chutils-3.1.0/conductor/archive/mock_server_20260610/plan.md +43 -0
  86. chutils-3.1.0/conductor/archive/mock_server_20260610/spec.md +40 -0
  87. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/index.md +5 -0
  88. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/metadata.json +8 -0
  89. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/plan.md +38 -0
  90. chutils-3.1.0/conductor/archive/optional_dependencies_20260515/spec.md +25 -0
  91. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/index.md +5 -0
  92. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/metadata.json +8 -0
  93. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/plan.md +33 -0
  94. chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/spec.md +35 -0
  95. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/index.md +5 -0
  96. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/metadata.json +8 -0
  97. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/plan.md +38 -0
  98. chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/spec.md +44 -0
  99. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/index.md +5 -0
  100. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/metadata.json +8 -0
  101. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/plan.md +50 -0
  102. chutils-3.1.0/conductor/archive/scraping_humanize_20260707/spec.md +51 -0
  103. chutils-3.1.0/conductor/archive/secrets_unification_20260708/index.md +5 -0
  104. chutils-3.1.0/conductor/archive/secrets_unification_20260708/metadata.json +8 -0
  105. chutils-3.1.0/conductor/archive/secrets_unification_20260708/plan.md +31 -0
  106. chutils-3.1.0/conductor/archive/secrets_unification_20260708/spec.md +47 -0
  107. chutils-3.1.0/conductor/archive/sync_env_20260707/index.md +5 -0
  108. chutils-3.1.0/conductor/archive/sync_env_20260707/metadata.json +8 -0
  109. chutils-3.1.0/conductor/archive/sync_env_20260707/plan.md +37 -0
  110. chutils-3.1.0/conductor/archive/sync_env_20260707/spec.md +45 -0
  111. chutils-3.1.0/conductor/archive/validation_20260702/index.md +5 -0
  112. chutils-3.1.0/conductor/archive/validation_20260702/metadata.json +8 -0
  113. chutils-3.1.0/conductor/archive/validation_20260702/plan.md +29 -0
  114. chutils-3.1.0/conductor/archive/validation_20260702/spec.md +42 -0
  115. chutils-3.1.0/conductor/archive/web_20260707/index.md +5 -0
  116. chutils-3.1.0/conductor/archive/web_20260707/metadata.json +8 -0
  117. chutils-3.1.0/conductor/archive/web_20260707/plan.md +45 -0
  118. chutils-3.1.0/conductor/archive/web_20260707/spec.md +49 -0
  119. chutils-3.1.0/conductor/code_styleguides/python.md +72 -0
  120. chutils-3.1.0/conductor/index.md +14 -0
  121. chutils-3.1.0/conductor/product-guidelines.md +37 -0
  122. chutils-3.1.0/conductor/product.md +206 -0
  123. chutils-3.1.0/conductor/setup_state.json +1 -0
  124. chutils-3.1.0/conductor/tech-stack.md +145 -0
  125. chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/index.md +5 -0
  126. chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/metadata.json +8 -0
  127. chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/plan.md +47 -0
  128. chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/spec.md +111 -0
  129. chutils-3.1.0/conductor/tracks/audit_20260702/index.md +5 -0
  130. chutils-3.1.0/conductor/tracks/audit_20260702/metadata.json +8 -0
  131. chutils-3.1.0/conductor/tracks/audit_20260702/plan.md +31 -0
  132. chutils-3.1.0/conductor/tracks/audit_20260702/spec.md +53 -0
  133. chutils-3.1.0/conductor/tracks/bulkhead_20260702/index.md +5 -0
  134. chutils-3.1.0/conductor/tracks/bulkhead_20260702/metadata.json +8 -0
  135. chutils-3.1.0/conductor/tracks/bulkhead_20260702/plan.md +25 -0
  136. chutils-3.1.0/conductor/tracks/bulkhead_20260702/spec.md +46 -0
  137. chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/index.md +5 -0
  138. chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/metadata.json +8 -0
  139. chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/plan.md +17 -0
  140. chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/spec.md +28 -0
  141. chutils-3.1.0/conductor/tracks/cloud_secret_managers_20260511/index.md +5 -0
  142. chutils-3.1.0/conductor/tracks/cloud_secret_managers_20260511/metadata.json +8 -0
  143. chutils-3.1.0/conductor/tracks/cloud_secret_managers_20260511/plan.md +36 -0
  144. chutils-3.1.0/conductor/tracks/cloud_secret_managers_20260511/spec.md +42 -0
  145. chutils-3.1.0/conductor/tracks/config_remote_push_20260702/index.md +5 -0
  146. chutils-3.1.0/conductor/tracks/config_remote_push_20260702/metadata.json +8 -0
  147. chutils-3.1.0/conductor/tracks/config_remote_push_20260702/plan.md +29 -0
  148. chutils-3.1.0/conductor/tracks/config_remote_push_20260702/spec.md +47 -0
  149. chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/index.md +5 -0
  150. chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/metadata.json +8 -0
  151. chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/plan.md +18 -0
  152. chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/spec.md +24 -0
  153. chutils-3.1.0/conductor/tracks/db_manager_20260707/index.md +5 -0
  154. chutils-3.1.0/conductor/tracks/db_manager_20260707/metadata.json +8 -0
  155. chutils-3.1.0/conductor/tracks/db_manager_20260707/plan.md +29 -0
  156. chutils-3.1.0/conductor/tracks/db_manager_20260707/spec.md +41 -0
  157. chutils-3.1.0/conductor/tracks/db_migrations_cli_20260707/index.md +5 -0
  158. chutils-3.1.0/conductor/tracks/db_migrations_cli_20260707/metadata.json +8 -0
  159. chutils-3.1.0/conductor/tracks/db_migrations_cli_20260707/plan.md +27 -0
  160. chutils-3.1.0/conductor/tracks/db_migrations_cli_20260707/spec.md +40 -0
  161. chutils-3.1.0/conductor/tracks/dev_clean_20260707/index.md +5 -0
  162. chutils-3.1.0/conductor/tracks/dev_clean_20260707/metadata.json +8 -0
  163. chutils-3.1.0/conductor/tracks/dev_clean_20260707/plan.md +44 -0
  164. chutils-3.1.0/conductor/tracks/dev_clean_20260707/spec.md +55 -0
  165. chutils-3.1.0/conductor/tracks/dev_dashboard_20260610/index.md +5 -0
  166. chutils-3.1.0/conductor/tracks/dev_dashboard_20260610/metadata.json +8 -0
  167. chutils-3.1.0/conductor/tracks/dev_dashboard_20260610/plan.md +39 -0
  168. chutils-3.1.0/conductor/tracks/dev_dashboard_20260610/spec.md +43 -0
  169. chutils-3.1.0/conductor/tracks/dev_watch_20260702/index.md +5 -0
  170. chutils-3.1.0/conductor/tracks/dev_watch_20260702/metadata.json +8 -0
  171. chutils-3.1.0/conductor/tracks/dev_watch_20260702/plan.md +29 -0
  172. chutils-3.1.0/conductor/tracks/dev_watch_20260702/spec.md +52 -0
  173. chutils-3.1.0/conductor/tracks/docstring_audit_20260521/index.md +5 -0
  174. chutils-3.1.0/conductor/tracks/docstring_audit_20260521/metadata.json +8 -0
  175. chutils-3.1.0/conductor/tracks/docstring_audit_20260521/plan.md +38 -0
  176. chutils-3.1.0/conductor/tracks/docstring_audit_20260521/spec.md +34 -0
  177. chutils-3.1.0/conductor/tracks/fallback_alias_20260707/index.md +5 -0
  178. chutils-3.1.0/conductor/tracks/fallback_alias_20260707/metadata.json +8 -0
  179. chutils-3.1.0/conductor/tracks/fallback_alias_20260707/plan.md +27 -0
  180. chutils-3.1.0/conductor/tracks/fallback_alias_20260707/spec.md +37 -0
  181. chutils-3.1.0/conductor/tracks/http_20260702/index.md +5 -0
  182. chutils-3.1.0/conductor/tracks/http_20260702/metadata.json +8 -0
  183. chutils-3.1.0/conductor/tracks/http_20260702/plan.md +28 -0
  184. chutils-3.1.0/conductor/tracks/http_20260702/spec.md +51 -0
  185. chutils-3.1.0/conductor/tracks/profile_imports_20260610/index.md +5 -0
  186. chutils-3.1.0/conductor/tracks/profile_imports_20260610/metadata.json +8 -0
  187. chutils-3.1.0/conductor/tracks/profile_imports_20260610/plan.md +42 -0
  188. chutils-3.1.0/conductor/tracks/profile_imports_20260610/spec.md +40 -0
  189. chutils-3.1.0/conductor/tracks/qt_integration_20260521/index.md +5 -0
  190. chutils-3.1.0/conductor/tracks/qt_integration_20260521/metadata.json +8 -0
  191. chutils-3.1.0/conductor/tracks/qt_integration_20260521/plan.md +30 -0
  192. chutils-3.1.0/conductor/tracks/qt_integration_20260521/spec.md +31 -0
  193. chutils-3.1.0/conductor/tracks/qt_typed_signals_20260521/index.md +5 -0
  194. chutils-3.1.0/conductor/tracks/qt_typed_signals_20260521/metadata.json +8 -0
  195. chutils-3.1.0/conductor/tracks/qt_typed_signals_20260521/plan.md +27 -0
  196. chutils-3.1.0/conductor/tracks/qt_typed_signals_20260521/spec.md +22 -0
  197. chutils-3.1.0/conductor/tracks/scraping_concurrency_20260707/index.md +5 -0
  198. chutils-3.1.0/conductor/tracks/scraping_concurrency_20260707/metadata.json +8 -0
  199. chutils-3.1.0/conductor/tracks/scraping_concurrency_20260707/plan.md +45 -0
  200. chutils-3.1.0/conductor/tracks/scraping_concurrency_20260707/spec.md +46 -0
  201. chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/index.md +5 -0
  202. chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/metadata.json +8 -0
  203. chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/plan.md +28 -0
  204. chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/spec.md +27 -0
  205. chutils-3.1.0/conductor/tracks/store_20260702/index.md +5 -0
  206. chutils-3.1.0/conductor/tracks/store_20260702/metadata.json +8 -0
  207. chutils-3.1.0/conductor/tracks/store_20260702/plan.md +32 -0
  208. chutils-3.1.0/conductor/tracks/store_20260702/spec.md +42 -0
  209. chutils-3.1.0/conductor/tracks.md +99 -0
  210. chutils-3.1.0/conductor/workflow.md +33 -0
  211. chutils-3.1.0/docs/CODE_OF_CONDUCT_RU.md +62 -0
  212. chutils-3.1.0/docs/CONTRIBUTING_RU.md +73 -0
  213. chutils-3.1.0/docs/INTEGRATION_AI.md +100 -0
  214. chutils-3.1.0/docs/README_RU.md +428 -0
  215. chutils-3.1.0/docs/ai_examples/README.md +78 -0
  216. chutils-3.1.0/docs/ai_examples/configuration/README.md +65 -0
  217. chutils-3.1.0/docs/ai_examples/configuration/bad_pattern.py +20 -0
  218. chutils-3.1.0/docs/ai_examples/configuration/good_pattern.py +83 -0
  219. chutils-3.1.0/docs/ai_examples/error_handling/README.md +71 -0
  220. chutils-3.1.0/docs/ai_examples/error_handling/bad_pattern.py +26 -0
  221. chutils-3.1.0/docs/ai_examples/error_handling/good_pattern.py +91 -0
  222. chutils-3.1.0/docs/ai_examples/logging/README.md +74 -0
  223. chutils-3.1.0/docs/ai_examples/logging/bad_pattern.py +25 -0
  224. chutils-3.1.0/docs/ai_examples/logging/good_pattern.py +38 -0
  225. chutils-3.1.0/docs/ai_examples/optional_deps/README.md +93 -0
  226. chutils-3.1.0/docs/ai_examples/optional_deps/bad_pattern.py +46 -0
  227. chutils-3.1.0/docs/ai_examples/optional_deps/good_pattern.py +65 -0
  228. chutils-3.1.0/docs/ai_examples/secrets/README.md +66 -0
  229. chutils-3.1.0/docs/ai_examples/secrets/bad_pattern.py +34 -0
  230. chutils-3.1.0/docs/ai_examples/secrets/good_pattern.py +55 -0
  231. chutils-3.1.0/docs/ai_hints.md +49 -0
  232. chutils-3.1.0/docs/ai_lint.md +388 -0
  233. chutils-3.1.0/docs/api.md +318 -0
  234. chutils-3.1.0/docs/captcha.md +112 -0
  235. chutils-3.1.0/docs/cli/config.md +97 -0
  236. chutils-3.1.0/docs/cli/dev.md +457 -0
  237. chutils-3.1.0/docs/cli/env.md +62 -0
  238. chutils-3.1.0/docs/cli/index.md +61 -0
  239. chutils-3.1.0/docs/cli/init.md +89 -0
  240. chutils-3.1.0/docs/cli/pypi.md +121 -0
  241. chutils-3.1.0/docs/cli/secrets.md +193 -0
  242. chutils-3.1.0/docs/cli/show_paths.md +90 -0
  243. chutils-3.1.0/docs/cli/template.md +87 -0
  244. chutils-3.1.0/docs/cli/validate.md +78 -0
  245. chutils-3.1.0/docs/dependencies.md +108 -0
  246. chutils-3.1.0/docs/index.md +33 -0
  247. chutils-3.1.0/docs/migration.md +237 -0
  248. chutils-3.1.0/docs/plugins.md +189 -0
  249. chutils-3.1.0/docs/recipes.md +1530 -0
  250. chutils-3.1.0/docs/scraping.md +162 -0
  251. chutils-3.1.0/docs/testing.md +102 -0
  252. chutils-3.1.0/docs/web.md +126 -0
  253. chutils-3.1.0/examples/.env +13 -0
  254. chutils-3.1.0/examples/01_configuration.py +50 -0
  255. chutils-3.1.0/examples/02_logging.py +46 -0
  256. chutils-3.1.0/examples/03_secrets.py +74 -0
  257. chutils-3.1.0/examples/04_full_example.py +66 -0
  258. chutils-3.1.0/examples/05_different_log_levels.py +50 -0
  259. chutils-3.1.0/examples/06_local_config_override.py +75 -0
  260. chutils-3.1.0/examples/07_decorators_example.py +41 -0
  261. chutils-3.1.0/examples/08_multiple_loggers_example.py +34 -0
  262. chutils-3.1.0/examples/09_disable_keyring.py +42 -0
  263. chutils-3.1.0/examples/10_universal_env_override.py +43 -0
  264. chutils-3.1.0/examples/11_retry_decorator.py +57 -0
  265. chutils-3.1.0/examples/12_secret_masking.py +51 -0
  266. chutils-3.1.0/examples/13_pydantic_validation.py +85 -0
  267. chutils-3.1.0/examples/15_context_logging.py +90 -0
  268. chutils-3.1.0/examples/17_timeout_decorator.py +62 -0
  269. chutils-3.1.0/examples/18_config_hot_reload.py +97 -0
  270. chutils-3.1.0/examples/19_remote_config.py +95 -0
  271. chutils-3.1.0/examples/20_opentelemetry_tracing.py +49 -0
  272. chutils-3.1.0/examples/21_config_diagnostics.py +45 -0
  273. chutils-3.1.0/examples/22_circuit_breaker_decorator.py +83 -0
  274. chutils-3.1.0/examples/22_safe_path_resolution.py +88 -0
  275. chutils-3.1.0/examples/23_event_bus.py +121 -0
  276. chutils-3.1.0/examples/24_task_scheduler.py +61 -0
  277. chutils-3.1.0/examples/25_testing_fixtures_example.py +85 -0
  278. chutils-3.1.0/examples/26_metrics_prometheus.py +69 -0
  279. chutils-3.1.0/examples/27_rate_limiting.py +77 -0
  280. chutils-3.1.0/examples/28_dependency_injection.py +78 -0
  281. chutils-3.1.0/examples/captcha_solvers_usage.py +67 -0
  282. chutils-3.1.0/examples/config.yml +63 -0
  283. chutils-3.1.0/examples/scraping_humanize_usage.py +67 -0
  284. chutils-3.1.0/examples/web_client_usage.py +86 -0
  285. chutils-3.1.0/mkdocs.yml +58 -0
  286. chutils-3.1.0/project_index.json +21550 -0
  287. {chutils-2.9.0 → chutils-3.1.0}/pyproject.toml +57 -52
  288. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/__init__.py +56 -2
  289. chutils-3.1.0/src/chutils/__init__.pyi +778 -0
  290. chutils-3.1.0/src/chutils/antigravity.md +6 -0
  291. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cache/base.py +33 -9
  292. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cache/decorator.py +3 -2
  293. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cache/in_memory.py +65 -16
  294. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cache/utils.py +32 -8
  295. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cli.py +11 -5
  296. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cli_booster.py +13 -6
  297. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cli_utils.py +44 -14
  298. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/__init__.py +10 -6
  299. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/base.py +1 -0
  300. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/config.py +20 -3
  301. chutils-3.1.0/src/chutils/commands/dev/__init__.py +437 -0
  302. chutils-3.1.0/src/chutils/commands/dev/ai_lint.py +101 -0
  303. chutils-3.1.0/src/chutils/commands/dev/base.py +40 -0
  304. chutils-3.1.0/src/chutils/commands/dev/chat_context.py +100 -0
  305. chutils-3.1.0/src/chutils/commands/dev/diagnostics.py +109 -0
  306. chutils-3.1.0/src/chutils/commands/dev/few_shot.py +55 -0
  307. chutils-2.9.0/src/chutils/commands/dev.py → chutils-3.1.0/src/chutils/commands/dev/generate_context.py +355 -352
  308. chutils-3.1.0/src/chutils/commands/dev/hooks.py +185 -0
  309. chutils-3.1.0/src/chutils/commands/dev/mock.py +87 -0
  310. chutils-3.1.0/src/chutils/commands/dev/scaffold.py +72 -0
  311. chutils-3.1.0/src/chutils/commands/dev/sync_env.py +157 -0
  312. chutils-3.1.0/src/chutils/commands/env.py +191 -0
  313. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/init.py +12 -3
  314. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/paths.py +10 -1
  315. chutils-3.1.0/src/chutils/commands/pypi.py +426 -0
  316. chutils-3.1.0/src/chutils/commands/secrets.py +219 -0
  317. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/template.py +10 -1
  318. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/validate.py +10 -1
  319. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/__init__.py +12 -68
  320. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/ast_fallback_parser.py +15 -5
  321. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/core.py +15 -15
  322. chutils-3.1.0/src/chutils/config/dev.py +296 -0
  323. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/diagnostics.py +24 -10
  324. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/generator.py +27 -11
  325. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/getters.py +174 -40
  326. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/manager.py +42 -41
  327. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/providers.py +103 -23
  328. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/schema.py +6 -6
  329. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/utils.py +44 -19
  330. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/watcher.py +14 -4
  331. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/context.py +26 -6
  332. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/crypto.py +17 -16
  333. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/decorators.py +277 -29
  334. chutils-3.1.0/src/chutils/dev/__init__.py +23 -0
  335. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/dev/ai_lint.py +136 -14
  336. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/dev/ast_indexer.py +61 -18
  337. chutils-3.1.0/src/chutils/dev/chat_context.py +441 -0
  338. chutils-3.1.0/src/chutils/dev/constants.py +13 -0
  339. chutils-3.1.0/src/chutils/dev/env_parser.py +227 -0
  340. chutils-3.1.0/src/chutils/dev/env_sync.py +113 -0
  341. chutils-3.1.0/src/chutils/dev/few_shot/__init__.py +113 -0
  342. chutils-3.1.0/src/chutils/dev/few_shot/detector.py +225 -0
  343. chutils-3.1.0/src/chutils/dev/few_shot/models.py +61 -0
  344. chutils-3.1.0/src/chutils/dev/few_shot/renderer.py +455 -0
  345. chutils-3.1.0/src/chutils/dev/few_shot/writer.py +302 -0
  346. chutils-3.1.0/src/chutils/dev/mock_server.py +506 -0
  347. chutils-3.1.0/src/chutils/dev/models/__init__.py +17 -0
  348. chutils-3.1.0/src/chutils/dev/models/base.py +35 -0
  349. chutils-3.1.0/src/chutils/dev/models/index.py +34 -0
  350. chutils-3.1.0/src/chutils/dev/models/node.py +19 -0
  351. chutils-3.1.0/src/chutils/dev/models/symbol.py +21 -0
  352. chutils-3.1.0/src/chutils/dev/project_metadata.py +195 -0
  353. chutils-3.1.0/src/chutils/dev/rules/__init__.py +20 -0
  354. chutils-3.1.0/src/chutils/dev/rules/api_map.py +439 -0
  355. chutils-3.1.0/src/chutils/dev/rules/decomposition.py +96 -0
  356. chutils-3.1.0/src/chutils/dev/rules/dependency_sync.py +256 -0
  357. chutils-3.1.0/src/chutils/dev/rules/docstring.py +210 -0
  358. chutils-3.1.0/src/chutils/dev/rules/env.py +111 -0
  359. chutils-3.1.0/src/chutils/dev/rules/integration.py +263 -0
  360. chutils-3.1.0/src/chutils/dev/rules/manifest.py +74 -0
  361. chutils-3.1.0/src/chutils/dev/rules/security.py +99 -0
  362. chutils-3.1.0/src/chutils/dev/scaffold.py +425 -0
  363. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/di/container.py +48 -21
  364. chutils-3.1.0/src/chutils/diagnostics/__init__.py +24 -0
  365. chutils-3.1.0/src/chutils/diagnostics/manager.py +254 -0
  366. chutils-3.1.0/src/chutils/diagnostics/models.py +98 -0
  367. chutils-3.1.0/src/chutils/diagnostics/web.py +79 -0
  368. chutils-3.1.0/src/chutils/env.py +194 -0
  369. chutils-3.1.0/src/chutils/env.pyi +34 -0
  370. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/events/__init__.py +0 -1
  371. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/events/core.py +16 -11
  372. chutils-3.1.0/src/chutils/exceptions/__init__.py +73 -0
  373. chutils-3.1.0/src/chutils/exceptions/base.py +66 -0
  374. chutils-3.1.0/src/chutils/exceptions/cache.py +7 -0
  375. chutils-3.1.0/src/chutils/exceptions/config.py +52 -0
  376. chutils-3.1.0/src/chutils/exceptions/di.py +19 -0
  377. chutils-3.1.0/src/chutils/exceptions/events.py +34 -0
  378. chutils-3.1.0/src/chutils/exceptions/logger.py +7 -0
  379. chutils-3.1.0/src/chutils/exceptions/resilience.py +13 -0
  380. chutils-3.1.0/src/chutils/exceptions/secrets.py +19 -0
  381. chutils-3.1.0/src/chutils/exceptions/system.py +44 -0
  382. chutils-3.1.0/src/chutils/exceptions/validation.py +148 -0
  383. chutils-3.1.0/src/chutils/exceptions/watcher.py +7 -0
  384. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/features.py +13 -12
  385. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/fs.py +15 -14
  386. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/lifecycle.py +18 -12
  387. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/core.py +18 -18
  388. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/formatters.py +8 -1
  389. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/internal/builder.py +28 -28
  390. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/internal/levels.py +13 -5
  391. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/internal/utils.py +14 -10
  392. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/masking.py +6 -6
  393. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/metrics/__init__.py +35 -18
  394. chutils-3.1.0/src/chutils/metrics/base.py +56 -0
  395. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/metrics/in_memory.py +44 -14
  396. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/metrics/prometheus.py +33 -6
  397. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/metrics/timer.py +28 -7
  398. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/plugins/core.py +42 -24
  399. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/plugins/interfaces.py +20 -6
  400. chutils-3.1.0/src/chutils/scraping/__init__.py +4 -0
  401. chutils-3.1.0/src/chutils/scraping/captcha/__init__.py +59 -0
  402. chutils-3.1.0/src/chutils/scraping/captcha/anticaptcha.py +281 -0
  403. chutils-3.1.0/src/chutils/scraping/captcha/base.py +71 -0
  404. chutils-3.1.0/src/chutils/scraping/captcha/capmonster.py +281 -0
  405. chutils-3.1.0/src/chutils/scraping/captcha/exceptions.py +21 -0
  406. chutils-3.1.0/src/chutils/scraping/captcha/rucaptcha.py +299 -0
  407. chutils-3.1.0/src/chutils/scraping/humanize/__init__.py +33 -0
  408. chutils-3.1.0/src/chutils/scraping/humanize/actions.py +268 -0
  409. chutils-3.1.0/src/chutils/scraping/humanize/antidetect.py +123 -0
  410. chutils-3.1.0/src/chutils/scraping/humanize/math_utils.py +223 -0
  411. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/secret_manager/core.py +132 -52
  412. chutils-3.1.0/src/chutils/secret_manager/providers/__init__.py +34 -0
  413. chutils-3.1.0/src/chutils/secret_manager/providers/base.py +51 -0
  414. chutils-3.1.0/src/chutils/secret_manager/providers/dotenv.py +91 -0
  415. chutils-3.1.0/src/chutils/secret_manager/providers/env.py +54 -0
  416. chutils-3.1.0/src/chutils/secret_manager/providers/keyring_provider.py +124 -0
  417. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/tasks/core.py +74 -16
  418. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/testing/fixtures.py +12 -10
  419. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/text.py +5 -4
  420. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/time.py +5 -5
  421. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/tracing.py +9 -6
  422. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/typing.py +5 -16
  423. chutils-3.1.0/src/chutils/validation.py +138 -0
  424. chutils-3.1.0/src/chutils/validation.pyi +13 -0
  425. chutils-3.1.0/src/chutils/web/__init__.py +17 -0
  426. chutils-3.1.0/src/chutils/web/client.py +416 -0
  427. chutils-3.1.0/src/chutils/web/proxy_pool.py +174 -0
  428. chutils-3.1.0/src/chutils/web/user_agent.py +61 -0
  429. chutils-3.1.0/tests/conftest.py +54 -0
  430. chutils-3.1.0/tests/integration/test_ai_lint_integration.py +58 -0
  431. chutils-3.1.0/tests/integration/test_cli_e2e.py +35 -0
  432. chutils-3.1.0/tests/integration/test_event_loops.py +110 -0
  433. chutils-3.1.0/tests/integration/test_examples.py +159 -0
  434. chutils-3.1.0/tests/integration/test_hooks_integration.py +41 -0
  435. chutils-3.1.0/tests/integration/test_masking_integration.py +61 -0
  436. chutils-3.1.0/tests/integration/test_otel_tracing.py +159 -0
  437. chutils-3.1.0/tests/integration/test_remote_config_integration.py +49 -0
  438. chutils-3.1.0/tests/manual/manual_test_cli_booster.py +23 -0
  439. chutils-3.1.0/tests/unit/cli/conftest.py +69 -0
  440. chutils-3.1.0/tests/unit/cli/test_cli.py +229 -0
  441. chutils-3.1.0/tests/unit/cli/test_cli_booster.py +105 -0
  442. chutils-3.1.0/tests/unit/cli/test_cli_config.py +81 -0
  443. chutils-3.1.0/tests/unit/cli/test_cli_config_cmd.py +91 -0
  444. chutils-3.1.0/tests/unit/cli/test_cli_config_schema.py +77 -0
  445. chutils-3.1.0/tests/unit/cli/test_cli_dev.py +84 -0
  446. chutils-3.1.0/tests/unit/cli/test_cli_dev_cmd.py +438 -0
  447. chutils-3.1.0/tests/unit/cli/test_cli_dev_tree.py +41 -0
  448. chutils-3.1.0/tests/unit/cli/test_cli_diagnostics.py +139 -0
  449. chutils-3.1.0/tests/unit/cli/test_cli_extras_suggestion.py +31 -0
  450. chutils-3.1.0/tests/unit/cli/test_cli_init.py +99 -0
  451. chutils-3.1.0/tests/unit/cli/test_cli_paths.py +46 -0
  452. chutils-3.1.0/tests/unit/cli/test_cli_pypi.py +426 -0
  453. chutils-3.1.0/tests/unit/cli/test_cli_rich.py +54 -0
  454. chutils-3.1.0/tests/unit/cli/test_cli_rich_width.py +50 -0
  455. chutils-3.1.0/tests/unit/cli/test_cli_secrets.py +125 -0
  456. chutils-3.1.0/tests/unit/cli/test_cli_template.py +81 -0
  457. chutils-3.1.0/tests/unit/cli/test_cli_utils_internal.py +50 -0
  458. chutils-3.1.0/tests/unit/cli/test_cli_validate.py +99 -0
  459. chutils-3.1.0/tests/unit/config/test_config.py +502 -0
  460. chutils-3.1.0/tests/unit/config/test_config_ast_parser.py +106 -0
  461. chutils-3.1.0/tests/unit/config/test_config_dev.py +187 -0
  462. chutils-3.1.0/tests/unit/config/test_config_diagnostics.py +52 -0
  463. chutils-3.1.0/tests/unit/config/test_config_env.py +90 -0
  464. chutils-3.1.0/tests/unit/config/test_config_env_loading.py +80 -0
  465. chutils-3.1.0/tests/unit/config/test_config_generator.py +55 -0
  466. chutils-3.1.0/tests/unit/config/test_config_json.py +95 -0
  467. chutils-3.1.0/tests/unit/config/test_config_pydantic.py +155 -0
  468. chutils-3.1.0/tests/unit/config/test_config_required.py +145 -0
  469. chutils-3.1.0/tests/unit/config/test_config_schema.py +101 -0
  470. chutils-3.1.0/tests/unit/config/test_config_tracing.py +80 -0
  471. chutils-3.1.0/tests/unit/config/test_config_universal_env.py +53 -0
  472. chutils-3.1.0/tests/unit/config/test_config_utils.py +40 -0
  473. chutils-3.1.0/tests/unit/config/test_config_validation_group.py +42 -0
  474. chutils-3.1.0/tests/unit/config/test_config_watcher.py +157 -0
  475. chutils-3.1.0/tests/unit/config/test_priority_unification.py +72 -0
  476. chutils-3.1.0/tests/unit/config/test_remote_config.py +130 -0
  477. chutils-3.1.0/tests/unit/core/test_ast_indexer.py +190 -0
  478. chutils-3.1.0/tests/unit/core/test_ast_indexer_abstract.py +58 -0
  479. chutils-3.1.0/tests/unit/core/test_ast_indexer_graph.py +54 -0
  480. chutils-3.1.0/tests/unit/core/test_ast_indexer_layers.py +79 -0
  481. chutils-3.1.0/tests/unit/core/test_ast_indexer_metadata.py +58 -0
  482. chutils-3.1.0/tests/unit/core/test_cache.py +155 -0
  483. chutils-3.1.0/tests/unit/core/test_dev_models.py +62 -0
  484. chutils-3.1.0/tests/unit/core/test_exceptions.py +74 -0
  485. chutils-3.1.0/tests/unit/core/test_features.py +150 -0
  486. chutils-3.1.0/tests/unit/core/test_fs.py +584 -0
  487. chutils-3.1.0/tests/unit/core/test_lifecycle.py +127 -0
  488. chutils-3.1.0/tests/unit/core/test_thread_safety.py +217 -0
  489. chutils-3.1.0/tests/unit/core/test_time.py +103 -0
  490. chutils-3.1.0/tests/unit/decorators/test_decorator_circuit_breaker.py +238 -0
  491. chutils-3.1.0/tests/unit/decorators/test_decorator_retry.py +129 -0
  492. chutils-3.1.0/tests/unit/decorators/test_decorator_timeout.py +146 -0
  493. chutils-3.1.0/tests/unit/decorators/test_decorators.py +48 -0
  494. chutils-3.1.0/tests/unit/decorators/test_rate_limit.py +148 -0
  495. chutils-3.1.0/tests/unit/dev/test_ai_lint.py +734 -0
  496. chutils-3.1.0/tests/unit/dev/test_ai_lint_staged.py +129 -0
  497. chutils-3.1.0/tests/unit/dev/test_chat_context.py +252 -0
  498. chutils-3.1.0/tests/unit/dev/test_env_parser.py +152 -0
  499. chutils-3.1.0/tests/unit/dev/test_env_sync.py +49 -0
  500. chutils-3.1.0/tests/unit/dev/test_generate_few_shot.py +511 -0
  501. chutils-3.1.0/tests/unit/dev/test_mock_server.py +298 -0
  502. chutils-3.1.0/tests/unit/dev/test_scaffold.py +139 -0
  503. chutils-3.1.0/tests/unit/di/test_di.py +251 -0
  504. chutils-3.1.0/tests/unit/events/test_event_bus.py +315 -0
  505. chutils-3.1.0/tests/unit/logger/conftest.py +129 -0
  506. chutils-3.1.0/tests/unit/logger/test_basics.py +84 -0
  507. chutils-3.1.0/tests/unit/logger/test_compression.py +39 -0
  508. chutils-3.1.0/tests/unit/logger/test_config_sections.py +115 -0
  509. chutils-3.1.0/tests/unit/logger/test_configuration.py +120 -0
  510. chutils-3.1.0/tests/unit/logger/test_context.py +90 -0
  511. chutils-3.1.0/tests/unit/logger/test_env_control.py +75 -0
  512. chutils-3.1.0/tests/unit/logger/test_files.py +101 -0
  513. chutils-3.1.0/tests/unit/logger/test_json_format.py +122 -0
  514. chutils-3.1.0/tests/unit/logger/test_logger_rich_width.py +30 -0
  515. chutils-3.1.0/tests/unit/logger/test_masking.py +54 -0
  516. chutils-3.1.0/tests/unit/logger/test_performance_security.py +86 -0
  517. chutils-3.1.0/tests/unit/logger/test_rich.py +99 -0
  518. chutils-3.1.0/tests/unit/logger/test_rotation.py +169 -0
  519. chutils-3.1.0/tests/unit/metrics/test_metrics.py +185 -0
  520. chutils-3.1.0/tests/unit/plugins/test_integration.py +198 -0
  521. chutils-3.1.0/tests/unit/plugins/test_interfaces.py +109 -0
  522. chutils-3.1.0/tests/unit/plugins/test_plugins.py +120 -0
  523. chutils-3.1.0/tests/unit/secret_manager/test_secret_manager.py +225 -0
  524. chutils-3.1.0/tests/unit/secret_manager/test_secret_manager_env.py +117 -0
  525. chutils-3.1.0/tests/unit/secret_manager/test_secret_manager_providers.py +105 -0
  526. chutils-3.1.0/tests/unit/secret_manager/test_secrets_required.py +85 -0
  527. chutils-3.1.0/tests/unit/tasks/test_scheduler.py +263 -0
  528. chutils-3.1.0/tests/unit/test_ai_lint_ignore.py +77 -0
  529. chutils-3.1.0/tests/unit/test_anticaptcha.py +127 -0
  530. chutils-3.1.0/tests/unit/test_antidetect.py +41 -0
  531. chutils-3.1.0/tests/unit/test_async_web_client.py +86 -0
  532. chutils-3.1.0/tests/unit/test_capmonster.py +89 -0
  533. chutils-3.1.0/tests/unit/test_captcha_base.py +41 -0
  534. chutils-3.1.0/tests/unit/test_captcha_imports.py +22 -0
  535. chutils-3.1.0/tests/unit/test_crypto.py +131 -0
  536. chutils-3.1.0/tests/unit/test_crypto_dependencies.py +47 -0
  537. chutils-3.1.0/tests/unit/test_diagnostics.py +367 -0
  538. chutils-3.1.0/tests/unit/test_env.py +261 -0
  539. chutils-3.1.0/tests/unit/test_events_exception_group.py +42 -0
  540. chutils-3.1.0/tests/unit/test_humanize_math.py +78 -0
  541. chutils-3.1.0/tests/unit/test_install_hooks.py +120 -0
  542. chutils-3.1.0/tests/unit/test_minimal_imports.py +84 -0
  543. chutils-3.1.0/tests/unit/test_playwright_humanize.py +71 -0
  544. chutils-3.1.0/tests/unit/test_proxy_pool.py +85 -0
  545. chutils-3.1.0/tests/unit/test_rucaptcha.py +117 -0
  546. chutils-3.1.0/tests/unit/test_scraping_imports.py +39 -0
  547. chutils-3.1.0/tests/unit/test_selenium_humanize.py +102 -0
  548. chutils-3.1.0/tests/unit/test_text.py +74 -0
  549. chutils-3.1.0/tests/unit/test_text_dependencies.py +21 -0
  550. chutils-3.1.0/tests/unit/test_user_agent.py +38 -0
  551. chutils-3.1.0/tests/unit/test_validation.py +242 -0
  552. chutils-3.1.0/tests/unit/test_web_client.py +81 -0
  553. chutils-3.1.0/tests/unit/test_web_imports.py +38 -0
  554. chutils-3.1.0/tests/unit/testing/test_fixtures.py +88 -0
  555. chutils-3.1.0/uv.lock +2349 -0
  556. chutils-2.9.0/src/chutils/__init__.pyi +0 -485
  557. chutils-2.9.0/src/chutils/commands/secrets.py +0 -102
  558. chutils-2.9.0/src/chutils/config/dev.py +0 -142
  559. chutils-2.9.0/src/chutils/dev/__init__.py +0 -12
  560. chutils-2.9.0/src/chutils/dev/models.py +0 -88
  561. chutils-2.9.0/src/chutils/dev/rules.py +0 -524
  562. chutils-2.9.0/src/chutils/env.py +0 -66
  563. chutils-2.9.0/src/chutils/exceptions.py +0 -175
  564. chutils-2.9.0/src/chutils/metrics/base.py +0 -43
  565. chutils-2.9.0/src/chutils/secret_manager/providers.py +0 -250
  566. {chutils-2.9.0 → chutils-3.1.0}/LICENSE +0 -0
  567. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/__main__.py +0 -0
  568. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/cache/__init__.py +0 -0
  569. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/commands/utils.py +0 -0
  570. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/config/GEMINI.md +0 -0
  571. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/di/__init__.py +0 -0
  572. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/GEMINI.md +0 -0
  573. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/__init__.py +0 -0
  574. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/logger/handlers.py +0 -0
  575. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/plugins/__init__.py +0 -0
  576. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/secret_manager/GEMINI.md +0 -0
  577. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/secret_manager/__init__.py +0 -0
  578. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/tasks/__init__.py +0 -0
  579. {chutils-2.9.0 → chutils-3.1.0}/src/chutils/testing/__init__.py +0 -0
@@ -0,0 +1,2 @@
1
+ poetry.lock binary
2
+ uv.lock binary
@@ -0,0 +1,45 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master ]
6
+ pull_request:
7
+ branches: [ main, master ]
8
+
9
+ jobs:
10
+ test-and-lint:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v5
26
+ with:
27
+ enable-cache: true
28
+ version: "latest"
29
+
30
+ - name: Install dependencies
31
+ run: |
32
+ uv sync --all-extras
33
+
34
+ - name: Run Tests
35
+ run: |
36
+ uv run pytest
37
+
38
+ - name: Run Type Checking (Mypy)
39
+ run: |
40
+ uv run mypy src
41
+
42
+ - name: Run AI-Readiness Audit
43
+ run: |
44
+ uv run python -m chutils dev ai-lint --soft-mode
45
+
@@ -0,0 +1,34 @@
1
+ name: Publish Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ deploy:
13
+ name: Deploy Documentation
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout repository
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: '3.11'
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v5
26
+ with:
27
+ enable-cache: true
28
+ version: "latest"
29
+
30
+ - name: Install dependencies
31
+ run: uv sync --all-extras
32
+
33
+ - name: Deploy to GitHub Pages
34
+ run: uv run mkdocs gh-deploy --force --clean
@@ -0,0 +1,185 @@
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/
@@ -0,0 +1,125 @@
1
+ [Русская версия](docs/CODE_OF_CONDUCT_RU.md)
2
+
3
+ # Contributor Covenant Code of Conduct
4
+
5
+ ## Our Pledge
6
+
7
+ We as members, contributors, and leaders pledge to make participation in our
8
+ community a harassment-free experience for everyone, regardless of age, body
9
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
10
+ identity and expression, level of experience, education, socio-economic status,
11
+ nationality, personal appearance, race, caste, color, religion, or sexual
12
+ identity and orientation.
13
+
14
+ We pledge to act and interact in ways that contribute to an open, welcoming,
15
+ diverse, inclusive, and healthy community.
16
+
17
+ ## Our Standards
18
+
19
+ Examples of behavior that contributes to a positive environment for our
20
+ community include:
21
+
22
+ * Demonstrating empathy and kindness toward other people
23
+ * Being respectful of differing opinions, viewpoints, and experiences
24
+ * Giving and gracefully accepting constructive feedback
25
+ * Accepting responsibility and apologizing to those affected by our mistakes,
26
+ and learning from the experience
27
+ * Focusing on what is best not just for us as individuals, but for the
28
+ overall community
29
+
30
+ Examples of unacceptable behavior include:
31
+
32
+ * The use of sexualized language or imagery, and sexual attention or
33
+ advances of any kind
34
+ * Trolling, insulting or derogatory comments, and personal or political
35
+ attacks
36
+ * Public or private harassment
37
+ * Publishing others' private information, such as a physical or email
38
+ address, without their explicit permission
39
+ * Other conduct which could reasonably be considered inappropriate in a
40
+ professional setting
41
+
42
+ ## Enforcement Responsibilities
43
+
44
+ Community leaders are responsible for clarifying and enforcing our standards of
45
+ acceptable behavior and will take appropriate and fair corrective action in
46
+ response to any behavior that they deem inappropriate, threatening, offensive,
47
+ or harmful.
48
+
49
+ Community leaders have the right and responsibility to remove, edit, or reject
50
+ comments, commits, code, wiki edits, issues, and other contributions that are
51
+ not aligned to this Code of Conduct, and will communicate reasons for
52
+ moderation decisions when appropriate.
53
+
54
+ ## Scope
55
+
56
+ This Code of Conduct applies within all community spaces, and also applies when
57
+ an individual is officially representing the community in public spaces.
58
+ Examples of representing our community include using an official e-mail address,
59
+ posting via an official social media account, or acting as an appointed
60
+ representative at an online or offline event.
61
+
62
+ ## Enforcement
63
+
64
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
65
+ reported to the community leaders responsible for enforcement at
66
+ `sergeiivanov636@gmail.com`.
67
+ All complaints will be reviewed and investigated promptly and fairly.
68
+
69
+ All community leaders are obligated to respect the privacy and security of the
70
+ reporter of any incident.
71
+
72
+ ## Enforcement Guidelines
73
+
74
+ Community leaders will follow these Community Impact Guidelines in determining
75
+ the consequences for any action they deem in violation of this Code of Conduct:
76
+
77
+ ### 1. Correction
78
+
79
+ **Community Impact**: Use of inappropriate language or other behavior deemed
80
+ unprofessional or unwelcome in the community.
81
+
82
+ **Consequence**: A private, written warning from community leaders, providing
83
+ clarity around the nature of the violation and an explanation of why the
84
+ behavior was inappropriate. A public apology may be requested.
85
+
86
+ ### 2. Warning
87
+
88
+ **Community Impact**: A violation through a single incident or series of
89
+ actions.
90
+
91
+ **Consequence**: A warning with consequences for continued behavior. No
92
+ interaction with the people involved, including unsolicited interaction with
93
+ those enforcing the Code of Conduct, for a specified period of time. This
94
+ includes avoiding interactions in community spaces as well as external channels
95
+ like social media. Violating these terms may lead to a temporary or permanent
96
+ ban.
97
+
98
+ ### 3. Temporary Ban
99
+
100
+ **Community Impact**: A serious violation of community standards, including
101
+ sustained inappropriate behavior.
102
+
103
+ **Consequence**: A temporary ban from any sort of interaction or public
104
+ communication with the community for a specified period of time. No public or
105
+ private interaction with the people involved, including unsolicited interaction
106
+ with those enforcing the Code of Conduct, is allowed during this period.
107
+ Violating these terms may lead to a permanent ban.
108
+
109
+ ### 4. Permanent Ban
110
+
111
+ **Community Impact**: Demonstrating a pattern of violation of community
112
+ standards, including sustained inappropriate behavior, harassment of an
113
+ individual, or aggression toward or disparagement of classes of individuals.
114
+
115
+ **Consequence**: A permanent ban from any sort of public interaction within the
116
+ community.
117
+
118
+ ## Attribution
119
+
120
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
121
+ version 2.1, available at
122
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
123
+
124
+ [homepage]: https://www.contributor-covenant.org
125
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
@@ -0,0 +1,70 @@
1
+ [Русская версия](docs/CONTRIBUTING_RU.md)
2
+
3
+ # How to Contribute to chutils
4
+
5
+ We're excited that you want to help improve the project! Every contribution is highly valued.
6
+
7
+ This document provides a set of guidelines for contributing to `chutils`.
8
+
9
+ ## Code of Conduct
10
+
11
+ First and foremost, please review our [Code of Conduct](./CODE_OF_CONDUCT.md). We expect all participants to adhere to it.
12
+
13
+ ## How Can You Help?
14
+
15
+ ### Reporting Bugs
16
+
17
+ - Ensure the bug hasn't already been reported by checking the [Issues](https://github.com/Chu4hel/chutils/issues) section.
18
+ - If you don't find a similar issue, create a new one. Be sure to include a clear title, a detailed description, and, if possible, a small code sample to reproduce the error.
19
+
20
+ ### Suggesting Enhancements
21
+
22
+ - Create a new issue with your suggestion. Describe in detail the problem your enhancement solves and how it should work.
23
+
24
+ ### Pull Requests
25
+
26
+ We welcome your pull requests! Here’s how to do it right:
27
+
28
+ 1. Fork the repository.
29
+ 2. Create a new branch for your changes (`git checkout -b feature/amazing-feature`).
30
+ 3. Make your changes and write tests for them if necessary.
31
+ 4. Ensure all tests pass.
32
+ 5. Submit a pull request to the `main` branch of our repository.
33
+
34
+ ## Development Environment Setup
35
+
36
+ 1. Clone your forked repository:
37
+ ```bash
38
+ git clone https://github.com/YOUR_USERNAME/chutils.git
39
+ ```
40
+
41
+ 2. Navigate to the project directory:
42
+ ```bash
43
+ cd chutils
44
+ ```
45
+
46
+ 3. Install dependencies using Poetry:
47
+ ```bash
48
+ poetry install
49
+ ```
50
+
51
+ ## Testing and Documentation
52
+
53
+ - **Run tests**:
54
+ ```bash
55
+ poetry run pytest
56
+ ```
57
+
58
+ - **View documentation locally**:
59
+ ```bash
60
+ poetry run mkdocs serve
61
+ ```
62
+
63
+ ## Code and Commit Style
64
+
65
+ - **Code Style**: We adhere to the PEP 8 standard. Please ensure your code complies with it.
66
+ - **Docstrings**: All docstrings are written in **Google style**. Please follow this convention.
67
+ - **Commits**: We use [Conventional Commits](https://www.conventionalcommits.org/). This helps us maintain a clean and understandable change history.
68
+ *Example: `feat(config): add support for .toml format` or `fix(logger): correct log rotation error`*
69
+
70
+ Thank you for your contribution!
@@ -0,0 +1,50 @@
1
+ # chutils: Project Identity & Conventions
2
+
3
+ Этот файл содержит глобальные инструкции для AI-агентов (Gemini CLI и др.) по работе с кодовой базой проекта `chutils`.
4
+
5
+ ## 1. Архитектура и структура
6
+
7
+ Проект построен по модульному принципу с ленивой загрузкой в корневом `__init__.py`.
8
+
9
+ - **src/chutils/config/**: Ядро управления конфигурацией (Hot-Reload, многоуровневое слияние).
10
+ - **src/chutils/logger/**: Продвинутый логгер на базе `rich` с поддержкой маскировки секретов.
11
+ - **src/chutils/secret_manager/**: Абстракция над системными хранилищами (keyring) и облачными провайдерами.
12
+ - **src/chutils/commands/**: Реализации CLI команд (argparse).
13
+
14
+ ## 2. Кодирование и Conventions (Rules)
15
+
16
+ - **Публичное API**: Почти всё публичное API экспортируется через `src/chutils/__init__.py`. При использовании
17
+ библиотеки извне, импортируйте напрямую из `chutils`.
18
+ - **Lazy Loading**: Библиотека активно использует ленивую загрузку (PEP 562). Избегайте прямых импортов из глубоких
19
+ подмодулей, если это не обосновано внутренней реализацией.
20
+ - **Опциональные зависимости (Безопасный экспорт)**: При импорте сторонних библиотек (особенно опциональных),
21
+ экспортируемый символ ОБЯЗАТЕЛЬНО должен быть определен в модуле, даже если его функционал зависит от отсутствующей
22
+ библиотеки (например, `Feature = None`). Это предотвращает каскадные `ImportError`.
23
+ - **Rich Integration**: При выводе в консоль всегда используйте `chutils.cli_utils.get_console()`. Это гарантирует
24
+ корректный fallback, если `rich` не установлен.
25
+ - **Строгая типизация (Zero-Any Strategy)**:
26
+ - Запрещено использование `Any` в аннотациях типов бизнес-логики.
27
+ - Запрещено использование `# type: ignore` без крайне веского обоснования и комментария.
28
+ - **Исключение:** В инфраструктурных модулях и сложных декораторах (например, `chutils/decorators.py`,
29
+ `chutils/features.py`) **разрешается** использовать `Any` и `# type: ignore` вместо сложных конструкций
30
+ `ParamSpec`/`cast`, если строгая типизация приводит к нечитаемому коду. Читаемость важнее идеального отчета Mypy.
31
+ - **Типизация Python 3.10+**:
32
+ - Запрещено импортировать и использовать устаревшие типы из модуля `typing`, такие как `Optional`, `List`, `Dict`,
33
+ `Tuple` и др.
34
+ - Вместо `Optional[T]` обязательно используйте `T | None`.
35
+ - Вместо `List[T]`, `Dict[K, V]`, `Tuple[T, ...]` используйте встроенные типы `list[T]`, `dict[K, V]`,
36
+ `tuple[T, ...]` без импорта из `typing`.
37
+ - **Использование uv**: Проект использует менеджер пакетов `uv` (в корне присутствует `uv.lock`). Для запуска любых скриптов, команд CLI или тестов AI-агенты ОБЯЗАТЕЛЬНО должны использовать `uv run` (например, `uv run chutils ...`, `uv run pytest`). Прямой запуск через интерпретатор `.venv` или глобальный `python` не рекомендуется.
38
+ - **Документация**: Подробные советы для AI находятся в `docs/ai_hints.md` и `docs/INTEGRATION_AI.md`.
39
+
40
+ ## 3. Тестирование
41
+
42
+ - Используется `pytest` с `pytest-mock`.
43
+ - Новая функциональность всегда должна сопровождаться тестами в `tests/unit/`.
44
+ - Тесты CLI команд должны проверяться через `sys.argv` mocking и `capsys` для проверки вывода.
45
+
46
+ ## 4. Ссылки
47
+
48
+ - [AI Hints](./docs/ai_hints.md)
49
+ - [Integration Guide](./docs/INTEGRATION_AI.md)
50
+ - [Public API Map](./api_map.md) (генерируется через `chutils dev generate-context -o api_map.md`)