crackerjack 0.18.2__py3-none-any.whl → 0.45.2__py3-none-any.whl
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.
- crackerjack/README.md +19 -0
- crackerjack/__init__.py +96 -2
- crackerjack/__main__.py +637 -138
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +39 -0
- crackerjack/adapters/_output_paths.py +167 -0
- crackerjack/adapters/_qa_adapter_base.py +309 -0
- crackerjack/adapters/_tool_adapter_base.py +706 -0
- crackerjack/adapters/ai/README.md +65 -0
- crackerjack/adapters/ai/__init__.py +5 -0
- crackerjack/adapters/ai/claude.py +853 -0
- crackerjack/adapters/complexity/README.md +53 -0
- crackerjack/adapters/complexity/__init__.py +10 -0
- crackerjack/adapters/complexity/complexipy.py +641 -0
- crackerjack/adapters/dependency/__init__.py +22 -0
- crackerjack/adapters/dependency/pip_audit.py +418 -0
- crackerjack/adapters/format/README.md +72 -0
- crackerjack/adapters/format/__init__.py +11 -0
- crackerjack/adapters/format/mdformat.py +313 -0
- crackerjack/adapters/format/ruff.py +516 -0
- crackerjack/adapters/lint/README.md +47 -0
- crackerjack/adapters/lint/__init__.py +11 -0
- crackerjack/adapters/lint/codespell.py +273 -0
- crackerjack/adapters/lsp/README.md +49 -0
- crackerjack/adapters/lsp/__init__.py +27 -0
- crackerjack/adapters/lsp/_base.py +194 -0
- crackerjack/adapters/lsp/_client.py +358 -0
- crackerjack/adapters/lsp/_manager.py +193 -0
- crackerjack/adapters/lsp/skylos.py +283 -0
- crackerjack/adapters/lsp/zuban.py +557 -0
- crackerjack/adapters/refactor/README.md +59 -0
- crackerjack/adapters/refactor/__init__.py +12 -0
- crackerjack/adapters/refactor/creosote.py +318 -0
- crackerjack/adapters/refactor/refurb.py +406 -0
- crackerjack/adapters/refactor/skylos.py +494 -0
- crackerjack/adapters/sast/README.md +132 -0
- crackerjack/adapters/sast/__init__.py +32 -0
- crackerjack/adapters/sast/_base.py +201 -0
- crackerjack/adapters/sast/bandit.py +423 -0
- crackerjack/adapters/sast/pyscn.py +405 -0
- crackerjack/adapters/sast/semgrep.py +241 -0
- crackerjack/adapters/security/README.md +111 -0
- crackerjack/adapters/security/__init__.py +17 -0
- crackerjack/adapters/security/gitleaks.py +339 -0
- crackerjack/adapters/type/README.md +52 -0
- crackerjack/adapters/type/__init__.py +12 -0
- crackerjack/adapters/type/pyrefly.py +402 -0
- crackerjack/adapters/type/ty.py +402 -0
- crackerjack/adapters/type/zuban.py +522 -0
- crackerjack/adapters/utility/README.md +51 -0
- crackerjack/adapters/utility/__init__.py +10 -0
- crackerjack/adapters/utility/checks.py +884 -0
- crackerjack/agents/README.md +264 -0
- crackerjack/agents/__init__.py +66 -0
- crackerjack/agents/architect_agent.py +238 -0
- crackerjack/agents/base.py +167 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +600 -0
- crackerjack/agents/documentation_agent.py +520 -0
- crackerjack/agents/dry_agent.py +585 -0
- crackerjack/agents/enhanced_coordinator.py +279 -0
- crackerjack/agents/enhanced_proactive_agent.py +185 -0
- crackerjack/agents/error_middleware.py +53 -0
- crackerjack/agents/formatting_agent.py +230 -0
- crackerjack/agents/helpers/__init__.py +9 -0
- crackerjack/agents/helpers/performance/__init__.py +22 -0
- crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
- crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
- crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
- crackerjack/agents/helpers/refactoring/__init__.py +22 -0
- crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
- crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
- crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
- crackerjack/agents/helpers/test_creation/__init__.py +19 -0
- crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
- crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
- crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
- crackerjack/agents/import_optimization_agent.py +1181 -0
- crackerjack/agents/performance_agent.py +325 -0
- crackerjack/agents/performance_helpers.py +205 -0
- crackerjack/agents/proactive_agent.py +55 -0
- crackerjack/agents/refactoring_agent.py +511 -0
- crackerjack/agents/refactoring_helpers.py +247 -0
- crackerjack/agents/security_agent.py +793 -0
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +570 -0
- crackerjack/agents/test_specialist_agent.py +526 -0
- crackerjack/agents/tracker.py +110 -0
- crackerjack/api.py +647 -0
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +24 -0
- crackerjack/cli/cache_handlers.py +209 -0
- crackerjack/cli/cache_handlers_enhanced.py +680 -0
- crackerjack/cli/facade.py +162 -0
- crackerjack/cli/formatting.py +13 -0
- crackerjack/cli/handlers/__init__.py +85 -0
- crackerjack/cli/handlers/advanced.py +103 -0
- crackerjack/cli/handlers/ai_features.py +62 -0
- crackerjack/cli/handlers/analytics.py +479 -0
- crackerjack/cli/handlers/changelog.py +271 -0
- crackerjack/cli/handlers/config_handlers.py +16 -0
- crackerjack/cli/handlers/coverage.py +84 -0
- crackerjack/cli/handlers/documentation.py +280 -0
- crackerjack/cli/handlers/main_handlers.py +497 -0
- crackerjack/cli/handlers/monitoring.py +371 -0
- crackerjack/cli/handlers.py +700 -0
- crackerjack/cli/interactive.py +488 -0
- crackerjack/cli/options.py +1216 -0
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/utils.py +19 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +1307 -0
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +275 -0
- crackerjack/config/global_lock_config.py +207 -0
- crackerjack/config/hooks.py +390 -0
- crackerjack/config/loader.py +239 -0
- crackerjack/config/settings.py +141 -0
- crackerjack/config/tool_commands.py +331 -0
- crackerjack/core/README.md +393 -0
- crackerjack/core/__init__.py +0 -0
- crackerjack/core/async_workflow_orchestrator.py +738 -0
- crackerjack/core/autofix_coordinator.py +282 -0
- crackerjack/core/container.py +105 -0
- crackerjack/core/enhanced_container.py +583 -0
- crackerjack/core/file_lifecycle.py +472 -0
- crackerjack/core/performance.py +244 -0
- crackerjack/core/performance_monitor.py +357 -0
- crackerjack/core/phase_coordinator.py +1227 -0
- crackerjack/core/proactive_workflow.py +267 -0
- crackerjack/core/resource_manager.py +425 -0
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +601 -0
- crackerjack/core/session_coordinator.py +239 -0
- crackerjack/core/timeout_manager.py +563 -0
- crackerjack/core/websocket_lifecycle.py +410 -0
- crackerjack/core/workflow/__init__.py +21 -0
- crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
- crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
- crackerjack/core/workflow/workflow_issue_parser.py +714 -0
- crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
- crackerjack/core/workflow/workflow_security_gates.py +400 -0
- crackerjack/core/workflow_orchestrator.py +2243 -0
- crackerjack/data/README.md +11 -0
- crackerjack/data/__init__.py +8 -0
- crackerjack/data/models.py +79 -0
- crackerjack/data/repository.py +210 -0
- crackerjack/decorators/README.md +180 -0
- crackerjack/decorators/__init__.py +35 -0
- crackerjack/decorators/error_handling.py +649 -0
- crackerjack/decorators/error_handling_decorators.py +334 -0
- crackerjack/decorators/helpers.py +58 -0
- crackerjack/decorators/patterns.py +281 -0
- crackerjack/decorators/utils.py +58 -0
- crackerjack/docs/INDEX.md +11 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
- crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
- crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
- crackerjack/docs/generated/api/SERVICES.md +1252 -0
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/__init__.py +31 -0
- crackerjack/documentation/ai_templates.py +756 -0
- crackerjack/documentation/dual_output_generator.py +767 -0
- crackerjack/documentation/mkdocs_integration.py +518 -0
- crackerjack/documentation/reference_generator.py +1065 -0
- crackerjack/dynamic_config.py +678 -0
- crackerjack/errors.py +378 -0
- crackerjack/events/README.md +11 -0
- crackerjack/events/__init__.py +16 -0
- crackerjack/events/telemetry.py +175 -0
- crackerjack/events/workflow_bus.py +346 -0
- crackerjack/exceptions/README.md +301 -0
- crackerjack/exceptions/__init__.py +5 -0
- crackerjack/exceptions/config.py +4 -0
- crackerjack/exceptions/tool_execution_error.py +245 -0
- crackerjack/executors/README.md +591 -0
- crackerjack/executors/__init__.py +13 -0
- crackerjack/executors/async_hook_executor.py +938 -0
- crackerjack/executors/cached_hook_executor.py +316 -0
- crackerjack/executors/hook_executor.py +1295 -0
- crackerjack/executors/hook_lock_manager.py +708 -0
- crackerjack/executors/individual_hook_executor.py +739 -0
- crackerjack/executors/lsp_aware_hook_executor.py +349 -0
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +433 -0
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +93 -0
- crackerjack/intelligence/README.md +557 -0
- crackerjack/intelligence/__init__.py +37 -0
- crackerjack/intelligence/adaptive_learning.py +693 -0
- crackerjack/intelligence/agent_orchestrator.py +485 -0
- crackerjack/intelligence/agent_registry.py +377 -0
- crackerjack/intelligence/agent_selector.py +439 -0
- crackerjack/intelligence/integration.py +250 -0
- crackerjack/interactive.py +719 -0
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/__init__.py +11 -0
- crackerjack/managers/async_hook_manager.py +135 -0
- crackerjack/managers/hook_manager.py +585 -0
- crackerjack/managers/publish_manager.py +631 -0
- crackerjack/managers/test_command_builder.py +391 -0
- crackerjack/managers/test_executor.py +474 -0
- crackerjack/managers/test_manager.py +1357 -0
- crackerjack/managers/test_progress.py +187 -0
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/__init__.py +0 -0
- crackerjack/mcp/cache.py +352 -0
- crackerjack/mcp/client_runner.py +121 -0
- crackerjack/mcp/context.py +802 -0
- crackerjack/mcp/dashboard.py +657 -0
- crackerjack/mcp/enhanced_progress_monitor.py +493 -0
- crackerjack/mcp/file_monitor.py +394 -0
- crackerjack/mcp/progress_components.py +607 -0
- crackerjack/mcp/progress_monitor.py +1016 -0
- crackerjack/mcp/rate_limiter.py +336 -0
- crackerjack/mcp/server.py +24 -0
- crackerjack/mcp/server_core.py +526 -0
- crackerjack/mcp/service_watchdog.py +505 -0
- crackerjack/mcp/state.py +407 -0
- crackerjack/mcp/task_manager.py +259 -0
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +19 -0
- crackerjack/mcp/tools/core_tools.py +469 -0
- crackerjack/mcp/tools/error_analyzer.py +283 -0
- crackerjack/mcp/tools/execution_tools.py +384 -0
- crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
- crackerjack/mcp/tools/intelligence_tools.py +264 -0
- crackerjack/mcp/tools/monitoring_tools.py +628 -0
- crackerjack/mcp/tools/proactive_tools.py +367 -0
- crackerjack/mcp/tools/progress_tools.py +222 -0
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +358 -0
- crackerjack/mcp/tools/workflow_executor.py +699 -0
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/__init__.py +14 -0
- crackerjack/mcp/websocket/app.py +54 -0
- crackerjack/mcp/websocket/endpoints.py +492 -0
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +406 -0
- crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
- crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
- crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
- crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
- crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
- crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
- crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
- crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
- crackerjack/mcp/websocket/monitoring/factory.py +109 -0
- crackerjack/mcp/websocket/monitoring/filters.py +10 -0
- crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
- crackerjack/mcp/websocket/monitoring/models.py +90 -0
- crackerjack/mcp/websocket/monitoring/utils.py +171 -0
- crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
- crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
- crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
- crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
- crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
- crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
- crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
- crackerjack/mcp/websocket/server.py +174 -0
- crackerjack/mcp/websocket/websocket_handler.py +276 -0
- crackerjack/mcp/websocket_server.py +10 -0
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +40 -0
- crackerjack/models/config.py +730 -0
- crackerjack/models/config_adapter.py +265 -0
- crackerjack/models/protocols.py +1535 -0
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/resource_protocols.py +299 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +173 -0
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/__init__.py +0 -0
- crackerjack/monitoring/ai_agent_watchdog.py +405 -0
- crackerjack/monitoring/metrics_collector.py +427 -0
- crackerjack/monitoring/regression_prevention.py +580 -0
- crackerjack/monitoring/websocket_server.py +406 -0
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +894 -0
- crackerjack/orchestration/cache/README.md +312 -0
- crackerjack/orchestration/cache/__init__.py +37 -0
- crackerjack/orchestration/cache/memory_cache.py +338 -0
- crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
- crackerjack/orchestration/config.py +297 -0
- crackerjack/orchestration/coverage_improvement.py +180 -0
- crackerjack/orchestration/execution_strategies.py +361 -0
- crackerjack/orchestration/hook_orchestrator.py +1398 -0
- crackerjack/orchestration/strategies/README.md +401 -0
- crackerjack/orchestration/strategies/__init__.py +39 -0
- crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
- crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
- crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
- crackerjack/orchestration/test_progress_streamer.py +647 -0
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/__init__.py +15 -0
- crackerjack/plugins/base.py +200 -0
- crackerjack/plugins/hooks.py +254 -0
- crackerjack/plugins/loader.py +335 -0
- crackerjack/plugins/managers.py +264 -0
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/security/__init__.py +0 -0
- crackerjack/security/audit.py +197 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +9 -0
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/ai/contextual_ai_assistant.py +542 -0
- crackerjack/services/ai/embeddings.py +444 -0
- crackerjack/services/ai/intelligent_commit.py +328 -0
- crackerjack/services/ai/predictive_analytics.py +510 -0
- crackerjack/services/anomaly_detector.py +392 -0
- crackerjack/services/api_extractor.py +617 -0
- crackerjack/services/backup_service.py +467 -0
- crackerjack/services/bounded_status_operations.py +530 -0
- crackerjack/services/cache.py +369 -0
- crackerjack/services/changelog_automation.py +399 -0
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +132 -0
- crackerjack/services/config_merge.py +546 -0
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +493 -0
- crackerjack/services/coverage_badge_service.py +173 -0
- crackerjack/services/coverage_ratchet.py +381 -0
- crackerjack/services/debug.py +733 -0
- crackerjack/services/dependency_analyzer.py +460 -0
- crackerjack/services/dependency_monitor.py +622 -0
- crackerjack/services/documentation_generator.py +493 -0
- crackerjack/services/documentation_service.py +704 -0
- crackerjack/services/enhanced_filesystem.py +497 -0
- crackerjack/services/enterprise_optimizer.py +865 -0
- crackerjack/services/error_pattern_analyzer.py +676 -0
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +149 -0
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +381 -0
- crackerjack/services/git.py +422 -0
- crackerjack/services/health_metrics.py +615 -0
- crackerjack/services/heatmap_generator.py +744 -0
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +823 -0
- crackerjack/services/input_validator.py +668 -0
- crackerjack/services/intelligent_commit.py +327 -0
- crackerjack/services/log_manager.py +289 -0
- crackerjack/services/logging.py +228 -0
- crackerjack/services/lsp_client.py +628 -0
- crackerjack/services/memory_optimizer.py +414 -0
- crackerjack/services/metrics.py +587 -0
- crackerjack/services/monitoring/README.md +30 -0
- crackerjack/services/monitoring/__init__.py +9 -0
- crackerjack/services/monitoring/dependency_monitor.py +678 -0
- crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
- crackerjack/services/monitoring/health_metrics.py +716 -0
- crackerjack/services/monitoring/metrics.py +587 -0
- crackerjack/services/monitoring/performance_benchmarks.py +410 -0
- crackerjack/services/monitoring/performance_cache.py +388 -0
- crackerjack/services/monitoring/performance_monitor.py +569 -0
- crackerjack/services/parallel_executor.py +527 -0
- crackerjack/services/pattern_cache.py +333 -0
- crackerjack/services/pattern_detector.py +478 -0
- crackerjack/services/patterns/__init__.py +142 -0
- crackerjack/services/patterns/agents.py +107 -0
- crackerjack/services/patterns/code/__init__.py +15 -0
- crackerjack/services/patterns/code/detection.py +118 -0
- crackerjack/services/patterns/code/imports.py +107 -0
- crackerjack/services/patterns/code/paths.py +159 -0
- crackerjack/services/patterns/code/performance.py +119 -0
- crackerjack/services/patterns/code/replacement.py +36 -0
- crackerjack/services/patterns/core.py +212 -0
- crackerjack/services/patterns/documentation/__init__.py +14 -0
- crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
- crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
- crackerjack/services/patterns/documentation/docstrings.py +89 -0
- crackerjack/services/patterns/formatting.py +226 -0
- crackerjack/services/patterns/operations.py +339 -0
- crackerjack/services/patterns/security/__init__.py +23 -0
- crackerjack/services/patterns/security/code_injection.py +122 -0
- crackerjack/services/patterns/security/credentials.py +190 -0
- crackerjack/services/patterns/security/path_traversal.py +221 -0
- crackerjack/services/patterns/security/unsafe_operations.py +216 -0
- crackerjack/services/patterns/templates.py +62 -0
- crackerjack/services/patterns/testing/__init__.py +18 -0
- crackerjack/services/patterns/testing/error_patterns.py +107 -0
- crackerjack/services/patterns/testing/pytest_output.py +126 -0
- crackerjack/services/patterns/tool_output/__init__.py +16 -0
- crackerjack/services/patterns/tool_output/bandit.py +72 -0
- crackerjack/services/patterns/tool_output/other.py +97 -0
- crackerjack/services/patterns/tool_output/pyright.py +67 -0
- crackerjack/services/patterns/tool_output/ruff.py +44 -0
- crackerjack/services/patterns/url_sanitization.py +114 -0
- crackerjack/services/patterns/utilities.py +42 -0
- crackerjack/services/patterns/utils.py +339 -0
- crackerjack/services/patterns/validation.py +46 -0
- crackerjack/services/patterns/versioning.py +62 -0
- crackerjack/services/predictive_analytics.py +523 -0
- crackerjack/services/profiler.py +280 -0
- crackerjack/services/quality/README.md +415 -0
- crackerjack/services/quality/__init__.py +11 -0
- crackerjack/services/quality/anomaly_detector.py +392 -0
- crackerjack/services/quality/pattern_cache.py +333 -0
- crackerjack/services/quality/pattern_detector.py +479 -0
- crackerjack/services/quality/qa_orchestrator.py +491 -0
- crackerjack/services/quality/quality_baseline.py +395 -0
- crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
- crackerjack/services/quality/quality_intelligence.py +949 -0
- crackerjack/services/regex_patterns.py +58 -0
- crackerjack/services/regex_utils.py +483 -0
- crackerjack/services/secure_path_utils.py +524 -0
- crackerjack/services/secure_status_formatter.py +450 -0
- crackerjack/services/secure_subprocess.py +635 -0
- crackerjack/services/security.py +239 -0
- crackerjack/services/security_logger.py +495 -0
- crackerjack/services/server_manager.py +411 -0
- crackerjack/services/smart_scheduling.py +167 -0
- crackerjack/services/status_authentication.py +460 -0
- crackerjack/services/status_security_manager.py +315 -0
- crackerjack/services/terminal_utils.py +0 -0
- crackerjack/services/thread_safe_status_collector.py +441 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +43 -0
- crackerjack/services/unified_config.py +115 -0
- crackerjack/services/validation_rate_limiter.py +220 -0
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +461 -0
- crackerjack/services/version_checker.py +223 -0
- crackerjack/services/websocket_resource_limiter.py +438 -0
- crackerjack/services/zuban_lsp_service.py +391 -0
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/__init__.py +59 -0
- crackerjack/slash_commands/init.md +112 -0
- crackerjack/slash_commands/run.md +197 -0
- crackerjack/slash_commands/status.md +127 -0
- crackerjack/tools/README.md +11 -0
- crackerjack/tools/__init__.py +30 -0
- crackerjack/tools/_git_utils.py +105 -0
- crackerjack/tools/check_added_large_files.py +139 -0
- crackerjack/tools/check_ast.py +105 -0
- crackerjack/tools/check_json.py +103 -0
- crackerjack/tools/check_jsonschema.py +297 -0
- crackerjack/tools/check_toml.py +103 -0
- crackerjack/tools/check_yaml.py +110 -0
- crackerjack/tools/codespell_wrapper.py +72 -0
- crackerjack/tools/end_of_file_fixer.py +202 -0
- crackerjack/tools/format_json.py +128 -0
- crackerjack/tools/mdformat_wrapper.py +114 -0
- crackerjack/tools/trailing_whitespace.py +198 -0
- crackerjack/tools/validate_input_validator_patterns.py +236 -0
- crackerjack/tools/validate_regex_patterns.py +188 -0
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/__init__.py +1 -0
- crackerjack/ui/dashboard_renderer.py +28 -0
- crackerjack/ui/templates/README.md +11 -0
- crackerjack/utils/console_utils.py +13 -0
- crackerjack/utils/dependency_guard.py +230 -0
- crackerjack/utils/retry_utils.py +275 -0
- crackerjack/workflows/README.md +590 -0
- crackerjack/workflows/__init__.py +46 -0
- crackerjack/workflows/actions.py +811 -0
- crackerjack/workflows/auto_fix.py +444 -0
- crackerjack/workflows/container_builder.py +499 -0
- crackerjack/workflows/definitions.py +443 -0
- crackerjack/workflows/engine.py +177 -0
- crackerjack/workflows/event_bridge.py +242 -0
- crackerjack-0.45.2.dist-info/METADATA +1678 -0
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
- crackerjack/.gitignore +0 -14
- crackerjack/.libcst.codemod.yaml +0 -18
- crackerjack/.pdm.toml +0 -1
- crackerjack/.pre-commit-config.yaml +0 -91
- crackerjack/.pytest_cache/.gitignore +0 -2
- crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
- crackerjack/.pytest_cache/README.md +0 -8
- crackerjack/.pytest_cache/v/cache/nodeids +0 -1
- crackerjack/.pytest_cache/v/cache/stepwise +0 -1
- crackerjack/.ruff_cache/.gitignore +0 -1
- crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
- crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
- crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
- crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
- crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
- crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
- crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
- crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
- crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
- crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
- crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
- crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
- crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
- crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
- crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
- crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
- crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
- crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
- crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
- crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
- crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
- crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
- crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
- crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
- crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
- crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
- crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
- crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
- crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
- crackerjack/crackerjack.py +0 -855
- crackerjack/pyproject.toml +0 -214
- crackerjack-0.18.2.dist-info/METADATA +0 -420
- crackerjack-0.18.2.dist-info/RECORD +0 -59
- crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Agent count and configuration patterns."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
from .core import ValidatedPattern
|
|
6
|
+
|
|
7
|
+
PATTERNS: dict[str, ValidatedPattern] = {
|
|
8
|
+
"agent_count_pattern": ValidatedPattern(
|
|
9
|
+
name="agent_count_pattern",
|
|
10
|
+
pattern=r"(\d+)\s+agents",
|
|
11
|
+
replacement=r"\1 agents",
|
|
12
|
+
test_cases=[
|
|
13
|
+
("9 agents", "9 agents"),
|
|
14
|
+
("12 agents", "12 agents"),
|
|
15
|
+
("5 agents", "5 agents"),
|
|
16
|
+
],
|
|
17
|
+
description="Match agent count patterns for documentation consistency",
|
|
18
|
+
flags=re.IGNORECASE,
|
|
19
|
+
),
|
|
20
|
+
"specialized_agent_count_pattern": ValidatedPattern(
|
|
21
|
+
name="specialized_agent_count_pattern",
|
|
22
|
+
pattern=r"(\d+)\s+specialized\s+agents",
|
|
23
|
+
replacement=r"\1 specialized agents",
|
|
24
|
+
test_cases=[
|
|
25
|
+
("9 specialized agents", "9 specialized agents"),
|
|
26
|
+
("12 specialized agents", "12 specialized agents"),
|
|
27
|
+
("5 specialized agents", "5 specialized agents"),
|
|
28
|
+
],
|
|
29
|
+
description="Match specialized agent count patterns for documentation "
|
|
30
|
+
"consistency",
|
|
31
|
+
flags=re.IGNORECASE,
|
|
32
|
+
),
|
|
33
|
+
"total_agents_config_pattern": ValidatedPattern(
|
|
34
|
+
name="total_agents_config_pattern",
|
|
35
|
+
pattern=r'total_agents["\'][\s]*: \s*(\d+)',
|
|
36
|
+
replacement=r'total_agents": \1',
|
|
37
|
+
test_cases=[
|
|
38
|
+
('total_agents": 9', 'total_agents": 9'),
|
|
39
|
+
("total_agents': 12", 'total_agents": 12'),
|
|
40
|
+
('total_agents" : 5', 'total_agents": 5'),
|
|
41
|
+
],
|
|
42
|
+
description="Match total agents configuration patterns",
|
|
43
|
+
flags=re.IGNORECASE,
|
|
44
|
+
),
|
|
45
|
+
"sub_agent_count_pattern": ValidatedPattern(
|
|
46
|
+
name="sub_agent_count_pattern",
|
|
47
|
+
pattern=r"(\d+)\s+sub-agents",
|
|
48
|
+
replacement=r"\1 sub-agents",
|
|
49
|
+
test_cases=[
|
|
50
|
+
("9 sub-agents", "9 sub-agents"),
|
|
51
|
+
("12 sub-agents", "12 sub-agents"),
|
|
52
|
+
("5 sub-agents", "5 sub-agents"),
|
|
53
|
+
],
|
|
54
|
+
description="Match sub-agent count patterns for documentation consistency",
|
|
55
|
+
flags=re.IGNORECASE,
|
|
56
|
+
),
|
|
57
|
+
"update_agent_count": ValidatedPattern(
|
|
58
|
+
name="update_agent_count",
|
|
59
|
+
pattern=r"\b(\d+)\s+agents\b",
|
|
60
|
+
replacement=r"NEW_COUNT agents",
|
|
61
|
+
test_cases=[
|
|
62
|
+
("9 agents working", "NEW_COUNT agents working"),
|
|
63
|
+
("We have 12 agents ready", "We have NEW_COUNT agents ready"),
|
|
64
|
+
("All 5 agents are active", "All NEW_COUNT agents are active"),
|
|
65
|
+
],
|
|
66
|
+
description="Update agent count references (NEW_COUNT replaced dynamically)",
|
|
67
|
+
),
|
|
68
|
+
"update_specialized_agent_count": ValidatedPattern(
|
|
69
|
+
name="update_specialized_agent_count",
|
|
70
|
+
pattern=r"\b(\d+)\s+specialized\s+agents\b",
|
|
71
|
+
replacement=r"NEW_COUNT specialized agents",
|
|
72
|
+
test_cases=[
|
|
73
|
+
(
|
|
74
|
+
"9 specialized agents available",
|
|
75
|
+
"NEW_COUNT specialized agents available",
|
|
76
|
+
),
|
|
77
|
+
("We have 12 specialized agents", "We have NEW_COUNT specialized agents"),
|
|
78
|
+
("All 5 specialized agents work", "All NEW_COUNT specialized agents work"),
|
|
79
|
+
],
|
|
80
|
+
description="Update specialized agent count references (NEW_COUNT replaced"
|
|
81
|
+
" dynamically)",
|
|
82
|
+
),
|
|
83
|
+
"update_total_agents_config": ValidatedPattern(
|
|
84
|
+
name="update_total_agents_config",
|
|
85
|
+
pattern=r'total_agents["\'][\s]*: \s*\d+',
|
|
86
|
+
replacement=r'total_agents": NEW_COUNT',
|
|
87
|
+
test_cases=[
|
|
88
|
+
('total_agents": 9', 'total_agents": NEW_COUNT'),
|
|
89
|
+
("total_agents': 12", 'total_agents": NEW_COUNT'),
|
|
90
|
+
('total_agents" : 5', 'total_agents": NEW_COUNT'),
|
|
91
|
+
],
|
|
92
|
+
description="Update total agents configuration (NEW_COUNT replaced"
|
|
93
|
+
" dynamically)",
|
|
94
|
+
),
|
|
95
|
+
"update_sub_agent_count": ValidatedPattern(
|
|
96
|
+
name="update_sub_agent_count",
|
|
97
|
+
pattern=r"\b(\d+)\s+sub-agents\b",
|
|
98
|
+
replacement=r"NEW_COUNT sub-agents",
|
|
99
|
+
test_cases=[
|
|
100
|
+
("9 sub-agents working", "NEW_COUNT sub-agents working"),
|
|
101
|
+
("We have 12 sub-agents ready", "We have NEW_COUNT sub-agents ready"),
|
|
102
|
+
("All 5 sub-agents are active", "All NEW_COUNT sub-agents are active"),
|
|
103
|
+
],
|
|
104
|
+
description="Update sub-agent count references (NEW_COUNT replaced"
|
|
105
|
+
" dynamically)",
|
|
106
|
+
),
|
|
107
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Code-related patterns."""
|
|
2
|
+
|
|
3
|
+
from .detection import PATTERNS as DETECTION_PATTERNS
|
|
4
|
+
from .imports import PATTERNS as IMPORT_PATTERNS
|
|
5
|
+
from .paths import PATTERNS as PATH_PATTERNS
|
|
6
|
+
from .performance import PATTERNS as PERFORMANCE_PATTERNS
|
|
7
|
+
from .replacement import PATTERNS as REPLACEMENT_PATTERNS
|
|
8
|
+
|
|
9
|
+
PATTERNS: dict[str, object] = (
|
|
10
|
+
IMPORT_PATTERNS
|
|
11
|
+
| PATH_PATTERNS
|
|
12
|
+
| PERFORMANCE_PATTERNS
|
|
13
|
+
| DETECTION_PATTERNS
|
|
14
|
+
| REPLACEMENT_PATTERNS
|
|
15
|
+
)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Code pattern descriptions."""
|
|
2
|
+
|
|
3
|
+
from ..core import ValidatedPattern
|
|
4
|
+
|
|
5
|
+
PATTERNS: dict[str, ValidatedPattern] = {
|
|
6
|
+
"detect_tempfile_usage": ValidatedPattern(
|
|
7
|
+
name="detect_tempfile_usage",
|
|
8
|
+
pattern=r"tempfile\.(mkdtemp|NamedTemporaryFile|TemporaryDirectory)",
|
|
9
|
+
replacement="MATCH",
|
|
10
|
+
test_cases=[
|
|
11
|
+
("tempfile.mkdtemp()", "MATCH()"),
|
|
12
|
+
("tempfile.NamedTemporaryFile()", "MATCH()"),
|
|
13
|
+
("tempfile.TemporaryDirectory()", "MATCH()"),
|
|
14
|
+
(
|
|
15
|
+
"not_tempfile.other()",
|
|
16
|
+
"not_tempfile.other()",
|
|
17
|
+
),
|
|
18
|
+
],
|
|
19
|
+
description="Detect tempfile module usage for resource management integration",
|
|
20
|
+
),
|
|
21
|
+
"detect_asyncio_create_task": ValidatedPattern(
|
|
22
|
+
name="detect_asyncio_create_task",
|
|
23
|
+
pattern=r"asyncio\.create_task",
|
|
24
|
+
replacement="MATCH",
|
|
25
|
+
test_cases=[
|
|
26
|
+
("asyncio.create_task(coro)", "MATCH(coro)"),
|
|
27
|
+
("not_asyncio.other()", "not_asyncio.other()"),
|
|
28
|
+
],
|
|
29
|
+
description="Detect asyncio.create_task usage for resource management"
|
|
30
|
+
" integration",
|
|
31
|
+
),
|
|
32
|
+
"detect_file_open_operations": ValidatedPattern(
|
|
33
|
+
name="detect_file_open_operations",
|
|
34
|
+
pattern=r"(\.open\(|with open\()",
|
|
35
|
+
replacement=r"MATCH",
|
|
36
|
+
test_cases=[
|
|
37
|
+
("file.open()", "fileMATCH)"),
|
|
38
|
+
("with open('file.txt'): ", "MATCH'file.txt'): "),
|
|
39
|
+
("other_method()", "other_method()"),
|
|
40
|
+
],
|
|
41
|
+
description="Detect file open operations for resource management integration",
|
|
42
|
+
),
|
|
43
|
+
"detect_exception_patterns": ValidatedPattern(
|
|
44
|
+
name="detect_exception_patterns",
|
|
45
|
+
pattern=r"except\s+\w*Exception\s+as\s+\w+: ",
|
|
46
|
+
replacement=r"MATCH",
|
|
47
|
+
description="Detect exception handling patterns for base Exception class in Python code for DRY violations",
|
|
48
|
+
test_cases=[
|
|
49
|
+
("except Exception as e: ", "MATCH"),
|
|
50
|
+
("except BaseException as error: ", "MATCH"),
|
|
51
|
+
(
|
|
52
|
+
"except ValueError as error: ",
|
|
53
|
+
"except ValueError as error: ",
|
|
54
|
+
),
|
|
55
|
+
("try: ", "try: "),
|
|
56
|
+
],
|
|
57
|
+
),
|
|
58
|
+
"match_async_function_definition": ValidatedPattern(
|
|
59
|
+
name="match_async_function_definition",
|
|
60
|
+
pattern=r"(async def \w+\([^)]*\)[^: ]*: )",
|
|
61
|
+
replacement=r"\1",
|
|
62
|
+
test_cases=[
|
|
63
|
+
("async def foo(): ", "async def foo(): "),
|
|
64
|
+
("async def bar(a, b) -> None: ", "async def bar(a, b) -> None: "),
|
|
65
|
+
("def sync_func(): ", "def sync_func(): "),
|
|
66
|
+
],
|
|
67
|
+
description="Match async function definitions for resource management"
|
|
68
|
+
" integration",
|
|
69
|
+
),
|
|
70
|
+
"match_class_definition": ValidatedPattern(
|
|
71
|
+
name="match_class_definition",
|
|
72
|
+
pattern=r"class (\w+).*: ",
|
|
73
|
+
replacement=r"\1",
|
|
74
|
+
test_cases=[
|
|
75
|
+
("class MyClass: ", "MyClass"),
|
|
76
|
+
("class MyClass(BaseClass): ", "MyClass"),
|
|
77
|
+
("class MyClass(Base, Mixin): ", "MyClass"),
|
|
78
|
+
("def not_class(): ", "def not_class(): "),
|
|
79
|
+
],
|
|
80
|
+
description="Match class definitions for resource management integration",
|
|
81
|
+
),
|
|
82
|
+
"match_error_code_patterns": ValidatedPattern(
|
|
83
|
+
name="match_error_code_patterns",
|
|
84
|
+
pattern=r"F\d{3}|I\d{3}|E\d{3}|W\d{3}",
|
|
85
|
+
replacement=r"\g<0>",
|
|
86
|
+
description="Match standard error codes like F403, I001, etc.",
|
|
87
|
+
test_cases=[
|
|
88
|
+
("F403", "F403"),
|
|
89
|
+
("I001", "I001"),
|
|
90
|
+
("E302", "E302"),
|
|
91
|
+
("W291", "W291"),
|
|
92
|
+
("ABC123", "ABC123"),
|
|
93
|
+
],
|
|
94
|
+
),
|
|
95
|
+
"match_validation_patterns": ValidatedPattern(
|
|
96
|
+
name="match_validation_patterns",
|
|
97
|
+
pattern=r"if\s+not\s+\w+\s*: |if\s+\w+\s+is\s+None\s*: |if\s+len\(\w+\)\s*[<>=]",
|
|
98
|
+
replacement=r"\g<0>",
|
|
99
|
+
description="Match common validation patterns for extraction",
|
|
100
|
+
test_cases=[
|
|
101
|
+
("if not var: ", "if not var: "),
|
|
102
|
+
("if item is None: ", "if item is None: "),
|
|
103
|
+
("if len(items) >", "if len(items) >"),
|
|
104
|
+
("other code", "other code"),
|
|
105
|
+
],
|
|
106
|
+
),
|
|
107
|
+
"match_loop_patterns": ValidatedPattern(
|
|
108
|
+
name="match_loop_patterns",
|
|
109
|
+
pattern=r"\s*for\s+.*: \s*$|\s*while\s+.*: \s*$",
|
|
110
|
+
replacement=r"\g<0>",
|
|
111
|
+
description="Match for/while loop patterns",
|
|
112
|
+
test_cases=[
|
|
113
|
+
(" for i in items: ", " for i in items: "),
|
|
114
|
+
(" while condition: ", " while condition: "),
|
|
115
|
+
("regular line", "regular line"),
|
|
116
|
+
],
|
|
117
|
+
),
|
|
118
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Code pattern descriptions."""
|
|
2
|
+
|
|
3
|
+
from ..core import ValidatedPattern
|
|
4
|
+
|
|
5
|
+
PATTERNS: dict[str, ValidatedPattern] = {
|
|
6
|
+
"match_star_import": ValidatedPattern(
|
|
7
|
+
name="match_star_import",
|
|
8
|
+
pattern=r"from\s+\w+\s+import\s+\*",
|
|
9
|
+
replacement=r"\g<0>",
|
|
10
|
+
description="Match star import statements",
|
|
11
|
+
test_cases=[
|
|
12
|
+
("from module import *", "from module import *"),
|
|
13
|
+
("from my_pkg import *", "from my_pkg import *"),
|
|
14
|
+
("from module import specific", "from module import specific"),
|
|
15
|
+
],
|
|
16
|
+
),
|
|
17
|
+
"clean_unused_import": ValidatedPattern(
|
|
18
|
+
name="clean_unused_import",
|
|
19
|
+
pattern=r"^\s*import\s+unused_module\s*$",
|
|
20
|
+
replacement=r"",
|
|
21
|
+
description="Remove unused import statements (example with unused_module)",
|
|
22
|
+
test_cases=[
|
|
23
|
+
(" import unused_module", ""),
|
|
24
|
+
(
|
|
25
|
+
"import other_module",
|
|
26
|
+
"import other_module",
|
|
27
|
+
),
|
|
28
|
+
],
|
|
29
|
+
),
|
|
30
|
+
"clean_unused_from_import": ValidatedPattern(
|
|
31
|
+
name="clean_unused_from_import",
|
|
32
|
+
pattern=r"^\s*from\s+\w+\s+import\s+.*\bunused_item\b",
|
|
33
|
+
replacement=r"\g<0>",
|
|
34
|
+
description="Match from import statements with unused items (example with "
|
|
35
|
+
"unused_item)",
|
|
36
|
+
test_cases=[
|
|
37
|
+
(
|
|
38
|
+
"from module import used, unused_item",
|
|
39
|
+
"from module import used, unused_item",
|
|
40
|
+
),
|
|
41
|
+
("from other import needed", "from other import needed"),
|
|
42
|
+
],
|
|
43
|
+
),
|
|
44
|
+
"clean_import_commas": ValidatedPattern(
|
|
45
|
+
name="clean_import_commas",
|
|
46
|
+
pattern=r", \s*, ",
|
|
47
|
+
replacement=r", ",
|
|
48
|
+
description="Clean double commas in import statements",
|
|
49
|
+
test_cases=[
|
|
50
|
+
("from module import a, , b", "from module import a, b"),
|
|
51
|
+
("items = [a, , b]", "items = [a, b]"),
|
|
52
|
+
("normal, list[t.Any]", "normal, list[t.Any]"),
|
|
53
|
+
],
|
|
54
|
+
),
|
|
55
|
+
"clean_trailing_import_comma": ValidatedPattern(
|
|
56
|
+
name="clean_trailing_import_comma",
|
|
57
|
+
pattern=r", \s*$",
|
|
58
|
+
replacement=r"",
|
|
59
|
+
description="Remove trailing commas from lines",
|
|
60
|
+
test_cases=[
|
|
61
|
+
("from module import a, b, ", "from module import a, b"),
|
|
62
|
+
("import item, ", "import item"),
|
|
63
|
+
("normal line", "normal line"),
|
|
64
|
+
],
|
|
65
|
+
),
|
|
66
|
+
"clean_import_prefix": ValidatedPattern(
|
|
67
|
+
name="clean_import_prefix",
|
|
68
|
+
pattern=r"import\s*, \s*",
|
|
69
|
+
replacement=r"import ",
|
|
70
|
+
description="Clean malformed import statements with leading comma",
|
|
71
|
+
test_cases=[
|
|
72
|
+
("import , module", "import module"),
|
|
73
|
+
("from pkg import , item", "from pkg import item"),
|
|
74
|
+
("import normal", "import normal"),
|
|
75
|
+
],
|
|
76
|
+
),
|
|
77
|
+
"extract_unused_import_name": ValidatedPattern(
|
|
78
|
+
name="extract_unused_import_name",
|
|
79
|
+
pattern=r"unused import ['\"]([^'\"]+)['\"]",
|
|
80
|
+
replacement=r"\1",
|
|
81
|
+
description="Extract import name from vulture unused import messages",
|
|
82
|
+
test_cases=[
|
|
83
|
+
("unused import 'module_name'", "module_name"),
|
|
84
|
+
('unused import "other_module"', "other_module"),
|
|
85
|
+
("some other text", "some other text"),
|
|
86
|
+
],
|
|
87
|
+
),
|
|
88
|
+
"detect_typing_usage": ValidatedPattern(
|
|
89
|
+
name="detect_typing_usage",
|
|
90
|
+
pattern=r"\bt\.[A-Z]",
|
|
91
|
+
replacement="",
|
|
92
|
+
description="Detect usage of typing module aliases like t.Any, t.Dict, etc.",
|
|
93
|
+
global_replace=True,
|
|
94
|
+
test_cases=[
|
|
95
|
+
(
|
|
96
|
+
"def func(x: t.Any) -> t.Dict:",
|
|
97
|
+
"def func(x: ny) -> ict:",
|
|
98
|
+
), # Removes t.A and t.D
|
|
99
|
+
(
|
|
100
|
+
"value: t.Optional[str] = None",
|
|
101
|
+
"value: ptional[str] = None",
|
|
102
|
+
), # Removes t.O
|
|
103
|
+
("from typing import Dict", "from typing import Dict"), # No match
|
|
104
|
+
("data = dict()", "data = dict()"), # No match
|
|
105
|
+
],
|
|
106
|
+
),
|
|
107
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"""Code pattern descriptions."""
|
|
2
|
+
|
|
3
|
+
from ..core import ValidatedPattern
|
|
4
|
+
|
|
5
|
+
PATTERNS: dict[str, ValidatedPattern] = {
|
|
6
|
+
"detect_error_response_patterns": ValidatedPattern(
|
|
7
|
+
name="detect_error_response_patterns",
|
|
8
|
+
pattern=r'return\s+.*[\'\"]\{.*[\'\""]error[\'\""].*\}.*[\'\""]',
|
|
9
|
+
replacement=r"MATCH",
|
|
10
|
+
description="Detect error response patterns in Python code for DRY violations",
|
|
11
|
+
test_cases=[
|
|
12
|
+
('return \'{"error": "msg"}\'', "MATCH"),
|
|
13
|
+
('return f\'{"error": "msg"}\'', "MATCH"),
|
|
14
|
+
('return {"success": True}', 'return {"success": True}'),
|
|
15
|
+
('return \'{"error": "test message", "code": 500}\'', "MATCH"),
|
|
16
|
+
],
|
|
17
|
+
),
|
|
18
|
+
"detect_path_conversion_patterns": ValidatedPattern(
|
|
19
|
+
name="detect_path_conversion_patterns",
|
|
20
|
+
pattern=r"Path\([^)]+\)\s+if\s+isinstance\([^)]+, \s*str\)\s+else\s+[^)]+",
|
|
21
|
+
replacement=r"MATCH",
|
|
22
|
+
description="Detect path conversion patterns in Python code for DRY violations",
|
|
23
|
+
test_cases=[
|
|
24
|
+
("Path(value) if isinstance(value, str) else value", "MATCH"),
|
|
25
|
+
("Path(path) if isinstance(path, str) else path", "MATCH"),
|
|
26
|
+
("Path('/tmp/file')", "Path('/tmp/file')"),
|
|
27
|
+
(
|
|
28
|
+
"Path(input_path) if isinstance(input_path, str) else input_path",
|
|
29
|
+
"MATCH",
|
|
30
|
+
),
|
|
31
|
+
],
|
|
32
|
+
),
|
|
33
|
+
"detect_file_existence_patterns": ValidatedPattern(
|
|
34
|
+
name="detect_file_existence_patterns",
|
|
35
|
+
pattern=r"if\s+not\s+\w+\.exists\(\): ",
|
|
36
|
+
replacement=r"MATCH",
|
|
37
|
+
description="Detect file existence check patterns in Python code for DRY"
|
|
38
|
+
" violations",
|
|
39
|
+
test_cases=[
|
|
40
|
+
("if not file.exists(): ", "MATCH"),
|
|
41
|
+
("if not path.exists(): ", "MATCH"),
|
|
42
|
+
("if not file_path.exists(): ", "MATCH"),
|
|
43
|
+
("if file.exists(): ", "if file.exists(): "),
|
|
44
|
+
],
|
|
45
|
+
),
|
|
46
|
+
"fix_path_conversion_with_ensure_path": ValidatedPattern(
|
|
47
|
+
name="fix_path_conversion_with_ensure_path",
|
|
48
|
+
pattern=r"Path\([^)]+\)\s+if\s+isinstance\([^)]+, \s*str\)\s+else\s+([^)]+)",
|
|
49
|
+
replacement=r"_ensure_path(\1)",
|
|
50
|
+
description="Replace path conversion patterns with _ensure_path utility "
|
|
51
|
+
"function",
|
|
52
|
+
test_cases=[
|
|
53
|
+
("Path(value) if isinstance(value, str) else value", "_ensure_path(value)"),
|
|
54
|
+
("Path(path) if isinstance(path, str) else path", "_ensure_path(path)"),
|
|
55
|
+
(
|
|
56
|
+
"Path(input_path) if isinstance(input_path, str) else input_path",
|
|
57
|
+
"_ensure_path(input_path)",
|
|
58
|
+
),
|
|
59
|
+
],
|
|
60
|
+
),
|
|
61
|
+
"fix_path_conversion_simple": ValidatedPattern(
|
|
62
|
+
name="fix_path_conversion_simple",
|
|
63
|
+
pattern=r"Path\(([^)]+)\)\s+if\s+isinstance\(\1, \s*str\)\s+else\s+\1",
|
|
64
|
+
replacement=r"_ensure_path(\1)",
|
|
65
|
+
description="Replace simple path conversion patterns with _ensure_path utility "
|
|
66
|
+
"function",
|
|
67
|
+
test_cases=[
|
|
68
|
+
("Path(value) if isinstance(value, str) else value", "_ensure_path(value)"),
|
|
69
|
+
("Path(path) if isinstance(path, str) else path", "_ensure_path(path)"),
|
|
70
|
+
(
|
|
71
|
+
"Path(file_path) if isinstance(file_path, str) else file_path",
|
|
72
|
+
"_ensure_path(file_path)",
|
|
73
|
+
),
|
|
74
|
+
],
|
|
75
|
+
),
|
|
76
|
+
"detect_hardcoded_temp_paths_basic": ValidatedPattern(
|
|
77
|
+
name="detect_hardcoded_temp_paths_basic",
|
|
78
|
+
pattern=r"(?:/tmp/|/temp/|C:\\temp\\|C:\\tmp\\)", # nosec B108
|
|
79
|
+
replacement="[TEMP_PATH]/",
|
|
80
|
+
description="Detect hardcoded temporary directory paths",
|
|
81
|
+
global_replace=True,
|
|
82
|
+
test_cases=[
|
|
83
|
+
("/tmp/myfile.txt", "[TEMP_PATH]/myfile.txt"), # nosec B108
|
|
84
|
+
(r"C:\tmp\data.log", "[TEMP_PATH]/data.log"),
|
|
85
|
+
("/temp/cache", "[TEMP_PATH]/cache"),
|
|
86
|
+
(r"C:\temp\work", "[TEMP_PATH]/work"),
|
|
87
|
+
("/regular/path", "/regular/path"),
|
|
88
|
+
],
|
|
89
|
+
),
|
|
90
|
+
"replace_hardcoded_temp_paths": ValidatedPattern(
|
|
91
|
+
name="replace_hardcoded_temp_paths",
|
|
92
|
+
pattern=r'Path\("/tmp/([^"]+)"\)',
|
|
93
|
+
replacement=r'Path(tempfile.gettempdir()) / "\1"',
|
|
94
|
+
description="Replace hardcoded /tmp paths with tempfile.gettempdir()",
|
|
95
|
+
global_replace=True,
|
|
96
|
+
test_cases=[
|
|
97
|
+
('Path("/tmp/myfile.txt")', 'Path(tempfile.gettempdir()) / "myfile.txt"'),
|
|
98
|
+
('Path("/tmp/data.log")', 'Path(tempfile.gettempdir()) / "data.log"'),
|
|
99
|
+
('Path("/regular/path")', 'Path("/regular/path")'),
|
|
100
|
+
],
|
|
101
|
+
),
|
|
102
|
+
"replace_hardcoded_temp_strings": ValidatedPattern(
|
|
103
|
+
name="replace_hardcoded_temp_strings",
|
|
104
|
+
pattern=r'"/tmp/([^"]+)"',
|
|
105
|
+
replacement=r'str(Path(tempfile.gettempdir()) / "\1")',
|
|
106
|
+
description="Replace hardcoded /tmp string paths with tempfile equivalent",
|
|
107
|
+
global_replace=True,
|
|
108
|
+
test_cases=[
|
|
109
|
+
('"/tmp/myfile.txt"', 'str(Path(tempfile.gettempdir()) / "myfile.txt")'),
|
|
110
|
+
('"/tmp/data.log"', 'str(Path(tempfile.gettempdir()) / "data.log")'),
|
|
111
|
+
('"/regular/path"', '"/regular/path"'),
|
|
112
|
+
],
|
|
113
|
+
),
|
|
114
|
+
"replace_hardcoded_temp_single_quotes": ValidatedPattern(
|
|
115
|
+
name="replace_hardcoded_temp_single_quotes",
|
|
116
|
+
pattern=r"'/tmp/([^']+)'",
|
|
117
|
+
replacement=r"str(Path(tempfile.gettempdir()) / '\1')",
|
|
118
|
+
description="Replace hardcoded /tmp paths (single quotes) with tempfile"
|
|
119
|
+
" equivalent",
|
|
120
|
+
global_replace=True,
|
|
121
|
+
test_cases=[
|
|
122
|
+
("'/tmp/myfile.txt'", "str(Path(tempfile.gettempdir()) / 'myfile.txt')"),
|
|
123
|
+
("'/tmp/data.log'", "str(Path(tempfile.gettempdir()) / 'data.log')"),
|
|
124
|
+
("'/regular/path'", "'/regular/path'"),
|
|
125
|
+
],
|
|
126
|
+
),
|
|
127
|
+
"replace_test_path_patterns": ValidatedPattern(
|
|
128
|
+
name="replace_test_path_patterns",
|
|
129
|
+
pattern=r'Path\("/test/path"\)',
|
|
130
|
+
replacement=r"Path(tempfile.gettempdir()) / 'test-path'",
|
|
131
|
+
description="Replace hardcoded /test/path patterns with tempfile equivalent",
|
|
132
|
+
test_cases=[
|
|
133
|
+
('Path("/test/path")', "Path(tempfile.gettempdir()) / 'test-path'"),
|
|
134
|
+
('Path("/other/path")', 'Path("/other/path")'),
|
|
135
|
+
],
|
|
136
|
+
),
|
|
137
|
+
"replace_path_open_write": ValidatedPattern(
|
|
138
|
+
name="replace_path_open_write",
|
|
139
|
+
pattern=r'(\w+)\.open\(["\']wb?["\'][^)]*\)',
|
|
140
|
+
replacement=r"atomic_file_write(\1)",
|
|
141
|
+
test_cases=[
|
|
142
|
+
("path.open('w')", "atomic_file_write(path)"),
|
|
143
|
+
("file.open('wb')", "atomic_file_write(file)"),
|
|
144
|
+
],
|
|
145
|
+
description="Replace file.open() with atomic_file_write",
|
|
146
|
+
),
|
|
147
|
+
"replace_path_write_text": ValidatedPattern(
|
|
148
|
+
name="replace_path_write_text",
|
|
149
|
+
pattern=r"(\w+)\.write_text\(([^)]+)\)",
|
|
150
|
+
replacement=r"await SafeFileOperations.safe_write_text(\1, \2, atomic=True)",
|
|
151
|
+
test_cases=[
|
|
152
|
+
(
|
|
153
|
+
"path.write_text(content)",
|
|
154
|
+
"await SafeFileOperations.safe_write_text(path, content, atomic=True)",
|
|
155
|
+
),
|
|
156
|
+
],
|
|
157
|
+
description="Replace path.write_text with safe atomic write",
|
|
158
|
+
),
|
|
159
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Code pattern descriptions."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
from ..core import ValidatedPattern
|
|
6
|
+
|
|
7
|
+
PATTERNS: dict[str, ValidatedPattern] = {
|
|
8
|
+
"list_append_inefficiency_pattern": ValidatedPattern(
|
|
9
|
+
name="list_append_inefficiency_pattern",
|
|
10
|
+
pattern=r"(\s*)(\w+)\s*\+=\s*\[([^]]+)\]",
|
|
11
|
+
replacement=r"\1\2.append(\3)",
|
|
12
|
+
test_cases=[
|
|
13
|
+
(" items += [new_item]", " items.append(new_item)"),
|
|
14
|
+
("results += [result]", "results.append(result)"),
|
|
15
|
+
(" data += [value, other]", " data.append(value, other)"),
|
|
16
|
+
],
|
|
17
|
+
description="Replace inefficient list[t.Any] concatenation with append for"
|
|
18
|
+
" performance",
|
|
19
|
+
),
|
|
20
|
+
"string_concatenation_pattern": ValidatedPattern(
|
|
21
|
+
name="string_concatenation_pattern",
|
|
22
|
+
pattern=r"(\s*)(\w+)\s*\+=\s*(.+)",
|
|
23
|
+
replacement=r"\1\2_parts.append(\3)",
|
|
24
|
+
test_cases=[
|
|
25
|
+
(" text += new_text", " text_parts.append(new_text)"),
|
|
26
|
+
("result += line", "result_parts.append(line)"),
|
|
27
|
+
(" output += data", " output_parts.append(data)"),
|
|
28
|
+
],
|
|
29
|
+
description="Replace string concatenation with list[t.Any] append for performance "
|
|
30
|
+
"optimization",
|
|
31
|
+
),
|
|
32
|
+
"nested_loop_detection_pattern": ValidatedPattern(
|
|
33
|
+
name="nested_loop_detection_pattern",
|
|
34
|
+
pattern=r"(\s*)(for\s+\w+\s+in\s+.*: )",
|
|
35
|
+
replacement=r"\1# Performance: Potential nested loop - check complexity\n\1\2",
|
|
36
|
+
test_cases=[
|
|
37
|
+
(
|
|
38
|
+
" for j in other: ",
|
|
39
|
+
" # Performance: Potential nested loop - check complexity\n "
|
|
40
|
+
"for j in other: ",
|
|
41
|
+
),
|
|
42
|
+
(
|
|
43
|
+
"for i in items: ",
|
|
44
|
+
"# Performance: Potential nested loop - check complexity\nfor i"
|
|
45
|
+
" in items: ",
|
|
46
|
+
),
|
|
47
|
+
],
|
|
48
|
+
description="Detect loop patterns that might be nested creating O(n²)"
|
|
49
|
+
" complexity",
|
|
50
|
+
flags=re.MULTILINE,
|
|
51
|
+
),
|
|
52
|
+
"list_extend_optimization_pattern": ValidatedPattern(
|
|
53
|
+
name="list_extend_optimization_pattern",
|
|
54
|
+
pattern=r"(\s*)(\w+)\s*\+=\s*\[([^]]+(?: , \s*[^]]+)*)\]",
|
|
55
|
+
replacement=r"\1\2.extend([\3])",
|
|
56
|
+
test_cases=[
|
|
57
|
+
(" items += [a, b, c]", " items.extend([a, b, c])"),
|
|
58
|
+
("results += [x, y]", "results.extend([x, y])"),
|
|
59
|
+
(" data += [single_item]", " data.extend([single_item])"),
|
|
60
|
+
],
|
|
61
|
+
description="Replace list[t.Any] concatenation with extend for better performance with multiple items",
|
|
62
|
+
),
|
|
63
|
+
"inefficient_string_join_pattern": ValidatedPattern(
|
|
64
|
+
name="inefficient_string_join_pattern",
|
|
65
|
+
pattern=r"(\s*)(\w+)\s*=\s*([\"'])([\"'])\s*\.\s*join\(\s*\[\s*\]\s*\)",
|
|
66
|
+
replacement=r"\1\2 = \3\4 # Performance: Use empty string directly instead"
|
|
67
|
+
r" of join",
|
|
68
|
+
test_cases=[
|
|
69
|
+
(
|
|
70
|
+
' text = "".join([])',
|
|
71
|
+
' text = "" # Performance: Use empty string directly instead of join',
|
|
72
|
+
),
|
|
73
|
+
(
|
|
74
|
+
"result = ''.join([])",
|
|
75
|
+
"result = '' # Performance: Use empty string directly instead of join",
|
|
76
|
+
),
|
|
77
|
+
],
|
|
78
|
+
description="Replace inefficient empty list[t.Any] join with direct empty string"
|
|
79
|
+
" assignment",
|
|
80
|
+
),
|
|
81
|
+
"repeated_len_in_loop_pattern": ValidatedPattern(
|
|
82
|
+
name="repeated_len_in_loop_pattern",
|
|
83
|
+
pattern=r"(\s*)(len\(\s*(\w+)\s*\))",
|
|
84
|
+
replacement=r"\1# Performance: Consider caching len(\3) if used "
|
|
85
|
+
r"repeatedly\n\1\2",
|
|
86
|
+
test_cases=[
|
|
87
|
+
(
|
|
88
|
+
" len(items)",
|
|
89
|
+
" # Performance: Consider caching len(items) if used repeatedly\n"
|
|
90
|
+
" len(items)",
|
|
91
|
+
),
|
|
92
|
+
(
|
|
93
|
+
"len(data)",
|
|
94
|
+
"# Performance: Consider caching len(data) if used "
|
|
95
|
+
"repeatedly\nlen(data)",
|
|
96
|
+
),
|
|
97
|
+
],
|
|
98
|
+
description="Suggest caching len() calls that might be repeated",
|
|
99
|
+
),
|
|
100
|
+
"list_comprehension_optimization_pattern": ValidatedPattern(
|
|
101
|
+
name="list_comprehension_optimization_pattern",
|
|
102
|
+
pattern=r"(\s*)(\w+)\.append\(([^)]+)\)",
|
|
103
|
+
replacement=r"\1# Performance: Consider list[t.Any] comprehension if this is in a "
|
|
104
|
+
r"simple loop\n\1\2.append(\3)",
|
|
105
|
+
test_cases=[
|
|
106
|
+
(
|
|
107
|
+
" results.append(item * 2)",
|
|
108
|
+
" # Performance: Consider list[t.Any] comprehension if this is in a "
|
|
109
|
+
"simple loop\n results.append(item * 2)",
|
|
110
|
+
),
|
|
111
|
+
(
|
|
112
|
+
"data.append(value)",
|
|
113
|
+
"# Performance: Consider list[t.Any] comprehension if this is in a simple"
|
|
114
|
+
" loop\ndata.append(value)",
|
|
115
|
+
),
|
|
116
|
+
],
|
|
117
|
+
description="Suggest list[t.Any] comprehensions for simple append patterns",
|
|
118
|
+
),
|
|
119
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""Code pattern descriptions."""
|
|
2
|
+
|
|
3
|
+
from ..core import ValidatedPattern
|
|
4
|
+
|
|
5
|
+
PATTERNS: dict[str, ValidatedPattern] = {
|
|
6
|
+
"replace_subprocess_popen_basic": ValidatedPattern(
|
|
7
|
+
name="replace_subprocess_popen_basic",
|
|
8
|
+
pattern=r"subprocess\.Popen\(",
|
|
9
|
+
replacement="managed_proc = resource_ctx.managed_process(subprocess.Popen(",
|
|
10
|
+
test_cases=[
|
|
11
|
+
(
|
|
12
|
+
"subprocess.Popen(cmd)",
|
|
13
|
+
"managed_proc = resource_ctx.managed_process(subprocess.Popen(cmd)",
|
|
14
|
+
),
|
|
15
|
+
(
|
|
16
|
+
"result = subprocess.Popen(['ls'])",
|
|
17
|
+
"result = managed_proc = resource_ctx.managed_process("
|
|
18
|
+
"subprocess.Popen(['ls'])",
|
|
19
|
+
),
|
|
20
|
+
],
|
|
21
|
+
description="Replace subprocess.Popen with managed version",
|
|
22
|
+
),
|
|
23
|
+
"replace_subprocess_popen_assignment": ValidatedPattern(
|
|
24
|
+
name="replace_subprocess_popen_assignment",
|
|
25
|
+
pattern=r"(\w+)\s*=\s*subprocess\.Popen\(",
|
|
26
|
+
replacement=r"process = subprocess.Popen(",
|
|
27
|
+
test_cases=[
|
|
28
|
+
("proc = subprocess.Popen(cmd)", "process = subprocess.Popen(cmd)"),
|
|
29
|
+
(
|
|
30
|
+
"my_process = subprocess.Popen(['ls'])",
|
|
31
|
+
"process = subprocess.Popen(['ls'])",
|
|
32
|
+
),
|
|
33
|
+
],
|
|
34
|
+
description="Replace subprocess.Popen assignment with standard variable name",
|
|
35
|
+
),
|
|
36
|
+
}
|