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,493 @@
|
|
|
1
|
+
"""Service for generating documentation from extracted API data."""
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from string import Template
|
|
6
|
+
|
|
7
|
+
from acb.console import Console
|
|
8
|
+
from acb.depends import Inject, depends
|
|
9
|
+
|
|
10
|
+
from ..models.protocols import DocumentationGeneratorProtocol
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MarkdownTemplateRenderer:
|
|
14
|
+
"""Simple template renderer for markdown documentation."""
|
|
15
|
+
|
|
16
|
+
def __init__(self) -> None:
|
|
17
|
+
self.built_in_templates = self._init_builtin_templates()
|
|
18
|
+
|
|
19
|
+
def _init_builtin_templates(self) -> dict[str, Template]:
|
|
20
|
+
"""Initialize built-in template strings."""
|
|
21
|
+
return {
|
|
22
|
+
"api_reference": Template(self._get_api_reference_template()),
|
|
23
|
+
"function_doc": Template(self._get_function_doc_template()),
|
|
24
|
+
"class_doc": Template(self._get_class_doc_template()),
|
|
25
|
+
"protocol_doc": Template(self._get_protocol_doc_template()),
|
|
26
|
+
"module_doc": Template(self._get_module_doc_template()),
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
def render_template(self, template_name: str, context: dict[str, t.Any]) -> str:
|
|
30
|
+
"""Render a template with the given context."""
|
|
31
|
+
if template_name in self.built_in_templates:
|
|
32
|
+
template = self.built_in_templates[template_name]
|
|
33
|
+
return template.safe_substitute(context)
|
|
34
|
+
|
|
35
|
+
# Try to load external template file
|
|
36
|
+
template_path = Path(f"templates/{template_name}")
|
|
37
|
+
if template_path.exists():
|
|
38
|
+
content = template_path.read_text(encoding="utf-8")
|
|
39
|
+
template = Template(content)
|
|
40
|
+
return template.safe_substitute(context)
|
|
41
|
+
|
|
42
|
+
raise ValueError(f"Template '{template_name}' not found")
|
|
43
|
+
|
|
44
|
+
def _get_api_reference_template(self) -> str:
|
|
45
|
+
"""Get the API reference template."""
|
|
46
|
+
return """# API Reference
|
|
47
|
+
|
|
48
|
+
## Overview
|
|
49
|
+
$overview
|
|
50
|
+
|
|
51
|
+
## Protocols
|
|
52
|
+
$protocols_section
|
|
53
|
+
|
|
54
|
+
## Services
|
|
55
|
+
$services_section
|
|
56
|
+
|
|
57
|
+
## Managers
|
|
58
|
+
$managers_section
|
|
59
|
+
|
|
60
|
+
## Generated on: $timestamp
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
def _get_function_doc_template(self) -> str:
|
|
64
|
+
"""Get the function documentation template."""
|
|
65
|
+
return """### $name
|
|
66
|
+
|
|
67
|
+
$description
|
|
68
|
+
|
|
69
|
+
**Parameters:**
|
|
70
|
+
$parameters
|
|
71
|
+
|
|
72
|
+
**Returns:** $returns
|
|
73
|
+
|
|
74
|
+
**Example:**
|
|
75
|
+
```python
|
|
76
|
+
$example
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
def _get_class_doc_template(self) -> str:
|
|
82
|
+
"""Get the class documentation template."""
|
|
83
|
+
return """## $name
|
|
84
|
+
|
|
85
|
+
$description
|
|
86
|
+
|
|
87
|
+
**Base Classes:** $base_classes
|
|
88
|
+
|
|
89
|
+
### Methods
|
|
90
|
+
|
|
91
|
+
$methods
|
|
92
|
+
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
def _get_protocol_doc_template(self) -> str:
|
|
96
|
+
"""Get the protocol documentation template."""
|
|
97
|
+
return """## $name (Protocol)
|
|
98
|
+
|
|
99
|
+
$description
|
|
100
|
+
|
|
101
|
+
**Runtime Checkable:** $runtime_checkable
|
|
102
|
+
|
|
103
|
+
### Required Methods
|
|
104
|
+
|
|
105
|
+
$methods
|
|
106
|
+
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
def _get_module_doc_template(self) -> str:
|
|
110
|
+
"""Get the module documentation template."""
|
|
111
|
+
return """# $module_name
|
|
112
|
+
|
|
113
|
+
$description
|
|
114
|
+
|
|
115
|
+
## Classes
|
|
116
|
+
|
|
117
|
+
$classes
|
|
118
|
+
|
|
119
|
+
## Functions
|
|
120
|
+
|
|
121
|
+
$functions
|
|
122
|
+
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class DocumentationGeneratorImpl(DocumentationGeneratorProtocol):
|
|
127
|
+
"""Implementation of documentation generation from extracted API data."""
|
|
128
|
+
|
|
129
|
+
@depends.inject
|
|
130
|
+
def __init__(self, console: Inject[Console]) -> None:
|
|
131
|
+
self.console = console
|
|
132
|
+
self.renderer = MarkdownTemplateRenderer()
|
|
133
|
+
|
|
134
|
+
def generate_api_reference(self, api_data: dict[str, t.Any]) -> str:
|
|
135
|
+
"""Generate complete API reference documentation."""
|
|
136
|
+
overview = self._generate_overview(api_data)
|
|
137
|
+
protocols_section = self._generate_protocols_section(
|
|
138
|
+
api_data.get("protocols", {})
|
|
139
|
+
)
|
|
140
|
+
services_section = self._generate_services_section(api_data.get("services", {}))
|
|
141
|
+
managers_section = self._generate_managers_section(api_data.get("managers", {}))
|
|
142
|
+
|
|
143
|
+
from datetime import datetime
|
|
144
|
+
|
|
145
|
+
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
146
|
+
|
|
147
|
+
context = {
|
|
148
|
+
"overview": overview,
|
|
149
|
+
"protocols_section": protocols_section,
|
|
150
|
+
"services_section": services_section,
|
|
151
|
+
"managers_section": managers_section,
|
|
152
|
+
"timestamp": timestamp,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return self.renderer.render_template("api_reference", context)
|
|
156
|
+
|
|
157
|
+
def generate_user_guide(self, template_context: dict[str, t.Any]) -> str:
|
|
158
|
+
"""Generate user guide documentation."""
|
|
159
|
+
sections: list[str] = []
|
|
160
|
+
|
|
161
|
+
# Generate getting started section
|
|
162
|
+
if "installation" in template_context:
|
|
163
|
+
sections.extend(
|
|
164
|
+
("## Getting Started\n", template_context["installation"], "\n")
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
# Generate usage examples
|
|
168
|
+
if "examples" in template_context:
|
|
169
|
+
sections.append("## Usage Examples\n")
|
|
170
|
+
for example in template_context["examples"]:
|
|
171
|
+
sections.extend(
|
|
172
|
+
(
|
|
173
|
+
f"### {example.get('title', 'Example')}\n",
|
|
174
|
+
f"{example.get('description', '')}\n",
|
|
175
|
+
)
|
|
176
|
+
)
|
|
177
|
+
if "code" in example:
|
|
178
|
+
sections.append(f"```bash\n{example['code']}\n```\n")
|
|
179
|
+
sections.append("\n")
|
|
180
|
+
|
|
181
|
+
# Generate configuration section
|
|
182
|
+
if "configuration" in template_context:
|
|
183
|
+
sections.extend(
|
|
184
|
+
("## Configuration\n", template_context["configuration"], "\n")
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
return "".join(sections)
|
|
188
|
+
|
|
189
|
+
def generate_changelog_update(self, version: str, changes: dict[str, t.Any]) -> str:
|
|
190
|
+
"""Generate changelog entry for a version."""
|
|
191
|
+
from datetime import datetime
|
|
192
|
+
|
|
193
|
+
today = datetime.now().strftime("%Y-%m-%d")
|
|
194
|
+
|
|
195
|
+
lines = [f"## [{version}] - {today}\n"]
|
|
196
|
+
|
|
197
|
+
# Order sections by importance
|
|
198
|
+
section_order = [
|
|
199
|
+
("Added", "added"),
|
|
200
|
+
("Changed", "changed"),
|
|
201
|
+
("Fixed", "fixed"),
|
|
202
|
+
("Removed", "removed"),
|
|
203
|
+
("Security", "security"),
|
|
204
|
+
("Deprecated", "deprecated"),
|
|
205
|
+
]
|
|
206
|
+
|
|
207
|
+
for section_title, section_key in section_order:
|
|
208
|
+
if section_key in changes and changes[section_key]:
|
|
209
|
+
lines.append(f"### {section_title}\n")
|
|
210
|
+
for change in changes[section_key]:
|
|
211
|
+
lines.append(f"- {change}\n")
|
|
212
|
+
lines.append("\n")
|
|
213
|
+
|
|
214
|
+
return "".join(lines)
|
|
215
|
+
|
|
216
|
+
def render_template(self, template_path: Path, context: dict[str, t.Any]) -> str:
|
|
217
|
+
"""Render a template file with the given context."""
|
|
218
|
+
if not template_path.exists():
|
|
219
|
+
raise FileNotFoundError(f"Template not found: {template_path}")
|
|
220
|
+
|
|
221
|
+
content = template_path.read_text(encoding="utf-8")
|
|
222
|
+
template = Template(content)
|
|
223
|
+
return template.safe_substitute(context)
|
|
224
|
+
|
|
225
|
+
def generate_cross_references(
|
|
226
|
+
self, api_data: dict[str, t.Any]
|
|
227
|
+
) -> dict[str, list[str]]:
|
|
228
|
+
"""Generate cross-reference mappings for API components."""
|
|
229
|
+
cross_refs = {}
|
|
230
|
+
|
|
231
|
+
# Extract all API names
|
|
232
|
+
all_names = set()
|
|
233
|
+
|
|
234
|
+
# Add protocol names
|
|
235
|
+
protocols = api_data.get("protocols", {})
|
|
236
|
+
all_names.update(protocols.keys())
|
|
237
|
+
|
|
238
|
+
# Add class names from modules
|
|
239
|
+
modules = api_data.get("modules", {})
|
|
240
|
+
for module_data in modules.values():
|
|
241
|
+
all_names.update(
|
|
242
|
+
class_info["name"] for class_info in module_data.get("classes", [])
|
|
243
|
+
)
|
|
244
|
+
all_names.update(
|
|
245
|
+
func_info["name"] for func_info in module_data.get("functions", [])
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# Generate cross-references by finding mentions
|
|
249
|
+
for name in all_names:
|
|
250
|
+
refs = self._find_references_to_name(name, api_data)
|
|
251
|
+
if refs:
|
|
252
|
+
cross_refs[name] = refs
|
|
253
|
+
|
|
254
|
+
return cross_refs
|
|
255
|
+
|
|
256
|
+
def _generate_overview(self, api_data: dict[str, t.Any]) -> str:
|
|
257
|
+
"""Generate overview section for API documentation."""
|
|
258
|
+
stats = self._calculate_api_stats(api_data)
|
|
259
|
+
|
|
260
|
+
overview_lines = [
|
|
261
|
+
"This document provides comprehensive API reference for all protocols, services, and managers in the codebase.\n",
|
|
262
|
+
f"**Total Protocols:** {stats['protocols']}\n",
|
|
263
|
+
f"**Total Classes:** {stats['classes']}\n",
|
|
264
|
+
f"**Total Functions:** {stats['functions']}\n",
|
|
265
|
+
f"**Total Modules:** {stats['modules']}\n",
|
|
266
|
+
]
|
|
267
|
+
|
|
268
|
+
return "".join(overview_lines)
|
|
269
|
+
|
|
270
|
+
def _generate_protocols_section(self, protocols: dict[str, t.Any]) -> str:
|
|
271
|
+
"""Generate the protocols section of API documentation."""
|
|
272
|
+
if not protocols:
|
|
273
|
+
return "No protocols found.\n"
|
|
274
|
+
|
|
275
|
+
sections = []
|
|
276
|
+
for protocol_name, protocol_info in protocols.items():
|
|
277
|
+
context = {
|
|
278
|
+
"name": protocol_name,
|
|
279
|
+
"description": protocol_info.get("docstring", {}).get(
|
|
280
|
+
"description", "No description provided."
|
|
281
|
+
),
|
|
282
|
+
"runtime_checkable": "Yes"
|
|
283
|
+
if protocol_info.get("runtime_checkable", False)
|
|
284
|
+
else "No",
|
|
285
|
+
"methods": self._format_methods(protocol_info.get("methods", [])),
|
|
286
|
+
}
|
|
287
|
+
sections.append(self.renderer.render_template("protocol_doc", context))
|
|
288
|
+
|
|
289
|
+
return "".join(sections)
|
|
290
|
+
|
|
291
|
+
def _generate_services_section(self, services: dict[str, t.Any]) -> str:
|
|
292
|
+
"""Generate the services section of API documentation."""
|
|
293
|
+
if not services:
|
|
294
|
+
return "No services found.\n"
|
|
295
|
+
|
|
296
|
+
sections: list[str] = []
|
|
297
|
+
for service_name, service_info in services.items():
|
|
298
|
+
sections.extend(
|
|
299
|
+
(
|
|
300
|
+
f"## {service_name}\n",
|
|
301
|
+
f"**Path:** `{service_info.get('path', 'Unknown')}`\n\n",
|
|
302
|
+
)
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
if service_info.get("protocols_implemented"):
|
|
306
|
+
sections.append("**Implements Protocols:**\n")
|
|
307
|
+
for protocol in service_info["protocols_implemented"]:
|
|
308
|
+
sections.append(f"- {protocol}\n")
|
|
309
|
+
sections.append("\n")
|
|
310
|
+
|
|
311
|
+
# Add classes from this service
|
|
312
|
+
for class_info in service_info.get("classes", []):
|
|
313
|
+
context = {
|
|
314
|
+
"name": class_info["name"],
|
|
315
|
+
"description": class_info.get("docstring", {}).get(
|
|
316
|
+
"description", "No description provided."
|
|
317
|
+
),
|
|
318
|
+
"base_classes": ", ".join(class_info.get("base_classes", []))
|
|
319
|
+
or "None",
|
|
320
|
+
"methods": self._format_methods(class_info.get("methods", [])),
|
|
321
|
+
}
|
|
322
|
+
sections.append(self.renderer.render_template("class_doc", context))
|
|
323
|
+
|
|
324
|
+
return "".join(sections)
|
|
325
|
+
|
|
326
|
+
def _generate_managers_section(self, managers: dict[str, t.Any]) -> str:
|
|
327
|
+
"""Generate the managers section of API documentation."""
|
|
328
|
+
# Similar to services but focused on manager-specific functionality
|
|
329
|
+
return self._generate_services_section(managers) # Reuse services logic for now
|
|
330
|
+
|
|
331
|
+
def _format_methods(self, methods: list[dict[str, t.Any]]) -> str:
|
|
332
|
+
"""Format method information for documentation."""
|
|
333
|
+
if not methods:
|
|
334
|
+
return "No methods defined.\n"
|
|
335
|
+
|
|
336
|
+
formatted_methods = []
|
|
337
|
+
for method in methods:
|
|
338
|
+
method_lines = [f"#### `{method['name']}`\n"]
|
|
339
|
+
|
|
340
|
+
# Add description
|
|
341
|
+
description = method.get("docstring", {}).get(
|
|
342
|
+
"description", "No description provided."
|
|
343
|
+
)
|
|
344
|
+
method_lines.append(f"{description}\n")
|
|
345
|
+
|
|
346
|
+
# Add parameters
|
|
347
|
+
parameters = method.get("parameters", [])
|
|
348
|
+
if parameters:
|
|
349
|
+
method_lines.append("**Parameters:**\n")
|
|
350
|
+
for param in parameters:
|
|
351
|
+
param_type = param.get("annotation", "Any")
|
|
352
|
+
param_desc = param.get("description", "No description")
|
|
353
|
+
method_lines.append(
|
|
354
|
+
f"- `{param['name']}` ({param_type}): {param_desc}\n"
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
# Add return type
|
|
358
|
+
return_annotation = method.get("return_annotation", "")
|
|
359
|
+
if return_annotation:
|
|
360
|
+
method_lines.append(f"**Returns:** {return_annotation}\n")
|
|
361
|
+
|
|
362
|
+
method_lines.append("\n")
|
|
363
|
+
formatted_methods.append("".join(method_lines))
|
|
364
|
+
|
|
365
|
+
return "".join(formatted_methods)
|
|
366
|
+
|
|
367
|
+
def _calculate_api_stats(self, api_data: dict[str, t.Any]) -> dict[str, int]:
|
|
368
|
+
"""Calculate statistics about the API data."""
|
|
369
|
+
stats = {"protocols": 0, "classes": 0, "functions": 0, "modules": 0}
|
|
370
|
+
|
|
371
|
+
# Count protocols
|
|
372
|
+
protocols = api_data.get("protocols", {})
|
|
373
|
+
stats["protocols"] = len(protocols)
|
|
374
|
+
|
|
375
|
+
# Count modules, classes, and functions
|
|
376
|
+
modules = api_data.get("modules", {})
|
|
377
|
+
stats["modules"] = len(modules)
|
|
378
|
+
|
|
379
|
+
for module_data in modules.values():
|
|
380
|
+
stats["classes"] += len(module_data.get("classes", []))
|
|
381
|
+
stats["functions"] += len(module_data.get("functions", []))
|
|
382
|
+
|
|
383
|
+
return stats
|
|
384
|
+
|
|
385
|
+
def _find_references_to_name(
|
|
386
|
+
self, name: str, api_data: dict[str, t.Any]
|
|
387
|
+
) -> list[str]:
|
|
388
|
+
"""Find all places where an API component is referenced."""
|
|
389
|
+
references = []
|
|
390
|
+
|
|
391
|
+
# Search in protocols
|
|
392
|
+
protocol_refs = self._find_protocol_references(
|
|
393
|
+
name, api_data.get("protocols", {})
|
|
394
|
+
)
|
|
395
|
+
references.extend(protocol_refs)
|
|
396
|
+
|
|
397
|
+
# Search in modules/classes
|
|
398
|
+
module_refs = self._find_module_references(name, api_data.get("modules", {}))
|
|
399
|
+
references.extend(module_refs)
|
|
400
|
+
|
|
401
|
+
return references
|
|
402
|
+
|
|
403
|
+
def _find_protocol_references(
|
|
404
|
+
self, name: str, protocols: dict[str, t.Any]
|
|
405
|
+
) -> list[str]:
|
|
406
|
+
"""Find references in protocol definitions."""
|
|
407
|
+
references = []
|
|
408
|
+
|
|
409
|
+
for protocol_name, protocol_info in protocols.items():
|
|
410
|
+
method_refs = self._find_protocol_method_references(
|
|
411
|
+
name, protocol_name, protocol_info.get("methods", [])
|
|
412
|
+
)
|
|
413
|
+
references.extend(method_refs)
|
|
414
|
+
|
|
415
|
+
return references
|
|
416
|
+
|
|
417
|
+
def _find_protocol_method_references(
|
|
418
|
+
self, name: str, protocol_name: str, methods: list[dict[str, t.Any]]
|
|
419
|
+
) -> list[str]:
|
|
420
|
+
"""Find references in protocol method signatures."""
|
|
421
|
+
references = []
|
|
422
|
+
|
|
423
|
+
for method in methods:
|
|
424
|
+
# Check parameters
|
|
425
|
+
param_refs = self._find_method_parameter_references(
|
|
426
|
+
name,
|
|
427
|
+
f"{protocol_name}.{method['name']}()",
|
|
428
|
+
method.get("parameters", []),
|
|
429
|
+
)
|
|
430
|
+
references.extend(param_refs)
|
|
431
|
+
|
|
432
|
+
# Check return type
|
|
433
|
+
if name in method.get("return_annotation", ""):
|
|
434
|
+
references.append(f"{protocol_name}.{method['name']}() return type")
|
|
435
|
+
|
|
436
|
+
return references
|
|
437
|
+
|
|
438
|
+
def _find_module_references(
|
|
439
|
+
self, name: str, modules: dict[str, t.Any]
|
|
440
|
+
) -> list[str]:
|
|
441
|
+
"""Find references in module class definitions."""
|
|
442
|
+
references = []
|
|
443
|
+
|
|
444
|
+
for module_data in modules.values():
|
|
445
|
+
class_refs = self._find_class_references(
|
|
446
|
+
name, module_data.get("classes", [])
|
|
447
|
+
)
|
|
448
|
+
references.extend(class_refs)
|
|
449
|
+
|
|
450
|
+
return references
|
|
451
|
+
|
|
452
|
+
def _find_class_references(
|
|
453
|
+
self, name: str, classes: list[dict[str, t.Any]]
|
|
454
|
+
) -> list[str]:
|
|
455
|
+
"""Find references in class definitions."""
|
|
456
|
+
references = []
|
|
457
|
+
|
|
458
|
+
for class_info in classes:
|
|
459
|
+
# Check base classes
|
|
460
|
+
if name in class_info.get("base_classes", []):
|
|
461
|
+
references.append(f"{class_info['name']} base class")
|
|
462
|
+
|
|
463
|
+
# Check method signatures
|
|
464
|
+
method_refs = self._find_class_method_references(
|
|
465
|
+
name, class_info["name"], class_info.get("methods", [])
|
|
466
|
+
)
|
|
467
|
+
references.extend(method_refs)
|
|
468
|
+
|
|
469
|
+
return references
|
|
470
|
+
|
|
471
|
+
def _find_class_method_references(
|
|
472
|
+
self, name: str, class_name: str, methods: list[dict[str, t.Any]]
|
|
473
|
+
) -> list[str]:
|
|
474
|
+
"""Find references in class method signatures."""
|
|
475
|
+
references = []
|
|
476
|
+
|
|
477
|
+
for method in methods:
|
|
478
|
+
param_refs = self._find_method_parameter_references(
|
|
479
|
+
name, f"{class_name}.{method['name']}()", method.get("parameters", [])
|
|
480
|
+
)
|
|
481
|
+
references.extend(param_refs)
|
|
482
|
+
|
|
483
|
+
return references
|
|
484
|
+
|
|
485
|
+
def _find_method_parameter_references(
|
|
486
|
+
self, name: str, method_name: str, parameters: list[dict[str, t.Any]]
|
|
487
|
+
) -> list[str]:
|
|
488
|
+
"""Find references in method parameters."""
|
|
489
|
+
return [
|
|
490
|
+
f"{method_name} parameter"
|
|
491
|
+
for param in parameters
|
|
492
|
+
if name in param.get("annotation", "")
|
|
493
|
+
]
|