chutils 3.4.0__tar.gz → 3.4.1__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 (561) hide show
  1. {chutils-3.4.0 → chutils-3.4.1}/PKG-INFO +1 -1
  2. {chutils-3.4.0 → chutils-3.4.1}/api_map.md +6 -6
  3. {chutils-3.4.0/conductor/archive/fallback_alias_20260707 → chutils-3.4.1/conductor/tracks/ai_context_opt_20260728}/index.md +1 -1
  4. chutils-3.4.1/conductor/tracks/ai_context_opt_20260728/metadata.json +8 -0
  5. chutils-3.4.1/conductor/tracks/ai_context_opt_20260728/plan.md +17 -0
  6. chutils-3.4.1/conductor/tracks/ai_context_opt_20260728/spec.md +23 -0
  7. {chutils-3.4.0/conductor/archive/config_remote_push_20260702 → chutils-3.4.1/conductor/tracks/async_lifecycle_20260728}/index.md +1 -1
  8. chutils-3.4.1/conductor/tracks/async_lifecycle_20260728/metadata.json +8 -0
  9. chutils-3.4.1/conductor/tracks/async_lifecycle_20260728/plan.md +16 -0
  10. chutils-3.4.1/conductor/tracks/async_lifecycle_20260728/spec.md +26 -0
  11. {chutils-3.4.0/conductor/archive/qt_integration_20260521 → chutils-3.4.1/conductor/tracks/browser_profiles_20260728}/index.md +5 -5
  12. chutils-3.4.1/conductor/tracks/browser_profiles_20260728/metadata.json +8 -0
  13. chutils-3.4.1/conductor/tracks/browser_profiles_20260728/plan.md +23 -0
  14. chutils-3.4.1/conductor/tracks/browser_profiles_20260728/spec.md +33 -0
  15. chutils-3.4.1/conductor/tracks/queue_monitoring_20260728/index.md +5 -0
  16. chutils-3.4.1/conductor/tracks/queue_monitoring_20260728/metadata.json +8 -0
  17. chutils-3.4.1/conductor/tracks/queue_monitoring_20260728/plan.md +16 -0
  18. chutils-3.4.1/conductor/tracks/queue_monitoring_20260728/spec.md +26 -0
  19. {chutils-3.4.0/conductor/archive/dev_watch_20260702 → chutils-3.4.1/conductor/tracks/stream_crypto_20260728}/index.md +1 -1
  20. chutils-3.4.1/conductor/tracks/stream_crypto_20260728/metadata.json +8 -0
  21. chutils-3.4.1/conductor/tracks/stream_crypto_20260728/plan.md +16 -0
  22. chutils-3.4.1/conductor/tracks/stream_crypto_20260728/spec.md +22 -0
  23. chutils-3.4.1/conductor/tracks.md +37 -0
  24. {chutils-3.4.0 → chutils-3.4.1}/docs/dependencies.md +6 -1
  25. {chutils-3.4.0 → chutils-3.4.1}/docs/qt.md +128 -128
  26. {chutils-3.4.0 → chutils-3.4.1}/examples/22_qt_logging.py +41 -41
  27. {chutils-3.4.0 → chutils-3.4.1}/examples/23_qt_async.py +58 -58
  28. {chutils-3.4.0 → chutils-3.4.1}/examples/24_qt_typed_signals.py +73 -73
  29. {chutils-3.4.0 → chutils-3.4.1}/examples/concurrency_scraping_usage.py +50 -50
  30. {chutils-3.4.0 → chutils-3.4.1}/project_index.json +216 -96
  31. {chutils-3.4.0 → chutils-3.4.1}/pyproject.toml +1 -1
  32. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/api.py +2 -1
  33. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cache/decorator.py +3 -3
  34. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/watch.py +105 -105
  35. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/integrations.py +124 -124
  36. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/sse.py +258 -258
  37. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/webhook_server.py +217 -217
  38. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/runners.py +202 -201
  39. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/scaffold.py +17 -18
  40. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/watcher.py +424 -424
  41. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/di/container.py +6 -7
  42. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/lifecycle.py +35 -11
  43. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/__init__.py +9 -1
  44. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/masking.py +55 -0
  45. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/metrics/timer.py +2 -1
  46. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/qt/__init__.py +49 -49
  47. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/qt/asyncio.py +145 -141
  48. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/qt/logging.py +87 -87
  49. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/qt/shim.py +91 -90
  50. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/qt/signals.py +179 -179
  51. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/qt/widgets.py +95 -95
  52. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/__init__.py +5 -5
  53. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/concurrency/__init__.py +19 -19
  54. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/concurrency/base.py +63 -63
  55. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/concurrency/limiter.py +114 -114
  56. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/concurrency/models.py +41 -41
  57. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/concurrency/pool.py +128 -128
  58. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/concurrency/queues.py +391 -387
  59. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/backends/redis.py +2 -1
  60. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/decorator.py +2 -1
  61. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_dev_watch.py +118 -118
  62. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_integrations.py +95 -95
  63. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_sse.py +155 -155
  64. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_sse_integration.py +79 -79
  65. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_webhook.py +137 -137
  66. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_lifecycle.py +32 -0
  67. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_runners.py +101 -101
  68. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_watcher.py +135 -135
  69. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_masking.py +24 -0
  70. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_concurrency_imports.py +20 -20
  71. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_concurrency_limiter.py +43 -43
  72. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_concurrency_pool.py +58 -58
  73. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_concurrency_queues.py +161 -143
  74. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_config_alias_choices.py +45 -45
  75. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_config_fallback.py +72 -72
  76. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_db_operations.py +2 -1
  77. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_qt_asyncio.py +102 -100
  78. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_qt_logging.py +117 -115
  79. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_qt_shim.py +75 -75
  80. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_qt_signals.py +111 -109
  81. chutils-3.4.1/tests/unit/test_qt_widgets.py +127 -0
  82. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_store_backends_external.py +6 -1
  83. {chutils-3.4.0 → chutils-3.4.1}/uv.lock +183 -183
  84. chutils-3.4.0/conductor/archive/config_remote_push_20260702/metadata.json +0 -8
  85. chutils-3.4.0/conductor/archive/config_remote_push_20260702/plan.md +0 -29
  86. chutils-3.4.0/conductor/archive/config_remote_push_20260702/spec.md +0 -47
  87. chutils-3.4.0/conductor/archive/dev_watch_20260702/metadata.json +0 -8
  88. chutils-3.4.0/conductor/archive/dev_watch_20260702/plan.md +0 -29
  89. chutils-3.4.0/conductor/archive/dev_watch_20260702/spec.md +0 -52
  90. chutils-3.4.0/conductor/archive/fallback_alias_20260707/metadata.json +0 -8
  91. chutils-3.4.0/conductor/archive/fallback_alias_20260707/plan.md +0 -27
  92. chutils-3.4.0/conductor/archive/fallback_alias_20260707/spec.md +0 -37
  93. chutils-3.4.0/conductor/archive/qt_integration_20260521/metadata.json +0 -8
  94. chutils-3.4.0/conductor/archive/qt_integration_20260521/plan.md +0 -30
  95. chutils-3.4.0/conductor/archive/qt_integration_20260521/spec.md +0 -31
  96. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/index.md +0 -5
  97. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/metadata.json +0 -8
  98. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/plan.md +0 -27
  99. chutils-3.4.0/conductor/archive/qt_typed_signals_20260521/spec.md +0 -22
  100. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/index.md +0 -5
  101. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/metadata.json +0 -8
  102. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/plan.md +0 -45
  103. chutils-3.4.0/conductor/archive/scraping_concurrency_20260707/spec.md +0 -46
  104. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/index.md +0 -5
  105. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/metadata.json +0 -8
  106. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/plan.md +0 -47
  107. chutils-3.4.0/conductor/tracks/ai_manifests_few_shot_20260713/spec.md +0 -111
  108. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/index.md +0 -5
  109. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/metadata.json +0 -8
  110. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/plan.md +0 -38
  111. chutils-3.4.0/conductor/tracks/docstring_audit_20260521/spec.md +0 -34
  112. chutils-3.4.0/conductor/tracks.md +0 -7
  113. chutils-3.4.0/tests/unit/test_qt_widgets.py +0 -58
  114. {chutils-3.4.0 → chutils-3.4.1}/.chutilsignore +0 -0
  115. {chutils-3.4.0 → chutils-3.4.1}/.gitattributes +0 -0
  116. {chutils-3.4.0 → chutils-3.4.1}/.github/workflows/ci.yml +0 -0
  117. {chutils-3.4.0 → chutils-3.4.1}/.github/workflows/publish-docs.yml +0 -0
  118. {chutils-3.4.0 → chutils-3.4.1}/.gitignore +0 -0
  119. {chutils-3.4.0 → chutils-3.4.1}/CODE_OF_CONDUCT.md +0 -0
  120. {chutils-3.4.0 → chutils-3.4.1}/CONTRIBUTING.md +0 -0
  121. {chutils-3.4.0 → chutils-3.4.1}/GEMINI.md +0 -0
  122. {chutils-3.4.0 → chutils-3.4.1}/LICENSE +0 -0
  123. {chutils-3.4.0 → chutils-3.4.1}/README.md +0 -0
  124. {chutils-3.4.0 → chutils-3.4.1}/ai-lint.toml +0 -0
  125. {chutils-3.4.0 → chutils-3.4.1}/benchmarks/cold_start.py +0 -0
  126. {chutils-3.4.0 → chutils-3.4.1}/conductor/.gitignore +0 -0
  127. {chutils-3.4.0 → chutils-3.4.1}/conductor/GEMINI.md +0 -0
  128. {chutils-3.4.0 → chutils-3.4.1}/conductor/code_styleguides/python.md +0 -0
  129. {chutils-3.4.0 → chutils-3.4.1}/conductor/index.md +0 -0
  130. {chutils-3.4.0 → chutils-3.4.1}/conductor/product-guidelines.md +0 -0
  131. {chutils-3.4.0 → chutils-3.4.1}/conductor/product.md +0 -0
  132. {chutils-3.4.0 → chutils-3.4.1}/conductor/setup_state.json +0 -0
  133. {chutils-3.4.0 → chutils-3.4.1}/conductor/tech-stack.md +0 -0
  134. {chutils-3.4.0 → chutils-3.4.1}/conductor/workflow.md +0 -0
  135. {chutils-3.4.0 → chutils-3.4.1}/docs/CODE_OF_CONDUCT_RU.md +0 -0
  136. {chutils-3.4.0 → chutils-3.4.1}/docs/CONTRIBUTING_RU.md +0 -0
  137. {chutils-3.4.0 → chutils-3.4.1}/docs/INTEGRATION_AI.md +0 -0
  138. {chutils-3.4.0 → chutils-3.4.1}/docs/README_RU.md +0 -0
  139. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/README.md +0 -0
  140. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/configuration/README.md +0 -0
  141. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/configuration/bad_pattern.py +0 -0
  142. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/configuration/good_pattern.py +0 -0
  143. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/error_handling/README.md +0 -0
  144. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/error_handling/bad_pattern.py +0 -0
  145. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/error_handling/good_pattern.py +0 -0
  146. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/logging/README.md +0 -0
  147. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/logging/bad_pattern.py +0 -0
  148. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/logging/good_pattern.py +0 -0
  149. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/optional_deps/README.md +0 -0
  150. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/optional_deps/bad_pattern.py +0 -0
  151. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/optional_deps/good_pattern.py +0 -0
  152. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/secrets/README.md +0 -0
  153. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/secrets/bad_pattern.py +0 -0
  154. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_examples/secrets/good_pattern.py +0 -0
  155. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_hints.md +0 -0
  156. {chutils-3.4.0 → chutils-3.4.1}/docs/ai_lint.md +0 -0
  157. {chutils-3.4.0 → chutils-3.4.1}/docs/api.md +0 -0
  158. {chutils-3.4.0 → chutils-3.4.1}/docs/audit.md +0 -0
  159. {chutils-3.4.0 → chutils-3.4.1}/docs/captcha.md +0 -0
  160. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/config.md +0 -0
  161. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/db.md +0 -0
  162. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/dev.md +0 -0
  163. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/env.md +0 -0
  164. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/index.md +0 -0
  165. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/init.md +0 -0
  166. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/pypi.md +0 -0
  167. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/secrets.md +0 -0
  168. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/show_paths.md +0 -0
  169. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/template.md +0 -0
  170. {chutils-3.4.0 → chutils-3.4.1}/docs/cli/validate.md +0 -0
  171. {chutils-3.4.0 → chutils-3.4.1}/docs/custom_config_providers.md +0 -0
  172. {chutils-3.4.0 → chutils-3.4.1}/docs/http.md +0 -0
  173. {chutils-3.4.0 → chutils-3.4.1}/docs/index.md +0 -0
  174. {chutils-3.4.0 → chutils-3.4.1}/docs/migration.md +0 -0
  175. {chutils-3.4.0 → chutils-3.4.1}/docs/plugins.md +0 -0
  176. {chutils-3.4.0 → chutils-3.4.1}/docs/recipes.md +0 -0
  177. {chutils-3.4.0 → chutils-3.4.1}/docs/scraping.md +0 -0
  178. {chutils-3.4.0 → chutils-3.4.1}/docs/store.md +0 -0
  179. {chutils-3.4.0 → chutils-3.4.1}/docs/testing.md +0 -0
  180. {chutils-3.4.0 → chutils-3.4.1}/docs/web.md +0 -0
  181. {chutils-3.4.0 → chutils-3.4.1}/examples/.env +0 -0
  182. {chutils-3.4.0 → chutils-3.4.1}/examples/01_configuration.py +0 -0
  183. {chutils-3.4.0 → chutils-3.4.1}/examples/02_logging.py +0 -0
  184. {chutils-3.4.0 → chutils-3.4.1}/examples/03_secrets.py +0 -0
  185. {chutils-3.4.0 → chutils-3.4.1}/examples/04_full_example.py +0 -0
  186. {chutils-3.4.0 → chutils-3.4.1}/examples/05_different_log_levels.py +0 -0
  187. {chutils-3.4.0 → chutils-3.4.1}/examples/06_local_config_override.py +0 -0
  188. {chutils-3.4.0 → chutils-3.4.1}/examples/07_decorators_example.py +0 -0
  189. {chutils-3.4.0 → chutils-3.4.1}/examples/08_multiple_loggers_example.py +0 -0
  190. {chutils-3.4.0 → chutils-3.4.1}/examples/09_disable_keyring.py +0 -0
  191. {chutils-3.4.0 → chutils-3.4.1}/examples/10_universal_env_override.py +0 -0
  192. {chutils-3.4.0 → chutils-3.4.1}/examples/11_retry_decorator.py +0 -0
  193. {chutils-3.4.0 → chutils-3.4.1}/examples/12_secret_masking.py +0 -0
  194. {chutils-3.4.0 → chutils-3.4.1}/examples/13_pydantic_validation.py +0 -0
  195. {chutils-3.4.0 → chutils-3.4.1}/examples/15_context_logging.py +0 -0
  196. {chutils-3.4.0 → chutils-3.4.1}/examples/16_cloud_secret_managers.py +0 -0
  197. {chutils-3.4.0 → chutils-3.4.1}/examples/17_timeout_decorator.py +0 -0
  198. {chutils-3.4.0 → chutils-3.4.1}/examples/18_config_hot_reload.py +0 -0
  199. {chutils-3.4.0 → chutils-3.4.1}/examples/19_remote_config.py +0 -0
  200. {chutils-3.4.0 → chutils-3.4.1}/examples/20_opentelemetry_tracing.py +0 -0
  201. {chutils-3.4.0 → chutils-3.4.1}/examples/21_config_diagnostics.py +0 -0
  202. {chutils-3.4.0 → chutils-3.4.1}/examples/22_circuit_breaker_decorator.py +0 -0
  203. {chutils-3.4.0 → chutils-3.4.1}/examples/22_safe_path_resolution.py +0 -0
  204. {chutils-3.4.0 → chutils-3.4.1}/examples/23_event_bus.py +0 -0
  205. {chutils-3.4.0 → chutils-3.4.1}/examples/24_task_scheduler.py +0 -0
  206. {chutils-3.4.0 → chutils-3.4.1}/examples/25_testing_fixtures_example.py +0 -0
  207. {chutils-3.4.0 → chutils-3.4.1}/examples/26_metrics_prometheus.py +0 -0
  208. {chutils-3.4.0 → chutils-3.4.1}/examples/27_rate_limiting.py +0 -0
  209. {chutils-3.4.0 → chutils-3.4.1}/examples/28_dependency_injection.py +0 -0
  210. {chutils-3.4.0 → chutils-3.4.1}/examples/captcha_solvers_usage.py +0 -0
  211. {chutils-3.4.0 → chutils-3.4.1}/examples/config.yml +0 -0
  212. {chutils-3.4.0 → chutils-3.4.1}/examples/scraping_humanize_usage.py +0 -0
  213. {chutils-3.4.0 → chutils-3.4.1}/examples/web_client_usage.py +0 -0
  214. {chutils-3.4.0 → chutils-3.4.1}/mkdocs.yml +0 -0
  215. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/__init__.py +0 -0
  216. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/__init__.pyi +0 -0
  217. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/__main__.py +0 -0
  218. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/antigravity.md +0 -0
  219. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/__init__.py +0 -0
  220. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/_hash.py +0 -0
  221. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/backends/__init__.py +0 -0
  222. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/backends/base.py +0 -0
  223. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/backends/file.py +0 -0
  224. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/backends/postgres.py +0 -0
  225. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/backends/sqlite.py +0 -0
  226. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/audit/schema.py +0 -0
  227. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cache/__init__.py +0 -0
  228. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cache/base.py +0 -0
  229. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cache/in_memory.py +0 -0
  230. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cache/utils.py +0 -0
  231. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cli.py +0 -0
  232. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cli_booster.py +0 -0
  233. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/cli_utils.py +0 -0
  234. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/__init__.py +0 -0
  235. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/base.py +0 -0
  236. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/config.py +0 -0
  237. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/db.py +0 -0
  238. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/__init__.py +0 -0
  239. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/ai_lint.py +0 -0
  240. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/base.py +0 -0
  241. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/chat_context.py +0 -0
  242. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/clean.py +0 -0
  243. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/dashboard.py +0 -0
  244. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/diagnostics.py +0 -0
  245. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/few_shot.py +0 -0
  246. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/generate_context.py +0 -0
  247. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/hooks.py +0 -0
  248. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/mock.py +0 -0
  249. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/profile_imports.py +0 -0
  250. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/scaffold.py +0 -0
  251. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/setup_github_actions.py +0 -0
  252. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/dev/sync_env.py +0 -0
  253. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/env.py +0 -0
  254. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/init.py +0 -0
  255. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/paths.py +0 -0
  256. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/pypi.py +0 -0
  257. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/secrets.py +0 -0
  258. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/template.py +0 -0
  259. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/utils.py +0 -0
  260. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/commands/validate.py +0 -0
  261. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/GEMINI.md +0 -0
  262. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/__init__.py +0 -0
  263. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/ast_fallback_parser.py +0 -0
  264. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/core.py +0 -0
  265. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/custom_providers.py +0 -0
  266. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/dev.py +0 -0
  267. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/diagnostics.py +0 -0
  268. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/generator.py +0 -0
  269. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/getters.py +0 -0
  270. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/manager.py +0 -0
  271. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/providers.py +0 -0
  272. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/schema.py +0 -0
  273. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/utils.py +0 -0
  274. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/config/watcher.py +0 -0
  275. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/context.py +0 -0
  276. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/crypto.py +0 -0
  277. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/db.py +0 -0
  278. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/decorators.py +0 -0
  279. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/__init__.py +0 -0
  280. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/ai_lint.py +0 -0
  281. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/ast_indexer.py +0 -0
  282. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/changelog_parser.py +0 -0
  283. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/chat_context.py +0 -0
  284. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/cleaner.py +0 -0
  285. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/constants.py +0 -0
  286. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/dashboard/__init__.py +0 -0
  287. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/dashboard/indexer.py +0 -0
  288. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/dashboard/input.py +0 -0
  289. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/dashboard/tui.py +0 -0
  290. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/env_parser.py +0 -0
  291. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/env_sync.py +0 -0
  292. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/few_shot/__init__.py +0 -0
  293. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/few_shot/detector.py +0 -0
  294. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/few_shot/models.py +0 -0
  295. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/few_shot/renderer.py +0 -0
  296. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/few_shot/writer.py +0 -0
  297. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/github_actions.py +0 -0
  298. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/mock_server.py +0 -0
  299. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/models/__init__.py +0 -0
  300. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/models/base.py +0 -0
  301. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/models/index.py +0 -0
  302. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/models/node.py +0 -0
  303. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/models/symbol.py +0 -0
  304. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/profile_imports.py +0 -0
  305. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/project_metadata.py +0 -0
  306. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/__init__.py +0 -0
  307. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/api_map.py +0 -0
  308. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/decomposition.py +0 -0
  309. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/dependency_sync.py +0 -0
  310. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/docstring.py +0 -0
  311. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/env.py +0 -0
  312. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/integration.py +0 -0
  313. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/linter_coverage.py +0 -0
  314. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/manifest.py +0 -0
  315. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/security.py +0 -0
  316. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/rules/upgrade_check.py +0 -0
  317. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/upgrade_client.py +0 -0
  318. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/dev/version_detector.py +0 -0
  319. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/di/__init__.py +0 -0
  320. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/di/__init__.pyi +0 -0
  321. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/diagnostics/__init__.py +0 -0
  322. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/diagnostics/manager.py +0 -0
  323. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/diagnostics/models.py +0 -0
  324. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/diagnostics/web.py +0 -0
  325. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/env.py +0 -0
  326. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/env.pyi +0 -0
  327. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/events/__init__.py +0 -0
  328. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/events/core.py +0 -0
  329. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/__init__.py +0 -0
  330. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/audit.py +0 -0
  331. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/base.py +0 -0
  332. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/cache.py +0 -0
  333. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/config.py +0 -0
  334. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/di.py +0 -0
  335. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/events.py +0 -0
  336. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/logger.py +0 -0
  337. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/resilience.py +0 -0
  338. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/secrets.py +0 -0
  339. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/system.py +0 -0
  340. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/validation.py +0 -0
  341. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/exceptions/watcher.py +0 -0
  342. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/features.py +0 -0
  343. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/fs.py +0 -0
  344. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/http/__init__.py +0 -0
  345. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/http/api.py +0 -0
  346. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/http/client.py +0 -0
  347. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/http/fallback.py +0 -0
  348. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/http/resilience.py +0 -0
  349. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/http/streaming.py +0 -0
  350. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/http/tracing.py +0 -0
  351. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/GEMINI.md +0 -0
  352. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/core.py +0 -0
  353. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/formatters.py +0 -0
  354. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/handlers.py +0 -0
  355. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/internal/builder.py +0 -0
  356. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/internal/levels.py +0 -0
  357. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/logger/internal/utils.py +0 -0
  358. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/metrics/__init__.py +0 -0
  359. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/metrics/base.py +0 -0
  360. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/metrics/in_memory.py +0 -0
  361. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/metrics/prometheus.py +0 -0
  362. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/plugins/__init__.py +0 -0
  363. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/plugins/core.py +0 -0
  364. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/plugins/interfaces.py +0 -0
  365. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/captcha/__init__.py +0 -0
  366. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/captcha/anticaptcha.py +0 -0
  367. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/captcha/base.py +0 -0
  368. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/captcha/capmonster.py +0 -0
  369. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/captcha/exceptions.py +0 -0
  370. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/captcha/rucaptcha.py +0 -0
  371. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/humanize/__init__.py +0 -0
  372. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/humanize/actions.py +0 -0
  373. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/humanize/antidetect.py +0 -0
  374. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/humanize/math_utils.py +0 -0
  375. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/scraping/humanize/warmer.py +0 -0
  376. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/GEMINI.md +0 -0
  377. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/__init__.py +0 -0
  378. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/core.py +0 -0
  379. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/providers/__init__.py +0 -0
  380. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/providers/aws.py +0 -0
  381. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/providers/base.py +0 -0
  382. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/providers/dotenv.py +0 -0
  383. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/providers/env.py +0 -0
  384. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/providers/gcp.py +0 -0
  385. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/secret_manager/providers/keyring_provider.py +0 -0
  386. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/__init__.py +0 -0
  387. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/backends/__init__.py +0 -0
  388. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/backends/base.py +0 -0
  389. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/backends/memcached.py +0 -0
  390. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/backends/memory.py +0 -0
  391. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/store/manager.py +0 -0
  392. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/tasks/__init__.py +0 -0
  393. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/tasks/__init__.pyi +0 -0
  394. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/tasks/core.py +0 -0
  395. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/testing/__init__.py +0 -0
  396. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/testing/fixtures.py +0 -0
  397. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/text.py +0 -0
  398. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/time.py +0 -0
  399. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/tracing.py +0 -0
  400. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/typing.py +0 -0
  401. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/validation.py +0 -0
  402. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/validation.pyi +0 -0
  403. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/web/__init__.py +0 -0
  404. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/web/client.py +0 -0
  405. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/web/proxy_pool.py +0 -0
  406. {chutils-3.4.0 → chutils-3.4.1}/src/chutils/web/user_agent.py +0 -0
  407. {chutils-3.4.0 → chutils-3.4.1}/tests/conftest.py +0 -0
  408. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/__init__.py +0 -0
  409. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_ai_lint_integration.py +0 -0
  410. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_cli_e2e.py +0 -0
  411. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_db_migrations.py +0 -0
  412. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_event_loops.py +0 -0
  413. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_examples.py +0 -0
  414. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_hooks_integration.py +0 -0
  415. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_masking_integration.py +0 -0
  416. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_otel_tracing.py +0 -0
  417. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_remote_config_integration.py +0 -0
  418. {chutils-3.4.0 → chutils-3.4.1}/tests/integration/test_setup_github_actions_integration.py +0 -0
  419. {chutils-3.4.0 → chutils-3.4.1}/tests/manual/manual_test_cli_booster.py +0 -0
  420. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/conftest.py +0 -0
  421. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli.py +0 -0
  422. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_booster.py +0 -0
  423. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_config.py +0 -0
  424. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_config_cmd.py +0 -0
  425. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_config_schema.py +0 -0
  426. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_dev.py +0 -0
  427. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_dev_cmd.py +0 -0
  428. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_dev_tree.py +0 -0
  429. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_diagnostics.py +0 -0
  430. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_extras_suggestion.py +0 -0
  431. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_init.py +0 -0
  432. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_init_interactive.py +0 -0
  433. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_paths.py +0 -0
  434. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_pypi.py +0 -0
  435. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_rich.py +0 -0
  436. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_rich_width.py +0 -0
  437. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_secrets.py +0 -0
  438. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_setup_github_actions.py +0 -0
  439. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_template.py +0 -0
  440. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_utils_internal.py +0 -0
  441. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/cli/test_cli_validate.py +0 -0
  442. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config.py +0 -0
  443. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_ast_parser.py +0 -0
  444. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_dev.py +0 -0
  445. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_diagnostics.py +0 -0
  446. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_env.py +0 -0
  447. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_env_loading.py +0 -0
  448. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_generator.py +0 -0
  449. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_json.py +0 -0
  450. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_pydantic.py +0 -0
  451. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_required.py +0 -0
  452. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_schema.py +0 -0
  453. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_tracing.py +0 -0
  454. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_universal_env.py +0 -0
  455. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_utils.py +0 -0
  456. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_validation_group.py +0 -0
  457. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_config_watcher.py +0 -0
  458. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_custom_config_providers.py +0 -0
  459. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_priority_unification.py +0 -0
  460. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/config/test_remote_config.py +0 -0
  461. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_ast_indexer.py +0 -0
  462. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_ast_indexer_abstract.py +0 -0
  463. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_ast_indexer_graph.py +0 -0
  464. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_ast_indexer_layers.py +0 -0
  465. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_ast_indexer_metadata.py +0 -0
  466. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_cache.py +0 -0
  467. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_dev_models.py +0 -0
  468. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_exceptions.py +0 -0
  469. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_features.py +0 -0
  470. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_fs.py +0 -0
  471. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_thread_safety.py +0 -0
  472. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/core/test_time.py +0 -0
  473. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/decorators/test_decorator_circuit_breaker.py +0 -0
  474. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/decorators/test_decorator_retry.py +0 -0
  475. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/decorators/test_decorator_timeout.py +0 -0
  476. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/decorators/test_decorators.py +0 -0
  477. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/decorators/test_rate_limit.py +0 -0
  478. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_ai_lint.py +0 -0
  479. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_ai_lint_staged.py +0 -0
  480. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_changelog_parser.py +0 -0
  481. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_chat_context.py +0 -0
  482. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_cleaner.py +0 -0
  483. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_env_parser.py +0 -0
  484. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_env_sync.py +0 -0
  485. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_generate_few_shot.py +0 -0
  486. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_linter_coverage_rule.py +0 -0
  487. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_mock_server.py +0 -0
  488. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_scaffold.py +0 -0
  489. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_setup_github_actions.py +0 -0
  490. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_upgrade_check_rule.py +0 -0
  491. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_upgrade_client.py +0 -0
  492. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/dev/test_version_detector.py +0 -0
  493. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/di/test_di.py +0 -0
  494. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/events/test_event_bus.py +0 -0
  495. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/conftest.py +0 -0
  496. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_basics.py +0 -0
  497. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_compression.py +0 -0
  498. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_config_sections.py +0 -0
  499. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_configuration.py +0 -0
  500. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_context.py +0 -0
  501. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_env_control.py +0 -0
  502. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_files.py +0 -0
  503. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_json_format.py +0 -0
  504. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_logger_rich_width.py +0 -0
  505. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_performance_security.py +0 -0
  506. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_rich.py +0 -0
  507. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/logger/test_rotation.py +0 -0
  508. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/metrics/test_metrics.py +0 -0
  509. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/plugins/test_integration.py +0 -0
  510. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/plugins/test_interfaces.py +0 -0
  511. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/plugins/test_plugins.py +0 -0
  512. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/secret_manager/test_secret_manager.py +0 -0
  513. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/secret_manager/test_secret_manager_env.py +0 -0
  514. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/secret_manager/test_secret_manager_providers.py +0 -0
  515. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/secret_manager/test_secrets_required.py +0 -0
  516. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/tasks/test_scheduler.py +0 -0
  517. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_ai_lint_ignore.py +0 -0
  518. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_anticaptcha.py +0 -0
  519. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_antidetect.py +0 -0
  520. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_async_web_client.py +0 -0
  521. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_audit.py +0 -0
  522. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_audit_phase2.py +0 -0
  523. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_capmonster.py +0 -0
  524. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_captcha_base.py +0 -0
  525. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_captcha_imports.py +0 -0
  526. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_cli_db.py +0 -0
  527. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_crypto.py +0 -0
  528. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_crypto_dependencies.py +0 -0
  529. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_dashboard.py +0 -0
  530. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_db_init.py +0 -0
  531. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_decorators_bulkhead.py +0 -0
  532. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_diagnostics.py +0 -0
  533. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_env.py +0 -0
  534. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_events_exception_group.py +0 -0
  535. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_http_api.py +0 -0
  536. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_http_client.py +0 -0
  537. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_http_fallback.py +0 -0
  538. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_http_resilience.py +0 -0
  539. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_http_streaming.py +0 -0
  540. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_http_tracing.py +0 -0
  541. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_humanize_math.py +0 -0
  542. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_install_hooks.py +0 -0
  543. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_minimal_imports.py +0 -0
  544. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_nodriver_humanize.py +0 -0
  545. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_playwright_humanize.py +0 -0
  546. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_profile_imports.py +0 -0
  547. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_profile_warmer.py +0 -0
  548. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_proxy_pool.py +0 -0
  549. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_rucaptcha.py +0 -0
  550. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_scraping_imports.py +0 -0
  551. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_selenium_humanize.py +0 -0
  552. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_store_integrations.py +0 -0
  553. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_store_manager.py +0 -0
  554. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_store_memory.py +0 -0
  555. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_text.py +0 -0
  556. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_text_dependencies.py +0 -0
  557. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_user_agent.py +0 -0
  558. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_validation.py +0 -0
  559. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_web_client.py +0 -0
  560. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/test_web_imports.py +0 -0
  561. {chutils-3.4.0 → chutils-3.4.1}/tests/unit/testing/test_fixtures.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chutils
3
- Version: 3.4.0
3
+ Version: 3.4.1
4
4
  Summary: Набор простых и удобных утилит для Python, который избавляет от рутины при работе с конфигурацией и логированием в новых проектах.
5
5
  Author-email: Chu4hel <sergeiivanov636@gmail.com>
6
6
  License-Expression: MIT
@@ -1,9 +1,9 @@
1
1
  ---
2
- chutils_version: 3.3.2
3
- project_version: 3.3.2
4
- git_commit: 1056ddfc241c7c49c89d0e5ceb7c71b6a49fcb9e (dirty)
5
- generated_at: 2026-07-25T09:58:24.525089+00:00
6
- project_hash: c9fdfbcccbbcd7da26d504ea6a52c71ac54d3d6ac8ad3db65ab038e0112d8666
2
+ chutils_version: 3.4.1
3
+ project_version: 3.4.1
4
+ git_commit: 824417aa80b19bbfbb6cbb86151e5139be92b981 (dirty)
5
+ generated_at: 2026-07-28T19:53:16.120390+00:00
6
+ project_hash: 1001ffd89333fcf5c07c42b89dfebc67f38e7574da9f7166e3845fa464c5bc81
7
7
  ---
8
8
 
9
9
  # Public API Map: chutils
@@ -88,7 +88,7 @@ project_hash: c9fdfbcccbbcd7da26d504ea6a52c71ac54d3d6ac8ad3db65ab038e0112d8666
88
88
  | `Scaffolder` | class | `(self, module_name: 'str', output_dir: 'str \| None' = None, force: 'bool' = False) -> 'None'` | Генератор слоев Чистой Архитектуры для нового модуля. |
89
89
  | `SecretError` | class | `(self, message: str, hint: str \| None = None, **context: Any) -> None` | Общая ошибка менеджера секретов. |
90
90
  | `SecretManager` | class | `(self, service_name: 'str \| None' = None, prefix: 'str \| None' = None, auto_mask_logs: 'bool' = True, providers: 'list[SecretProvider] \| None' = None) -> 'None'` | Универсальный менеджер для управления секретами через цепочку провайдеров. |
91
- | `SecretMaskingFilter` | class | `(self, name='')` | Фильтр для автоматического маскирования секретов в сообщениях логов. |
91
+ | `SecretMaskingFilter` | class | `(self, name: 'str' = '', secrets: 'list[str] \| set[str] \| None' = None, patterns: 'list[str] \| set[str] \| None' = None) -> 'None'` | Фильтр для автоматического маскирования секретов в сообщениях логов. |
92
92
  | `SecretNotFoundError` | class | `(self, message: str, hint: str \| None = None, **context: Any) -> None` | Ошибка: секрет не найден. |
93
93
  | `SecretProviderError` | class | `(self, message: str, hint: str \| None = None, **context: Any) -> None` | Ошибка конкретного провайдера секретов (например, сбой keyring). |
94
94
  | `ServerSentEvent` | class | `(self, id: 'str \| None' = None, event: 'str \| None' = None, data: 'str' = '', retry: 'int \| None' = None, raw: 'str' = '') -> None` | Представляет собой отдельное событие Server-Sent Events (SSE). |
@@ -1,4 +1,4 @@
1
- # Track fallback_alias_20260707 Context
1
+ # Track ai_context_opt_20260728 Context
2
2
 
3
3
  - [Specification](./spec.md)
4
4
  - [Implementation Plan](./plan.md)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "ai_context_opt_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T21:09:22.614964",
6
+ "updated_at": "2026-07-28T21:09:22.614995",
7
+ "description": "Оптимизация AI-контекст генератора (.gitignore и инкрементальное обновление)"
8
+ }
@@ -0,0 +1,17 @@
1
+ # Implementation Plan - AI Context Generator Optimization (`ai_context_opt_20260728`)
2
+
3
+ Оптимизация утилиты `chutils dev generate-context` с помощью `.gitignore` парсера и инкрементального AST-обновления.
4
+
5
+ ## Phase 1: Gitignore Parser (`src/chutils/dev/context/gitignore.py`)
6
+ - [ ] Task: Добавить поддержку чтения и парсинга `.gitignore` файлов через `pathspec` или встроенный fnmatch-механизм в `src/chutils/dev/context/gitignore.py`.
7
+ - [ ] Task: Интегрировать опцию `--gitignore` в команду CLI `generate-context` (`src/chutils/commands/dev.py`).
8
+
9
+ ## Phase 2: Incremental AST Indexer (`src/chutils/dev/context/incremental.py`)
10
+ - [ ] Task: Реализовать получение списка измененных файлов через `git status` / `git diff` в `src/chutils/dev/context/incremental.py`.
11
+ - [ ] Task: Реализовать логику частичной замены узлов AST для измененных файлов в `project_index.json` и `api_map.md`.
12
+ - [ ] Task: Интегрировать флаги `--incremental` / `-i` в CLI утилиту `generate-context`.
13
+
14
+ ## Phase 3: Testing & Verification
15
+ - [ ] Task: Написать unit-тесты для парсера `.gitignore` и инкрементальной генерации в `tests/unit/dev/test_context_generator.py`.
16
+ - [ ] Task: Проверить работу команды через `uv run mypy src/chutils` и `uv run pytest tests/unit/dev/`.
17
+ - [ ] Task: Обновить документацию в `docs/api.md` и перегенерировать `api_map.md`.
@@ -0,0 +1,23 @@
1
+ # Specification: AI Context Generator Optimization (`ai_context_opt_20260728`)
2
+
3
+ ## 1. Overview
4
+ Расширение возможностей утилиты `chutils dev generate-context` флагами `--gitignore` (учет игнорируемых Git файлов) и `--incremental` / `-i` (инкрементальное обновление семантических индексов AST на основе `git diff` / `git status`).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Учет `.gitignore` (`--gitignore`)**:
8
+ - Чтение паттернов из файла `.gitignore` (а также корневых и вложенных `.gitignore` целевого проекта).
9
+ - Исключение подходящих под правила файлов и каталогов из сканирования наравне с `.chutilsignore`.
10
+ 2. **Инкрементальное обновление (`--incremental` / `-i`)**:
11
+ - Определение списка измененных или добавленных файлов с последнего Git-коммита (`git diff --name-only HEAD` / `git status`).
12
+ - Перепарсинг AST-дерева только для изменившихся файлов и частичное обновление структур `project_index.json` и `api_map.md` без полного перестроения индекса всей кодовой базы.
13
+ 3. **Безопасность и хэширование**:
14
+ - Автоматический пересчет хэша проекта после частичного обновления во избежание срабатывания `APIMapHashRule` в аудиторе.
15
+
16
+ ## 3. Non-Functional Requirements
17
+ - Сокращение времени генерации контекста на крупных проектах (500+ файлов) в режиме `--incremental` более чем на 80%.
18
+ - Полная совместимость со существующим CLI-интерфейсом `chutils dev generate-context`.
19
+
20
+ ## 4. Acceptance Criteria
21
+ - [ ] Флаг `--gitignore` отсеивает `build/`, `.venv/` и файлы, указанные в `.gitignore`.
22
+ - [ ] Флаг `--incremental` обновляет метаданные AST только для измененных файлов в `project_index.json` и `api_map.md`.
23
+ - [ ] Тесты в `tests/unit/dev/test_context_generator.py` подтверждают правильность отбора файлов.
@@ -1,4 +1,4 @@
1
- # Track config_remote_push_20260702 Context
1
+ # Track async_lifecycle_20260728 Context
2
2
 
3
3
  - [Specification](./spec.md)
4
4
  - [Implementation Plan](./plan.md)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "async_lifecycle_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T21:02:11.640486",
6
+ "updated_at": "2026-07-28T21:02:11.640546",
7
+ "description": "Асинхронный контекстный менеджер lifecycle()"
8
+ }
@@ -0,0 +1,16 @@
1
+ # Implementation Plan - Async Lifecycle Context Manager (`async_lifecycle_20260728`)
2
+
3
+ Реализация асинхронного контекстного менеджера `async_lifecycle` в `chutils.lifecycle`.
4
+
5
+ ## Phase 1: Lifecycle Context Implementation (`src/chutils/lifecycle.py`)
6
+ - [ ] Task: Создать класс/функцию `AsyncLifecycleContext` и публичную функцию `lifecycle()` в `src/chutils/lifecycle.py`.
7
+ - [ ] Task: Реализовать логику `__aenter__` (авто-подключение сигналов при `setup_signals=True`) и `__aexit__` (безопасный вызов `async_run_cleanup()`).
8
+ - [ ] Task: Добавить поддержку опционального автоклининга подсистем (`db`, `tasks`, `logger`) при `auto_cleanup_subsystems=True`.
9
+
10
+ ## Phase 2: Unit Testing & Integration Verification
11
+ - [ ] Task: Написать unit-тесты для `async with lifecycle()` с успешным завершением и сгенерированным исключением в `tests/unit/core/test_lifecycle.py`.
12
+ - [ ] Task: Написать тесты перехвата сигналов ОС в контекстном менеджере.
13
+
14
+ ## Phase 3: Verification & Documentation
15
+ - [ ] Task: Запустить `uv run mypy src/chutils` и `uv run pytest tests/unit/core/test_lifecycle.py`.
16
+ - [ ] Task: Добавить примеры использования `async with lifecycle()` в `docs/api.md` и обновить `api_map.md`.
@@ -0,0 +1,26 @@
1
+ # Specification: Async Lifecycle Context Manager (`async_lifecycle_20260728`)
2
+
3
+ ## 1. Overview
4
+ Добавление контекстного менеджера `lifecycle()` / `async_lifecycle()` в модуль `chutils.lifecycle` для удобного и надежного управления ресурсами приложения с поддержкой `async with` (и синхронного `with`).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Контекстный синтаксис**:
8
+ ```python
9
+ async with chutils.lifecycle(setup_signals=True, auto_cleanup_subsystems=True):
10
+ await app.run()
11
+ ```
12
+ 2. **Гибкие параметры управления**:
13
+ - `setup_signals: bool = True`: Автоматическое подключение перехвата сигналов `SIGINT`/`SIGTERM` при входе и сброс при выходе.
14
+ - `auto_cleanup_subsystems: bool = True`: Автоматический вызов функций очистки для связанных подсистем (`db`, `tasks`, `logger`).
15
+ 3. **Идемпотентность и поддержка Event Loop**:
16
+ - Безопасное выполнение в асинхронном контексте с ожиданием завершения всех коллбэков очистки в текущем петле событий (`asyncio.get_running_loop()`).
17
+ - Защита от повторного выполнения очистки, если она уже была запущена по сигналу ОС.
18
+
19
+ ## 3. Non-Functional Requirements
20
+ - Совместимость с FastAPI Lifespan, Litestar, qasync (PyQt6) и asyncio CLI.
21
+ - 100% строгая типизация (Zero-Any) и полная потокобезопасность.
22
+
23
+ ## 4. Acceptance Criteria
24
+ - [ ] `async with lifecycle()` корректно выполняет зарегистрированные коллбэки при выходе из блока или при вызове `Ctrl+C`.
25
+ - [ ] Параметры `setup_signals` и `auto_cleanup_subsystems` позволяют точно настраивать поведение контекста.
26
+ - [ ] Добавлены модульные тесты в `tests/unit/core/test_lifecycle.py`.
@@ -1,5 +1,5 @@
1
- # Track qt_integration_20260521 Context
2
-
3
- - [Specification](./spec.md)
4
- - [Implementation Plan](./plan.md)
5
- - [Metadata](./metadata.json)
1
+ # Track browser_profiles_20260728 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "browser_profiles_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T20:55:19.986167",
6
+ "updated_at": "2026-07-28T20:55:19.986187",
7
+ "description": "Поддержка родительских профилей браузеров (nodriver, playwright, selenium)"
8
+ }
@@ -0,0 +1,23 @@
1
+ # Implementation Plan - Browser Profiles Support (`browser_profiles_20260728`)
2
+
3
+ Модуль управления, экспорта, импорта и переноса авторизованных сессий и профилей браузеров между `nodriver`, `playwright` и `selenium`.
4
+
5
+ ## Phase 1: Core Data Models & Serialization (`chutils.scraping.profiles.models`)
6
+ - [ ] Task: Создать Pydantic-модели профилей `BrowserProfile`, `CookieData`, `StorageData`, `HeaderData` в `src/chutils/scraping/profiles/models.py`.
7
+ - [ ] Task: Реализовать методы упаковывания/распаковывания `.chprofile` архивов с поддержкой Fernet-шифрования (`chutils.crypto`) в `src/chutils/scraping/profiles/storage.py`.
8
+ - [ ] Task: Написать unit-тесты для сериализации, шифрования и распаковки `BrowserProfile` в `tests/unit/scraping/test_profile_storage.py`.
9
+
10
+ ## Phase 2: Engine Adapters (nodriver, playwright, selenium)
11
+ - [ ] Task: Реализовать адаптер экспорта/импорта для `playwright` (Async & Sync Contexts) в `src/chutils/scraping/profiles/adapters/playwright.py`.
12
+ - [ ] Task: Реализовать адаптер экспорта/импорта для `nodriver` через CDP в `src/chutils/scraping/profiles/adapters/nodriver.py`.
13
+ - [ ] Task: Реализовать адаптер экспорта/импорта для `selenium`/`undetected_chromedriver` в `src/chutils/scraping/profiles/adapters/selenium.py`.
14
+ - [ ] Task: Написать unit-тесты с моками для всех трех адаптеров движков в `tests/unit/scraping/test_profile_adapters.py`.
15
+
16
+ ## Phase 3: ProfileManager & Public API Integration
17
+ - [ ] Task: Создать единый интерфейс `ProfileManager` в `src/chutils/scraping/profiles/manager.py` с методами `export_profile()`, `import_profile()`, `convert_profile()`.
18
+ - [ ] Task: Экспортировать `BrowserProfile` и `ProfileManager` в `src/chutils/scraping/__init__.py` и `src/chutils/__init__.py` с поддержкой ленивой загрузки (PEP 562).
19
+ - [ ] Task: Добавить интеграционные тесты конвертации профилей между движками в `tests/unit/scraping/test_profile_manager.py`.
20
+
21
+ ## Phase 4: Verification & Documentation
22
+ - [ ] Task: Проверить проект через `uv run mypy src/chutils` и `uv run pytest`.
23
+ - [ ] Task: Обновить документацию в `docs/scraping.md` и сгенерировать контекст через `uv run chutils dev generate-context --force -o api_map.md`.
@@ -0,0 +1,33 @@
1
+ # Specification: Browser Profiles Export/Import (`chutils.scraping.profiles`)
2
+
3
+ ## 1. Overview
4
+ Модуль `chutils.scraping.profiles` предназначен для экспорта, сохранения, конвертации и импорта авторизованных сессий и профилей браузеров между различными движками скрейпинга (`nodriver`, `playwright`, `selenium`/`undetected-chromedriver`).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Поддержка сессионных данных**:
8
+ - Экспорт и импорт авторизационных Cookie (с привязкой к доменам, SameSite, Secure, Expiry).
9
+ - Экспорт и импорт `LocalStorage` и `SessionStorage` для каждого домена.
10
+ - Экспорт и импорт структурированных данных `IndexedDB`.
11
+ - Сохранение и автоматическое восстановление метаданных браузера и HTTP-заголовков (`User-Agent`, `Accept-Language`, `Sec-CH-UA`).
12
+ 2. **Универсальный формат хранения**:
13
+ - Портативный `.chprofile` файл (ZIP-архив с JSON-структурой сессии и бинарными дампами).
14
+ - Опциональная интеграция с `chutils.crypto` для парольного шифрования профилей (Fernet).
15
+ 3. **Бесшовный переход между движками**:
16
+ - Метод `ProfileManager.export_from_nodriver(tab)` для извлечения куков и хранилищ через CDP (Chrome DevTools Protocol).
17
+ - Метод `ProfileManager.import_to_nodriver(tab, profile)` для подгрузки сессии в активную вкладку `nodriver`.
18
+ - Метод `ProfileManager.export_from_playwright(page/context)` для извлечения `storage_state` и данных хранилищ `playwright`.
19
+ - Метод `ProfileManager.import_to_playwright(context/page, profile)` для установки куков и выполнения скриптов восстановления хранилищ.
20
+ - Базовая поддержка экспорта/импорта для `selenium` / `undetected-chromedriver`.
21
+ 4. **Безопасность и обработка ошибок**:
22
+ - При наличии несериализуемых данных в `IndexedDB` применяется Safe Fallback с журналированием предупреждения в лог без остановки работы.
23
+ - При отсутствии установленных библиотек (`playwright`, `nodriver`, `selenium`) выбрасываются понятные `OptionalDependencyError`.
24
+
25
+ ## 3. Non-Functional Requirements
26
+ - 100% покрытие аннотациями типов без использования `Any` в бизнес-логике.
27
+ - Потоко- и асинхронная безопасность (`asyncio.Lock` при операциях со Storage).
28
+ - Модульные тесты на замену и конвертацию формата между `nodriver` и `playwright`.
29
+
30
+ ## 4. Acceptance Criteria
31
+ - [ ] Профиль, экспортированный из `nodriver`, успешно восстанавливает авторизованную сессию и куки в `playwright` (и наоборот).
32
+ - [ ] Экспортированный профиль корректно сохраняется в шифрованный `.chprofile` и распаковывается по паролю.
33
+ - [ ] Ошибки несериализуемых значений Storage обрабатываются с вызовом `logger.warning()` без падения приложения.
@@ -0,0 +1,5 @@
1
+ # Track queue_monitoring_20260728 Context
2
+
3
+ - [Specification](./spec.md)
4
+ - [Implementation Plan](./plan.md)
5
+ - [Metadata](./metadata.json)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "queue_monitoring_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T20:58:30.182743",
6
+ "updated_at": "2026-07-28T20:58:30.182776",
7
+ "description": "Мониторинг очередей задач и воркеров через Prometheus"
8
+ }
@@ -0,0 +1,16 @@
1
+ # Implementation Plan - Queue & Worker Prometheus Monitoring (`queue_monitoring_20260728`)
2
+
3
+ Внедрение мониторинга очередей задач и пула воркеров через `chutils.metrics`.
4
+
5
+ ## Phase 1: Queue Metrics Collector (`src/chutils/scraping/concurrency/metrics.py`)
6
+ - [ ] Task: Создать модуль `src/chutils/scraping/concurrency/metrics.py` с объявлением метрик `QueueMetricsCollector`.
7
+ - [ ] Task: Добавить поддержку параметра `enable_metrics: bool = True` в `BaseTaskQueue`, `InMemoryTaskQueue`, `PersistentTaskQueue` и `RedisTaskQueue`.
8
+ - [ ] Task: Написать unit-тесты сбора метрик очередей в `tests/unit/scraping/test_queue_metrics.py`.
9
+
10
+ ## Phase 2: WorkerPool Integration
11
+ - [ ] Task: Интегрировать измерение длительности выполнения задач `@timer` и подсчет статусов обработки в `WorkerPool` (`src/chutils/scraping/concurrency/worker.py`).
12
+ - [ ] Task: Написать unit-тесты для `WorkerPool` с проверкой метрик в `tests/unit/scraping/test_worker_metrics.py`.
13
+
14
+ ## Phase 3: Verification & Documentation
15
+ - [ ] Task: Запустить `uv run mypy src/chutils` и `uv run pytest tests/unit/scraping/`.
16
+ - [ ] Task: Обновить документацию `docs/scraping.md` и перегенерировать `api_map.md`.
@@ -0,0 +1,26 @@
1
+ # Specification: Queue & Worker Prometheus Monitoring (`queue_monitoring_20260728`)
2
+
3
+ ## 1. Overview
4
+ Интеграция подсистемы метрик `chutils.metrics` в очереди задач (`InMemoryTaskQueue`, `PersistentTaskQueue`, `RedisTaskQueue`) и пул воркеров `WorkerPool` для мониторинга в реальном времени с экспортом в формате Prometheus.
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Экспортируемые метрики**:
8
+ - `chutils_queue_pending_size` (Gauge): размер очереди ожидания с метками `queue_name` и `queue_type`.
9
+ - `chutils_task_execution_duration_seconds` (Histogram/Timer): время обработки задач с метками `queue_name`, `status`.
10
+ - `chutils_tasks_processed_total` (Counter): общее количество завершенных задач с метками `status` (`completed`, `failed`, `retried`).
11
+ - `chutils_worker_pool_active_workers` (Gauge): число активных воркеров в пуле.
12
+ 2. **Интеграция с очередями**:
13
+ - Автоматический трекинг размера при вызовах `push()`, `pop()`, `complete()`, `fail()`, `clear()`.
14
+ - Возможность включения/отключения экспорта метрик через опциональный параметр `enable_metrics=True` в конструкторе очередей и `WorkerPool`.
15
+ 3. **Совместимость с `chutils.metrics`**:
16
+ - Использование абстракции `chutils.metrics` с поддержкой No-Op fallback (если `prometheus_client` не установлен или метрики отключены).
17
+
18
+ ## 3. Non-Functional Requirements
19
+ - Нулевые накладные расходы при выключенном флаге метрик.
20
+ - Потоко- и асинхронная безопасность.
21
+ - Полное отсутствие `Any` в аннотациях типов.
22
+
23
+ ## 4. Acceptance Criteria
24
+ - [ ] Очереди `InMemoryTaskQueue`, `PersistentTaskQueue` и `RedisTaskQueue` обновляют Gauge размера очереди при выполнении операций.
25
+ - [ ] `WorkerPool` записывает длительность выполнения и число обработанных задач при работе с очередями.
26
+ - [ ] Тесты подтверждают корректный сбор метрик и работы без библиотеки `prometheus_client`.
@@ -1,4 +1,4 @@
1
- # Track dev_watch_20260702 Context
1
+ # Track stream_crypto_20260728 Context
2
2
 
3
3
  - [Specification](./spec.md)
4
4
  - [Implementation Plan](./plan.md)
@@ -0,0 +1,8 @@
1
+ {
2
+ "track_id": "stream_crypto_20260728",
3
+ "type": "feature",
4
+ "status": "new",
5
+ "created_at": "2026-07-28T21:06:58.057037",
6
+ "updated_at": "2026-07-28T21:06:58.057058",
7
+ "description": "Потоковое AES-GCM шифрование файлов гигантского объема"
8
+ }
@@ -0,0 +1,16 @@
1
+ # Implementation Plan - Streaming Encryption for Large Files (`stream_crypto_20260728`)
2
+
3
+ Реализация чанкового (потокового) шифрования файлов больших размеров в `chutils.crypto`.
4
+
5
+ ## Phase 1: Streaming Cipher Engine (`src/chutils/crypto/stream.py`)
6
+ - [ ] Task: Реализовать класс `StreamCipher` в `src/chutils/crypto/stream.py` для обработки файлов блоками AES-GCM с уникальными Nonce.
7
+ - [ ] Task: Обновить `encrypt_file` и `decrypt_file` в `src/chutils/crypto/core.py` с поддержкой `stream=True` и `chunk_size`.
8
+ - [ ] Task: Добавить обработку `OptionalDependencyError` при отсутствии библиотеки `cryptography`.
9
+
10
+ ## Phase 2: Testing & Memory Benchmark
11
+ - [ ] Task: Написать unit-тесты для потокового шифрования и расшифровки файлов в `tests/unit/test_crypto_stream.py`.
12
+ - [ ] Task: Добавить тесты обнаружения подмененных/поврежденных чанков (AES-GCM integrity failure).
13
+
14
+ ## Phase 3: Verification & Documentation
15
+ - [ ] Task: Запустить `uv run mypy src/chutils` и `uv run pytest tests/unit/test_crypto*.py`.
16
+ - [ ] Task: Обновить примеры использования шифрования больших файлов в `docs/api.md` и обновить `api_map.md`.
@@ -0,0 +1,22 @@
1
+ # Specification: Streaming Encryption for Large Files (`stream_crypto_20260728`)
2
+
3
+ ## 1. Overview
4
+ Добавление поддержки потокового чанкового шифрования и расшифрования файлов произвольного объема (включая десятки гигабайт) в модуле `chutils.crypto` с жестко ограниченным потреблением оперативной памяти (O(1) Memory).
5
+
6
+ ## 2. Functional Requirements
7
+ 1. **Потоковая обработка**:
8
+ - Реализовать считывание, шифрование и запись файлов фиксированными блоками (по умолчанию `chunk_size = 64 МБ`).
9
+ - Расширить сигнатуру существующих функций `encrypt_file` и `decrypt_file` параметрами `stream: bool = True` и `chunk_size: int = 64 * 1024 * 1024`.
10
+ 2. **Криптографическая стойкость**:
11
+ - Использование симметричного шифрования AES-GCM (через `cryptography.hazmat.primitives.ciphers.aead.AESGCM`) с независимыми IV (Nonce) для каждого чанка и генерацией уникального заголовка (Header) со счетчиком чанков.
12
+ 3. **Безопасность и проверка целостности**:
13
+ - Валидация тега аутентификации для каждого блока при расшифровке. Если один из блоков поврежден или подменен, выбросить `InvalidSignature` / `DecryptionError` с точным указанием индекса сбойного чанка.
14
+
15
+ ## 3. Non-Functional Requirements
16
+ - Потребление RAM при шифровании многогигабайтных файлов не должно превышать `chunk_size * 2`.
17
+ - Graceful Fallback с прозрачным выводом требований к установке `chutils[crypto]` при отсутствии пакета `cryptography`.
18
+
19
+ ## 4. Acceptance Criteria
20
+ - [ ] `encrypt_file(..., stream=True)` шифрует файл 1+ ГБ с потреблением RAM менее 150 МБ.
21
+ - [ ] `decrypt_file` успешно восстанавливает исходный файл, проверяя целостность каждого чанка.
22
+ - [ ] Модульные тесты подтверждают обнаружение поврежденных чанков во время расшифровки.
@@ -0,0 +1,37 @@
1
+ # Project Tracks
2
+
3
+ This file tracks all major tracks for the project. Each track has its own detailed plan in its respective folder.
4
+
5
+ ---
6
+
7
+ - [ ] **Track: Поддержка родительских профилей браузеров (nodriver, playwright, selenium)** [3.5.0]
8
+ *Link: [./tracks/browser_profiles_20260728/](./tracks/browser_profiles_20260728/)*
9
+
10
+ ---
11
+
12
+ - [ ] **Track: Мониторинг очередей задач и воркеров через Prometheus** [3.5.0]
13
+ *Link: [./tracks/queue_monitoring_20260728/](./tracks/queue_monitoring_20260728/)*
14
+
15
+ ---
16
+
17
+ - [ ] **Track: Асинхронный контекстный менеджер lifecycle()** [3.5.0]
18
+ *Link: [./tracks/async_lifecycle_20260728/](./tracks/async_lifecycle_20260728/)*
19
+
20
+ ---
21
+
22
+ - [ ] **Track: Потоковое шифрование гигантских файлов (AES-GCM)** [3.5.0]
23
+ *Link: [./tracks/stream_crypto_20260728/](./tracks/stream_crypto_20260728/)*
24
+
25
+ ---
26
+
27
+ - [ ] **Track: Оптимизация генератора AI-контекста (.gitignore и инкремент)** [3.5.0]
28
+ *Link: [./tracks/ai_context_opt_20260728/](./tracks/ai_context_opt_20260728/)*
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
@@ -52,7 +52,12 @@ pip install "chutils[full]"
52
52
  | `qt-pyside` | `PySide6 >=6.6` | `chutils.qt` — `QtLogHandler`, `run_async_task`, `BaseMainWindow`, `BaseDialog` (PySide6 бэкенд) | `OptionalDependencyError` при вызове |
53
53
  | `otel` | `opentelemetry-api`, `opentelemetry-sdk`, `opentelemetry-exporter-otlp` (все `>=1.41`) | `chutils.tracing` — `setup_tracing()`, `@traced`, `get_tracer()` | ⚡ Декоратор `@traced` становится no-op (просто возвращает оригинальную функцию). `get_tracer()` возвращает `None`. |
54
54
  | `testing` | `pytest >=9.0` | `chutils.testing` — фикстуры для тестов (`temp_config`, `mock_secret_manager` и др.) | `ImportError` при попытке импорта |
55
- | `full` | Все вышеперечисленные | Вся функциональность | — |
55
+ | `full` | Практически все пакеты (кроме взаимоисключающих `qt` / `qt-pyside`) | Вся базовая и расширенная функциональность библиотеки (без дублирования альтернативных GUI-бэкендов) | — |
56
+
57
+ > [!NOTE]
58
+ > Группа `chutils[full]` намеренно **не включает** GUI биндинги (`PyQt6` / `PySide6`) и распределенный бэкенд `redis`,
59
+ > так как пользователь выбирает конкретную графическую библиотеку или инфра-хранилище под свой стек. Для добавления Qt
60
+ > установите `chutils[full,qt]` или `chutils[full,qt-pyside]`.
56
61
 
57
62
  ---
58
63