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,226 @@
|
|
|
1
|
+
"""Formatting and whitespace normalization patterns."""
|
|
2
|
+
|
|
3
|
+
from .core import ValidatedPattern
|
|
4
|
+
|
|
5
|
+
PATTERNS: dict[str, ValidatedPattern] = {
|
|
6
|
+
"fix_command_spacing": ValidatedPattern(
|
|
7
|
+
name="fix_command_spacing",
|
|
8
|
+
pattern=r"python\s*-\s*m\s+(\w+)",
|
|
9
|
+
replacement=r"python -m \1",
|
|
10
|
+
description="Fix spacing in 'python -m command' patterns",
|
|
11
|
+
test_cases=[
|
|
12
|
+
("python - m crackerjack", "python -m crackerjack"),
|
|
13
|
+
("python -m crackerjack", "python -m crackerjack"),
|
|
14
|
+
("python - m pytest", "python -m pytest"),
|
|
15
|
+
("other python - m stuff", "other python -m stuff"),
|
|
16
|
+
],
|
|
17
|
+
),
|
|
18
|
+
"fix_long_flag_spacing": ValidatedPattern(
|
|
19
|
+
name="fix_long_flag_spacing",
|
|
20
|
+
pattern=r"-\s*-\s*(\w+(?: -\w+)*)",
|
|
21
|
+
replacement=r"--\1",
|
|
22
|
+
description="Fix spacing in long flags like '--help'",
|
|
23
|
+
test_cases=[
|
|
24
|
+
("- - help", "--help"),
|
|
25
|
+
("- - ai-fix", "--ai-fix"),
|
|
26
|
+
("--help", "--help"),
|
|
27
|
+
("- - start-websocket-server", "--start-websocket-server"),
|
|
28
|
+
],
|
|
29
|
+
),
|
|
30
|
+
"fix_short_flag_spacing": ValidatedPattern(
|
|
31
|
+
name="fix_short_flag_spacing",
|
|
32
|
+
pattern=r"(?<!\w)-\s+(\w)(?!\w)",
|
|
33
|
+
replacement=r"-\1",
|
|
34
|
+
description="Fix spacing in short flags like '-t'",
|
|
35
|
+
test_cases=[
|
|
36
|
+
("python -m crackerjack - t", "python -m crackerjack -t"),
|
|
37
|
+
("- q", "-q"),
|
|
38
|
+
("-t", "-t"),
|
|
39
|
+
("some - x flag", "some -x flag"),
|
|
40
|
+
],
|
|
41
|
+
),
|
|
42
|
+
"fix_hyphenated_names": ValidatedPattern(
|
|
43
|
+
name="fix_hyphenated_names",
|
|
44
|
+
pattern=r"(\w+)\s*-\s*(\w+)",
|
|
45
|
+
replacement=r"\1-\2",
|
|
46
|
+
description="Fix spacing in hyphenated names and identifiers",
|
|
47
|
+
test_cases=[
|
|
48
|
+
("python - pro", "python-pro"),
|
|
49
|
+
(
|
|
50
|
+
"pytest - hypothesis - specialist",
|
|
51
|
+
"pytest-hypothesis - specialist",
|
|
52
|
+
),
|
|
53
|
+
("backend - architect", "backend-architect"),
|
|
54
|
+
("python-pro", "python-pro"),
|
|
55
|
+
("end - of - file-fixer", "end-of - file-fixer"),
|
|
56
|
+
],
|
|
57
|
+
),
|
|
58
|
+
"fix_hyphenated_names_global": ValidatedPattern(
|
|
59
|
+
name="fix_hyphenated_names_global",
|
|
60
|
+
pattern=r"(\w+)\s+-\s+(\w+)",
|
|
61
|
+
replacement=r"\1-\2",
|
|
62
|
+
description="Globally fix spacing in hyphenated names (single pass only)",
|
|
63
|
+
global_replace=True,
|
|
64
|
+
test_cases=[
|
|
65
|
+
("python - pro", "python-pro"),
|
|
66
|
+
("end - of - file", "end-of - file"),
|
|
67
|
+
("already-hyphenated", "already-hyphenated"),
|
|
68
|
+
("start - middle - end", "start-middle - end"),
|
|
69
|
+
],
|
|
70
|
+
),
|
|
71
|
+
"fix_spaced_hyphens": ValidatedPattern(
|
|
72
|
+
name="fix_spaced_hyphens",
|
|
73
|
+
pattern=r"(\w+)\s+-\s+(\w+)",
|
|
74
|
+
replacement=r"\1-\2",
|
|
75
|
+
description="Fix spaced hyphens with spaces around dashes (use apply_iteratively for multi-word)",
|
|
76
|
+
global_replace=True,
|
|
77
|
+
test_cases=[
|
|
78
|
+
("python - pro", "python-pro"),
|
|
79
|
+
(
|
|
80
|
+
"pytest - hypothesis - specialist",
|
|
81
|
+
"pytest-hypothesis - specialist",
|
|
82
|
+
),
|
|
83
|
+
(
|
|
84
|
+
"end - of - file - fixer",
|
|
85
|
+
"end-of - file-fixer",
|
|
86
|
+
),
|
|
87
|
+
("already-hyphenated", "already-hyphenated"),
|
|
88
|
+
("mixed-case with - spaces", "mixed-case with-spaces"),
|
|
89
|
+
],
|
|
90
|
+
),
|
|
91
|
+
"fix_debug_log_pattern": ValidatedPattern(
|
|
92
|
+
name="fix_debug_log_pattern",
|
|
93
|
+
pattern=r"crackerjack\s*-\s*debug",
|
|
94
|
+
replacement="crackerjack-debug",
|
|
95
|
+
description="Fix spacing in debug log patterns",
|
|
96
|
+
test_cases=[
|
|
97
|
+
("crackerjack - debug-12345.log", "crackerjack-debug-12345.log"),
|
|
98
|
+
("crackerjack-debug.log", "crackerjack-debug.log"),
|
|
99
|
+
("old crackerjack - debug files", "old crackerjack-debug files"),
|
|
100
|
+
],
|
|
101
|
+
),
|
|
102
|
+
"fix_job_file_pattern": ValidatedPattern(
|
|
103
|
+
name="fix_job_file_pattern",
|
|
104
|
+
pattern=r"job\s*-\s*(\{[^}]+\}|\w+)",
|
|
105
|
+
replacement=r"job-\1",
|
|
106
|
+
description="Fix spacing in job file patterns",
|
|
107
|
+
test_cases=[
|
|
108
|
+
("job - {self.web_job_id}.json", "job-{self.web_job_id}.json"),
|
|
109
|
+
("job - abc123.json", "job-abc123.json"),
|
|
110
|
+
("job-existing.json", "job-existing.json"),
|
|
111
|
+
],
|
|
112
|
+
),
|
|
113
|
+
"fix_markdown_bold": ValidatedPattern(
|
|
114
|
+
name="fix_markdown_bold",
|
|
115
|
+
pattern=r"\*\s+\*(.+?)\s*\*\s+\*",
|
|
116
|
+
replacement=r"**\1**",
|
|
117
|
+
description="Fix spacing in markdown bold patterns",
|
|
118
|
+
test_cases=[
|
|
119
|
+
("* *Bold Text * *", "**Bold Text**"),
|
|
120
|
+
("* *🧪 pytest-specialist * *", "**🧪 pytest-specialist**"),
|
|
121
|
+
("**Already Bold**", "**Already Bold**"),
|
|
122
|
+
],
|
|
123
|
+
),
|
|
124
|
+
"remove_trailing_whitespace": ValidatedPattern(
|
|
125
|
+
name="remove_trailing_whitespace",
|
|
126
|
+
pattern=r"[ \t]+$",
|
|
127
|
+
replacement="",
|
|
128
|
+
description="Remove trailing whitespace from lines",
|
|
129
|
+
global_replace=True,
|
|
130
|
+
test_cases=[
|
|
131
|
+
("line with spaces ", "line with spaces"),
|
|
132
|
+
("line with tabs\t\t", "line with tabs"),
|
|
133
|
+
("normal line", "normal line"),
|
|
134
|
+
("mixed \t ", "mixed"),
|
|
135
|
+
("", ""),
|
|
136
|
+
],
|
|
137
|
+
),
|
|
138
|
+
"normalize_multiple_newlines": ValidatedPattern(
|
|
139
|
+
name="normalize_multiple_newlines",
|
|
140
|
+
pattern=r"\n{3,}",
|
|
141
|
+
replacement="\n\n",
|
|
142
|
+
description="Normalize multiple consecutive newlines to maximum 2",
|
|
143
|
+
global_replace=True,
|
|
144
|
+
test_cases=[
|
|
145
|
+
("line1\n\n\nline2", "line1\n\nline2"),
|
|
146
|
+
("line1\n\n\n\n\nline2", "line1\n\nline2"),
|
|
147
|
+
("line1\n\nline2", "line1\n\nline2"),
|
|
148
|
+
("line1\nline2", "line1\nline2"),
|
|
149
|
+
],
|
|
150
|
+
),
|
|
151
|
+
"normalize_assert_statements": ValidatedPattern(
|
|
152
|
+
name="normalize_assert_statements",
|
|
153
|
+
pattern=r"assert (.+?)\s*==\s*(.+)",
|
|
154
|
+
replacement=r"assert \1 == \2",
|
|
155
|
+
description="Normalize spacing around == in assert statements",
|
|
156
|
+
global_replace=True,
|
|
157
|
+
test_cases=[
|
|
158
|
+
("assert result==expected", "assert result == expected"),
|
|
159
|
+
("assert value == other", "assert value == other"),
|
|
160
|
+
("assert result== expected", "assert result == expected"),
|
|
161
|
+
("assert result ==expected", "assert result == expected"),
|
|
162
|
+
(
|
|
163
|
+
"assert result == expected",
|
|
164
|
+
"assert result == expected",
|
|
165
|
+
),
|
|
166
|
+
],
|
|
167
|
+
),
|
|
168
|
+
"spacing_after_comma": ValidatedPattern(
|
|
169
|
+
name="spacing_after_comma",
|
|
170
|
+
pattern=r",(?! |\n|$)",
|
|
171
|
+
replacement=r", ",
|
|
172
|
+
description="Add space after comma if missing (skip if already spaced, at end of line, or end of string)",
|
|
173
|
+
global_replace=True,
|
|
174
|
+
test_cases=[
|
|
175
|
+
("func(a,b,c)", "func(a, b, c)"),
|
|
176
|
+
("func(a, b, c)", "func(a, b, c)"),
|
|
177
|
+
("[1,2,3]", "[1, 2, 3]"),
|
|
178
|
+
("[1, 2, 3]", "[1, 2, 3]"),
|
|
179
|
+
("{'x':1,'y':2,'z':3}", "{'x':1, 'y':2, 'z':3}"),
|
|
180
|
+
("trailing,\nnewline", "trailing,\nnewline"),
|
|
181
|
+
("end_comma,", "end_comma,"),
|
|
182
|
+
],
|
|
183
|
+
),
|
|
184
|
+
"spacing_after_colon": ValidatedPattern(
|
|
185
|
+
name="spacing_after_colon",
|
|
186
|
+
pattern=r"(?<!https)(?<!http)(?<!ftp)(?<!file)(?<!: )(\b[a-zA-Z_][a-zA-Z0-9_]*):([a-zA-Z0-9_][^ \n:]*)",
|
|
187
|
+
replacement=r"\1: \2",
|
|
188
|
+
global_replace=True,
|
|
189
|
+
description="Add space after colon if missing (avoid double colons, URLs, and protocols)",
|
|
190
|
+
test_cases=[
|
|
191
|
+
("def func(x: int, y: str): ", "def func(x: int, y: str): "),
|
|
192
|
+
("dict_item = {'key': 'value'}", "dict_item = {'key': 'value'}"),
|
|
193
|
+
("already: spaced: properly", "already: spaced: properly"),
|
|
194
|
+
("class::method", "class::method"),
|
|
195
|
+
("https://github.com", "https://github.com"),
|
|
196
|
+
("http://example.com", "http://example.com"),
|
|
197
|
+
("ftp://server.com", "ftp://server.com"),
|
|
198
|
+
("repo:local", "repo: local"),
|
|
199
|
+
],
|
|
200
|
+
),
|
|
201
|
+
"multiple_spaces": ValidatedPattern(
|
|
202
|
+
name="multiple_spaces",
|
|
203
|
+
pattern=r" {2,}",
|
|
204
|
+
replacement=r" ",
|
|
205
|
+
description="Replace multiple spaces with single space",
|
|
206
|
+
global_replace=True,
|
|
207
|
+
test_cases=[
|
|
208
|
+
("def func( x, y ): ", "def func( x, y ): "),
|
|
209
|
+
("single space only", "single space only"),
|
|
210
|
+
("lots of spaces", "lots of spaces"),
|
|
211
|
+
("\tkeep\ttabs\tbut fix spaces", "\tkeep\ttabs\tbut fix spaces"),
|
|
212
|
+
],
|
|
213
|
+
),
|
|
214
|
+
"normalize_whitespace": ValidatedPattern(
|
|
215
|
+
name="normalize_whitespace",
|
|
216
|
+
pattern=r"\s+",
|
|
217
|
+
replacement=r" ",
|
|
218
|
+
description="Normalize multiple whitespace to single space",
|
|
219
|
+
global_replace=True,
|
|
220
|
+
test_cases=[
|
|
221
|
+
("import module", "import module"),
|
|
222
|
+
("from pkg import item", "from pkg import item"),
|
|
223
|
+
("normal text", "normal text"),
|
|
224
|
+
],
|
|
225
|
+
),
|
|
226
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"""Utility functions for regex pattern operations."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
# Import for type checking - circular import avoided
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from .core import MAX_ITERATIONS, CompiledPatternCache, ValidatedPattern
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
pass # SAFE_PATTERNS imported at runtime to avoid circular imports
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def validate_all_patterns() -> dict[str, bool]:
|
|
15
|
+
"""Validate all patterns in the registry."""
|
|
16
|
+
from . import SAFE_PATTERNS
|
|
17
|
+
|
|
18
|
+
results: dict[str, bool] = {}
|
|
19
|
+
for name, pattern in SAFE_PATTERNS.items():
|
|
20
|
+
try:
|
|
21
|
+
pattern._validate()
|
|
22
|
+
results[name] = True
|
|
23
|
+
except ValueError as e:
|
|
24
|
+
results[name] = False
|
|
25
|
+
print(f"Pattern '{name}' failed validation: {e}")
|
|
26
|
+
return results
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def find_pattern_for_text(text: str) -> list[str]:
|
|
30
|
+
"""Find all patterns that match the given text."""
|
|
31
|
+
from . import SAFE_PATTERNS
|
|
32
|
+
|
|
33
|
+
return [name for name, pattern in SAFE_PATTERNS.items() if pattern.test(text)]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def apply_safe_replacement(text: str, pattern_name: str) -> str:
|
|
37
|
+
"""Apply a named pattern to text."""
|
|
38
|
+
from . import SAFE_PATTERNS
|
|
39
|
+
|
|
40
|
+
if pattern_name not in SAFE_PATTERNS:
|
|
41
|
+
raise ValueError(f"Unknown pattern: {pattern_name}")
|
|
42
|
+
|
|
43
|
+
return SAFE_PATTERNS[pattern_name].apply(text)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def get_pattern_description(pattern_name: str) -> str:
|
|
47
|
+
"""Get description for a named pattern."""
|
|
48
|
+
from . import SAFE_PATTERNS
|
|
49
|
+
|
|
50
|
+
if pattern_name not in SAFE_PATTERNS:
|
|
51
|
+
return "Unknown pattern"
|
|
52
|
+
|
|
53
|
+
return SAFE_PATTERNS[pattern_name].description
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def fix_multi_word_hyphenation(text: str) -> str:
|
|
57
|
+
"""Fix multi-word hyphenation iteratively."""
|
|
58
|
+
from . import SAFE_PATTERNS
|
|
59
|
+
|
|
60
|
+
return SAFE_PATTERNS["fix_spaced_hyphens"].apply_iteratively(text)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def update_pyproject_version(content: str, new_version: str) -> str:
|
|
64
|
+
"""Update version in pyproject.toml content."""
|
|
65
|
+
from . import SAFE_PATTERNS
|
|
66
|
+
|
|
67
|
+
pattern_obj = SAFE_PATTERNS["update_pyproject_version"]
|
|
68
|
+
|
|
69
|
+
temp_pattern = ValidatedPattern(
|
|
70
|
+
name="temp_version_update",
|
|
71
|
+
pattern=pattern_obj.pattern,
|
|
72
|
+
replacement=f"\\g<1>{new_version}\\g<3>",
|
|
73
|
+
description=f"Update version to {new_version}",
|
|
74
|
+
test_cases=[
|
|
75
|
+
('version = "1.2.3"', f'version = "{new_version}"'),
|
|
76
|
+
],
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return re.compile(pattern_obj.pattern, re.MULTILINE).sub(
|
|
80
|
+
temp_pattern.replacement, content
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def apply_formatting_fixes(content: str) -> str:
|
|
85
|
+
"""Apply common formatting fixes to content."""
|
|
86
|
+
from . import SAFE_PATTERNS
|
|
87
|
+
|
|
88
|
+
pattern = SAFE_PATTERNS["remove_trailing_whitespace"]
|
|
89
|
+
content = re.compile(pattern.pattern, re.MULTILINE).sub(
|
|
90
|
+
pattern.replacement, content
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
content = SAFE_PATTERNS["normalize_multiple_newlines"].apply(content)
|
|
94
|
+
|
|
95
|
+
return content
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def apply_security_fixes(content: str) -> str:
|
|
99
|
+
"""Apply common security fixes to content."""
|
|
100
|
+
from . import SAFE_PATTERNS
|
|
101
|
+
|
|
102
|
+
content = SAFE_PATTERNS["fix_subprocess_run_shell"].apply(content)
|
|
103
|
+
content = SAFE_PATTERNS["fix_subprocess_call_shell"].apply(content)
|
|
104
|
+
content = SAFE_PATTERNS["fix_subprocess_popen_shell"].apply(content)
|
|
105
|
+
|
|
106
|
+
content = SAFE_PATTERNS["fix_unsafe_yaml_load"].apply(content)
|
|
107
|
+
content = SAFE_PATTERNS["fix_weak_md5_hash"].apply(content)
|
|
108
|
+
content = SAFE_PATTERNS["fix_weak_sha1_hash"].apply(content)
|
|
109
|
+
content = SAFE_PATTERNS["fix_insecure_random_choice"].apply(content)
|
|
110
|
+
|
|
111
|
+
content = SAFE_PATTERNS["remove_debug_prints_with_secrets"].apply(content)
|
|
112
|
+
|
|
113
|
+
return content
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def apply_test_fixes(content: str) -> str:
|
|
117
|
+
"""Apply common test-related fixes to content."""
|
|
118
|
+
from . import SAFE_PATTERNS
|
|
119
|
+
|
|
120
|
+
return SAFE_PATTERNS["normalize_assert_statements"].apply(content)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def is_valid_job_id(job_id: str) -> bool:
|
|
124
|
+
"""Check if a job ID is valid."""
|
|
125
|
+
from . import SAFE_PATTERNS
|
|
126
|
+
|
|
127
|
+
return SAFE_PATTERNS["validate_job_id_alphanumeric"].test(job_id)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def remove_coverage_fail_under(addopts: str) -> str:
|
|
131
|
+
"""Remove --cov-fail-under from pytest addopts."""
|
|
132
|
+
from . import SAFE_PATTERNS
|
|
133
|
+
|
|
134
|
+
return SAFE_PATTERNS["remove_coverage_fail_under"].apply(addopts)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def update_coverage_requirement(content: str, new_coverage: float) -> str:
|
|
138
|
+
"""Update coverage requirement to a new value."""
|
|
139
|
+
from . import SAFE_PATTERNS
|
|
140
|
+
|
|
141
|
+
pattern_obj = SAFE_PATTERNS["update_coverage_requirement"]
|
|
142
|
+
|
|
143
|
+
temp_pattern = ValidatedPattern(
|
|
144
|
+
name="temp_coverage_update",
|
|
145
|
+
pattern=pattern_obj.pattern,
|
|
146
|
+
replacement=f"\\1{new_coverage: .0f}",
|
|
147
|
+
description=f"Update coverage to {new_coverage}",
|
|
148
|
+
test_cases=[
|
|
149
|
+
("--cov-fail-under=85", f"--cov-fail-under={new_coverage: .0f}"),
|
|
150
|
+
],
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
return re.compile(pattern_obj.pattern).sub(temp_pattern.replacement, content)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def update_repo_revision(content: str, repo_url: str, new_revision: str) -> str:
|
|
157
|
+
"""Update repository revision in content."""
|
|
158
|
+
escaped_url = re.escape(repo_url)
|
|
159
|
+
pattern = rf'("repo": "{escaped_url}".*?"rev": )"([^"]+)"'
|
|
160
|
+
replacement = rf'\1"{new_revision}"'
|
|
161
|
+
|
|
162
|
+
return re.compile(pattern, re.DOTALL).sub(replacement, content)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def sanitize_internal_urls(text: str) -> str:
|
|
166
|
+
"""Sanitize all internal URLs in text."""
|
|
167
|
+
from . import SAFE_PATTERNS
|
|
168
|
+
|
|
169
|
+
url_patterns = [
|
|
170
|
+
"sanitize_localhost_urls",
|
|
171
|
+
"sanitize_127_urls",
|
|
172
|
+
"sanitize_any_localhost_urls",
|
|
173
|
+
"sanitize_ws_localhost_urls",
|
|
174
|
+
"sanitize_ws_127_urls",
|
|
175
|
+
"sanitize_simple_localhost_urls",
|
|
176
|
+
"sanitize_simple_ws_localhost_urls",
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
result = text
|
|
180
|
+
for pattern_name in url_patterns:
|
|
181
|
+
result = SAFE_PATTERNS[pattern_name].apply(result)
|
|
182
|
+
|
|
183
|
+
return result
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def apply_pattern_iteratively(
|
|
187
|
+
text: str, pattern_name: str, max_iterations: int = MAX_ITERATIONS
|
|
188
|
+
) -> str:
|
|
189
|
+
"""Apply a pattern iteratively until no more changes."""
|
|
190
|
+
from . import SAFE_PATTERNS
|
|
191
|
+
|
|
192
|
+
if pattern_name not in SAFE_PATTERNS:
|
|
193
|
+
raise ValueError(f"Unknown pattern: {pattern_name}")
|
|
194
|
+
|
|
195
|
+
return SAFE_PATTERNS[pattern_name].apply_iteratively(text, max_iterations)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def get_all_pattern_stats() -> dict[str, dict[str, float] | dict[str, str]]:
|
|
199
|
+
"""Get performance statistics for all patterns."""
|
|
200
|
+
from . import SAFE_PATTERNS
|
|
201
|
+
|
|
202
|
+
test_text = "python - m crackerjack - t with pytest - hypothesis - specialist"
|
|
203
|
+
stats: dict[str, dict[str, float] | dict[str, str]] = {}
|
|
204
|
+
|
|
205
|
+
for name, pattern in SAFE_PATTERNS.items():
|
|
206
|
+
try:
|
|
207
|
+
pattern_stats = pattern.get_performance_stats(test_text, iterations=10)
|
|
208
|
+
stats[name] = pattern_stats
|
|
209
|
+
except Exception as e:
|
|
210
|
+
stats[name] = {"error": str(e)}
|
|
211
|
+
|
|
212
|
+
return stats
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def clear_all_caches() -> None:
|
|
216
|
+
"""Clear all pattern caches."""
|
|
217
|
+
CompiledPatternCache.clear_cache()
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def get_cache_info() -> dict[str, int | list[str]]:
|
|
221
|
+
"""Get cache statistics."""
|
|
222
|
+
return CompiledPatternCache.get_cache_stats()
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def detect_path_traversal_patterns(path_str: str) -> list[str]:
|
|
226
|
+
"""Detect path traversal patterns in a path string."""
|
|
227
|
+
from . import SAFE_PATTERNS
|
|
228
|
+
|
|
229
|
+
detected = []
|
|
230
|
+
traversal_patterns = [
|
|
231
|
+
"detect_directory_traversal_basic",
|
|
232
|
+
"detect_directory_traversal_backslash",
|
|
233
|
+
"detect_url_encoded_traversal",
|
|
234
|
+
"detect_double_url_encoded_traversal",
|
|
235
|
+
]
|
|
236
|
+
|
|
237
|
+
for pattern_name in traversal_patterns:
|
|
238
|
+
pattern = SAFE_PATTERNS[pattern_name]
|
|
239
|
+
if pattern.test(path_str):
|
|
240
|
+
detected.append(pattern_name)
|
|
241
|
+
|
|
242
|
+
return detected
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def detect_null_byte_patterns(path_str: str) -> list[str]:
|
|
246
|
+
"""Detect null byte patterns in a path string."""
|
|
247
|
+
from . import SAFE_PATTERNS
|
|
248
|
+
|
|
249
|
+
detected = []
|
|
250
|
+
null_patterns = [
|
|
251
|
+
"detect_null_bytes_url",
|
|
252
|
+
"detect_null_bytes_literal",
|
|
253
|
+
"detect_utf8_overlong_null",
|
|
254
|
+
]
|
|
255
|
+
|
|
256
|
+
for pattern_name in null_patterns:
|
|
257
|
+
pattern = SAFE_PATTERNS[pattern_name]
|
|
258
|
+
if pattern.test(path_str):
|
|
259
|
+
detected.append(pattern_name)
|
|
260
|
+
|
|
261
|
+
return detected
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def detect_dangerous_directory_patterns(path_str: str) -> list[str]:
|
|
265
|
+
"""Detect dangerous directory access patterns in a path string."""
|
|
266
|
+
from . import SAFE_PATTERNS
|
|
267
|
+
|
|
268
|
+
detected = []
|
|
269
|
+
dangerous_patterns = [
|
|
270
|
+
"detect_sys_directory_pattern",
|
|
271
|
+
"detect_proc_directory_pattern",
|
|
272
|
+
"detect_etc_directory_pattern",
|
|
273
|
+
"detect_boot_directory_pattern",
|
|
274
|
+
"detect_dev_directory_pattern",
|
|
275
|
+
"detect_root_directory_pattern",
|
|
276
|
+
"detect_var_log_directory_pattern",
|
|
277
|
+
"detect_bin_directory_pattern",
|
|
278
|
+
"detect_sbin_directory_pattern",
|
|
279
|
+
]
|
|
280
|
+
|
|
281
|
+
for pattern_name in dangerous_patterns:
|
|
282
|
+
pattern = SAFE_PATTERNS[pattern_name]
|
|
283
|
+
if pattern.test(path_str):
|
|
284
|
+
detected.append(pattern_name)
|
|
285
|
+
|
|
286
|
+
return detected
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def detect_suspicious_path_patterns(path_str: str) -> list[str]:
|
|
290
|
+
"""Detect suspicious path patterns in a path string."""
|
|
291
|
+
from . import SAFE_PATTERNS
|
|
292
|
+
|
|
293
|
+
detected = []
|
|
294
|
+
suspicious_patterns = [
|
|
295
|
+
"detect_parent_directory_in_path",
|
|
296
|
+
"detect_suspicious_temp_traversal",
|
|
297
|
+
"detect_suspicious_var_traversal",
|
|
298
|
+
]
|
|
299
|
+
|
|
300
|
+
for pattern_name in suspicious_patterns:
|
|
301
|
+
pattern = SAFE_PATTERNS[pattern_name]
|
|
302
|
+
if pattern.test(path_str):
|
|
303
|
+
detected.append(pattern_name)
|
|
304
|
+
|
|
305
|
+
return detected
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def validate_path_security(path_str: str) -> dict[str, list[str]]:
|
|
309
|
+
"""Validate path security by checking for various attack patterns."""
|
|
310
|
+
return {
|
|
311
|
+
"traversal_patterns": detect_path_traversal_patterns(path_str),
|
|
312
|
+
"null_bytes": detect_null_byte_patterns(path_str),
|
|
313
|
+
"dangerous_directories": detect_dangerous_directory_patterns(path_str),
|
|
314
|
+
"suspicious_patterns": detect_suspicious_path_patterns(path_str),
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
class RegexPatternsService:
|
|
319
|
+
"""Service class that implements RegexPatternsProtocol.
|
|
320
|
+
|
|
321
|
+
Wraps module-level regex pattern functions to provide a protocol-compliant interface.
|
|
322
|
+
"""
|
|
323
|
+
|
|
324
|
+
def update_pyproject_version(self, content: str, new_version: str) -> str:
|
|
325
|
+
"""Update version in pyproject.toml content."""
|
|
326
|
+
return update_pyproject_version(content, new_version)
|
|
327
|
+
|
|
328
|
+
def remove_coverage_fail_under(self, content: str) -> str:
|
|
329
|
+
"""Remove --cov-fail-under from pytest addopts."""
|
|
330
|
+
return remove_coverage_fail_under(content)
|
|
331
|
+
|
|
332
|
+
def update_version_in_changelog(self, content: str, new_version: str) -> str:
|
|
333
|
+
"""Update version in changelog content."""
|
|
334
|
+
# Placeholder implementation - can be enhanced later
|
|
335
|
+
return content
|
|
336
|
+
|
|
337
|
+
def mask_tokens_in_text(self, text: str) -> str:
|
|
338
|
+
"""Mask sensitive tokens in text."""
|
|
339
|
+
return sanitize_internal_urls(text)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Security-related patterns for credential detection, path traversal, and unsafe operations.
|
|
2
|
+
|
|
3
|
+
This module aggregates all security patterns from specialized submodules:
|
|
4
|
+
- credentials: Hardcoded credentials, secrets, tokens, and passwords (9 patterns)
|
|
5
|
+
- path_traversal: Directory traversal and unsafe path access (19 patterns)
|
|
6
|
+
- unsafe_operations: Weak crypto, insecure random, subprocess injection (14 patterns)
|
|
7
|
+
- code_injection: SQL injection, code eval, system commands (8 patterns)
|
|
8
|
+
|
|
9
|
+
Total: 50 security patterns
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from ..core import ValidatedPattern
|
|
13
|
+
from .code_injection import PATTERNS as CODE_INJECTION_PATTERNS
|
|
14
|
+
from .credentials import PATTERNS as CREDENTIAL_PATTERNS
|
|
15
|
+
from .path_traversal import PATTERNS as PATH_TRAVERSAL_PATTERNS
|
|
16
|
+
from .unsafe_operations import PATTERNS as UNSAFE_OPERATION_PATTERNS
|
|
17
|
+
|
|
18
|
+
PATTERNS: dict[str, ValidatedPattern] = (
|
|
19
|
+
CREDENTIAL_PATTERNS
|
|
20
|
+
| PATH_TRAVERSAL_PATTERNS
|
|
21
|
+
| UNSAFE_OPERATION_PATTERNS
|
|
22
|
+
| CODE_INJECTION_PATTERNS
|
|
23
|
+
)
|