@crownpeak/dqm-react-component-dev-mcp 1.2.0
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.
- package/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- package/src/index.js +395 -0
|
@@ -0,0 +1,1011 @@
|
|
|
1
|
+
use anyhow::Result;
|
|
2
|
+
use std::fs;
|
|
3
|
+
use tempfile::TempDir;
|
|
4
|
+
|
|
5
|
+
mod common;
|
|
6
|
+
use common::TestContext;
|
|
7
|
+
|
|
8
|
+
#[test]
|
|
9
|
+
fn test_ruby_outline_basic_symbols() -> Result<()> {
|
|
10
|
+
let temp_dir = TempDir::new()?;
|
|
11
|
+
let test_file = temp_dir.path().join("calculator.rb");
|
|
12
|
+
|
|
13
|
+
let content = r#"#!/usr/bin/env ruby
|
|
14
|
+
# frozen_string_literal: true
|
|
15
|
+
|
|
16
|
+
require 'forwardable'
|
|
17
|
+
|
|
18
|
+
# Calculator module containing arithmetic functionality
|
|
19
|
+
module Calculator
|
|
20
|
+
VERSION = '2.0.0'
|
|
21
|
+
PRECISION = 0.001
|
|
22
|
+
|
|
23
|
+
# Base calculator class with common functionality
|
|
24
|
+
class Base
|
|
25
|
+
extend Forwardable
|
|
26
|
+
|
|
27
|
+
attr_reader :name, :history
|
|
28
|
+
attr_accessor :precision
|
|
29
|
+
|
|
30
|
+
def initialize(name, precision: 2)
|
|
31
|
+
@name = name
|
|
32
|
+
@precision = precision
|
|
33
|
+
@history = []
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def add(x, y)
|
|
37
|
+
result = x + y
|
|
38
|
+
record_operation(result)
|
|
39
|
+
result
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def subtract(x, y)
|
|
43
|
+
result = x - y
|
|
44
|
+
record_operation(result)
|
|
45
|
+
result
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def multiply(x, y)
|
|
49
|
+
result = x * y
|
|
50
|
+
record_operation(result)
|
|
51
|
+
result
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def divide(x, y)
|
|
55
|
+
raise ZeroDivisionError, 'Division by zero' if y.abs < PRECISION
|
|
56
|
+
|
|
57
|
+
result = x / y
|
|
58
|
+
record_operation(result)
|
|
59
|
+
result
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def clear_history
|
|
63
|
+
@history.clear
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def_delegators :@history, :size, :empty?
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def record_operation(result)
|
|
71
|
+
@history << result
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Advanced calculator with more features
|
|
76
|
+
class Advanced < Base
|
|
77
|
+
include Enumerable
|
|
78
|
+
|
|
79
|
+
CONSTANTS = {
|
|
80
|
+
pi: Math::PI,
|
|
81
|
+
e: Math::E,
|
|
82
|
+
golden_ratio: (1 + Math.sqrt(5)) / 2
|
|
83
|
+
}.freeze
|
|
84
|
+
|
|
85
|
+
def initialize(name, **options)
|
|
86
|
+
super(name, **options)
|
|
87
|
+
@operations_count = 0
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Override parent methods with additional logic
|
|
91
|
+
def add(x, y)
|
|
92
|
+
@operations_count += 1
|
|
93
|
+
super
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def subtract(x, y)
|
|
97
|
+
@operations_count += 1
|
|
98
|
+
super
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def multiply(x, y)
|
|
102
|
+
@operations_count += 1
|
|
103
|
+
super
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def divide(x, y)
|
|
107
|
+
@operations_count += 1
|
|
108
|
+
super
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Enumerable support
|
|
112
|
+
def each
|
|
113
|
+
return enum_for(:each) unless block_given?
|
|
114
|
+
|
|
115
|
+
@history.each { |result| yield result }
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Class methods
|
|
119
|
+
def self.create_default(name = 'Default Calculator')
|
|
120
|
+
new(name)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def self.from_history(name, history)
|
|
124
|
+
calc = new(name)
|
|
125
|
+
history.each { |value| calc.instance_variable_get(:@history) << value }
|
|
126
|
+
calc
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
private
|
|
130
|
+
|
|
131
|
+
attr_reader :operations_count
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Scientific calculator with statistics
|
|
135
|
+
class Scientific < Advanced
|
|
136
|
+
def sin(x)
|
|
137
|
+
result = Math.sin(x)
|
|
138
|
+
record_operation(result)
|
|
139
|
+
result
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def cos(x)
|
|
143
|
+
result = Math.cos(x)
|
|
144
|
+
record_operation(result)
|
|
145
|
+
result
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def power(base, exponent)
|
|
149
|
+
result = base**exponent
|
|
150
|
+
record_operation(result)
|
|
151
|
+
result
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def factorial(n)
|
|
155
|
+
raise ArgumentError, 'Factorial of negative number' if n < 0
|
|
156
|
+
|
|
157
|
+
result = (1..n).reduce(1, :*)
|
|
158
|
+
record_operation(result)
|
|
159
|
+
result
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Test methods
|
|
165
|
+
def test_calculator_basic
|
|
166
|
+
calc = Calculator::Advanced.new('Test')
|
|
167
|
+
|
|
168
|
+
result = calc.add(2, 3)
|
|
169
|
+
raise 'Add test failed' unless result == 5
|
|
170
|
+
|
|
171
|
+
result = calc.multiply(4, 5)
|
|
172
|
+
raise 'Multiply test failed' unless result == 20
|
|
173
|
+
|
|
174
|
+
puts 'Basic tests passed'
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def test_calculator_scientific
|
|
178
|
+
calc = Calculator::Scientific.new('Scientific Test')
|
|
179
|
+
|
|
180
|
+
result = calc.power(2, 3)
|
|
181
|
+
raise 'Power test failed' unless result == 8
|
|
182
|
+
|
|
183
|
+
result = calc.factorial(4)
|
|
184
|
+
raise 'Factorial test failed' unless result == 24
|
|
185
|
+
|
|
186
|
+
puts 'Scientific tests passed'
|
|
187
|
+
end
|
|
188
|
+
"#;
|
|
189
|
+
|
|
190
|
+
fs::write(&test_file, content)?;
|
|
191
|
+
|
|
192
|
+
let ctx = TestContext::new();
|
|
193
|
+
let output = ctx.run_probe(&[
|
|
194
|
+
"search",
|
|
195
|
+
"def|class|module", // Search for Ruby constructs
|
|
196
|
+
test_file.to_str().unwrap(),
|
|
197
|
+
"--format",
|
|
198
|
+
"outline",
|
|
199
|
+
"--allow-tests",
|
|
200
|
+
])?;
|
|
201
|
+
|
|
202
|
+
// Verify Ruby symbols are extracted
|
|
203
|
+
assert!(
|
|
204
|
+
output.contains("module Calculator"),
|
|
205
|
+
"Missing Calculator module - output: {}",
|
|
206
|
+
output
|
|
207
|
+
);
|
|
208
|
+
assert!(
|
|
209
|
+
output.contains("class Base")
|
|
210
|
+
|| output.contains("class Advanced")
|
|
211
|
+
|| output.contains("class Scientific"),
|
|
212
|
+
"Missing calculator classes - output: {}",
|
|
213
|
+
output
|
|
214
|
+
);
|
|
215
|
+
assert!(
|
|
216
|
+
output.contains("def initialize") || output.contains("def sin"),
|
|
217
|
+
"Missing method definitions - output: {}",
|
|
218
|
+
output
|
|
219
|
+
);
|
|
220
|
+
assert!(
|
|
221
|
+
output.contains("Found") && output.contains("search results"),
|
|
222
|
+
"Missing search results summary - output: {}",
|
|
223
|
+
output
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
Ok(())
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
#[test]
|
|
230
|
+
fn test_ruby_outline_smart_closing_brace_comments() -> Result<()> {
|
|
231
|
+
let temp_dir = TempDir::new()?;
|
|
232
|
+
let test_file = temp_dir.path().join("smart_braces.rb");
|
|
233
|
+
|
|
234
|
+
let content = r#"# Small method that should NOT get closing brace comments.
|
|
235
|
+
def small_method(x)
|
|
236
|
+
result = x * 2
|
|
237
|
+
result + 1
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# Large method that SHOULD get closing brace comments when there are gaps.
|
|
241
|
+
def large_method_with_gaps(data)
|
|
242
|
+
results = []
|
|
243
|
+
processor = DataProcessor.new
|
|
244
|
+
|
|
245
|
+
# Phase 1: Initial processing
|
|
246
|
+
data.each_with_index do |value, index|
|
|
247
|
+
if value > 100
|
|
248
|
+
processor.process_large_value(value, index)
|
|
249
|
+
elsif value < 0
|
|
250
|
+
processor.process_negative_value(value, index)
|
|
251
|
+
else
|
|
252
|
+
processor.process_small_value(value, index)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# Phase 2: Complex transformation logic
|
|
257
|
+
transformed_data = processor.get_transformed_data
|
|
258
|
+
transformed_data.each do |item|
|
|
259
|
+
case item.category
|
|
260
|
+
when :high
|
|
261
|
+
results << "HIGH: item"
|
|
262
|
+
when :medium
|
|
263
|
+
results << "MED: item"
|
|
264
|
+
when :low
|
|
265
|
+
results << "LOW: item"
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# Phase 3: Final validation and cleanup
|
|
270
|
+
validated_results = []
|
|
271
|
+
results.each do |result|
|
|
272
|
+
validated_results << result if result.length > 5
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
validated_results
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
# Another large method to test closing brace behavior
|
|
279
|
+
def another_large_method(items)
|
|
280
|
+
accumulator = Accumulator.new
|
|
281
|
+
|
|
282
|
+
# Main processing loop with complex nested logic
|
|
283
|
+
items.each do |item|
|
|
284
|
+
case item.item_type
|
|
285
|
+
when :primary
|
|
286
|
+
if item.weight > 50.0
|
|
287
|
+
accumulator.add_heavy_primary(item)
|
|
288
|
+
else
|
|
289
|
+
accumulator.add_light_primary(item)
|
|
290
|
+
end
|
|
291
|
+
when :secondary
|
|
292
|
+
accumulator.add_secondary(item)
|
|
293
|
+
when :auxiliary
|
|
294
|
+
accumulator.add_auxiliary(item)
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
accumulator.finalize
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
class LargeClass
|
|
302
|
+
attr_reader :data
|
|
303
|
+
attr_accessor :configuration
|
|
304
|
+
|
|
305
|
+
def initialize(options = {})
|
|
306
|
+
@data = []
|
|
307
|
+
@configuration = default_configuration.merge(options)
|
|
308
|
+
@processor = create_processor
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def process_batch(batch_data)
|
|
312
|
+
batch_data.each do |item|
|
|
313
|
+
if item.valid?
|
|
314
|
+
process_valid_item(item)
|
|
315
|
+
else
|
|
316
|
+
handle_invalid_item(item)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
finalize_batch_processing
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
private
|
|
324
|
+
|
|
325
|
+
def default_configuration
|
|
326
|
+
{
|
|
327
|
+
timeout: 30,
|
|
328
|
+
retries: 3,
|
|
329
|
+
batch_size: 100,
|
|
330
|
+
parallel: true,
|
|
331
|
+
logging: true
|
|
332
|
+
}
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def create_processor
|
|
336
|
+
if @configuration[:parallel]
|
|
337
|
+
ParallelProcessor.new(@configuration)
|
|
338
|
+
else
|
|
339
|
+
SequentialProcessor.new(@configuration)
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def process_valid_item(item)
|
|
344
|
+
@processor.process(item)
|
|
345
|
+
@data << item
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def handle_invalid_item(item)
|
|
349
|
+
log_error("Invalid item")
|
|
350
|
+
notify_error_handler(item)
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def finalize_batch_processing
|
|
354
|
+
@processor.finalize
|
|
355
|
+
update_statistics
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
"#;
|
|
359
|
+
|
|
360
|
+
fs::write(&test_file, content)?;
|
|
361
|
+
|
|
362
|
+
let ctx = TestContext::new();
|
|
363
|
+
let output = ctx.run_probe(&[
|
|
364
|
+
"search",
|
|
365
|
+
"large_method", // Search for large methods
|
|
366
|
+
test_file.to_str().unwrap(),
|
|
367
|
+
"--format",
|
|
368
|
+
"outline",
|
|
369
|
+
])?;
|
|
370
|
+
|
|
371
|
+
// Should find the large methods
|
|
372
|
+
assert!(
|
|
373
|
+
output.contains("large_method_with_gaps") || output.contains("another_large_method"),
|
|
374
|
+
"Missing large methods - output: {}",
|
|
375
|
+
output
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
// Should have large method search results and outline format
|
|
379
|
+
// Note: Closing brace comments are a behavior enhancement that may not be implemented yet
|
|
380
|
+
assert!(
|
|
381
|
+
output.contains("search results"),
|
|
382
|
+
"Should find search results - output: {}",
|
|
383
|
+
output
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
// Should be in outline format
|
|
387
|
+
assert!(
|
|
388
|
+
output.contains("---\nFile:"),
|
|
389
|
+
"Missing file delimiter in outline format - output: {}",
|
|
390
|
+
output
|
|
391
|
+
);
|
|
392
|
+
|
|
393
|
+
Ok(())
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
#[test]
|
|
397
|
+
fn test_ruby_outline_array_hash_truncation_with_keyword_preservation() -> Result<()> {
|
|
398
|
+
let temp_dir = TempDir::new()?;
|
|
399
|
+
let test_file = temp_dir.path().join("large_arrays.rb");
|
|
400
|
+
|
|
401
|
+
let content = r#"require 'json'
|
|
402
|
+
require 'net/http'
|
|
403
|
+
|
|
404
|
+
# Method containing large array that should be truncated but preserve keywords.
|
|
405
|
+
def process_large_dataset
|
|
406
|
+
large_configuration = [
|
|
407
|
+
'database_connection_string',
|
|
408
|
+
'api_key_primary',
|
|
409
|
+
'api_key_secondary',
|
|
410
|
+
'cache_timeout_value',
|
|
411
|
+
'retry_attempt_count',
|
|
412
|
+
'batch_size_limit',
|
|
413
|
+
'queue_max_capacity',
|
|
414
|
+
'worker_thread_count',
|
|
415
|
+
'memory_allocation_limit',
|
|
416
|
+
'disk_space_threshold',
|
|
417
|
+
'network_timeout_value',
|
|
418
|
+
'authentication_token_lifetime',
|
|
419
|
+
'session_expiry_duration',
|
|
420
|
+
'log_rotation_interval',
|
|
421
|
+
'backup_retention_period',
|
|
422
|
+
'monitoring_check_interval',
|
|
423
|
+
'alert_notification_threshold',
|
|
424
|
+
'performance_metrics_collection',
|
|
425
|
+
'security_audit_frequency',
|
|
426
|
+
'data_encryption_algorithm',
|
|
427
|
+
'compression_ratio_target',
|
|
428
|
+
'indexing_strategy_preference',
|
|
429
|
+
'query_optimization_level',
|
|
430
|
+
'connection_pool_sizing',
|
|
431
|
+
'load_balancer_configuration',
|
|
432
|
+
'failover_mechanism_timeout',
|
|
433
|
+
'disaster_recovery_checkpoint',
|
|
434
|
+
'data_replication_strategy',
|
|
435
|
+
'cache_invalidation_policy',
|
|
436
|
+
'resource_allocation_priority'
|
|
437
|
+
]
|
|
438
|
+
|
|
439
|
+
results = []
|
|
440
|
+
large_configuration.each do |config_item|
|
|
441
|
+
if config_item.include?('api_key')
|
|
442
|
+
results << "SECURE: item"
|
|
443
|
+
elsif config_item.include?('timeout')
|
|
444
|
+
results << "TIMING: item"
|
|
445
|
+
else
|
|
446
|
+
results << "CONFIG: item"
|
|
447
|
+
end
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
results
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
# Method with large hash initialization that should be truncated.
|
|
454
|
+
def create_large_configuration
|
|
455
|
+
config = {
|
|
456
|
+
database_host: 'localhost',
|
|
457
|
+
database_port: 5432,
|
|
458
|
+
database_name: 'production_db',
|
|
459
|
+
connection_timeout: 30,
|
|
460
|
+
max_connections: 100,
|
|
461
|
+
idle_timeout: 300,
|
|
462
|
+
query_timeout: 60,
|
|
463
|
+
ssl_enabled: true,
|
|
464
|
+
ssl_cert_path: '/etc/ssl/certs/db.pem',
|
|
465
|
+
ssl_key_path: '/etc/ssl/private/db.key',
|
|
466
|
+
backup_enabled: true,
|
|
467
|
+
backup_interval: 3600,
|
|
468
|
+
backup_retention_days: 30,
|
|
469
|
+
log_level: :info,
|
|
470
|
+
log_file_path: '/var/log/app.log',
|
|
471
|
+
max_log_file_size: 100_000_000,
|
|
472
|
+
api_key: 'super_secret_api_key_here',
|
|
473
|
+
rate_limit_requests_per_minute: 1000,
|
|
474
|
+
cache_ttl_seconds: 600,
|
|
475
|
+
session_timeout_minutes: 30,
|
|
476
|
+
password_hash_algorithm: 'bcrypt',
|
|
477
|
+
encryption_key_size: 256,
|
|
478
|
+
jwt_expiration_hours: 24,
|
|
479
|
+
oauth_redirect_uri: 'https://app.example.com/auth/callback',
|
|
480
|
+
webhook_timeout_seconds: 15,
|
|
481
|
+
notification_channels: ['email', 'sms', 'push'],
|
|
482
|
+
feature_flags: {
|
|
483
|
+
new_ui: true,
|
|
484
|
+
api_v2: false,
|
|
485
|
+
advanced_analytics: true
|
|
486
|
+
},
|
|
487
|
+
monitoring: {
|
|
488
|
+
enabled: true,
|
|
489
|
+
interval: 60,
|
|
490
|
+
alert_threshold: 0.95
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
config
|
|
495
|
+
end
|
|
496
|
+
"#;
|
|
497
|
+
|
|
498
|
+
fs::write(&test_file, content)?;
|
|
499
|
+
|
|
500
|
+
let ctx = TestContext::new();
|
|
501
|
+
let output = ctx.run_probe(&[
|
|
502
|
+
"search",
|
|
503
|
+
"api_key", // Search for keyword that should be preserved
|
|
504
|
+
test_file.to_str().unwrap(),
|
|
505
|
+
"--format",
|
|
506
|
+
"outline",
|
|
507
|
+
])?;
|
|
508
|
+
|
|
509
|
+
// Should find the methods with large arrays/hashes
|
|
510
|
+
assert!(
|
|
511
|
+
output.contains("process_large_dataset") || output.contains("create_large_configuration"),
|
|
512
|
+
"Missing methods with large data structures - output: {}",
|
|
513
|
+
output
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
// Should preserve the api_key keyword even in truncated arrays/hashes
|
|
517
|
+
assert!(
|
|
518
|
+
output.contains("api_key"),
|
|
519
|
+
"Should preserve api_key keyword in truncated structures - output: {}",
|
|
520
|
+
output
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
// Should show search results (ellipsis truncation may be a future enhancement)
|
|
524
|
+
assert!(
|
|
525
|
+
output.contains("search results"),
|
|
526
|
+
"Should show search results - output: {}",
|
|
527
|
+
output
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
Ok(())
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
#[test]
|
|
534
|
+
fn test_ruby_outline_control_flow_and_blocks() -> Result<()> {
|
|
535
|
+
let temp_dir = TempDir::new()?;
|
|
536
|
+
let test_file = temp_dir.path().join("control_flow.rb");
|
|
537
|
+
|
|
538
|
+
let content = r#"class DataProcessor
|
|
539
|
+
def process_with_control_flow(data)
|
|
540
|
+
results = []
|
|
541
|
+
|
|
542
|
+
# Ruby if/unless statements
|
|
543
|
+
if data.empty?
|
|
544
|
+
return []
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
unless data.is_a?(Array)
|
|
548
|
+
raise ArgumentError, 'Expected array input'
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
# Ruby case/when statement
|
|
552
|
+
data.each do |item|
|
|
553
|
+
case item.type
|
|
554
|
+
when :string
|
|
555
|
+
results << process_string(item)
|
|
556
|
+
when :number
|
|
557
|
+
results << process_number(item)
|
|
558
|
+
when :hash
|
|
559
|
+
results << process_hash(item)
|
|
560
|
+
else
|
|
561
|
+
results << process_unknown(item)
|
|
562
|
+
end
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
# Ruby while loop
|
|
566
|
+
index = 0
|
|
567
|
+
while index < results.length
|
|
568
|
+
result = results[index]
|
|
569
|
+
if result.nil?
|
|
570
|
+
results.delete_at(index)
|
|
571
|
+
else
|
|
572
|
+
index += 1
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
# Ruby for loop
|
|
577
|
+
for result in results
|
|
578
|
+
validate_result(result)
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
# Ruby begin/rescue/ensure block
|
|
582
|
+
begin
|
|
583
|
+
finalize_results(results)
|
|
584
|
+
rescue StandardError => e
|
|
585
|
+
log_error(e)
|
|
586
|
+
results = default_results
|
|
587
|
+
ensure
|
|
588
|
+
cleanup_resources
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
results
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
# Ruby blocks and yield
|
|
595
|
+
def process_with_blocks(data, &block)
|
|
596
|
+
return enum_for(:process_with_blocks, data) unless block_given?
|
|
597
|
+
|
|
598
|
+
data.each do |item|
|
|
599
|
+
processed = yield(item)
|
|
600
|
+
puts "Processed item"
|
|
601
|
+
end
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
# Ruby proc and lambda
|
|
605
|
+
def create_processors
|
|
606
|
+
# Proc example
|
|
607
|
+
processor_proc = proc { |x| x * 2 }
|
|
608
|
+
|
|
609
|
+
# Lambda example
|
|
610
|
+
validator_lambda = ->(x) { x.is_a?(Numeric) && x > 0 }
|
|
611
|
+
|
|
612
|
+
{
|
|
613
|
+
processor: processor_proc,
|
|
614
|
+
validator: validator_lambda
|
|
615
|
+
}
|
|
616
|
+
end
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
# Ruby modules and mixins
|
|
620
|
+
module Loggable
|
|
621
|
+
def log(message)
|
|
622
|
+
puts "Message: " + message
|
|
623
|
+
end
|
|
624
|
+
end
|
|
625
|
+
|
|
626
|
+
module Cacheable
|
|
627
|
+
extend ActiveSupport::Concern
|
|
628
|
+
|
|
629
|
+
included do
|
|
630
|
+
attr_accessor :cache_store
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
def cached_result(key, &block)
|
|
634
|
+
return cache_store.read(key) if cache_store.exist?(key)
|
|
635
|
+
|
|
636
|
+
result = block.call
|
|
637
|
+
cache_store.write(key, result)
|
|
638
|
+
result
|
|
639
|
+
end
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
class ServiceClass
|
|
643
|
+
include Loggable
|
|
644
|
+
include Cacheable
|
|
645
|
+
extend Forwardable
|
|
646
|
+
|
|
647
|
+
def_delegators :@calculator, :add, :subtract
|
|
648
|
+
|
|
649
|
+
attr_reader :name
|
|
650
|
+
attr_writer :debug_mode
|
|
651
|
+
attr_accessor :timeout
|
|
652
|
+
|
|
653
|
+
def initialize(name)
|
|
654
|
+
@name = name
|
|
655
|
+
@calculator = Calculator.new
|
|
656
|
+
end
|
|
657
|
+
end
|
|
658
|
+
"#;
|
|
659
|
+
|
|
660
|
+
fs::write(&test_file, content)?;
|
|
661
|
+
|
|
662
|
+
let ctx = TestContext::new();
|
|
663
|
+
let output = ctx.run_probe(&[
|
|
664
|
+
"search",
|
|
665
|
+
"case|when|begin|rescue|proc|lambda", // Search for Ruby control flow
|
|
666
|
+
test_file.to_str().unwrap(),
|
|
667
|
+
"--format",
|
|
668
|
+
"outline",
|
|
669
|
+
])?;
|
|
670
|
+
|
|
671
|
+
// Should find control flow constructs
|
|
672
|
+
let has_case = output.contains("case") || output.contains("when");
|
|
673
|
+
let has_rescue = output.contains("begin") || output.contains("rescue");
|
|
674
|
+
let has_blocks = output.contains("proc") || output.contains("lambda");
|
|
675
|
+
|
|
676
|
+
assert!(
|
|
677
|
+
has_case,
|
|
678
|
+
"Missing case/when statements - output: {}",
|
|
679
|
+
output
|
|
680
|
+
);
|
|
681
|
+
assert!(
|
|
682
|
+
has_rescue || output.contains("StandardError"),
|
|
683
|
+
"Missing begin/rescue/ensure blocks - output: {}",
|
|
684
|
+
output
|
|
685
|
+
);
|
|
686
|
+
assert!(
|
|
687
|
+
has_blocks || output.contains("->"),
|
|
688
|
+
"Missing proc/lambda constructs - output: {}",
|
|
689
|
+
output
|
|
690
|
+
);
|
|
691
|
+
|
|
692
|
+
Ok(())
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
#[test]
|
|
696
|
+
fn test_ruby_outline_testing_patterns() -> Result<()> {
|
|
697
|
+
let temp_dir = TempDir::new()?;
|
|
698
|
+
let test_file = temp_dir.path().join("testing_patterns.rb");
|
|
699
|
+
|
|
700
|
+
let content = r#"# RSpec testing patterns
|
|
701
|
+
RSpec.describe Calculator do
|
|
702
|
+
describe '#add' do
|
|
703
|
+
it 'adds two numbers correctly' do
|
|
704
|
+
calc = Calculator.new
|
|
705
|
+
expect(calc.add(2, 3)).to eq(5)
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
it 'handles negative numbers' do
|
|
709
|
+
calc = Calculator.new
|
|
710
|
+
expect(calc.add(-1, 1)).to eq(0)
|
|
711
|
+
end
|
|
712
|
+
|
|
713
|
+
context 'with floating point numbers' do
|
|
714
|
+
it 'maintains precision' do
|
|
715
|
+
calc = Calculator.new
|
|
716
|
+
expect(calc.add(0.1, 0.2)).to be_within(0.001).of(0.3)
|
|
717
|
+
end
|
|
718
|
+
end
|
|
719
|
+
end
|
|
720
|
+
|
|
721
|
+
describe '#divide' do
|
|
722
|
+
it 'divides correctly' do
|
|
723
|
+
calc = Calculator.new
|
|
724
|
+
expect(calc.divide(10, 2)).to eq(5)
|
|
725
|
+
end
|
|
726
|
+
|
|
727
|
+
it 'raises error for division by zero' do
|
|
728
|
+
calc = Calculator.new
|
|
729
|
+
expect { calc.divide(10, 0) }.to raise_error(ZeroDivisionError)
|
|
730
|
+
end
|
|
731
|
+
end
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
# Test::Unit patterns
|
|
735
|
+
require 'test/unit'
|
|
736
|
+
|
|
737
|
+
class CalculatorTest < Test::Unit::TestCase
|
|
738
|
+
def setup
|
|
739
|
+
@calc = Calculator.new
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
def test_add
|
|
743
|
+
result = @calc.add(2, 3)
|
|
744
|
+
assert_equal(5, result)
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
def test_subtract
|
|
748
|
+
result = @calc.subtract(5, 3)
|
|
749
|
+
assert_equal(2, result)
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
def test_multiply
|
|
753
|
+
result = @calc.multiply(3, 4)
|
|
754
|
+
assert_equal(12, result)
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
def test_divide
|
|
758
|
+
result = @calc.divide(10, 2)
|
|
759
|
+
assert_equal(5, result)
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
def test_divide_by_zero
|
|
763
|
+
assert_raise(ZeroDivisionError) do
|
|
764
|
+
@calc.divide(10, 0)
|
|
765
|
+
end
|
|
766
|
+
end
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
# Minitest patterns
|
|
770
|
+
require 'minitest/autorun'
|
|
771
|
+
|
|
772
|
+
class CalculatorMinitest < Minitest::Test
|
|
773
|
+
def setup
|
|
774
|
+
@calc = Calculator.new
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
def test_addition
|
|
778
|
+
assert_equal 5, @calc.add(2, 3)
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
def test_subtraction
|
|
782
|
+
assert_equal 2, @calc.subtract(5, 3)
|
|
783
|
+
end
|
|
784
|
+
|
|
785
|
+
def test_multiplication
|
|
786
|
+
assert_equal 12, @calc.multiply(3, 4)
|
|
787
|
+
end
|
|
788
|
+
|
|
789
|
+
def test_division
|
|
790
|
+
assert_equal 5, @calc.divide(10, 2)
|
|
791
|
+
end
|
|
792
|
+
|
|
793
|
+
def test_division_by_zero_raises_error
|
|
794
|
+
assert_raises ZeroDivisionError do
|
|
795
|
+
@calc.divide(10, 0)
|
|
796
|
+
end
|
|
797
|
+
end
|
|
798
|
+
end
|
|
799
|
+
"#;
|
|
800
|
+
|
|
801
|
+
fs::write(&test_file, content)?;
|
|
802
|
+
|
|
803
|
+
let ctx = TestContext::new();
|
|
804
|
+
let output = ctx.run_probe(&[
|
|
805
|
+
"search",
|
|
806
|
+
"describe|it|test_|assert", // Search for test patterns
|
|
807
|
+
test_file.to_str().unwrap(),
|
|
808
|
+
"--format",
|
|
809
|
+
"outline",
|
|
810
|
+
"--allow-tests",
|
|
811
|
+
])?;
|
|
812
|
+
|
|
813
|
+
// Should find RSpec patterns
|
|
814
|
+
let has_rspec = output.contains("describe") || output.contains("it ");
|
|
815
|
+
|
|
816
|
+
// Should find Test::Unit patterns
|
|
817
|
+
let has_test_unit = output.contains("test_") || output.contains("Test::Unit");
|
|
818
|
+
|
|
819
|
+
// Should find Minitest patterns
|
|
820
|
+
let has_minitest = output.contains("Minitest") || output.contains("assert_equal");
|
|
821
|
+
|
|
822
|
+
assert!(
|
|
823
|
+
has_rspec,
|
|
824
|
+
"Missing RSpec patterns (describe/it) - output: {}",
|
|
825
|
+
output
|
|
826
|
+
);
|
|
827
|
+
assert!(
|
|
828
|
+
has_test_unit || output.contains("assert"),
|
|
829
|
+
"Missing Test::Unit patterns - output: {}",
|
|
830
|
+
output
|
|
831
|
+
);
|
|
832
|
+
assert!(
|
|
833
|
+
has_minitest || output.contains("test_"),
|
|
834
|
+
"Missing Minitest patterns - output: {}",
|
|
835
|
+
output
|
|
836
|
+
);
|
|
837
|
+
|
|
838
|
+
Ok(())
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
#[test]
|
|
842
|
+
fn test_ruby_outline_modern_features() -> Result<()> {
|
|
843
|
+
let temp_dir = TempDir::new()?;
|
|
844
|
+
let test_file = temp_dir.path().join("modern_ruby.rb");
|
|
845
|
+
|
|
846
|
+
let content = r#"class ModernRuby
|
|
847
|
+
# Keyword arguments (Ruby 2.0+)
|
|
848
|
+
def initialize(name:, age: 18, city: 'Unknown')
|
|
849
|
+
@name = name
|
|
850
|
+
@age = age
|
|
851
|
+
@city = city
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
# Safe navigation operator (Ruby 2.3+)
|
|
855
|
+
def upcase_name
|
|
856
|
+
@name&.upcase
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
# Pattern matching (Ruby 3.0+)
|
|
860
|
+
def process_data(data)
|
|
861
|
+
case data
|
|
862
|
+
in { type: 'user', id: Integer => id }
|
|
863
|
+
puts "User found"
|
|
864
|
+
in { type: 'admin', permissions: Array => perms }
|
|
865
|
+
puts "Admin with permissions"
|
|
866
|
+
in { type: 'guest' }
|
|
867
|
+
puts "Guest user"
|
|
868
|
+
else
|
|
869
|
+
puts "Unknown data type"
|
|
870
|
+
end
|
|
871
|
+
end
|
|
872
|
+
|
|
873
|
+
# Hash value omission (Ruby 3.1+)
|
|
874
|
+
def create_person_hash(name, age, city)
|
|
875
|
+
{ name:, age:, city: }
|
|
876
|
+
end
|
|
877
|
+
|
|
878
|
+
# Method visibility modifiers
|
|
879
|
+
private
|
|
880
|
+
|
|
881
|
+
def validate_age
|
|
882
|
+
raise ArgumentError, 'Age must be positive' if @age < 0
|
|
883
|
+
end
|
|
884
|
+
end
|
|
885
|
+
|
|
886
|
+
# Refinements (Ruby 2.0+)
|
|
887
|
+
module StringRefinements
|
|
888
|
+
refine String do
|
|
889
|
+
def palindrome?
|
|
890
|
+
self == reverse
|
|
891
|
+
end
|
|
892
|
+
end
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
# Using refinements
|
|
896
|
+
class PalindromeChecker
|
|
897
|
+
using StringRefinements
|
|
898
|
+
|
|
899
|
+
def check(word)
|
|
900
|
+
word.palindrome?
|
|
901
|
+
end
|
|
902
|
+
end
|
|
903
|
+
"#;
|
|
904
|
+
|
|
905
|
+
fs::write(&test_file, content)?;
|
|
906
|
+
|
|
907
|
+
let ctx = TestContext::new();
|
|
908
|
+
let output = ctx.run_probe(&[
|
|
909
|
+
"search",
|
|
910
|
+
"name:|in |using|refine", // Search for modern Ruby features
|
|
911
|
+
test_file.to_str().unwrap(),
|
|
912
|
+
"--format",
|
|
913
|
+
"outline",
|
|
914
|
+
])?;
|
|
915
|
+
|
|
916
|
+
// Should find keyword arguments
|
|
917
|
+
let has_keyword_args = output.contains("name:") || output.contains("age:");
|
|
918
|
+
|
|
919
|
+
// Should find refinements (pattern matching may not be fully supported yet)
|
|
920
|
+
let has_refinements = output.contains("refine") || output.contains("using");
|
|
921
|
+
|
|
922
|
+
assert!(
|
|
923
|
+
has_keyword_args || output.contains("name") || output.contains("age"),
|
|
924
|
+
"Missing keyword arguments or similar - output: {}",
|
|
925
|
+
output
|
|
926
|
+
);
|
|
927
|
+
assert!(
|
|
928
|
+
has_refinements || output.contains("module") || output.contains("class"),
|
|
929
|
+
"Missing refinements or class/module definitions - output: {}",
|
|
930
|
+
output
|
|
931
|
+
);
|
|
932
|
+
assert!(
|
|
933
|
+
output.contains("search results"),
|
|
934
|
+
"Should find search results - output: {}",
|
|
935
|
+
output
|
|
936
|
+
);
|
|
937
|
+
|
|
938
|
+
Ok(())
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
#[test]
|
|
942
|
+
fn test_ruby_outline_keyword_highlighting() -> Result<()> {
|
|
943
|
+
let temp_dir = TempDir::new()?;
|
|
944
|
+
let test_file = temp_dir.path().join("keyword_test.rb");
|
|
945
|
+
|
|
946
|
+
let content = r#"class UserService
|
|
947
|
+
def initialize
|
|
948
|
+
@api_key = ENV['API_KEY']
|
|
949
|
+
@timeout = 30
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
def authenticate_user(credentials)
|
|
953
|
+
# This method contains the api_key keyword we're searching for
|
|
954
|
+
return false unless credentials[:api_key]
|
|
955
|
+
|
|
956
|
+
# Validate the api_key format
|
|
957
|
+
valid_api_key = validate_api_key_format(credentials[:api_key])
|
|
958
|
+
return false unless valid_api_key
|
|
959
|
+
|
|
960
|
+
# Check api_key against database
|
|
961
|
+
user = find_user_by_api_key(credentials[:api_key])
|
|
962
|
+
user&.active?
|
|
963
|
+
end
|
|
964
|
+
|
|
965
|
+
private
|
|
966
|
+
|
|
967
|
+
def validate_api_key_format(api_key)
|
|
968
|
+
# api_key should be 32 characters long and alphanumeric
|
|
969
|
+
api_key.match?(/\A[a-zA-Z0-9]{32}\z/)
|
|
970
|
+
end
|
|
971
|
+
|
|
972
|
+
def find_user_by_api_key(api_key)
|
|
973
|
+
User.find_by(api_key: api_key)
|
|
974
|
+
end
|
|
975
|
+
end
|
|
976
|
+
"#;
|
|
977
|
+
|
|
978
|
+
fs::write(&test_file, content)?;
|
|
979
|
+
|
|
980
|
+
let ctx = TestContext::new();
|
|
981
|
+
let output = ctx.run_probe(&[
|
|
982
|
+
"search",
|
|
983
|
+
"api_key", // Search for specific keyword
|
|
984
|
+
test_file.to_str().unwrap(),
|
|
985
|
+
"--format",
|
|
986
|
+
"outline",
|
|
987
|
+
])?;
|
|
988
|
+
|
|
989
|
+
// Should contain the api_key keyword (will be highlighted in actual output)
|
|
990
|
+
assert!(
|
|
991
|
+
output.contains("api_key"),
|
|
992
|
+
"Should contain api_key keyword - output: {}",
|
|
993
|
+
output
|
|
994
|
+
);
|
|
995
|
+
|
|
996
|
+
// Should contain the method that uses the keyword
|
|
997
|
+
assert!(
|
|
998
|
+
output.contains("authenticate_user") || output.contains("validate_api_key_format"),
|
|
999
|
+
"Should contain methods with api_key keyword - output: {}",
|
|
1000
|
+
output
|
|
1001
|
+
);
|
|
1002
|
+
|
|
1003
|
+
// Should be in outline format
|
|
1004
|
+
assert!(
|
|
1005
|
+
output.contains("---\nFile:"),
|
|
1006
|
+
"Should be in outline format - output: {}",
|
|
1007
|
+
output
|
|
1008
|
+
);
|
|
1009
|
+
|
|
1010
|
+
Ok(())
|
|
1011
|
+
}
|