chutils 3.0.0__tar.gz → 3.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chutils-3.1.0/.gitignore +185 -0
- {chutils-3.0.0 → chutils-3.1.0}/GEMINI.md +1 -0
- {chutils-3.0.0 → chutils-3.1.0}/PKG-INFO +37 -2
- {chutils-3.0.0 → chutils-3.1.0}/README.md +36 -1
- chutils-3.1.0/ai-lint.toml +33 -0
- chutils-3.1.0/api_map.md +185 -0
- {chutils-3.0.0 → chutils-3.1.0}/benchmarks/cold_start.py +10 -1
- chutils-3.1.0/conductor/.gitignore +1 -0
- chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/index.md +5 -0
- chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/metadata.json +8 -0
- chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/plan.md +15 -0
- chutils-3.1.0/conductor/archive/ai_lint_code_decomposition_20260715/spec.md +23 -0
- chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/index.md +5 -0
- chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/metadata.json +8 -0
- chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/plan.md +16 -0
- chutils-3.1.0/conductor/archive/ai_lint_file_dependencies_sync_20260715/spec.md +30 -0
- chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/index.md +5 -0
- chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/metadata.json +8 -0
- chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/plan.md +16 -0
- chutils-3.1.0/conductor/archive/ai_lint_staged_20260715/spec.md +23 -0
- chutils-3.1.0/conductor/archive/context_metadata_20260714/index.md +5 -0
- chutils-3.1.0/conductor/archive/context_metadata_20260714/metadata.json +8 -0
- chutils-3.1.0/conductor/archive/context_metadata_20260714/plan.md +19 -0
- chutils-3.1.0/conductor/archive/context_metadata_20260714/spec.md +31 -0
- chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/index.md +5 -0
- chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/metadata.json +8 -0
- chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/plan.md +33 -0
- chutils-3.1.0/conductor/archive/pypi_mirror_check_20260713/spec.md +35 -0
- chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/index.md +5 -0
- chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/metadata.json +8 -0
- chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/plan.md +38 -0
- chutils-3.1.0/conductor/archive/refactor_cli_dev_20260715/spec.md +44 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/sync_env_20260707/plan.md +28 -28
- {chutils-3.0.0 → chutils-3.1.0}/conductor/product.md +10 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tech-stack.md +14 -4
- chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/index.md +5 -0
- chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/metadata.json +8 -0
- chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/plan.md +47 -0
- chutils-3.1.0/conductor/tracks/ai_manifests_few_shot_20260713/spec.md +111 -0
- chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/index.md +5 -0
- chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/metadata.json +8 -0
- chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/plan.md +17 -0
- chutils-3.1.0/conductor/tracks/cache_invalidation_20260714/spec.md +28 -0
- chutils-3.1.0/conductor/tracks/cloud_secret_managers_20260511/plan.md +36 -0
- chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/index.md +5 -0
- chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/metadata.json +8 -0
- chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/plan.md +18 -0
- chutils-3.1.0/conductor/tracks/custom_config_providers_20260714/spec.md +24 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/http_20260702/spec.md +8 -1
- chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/index.md +5 -0
- chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/metadata.json +8 -0
- chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/plan.md +28 -0
- chutils-3.1.0/conductor/tracks/setup_github_actions_20260714/spec.md +27 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks.md +18 -31
- {chutils-3.0.0 → chutils-3.1.0}/docs/INTEGRATION_AI.md +10 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/README_RU.md +36 -1
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_lint.md +52 -3
- {chutils-3.0.0 → chutils-3.1.0}/docs/api.md +31 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/captcha.md +2 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/dev.md +66 -11
- chutils-3.1.0/docs/cli/env.md +62 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/index.md +2 -0
- chutils-3.1.0/docs/cli/pypi.md +121 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/dependencies.md +4 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/index.md +9 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/recipes.md +287 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/scraping.md +2 -0
- {chutils-3.0.0 → chutils-3.1.0}/mkdocs.yml +2 -0
- {chutils-3.0.0 → chutils-3.1.0}/project_index.json +8550 -5684
- {chutils-3.0.0 → chutils-3.1.0}/pyproject.toml +12 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/__init__.py +16 -3
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/__init__.pyi +8 -1
- chutils-3.1.0/src/chutils/antigravity.md +6 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cache/base.py +28 -4
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cache/in_memory.py +57 -8
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cache/utils.py +28 -4
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cli.py +1 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cli_booster.py +9 -3
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cli_utils.py +39 -7
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/__init__.py +9 -5
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/base.py +1 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/config.py +20 -3
- chutils-3.1.0/src/chutils/commands/dev/__init__.py +437 -0
- chutils-3.1.0/src/chutils/commands/dev/ai_lint.py +101 -0
- chutils-3.1.0/src/chutils/commands/dev/base.py +40 -0
- chutils-3.1.0/src/chutils/commands/dev/chat_context.py +100 -0
- chutils-3.1.0/src/chutils/commands/dev/diagnostics.py +109 -0
- chutils-3.1.0/src/chutils/commands/dev/few_shot.py +55 -0
- chutils-3.1.0/src/chutils/commands/dev/generate_context.py +355 -0
- chutils-3.1.0/src/chutils/commands/dev/hooks.py +185 -0
- chutils-3.1.0/src/chutils/commands/dev/mock.py +87 -0
- chutils-3.1.0/src/chutils/commands/dev/scaffold.py +72 -0
- chutils-3.1.0/src/chutils/commands/dev/sync_env.py +157 -0
- chutils-3.1.0/src/chutils/commands/env.py +191 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/init.py +10 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/paths.py +10 -1
- chutils-3.1.0/src/chutils/commands/pypi.py +426 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/secrets.py +25 -4
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/template.py +10 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/validate.py +10 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/__init__.py +4 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/ast_fallback_parser.py +14 -4
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/core.py +4 -4
- chutils-3.1.0/src/chutils/config/dev.py +296 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/diagnostics.py +18 -4
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/generator.py +23 -6
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/getters.py +85 -47
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/manager.py +5 -5
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/providers.py +86 -7
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/schema.py +3 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/utils.py +7 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/watcher.py +12 -3
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/context.py +26 -6
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/crypto.py +2 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/decorators.py +83 -3
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/dev/__init__.py +3 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/dev/ai_lint.py +74 -5
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/dev/ast_indexer.py +47 -3
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/dev/chat_context.py +97 -11
- chutils-3.1.0/src/chutils/dev/constants.py +13 -0
- chutils-3.1.0/src/chutils/dev/env_parser.py +227 -0
- chutils-3.1.0/src/chutils/dev/env_sync.py +113 -0
- chutils-3.1.0/src/chutils/dev/few_shot/__init__.py +113 -0
- chutils-3.1.0/src/chutils/dev/few_shot/detector.py +225 -0
- chutils-3.1.0/src/chutils/dev/few_shot/models.py +61 -0
- chutils-3.1.0/src/chutils/dev/few_shot/renderer.py +455 -0
- chutils-3.1.0/src/chutils/dev/few_shot/writer.py +302 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/dev/mock_server.py +49 -7
- chutils-3.1.0/src/chutils/dev/models/__init__.py +17 -0
- chutils-3.1.0/src/chutils/dev/models/base.py +35 -0
- chutils-3.1.0/src/chutils/dev/models/index.py +34 -0
- chutils-3.1.0/src/chutils/dev/models/node.py +19 -0
- chutils-3.1.0/src/chutils/dev/models/symbol.py +21 -0
- chutils-3.1.0/src/chutils/dev/project_metadata.py +195 -0
- chutils-3.1.0/src/chutils/dev/rules/__init__.py +20 -0
- chutils-3.1.0/src/chutils/dev/rules/api_map.py +439 -0
- chutils-3.1.0/src/chutils/dev/rules/decomposition.py +96 -0
- chutils-3.1.0/src/chutils/dev/rules/dependency_sync.py +256 -0
- chutils-3.1.0/src/chutils/dev/rules/docstring.py +210 -0
- chutils-3.1.0/src/chutils/dev/rules/env.py +111 -0
- chutils-3.1.0/src/chutils/dev/rules/integration.py +263 -0
- chutils-3.1.0/src/chutils/dev/rules/manifest.py +74 -0
- chutils-3.1.0/src/chutils/dev/rules/security.py +99 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/dev/scaffold.py +425 -410
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/di/container.py +35 -9
- chutils-3.1.0/src/chutils/diagnostics/__init__.py +24 -0
- chutils-3.1.0/src/chutils/diagnostics/manager.py +254 -0
- chutils-3.1.0/src/chutils/diagnostics/models.py +98 -0
- chutils-3.1.0/src/chutils/diagnostics/web.py +79 -0
- chutils-3.1.0/src/chutils/env.py +194 -0
- chutils-3.1.0/src/chutils/env.pyi +34 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/events/core.py +9 -2
- chutils-3.1.0/src/chutils/exceptions/__init__.py +73 -0
- chutils-3.1.0/src/chutils/exceptions/base.py +66 -0
- chutils-3.1.0/src/chutils/exceptions/cache.py +7 -0
- chutils-3.1.0/src/chutils/exceptions/config.py +52 -0
- chutils-3.1.0/src/chutils/exceptions/di.py +19 -0
- chutils-3.1.0/src/chutils/exceptions/events.py +34 -0
- chutils-3.1.0/src/chutils/exceptions/logger.py +7 -0
- chutils-3.1.0/src/chutils/exceptions/resilience.py +13 -0
- chutils-3.1.0/src/chutils/exceptions/secrets.py +19 -0
- chutils-3.1.0/src/chutils/exceptions/system.py +44 -0
- chutils-3.1.0/src/chutils/exceptions/validation.py +148 -0
- chutils-3.1.0/src/chutils/exceptions/watcher.py +7 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/features.py +2 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/fs.py +5 -5
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/lifecycle.py +10 -5
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/core.py +1 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/formatters.py +8 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/internal/levels.py +13 -5
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/internal/utils.py +11 -6
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/masking.py +2 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/metrics/__init__.py +31 -14
- chutils-3.1.0/src/chutils/metrics/base.py +56 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/metrics/in_memory.py +32 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/metrics/prometheus.py +27 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/metrics/timer.py +22 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/plugins/core.py +36 -9
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/plugins/interfaces.py +20 -6
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/captcha/__init__.py +18 -28
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/captcha/anticaptcha.py +281 -227
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/captcha/base.py +10 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/captcha/capmonster.py +281 -227
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/captcha/rucaptcha.py +299 -245
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/humanize/actions.py +70 -8
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/humanize/antidetect.py +15 -3
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/humanize/math_utils.py +15 -1
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/secret_manager/core.py +68 -15
- chutils-3.1.0/src/chutils/secret_manager/providers/__init__.py +34 -0
- chutils-3.1.0/src/chutils/secret_manager/providers/base.py +51 -0
- chutils-3.1.0/src/chutils/secret_manager/providers/dotenv.py +91 -0
- chutils-3.1.0/src/chutils/secret_manager/providers/env.py +54 -0
- chutils-3.1.0/src/chutils/secret_manager/providers/keyring_provider.py +124 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/tasks/core.py +67 -10
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/time.py +2 -2
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/tracing.py +3 -0
- chutils-3.1.0/src/chutils/validation.py +138 -0
- chutils-3.1.0/src/chutils/validation.pyi +13 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/web/client.py +43 -4
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_dev.py +9 -4
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_dev_cmd.py +135 -4
- chutils-3.1.0/tests/unit/cli/test_cli_pypi.py +426 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_dev.py +3 -1
- chutils-3.1.0/tests/unit/config/test_config_validation_group.py +42 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/decorators/test_decorator_circuit_breaker.py +45 -0
- chutils-3.1.0/tests/unit/dev/test_ai_lint.py +734 -0
- chutils-3.1.0/tests/unit/dev/test_ai_lint_staged.py +129 -0
- chutils-3.1.0/tests/unit/dev/test_env_parser.py +152 -0
- chutils-3.1.0/tests/unit/dev/test_env_sync.py +49 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/dev/test_generate_few_shot.py +69 -31
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/tasks/test_scheduler.py +59 -0
- chutils-3.1.0/tests/unit/test_diagnostics.py +367 -0
- chutils-3.1.0/tests/unit/test_env.py +261 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_install_hooks.py +25 -0
- chutils-3.1.0/tests/unit/test_minimal_imports.py +84 -0
- chutils-3.1.0/tests/unit/test_validation.py +242 -0
- {chutils-3.0.0 → chutils-3.1.0}/uv.lock +1 -1
- 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/tracks/cloud_secret_managers_20260511/plan.md +0 -44
- chutils-3.0.0/conductor/tracks/plan.md +0 -1
- 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/test_minimal_imports.py +0 -75
- {chutils-3.0.0 → chutils-3.1.0}/.gitattributes +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/.github/workflows/ci.yml +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/.github/workflows/publish-docs.yml +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/CODE_OF_CONDUCT.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/CONTRIBUTING.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/LICENSE +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/GEMINI.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/ai_lint_inline_ignore_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/ai_lint_inline_ignore_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/ai_lint_inline_ignore_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/ai_lint_inline_ignore_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/captcha_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/captcha_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/captcha_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/captcha_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/chat_context_20260610/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/chat_context_20260610/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/chat_context_20260610/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/chat_context_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/circuit_breaker_20260521/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/circuit_breaker_20260521/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/circuit_breaker_20260521/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/circuit_breaker_20260521/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/cli_scaffold_20260610/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/cli_scaffold_20260610/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/cli_scaffold_20260610/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/cli_scaffold_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/config_required_20260708/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/config_required_20260708/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/config_required_20260708/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/config_required_20260708/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dependency_errors_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dependency_errors_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dependency_errors_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dependency_errors_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dev_install_hooks_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dev_install_hooks_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dev_install_hooks_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/dev_install_hooks_20260707/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/diagnostics_20260610/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/diagnostics_20260610/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/diagnostics_20260610/plan.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/diagnostics_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/drop_python39_20260610/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/drop_python39_20260610/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/drop_python39_20260610/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/drop_python39_20260610/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/env_20260702/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/env_20260702/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/env_20260702/plan.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/env_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/exception_groups_20260708/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/exception_groups_20260708/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/exception_groups_20260708/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/exception_groups_20260708/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/generate_few_shot_20260610/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/generate_few_shot_20260610/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/generate_few_shot_20260610/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/generate_few_shot_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/mock_server_20260610/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/mock_server_20260610/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/mock_server_20260610/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/mock_server_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/optional_dependencies_20260515/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/optional_dependencies_20260515/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/optional_dependencies_20260515/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/optional_dependencies_20260515/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/scraping_humanize_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/scraping_humanize_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/scraping_humanize_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/scraping_humanize_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/secrets_unification_20260708/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/secrets_unification_20260708/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/secrets_unification_20260708/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/secrets_unification_20260708/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/sync_env_20260707/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/sync_env_20260707/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/sync_env_20260707/spec.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/validation_20260702/index.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/validation_20260702/metadata.json +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/validation_20260702/plan.md +0 -0
- {chutils-3.0.0/conductor/tracks → chutils-3.1.0/conductor/archive}/validation_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/web_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/web_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/web_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/archive/web_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/code_styleguides/python.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/product-guidelines.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/setup_state.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/audit_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/audit_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/audit_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/audit_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/bulkhead_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/bulkhead_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/bulkhead_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/bulkhead_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/cloud_secret_managers_20260511/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/cloud_secret_managers_20260511/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/cloud_secret_managers_20260511/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/config_remote_push_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/config_remote_push_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/config_remote_push_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/config_remote_push_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_manager_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_manager_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_manager_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_manager_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_migrations_cli_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_migrations_cli_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_migrations_cli_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/db_migrations_cli_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_clean_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_clean_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_clean_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_clean_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_dashboard_20260610/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_dashboard_20260610/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_dashboard_20260610/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_dashboard_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_watch_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_watch_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_watch_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/dev_watch_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/docstring_audit_20260521/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/docstring_audit_20260521/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/docstring_audit_20260521/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/docstring_audit_20260521/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/fallback_alias_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/fallback_alias_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/fallback_alias_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/fallback_alias_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/http_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/http_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/http_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/profile_imports_20260610/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/profile_imports_20260610/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/profile_imports_20260610/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/profile_imports_20260610/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_integration_20260521/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_integration_20260521/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_integration_20260521/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_integration_20260521/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_typed_signals_20260521/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_typed_signals_20260521/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_typed_signals_20260521/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/qt_typed_signals_20260521/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/scraping_concurrency_20260707/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/scraping_concurrency_20260707/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/scraping_concurrency_20260707/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/scraping_concurrency_20260707/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/store_20260702/index.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/store_20260702/metadata.json +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/store_20260702/plan.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/tracks/store_20260702/spec.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/conductor/workflow.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/CODE_OF_CONDUCT_RU.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/CONTRIBUTING_RU.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/README.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/configuration/README.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/configuration/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/configuration/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/error_handling/README.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/error_handling/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/error_handling/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/logging/README.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/logging/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/logging/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/optional_deps/README.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/optional_deps/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/optional_deps/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/secrets/README.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/secrets/bad_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_examples/secrets/good_pattern.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/ai_hints.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/config.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/init.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/secrets.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/show_paths.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/template.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/cli/validate.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/migration.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/plugins.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/testing.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/docs/web.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/.env +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/01_configuration.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/02_logging.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/03_secrets.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/04_full_example.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/05_different_log_levels.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/06_local_config_override.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/07_decorators_example.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/08_multiple_loggers_example.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/09_disable_keyring.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/10_universal_env_override.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/11_retry_decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/12_secret_masking.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/13_pydantic_validation.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/15_context_logging.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/17_timeout_decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/18_config_hot_reload.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/19_remote_config.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/20_opentelemetry_tracing.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/21_config_diagnostics.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/22_circuit_breaker_decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/22_safe_path_resolution.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/23_event_bus.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/24_task_scheduler.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/25_testing_fixtures_example.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/26_metrics_prometheus.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/27_rate_limiting.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/28_dependency_injection.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/captcha_solvers_usage.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/config.yml +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/scraping_humanize_usage.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/examples/web_client_usage.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/__main__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cache/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/cache/decorator.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/commands/utils.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/config/GEMINI.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/di/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/events/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/GEMINI.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/handlers.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/logger/internal/builder.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/plugins/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/captcha/exceptions.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/scraping/humanize/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/secret_manager/GEMINI.md +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/secret_manager/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/tasks/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/testing/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/testing/fixtures.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/text.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/typing.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/web/__init__.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/web/proxy_pool.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/src/chutils/web/user_agent.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/conftest.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_ai_lint_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_cli_e2e.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_event_loops.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_examples.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_hooks_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_masking_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_otel_tracing.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/integration/test_remote_config_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/manual/manual_test_cli_booster.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/conftest.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_booster.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_config.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_config_cmd.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_config_schema.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_dev_tree.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_diagnostics.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_extras_suggestion.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_init.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_paths.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_rich.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_rich_width.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_secrets.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_template.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_utils_internal.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/cli/test_cli_validate.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_ast_parser.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_diagnostics.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_env.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_env_loading.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_generator.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_json.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_pydantic.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_required.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_schema.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_tracing.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_universal_env.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_utils.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_config_watcher.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_priority_unification.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/config/test_remote_config.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_ast_indexer.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_ast_indexer_abstract.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_ast_indexer_graph.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_ast_indexer_layers.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_ast_indexer_metadata.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_cache.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_dev_models.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_exceptions.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_features.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_fs.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_lifecycle.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_thread_safety.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/core/test_time.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/decorators/test_decorator_retry.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/decorators/test_decorator_timeout.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/decorators/test_decorators.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/decorators/test_rate_limit.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/dev/test_chat_context.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/dev/test_mock_server.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/dev/test_scaffold.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/di/test_di.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/events/test_event_bus.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/conftest.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_basics.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_compression.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_config_sections.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_configuration.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_context.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_env_control.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_files.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_json_format.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_logger_rich_width.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_masking.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_performance_security.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_rich.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/logger/test_rotation.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/metrics/test_metrics.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/plugins/test_integration.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/plugins/test_interfaces.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/plugins/test_plugins.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/secret_manager/test_secret_manager.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/secret_manager/test_secret_manager_env.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/secret_manager/test_secret_manager_providers.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/secret_manager/test_secrets_required.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_ai_lint_ignore.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_anticaptcha.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_antidetect.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_async_web_client.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_capmonster.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_captcha_base.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_captcha_imports.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_crypto.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_crypto_dependencies.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_events_exception_group.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_humanize_math.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_playwright_humanize.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_proxy_pool.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_rucaptcha.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_scraping_imports.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_selenium_humanize.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_text.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_text_dependencies.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_user_agent.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_web_client.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/test_web_imports.py +0 -0
- {chutils-3.0.0 → chutils-3.1.0}/tests/unit/testing/test_fixtures.py +0 -0
chutils-3.1.0/.gitignore
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py,cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
#Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
#uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
#poetry.lock
|
|
109
|
+
|
|
110
|
+
# pdm
|
|
111
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
112
|
+
#pdm.lock
|
|
113
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
114
|
+
# in version control.
|
|
115
|
+
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
|
116
|
+
.pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
121
|
+
__pypackages__/
|
|
122
|
+
|
|
123
|
+
# Celery stuff
|
|
124
|
+
celerybeat-schedule
|
|
125
|
+
celerybeat.pid
|
|
126
|
+
|
|
127
|
+
# SageMath parsed files
|
|
128
|
+
*.sage.py
|
|
129
|
+
|
|
130
|
+
# Environments
|
|
131
|
+
.env
|
|
132
|
+
.venv
|
|
133
|
+
env/
|
|
134
|
+
venv/
|
|
135
|
+
ENV/
|
|
136
|
+
env.bak/
|
|
137
|
+
venv.bak/
|
|
138
|
+
!examples/.env
|
|
139
|
+
|
|
140
|
+
# Spyder project settings
|
|
141
|
+
.spyderproject
|
|
142
|
+
.spyproject
|
|
143
|
+
|
|
144
|
+
# Rope project settings
|
|
145
|
+
.ropeproject
|
|
146
|
+
|
|
147
|
+
# mkdocs documentation
|
|
148
|
+
/site
|
|
149
|
+
|
|
150
|
+
# mypy
|
|
151
|
+
.mypy_cache/
|
|
152
|
+
.dmypy.json
|
|
153
|
+
dmypy.json
|
|
154
|
+
|
|
155
|
+
# Pyre type checker
|
|
156
|
+
.pyre/
|
|
157
|
+
|
|
158
|
+
# pytype static type analyzer
|
|
159
|
+
.pytype/
|
|
160
|
+
|
|
161
|
+
# Cython debug symbols
|
|
162
|
+
cython_debug/
|
|
163
|
+
|
|
164
|
+
# PyCharm
|
|
165
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
166
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
167
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
168
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
169
|
+
.idea/
|
|
170
|
+
|
|
171
|
+
# Ruff stuff:
|
|
172
|
+
.ruff_cache/
|
|
173
|
+
|
|
174
|
+
# PyPI configuration file
|
|
175
|
+
.pypirc
|
|
176
|
+
|
|
177
|
+
# Project-specific documentation
|
|
178
|
+
PUBLISHING.md
|
|
179
|
+
project.txt
|
|
180
|
+
changelog.txt
|
|
181
|
+
*.log.*
|
|
182
|
+
*.log
|
|
183
|
+
|
|
184
|
+
# Local chutils cache
|
|
185
|
+
.chutils/
|
|
@@ -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.1.0
|
|
4
4
|
Summary: Набор простых и удобных утилит для Python, который избавляет от рутины при работе с конфигурацией и логированием в новых проектах.
|
|
5
5
|
Author-email: Chu4hel <sergeiivanov636@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -107,7 +107,11 @@ Every time you start a new project, you have to solve the same tasks:
|
|
|
107
107
|
- **🛡️ Secure Paths:** Prevent Path Traversal attacks by safely resolving file paths against a base directory using
|
|
108
108
|
`resolve_safe_path()`.
|
|
109
109
|
- **🤖 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`.
|
|
110
|
+
docstrings, API map sync, and file dependency synchronization) via `chutils dev ai-lint`.
|
|
111
|
+
- **✅ Data Validation (chutils.validation):** An all-in-one Pydantic-based data and JSON validation module featuring
|
|
112
|
+
`@validate_call` decorator for function argument checks and rich exception formatting.
|
|
113
|
+
- **🩺 Diagnostics API (chutils.diagnostics):** An asynchronous, thread-safe health checking framework with built-in
|
|
114
|
+
checks (keyring, config) and integrations for popular web frameworks (FastAPI, Flask).
|
|
111
115
|
- **⚡ Async Ready:** Most core functions have asynchronous versions (prefixed with `a`) for non-blocking execution.
|
|
112
116
|
- **🚀 Ready to Use:** Just install and use.
|
|
113
117
|
|
|
@@ -333,6 +337,22 @@ except PathTraversalError as e:
|
|
|
333
337
|
- `get_secret(key, fallback=None, required=False)` / `aget_secret(...)`
|
|
334
338
|
- `delete_secret` / `adelete_secret`
|
|
335
339
|
|
|
340
|
+
### Environment Manifest (`chutils.env`)
|
|
341
|
+
|
|
342
|
+
- `BaseEnvManifest`: Declarative specification of environment variables using Pydantic typing, automatic secret masking,
|
|
343
|
+
and `load()` classmethod.
|
|
344
|
+
|
|
345
|
+
### Data Validation (`chutils.validation`)
|
|
346
|
+
|
|
347
|
+
- `validate_data(model, data)`: Validates dictionaries or JSON strings against Pydantic models, raising
|
|
348
|
+
`ChutilsValidationError`.
|
|
349
|
+
- `@validate_call`: Automatically validates function arguments using Pydantic.
|
|
350
|
+
|
|
351
|
+
### Health Checking (`chutils.diagnostics`)
|
|
352
|
+
|
|
353
|
+
- `DiagnosticsManager`: Registers and аsynchronously executes system health checks with timeouts.
|
|
354
|
+
- Web Framework helpers: `get_fastapi_health_handler` and `get_flask_health_handler`.
|
|
355
|
+
|
|
336
356
|
### Decorators (`chutils.decorators`)
|
|
337
357
|
|
|
338
358
|
- `@log_function_details`: Logs arguments, execution time, and result (uses `DEVDEBUG` level).
|
|
@@ -437,6 +457,21 @@ chutils dev ai-lint --strict --ignore "temp/,build/"
|
|
|
437
457
|
|
|
438
458
|
See [docs/ai_lint.md](docs/ai_lint.md) for more details.
|
|
439
459
|
|
|
460
|
+
### 7. Environment Variables Synchronization
|
|
461
|
+
|
|
462
|
+
Keep `.env` and `.env.example` files in sync with format preservation, comments, and values masking:
|
|
463
|
+
|
|
464
|
+
```bash
|
|
465
|
+
# Compare .env and .env.example keys without making changes
|
|
466
|
+
chutils dev sync-env --dry-run
|
|
467
|
+
|
|
468
|
+
# Synchronize files automatically
|
|
469
|
+
chutils dev sync-env --yes
|
|
470
|
+
|
|
471
|
+
# Specify custom paths
|
|
472
|
+
chutils dev sync-env --env-path .env.dev --example-path .env.dev.example
|
|
473
|
+
```
|
|
474
|
+
|
|
440
475
|
## License
|
|
441
476
|
|
|
442
477
|
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
|
|
|
@@ -272,6 +276,22 @@ except PathTraversalError as e:
|
|
|
272
276
|
- `get_secret(key, fallback=None, required=False)` / `aget_secret(...)`
|
|
273
277
|
- `delete_secret` / `adelete_secret`
|
|
274
278
|
|
|
279
|
+
### Environment Manifest (`chutils.env`)
|
|
280
|
+
|
|
281
|
+
- `BaseEnvManifest`: Declarative specification of environment variables using Pydantic typing, automatic secret masking,
|
|
282
|
+
and `load()` classmethod.
|
|
283
|
+
|
|
284
|
+
### Data Validation (`chutils.validation`)
|
|
285
|
+
|
|
286
|
+
- `validate_data(model, data)`: Validates dictionaries or JSON strings against Pydantic models, raising
|
|
287
|
+
`ChutilsValidationError`.
|
|
288
|
+
- `@validate_call`: Automatically validates function arguments using Pydantic.
|
|
289
|
+
|
|
290
|
+
### Health Checking (`chutils.diagnostics`)
|
|
291
|
+
|
|
292
|
+
- `DiagnosticsManager`: Registers and аsynchronously executes system health checks with timeouts.
|
|
293
|
+
- Web Framework helpers: `get_fastapi_health_handler` and `get_flask_health_handler`.
|
|
294
|
+
|
|
275
295
|
### Decorators (`chutils.decorators`)
|
|
276
296
|
|
|
277
297
|
- `@log_function_details`: Logs arguments, execution time, and result (uses `DEVDEBUG` level).
|
|
@@ -376,6 +396,21 @@ chutils dev ai-lint --strict --ignore "temp/,build/"
|
|
|
376
396
|
|
|
377
397
|
See [docs/ai_lint.md](docs/ai_lint.md) for more details.
|
|
378
398
|
|
|
399
|
+
### 7. Environment Variables Synchronization
|
|
400
|
+
|
|
401
|
+
Keep `.env` and `.env.example` files in sync with format preservation, comments, and values masking:
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
# Compare .env and .env.example keys without making changes
|
|
405
|
+
chutils dev sync-env --dry-run
|
|
406
|
+
|
|
407
|
+
# Synchronize files automatically
|
|
408
|
+
chutils dev sync-env --yes
|
|
409
|
+
|
|
410
|
+
# Specify custom paths
|
|
411
|
+
chutils dev sync-env --env-path .env.dev --example-path .env.dev.example
|
|
412
|
+
```
|
|
413
|
+
|
|
379
414
|
## License
|
|
380
415
|
|
|
381
416
|
The project is distributed under the MIT License.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
[dependencies]
|
|
2
|
+
# При изменении исходного кода chutils необходимо перегенерировать карту API и семантический индекс
|
|
3
|
+
"src/chutils/**/*.py" = ["api_map.md", "project_index.json"]
|
|
4
|
+
|
|
5
|
+
# При создании новых правил линтера необходимо дополнить документацию по линтеру и командам разработчика
|
|
6
|
+
"new:src/chutils/dev/rules/*.py" = ["docs/ai_lint.md", "docs/cli/dev.md"]
|
|
7
|
+
|
|
8
|
+
# При изменении CLI команд необходимо обновить соответствующее руководство
|
|
9
|
+
"src/chutils/commands/dev/**/*.py" = ["docs/cli/dev.md"]
|
|
10
|
+
"src/chutils/commands/env.py" = ["docs/cli/env.md"]
|
|
11
|
+
"src/chutils/commands/secrets.py" = ["docs/cli/secrets.md"]
|
|
12
|
+
"src/chutils/commands/config.py" = ["docs/cli/config.md"]
|
|
13
|
+
"src/chutils/commands/init.py" = ["docs/cli/init.md"]
|
|
14
|
+
"src/chutils/commands/paths.py" = ["docs/cli/show_paths.md"]
|
|
15
|
+
"src/chutils/commands/pypi.py" = ["docs/cli/pypi.md"]
|
|
16
|
+
"src/chutils/commands/template.py" = ["docs/cli/template.md"]
|
|
17
|
+
"src/chutils/commands/validate.py" = ["docs/cli/validate.md"]
|
|
18
|
+
|
|
19
|
+
# При изменении модулей веб-скрейпинга и капчи
|
|
20
|
+
"src/chutils/scraping/**/*.py" = ["docs/scraping.md"]
|
|
21
|
+
"src/chutils/scraping/captcha/**/*.py" = ["docs/captcha.md"]
|
|
22
|
+
|
|
23
|
+
# При изменении HTTP-клиента
|
|
24
|
+
"src/chutils/web/**/*.py" = ["docs/web.md"]
|
|
25
|
+
|
|
26
|
+
# При изменении системы плагинов
|
|
27
|
+
"src/chutils/plugins/**/*.py" = ["docs/plugins.md"]
|
|
28
|
+
|
|
29
|
+
# При изменении фикстур тестирования
|
|
30
|
+
"src/chutils/testing/**/*.py" = ["docs/testing.md"]
|
|
31
|
+
|
|
32
|
+
# При обновлении пакетов и зависимостей в pyproject.toml
|
|
33
|
+
"pyproject.toml" = ["docs/dependencies.md"]
|