chutils 3.0.0__tar.gz → 3.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chutils-3.2.0/.chutilsignore +6 -0
- chutils-3.2.0/.gitignore +186 -0
- {chutils-3.0.0 → chutils-3.2.0}/GEMINI.md +1 -0
- {chutils-3.0.0 → chutils-3.2.0}/PKG-INFO +102 -5
- {chutils-3.0.0 → chutils-3.2.0}/README.md +90 -4
- chutils-3.2.0/ai-lint.toml +176 -0
- chutils-3.2.0/api_map.md +217 -0
- {chutils-3.0.0 → chutils-3.2.0}/benchmarks/cold_start.py +10 -1
- chutils-3.2.0/conductor/.gitignore +1 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/plan.md +23 -23
- chutils-3.2.0/conductor/archive/cloud_secret_managers_20260511/plan.md +36 -0
- {chutils-3.0.0/conductor/archive/chat_context_20260610 → chutils-3.2.0/conductor/archive/custom_config_providers_20260714}/index.md +1 -1
- chutils-3.2.0/conductor/archive/custom_config_providers_20260714/metadata.json +8 -0
- chutils-3.2.0/conductor/archive/custom_config_providers_20260714/plan.md +18 -0
- chutils-3.2.0/conductor/archive/custom_config_providers_20260714/spec.md +24 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/plan.md +24 -24
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/plan.md +20 -20
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/plan.md +18 -18
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/spec.md +8 -1
- {chutils-3.0.0/conductor/archive/captcha_20260707 → chutils-3.2.0/conductor/archive/setup_github_actions_20260714}/index.md +1 -1
- chutils-3.2.0/conductor/archive/setup_github_actions_20260714/metadata.json +8 -0
- chutils-3.2.0/conductor/archive/setup_github_actions_20260714/plan.md +28 -0
- chutils-3.2.0/conductor/archive/setup_github_actions_20260714/spec.md +27 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/product.md +29 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tech-stack.md +30 -4
- {chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707 → chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713}/index.md +1 -1
- chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713/metadata.json +8 -0
- chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713/plan.md +47 -0
- chutils-3.2.0/conductor/tracks/ai_manifests_few_shot_20260713/spec.md +111 -0
- {chutils-3.0.0/conductor/archive/config_required_20260708 → chutils-3.2.0/conductor/tracks/cache_invalidation_20260714}/index.md +1 -1
- chutils-3.2.0/conductor/tracks/cache_invalidation_20260714/metadata.json +8 -0
- chutils-3.2.0/conductor/tracks/cache_invalidation_20260714/plan.md +17 -0
- chutils-3.2.0/conductor/tracks/cache_invalidation_20260714/spec.md +28 -0
- chutils-3.2.0/conductor/tracks.md +48 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/INTEGRATION_AI.md +10 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/README_RU.md +89 -4
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_lint.md +444 -339
- {chutils-3.0.0 → chutils-3.2.0}/docs/api.md +63 -0
- chutils-3.2.0/docs/audit.md +119 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/captcha.md +112 -110
- chutils-3.2.0/docs/cli/db.md +73 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/dev.md +197 -12
- chutils-3.2.0/docs/cli/env.md +62 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/index.md +3 -0
- chutils-3.2.0/docs/cli/pypi.md +121 -0
- chutils-3.2.0/docs/custom_config_providers.md +297 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/dependencies.md +110 -104
- {chutils-3.0.0 → chutils-3.2.0}/docs/index.md +14 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/recipes.md +297 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/scraping.md +162 -160
- chutils-3.2.0/examples/16_cloud_secret_managers.py +76 -0
- {chutils-3.0.0 → chutils-3.2.0}/mkdocs.yml +2 -0
- {chutils-3.0.0 → chutils-3.2.0}/project_index.json +15605 -6948
- {chutils-3.0.0 → chutils-3.2.0}/pyproject.toml +23 -3
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/__init__.py +63 -3
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/__init__.pyi +319 -1
- chutils-3.2.0/src/chutils/antigravity.md +6 -0
- chutils-3.2.0/src/chutils/audit/__init__.py +44 -0
- chutils-3.2.0/src/chutils/audit/_hash.py +22 -0
- chutils-3.2.0/src/chutils/audit/api.py +193 -0
- chutils-3.2.0/src/chutils/audit/backends/__init__.py +6 -0
- chutils-3.2.0/src/chutils/audit/backends/base.py +46 -0
- chutils-3.2.0/src/chutils/audit/backends/file.py +123 -0
- chutils-3.2.0/src/chutils/audit/backends/postgres.py +224 -0
- chutils-3.2.0/src/chutils/audit/backends/sqlite.py +200 -0
- chutils-3.2.0/src/chutils/audit/schema.py +116 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/base.py +28 -4
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/in_memory.py +57 -8
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/utils.py +28 -4
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cli.py +6 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cli_booster.py +9 -3
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cli_utils.py +39 -7
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/__init__.py +11 -5
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/base.py +1 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/config.py +20 -3
- chutils-3.2.0/src/chutils/commands/db.py +496 -0
- chutils-3.2.0/src/chutils/commands/dev/__init__.py +569 -0
- chutils-3.2.0/src/chutils/commands/dev/ai_lint.py +101 -0
- chutils-3.2.0/src/chutils/commands/dev/base.py +40 -0
- chutils-3.2.0/src/chutils/commands/dev/chat_context.py +100 -0
- chutils-3.2.0/src/chutils/commands/dev/dashboard.py +40 -0
- chutils-3.2.0/src/chutils/commands/dev/diagnostics.py +109 -0
- chutils-3.2.0/src/chutils/commands/dev/few_shot.py +55 -0
- chutils-3.2.0/src/chutils/commands/dev/generate_context.py +355 -0
- chutils-3.2.0/src/chutils/commands/dev/hooks.py +185 -0
- chutils-3.2.0/src/chutils/commands/dev/mock.py +87 -0
- chutils-3.2.0/src/chutils/commands/dev/profile_imports.py +47 -0
- chutils-3.2.0/src/chutils/commands/dev/scaffold.py +72 -0
- chutils-3.2.0/src/chutils/commands/dev/setup_github_actions.py +147 -0
- chutils-3.2.0/src/chutils/commands/dev/sync_env.py +177 -0
- chutils-3.2.0/src/chutils/commands/env.py +191 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/init.py +10 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/paths.py +10 -1
- chutils-3.2.0/src/chutils/commands/pypi.py +426 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/secrets.py +25 -4
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/template.py +10 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/validate.py +10 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/__init__.py +56 -3
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/ast_fallback_parser.py +14 -4
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/core.py +4 -4
- chutils-3.2.0/src/chutils/config/custom_providers.py +290 -0
- chutils-3.2.0/src/chutils/config/dev.py +296 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/diagnostics.py +18 -4
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/generator.py +23 -6
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/getters.py +148 -49
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/manager.py +31 -7
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/providers.py +86 -7
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/schema.py +3 -2
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/utils.py +7 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/watcher.py +12 -3
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/context.py +26 -6
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/crypto.py +2 -2
- chutils-3.2.0/src/chutils/db.py +267 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/decorators.py +335 -3
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/__init__.py +25 -21
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/ai_lint.py +437 -367
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/ast_indexer.py +48 -3
- chutils-3.2.0/src/chutils/dev/changelog_parser.py +194 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/chat_context.py +441 -355
- chutils-3.2.0/src/chutils/dev/constants.py +13 -0
- chutils-3.2.0/src/chutils/dev/dashboard/__init__.py +20 -0
- chutils-3.2.0/src/chutils/dev/dashboard/indexer.py +218 -0
- chutils-3.2.0/src/chutils/dev/dashboard/input.py +146 -0
- chutils-3.2.0/src/chutils/dev/dashboard/tui.py +593 -0
- chutils-3.2.0/src/chutils/dev/env_parser.py +227 -0
- chutils-3.2.0/src/chutils/dev/env_sync.py +113 -0
- chutils-3.2.0/src/chutils/dev/few_shot/__init__.py +113 -0
- chutils-3.2.0/src/chutils/dev/few_shot/detector.py +225 -0
- chutils-3.2.0/src/chutils/dev/few_shot/models.py +61 -0
- chutils-3.2.0/src/chutils/dev/few_shot/renderer.py +455 -0
- chutils-3.2.0/src/chutils/dev/few_shot/writer.py +301 -0
- chutils-3.2.0/src/chutils/dev/github_actions.py +91 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/mock_server.py +49 -7
- chutils-3.2.0/src/chutils/dev/models/__init__.py +17 -0
- chutils-3.2.0/src/chutils/dev/models/base.py +35 -0
- chutils-3.2.0/src/chutils/dev/models/index.py +34 -0
- chutils-3.2.0/src/chutils/dev/models/node.py +19 -0
- chutils-3.2.0/src/chutils/dev/models/symbol.py +21 -0
- chutils-3.2.0/src/chutils/dev/profile_imports.py +351 -0
- chutils-3.2.0/src/chutils/dev/project_metadata.py +195 -0
- chutils-3.2.0/src/chutils/dev/rules/__init__.py +24 -0
- chutils-3.2.0/src/chutils/dev/rules/api_map.py +439 -0
- chutils-3.2.0/src/chutils/dev/rules/decomposition.py +96 -0
- chutils-3.2.0/src/chutils/dev/rules/dependency_sync.py +256 -0
- chutils-3.2.0/src/chutils/dev/rules/docstring.py +218 -0
- chutils-3.2.0/src/chutils/dev/rules/env.py +111 -0
- chutils-3.2.0/src/chutils/dev/rules/integration.py +263 -0
- chutils-3.2.0/src/chutils/dev/rules/linter_coverage.py +171 -0
- chutils-3.2.0/src/chutils/dev/rules/manifest.py +74 -0
- chutils-3.2.0/src/chutils/dev/rules/security.py +99 -0
- chutils-3.2.0/src/chutils/dev/rules/upgrade_check.py +116 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/dev/scaffold.py +425 -410
- chutils-3.2.0/src/chutils/dev/upgrade_client.py +121 -0
- chutils-3.2.0/src/chutils/dev/version_detector.py +114 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/di/container.py +35 -9
- chutils-3.2.0/src/chutils/diagnostics/__init__.py +24 -0
- chutils-3.2.0/src/chutils/diagnostics/manager.py +254 -0
- chutils-3.2.0/src/chutils/diagnostics/models.py +98 -0
- chutils-3.2.0/src/chutils/diagnostics/web.py +79 -0
- chutils-3.2.0/src/chutils/env.py +194 -0
- chutils-3.2.0/src/chutils/env.pyi +34 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/events/core.py +9 -2
- chutils-3.2.0/src/chutils/exceptions/__init__.py +80 -0
- chutils-3.2.0/src/chutils/exceptions/audit.py +15 -0
- chutils-3.2.0/src/chutils/exceptions/base.py +66 -0
- chutils-3.2.0/src/chutils/exceptions/cache.py +7 -0
- chutils-3.2.0/src/chutils/exceptions/config.py +52 -0
- chutils-3.2.0/src/chutils/exceptions/di.py +19 -0
- chutils-3.2.0/src/chutils/exceptions/events.py +34 -0
- chutils-3.2.0/src/chutils/exceptions/logger.py +7 -0
- chutils-3.2.0/src/chutils/exceptions/resilience.py +25 -0
- chutils-3.2.0/src/chutils/exceptions/secrets.py +19 -0
- chutils-3.2.0/src/chutils/exceptions/system.py +44 -0
- chutils-3.2.0/src/chutils/exceptions/validation.py +148 -0
- chutils-3.2.0/src/chutils/exceptions/watcher.py +7 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/features.py +2 -2
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/fs.py +5 -5
- chutils-3.2.0/src/chutils/http/__init__.py +51 -0
- chutils-3.2.0/src/chutils/http/api.py +167 -0
- chutils-3.2.0/src/chutils/http/client.py +678 -0
- chutils-3.2.0/src/chutils/http/fallback.py +455 -0
- chutils-3.2.0/src/chutils/http/resilience.py +402 -0
- chutils-3.2.0/src/chutils/http/tracing.py +139 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/lifecycle.py +11 -9
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/core.py +1 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/formatters.py +8 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/internal/builder.py +2 -1
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/internal/levels.py +13 -5
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/internal/utils.py +11 -6
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/masking.py +2 -2
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/__init__.py +31 -14
- chutils-3.2.0/src/chutils/metrics/base.py +56 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/in_memory.py +32 -2
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/prometheus.py +29 -6
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/metrics/timer.py +22 -2
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/plugins/core.py +36 -9
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/plugins/interfaces.py +20 -6
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/__init__.py +59 -69
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/anticaptcha.py +281 -227
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/base.py +71 -61
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/capmonster.py +281 -227
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/rucaptcha.py +299 -245
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/actions.py +268 -206
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/antidetect.py +123 -111
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/math_utils.py +223 -209
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/secret_manager/core.py +68 -15
- chutils-3.2.0/src/chutils/secret_manager/providers/__init__.py +47 -0
- chutils-3.2.0/src/chutils/secret_manager/providers/aws.py +134 -0
- chutils-3.2.0/src/chutils/secret_manager/providers/base.py +51 -0
- chutils-3.2.0/src/chutils/secret_manager/providers/dotenv.py +91 -0
- chutils-3.2.0/src/chutils/secret_manager/providers/env.py +54 -0
- chutils-3.2.0/src/chutils/secret_manager/providers/gcp.py +168 -0
- chutils-3.2.0/src/chutils/secret_manager/providers/keyring_provider.py +124 -0
- chutils-3.2.0/src/chutils/tasks/__init__.pyi +49 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/tasks/core.py +82 -13
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/time.py +2 -2
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/tracing.py +3 -0
- chutils-3.2.0/src/chutils/validation.py +138 -0
- chutils-3.2.0/src/chutils/validation.pyi +13 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/client.py +43 -4
- chutils-3.2.0/tests/integration/__init__.py +0 -0
- chutils-3.2.0/tests/integration/test_db_migrations.py +351 -0
- chutils-3.2.0/tests/integration/test_setup_github_actions_integration.py +35 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev.py +9 -4
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev_cmd.py +204 -4
- chutils-3.2.0/tests/unit/cli/test_cli_pypi.py +426 -0
- chutils-3.2.0/tests/unit/cli/test_cli_setup_github_actions.py +92 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_dev.py +187 -185
- chutils-3.2.0/tests/unit/config/test_config_validation_group.py +42 -0
- chutils-3.2.0/tests/unit/config/test_custom_config_providers.py +401 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_circuit_breaker.py +238 -193
- chutils-3.2.0/tests/unit/dev/test_ai_lint.py +744 -0
- chutils-3.2.0/tests/unit/dev/test_ai_lint_staged.py +129 -0
- chutils-3.2.0/tests/unit/dev/test_changelog_parser.py +95 -0
- chutils-3.2.0/tests/unit/dev/test_env_parser.py +152 -0
- chutils-3.2.0/tests/unit/dev/test_env_sync.py +49 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_generate_few_shot.py +511 -473
- chutils-3.2.0/tests/unit/dev/test_linter_coverage_rule.py +194 -0
- chutils-3.2.0/tests/unit/dev/test_setup_github_actions.py +75 -0
- chutils-3.2.0/tests/unit/dev/test_upgrade_check_rule.py +55 -0
- chutils-3.2.0/tests/unit/dev/test_upgrade_client.py +106 -0
- chutils-3.2.0/tests/unit/dev/test_version_detector.py +102 -0
- chutils-3.2.0/tests/unit/secret_manager/test_secret_manager_providers.py +455 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/tasks/test_scheduler.py +84 -1
- chutils-3.2.0/tests/unit/test_audit.py +365 -0
- chutils-3.2.0/tests/unit/test_audit_phase2.py +363 -0
- chutils-3.2.0/tests/unit/test_cli_db.py +321 -0
- chutils-3.2.0/tests/unit/test_dashboard.py +401 -0
- chutils-3.2.0/tests/unit/test_db_init.py +256 -0
- chutils-3.2.0/tests/unit/test_db_operations.py +258 -0
- chutils-3.2.0/tests/unit/test_decorators_bulkhead.py +269 -0
- chutils-3.2.0/tests/unit/test_diagnostics.py +367 -0
- chutils-3.2.0/tests/unit/test_env.py +261 -0
- chutils-3.2.0/tests/unit/test_http_api.py +213 -0
- chutils-3.2.0/tests/unit/test_http_client.py +344 -0
- chutils-3.2.0/tests/unit/test_http_fallback.py +407 -0
- chutils-3.2.0/tests/unit/test_http_resilience.py +330 -0
- chutils-3.2.0/tests/unit/test_http_tracing.py +226 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_install_hooks.py +120 -95
- chutils-3.2.0/tests/unit/test_minimal_imports.py +84 -0
- chutils-3.2.0/tests/unit/test_profile_imports.py +214 -0
- chutils-3.2.0/tests/unit/test_validation.py +242 -0
- {chutils-3.0.0 → chutils-3.2.0}/uv.lock +559 -210
- chutils-3.0.0/.gitignore +0 -0
- chutils-3.0.0/api_map.md +0 -166
- chutils-3.0.0/changelog.txt +0 -370
- chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707/plan.md +0 -22
- chutils-3.0.0/conductor/archive/ai_lint_inline_ignore_20260707/spec.md +0 -39
- chutils-3.0.0/conductor/archive/captcha_20260707/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/captcha_20260707/plan.md +0 -41
- chutils-3.0.0/conductor/archive/captcha_20260707/spec.md +0 -52
- chutils-3.0.0/conductor/archive/chat_context_20260610/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/chat_context_20260610/plan.md +0 -39
- chutils-3.0.0/conductor/archive/chat_context_20260610/spec.md +0 -36
- chutils-3.0.0/conductor/archive/circuit_breaker_20260521/index.md +0 -5
- chutils-3.0.0/conductor/archive/circuit_breaker_20260521/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/circuit_breaker_20260521/plan.md +0 -45
- chutils-3.0.0/conductor/archive/circuit_breaker_20260521/spec.md +0 -50
- chutils-3.0.0/conductor/archive/cli_scaffold_20260610/index.md +0 -5
- chutils-3.0.0/conductor/archive/cli_scaffold_20260610/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/cli_scaffold_20260610/plan.md +0 -40
- chutils-3.0.0/conductor/archive/cli_scaffold_20260610/spec.md +0 -50
- chutils-3.0.0/conductor/archive/config_required_20260708/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/config_required_20260708/plan.md +0 -27
- chutils-3.0.0/conductor/archive/config_required_20260708/spec.md +0 -52
- chutils-3.0.0/conductor/archive/dependency_errors_20260707/index.md +0 -5
- chutils-3.0.0/conductor/archive/dependency_errors_20260707/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/dependency_errors_20260707/plan.md +0 -27
- chutils-3.0.0/conductor/archive/dependency_errors_20260707/spec.md +0 -37
- chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/index.md +0 -5
- chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/plan.md +0 -23
- chutils-3.0.0/conductor/archive/dev_install_hooks_20260707/spec.md +0 -50
- chutils-3.0.0/conductor/archive/drop_python39_20260610/index.md +0 -5
- chutils-3.0.0/conductor/archive/drop_python39_20260610/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/drop_python39_20260610/plan.md +0 -43
- chutils-3.0.0/conductor/archive/drop_python39_20260610/spec.md +0 -44
- chutils-3.0.0/conductor/archive/exception_groups_20260708/index.md +0 -5
- chutils-3.0.0/conductor/archive/exception_groups_20260708/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/exception_groups_20260708/plan.md +0 -22
- chutils-3.0.0/conductor/archive/exception_groups_20260708/spec.md +0 -71
- chutils-3.0.0/conductor/archive/generate_few_shot_20260610/index.md +0 -5
- chutils-3.0.0/conductor/archive/generate_few_shot_20260610/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/generate_few_shot_20260610/plan.md +0 -42
- chutils-3.0.0/conductor/archive/generate_few_shot_20260610/spec.md +0 -44
- chutils-3.0.0/conductor/archive/mock_server_20260610/index.md +0 -5
- chutils-3.0.0/conductor/archive/mock_server_20260610/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/mock_server_20260610/plan.md +0 -43
- chutils-3.0.0/conductor/archive/mock_server_20260610/spec.md +0 -40
- chutils-3.0.0/conductor/archive/optional_dependencies_20260515/index.md +0 -5
- chutils-3.0.0/conductor/archive/optional_dependencies_20260515/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/optional_dependencies_20260515/plan.md +0 -38
- chutils-3.0.0/conductor/archive/optional_dependencies_20260515/spec.md +0 -25
- chutils-3.0.0/conductor/archive/scraping_humanize_20260707/index.md +0 -5
- chutils-3.0.0/conductor/archive/scraping_humanize_20260707/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/scraping_humanize_20260707/plan.md +0 -50
- chutils-3.0.0/conductor/archive/scraping_humanize_20260707/spec.md +0 -51
- chutils-3.0.0/conductor/archive/secrets_unification_20260708/index.md +0 -5
- chutils-3.0.0/conductor/archive/secrets_unification_20260708/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/secrets_unification_20260708/plan.md +0 -31
- chutils-3.0.0/conductor/archive/secrets_unification_20260708/spec.md +0 -47
- chutils-3.0.0/conductor/archive/web_20260707/index.md +0 -5
- chutils-3.0.0/conductor/archive/web_20260707/metadata.json +0 -8
- chutils-3.0.0/conductor/archive/web_20260707/plan.md +0 -45
- chutils-3.0.0/conductor/archive/web_20260707/spec.md +0 -49
- chutils-3.0.0/conductor/tracks/cloud_secret_managers_20260511/plan.md +0 -44
- chutils-3.0.0/conductor/tracks/diagnostics_20260610/index.md +0 -5
- chutils-3.0.0/conductor/tracks/diagnostics_20260610/metadata.json +0 -8
- chutils-3.0.0/conductor/tracks/diagnostics_20260610/plan.md +0 -42
- chutils-3.0.0/conductor/tracks/diagnostics_20260610/spec.md +0 -40
- chutils-3.0.0/conductor/tracks/env_20260702/index.md +0 -5
- chutils-3.0.0/conductor/tracks/env_20260702/metadata.json +0 -8
- chutils-3.0.0/conductor/tracks/env_20260702/plan.md +0 -33
- chutils-3.0.0/conductor/tracks/env_20260702/spec.md +0 -53
- chutils-3.0.0/conductor/tracks/plan.md +0 -1
- chutils-3.0.0/conductor/tracks/sync_env_20260707/index.md +0 -5
- chutils-3.0.0/conductor/tracks/sync_env_20260707/metadata.json +0 -8
- chutils-3.0.0/conductor/tracks/sync_env_20260707/plan.md +0 -37
- chutils-3.0.0/conductor/tracks/sync_env_20260707/spec.md +0 -45
- chutils-3.0.0/conductor/tracks/validation_20260702/index.md +0 -5
- chutils-3.0.0/conductor/tracks/validation_20260702/metadata.json +0 -8
- chutils-3.0.0/conductor/tracks/validation_20260702/plan.md +0 -29
- chutils-3.0.0/conductor/tracks/validation_20260702/spec.md +0 -42
- chutils-3.0.0/conductor/tracks.md +0 -112
- chutils-3.0.0/src/chutils/commands/dev.py +0 -704
- chutils-3.0.0/src/chutils/config/dev.py +0 -141
- chutils-3.0.0/src/chutils/dev/generate_few_shot.py +0 -1004
- chutils-3.0.0/src/chutils/dev/models.py +0 -88
- chutils-3.0.0/src/chutils/dev/rules.py +0 -524
- chutils-3.0.0/src/chutils/env.py +0 -66
- chutils-3.0.0/src/chutils/exceptions.py +0 -240
- chutils-3.0.0/src/chutils/metrics/base.py +0 -42
- chutils-3.0.0/src/chutils/secret_manager/providers.py +0 -285
- chutils-3.0.0/tests/unit/dev/test_ai_lint.py +0 -341
- chutils-3.0.0/tests/unit/secret_manager/test_secret_manager_providers.py +0 -105
- chutils-3.0.0/tests/unit/test_minimal_imports.py +0 -75
- {chutils-3.0.0 → chutils-3.2.0}/.gitattributes +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/.github/workflows/ci.yml +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/.github/workflows/publish-docs.yml +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/CODE_OF_CONDUCT.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/CONTRIBUTING.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/LICENSE +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/GEMINI.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/audit_20260702/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/plan.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/bulkhead_20260702/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/cloud_secret_managers_20260511/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_manager_20260707/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/db_migrations_cli_20260707/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/plan.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/dev_dashboard_20260610/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/http_20260702/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/plan.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.2.0/conductor/archive}/profile_imports_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/code_styleguides/python.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/product-guidelines.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/setup_state.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/config_remote_push_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_clean_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/dev_watch_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/docstring_audit_20260521/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/fallback_alias_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_integration_20260521/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/qt_typed_signals_20260521/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/scraping_concurrency_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/tracks/store_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/conductor/workflow.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/CODE_OF_CONDUCT_RU.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/CONTRIBUTING_RU.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/README.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/configuration/README.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/configuration/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/configuration/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/error_handling/README.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/error_handling/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/error_handling/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/logging/README.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/logging/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/logging/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/README.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/optional_deps/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/secrets/README.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/secrets/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_examples/secrets/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/ai_hints.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/config.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/init.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/secrets.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/show_paths.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/template.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/cli/validate.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/migration.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/plugins.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/testing.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/docs/web.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/.env +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/01_configuration.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/02_logging.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/03_secrets.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/04_full_example.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/05_different_log_levels.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/06_local_config_override.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/07_decorators_example.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/08_multiple_loggers_example.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/09_disable_keyring.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/10_universal_env_override.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/11_retry_decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/12_secret_masking.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/13_pydantic_validation.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/15_context_logging.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/17_timeout_decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/18_config_hot_reload.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/19_remote_config.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/20_opentelemetry_tracing.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/21_config_diagnostics.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/22_circuit_breaker_decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/22_safe_path_resolution.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/23_event_bus.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/24_task_scheduler.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/25_testing_fixtures_example.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/26_metrics_prometheus.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/27_rate_limiting.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/28_dependency_injection.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/captcha_solvers_usage.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/config.yml +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/scraping_humanize_usage.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/examples/web_client_usage.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/__main__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/cache/decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/commands/utils.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/config/GEMINI.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/di/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/events/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/GEMINI.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/logger/handlers.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/plugins/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/captcha/exceptions.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/scraping/humanize/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/secret_manager/GEMINI.md +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/secret_manager/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/tasks/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/testing/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/testing/fixtures.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/text.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/typing.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/proxy_pool.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/src/chutils/web/user_agent.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/conftest.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_ai_lint_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_cli_e2e.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_event_loops.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_examples.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_hooks_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_masking_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_otel_tracing.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/integration/test_remote_config_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/manual/manual_test_cli_booster.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/conftest.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_booster.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config_cmd.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_config_schema.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_dev_tree.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_diagnostics.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_extras_suggestion.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_init.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_paths.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_rich.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_rich_width.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_secrets.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_template.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_utils_internal.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/cli/test_cli_validate.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_ast_parser.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_diagnostics.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_env.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_env_loading.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_generator.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_json.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_pydantic.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_required.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_schema.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_tracing.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_universal_env.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_utils.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_config_watcher.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_priority_unification.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/config/test_remote_config.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_abstract.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_graph.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_layers.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_ast_indexer_metadata.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_cache.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_dev_models.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_exceptions.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_features.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_fs.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_lifecycle.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_thread_safety.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/core/test_time.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_retry.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorator_timeout.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_decorators.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/decorators/test_rate_limit.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_chat_context.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_mock_server.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/dev/test_scaffold.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/di/test_di.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/events/test_event_bus.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/conftest.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_basics.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_compression.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_config_sections.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_configuration.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_context.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_env_control.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_files.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_json_format.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_logger_rich_width.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_masking.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_performance_security.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_rich.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/logger/test_rotation.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/metrics/test_metrics.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/plugins/test_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/plugins/test_interfaces.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/plugins/test_plugins.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secret_manager.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secret_manager_env.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/secret_manager/test_secrets_required.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_ai_lint_ignore.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_anticaptcha.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_antidetect.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_async_web_client.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_capmonster.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_captcha_base.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_captcha_imports.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_crypto.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_crypto_dependencies.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_events_exception_group.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_humanize_math.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_playwright_humanize.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_proxy_pool.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_rucaptcha.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_scraping_imports.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_selenium_humanize.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_text.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_text_dependencies.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_user_agent.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_web_client.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/test_web_imports.py +0 -0
- {chutils-3.0.0 → chutils-3.2.0}/tests/unit/testing/test_fixtures.py +0 -0
chutils-3.2.0/.gitignore
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py,cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
#Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
#uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
#poetry.lock
|
|
109
|
+
|
|
110
|
+
# pdm
|
|
111
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
112
|
+
#pdm.lock
|
|
113
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
114
|
+
# in version control.
|
|
115
|
+
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
|
116
|
+
.pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
121
|
+
__pypackages__/
|
|
122
|
+
|
|
123
|
+
# Celery stuff
|
|
124
|
+
celerybeat-schedule
|
|
125
|
+
celerybeat.pid
|
|
126
|
+
|
|
127
|
+
# SageMath parsed files
|
|
128
|
+
*.sage.py
|
|
129
|
+
|
|
130
|
+
# Environments
|
|
131
|
+
.env
|
|
132
|
+
.venv
|
|
133
|
+
env/
|
|
134
|
+
venv/
|
|
135
|
+
ENV/
|
|
136
|
+
env.bak/
|
|
137
|
+
venv.bak/
|
|
138
|
+
!examples/.env
|
|
139
|
+
|
|
140
|
+
# Spyder project settings
|
|
141
|
+
.spyderproject
|
|
142
|
+
.spyproject
|
|
143
|
+
|
|
144
|
+
# Rope project settings
|
|
145
|
+
.ropeproject
|
|
146
|
+
|
|
147
|
+
# mkdocs documentation
|
|
148
|
+
/site
|
|
149
|
+
|
|
150
|
+
# mypy
|
|
151
|
+
.mypy_cache/
|
|
152
|
+
.dmypy.json
|
|
153
|
+
dmypy.json
|
|
154
|
+
|
|
155
|
+
# Pyre type checker
|
|
156
|
+
.pyre/
|
|
157
|
+
|
|
158
|
+
# pytype static type analyzer
|
|
159
|
+
.pytype/
|
|
160
|
+
|
|
161
|
+
# Cython debug symbols
|
|
162
|
+
cython_debug/
|
|
163
|
+
|
|
164
|
+
# PyCharm
|
|
165
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
166
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
167
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
168
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
169
|
+
.idea/
|
|
170
|
+
|
|
171
|
+
# Ruff stuff:
|
|
172
|
+
.ruff_cache/
|
|
173
|
+
|
|
174
|
+
# PyPI configuration file
|
|
175
|
+
.pypirc
|
|
176
|
+
|
|
177
|
+
# Project-specific documentation
|
|
178
|
+
PUBLISHING.md
|
|
179
|
+
project.txt
|
|
180
|
+
changelog.txt
|
|
181
|
+
*.log.*
|
|
182
|
+
*.log
|
|
183
|
+
|
|
184
|
+
# Local chutils cache
|
|
185
|
+
.chutils/
|
|
186
|
+
.chutils_dashboard_history.json
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
- Вместо `Optional[T]` обязательно используйте `T | None`.
|
|
35
35
|
- Вместо `List[T]`, `Dict[K, V]`, `Tuple[T, ...]` используйте встроенные типы `list[T]`, `dict[K, V]`,
|
|
36
36
|
`tuple[T, ...]` без импорта из `typing`.
|
|
37
|
+
- **Использование uv**: Проект использует менеджер пакетов `uv` (в корне присутствует `uv.lock`). Для запуска любых скриптов, команд CLI или тестов AI-агенты ОБЯЗАТЕЛЬНО должны использовать `uv run` (например, `uv run chutils ...`, `uv run pytest`). Прямой запуск через интерпретатор `.venv` или глобальный `python` не рекомендуется.
|
|
37
38
|
- **Документация**: Подробные советы для AI находятся в `docs/ai_hints.md` и `docs/INTEGRATION_AI.md`.
|
|
38
39
|
|
|
39
40
|
## 3. Тестирование
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: chutils
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.2.0
|
|
4
4
|
Summary: Набор простых и удобных утилит для Python, который избавляет от рутины при работе с конфигурацией и логированием в новых проектах.
|
|
5
5
|
Author-email: Chu4hel <sergeiivanov636@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -9,14 +9,23 @@ Requires-Python: <3.15,>=3.10
|
|
|
9
9
|
Requires-Dist: exceptiongroup>=1.2.2; python_version < '3.11'
|
|
10
10
|
Requires-Dist: python-dotenv>=1.2.2
|
|
11
11
|
Requires-Dist: pyyaml>=6.0.3
|
|
12
|
+
Provides-Extra: aws
|
|
13
|
+
Requires-Dist: boto3>=1.34.0; extra == 'aws'
|
|
12
14
|
Provides-Extra: captcha
|
|
13
15
|
Requires-Dist: httpx>=0.27.0; extra == 'captcha'
|
|
14
16
|
Provides-Extra: crypto
|
|
15
17
|
Requires-Dist: cryptography>=42.0.0; extra == 'crypto'
|
|
16
18
|
Provides-Extra: date
|
|
17
19
|
Requires-Dist: python-dateutil>=2.9.0; extra == 'date'
|
|
20
|
+
Provides-Extra: db
|
|
21
|
+
Requires-Dist: aiosqlite>=0.20.0; extra == 'db'
|
|
22
|
+
Requires-Dist: alembic>=1.13.0; extra == 'db'
|
|
23
|
+
Requires-Dist: asyncpg>=0.29.0; extra == 'db'
|
|
24
|
+
Requires-Dist: sqlalchemy>=2.0.0; extra == 'db'
|
|
18
25
|
Provides-Extra: full
|
|
26
|
+
Requires-Dist: boto3>=1.34.0; extra == 'full'
|
|
19
27
|
Requires-Dist: cryptography>=42.0.0; extra == 'full'
|
|
28
|
+
Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == 'full'
|
|
20
29
|
Requires-Dist: httpx>=0.27.0; extra == 'full'
|
|
21
30
|
Requires-Dist: keyring>=25.7.0; extra == 'full'
|
|
22
31
|
Requires-Dist: opentelemetry-api>=1.41.1; extra == 'full'
|
|
@@ -32,6 +41,8 @@ Requires-Dist: rapidfuzz>=3.9.0; extra == 'full'
|
|
|
32
41
|
Requires-Dist: rich>=15.0.0; extra == 'full'
|
|
33
42
|
Requires-Dist: selenium>=4.27.0; extra == 'full'
|
|
34
43
|
Requires-Dist: watchdog>=6.0.0; extra == 'full'
|
|
44
|
+
Provides-Extra: gcp
|
|
45
|
+
Requires-Dist: google-cloud-secret-manager>=2.20.0; extra == 'gcp'
|
|
35
46
|
Provides-Extra: json
|
|
36
47
|
Requires-Dist: python-json-logger>=3.2.1; extra == 'json'
|
|
37
48
|
Provides-Extra: metrics
|
|
@@ -107,7 +118,11 @@ Every time you start a new project, you have to solve the same tasks:
|
|
|
107
118
|
- **🛡️ Secure Paths:** Prevent Path Traversal attacks by safely resolving file paths against a base directory using
|
|
108
119
|
`resolve_safe_path()`.
|
|
109
120
|
- **🤖 AI Linter:** Run static analysis checks on your codebase to ensure AI readiness (strict type hints, structured
|
|
110
|
-
docstrings, API map sync) via `chutils dev ai-lint`.
|
|
121
|
+
docstrings, API map sync, and file dependency synchronization) via `chutils dev ai-lint`.
|
|
122
|
+
- **✅ Data Validation (chutils.validation):** An all-in-one Pydantic-based data and JSON validation module featuring
|
|
123
|
+
`@validate_call` decorator for function argument checks and rich exception formatting.
|
|
124
|
+
- **🩺 Diagnostics API (chutils.diagnostics):** An asynchronous, thread-safe health checking framework with built-in
|
|
125
|
+
checks (keyring, config) and integrations for popular web frameworks (FastAPI, Flask).
|
|
111
126
|
- **⚡ Async Ready:** Most core functions have asynchronous versions (prefixed with `a`) for non-blocking execution.
|
|
112
127
|
- **🚀 Ready to Use:** Just install and use.
|
|
113
128
|
|
|
@@ -274,20 +289,71 @@ To use this feature, install `watchdog`:
|
|
|
274
289
|
|
|
275
290
|
### 3. Secret Management
|
|
276
291
|
|
|
277
|
-
`SecretManager`
|
|
292
|
+
`SecretManager` provides a unified abstraction for managing secrets using a custom chain of providers (`SecretProvider`)
|
|
293
|
+
and automatic fallback logic.
|
|
294
|
+
|
|
295
|
+
By default, `SecretManager` searches for secrets in the following order: **Keyring > .env File > Environment Variables
|
|
296
|
+
**.
|
|
278
297
|
|
|
279
298
|
```python
|
|
280
299
|
from chutils import SecretManager
|
|
281
300
|
|
|
282
301
|
secrets = SecretManager("my_awesome_app")
|
|
283
302
|
|
|
284
|
-
# Save
|
|
303
|
+
# Save secret (will be written to the first writable provider in the chain)
|
|
285
304
|
secrets.save_secret("API_KEY", "secret-value-123")
|
|
286
305
|
|
|
287
|
-
#
|
|
306
|
+
# Retrieve secret
|
|
288
307
|
key = secrets.get_secret("API_KEY")
|
|
289
308
|
```
|
|
290
309
|
|
|
310
|
+
#### Built-in Providers
|
|
311
|
+
|
|
312
|
+
You can configure the providers list explicitly:
|
|
313
|
+
|
|
314
|
+
```python
|
|
315
|
+
from chutils import SecretManager
|
|
316
|
+
from chutils.secret_manager.providers import KeyringProvider, DotEnvProvider, EnvProvider
|
|
317
|
+
|
|
318
|
+
secrets = SecretManager(
|
|
319
|
+
service_name="my_app",
|
|
320
|
+
providers=[
|
|
321
|
+
KeyringProvider(),
|
|
322
|
+
DotEnvProvider(),
|
|
323
|
+
EnvProvider()
|
|
324
|
+
]
|
|
325
|
+
)
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
#### Cloud Secret Managers
|
|
329
|
+
|
|
330
|
+
The library supports transparent integration with AWS Secrets Manager and Google Secret Manager:
|
|
331
|
+
|
|
332
|
+
```python
|
|
333
|
+
from chutils import SecretManager
|
|
334
|
+
from chutils.secret_manager.providers import AWSSecretManagerProvider, GCPSecretManagerProvider, EnvProvider
|
|
335
|
+
|
|
336
|
+
# Initialize cloud providers (requires installation of chutils[aws,gcp])
|
|
337
|
+
aws_provider = AWSSecretManagerProvider(region_name="us-east-1")
|
|
338
|
+
gcp_provider = GCPSecretManagerProvider(project_id="my-gcp-project")
|
|
339
|
+
|
|
340
|
+
# Create a SecretManager with the chain: AWS -> GCP -> Environment Variables.
|
|
341
|
+
# If AWS or GCP calls fail due to network/permissions or the secret is missing,
|
|
342
|
+
# SecretManager logs a warning and automatically falls back to EnvProvider.
|
|
343
|
+
secrets = SecretManager(
|
|
344
|
+
service_name="my_service",
|
|
345
|
+
providers=[aws_provider, gcp_provider, EnvProvider()]
|
|
346
|
+
)
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Install cloud dependencies:
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
pip install chutils[aws] # For AWS (boto3)
|
|
353
|
+
pip install chutils[gcp] # For GCP (google-cloud-secret-manager)
|
|
354
|
+
pip install chutils[all] # For all optional packages
|
|
355
|
+
```
|
|
356
|
+
|
|
291
357
|
#### Disabling Keyring (Optional)
|
|
292
358
|
|
|
293
359
|
In environments like Docker or CI/CD where `keyring` is unavailable, you can suppress warnings and skip the check:
|
|
@@ -333,6 +399,22 @@ except PathTraversalError as e:
|
|
|
333
399
|
- `get_secret(key, fallback=None, required=False)` / `aget_secret(...)`
|
|
334
400
|
- `delete_secret` / `adelete_secret`
|
|
335
401
|
|
|
402
|
+
### Environment Manifest (`chutils.env`)
|
|
403
|
+
|
|
404
|
+
- `BaseEnvManifest`: Declarative specification of environment variables using Pydantic typing, automatic secret masking,
|
|
405
|
+
and `load()` classmethod.
|
|
406
|
+
|
|
407
|
+
### Data Validation (`chutils.validation`)
|
|
408
|
+
|
|
409
|
+
- `validate_data(model, data)`: Validates dictionaries or JSON strings against Pydantic models, raising
|
|
410
|
+
`ChutilsValidationError`.
|
|
411
|
+
- `@validate_call`: Automatically validates function arguments using Pydantic.
|
|
412
|
+
|
|
413
|
+
### Health Checking (`chutils.diagnostics`)
|
|
414
|
+
|
|
415
|
+
- `DiagnosticsManager`: Registers and аsynchronously executes system health checks with timeouts.
|
|
416
|
+
- Web Framework helpers: `get_fastapi_health_handler` and `get_flask_health_handler`.
|
|
417
|
+
|
|
336
418
|
### Decorators (`chutils.decorators`)
|
|
337
419
|
|
|
338
420
|
- `@log_function_details`: Logs arguments, execution time, and result (uses `DEVDEBUG` level).
|
|
@@ -437,6 +519,21 @@ chutils dev ai-lint --strict --ignore "temp/,build/"
|
|
|
437
519
|
|
|
438
520
|
See [docs/ai_lint.md](docs/ai_lint.md) for more details.
|
|
439
521
|
|
|
522
|
+
### 7. Environment Variables Synchronization
|
|
523
|
+
|
|
524
|
+
Keep `.env` and `.env.example` files in sync with format preservation, comments, and values masking:
|
|
525
|
+
|
|
526
|
+
```bash
|
|
527
|
+
# Compare .env and .env.example keys without making changes
|
|
528
|
+
chutils dev sync-env --dry-run
|
|
529
|
+
|
|
530
|
+
# Synchronize files automatically
|
|
531
|
+
chutils dev sync-env --yes
|
|
532
|
+
|
|
533
|
+
# Specify custom paths
|
|
534
|
+
chutils dev sync-env --env-path .env.dev --example-path .env.dev.example
|
|
535
|
+
```
|
|
536
|
+
|
|
440
537
|
## License
|
|
441
538
|
|
|
442
539
|
The project is distributed under the MIT License.
|
|
@@ -46,7 +46,11 @@ Every time you start a new project, you have to solve the same tasks:
|
|
|
46
46
|
- **🛡️ Secure Paths:** Prevent Path Traversal attacks by safely resolving file paths against a base directory using
|
|
47
47
|
`resolve_safe_path()`.
|
|
48
48
|
- **🤖 AI Linter:** Run static analysis checks on your codebase to ensure AI readiness (strict type hints, structured
|
|
49
|
-
docstrings, API map sync) via `chutils dev ai-lint`.
|
|
49
|
+
docstrings, API map sync, and file dependency synchronization) via `chutils dev ai-lint`.
|
|
50
|
+
- **✅ Data Validation (chutils.validation):** An all-in-one Pydantic-based data and JSON validation module featuring
|
|
51
|
+
`@validate_call` decorator for function argument checks and rich exception formatting.
|
|
52
|
+
- **🩺 Diagnostics API (chutils.diagnostics):** An asynchronous, thread-safe health checking framework with built-in
|
|
53
|
+
checks (keyring, config) and integrations for popular web frameworks (FastAPI, Flask).
|
|
50
54
|
- **⚡ Async Ready:** Most core functions have asynchronous versions (prefixed with `a`) for non-blocking execution.
|
|
51
55
|
- **🚀 Ready to Use:** Just install and use.
|
|
52
56
|
|
|
@@ -213,20 +217,71 @@ To use this feature, install `watchdog`:
|
|
|
213
217
|
|
|
214
218
|
### 3. Secret Management
|
|
215
219
|
|
|
216
|
-
`SecretManager`
|
|
220
|
+
`SecretManager` provides a unified abstraction for managing secrets using a custom chain of providers (`SecretProvider`)
|
|
221
|
+
and automatic fallback logic.
|
|
222
|
+
|
|
223
|
+
By default, `SecretManager` searches for secrets in the following order: **Keyring > .env File > Environment Variables
|
|
224
|
+
**.
|
|
217
225
|
|
|
218
226
|
```python
|
|
219
227
|
from chutils import SecretManager
|
|
220
228
|
|
|
221
229
|
secrets = SecretManager("my_awesome_app")
|
|
222
230
|
|
|
223
|
-
# Save
|
|
231
|
+
# Save secret (will be written to the first writable provider in the chain)
|
|
224
232
|
secrets.save_secret("API_KEY", "secret-value-123")
|
|
225
233
|
|
|
226
|
-
#
|
|
234
|
+
# Retrieve secret
|
|
227
235
|
key = secrets.get_secret("API_KEY")
|
|
228
236
|
```
|
|
229
237
|
|
|
238
|
+
#### Built-in Providers
|
|
239
|
+
|
|
240
|
+
You can configure the providers list explicitly:
|
|
241
|
+
|
|
242
|
+
```python
|
|
243
|
+
from chutils import SecretManager
|
|
244
|
+
from chutils.secret_manager.providers import KeyringProvider, DotEnvProvider, EnvProvider
|
|
245
|
+
|
|
246
|
+
secrets = SecretManager(
|
|
247
|
+
service_name="my_app",
|
|
248
|
+
providers=[
|
|
249
|
+
KeyringProvider(),
|
|
250
|
+
DotEnvProvider(),
|
|
251
|
+
EnvProvider()
|
|
252
|
+
]
|
|
253
|
+
)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
#### Cloud Secret Managers
|
|
257
|
+
|
|
258
|
+
The library supports transparent integration with AWS Secrets Manager and Google Secret Manager:
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
from chutils import SecretManager
|
|
262
|
+
from chutils.secret_manager.providers import AWSSecretManagerProvider, GCPSecretManagerProvider, EnvProvider
|
|
263
|
+
|
|
264
|
+
# Initialize cloud providers (requires installation of chutils[aws,gcp])
|
|
265
|
+
aws_provider = AWSSecretManagerProvider(region_name="us-east-1")
|
|
266
|
+
gcp_provider = GCPSecretManagerProvider(project_id="my-gcp-project")
|
|
267
|
+
|
|
268
|
+
# Create a SecretManager with the chain: AWS -> GCP -> Environment Variables.
|
|
269
|
+
# If AWS or GCP calls fail due to network/permissions or the secret is missing,
|
|
270
|
+
# SecretManager logs a warning and automatically falls back to EnvProvider.
|
|
271
|
+
secrets = SecretManager(
|
|
272
|
+
service_name="my_service",
|
|
273
|
+
providers=[aws_provider, gcp_provider, EnvProvider()]
|
|
274
|
+
)
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Install cloud dependencies:
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
pip install chutils[aws] # For AWS (boto3)
|
|
281
|
+
pip install chutils[gcp] # For GCP (google-cloud-secret-manager)
|
|
282
|
+
pip install chutils[all] # For all optional packages
|
|
283
|
+
```
|
|
284
|
+
|
|
230
285
|
#### Disabling Keyring (Optional)
|
|
231
286
|
|
|
232
287
|
In environments like Docker or CI/CD where `keyring` is unavailable, you can suppress warnings and skip the check:
|
|
@@ -272,6 +327,22 @@ except PathTraversalError as e:
|
|
|
272
327
|
- `get_secret(key, fallback=None, required=False)` / `aget_secret(...)`
|
|
273
328
|
- `delete_secret` / `adelete_secret`
|
|
274
329
|
|
|
330
|
+
### Environment Manifest (`chutils.env`)
|
|
331
|
+
|
|
332
|
+
- `BaseEnvManifest`: Declarative specification of environment variables using Pydantic typing, automatic secret masking,
|
|
333
|
+
and `load()` classmethod.
|
|
334
|
+
|
|
335
|
+
### Data Validation (`chutils.validation`)
|
|
336
|
+
|
|
337
|
+
- `validate_data(model, data)`: Validates dictionaries or JSON strings against Pydantic models, raising
|
|
338
|
+
`ChutilsValidationError`.
|
|
339
|
+
- `@validate_call`: Automatically validates function arguments using Pydantic.
|
|
340
|
+
|
|
341
|
+
### Health Checking (`chutils.diagnostics`)
|
|
342
|
+
|
|
343
|
+
- `DiagnosticsManager`: Registers and аsynchronously executes system health checks with timeouts.
|
|
344
|
+
- Web Framework helpers: `get_fastapi_health_handler` and `get_flask_health_handler`.
|
|
345
|
+
|
|
275
346
|
### Decorators (`chutils.decorators`)
|
|
276
347
|
|
|
277
348
|
- `@log_function_details`: Logs arguments, execution time, and result (uses `DEVDEBUG` level).
|
|
@@ -376,6 +447,21 @@ chutils dev ai-lint --strict --ignore "temp/,build/"
|
|
|
376
447
|
|
|
377
448
|
See [docs/ai_lint.md](docs/ai_lint.md) for more details.
|
|
378
449
|
|
|
450
|
+
### 7. Environment Variables Synchronization
|
|
451
|
+
|
|
452
|
+
Keep `.env` and `.env.example` files in sync with format preservation, comments, and values masking:
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
# Compare .env and .env.example keys without making changes
|
|
456
|
+
chutils dev sync-env --dry-run
|
|
457
|
+
|
|
458
|
+
# Synchronize files automatically
|
|
459
|
+
chutils dev sync-env --yes
|
|
460
|
+
|
|
461
|
+
# Specify custom paths
|
|
462
|
+
chutils dev sync-env --env-path .env.dev --example-path .env.dev.example
|
|
463
|
+
```
|
|
464
|
+
|
|
379
465
|
## License
|
|
380
466
|
|
|
381
467
|
The project is distributed under the MIT License.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
[dependencies]
|
|
2
|
+
# При изменении исходного кода chutils необходимо перегенерировать карту API и семантический индекс
|
|
3
|
+
"src/chutils/**/*.py" = ["api_map.md", "project_index.json"]
|
|
4
|
+
|
|
5
|
+
# ---------------------------------------------------------------------------
|
|
6
|
+
# Модуль config
|
|
7
|
+
# ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
# При изменении любого файла конфигурации — обновить docs/api.md
|
|
10
|
+
"src/chutils/config/**/*.py" = ["docs/api.md"]
|
|
11
|
+
|
|
12
|
+
# При изменении провайдеров конфигурации — обновить специализированную документацию
|
|
13
|
+
"new:src/chutils/config/custom_providers.py" = ["docs/custom_config_providers.md"]
|
|
14
|
+
"src/chutils/config/custom_providers.py" = ["docs/custom_config_providers.md", "docs/api.md"]
|
|
15
|
+
|
|
16
|
+
# ---------------------------------------------------------------------------
|
|
17
|
+
# Модуль logger
|
|
18
|
+
# ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
"src/chutils/logger/**/*.py" = ["docs/api.md"]
|
|
21
|
+
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
# Модуль secret_manager
|
|
24
|
+
# ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
"src/chutils/secret_manager/**/*.py" = ["docs/api.md"]
|
|
27
|
+
|
|
28
|
+
# ---------------------------------------------------------------------------
|
|
29
|
+
# Модуль cache
|
|
30
|
+
# ---------------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
# Изменения кэша влияют на API и рецепты (там есть примеры использования)
|
|
33
|
+
"src/chutils/cache/**/*.py" = ["docs/api.md", "docs/recipes.md"]
|
|
34
|
+
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
# Модуль events (шина событий)
|
|
37
|
+
# ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
"src/chutils/events/**/*.py" = ["docs/api.md"]
|
|
40
|
+
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
# Модуль tasks (планировщик)
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
"src/chutils/tasks/**/*.py" = ["docs/api.md"]
|
|
46
|
+
|
|
47
|
+
# ---------------------------------------------------------------------------
|
|
48
|
+
# Модуль di (Dependency Injection)
|
|
49
|
+
# ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
"src/chutils/di/**/*.py" = ["docs/api.md"]
|
|
52
|
+
|
|
53
|
+
# ---------------------------------------------------------------------------
|
|
54
|
+
# Модуль metrics
|
|
55
|
+
# ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
"src/chutils/metrics/**/*.py" = ["docs/api.md"]
|
|
58
|
+
|
|
59
|
+
# ---------------------------------------------------------------------------
|
|
60
|
+
# Модуль diagnostics (мониторинг работоспособности)
|
|
61
|
+
# ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
"src/chutils/diagnostics/**/*.py" = ["docs/api.md"]
|
|
64
|
+
|
|
65
|
+
# ---------------------------------------------------------------------------
|
|
66
|
+
# Модуль dev (AI-утилиты разработчика)
|
|
67
|
+
# ---------------------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
# При создании нового правила линтера — обновить документацию линтера и CLI
|
|
70
|
+
"new:src/chutils/dev/rules/*.py" = ["docs/ai_lint.md", "docs/cli/dev.md"]
|
|
71
|
+
|
|
72
|
+
# При изменении любого файла dev — обновить docs/ai_lint.md и docs/api.md
|
|
73
|
+
"src/chutils/dev/**/*.py" = ["docs/ai_lint.md", "docs/api.md"]
|
|
74
|
+
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
# Отдельные файлы-модули корневого пакета
|
|
77
|
+
# ---------------------------------------------------------------------------
|
|
78
|
+
|
|
79
|
+
# Декораторы — часто используются в рецептах
|
|
80
|
+
"src/chutils/decorators.py" = ["docs/api.md", "docs/recipes.md"]
|
|
81
|
+
|
|
82
|
+
# Файловая система
|
|
83
|
+
"src/chutils/fs.py" = ["docs/api.md"]
|
|
84
|
+
|
|
85
|
+
# Управление жизненным циклом
|
|
86
|
+
"src/chutils/lifecycle.py" = ["docs/api.md"]
|
|
87
|
+
|
|
88
|
+
# Фича-флаги
|
|
89
|
+
"src/chutils/features.py" = ["docs/api.md"]
|
|
90
|
+
|
|
91
|
+
# Манифест окружения
|
|
92
|
+
"src/chutils/env.py" = ["docs/api.md"]
|
|
93
|
+
|
|
94
|
+
# Валидация данных
|
|
95
|
+
"src/chutils/validation.py" = ["docs/api.md"]
|
|
96
|
+
|
|
97
|
+
# Распределённое трассирование
|
|
98
|
+
"src/chutils/tracing.py" = ["docs/api.md"]
|
|
99
|
+
|
|
100
|
+
# Криптография
|
|
101
|
+
"src/chutils/crypto.py" = ["docs/api.md"]
|
|
102
|
+
|
|
103
|
+
# Работа с БД (влияет также на CLI-документацию db)
|
|
104
|
+
"src/chutils/db.py" = ["docs/api.md", "docs/cli/db.md"]
|
|
105
|
+
|
|
106
|
+
# Работа с текстом
|
|
107
|
+
"src/chutils/text.py" = ["docs/api.md"]
|
|
108
|
+
|
|
109
|
+
# Работа со временем
|
|
110
|
+
"src/chutils/time.py" = ["docs/api.md"]
|
|
111
|
+
|
|
112
|
+
# Контекст выполнения
|
|
113
|
+
"src/chutils/context.py" = ["docs/api.md"]
|
|
114
|
+
|
|
115
|
+
# CLI booster (быстрое создание CLI)
|
|
116
|
+
"src/chutils/cli_booster.py" = ["docs/api.md"]
|
|
117
|
+
|
|
118
|
+
# Исключения
|
|
119
|
+
"src/chutils/exceptions/**/*.py" = ["docs/api.md"]
|
|
120
|
+
|
|
121
|
+
# ---------------------------------------------------------------------------
|
|
122
|
+
# Модули скрейпинга и капчи
|
|
123
|
+
# ---------------------------------------------------------------------------
|
|
124
|
+
|
|
125
|
+
"src/chutils/scraping/**/*.py" = ["docs/scraping.md"]
|
|
126
|
+
"src/chutils/scraping/captcha/**/*.py" = ["docs/captcha.md"]
|
|
127
|
+
|
|
128
|
+
# ---------------------------------------------------------------------------
|
|
129
|
+
# Модуль аудита
|
|
130
|
+
# ---------------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
"src/chutils/audit/**/*.py" = ["docs/audit.md"]
|
|
133
|
+
|
|
134
|
+
# ---------------------------------------------------------------------------
|
|
135
|
+
# Система плагинов
|
|
136
|
+
# ---------------------------------------------------------------------------
|
|
137
|
+
|
|
138
|
+
"src/chutils/plugins/**/*.py" = ["docs/plugins.md"]
|
|
139
|
+
|
|
140
|
+
# ---------------------------------------------------------------------------
|
|
141
|
+
# Модуль тестирования
|
|
142
|
+
# ---------------------------------------------------------------------------
|
|
143
|
+
|
|
144
|
+
"src/chutils/testing/**/*.py" = ["docs/testing.md"]
|
|
145
|
+
|
|
146
|
+
# ---------------------------------------------------------------------------
|
|
147
|
+
# HTTP-клиент
|
|
148
|
+
# ---------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
"src/chutils/web/**/*.py" = ["docs/web.md"]
|
|
151
|
+
|
|
152
|
+
# ---------------------------------------------------------------------------
|
|
153
|
+
# CLI команды
|
|
154
|
+
# ---------------------------------------------------------------------------
|
|
155
|
+
|
|
156
|
+
"src/chutils/commands/dev/**/*.py" = ["docs/cli/dev.md"]
|
|
157
|
+
"src/chutils/commands/env.py" = ["docs/cli/env.md"]
|
|
158
|
+
"src/chutils/commands/secrets.py" = ["docs/cli/secrets.md"]
|
|
159
|
+
"src/chutils/commands/config.py" = ["docs/cli/config.md"]
|
|
160
|
+
"src/chutils/commands/init.py" = ["docs/cli/init.md"]
|
|
161
|
+
"src/chutils/commands/paths.py" = ["docs/cli/show_paths.md"]
|
|
162
|
+
"src/chutils/commands/pypi.py" = ["docs/cli/pypi.md"]
|
|
163
|
+
"src/chutils/commands/template.py" = ["docs/cli/template.md"]
|
|
164
|
+
"src/chutils/commands/validate.py" = ["docs/cli/validate.md"]
|
|
165
|
+
"src/chutils/commands/db.py" = ["docs/cli/db.md"]
|
|
166
|
+
|
|
167
|
+
# ---------------------------------------------------------------------------
|
|
168
|
+
# Корневые файлы проекта
|
|
169
|
+
# ---------------------------------------------------------------------------
|
|
170
|
+
|
|
171
|
+
# При обновлении зависимостей — синхронизировать docs/dependencies.md
|
|
172
|
+
"pyproject.toml" = ["docs/dependencies.md"]
|
|
173
|
+
|
|
174
|
+
# Взаимная зависимость README (рус/англ)
|
|
175
|
+
"README.md" = ["docs/README_RU.md"]
|
|
176
|
+
"docs/README_RU.md" = ["README.md"]
|